@vielzeug/refine 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-elements.json +3836 -3836
- package/dist/date-picker.cjs +42 -40
- package/dist/date-picker.cjs.map +1 -1
- package/dist/date-picker.js +96 -88
- package/dist/date-picker.js.map +1 -1
- package/dist/feedback/toast/toast.d.ts +1 -0
- package/dist/feedback/toast/toast.d.ts.map +1 -1
- package/dist/headless/positioner.cjs +1 -1
- package/dist/headless/positioner.cjs.map +1 -1
- package/dist/headless/positioner.d.ts +12 -2
- package/dist/headless/positioner.d.ts.map +1 -1
- package/dist/headless/positioner.js +28 -23
- package/dist/headless/positioner.js.map +1 -1
- package/dist/inputs/combobox/combobox.css.cjs +1 -1
- package/dist/inputs/combobox/combobox.css.cjs.map +1 -1
- package/dist/inputs/combobox/combobox.css.js +1 -1
- package/dist/inputs/combobox/combobox.css.js.map +1 -1
- package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
- package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
- package/dist/inputs/date-picker/date-picker.css.js +1 -1
- package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
- package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
- package/dist/inputs/input/input.css.cjs +1 -1
- package/dist/inputs/input/input.css.cjs.map +1 -1
- package/dist/inputs/input/input.css.js +1 -1
- package/dist/inputs/input/input.css.js.map +1 -1
- package/dist/inputs/number-input/number-input.css.cjs +1 -1
- package/dist/inputs/number-input/number-input.css.cjs.map +1 -1
- package/dist/inputs/number-input/number-input.css.js +1 -1
- package/dist/inputs/number-input/number-input.css.js.map +1 -1
- package/dist/inputs/select/select.css.cjs +1 -1
- package/dist/inputs/select/select.css.cjs.map +1 -1
- package/dist/inputs/select/select.css.js +1 -1
- package/dist/inputs/select/select.css.js.map +1 -1
- package/dist/number-input.cjs +22 -21
- package/dist/number-input.cjs.map +1 -1
- package/dist/number-input.js +22 -21
- package/dist/number-input.js.map +1 -1
- package/dist/overlay/shared/use-dialog.cjs +1 -1
- package/dist/overlay/shared/use-dialog.cjs.map +1 -1
- package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
- package/dist/overlay/shared/use-dialog.js +5 -4
- package/dist/overlay/shared/use-dialog.js.map +1 -1
- package/dist/refine.cjs +139 -136
- package/dist/refine.cjs.map +1 -1
- package/dist/refine.iife.js +139 -136
- package/dist/refine.iife.js.map +1 -1
- package/dist/refine.js +195 -192
- package/dist/refine.js.map +1 -1
- package/dist/toast.cjs.map +1 -1
- package/dist/toast.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../headless/ore.cjs"),t=require("../../headless/overlay.cjs"),n=require("../../headless/focus.cjs"),r=require("./await-exit.cjs"),i=require("./background-lock.cjs");let a=require("@vielzeug/ripple");function o(o){let s=e.lifecycleSignal(o.onCleanup),c=(0,a.signal)(!1),l=`programmatic`,u=i.createBackgroundLock(),d=!1,f=n.createFocusManager({getInitialFocusSelector:()=>o.initialFocus.value,getReturnFocus:()=>o.returnFocus.value,host:o.host}),p=()=>{let e=o.dialogRef.value;if(!e?.open||d)return;d=!0,e.classList.add(`closing`);let t=()=>{e.close(),d=!1},n=o.getPanelEl();n?r.awaitExit(n,t,`transition`):t()},m=e=>o.host.dispatchEvent(new CustomEvent(`close-request`,{bubbles:!0,cancelable:!0,composed:!0,detail:{reason:e,...o.closeRequestDetail?.(e)}})),h=t.createOverlayControl({getBoundary:()=>o.host,getPanel:()=>{let e=o.getPanelEl();return e instanceof HTMLElement?e:null},isOpen:()=>c.value,onOpen:o.onOpen,setOpen:(e,t)=>{let n=o.dialogRef.value;if(n){if(e){if(n.open)return;n.classList.remove(`closing`),f.captureReturnFocus(),o.beforeOpen?.(n),n.showModal(),u.lock(o.host),f.applyInitialFocus(),c.value=!0;return}if(n.open){l=t,(o.performClose??(e=>e.close()))(n,t);return}c.value=!1}},signal:s}),g=e=>{m(e)&&h.close(e,!1)};o.host.addEventListener(`command`,e=>{let t=e.command;t===`show-modal`?h.open(`trigger`):(t===`close`||t===`request-close`)&&g(`trigger`)},{signal:s});let _=e=>{e.preventDefault(),!o.isPersistent()&&g(`escape`)},v=e=>{o.isPersistent()||e.target===o.dialogRef.value&&g(`outsideClick`)},y=()
|
|
1
|
+
const e=require("../../headless/ore.cjs"),t=require("../../headless/overlay.cjs"),n=require("../../headless/focus.cjs"),r=require("./await-exit.cjs"),i=require("./background-lock.cjs");let a=require("@vielzeug/ripple");function o(o){let s=e.lifecycleSignal(o.onCleanup),c=(0,a.signal)(!1),l=`programmatic`,u=i.createBackgroundLock(),d=!1,f=n.createFocusManager({getInitialFocusSelector:()=>o.initialFocus.value,getReturnFocus:()=>o.returnFocus.value,host:o.host}),p=()=>{let e=o.dialogRef.value;if(!e?.open||d)return;d=!0,e.classList.add(`closing`);let t=()=>{e.close(),d=!1},n=o.getPanelEl();n?r.awaitExit(n,t,`transition`):t()},m=e=>o.host.dispatchEvent(new CustomEvent(`close-request`,{bubbles:!0,cancelable:!0,composed:!0,detail:{reason:e,...o.closeRequestDetail?.(e)}})),h=t.createOverlayControl({getBoundary:()=>o.host,getPanel:()=>{let e=o.getPanelEl();return e instanceof HTMLElement?e:null},isOpen:()=>c.value,onOpen:o.onOpen,setOpen:(e,t)=>{let n=o.dialogRef.value;if(n){if(e){if(n.open)return;n.classList.remove(`closing`),f.captureReturnFocus(),o.beforeOpen?.(n),n.showModal(),u.lock(o.host),f.applyInitialFocus(),c.value=!0;return}if(n.open){l=t,(o.performClose??(e=>e.close()))(n,t);return}c.value=!1}},signal:s}),g=e=>{m(e)&&h.close(e,!1)};o.host.addEventListener(`command`,e=>{let t=e.command;t===`show-modal`?h.open(`trigger`):(t===`close`||t===`request-close`)&&g(`trigger`)},{signal:s});let _=e=>{e.target===o.dialogRef.value&&(e.preventDefault(),!o.isPersistent()&&g(`escape`))},v=e=>{o.isPersistent()||e.target===o.dialogRef.value&&g(`outsideClick`)},y=e=>{if(e&&e.target!==o.dialogRef.value)return;u.unlock(),o.host.removeAttribute(`open`),c.value=!1,f.restoreFocus();let t=l;l=`programmatic`,o.onNativeClose?.(t)},b=()=>{let e=o.dialogRef.value;e&&o.onEvent(e,`close`,y),(0,a.watch)(o.openProp,e=>{e?h.open(`programmatic`):h.close(`programmatic`,!1)},{immediate:!0})};return{closeWithAnimation:p,dispatchCloseRequest:m,handleBackdropClick:v,handleCancel:_,isOpen:c,overlay:h,requestClose:g,setupNativeListeners:()=>{let e=o.dialogRef.value;e&&(b(),o.onEvent(e,`click`,v),o.onEvent(e,`cancel`,_))},watchOpenProp:b}}exports.useDialogControl=o;
|
|
2
2
|
//# sourceMappingURL=use-dialog.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-dialog.cjs","names":[],"sources":["../../../src/overlay/shared/use-dialog.ts"],"sourcesContent":["import { type Readable, type Signal, signal, watch } from '@vielzeug/ripple';\n\nimport {\n lifecycleSignal,\n createOverlayControl,\n type DialogCloseReason,\n type OverlayControl,\n type OverlayOpenReason,\n} from '../../headless';\nimport { createFocusManager } from '../../headless/focus';\nimport { awaitExit } from './await-exit';\nimport { createBackgroundLock } from './background-lock';\n\n// Invoker Commands API — not yet in lib.dom.d.ts\ninterface CommandEvent extends Event {\n command: string;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type UseDialogOptions = {\n /** Called after showModal() but before isOpen = true. Use to clear drag styles etc. */\n beforeOpen?: (dialog: HTMLDialogElement) => void;\n /** Extra properties merged into the `close-request` custom event detail. */\n closeRequestDetail?: (reason: Exclude<DialogCloseReason, 'programmatic'>) => Record<string, unknown>;\n dialogRef: { value: HTMLDialogElement | null | undefined };\n getPanelEl: () => HTMLElement | null | undefined;\n host: HTMLElement;\n initialFocus: Readable<string | undefined>;\n isPersistent: () => boolean;\n /** Cleanup registrar from the component setup ctx. Automatically called on disconnect. */\n onCleanup: (fn: () => void) => void;\n /**\n * Scoped event listener registrar from the component setup ctx.\n * Automatically removed on component disconnect.\n */\n onEvent: <K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ) => void;\n /**\n * Called after the native `close` event fires — after background unlock,\n * isOpen reset, and focus restore. Use to emit component events.\n */\n onNativeClose?: (reason: DialogCloseReason) => void;\n /** Called by the overlay on open. Use to emit events. */\n onOpen?: (reason: OverlayOpenReason) => void;\n /** Open prop from the component — drives programmatic open/close via watch. */\n openProp: Readable<boolean | undefined>;\n /**\n * Called by the overlay when closing. Orchestrates the close animation.\n * Default: `dialog.close()`. Override in dialog.ts to add the CSS exit animation.\n */\n performClose?: (dialog: HTMLDialogElement, reason: DialogCloseReason) => void;\n returnFocus: Readable<boolean | undefined>;\n};\n\nexport type UseDialogHandle = {\n closeWithAnimation: () => void;\n /**\n * Dispatch a cancelable `close-request` event on the host. Returns true when\n * the close is allowed (event not prevented), false when it was cancelled.\n */\n dispatchCloseRequest: (reason: Exclude<DialogCloseReason, 'programmatic'>) => boolean;\n handleBackdropClick: (e: MouseEvent) => void;\n handleCancel: (e: Event) => void;\n isOpen: Signal<boolean>;\n /** The overlay control — open/close/toggle/dispose. */\n overlay: OverlayControl;\n /**\n * Dispatch `close-request`; if allowed, call `overlay.close()`.\n */\n requestClose: (reason: Exclude<DialogCloseReason, 'programmatic'>) => void;\n /**\n * Registers the open-prop watcher AND standard click/cancel event listeners on\n * the dialog element (backdrop click-to-close, Escape via the native `cancel`\n * event). Use for components that need standard dialog behavior.\n * Call inside `onMounted()`.\n */\n setupNativeListeners: () => void;\n /**\n * Registers only the open-prop watcher (without adding click/cancel listeners).\n * Use for components like drawer that register their own event handlers.\n * Call inside `onMounted()`.\n */\n watchOpenProp: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Shared dialog-control composable for `ore-dialog` and `ore-drawer`.\n *\n * Owns: `isOpen`, close-reason tracking, focus management, `overlay`,\n * `requestClose`, background lock/unlock, and the `close` event handler.\n * Components supply only their unique behavior via callbacks and `onNativeClose`.\n */\nexport function useDialogControl(options: UseDialogOptions): UseDialogHandle {\n const abortSignal = lifecycleSignal(options.onCleanup);\n const isOpen = signal(false);\n // Internal close-reason: set atomically before dialog.close() fires.\n let pendingCloseReason: DialogCloseReason = 'programmatic';\n const bgLock = createBackgroundLock();\n let isClosing = false;\n\n // ── Focus management ──────────────────────────────────────────────────────\n const focus = createFocusManager({\n getInitialFocusSelector: () => options.initialFocus.value,\n getReturnFocus: () => options.returnFocus.value,\n host: options.host,\n });\n // ─────────────────────────────────────────────────────────────────────────\n\n const closeWithAnimation = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog?.open || isClosing) return;\n\n isClosing = true;\n dialog.classList.add('closing');\n\n const finish = () => {\n dialog.close();\n // Do NOT remove 'closing' here — removing it while the native ::backdrop is\n // still held in the top layer by the 'overlay allow-discrete' transition\n // would revert its opacity to 1 and cause a visible flash. The class is\n // cleaned up at the start of the next open cycle (see setOpen below).\n isClosing = false;\n };\n\n const panel = options.getPanelEl();\n\n if (panel) {\n awaitExit(panel, finish, 'transition');\n } else {\n finish();\n }\n };\n\n const dispatchCloseRequest = (reason: Exclude<DialogCloseReason, 'programmatic'>): boolean => {\n return options.host.dispatchEvent(\n new CustomEvent('close-request', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { reason, ...options.closeRequestDetail?.(reason) },\n }),\n );\n };\n\n const overlay = createOverlayControl({\n getBoundary: () => options.host,\n getPanel: () => {\n const panel = options.getPanelEl();\n\n return panel instanceof HTMLElement ? panel : null;\n },\n isOpen: () => isOpen.value,\n onOpen: options.onOpen,\n setOpen: (next, reason) => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n if (next) {\n if (dialog.open) return;\n\n // Clean up any leftover 'closing' class from the previous close animation\n // before opening so the entry @starting-style and transition work correctly.\n dialog.classList.remove('closing');\n focus.captureReturnFocus();\n options.beforeOpen?.(dialog);\n dialog.showModal();\n bgLock.lock(options.host);\n focus.applyInitialFocus();\n isOpen.value = true;\n\n return;\n }\n\n if (dialog.open) {\n // Capture reason before calling performClose so handleNativeClose can read it.\n pendingCloseReason = reason as DialogCloseReason;\n\n const performClose = options.performClose ?? ((d) => d.close());\n\n performClose(dialog, reason as DialogCloseReason);\n\n return;\n }\n\n isOpen.value = false;\n },\n signal: abortSignal,\n });\n\n const requestClose = (reason: Exclude<DialogCloseReason, 'programmatic'>): void => {\n const allowed = dispatchCloseRequest(reason);\n\n if (!allowed) return;\n\n overlay.close(reason, false);\n };\n\n // Invoker Commands API — allows declarative open/close from outside the component:\n // <button commandfor=\"ore-dialog-id\" command=\"show-modal\">Open</button>\n // <button commandfor=\"ore-dialog-id\" command=\"close\">Close</button>\n options.host.addEventListener(\n 'command',\n (e: Event) => {\n const cmd = (e as CommandEvent).command;\n\n if (cmd === 'show-modal') overlay.open('trigger');\n else if (cmd === 'close' || cmd === 'request-close') requestClose('trigger');\n },\n { signal: abortSignal },\n );\n\n // The native `<dialog>` element auto-closes on Escape via its own close-watcher, which\n // dispatches a cancelable `cancel` event before `close`. Suppressing/redirecting that is the\n // spec-correct hook — relying on `keydown`'s `preventDefault()` to stop the close-watcher is\n // implementation-specific, not guaranteed across browsers.\n const handleCancel = (e: Event): void => {\n e.preventDefault();\n\n if (options.isPersistent()) return;\n\n requestClose('escape');\n };\n\n const handleBackdropClick = (e: MouseEvent): void => {\n if (options.isPersistent()) return;\n\n if (e.target === options.dialogRef.value) requestClose('outsideClick');\n };\n\n // ── Internal native close handler ─────────────────────────────────────────\n const handleNativeClose = (): void => {\n bgLock.unlock();\n options.host.removeAttribute('open');\n isOpen.value = false;\n focus.restoreFocus();\n\n const reason = pendingCloseReason;\n\n pendingCloseReason = 'programmatic';\n options.onNativeClose?.(reason);\n };\n\n const watchOpenProp = (): void => {\n const dialog = options.dialogRef.value;\n\n if (dialog) options.onEvent(dialog, 'close', handleNativeClose);\n\n watch(\n options.openProp,\n (open) => {\n if (open) {\n overlay.open('programmatic');\n } else {\n overlay.close('programmatic', false);\n }\n },\n { immediate: true },\n );\n };\n\n const setupNativeListeners = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n watchOpenProp();\n options.onEvent(dialog, 'click', handleBackdropClick);\n options.onEvent(dialog, 'cancel', handleCancel);\n };\n\n return {\n closeWithAnimation,\n dispatchCloseRequest,\n handleBackdropClick,\n handleCancel,\n isOpen,\n overlay,\n requestClose,\n setupNativeListeners,\n watchOpenProp,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-dialog.cjs","names":[],"sources":["../../../src/overlay/shared/use-dialog.ts"],"sourcesContent":["import { type Readable, type Signal, signal, watch } from '@vielzeug/ripple';\n\nimport {\n lifecycleSignal,\n createOverlayControl,\n type DialogCloseReason,\n type OverlayControl,\n type OverlayOpenReason,\n} from '../../headless';\nimport { createFocusManager } from '../../headless/focus';\nimport { awaitExit } from './await-exit';\nimport { createBackgroundLock } from './background-lock';\n\n// Invoker Commands API — not yet in lib.dom.d.ts\ninterface CommandEvent extends Event {\n command: string;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type UseDialogOptions = {\n /** Called after showModal() but before isOpen = true. Use to clear drag styles etc. */\n beforeOpen?: (dialog: HTMLDialogElement) => void;\n /** Extra properties merged into the `close-request` custom event detail. */\n closeRequestDetail?: (reason: Exclude<DialogCloseReason, 'programmatic'>) => Record<string, unknown>;\n dialogRef: { value: HTMLDialogElement | null | undefined };\n getPanelEl: () => HTMLElement | null | undefined;\n host: HTMLElement;\n initialFocus: Readable<string | undefined>;\n isPersistent: () => boolean;\n /** Cleanup registrar from the component setup ctx. Automatically called on disconnect. */\n onCleanup: (fn: () => void) => void;\n /**\n * Scoped event listener registrar from the component setup ctx.\n * Automatically removed on component disconnect.\n */\n onEvent: <K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ) => void;\n /**\n * Called after the native `close` event fires — after background unlock,\n * isOpen reset, and focus restore. Use to emit component events.\n */\n onNativeClose?: (reason: DialogCloseReason) => void;\n /** Called by the overlay on open. Use to emit events. */\n onOpen?: (reason: OverlayOpenReason) => void;\n /** Open prop from the component — drives programmatic open/close via watch. */\n openProp: Readable<boolean | undefined>;\n /**\n * Called by the overlay when closing. Orchestrates the close animation.\n * Default: `dialog.close()`. Override in dialog.ts to add the CSS exit animation.\n */\n performClose?: (dialog: HTMLDialogElement, reason: DialogCloseReason) => void;\n returnFocus: Readable<boolean | undefined>;\n};\n\nexport type UseDialogHandle = {\n closeWithAnimation: () => void;\n /**\n * Dispatch a cancelable `close-request` event on the host. Returns true when\n * the close is allowed (event not prevented), false when it was cancelled.\n */\n dispatchCloseRequest: (reason: Exclude<DialogCloseReason, 'programmatic'>) => boolean;\n handleBackdropClick: (e: MouseEvent) => void;\n handleCancel: (e: Event) => void;\n isOpen: Signal<boolean>;\n /** The overlay control — open/close/toggle/dispose. */\n overlay: OverlayControl;\n /**\n * Dispatch `close-request`; if allowed, call `overlay.close()`.\n */\n requestClose: (reason: Exclude<DialogCloseReason, 'programmatic'>) => void;\n /**\n * Registers the open-prop watcher AND standard click/cancel event listeners on\n * the dialog element (backdrop click-to-close, Escape via the native `cancel`\n * event). Use for components that need standard dialog behavior.\n * Call inside `onMounted()`.\n */\n setupNativeListeners: () => void;\n /**\n * Registers only the open-prop watcher (without adding click/cancel listeners).\n * Use for components like drawer that register their own event handlers.\n * Call inside `onMounted()`.\n */\n watchOpenProp: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Shared dialog-control composable for `ore-dialog` and `ore-drawer`.\n *\n * Owns: `isOpen`, close-reason tracking, focus management, `overlay`,\n * `requestClose`, background lock/unlock, and the `close` event handler.\n * Components supply only their unique behavior via callbacks and `onNativeClose`.\n */\nexport function useDialogControl(options: UseDialogOptions): UseDialogHandle {\n const abortSignal = lifecycleSignal(options.onCleanup);\n const isOpen = signal(false);\n // Internal close-reason: set atomically before dialog.close() fires.\n let pendingCloseReason: DialogCloseReason = 'programmatic';\n const bgLock = createBackgroundLock();\n let isClosing = false;\n\n // ── Focus management ──────────────────────────────────────────────────────\n const focus = createFocusManager({\n getInitialFocusSelector: () => options.initialFocus.value,\n getReturnFocus: () => options.returnFocus.value,\n host: options.host,\n });\n // ─────────────────────────────────────────────────────────────────────────\n\n const closeWithAnimation = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog?.open || isClosing) return;\n\n isClosing = true;\n dialog.classList.add('closing');\n\n const finish = () => {\n dialog.close();\n // Do NOT remove 'closing' here — removing it while the native ::backdrop is\n // still held in the top layer by the 'overlay allow-discrete' transition\n // would revert its opacity to 1 and cause a visible flash. The class is\n // cleaned up at the start of the next open cycle (see setOpen below).\n isClosing = false;\n };\n\n const panel = options.getPanelEl();\n\n if (panel) {\n awaitExit(panel, finish, 'transition');\n } else {\n finish();\n }\n };\n\n const dispatchCloseRequest = (reason: Exclude<DialogCloseReason, 'programmatic'>): boolean => {\n return options.host.dispatchEvent(\n new CustomEvent('close-request', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { reason, ...options.closeRequestDetail?.(reason) },\n }),\n );\n };\n\n const overlay = createOverlayControl({\n getBoundary: () => options.host,\n getPanel: () => {\n const panel = options.getPanelEl();\n\n return panel instanceof HTMLElement ? panel : null;\n },\n isOpen: () => isOpen.value,\n onOpen: options.onOpen,\n setOpen: (next, reason) => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n if (next) {\n if (dialog.open) return;\n\n // Clean up any leftover 'closing' class from the previous close animation\n // before opening so the entry @starting-style and transition work correctly.\n dialog.classList.remove('closing');\n focus.captureReturnFocus();\n options.beforeOpen?.(dialog);\n dialog.showModal();\n bgLock.lock(options.host);\n focus.applyInitialFocus();\n isOpen.value = true;\n\n return;\n }\n\n if (dialog.open) {\n // Capture reason before calling performClose so handleNativeClose can read it.\n pendingCloseReason = reason as DialogCloseReason;\n\n const performClose = options.performClose ?? ((d) => d.close());\n\n performClose(dialog, reason as DialogCloseReason);\n\n return;\n }\n\n isOpen.value = false;\n },\n signal: abortSignal,\n });\n\n const requestClose = (reason: Exclude<DialogCloseReason, 'programmatic'>): void => {\n const allowed = dispatchCloseRequest(reason);\n\n if (!allowed) return;\n\n overlay.close(reason, false);\n };\n\n // Invoker Commands API — allows declarative open/close from outside the component:\n // <button commandfor=\"ore-dialog-id\" command=\"show-modal\">Open</button>\n // <button commandfor=\"ore-dialog-id\" command=\"close\">Close</button>\n options.host.addEventListener(\n 'command',\n (e: Event) => {\n const cmd = (e as CommandEvent).command;\n\n if (cmd === 'show-modal') overlay.open('trigger');\n else if (cmd === 'close' || cmd === 'request-close') requestClose('trigger');\n },\n { signal: abortSignal },\n );\n\n // The native `<dialog>` element auto-closes on Escape via its own close-watcher, which\n // dispatches a cancelable `cancel` event before `close`. Suppressing/redirecting that is the\n // spec-correct hook — relying on `keydown`'s `preventDefault()` to stop the close-watcher is\n // implementation-specific, not guaranteed across browsers.\n const handleCancel = (e: Event): void => {\n // See `handleNativeClose`'s comment: guard against a same-named bubbling event from a\n // descendant field being misread as this dialog's own native event.\n if (e.target !== options.dialogRef.value) return;\n\n e.preventDefault();\n\n if (options.isPersistent()) return;\n\n requestClose('escape');\n };\n\n const handleBackdropClick = (e: MouseEvent): void => {\n if (options.isPersistent()) return;\n\n if (e.target === options.dialogRef.value) requestClose('outsideClick');\n };\n\n // ── Internal native close handler ─────────────────────────────────────────\n // `e.target` must be checked against the native `<dialog>` itself, the same way\n // `handleBackdropClick` already does: a bubbling `close`-named event fired by *any* descendant\n // component reaches this listener too — regardless of that event's own `composed` flag, since\n // slot-assignment-based event-path computation (a slotted descendant's \"parent\" is the `<slot>`\n // projecting it) isn't gated by `composed` the way crossing back out of a shadow root is. Some\n // fields nested here (`ore-select`, `ore-combobox`, …) emit their own public `close` event when\n // *their* dropdown closes — without this check, selecting an option in one of those closes this\n // dialog too, misreading the field's own event as this dialog's native close.\n const handleNativeClose = (e?: Event): void => {\n if (e && e.target !== options.dialogRef.value) return;\n\n bgLock.unlock();\n options.host.removeAttribute('open');\n isOpen.value = false;\n focus.restoreFocus();\n\n const reason = pendingCloseReason;\n\n pendingCloseReason = 'programmatic';\n options.onNativeClose?.(reason);\n };\n\n const watchOpenProp = (): void => {\n const dialog = options.dialogRef.value;\n\n if (dialog) options.onEvent(dialog, 'close', handleNativeClose);\n\n watch(\n options.openProp,\n (open) => {\n if (open) {\n overlay.open('programmatic');\n } else {\n overlay.close('programmatic', false);\n }\n },\n { immediate: true },\n );\n };\n\n const setupNativeListeners = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n watchOpenProp();\n options.onEvent(dialog, 'click', handleBackdropClick);\n options.onEvent(dialog, 'cancel', handleCancel);\n };\n\n return {\n closeWithAnimation,\n dispatchCloseRequest,\n handleBackdropClick,\n handleCancel,\n isOpen,\n overlay,\n requestClose,\n setupNativeListeners,\n watchOpenProp,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-dialog.d.ts","sourceRoot":"","sources":["../../../src/overlay/shared/use-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAiB,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAYxB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,uFAAuF;IACvF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrG,SAAS,EAAE;QAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3D,UAAU,EAAE,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,0FAA0F;IAC1F,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACpC;;;OAGG;IACH,OAAO,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAC3C,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC7C,OAAO,CAAC,EAAE,uBAAuB,KAC9B,IAAI,CAAC;IACV;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,+EAA+E;IAC/E,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9E,WAAW,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B;;;OAGG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,KAAK,OAAO,CAAC;IACtF,mBAAmB,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,uDAAuD;IACvD,OAAO,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC;;;;OAIG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAIF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"use-dialog.d.ts","sourceRoot":"","sources":["../../../src/overlay/shared/use-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAiB,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAYxB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,uFAAuF;IACvF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrG,SAAS,EAAE;QAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3D,UAAU,EAAE,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,0FAA0F;IAC1F,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACpC;;;OAGG;IACH,OAAO,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAC3C,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC7C,OAAO,CAAC,EAAE,uBAAuB,KAC9B,IAAI,CAAC;IACV;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,+EAA+E;IAC/E,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9E,WAAW,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B;;;OAGG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,KAAK,OAAO,CAAC;IACtF,mBAAmB,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,uDAAuD;IACvD,OAAO,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC;;;;OAIG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAIF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CA6M3E"}
|
|
@@ -58,13 +58,14 @@ function s(s) {
|
|
|
58
58
|
t === "show-modal" ? g.open("trigger") : (t === "close" || t === "request-close") && _("trigger");
|
|
59
59
|
}, { signal: c });
|
|
60
60
|
let v = (e) => {
|
|
61
|
-
e.preventDefault(), !s.isPersistent() && _("escape");
|
|
61
|
+
e.target === s.dialogRef.value && (e.preventDefault(), !s.isPersistent() && _("escape"));
|
|
62
62
|
}, y = (e) => {
|
|
63
63
|
s.isPersistent() || e.target === s.dialogRef.value && _("outsideClick");
|
|
64
|
-
}, b = () => {
|
|
64
|
+
}, b = (e) => {
|
|
65
|
+
if (e && e.target !== s.dialogRef.value) return;
|
|
65
66
|
d.unlock(), s.host.removeAttribute("open"), l.value = !1, p.restoreFocus();
|
|
66
|
-
let
|
|
67
|
-
u = "programmatic", s.onNativeClose?.(
|
|
67
|
+
let t = u;
|
|
68
|
+
u = "programmatic", s.onNativeClose?.(t);
|
|
68
69
|
}, x = () => {
|
|
69
70
|
let e = s.dialogRef.value;
|
|
70
71
|
e && s.onEvent(e, "close", b), o(s.openProp, (e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-dialog.js","names":[],"sources":["../../../src/overlay/shared/use-dialog.ts"],"sourcesContent":["import { type Readable, type Signal, signal, watch } from '@vielzeug/ripple';\n\nimport {\n lifecycleSignal,\n createOverlayControl,\n type DialogCloseReason,\n type OverlayControl,\n type OverlayOpenReason,\n} from '../../headless';\nimport { createFocusManager } from '../../headless/focus';\nimport { awaitExit } from './await-exit';\nimport { createBackgroundLock } from './background-lock';\n\n// Invoker Commands API — not yet in lib.dom.d.ts\ninterface CommandEvent extends Event {\n command: string;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type UseDialogOptions = {\n /** Called after showModal() but before isOpen = true. Use to clear drag styles etc. */\n beforeOpen?: (dialog: HTMLDialogElement) => void;\n /** Extra properties merged into the `close-request` custom event detail. */\n closeRequestDetail?: (reason: Exclude<DialogCloseReason, 'programmatic'>) => Record<string, unknown>;\n dialogRef: { value: HTMLDialogElement | null | undefined };\n getPanelEl: () => HTMLElement | null | undefined;\n host: HTMLElement;\n initialFocus: Readable<string | undefined>;\n isPersistent: () => boolean;\n /** Cleanup registrar from the component setup ctx. Automatically called on disconnect. */\n onCleanup: (fn: () => void) => void;\n /**\n * Scoped event listener registrar from the component setup ctx.\n * Automatically removed on component disconnect.\n */\n onEvent: <K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ) => void;\n /**\n * Called after the native `close` event fires — after background unlock,\n * isOpen reset, and focus restore. Use to emit component events.\n */\n onNativeClose?: (reason: DialogCloseReason) => void;\n /** Called by the overlay on open. Use to emit events. */\n onOpen?: (reason: OverlayOpenReason) => void;\n /** Open prop from the component — drives programmatic open/close via watch. */\n openProp: Readable<boolean | undefined>;\n /**\n * Called by the overlay when closing. Orchestrates the close animation.\n * Default: `dialog.close()`. Override in dialog.ts to add the CSS exit animation.\n */\n performClose?: (dialog: HTMLDialogElement, reason: DialogCloseReason) => void;\n returnFocus: Readable<boolean | undefined>;\n};\n\nexport type UseDialogHandle = {\n closeWithAnimation: () => void;\n /**\n * Dispatch a cancelable `close-request` event on the host. Returns true when\n * the close is allowed (event not prevented), false when it was cancelled.\n */\n dispatchCloseRequest: (reason: Exclude<DialogCloseReason, 'programmatic'>) => boolean;\n handleBackdropClick: (e: MouseEvent) => void;\n handleCancel: (e: Event) => void;\n isOpen: Signal<boolean>;\n /** The overlay control — open/close/toggle/dispose. */\n overlay: OverlayControl;\n /**\n * Dispatch `close-request`; if allowed, call `overlay.close()`.\n */\n requestClose: (reason: Exclude<DialogCloseReason, 'programmatic'>) => void;\n /**\n * Registers the open-prop watcher AND standard click/cancel event listeners on\n * the dialog element (backdrop click-to-close, Escape via the native `cancel`\n * event). Use for components that need standard dialog behavior.\n * Call inside `onMounted()`.\n */\n setupNativeListeners: () => void;\n /**\n * Registers only the open-prop watcher (without adding click/cancel listeners).\n * Use for components like drawer that register their own event handlers.\n * Call inside `onMounted()`.\n */\n watchOpenProp: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Shared dialog-control composable for `ore-dialog` and `ore-drawer`.\n *\n * Owns: `isOpen`, close-reason tracking, focus management, `overlay`,\n * `requestClose`, background lock/unlock, and the `close` event handler.\n * Components supply only their unique behavior via callbacks and `onNativeClose`.\n */\nexport function useDialogControl(options: UseDialogOptions): UseDialogHandle {\n const abortSignal = lifecycleSignal(options.onCleanup);\n const isOpen = signal(false);\n // Internal close-reason: set atomically before dialog.close() fires.\n let pendingCloseReason: DialogCloseReason = 'programmatic';\n const bgLock = createBackgroundLock();\n let isClosing = false;\n\n // ── Focus management ──────────────────────────────────────────────────────\n const focus = createFocusManager({\n getInitialFocusSelector: () => options.initialFocus.value,\n getReturnFocus: () => options.returnFocus.value,\n host: options.host,\n });\n // ─────────────────────────────────────────────────────────────────────────\n\n const closeWithAnimation = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog?.open || isClosing) return;\n\n isClosing = true;\n dialog.classList.add('closing');\n\n const finish = () => {\n dialog.close();\n // Do NOT remove 'closing' here — removing it while the native ::backdrop is\n // still held in the top layer by the 'overlay allow-discrete' transition\n // would revert its opacity to 1 and cause a visible flash. The class is\n // cleaned up at the start of the next open cycle (see setOpen below).\n isClosing = false;\n };\n\n const panel = options.getPanelEl();\n\n if (panel) {\n awaitExit(panel, finish, 'transition');\n } else {\n finish();\n }\n };\n\n const dispatchCloseRequest = (reason: Exclude<DialogCloseReason, 'programmatic'>): boolean => {\n return options.host.dispatchEvent(\n new CustomEvent('close-request', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { reason, ...options.closeRequestDetail?.(reason) },\n }),\n );\n };\n\n const overlay = createOverlayControl({\n getBoundary: () => options.host,\n getPanel: () => {\n const panel = options.getPanelEl();\n\n return panel instanceof HTMLElement ? panel : null;\n },\n isOpen: () => isOpen.value,\n onOpen: options.onOpen,\n setOpen: (next, reason) => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n if (next) {\n if (dialog.open) return;\n\n // Clean up any leftover 'closing' class from the previous close animation\n // before opening so the entry @starting-style and transition work correctly.\n dialog.classList.remove('closing');\n focus.captureReturnFocus();\n options.beforeOpen?.(dialog);\n dialog.showModal();\n bgLock.lock(options.host);\n focus.applyInitialFocus();\n isOpen.value = true;\n\n return;\n }\n\n if (dialog.open) {\n // Capture reason before calling performClose so handleNativeClose can read it.\n pendingCloseReason = reason as DialogCloseReason;\n\n const performClose = options.performClose ?? ((d) => d.close());\n\n performClose(dialog, reason as DialogCloseReason);\n\n return;\n }\n\n isOpen.value = false;\n },\n signal: abortSignal,\n });\n\n const requestClose = (reason: Exclude<DialogCloseReason, 'programmatic'>): void => {\n const allowed = dispatchCloseRequest(reason);\n\n if (!allowed) return;\n\n overlay.close(reason, false);\n };\n\n // Invoker Commands API — allows declarative open/close from outside the component:\n // <button commandfor=\"ore-dialog-id\" command=\"show-modal\">Open</button>\n // <button commandfor=\"ore-dialog-id\" command=\"close\">Close</button>\n options.host.addEventListener(\n 'command',\n (e: Event) => {\n const cmd = (e as CommandEvent).command;\n\n if (cmd === 'show-modal') overlay.open('trigger');\n else if (cmd === 'close' || cmd === 'request-close') requestClose('trigger');\n },\n { signal: abortSignal },\n );\n\n // The native `<dialog>` element auto-closes on Escape via its own close-watcher, which\n // dispatches a cancelable `cancel` event before `close`. Suppressing/redirecting that is the\n // spec-correct hook — relying on `keydown`'s `preventDefault()` to stop the close-watcher is\n // implementation-specific, not guaranteed across browsers.\n const handleCancel = (e: Event): void => {\n e.preventDefault();\n\n if (options.isPersistent()) return;\n\n requestClose('escape');\n };\n\n const handleBackdropClick = (e: MouseEvent): void => {\n if (options.isPersistent()) return;\n\n if (e.target === options.dialogRef.value) requestClose('outsideClick');\n };\n\n // ── Internal native close handler ─────────────────────────────────────────\n const handleNativeClose = (): void => {\n bgLock.unlock();\n options.host.removeAttribute('open');\n isOpen.value = false;\n focus.restoreFocus();\n\n const reason = pendingCloseReason;\n\n pendingCloseReason = 'programmatic';\n options.onNativeClose?.(reason);\n };\n\n const watchOpenProp = (): void => {\n const dialog = options.dialogRef.value;\n\n if (dialog) options.onEvent(dialog, 'close', handleNativeClose);\n\n watch(\n options.openProp,\n (open) => {\n if (open) {\n overlay.open('programmatic');\n } else {\n overlay.close('programmatic', false);\n }\n },\n { immediate: true },\n );\n };\n\n const setupNativeListeners = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n watchOpenProp();\n options.onEvent(dialog, 'click', handleBackdropClick);\n options.onEvent(dialog, 'cancel', handleCancel);\n };\n\n return {\n closeWithAnimation,\n dispatchCloseRequest,\n handleBackdropClick,\n handleCancel,\n isOpen,\n overlay,\n requestClose,\n setupNativeListeners,\n watchOpenProp,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-dialog.js","names":[],"sources":["../../../src/overlay/shared/use-dialog.ts"],"sourcesContent":["import { type Readable, type Signal, signal, watch } from '@vielzeug/ripple';\n\nimport {\n lifecycleSignal,\n createOverlayControl,\n type DialogCloseReason,\n type OverlayControl,\n type OverlayOpenReason,\n} from '../../headless';\nimport { createFocusManager } from '../../headless/focus';\nimport { awaitExit } from './await-exit';\nimport { createBackgroundLock } from './background-lock';\n\n// Invoker Commands API — not yet in lib.dom.d.ts\ninterface CommandEvent extends Event {\n command: string;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type UseDialogOptions = {\n /** Called after showModal() but before isOpen = true. Use to clear drag styles etc. */\n beforeOpen?: (dialog: HTMLDialogElement) => void;\n /** Extra properties merged into the `close-request` custom event detail. */\n closeRequestDetail?: (reason: Exclude<DialogCloseReason, 'programmatic'>) => Record<string, unknown>;\n dialogRef: { value: HTMLDialogElement | null | undefined };\n getPanelEl: () => HTMLElement | null | undefined;\n host: HTMLElement;\n initialFocus: Readable<string | undefined>;\n isPersistent: () => boolean;\n /** Cleanup registrar from the component setup ctx. Automatically called on disconnect. */\n onCleanup: (fn: () => void) => void;\n /**\n * Scoped event listener registrar from the component setup ctx.\n * Automatically removed on component disconnect.\n */\n onEvent: <K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ) => void;\n /**\n * Called after the native `close` event fires — after background unlock,\n * isOpen reset, and focus restore. Use to emit component events.\n */\n onNativeClose?: (reason: DialogCloseReason) => void;\n /** Called by the overlay on open. Use to emit events. */\n onOpen?: (reason: OverlayOpenReason) => void;\n /** Open prop from the component — drives programmatic open/close via watch. */\n openProp: Readable<boolean | undefined>;\n /**\n * Called by the overlay when closing. Orchestrates the close animation.\n * Default: `dialog.close()`. Override in dialog.ts to add the CSS exit animation.\n */\n performClose?: (dialog: HTMLDialogElement, reason: DialogCloseReason) => void;\n returnFocus: Readable<boolean | undefined>;\n};\n\nexport type UseDialogHandle = {\n closeWithAnimation: () => void;\n /**\n * Dispatch a cancelable `close-request` event on the host. Returns true when\n * the close is allowed (event not prevented), false when it was cancelled.\n */\n dispatchCloseRequest: (reason: Exclude<DialogCloseReason, 'programmatic'>) => boolean;\n handleBackdropClick: (e: MouseEvent) => void;\n handleCancel: (e: Event) => void;\n isOpen: Signal<boolean>;\n /** The overlay control — open/close/toggle/dispose. */\n overlay: OverlayControl;\n /**\n * Dispatch `close-request`; if allowed, call `overlay.close()`.\n */\n requestClose: (reason: Exclude<DialogCloseReason, 'programmatic'>) => void;\n /**\n * Registers the open-prop watcher AND standard click/cancel event listeners on\n * the dialog element (backdrop click-to-close, Escape via the native `cancel`\n * event). Use for components that need standard dialog behavior.\n * Call inside `onMounted()`.\n */\n setupNativeListeners: () => void;\n /**\n * Registers only the open-prop watcher (without adding click/cancel listeners).\n * Use for components like drawer that register their own event handlers.\n * Call inside `onMounted()`.\n */\n watchOpenProp: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Shared dialog-control composable for `ore-dialog` and `ore-drawer`.\n *\n * Owns: `isOpen`, close-reason tracking, focus management, `overlay`,\n * `requestClose`, background lock/unlock, and the `close` event handler.\n * Components supply only their unique behavior via callbacks and `onNativeClose`.\n */\nexport function useDialogControl(options: UseDialogOptions): UseDialogHandle {\n const abortSignal = lifecycleSignal(options.onCleanup);\n const isOpen = signal(false);\n // Internal close-reason: set atomically before dialog.close() fires.\n let pendingCloseReason: DialogCloseReason = 'programmatic';\n const bgLock = createBackgroundLock();\n let isClosing = false;\n\n // ── Focus management ──────────────────────────────────────────────────────\n const focus = createFocusManager({\n getInitialFocusSelector: () => options.initialFocus.value,\n getReturnFocus: () => options.returnFocus.value,\n host: options.host,\n });\n // ─────────────────────────────────────────────────────────────────────────\n\n const closeWithAnimation = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog?.open || isClosing) return;\n\n isClosing = true;\n dialog.classList.add('closing');\n\n const finish = () => {\n dialog.close();\n // Do NOT remove 'closing' here — removing it while the native ::backdrop is\n // still held in the top layer by the 'overlay allow-discrete' transition\n // would revert its opacity to 1 and cause a visible flash. The class is\n // cleaned up at the start of the next open cycle (see setOpen below).\n isClosing = false;\n };\n\n const panel = options.getPanelEl();\n\n if (panel) {\n awaitExit(panel, finish, 'transition');\n } else {\n finish();\n }\n };\n\n const dispatchCloseRequest = (reason: Exclude<DialogCloseReason, 'programmatic'>): boolean => {\n return options.host.dispatchEvent(\n new CustomEvent('close-request', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { reason, ...options.closeRequestDetail?.(reason) },\n }),\n );\n };\n\n const overlay = createOverlayControl({\n getBoundary: () => options.host,\n getPanel: () => {\n const panel = options.getPanelEl();\n\n return panel instanceof HTMLElement ? panel : null;\n },\n isOpen: () => isOpen.value,\n onOpen: options.onOpen,\n setOpen: (next, reason) => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n if (next) {\n if (dialog.open) return;\n\n // Clean up any leftover 'closing' class from the previous close animation\n // before opening so the entry @starting-style and transition work correctly.\n dialog.classList.remove('closing');\n focus.captureReturnFocus();\n options.beforeOpen?.(dialog);\n dialog.showModal();\n bgLock.lock(options.host);\n focus.applyInitialFocus();\n isOpen.value = true;\n\n return;\n }\n\n if (dialog.open) {\n // Capture reason before calling performClose so handleNativeClose can read it.\n pendingCloseReason = reason as DialogCloseReason;\n\n const performClose = options.performClose ?? ((d) => d.close());\n\n performClose(dialog, reason as DialogCloseReason);\n\n return;\n }\n\n isOpen.value = false;\n },\n signal: abortSignal,\n });\n\n const requestClose = (reason: Exclude<DialogCloseReason, 'programmatic'>): void => {\n const allowed = dispatchCloseRequest(reason);\n\n if (!allowed) return;\n\n overlay.close(reason, false);\n };\n\n // Invoker Commands API — allows declarative open/close from outside the component:\n // <button commandfor=\"ore-dialog-id\" command=\"show-modal\">Open</button>\n // <button commandfor=\"ore-dialog-id\" command=\"close\">Close</button>\n options.host.addEventListener(\n 'command',\n (e: Event) => {\n const cmd = (e as CommandEvent).command;\n\n if (cmd === 'show-modal') overlay.open('trigger');\n else if (cmd === 'close' || cmd === 'request-close') requestClose('trigger');\n },\n { signal: abortSignal },\n );\n\n // The native `<dialog>` element auto-closes on Escape via its own close-watcher, which\n // dispatches a cancelable `cancel` event before `close`. Suppressing/redirecting that is the\n // spec-correct hook — relying on `keydown`'s `preventDefault()` to stop the close-watcher is\n // implementation-specific, not guaranteed across browsers.\n const handleCancel = (e: Event): void => {\n // See `handleNativeClose`'s comment: guard against a same-named bubbling event from a\n // descendant field being misread as this dialog's own native event.\n if (e.target !== options.dialogRef.value) return;\n\n e.preventDefault();\n\n if (options.isPersistent()) return;\n\n requestClose('escape');\n };\n\n const handleBackdropClick = (e: MouseEvent): void => {\n if (options.isPersistent()) return;\n\n if (e.target === options.dialogRef.value) requestClose('outsideClick');\n };\n\n // ── Internal native close handler ─────────────────────────────────────────\n // `e.target` must be checked against the native `<dialog>` itself, the same way\n // `handleBackdropClick` already does: a bubbling `close`-named event fired by *any* descendant\n // component reaches this listener too — regardless of that event's own `composed` flag, since\n // slot-assignment-based event-path computation (a slotted descendant's \"parent\" is the `<slot>`\n // projecting it) isn't gated by `composed` the way crossing back out of a shadow root is. Some\n // fields nested here (`ore-select`, `ore-combobox`, …) emit their own public `close` event when\n // *their* dropdown closes — without this check, selecting an option in one of those closes this\n // dialog too, misreading the field's own event as this dialog's native close.\n const handleNativeClose = (e?: Event): void => {\n if (e && e.target !== options.dialogRef.value) return;\n\n bgLock.unlock();\n options.host.removeAttribute('open');\n isOpen.value = false;\n focus.restoreFocus();\n\n const reason = pendingCloseReason;\n\n pendingCloseReason = 'programmatic';\n options.onNativeClose?.(reason);\n };\n\n const watchOpenProp = (): void => {\n const dialog = options.dialogRef.value;\n\n if (dialog) options.onEvent(dialog, 'close', handleNativeClose);\n\n watch(\n options.openProp,\n (open) => {\n if (open) {\n overlay.open('programmatic');\n } else {\n overlay.close('programmatic', false);\n }\n },\n { immediate: true },\n );\n };\n\n const setupNativeListeners = (): void => {\n const dialog = options.dialogRef.value;\n\n if (!dialog) return;\n\n watchOpenProp();\n options.onEvent(dialog, 'click', handleBackdropClick);\n options.onEvent(dialog, 'cancel', handleCancel);\n };\n\n return {\n closeWithAnimation,\n dispatchCloseRequest,\n handleBackdropClick,\n handleCancel,\n isOpen,\n overlay,\n requestClose,\n setupNativeListeners,\n watchOpenProp,\n };\n}\n"],"mappings":"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"}
|