diff --git a/src/components/ui/Dialog.jsx b/src/components/ui/Dialog.jsx new file mode 100644 index 0000000..8cd8cb0 --- /dev/null +++ b/src/components/ui/Dialog.jsx @@ -0,0 +1,56 @@ +import { useEffect, useId, useRef } from 'react' +import { useDialogFocus } from '../../hooks/useDialogFocus' +import { shouldCloseOnKey } from '../../lib/dialogKeys' + +/** + * Dialog: weiße Box auf abgedunkeltem Hintergrund, auf dem Handy als Bottom-Sheet (Regeln in global.css, .overlay/.dialog). + * Schließen geht nur über × und Esc, ein Klick auf den Hintergrund tut nichts (lange Eingaben sollen nicht verloren gehen). + * Solange `busy` gilt, wirken × und Esc nicht. Esc greift nur, wenn kein innerer Baustein die Taste schon behandelt hat + * (z. B. schließt eine offene Vorschlagsliste zuerst sich selbst): React 18 verteilt seine Ereignisse am Wurzelelement, also vor + * dem Listener auf `document`, und ein dortiges preventDefault() ist hier als `defaultPrevented` sichtbar. + * Mit `as="form"` ist die Box ein