@hjmds/react 1.28.0 → 1.29.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/auth-screen.d.ts +18 -1
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +10 -7
- package/dist/auth-screen.js.map +1 -1
- package/dist/collection-rail.d.ts +7 -1
- package/dist/collection-rail.d.ts.map +1 -1
- package/dist/collection-rail.js +7 -4
- package/dist/collection-rail.js.map +1 -1
- package/dist/evidence.d.ts +331 -1
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +52 -2
- package/dist/evidence.js.map +1 -1
- package/dist/feedback.d.ts +11 -0
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +3 -2
- package/dist/feedback.js.map +1 -1
- package/dist/forms.d.ts +21 -0
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +9 -4
- package/dist/forms.js.map +1 -1
- package/dist/internal/initial-focus.d.ts +48 -0
- package/dist/internal/initial-focus.d.ts.map +1 -0
- package/dist/internal/initial-focus.js +134 -0
- package/dist/internal/initial-focus.js.map +1 -0
- package/dist/modal.d.ts +18 -1
- package/dist/modal.d.ts.map +1 -1
- package/dist/modal.js +21 -4
- package/dist/modal.js.map +1 -1
- package/dist/overlays.d.ts +13 -0
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +14 -4
- package/dist/overlays.js.map +1 -1
- package/dist/screen-flows.d.ts +4 -2
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +7 -5
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +19 -1
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +19 -9
- package/dist/screens.js.map +1 -1
- package/dist/styles.css +15 -3
- package/dist/styles.layered.css +15 -3
- package/package.json +3 -3
package/dist/modal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../src/modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport { isLargeTextScale } from \"@hjmds/design-contracts/components/design-system-provider\";\nimport {\n cloneElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type AriaAttributes,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { composeRefs } from \"./internal.js\";\nimport { getPopoverOwner } from \"./portal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\n/*\n Shared modal machinery for Dialog, AlertDialog, Sheet, and SidePanel. Keeping it\n inside overlays.tsx would drag the Menu and Tooltip graph into SidePanel's granular\n entry; copying it would split `activeModalStack` in two, so a Dialog and a SidePanel\n would each believe they are topmost. The stack, the body-scroll lock, and background\n isolation must stay single module-level instances, so they live here alone.\n*/\n\nexport type TriggerElementProps = Readonly<{\n ref?: Ref<HTMLElement>;\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLElement>;\n onMouseEnter?: MouseEventHandler<HTMLElement>;\n onMouseLeave?: MouseEventHandler<HTMLElement>;\n onPointerDown?: React.PointerEventHandler<HTMLElement>;\n onPointerEnter?: React.PointerEventHandler<HTMLElement>;\n onPointerLeave?: React.PointerEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLElement>;\n \"aria-controls\"?: string;\n \"aria-describedby\"?: string;\n \"aria-disabled\"?: AriaAttributes[\"aria-disabled\"];\n \"aria-expanded\"?: AriaAttributes[\"aria-expanded\"];\n \"aria-haspopup\"?: AriaAttributes[\"aria-haspopup\"];\n}>;\n\nexport type OverlayTrigger = ReactElement<TriggerElementProps>;\n\nexport function containsEventTarget(\n container: Node | null,\n target: EventTarget | null,\n): boolean {\n return target !== null &&\n \"nodeType\" in target &&\n container?.contains(target as Node) === true;\n}\n\ntype ModalPortalProps = Readonly<{\n children: ReactNode;\n container?: HTMLElement;\n}>;\n\nexport function HjmPortal({ children, container }: ModalPortalProps) {\n const [mounted, setMounted] = useState(false);\n const theme = useOptionalHjmTheme();\n useEffect(() => setMounted(true), []);\n if (!mounted) return null;\n return createPortal(\n theme ? (\n <div\n className=\"hjm-root hjm-portal\"\n data-hjm-portal=\"\"\n data-motion={theme.environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={theme.environment.theme}\n data-text-scale={theme.environment.textScale}\n data-large-text={isLargeTextScale(theme.environment.textScale) ? \"true\" : undefined}\n dir={theme.environment.direction}\n style={createHjmThemeStyle(theme)}\n >\n {children}\n </div>\n ) : children,\n container ?? document.body,\n );\n}\n\nexport type OpenState<Detail> =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange: (open: boolean, detail: Detail) => void;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, detail: Detail) => void;\n }>;\n\nexport type ModalOpenState<Detail> =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange: (open: boolean, detail: Detail) => void;\n /** Optional for product-owned, programmatically controlled overlays. */\n trigger?: OverlayTrigger;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, detail: Detail) => void;\n /** Uncontrolled overlays need a first-party activation target. */\n trigger: OverlayTrigger;\n }>;\n\nexport function useOpenState<Detail>({\n open,\n defaultOpen = false,\n onOpenChange,\n}: Readonly<{\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, detail: Detail) => void;\n}>) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const controlled = open !== undefined;\n const currentOpen = controlled ? open : internalOpen;\n const pendingRequestRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (pendingRequestRef.current === currentOpen) {\n pendingRequestRef.current = undefined;\n }\n }, [currentOpen]);\n const changeOpen = useCallback(\n (nextOpen: boolean, detail: Detail) => {\n if (\n nextOpen === currentOpen ||\n pendingRequestRef.current === nextOpen\n ) return;\n pendingRequestRef.current = nextOpen;\n if (!controlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen, detail);\n if (controlled) {\n queueMicrotask(() => {\n if (pendingRequestRef.current === nextOpen) {\n pendingRequestRef.current = undefined;\n }\n });\n }\n },\n [controlled, currentOpen, onOpenChange],\n );\n return [currentOpen, changeOpen] as const;\n}\n\nconst focusableSelector = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nexport function getFocusable(container: HTMLElement): HTMLElement[] {\n return [...container.querySelectorAll<HTMLElement>(focusableSelector)].filter(\n (element) => element.tabIndex >= 0 && !element.matches(\":disabled\") &&\n !element.closest('[hidden],[inert],[aria-hidden=\"true\"]') &&\n element.getClientRects().length > 0 && getComputedStyle(element).visibility !== \"hidden\",\n );\n}\n\nlet bodyLockCount = 0;\nlet previousBodyOverflow = \"\";\ntype ActiveModal = Readonly<{\n element: HTMLElement;\n order: number;\n priority: number;\n}>;\nconst activeModalStack: ActiveModal[] = [];\nlet activeModalOrder = 0;\nconst isolatedModalBackground = new Map<\n HTMLElement,\n Readonly<{ ariaHidden: string | null; inert: boolean }>\n>();\nlet modalIsolationObserver: MutationObserver | null = null;\n\nfunction getOwnedPopupHosts(modal: ActiveModal): HTMLElement[] {\n const ownerId = modal.element.id;\n if (ownerId.length === 0) return [];\n return [...document.querySelectorAll<HTMLElement>(\"[data-hjm-popup-owner]\")]\n .filter((host) => host.getAttribute(\"data-hjm-popup-owner\") === ownerId);\n}\n\nfunction modalContainsNode(modal: ActiveModal, node: Node): boolean {\n return modal.element.contains(node) ||\n getOwnedPopupHosts(modal).some((host) => host.contains(node));\n}\n\nfunction getModalFocusable(modal: ActiveModal): HTMLElement[] {\n return [\n ...getFocusable(modal.element),\n ...getOwnedPopupHosts(modal).flatMap((host) => getFocusable(host)),\n ];\n}\n\nexport function getModalLayer(priority: number): number {\n if (!Number.isSafeInteger(priority)) {\n throw new TypeError(\"modalPriority must be a safe integer\");\n }\n // Keep priority ordering inside the shared modal tier; copied Web-only bases\n // made product layer tokens disagree with actual overlay order.\n return layer.modal + priority;\n}\n\nfunction getTopModal(): ActiveModal | undefined {\n let top: ActiveModal | undefined;\n for (const modal of activeModalStack) {\n if (!modal.element.isConnected) continue;\n if (\n top === undefined ||\n modal.priority > top.priority ||\n (modal.priority === top.priority && modal.order > top.order)\n ) top = modal;\n }\n return top;\n}\n\nfunction modalRanksAbove(candidate: ActiveModal, reference: ActiveModal): boolean {\n return candidate.priority > reference.priority ||\n (candidate.priority === reference.priority && candidate.order > reference.order);\n}\n\nfunction restoreModalBackground(): void {\n for (const [element, previous] of isolatedModalBackground) {\n element.inert = previous.inert;\n if (previous.ariaHidden === null) element.removeAttribute(\"aria-hidden\");\n else element.setAttribute(\"aria-hidden\", previous.ariaHidden);\n }\n isolatedModalBackground.clear();\n}\n\nfunction isolateModalBackgroundElement(element: HTMLElement): void {\n if (isolatedModalBackground.has(element)) return;\n isolatedModalBackground.set(element, {\n ariaHidden: element.getAttribute(\"aria-hidden\"),\n inert: element.inert,\n });\n element.inert = true;\n element.setAttribute(\"aria-hidden\", \"true\");\n}\n\n/** Keeps only the top modal's ancestor path interactive, including late portals. */\nfunction synchronizeModalBackgroundIsolation(): void {\n restoreModalBackground();\n for (let index = activeModalStack.length - 1; index >= 0; index -= 1) {\n if (!activeModalStack[index]?.element.isConnected) activeModalStack.splice(index, 1);\n }\n const top = getTopModal();\n if (!top) {\n modalIsolationObserver?.disconnect();\n modalIsolationObserver = null;\n return;\n }\n\n const interactivePath = new Set<HTMLElement>();\n for (const root of [top.element, ...getOwnedPopupHosts(top)]) {\n let pathNode: HTMLElement | null = root;\n while (pathNode) {\n if (pathNode === document.body) break;\n interactivePath.add(pathNode);\n pathNode = pathNode.parentElement;\n }\n }\n const inspectedParents = new Set<HTMLElement>();\n for (const pathNode of interactivePath) {\n const parent = pathNode.parentElement;\n if (!parent || inspectedParents.has(parent)) continue;\n inspectedParents.add(parent);\n for (const sibling of parent.children) {\n if (sibling instanceof HTMLElement && !interactivePath.has(sibling)) {\n isolateModalBackgroundElement(sibling);\n }\n }\n }\n\n if (modalIsolationObserver === null) {\n modalIsolationObserver = new MutationObserver(() => {\n synchronizeModalBackgroundIsolation();\n });\n modalIsolationObserver.observe(document.body, {\n attributes: true,\n attributeFilter: [\"data-hjm-popup-owner\"],\n childList: true,\n subtree: true,\n });\n }\n}\n\nfunction lockBodyScroll(): () => void {\n if (bodyLockCount === 0) {\n previousBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n }\n bodyLockCount += 1;\n return () => {\n bodyLockCount = Math.max(0, bodyLockCount - 1);\n if (bodyLockCount === 0) document.body.style.overflow = previousBodyOverflow;\n };\n}\n\ntype ModalFocusOptions = Readonly<{\n active: boolean;\n priority?: number;\n contentRef: React.RefObject<HTMLElement | null>;\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n returnFocusRef?: React.RefObject<HTMLElement | null>;\n fallbackReturnRef?: React.RefObject<HTMLElement | null>;\n onEscape(): void;\n}>;\n\nexport function useModalFocus({\n active,\n priority = 0,\n contentRef,\n initialFocusRef,\n returnFocusRef,\n fallbackReturnRef,\n onEscape,\n}: ModalFocusOptions): void {\n const escapeRef = useRef(onEscape);\n escapeRef.current = onEscape;\n\n useEffect(() => {\n if (!active) return;\n let retryTimer: ReturnType<typeof setTimeout> | undefined;\n let release: (() => void) | undefined;\n let cancelled = false;\n\n const activate = () => {\n const content = contentRef.current;\n if (!content) {\n retryTimer = setTimeout(activate, 0);\n return;\n }\n const previouslyFocused = document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n const releaseScroll = lockBodyScroll();\n const modal: ActiveModal = {\n element: content,\n order: activeModalOrder += 1,\n priority,\n };\n activeModalStack.push(modal);\n synchronizeModalBackgroundIsolation();\n const initial = initialFocusRef?.current ?? getFocusable(content)[0] ?? content;\n if (getTopModal() === modal) initial.focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (getTopModal() !== modal || event.isComposing || event.keyCode === 229) return;\n if (event.key === \"Escape\") {\n // A focused non-modal child owns its first Escape. Let its content (or\n // nested menu) handle it before dismissing the containing modal.\n if (event.target instanceof Node && (getPopoverOwner(event.target) ||\n getOwnedPopupHosts(modal).some((host) => host.contains(event.target as Node)))) return;\n // Menubar keeps focus on its expanded trigger while its menu is portaled.\n const trigger = event.target instanceof Element\n ? event.target.closest<HTMLElement>('[aria-expanded=\"true\"][aria-controls]') : null;\n const popup = trigger ? document.getElementById(trigger.getAttribute(\"aria-controls\")!) : null;\n if (popup && getOwnedPopupHosts(modal).some((host) => host.contains(popup))) return;\n const descriptions = event.target instanceof Element\n ? event.target.getAttribute(\"aria-describedby\")?.split(/\\s+/) ?? [] : [];\n if (descriptions.some((id) => document.getElementById(id)?.getAttribute(\"role\") === \"tooltip\")) return;\n event.preventDefault();\n escapeRef.current();\n return;\n }\n if (event.key !== \"Tab\") return;\n const focusable = getModalFocusable(modal);\n if (focusable.length === 0) {\n event.preventDefault();\n content.focus();\n return;\n }\n const first = focusable[0]!;\n const last = focusable.at(-1)!;\n const current = document.activeElement;\n if (event.shiftKey && (current === first || !(current instanceof Node) || !modalContainsNode(modal, current))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (current === last || !(current instanceof Node) || !modalContainsNode(modal, current))) {\n event.preventDefault();\n first.focus();\n }\n };\n const handleFocusIn = (event: FocusEvent) => {\n if (getTopModal() !== modal) return;\n if (event.target instanceof Node && !modalContainsNode(modal, event.target)) {\n (initialFocusRef?.current ?? getFocusable(content)[0] ?? content).focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown, true);\n document.addEventListener(\"focusin\", handleFocusIn, true);\n release = () => {\n const wasTop = !activeModalStack.some(\n (candidate) =>\n candidate !== modal && candidate.element.isConnected && modalRanksAbove(candidate, modal),\n );\n document.removeEventListener(\"keydown\", handleKeyDown, true);\n document.removeEventListener(\"focusin\", handleFocusIn, true);\n const stackIndex = activeModalStack.lastIndexOf(modal);\n if (stackIndex >= 0) activeModalStack.splice(stackIndex, 1);\n synchronizeModalBackgroundIsolation();\n releaseScroll();\n const returnTarget =\n returnFocusRef?.current ?? fallbackReturnRef?.current ?? previouslyFocused;\n if (wasTop) {\n queueMicrotask(() => {\n const nextTop = getTopModal();\n if (!nextTop) {\n returnTarget?.focus();\n return;\n }\n if (returnTarget && modalContainsNode(nextTop, returnTarget)) returnTarget.focus();\n else (getModalFocusable(nextTop)[0] ?? nextTop.element).focus();\n });\n }\n };\n if (cancelled) release();\n };\n activate();\n return () => {\n cancelled = true;\n if (retryTimer !== undefined) clearTimeout(retryTimer);\n release?.();\n };\n }, [active, contentRef, fallbackReturnRef, initialFocusRef, priority, returnFocusRef]);\n}\n\nexport function renderTrigger(\n trigger: OverlayTrigger,\n triggerRef: React.RefObject<HTMLElement | null>,\n open: boolean,\n contentId: string,\n popup: \"dialog\" | \"menu\",\n onOpen: () => void,\n): ReactElement {\n const props = trigger.props;\n return cloneElement(trigger, {\n ref: composeRefs(props.ref, triggerRef),\n \"aria-controls\": contentId,\n \"aria-expanded\": open,\n \"aria-haspopup\": popup,\n onClick: (event) => {\n props.onClick?.(event);\n if (!event.defaultPrevented && !props.disabled) onOpen();\n },\n });\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../src/modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport { isLargeTextScale } from \"@hjmds/design-contracts/components/design-system-provider\";\nimport {\n cloneElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type AriaAttributes,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { composeRefs } from \"./internal.js\";\nimport { getPopoverOwner } from \"./portal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\n/*\n Shared modal machinery for Dialog, AlertDialog, Sheet, and SidePanel. Keeping it\n inside overlays.tsx would drag the Menu and Tooltip graph into SidePanel's granular\n entry; copying it would split `activeModalStack` in two, so a Dialog and a SidePanel\n would each believe they are topmost. The stack, the body-scroll lock, and background\n isolation must stay single module-level instances, so they live here alone.\n*/\n\nexport type TriggerElementProps = Readonly<{\n ref?: Ref<HTMLElement>;\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLElement>;\n onMouseEnter?: MouseEventHandler<HTMLElement>;\n onMouseLeave?: MouseEventHandler<HTMLElement>;\n onPointerDown?: React.PointerEventHandler<HTMLElement>;\n onPointerEnter?: React.PointerEventHandler<HTMLElement>;\n onPointerLeave?: React.PointerEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLElement>;\n \"aria-controls\"?: string;\n \"aria-describedby\"?: string;\n \"aria-disabled\"?: AriaAttributes[\"aria-disabled\"];\n \"aria-expanded\"?: AriaAttributes[\"aria-expanded\"];\n \"aria-haspopup\"?: AriaAttributes[\"aria-haspopup\"];\n}>;\n\nexport type OverlayTrigger = ReactElement<TriggerElementProps>;\n\nexport function containsEventTarget(\n container: Node | null,\n target: EventTarget | null,\n): boolean {\n return target !== null &&\n \"nodeType\" in target &&\n container?.contains(target as Node) === true;\n}\n\ntype ModalPortalProps = Readonly<{\n children: ReactNode;\n container?: HTMLElement;\n}>;\n\nexport function HjmPortal({ children, container }: ModalPortalProps) {\n const [mounted, setMounted] = useState(false);\n const theme = useOptionalHjmTheme();\n useEffect(() => setMounted(true), []);\n if (!mounted) return null;\n return createPortal(\n theme ? (\n <div\n className=\"hjm-root hjm-portal\"\n data-hjm-portal=\"\"\n data-motion={theme.environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={theme.environment.theme}\n data-text-scale={theme.environment.textScale}\n data-large-text={isLargeTextScale(theme.environment.textScale) ? \"true\" : undefined}\n dir={theme.environment.direction}\n style={createHjmThemeStyle(theme)}\n >\n {children}\n </div>\n ) : children,\n container ?? document.body,\n );\n}\n\nexport type OpenState<Detail> =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange: (open: boolean, detail: Detail) => void;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, detail: Detail) => void;\n }>;\n\nexport type ModalOpenState<Detail> =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange: (open: boolean, detail: Detail) => void;\n /** Optional for product-owned, programmatically controlled overlays. */\n trigger?: OverlayTrigger;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, detail: Detail) => void;\n /** Uncontrolled overlays need a first-party activation target. */\n trigger: OverlayTrigger;\n }>;\n\nexport function useOpenState<Detail>({\n open,\n defaultOpen = false,\n onOpenChange,\n}: Readonly<{\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, detail: Detail) => void;\n}>) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const controlled = open !== undefined;\n const currentOpen = controlled ? open : internalOpen;\n const pendingRequestRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (pendingRequestRef.current === currentOpen) {\n pendingRequestRef.current = undefined;\n }\n }, [currentOpen]);\n const changeOpen = useCallback(\n (nextOpen: boolean, detail: Detail) => {\n if (\n nextOpen === currentOpen ||\n pendingRequestRef.current === nextOpen\n ) return;\n pendingRequestRef.current = nextOpen;\n if (!controlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen, detail);\n if (controlled) {\n queueMicrotask(() => {\n if (pendingRequestRef.current === nextOpen) {\n pendingRequestRef.current = undefined;\n }\n });\n }\n },\n [controlled, currentOpen, onOpenChange],\n );\n return [currentOpen, changeOpen] as const;\n}\n\nconst focusableSelector = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nexport function getFocusable(container: HTMLElement): HTMLElement[] {\n return [...container.querySelectorAll<HTMLElement>(focusableSelector)].filter(\n (element) => element.tabIndex >= 0 && !element.matches(\":disabled\") &&\n !element.closest('[hidden],[inert],[aria-hidden=\"true\"]') &&\n element.getClientRects().length > 0 && getComputedStyle(element).visibility !== \"hidden\",\n );\n}\n\nlet bodyLockCount = 0;\nlet previousBodyOverflow = \"\";\nexport type ActiveModal = Readonly<{\n element: HTMLElement;\n order: number;\n priority: number;\n}>;\nconst activeModalStack: ActiveModal[] = [];\nlet activeModalOrder = 0;\nconst modalCloseListeners = new Set<() => void>();\n/** Called after a modal released and its return focus ran: a screen that entered under it may focus now. */\nexport function subscribeModalClose(listener: () => void): () => void {\n modalCloseListeners.add(listener);\n return () => { modalCloseListeners.delete(listener); };\n}\nconst isolatedModalBackground = new Map<\n HTMLElement,\n Readonly<{ ariaHidden: string | null; inert: boolean }>\n>();\nlet modalIsolationObserver: MutationObserver | null = null;\n\nfunction getOwnedPopupHosts(modal: ActiveModal): HTMLElement[] {\n const ownerId = modal.element.id;\n if (ownerId.length === 0) return [];\n return [...document.querySelectorAll<HTMLElement>(\"[data-hjm-popup-owner]\")]\n .filter((host) => host.getAttribute(\"data-hjm-popup-owner\") === ownerId);\n}\n\nfunction modalContainsNode(modal: ActiveModal, node: Node): boolean {\n return modal.element.contains(node) ||\n getOwnedPopupHosts(modal).some((host) => host.contains(node));\n}\n\nfunction getModalFocusable(modal: ActiveModal): HTMLElement[] {\n return [\n ...getFocusable(modal.element),\n ...getOwnedPopupHosts(modal).flatMap((host) => getFocusable(host)),\n ];\n}\n\nexport function getModalLayer(priority: number): number {\n if (!Number.isSafeInteger(priority)) {\n throw new TypeError(\"modalPriority must be a safe integer\");\n }\n // Keep priority ordering inside the shared modal tier; copied Web-only bases\n // made product layer tokens disagree with actual overlay order.\n return layer.modal + priority;\n}\n\nexport function getTopModal(): ActiveModal | undefined {\n let top: ActiveModal | undefined;\n for (const modal of activeModalStack) {\n if (!modal.element.isConnected) continue;\n if (\n top === undefined ||\n modal.priority > top.priority ||\n (modal.priority === top.priority && modal.order > top.order)\n ) top = modal;\n }\n return top;\n}\n\nfunction modalRanksAbove(candidate: ActiveModal, reference: ActiveModal): boolean {\n return candidate.priority > reference.priority ||\n (candidate.priority === reference.priority && candidate.order > reference.order);\n}\n\nfunction restoreModalBackground(): void {\n for (const [element, previous] of isolatedModalBackground) {\n element.inert = previous.inert;\n if (previous.ariaHidden === null) element.removeAttribute(\"aria-hidden\");\n else element.setAttribute(\"aria-hidden\", previous.ariaHidden);\n }\n isolatedModalBackground.clear();\n}\n\nfunction isolateModalBackgroundElement(element: HTMLElement): void {\n if (isolatedModalBackground.has(element)) return;\n isolatedModalBackground.set(element, {\n ariaHidden: element.getAttribute(\"aria-hidden\"),\n inert: element.inert,\n });\n element.inert = true;\n element.setAttribute(\"aria-hidden\", \"true\");\n}\n\n/** Keeps only the top modal's ancestor path interactive, including late portals. */\nfunction synchronizeModalBackgroundIsolation(): void {\n restoreModalBackground();\n for (let index = activeModalStack.length - 1; index >= 0; index -= 1) {\n if (!activeModalStack[index]?.element.isConnected) activeModalStack.splice(index, 1);\n }\n const top = getTopModal();\n if (!top) {\n modalIsolationObserver?.disconnect();\n modalIsolationObserver = null;\n return;\n }\n\n const interactivePath = new Set<HTMLElement>();\n for (const root of [top.element, ...getOwnedPopupHosts(top)]) {\n let pathNode: HTMLElement | null = root;\n while (pathNode) {\n if (pathNode === document.body) break;\n interactivePath.add(pathNode);\n pathNode = pathNode.parentElement;\n }\n }\n const inspectedParents = new Set<HTMLElement>();\n for (const pathNode of interactivePath) {\n const parent = pathNode.parentElement;\n if (!parent || inspectedParents.has(parent)) continue;\n inspectedParents.add(parent);\n for (const sibling of parent.children) {\n if (sibling instanceof HTMLElement && !interactivePath.has(sibling)) {\n isolateModalBackgroundElement(sibling);\n }\n }\n }\n\n if (modalIsolationObserver === null) {\n modalIsolationObserver = new MutationObserver(() => {\n synchronizeModalBackgroundIsolation();\n });\n modalIsolationObserver.observe(document.body, {\n attributes: true,\n attributeFilter: [\"data-hjm-popup-owner\"],\n childList: true,\n subtree: true,\n });\n }\n}\n\nfunction lockBodyScroll(): () => void {\n if (bodyLockCount === 0) {\n previousBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n }\n bodyLockCount += 1;\n return () => {\n bodyLockCount = Math.max(0, bodyLockCount - 1);\n if (bodyLockCount === 0) document.body.style.overflow = previousBodyOverflow;\n };\n}\n\ntype ModalFocusOptions = Readonly<{\n active: boolean;\n priority?: number;\n contentRef: React.RefObject<HTMLElement | null>;\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n /**\n * Entry-focus field (screen-patterns `resolveEntryFocus`), before the first focusable element. Always called on\n * activation; `explicit` is true when `initialFocusRef` already names the target, which then wins.\n */\n resolveInitialFocus?: (explicit: boolean) => HTMLElement | null;\n /** Receives this modal's stack entry while active, so entry-focus scopes can tell what is above them. */\n layerRef?: { current: ActiveModal | null };\n returnFocusRef?: React.RefObject<HTMLElement | null>;\n fallbackReturnRef?: React.RefObject<HTMLElement | null>;\n onEscape(): void;\n}>;\n\nexport function useModalFocus({\n active,\n priority = 0,\n contentRef,\n initialFocusRef,\n resolveInitialFocus,\n layerRef,\n returnFocusRef,\n fallbackReturnRef,\n onEscape,\n}: ModalFocusOptions): void {\n const escapeRef = useRef(onEscape);\n escapeRef.current = onEscape;\n const resolveInitialFocusRef = useRef(resolveInitialFocus);\n resolveInitialFocusRef.current = resolveInitialFocus;\n\n useEffect(() => {\n if (!active) return;\n let retryTimer: ReturnType<typeof setTimeout> | undefined;\n let release: (() => void) | undefined;\n let cancelled = false;\n\n const activate = () => {\n const content = contentRef.current;\n if (!content) {\n retryTimer = setTimeout(activate, 0);\n return;\n }\n const previouslyFocused = document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n const releaseScroll = lockBodyScroll();\n const modal: ActiveModal = {\n element: content,\n order: activeModalOrder += 1,\n priority,\n };\n activeModalStack.push(modal);\n if (layerRef) layerRef.current = modal;\n synchronizeModalBackgroundIsolation();\n const explicit = initialFocusRef?.current ?? null;\n const resolved = resolveInitialFocusRef.current?.(explicit !== null) ?? null;\n const initial = explicit ?? resolved ?? getFocusable(content)[0] ?? content;\n if (getTopModal() === modal) initial.focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (getTopModal() !== modal || event.isComposing || event.keyCode === 229) return;\n if (event.key === \"Escape\") {\n // A focused non-modal child owns its first Escape. Let its content (or\n // nested menu) handle it before dismissing the containing modal.\n if (event.target instanceof Node && (getPopoverOwner(event.target) ||\n getOwnedPopupHosts(modal).some((host) => host.contains(event.target as Node)))) return;\n // Menubar keeps focus on its expanded trigger while its menu is portaled.\n const trigger = event.target instanceof Element\n ? event.target.closest<HTMLElement>('[aria-expanded=\"true\"][aria-controls]') : null;\n const popup = trigger ? document.getElementById(trigger.getAttribute(\"aria-controls\")!) : null;\n if (popup && getOwnedPopupHosts(modal).some((host) => host.contains(popup))) return;\n const descriptions = event.target instanceof Element\n ? event.target.getAttribute(\"aria-describedby\")?.split(/\\s+/) ?? [] : [];\n if (descriptions.some((id) => document.getElementById(id)?.getAttribute(\"role\") === \"tooltip\")) return;\n event.preventDefault();\n escapeRef.current();\n return;\n }\n if (event.key !== \"Tab\") return;\n const focusable = getModalFocusable(modal);\n if (focusable.length === 0) {\n event.preventDefault();\n content.focus();\n return;\n }\n const first = focusable[0]!;\n const last = focusable.at(-1)!;\n const current = document.activeElement;\n if (event.shiftKey && (current === first || !(current instanceof Node) || !modalContainsNode(modal, current))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (current === last || !(current instanceof Node) || !modalContainsNode(modal, current))) {\n event.preventDefault();\n first.focus();\n }\n };\n const handleFocusIn = (event: FocusEvent) => {\n if (getTopModal() !== modal) return;\n if (event.target instanceof Node && !modalContainsNode(modal, event.target)) {\n (initialFocusRef?.current ?? getFocusable(content)[0] ?? content).focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown, true);\n document.addEventListener(\"focusin\", handleFocusIn, true);\n release = () => {\n const wasTop = !activeModalStack.some(\n (candidate) =>\n candidate !== modal && candidate.element.isConnected && modalRanksAbove(candidate, modal),\n );\n document.removeEventListener(\"keydown\", handleKeyDown, true);\n document.removeEventListener(\"focusin\", handleFocusIn, true);\n const stackIndex = activeModalStack.lastIndexOf(modal);\n if (stackIndex >= 0) activeModalStack.splice(stackIndex, 1);\n if (layerRef?.current === modal) layerRef.current = null;\n synchronizeModalBackgroundIsolation();\n releaseScroll();\n // After the return-focus microtask below, so a pending entry focus sees where focus landed.\n setTimeout(() => { for (const listener of [...modalCloseListeners]) listener(); }, 0);\n const returnTarget =\n returnFocusRef?.current ?? fallbackReturnRef?.current ?? previouslyFocused;\n if (wasTop) {\n queueMicrotask(() => {\n const nextTop = getTopModal();\n if (!nextTop) {\n returnTarget?.focus();\n return;\n }\n if (returnTarget && modalContainsNode(nextTop, returnTarget)) returnTarget.focus();\n else (getModalFocusable(nextTop)[0] ?? nextTop.element).focus();\n });\n }\n };\n if (cancelled) release();\n };\n activate();\n return () => {\n cancelled = true;\n if (retryTimer !== undefined) clearTimeout(retryTimer);\n release?.();\n };\n }, [active, contentRef, fallbackReturnRef, initialFocusRef, layerRef, priority, returnFocusRef]);\n}\n\nexport function renderTrigger(\n trigger: OverlayTrigger,\n triggerRef: React.RefObject<HTMLElement | null>,\n open: boolean,\n contentId: string,\n popup: \"dialog\" | \"menu\",\n onOpen: () => void,\n): ReactElement {\n const props = trigger.props;\n return cloneElement(trigger, {\n ref: composeRefs(props.ref, triggerRef),\n \"aria-controls\": contentId,\n \"aria-expanded\": open,\n \"aria-haspopup\": popup,\n onClick: (event) => {\n props.onClick?.(event);\n if (!event.defaultPrevented && !props.disabled) onOpen();\n },\n });\n}\n\n"]}
|
package/dist/overlays.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type InitialFocusMode } from "@hjmds/design-contracts/screen-patterns";
|
|
1
2
|
import type { TransitionRect } from "@hjmds/design-contracts/content-transition";
|
|
2
3
|
import { type AlertDialogOpenChangeReason, type AlertDialogRequest } from "@hjmds/design-contracts/components/alert-dialog";
|
|
3
4
|
import { type SheetDetent, type SheetDismissPolicy, type SheetDismissReason, type SheetOpenChangeDetails } from "@hjmds/design-contracts/components/sheet";
|
|
@@ -24,6 +25,12 @@ export type DialogProps = ModalOpenState<Readonly<{
|
|
|
24
25
|
/** Localized accessible name for the close action. */
|
|
25
26
|
closeLabel: string;
|
|
26
27
|
initialFocusRef?: React.RefObject<HTMLElement | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Text field focused when it opens and no `initialFocusRef` is given: by default only a lone text entry
|
|
30
|
+
* (`single-input`); `first-input` prefers the field marked `initialFocusTarget`; `none` keeps the first focusable
|
|
31
|
+
* element (2026-10-18, screen-patterns rules shared with Native).
|
|
32
|
+
*/
|
|
33
|
+
initialFocus?: InitialFocusMode;
|
|
27
34
|
returnFocusRef?: React.RefObject<HTMLElement | null>;
|
|
28
35
|
/**
|
|
29
36
|
* Fires once per visible cycle, after the portal is gone and focus has been
|
|
@@ -86,6 +93,12 @@ export type SheetProps = ModalOpenState<SheetOpenChangeDetails> & Readonly<{
|
|
|
86
93
|
/** Localized accessible name for the close action. */
|
|
87
94
|
closeLabel: string;
|
|
88
95
|
initialFocusRef?: React.RefObject<HTMLElement | null>;
|
|
96
|
+
/**
|
|
97
|
+
* Text field focused when it opens and no `initialFocusRef` is given: by default only a lone text entry
|
|
98
|
+
* (`single-input`); `first-input` prefers the field marked `initialFocusTarget`; `none` keeps the first focusable
|
|
99
|
+
* element (2026-10-18, screen-patterns rules shared with Native).
|
|
100
|
+
*/
|
|
101
|
+
initialFocus?: InitialFocusMode;
|
|
89
102
|
returnFocusRef?: React.RefObject<HTMLElement | null>;
|
|
90
103
|
/** Fires once per visible cycle, after the Sheet portal has been removed. */
|
|
91
104
|
onDismissComplete?: (detail: Readonly<{
|
package/dist/overlays.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAIjF,OAAO,EAKL,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAExB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAGL,WAAW,EAGX,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,OAAO,EAOL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,cAAc,GACd,QAAQ,GACR,SAAS,CAAC;AAGd,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC;IAAE,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAAC,GACpF,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gGAAgG;IAChG,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAG,cAAc,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACxH,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,MAAM,wGAgKjB,CAAC;AAGH,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAC3C,QAAQ,CAAC;IAAE,MAAM,EAAE,2BAA2B,CAAA;CAAE,CAAC,CAClD,GACC,QAAQ,CAAC;IACP,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEL,eAAO,MAAM,WAAW,6GAuKvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC,KAAK,CAAC;AAGvD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,sBAAsB,CAAC,GAC7D,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC/E,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uGAAuG;IACvG,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC,CAAC;AAEL,eAAO,MAAM,KAAK,uGAyPhB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,wBAAwB,CAAC,GAC5D,QAAQ,CAAC;IACP,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEL,eAAO,MAAM,OAAO,0GA2OlB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,GAC5E,QAAQ,CAAC;IAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAAC,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,MAAM,cAAc,GACtB,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5B,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;IACtD,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC,CAAC;AAEP,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC,CAAC;AAEH,KAAK,mBAAmB,GACpB,QAAQ,CAAC;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC,GACF,QAAQ,CAAC;IACP,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC,CAAC;AAEP,KAAK,qBAAqB,GACtB,QAAQ,CAAC;IACP,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACjD,CAAC,GACF,QAAQ,CAAC;IACP,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACtD,CAAC,CAAC;AAEP,KAAK,eAAe,GAChB,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC,GACF,QAAQ,CAAC;IACP,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC,CAAC,CAAC;AAEP,KAAK,aAAa,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,GAAG,eAAe,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAAC,GAC3E,aAAa,GACb,CAAC,mBAAmB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC,CAAC;AA8CtE,eAAO,MAAM,IAAI,sGAwXf,CAAC"}
|
package/dist/overlays.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { InitialFocusProvider, useInitialFocusScope } from "./internal/initial-focus.js";
|
|
3
|
+
import { initialFocusDefaults } from "@hjmds/design-contracts/screen-patterns";
|
|
2
4
|
import { useOverlayOriginMotion } from "./internal/overlay-origin-motion.js";
|
|
3
5
|
import { layer } from "@hjmds/design-contracts/foundations";
|
|
4
6
|
import { resolveMenuTypeahead } from "./menu-typeahead.js";
|
|
@@ -12,7 +14,7 @@ import { classNames, composeRefs, useControllableState } from "./internal.js";
|
|
|
12
14
|
import { AnchoredPortal, useAnchoredPopup } from "./portal.js";
|
|
13
15
|
import { useHjmDensityDefault, useTooltipCoordinator, useOptionalHjmTheme } from "./provider.js";
|
|
14
16
|
import { containsEventTarget, getModalLayer, HjmPortal, renderTrigger, useModalFocus, useOpenState, } from "./modal.js";
|
|
15
|
-
export const Dialog = forwardRef(function Dialog({ trigger, title, description, children, footer, size = dialogRecipe.defaults.size, motionOrigin, dismissible = dialogRecipe.defaults.dismissible, busy = false, closeLabel, initialFocusRef, returnFocusRef, onDismissComplete, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, }, forwardedRef) {
|
|
17
|
+
export const Dialog = forwardRef(function Dialog({ trigger, title, description, children, footer, size = dialogRecipe.defaults.size, motionOrigin, dismissible = dialogRecipe.defaults.dismissible, busy = false, closeLabel, initialFocusRef, initialFocus = initialFocusDefaults.overlay, returnFocusRef, onDismissComplete, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, }, forwardedRef) {
|
|
16
18
|
const modalLayer = getModalLayer(modalPriority);
|
|
17
19
|
const [open, changeOpen] = useOpenState({
|
|
18
20
|
...(openProp === undefined ? {} : { open: openProp }),
|
|
@@ -75,11 +77,15 @@ export const Dialog = forwardRef(function Dialog({ trigger, title, description,
|
|
|
75
77
|
});
|
|
76
78
|
};
|
|
77
79
|
}, []);
|
|
80
|
+
const focusLayer = useRef(null);
|
|
81
|
+
const focusScope = useInitialFocusScope({ mode: initialFocus, active: visible, layer: focusLayer });
|
|
78
82
|
useModalFocus({
|
|
79
83
|
active: visible,
|
|
80
84
|
priority: modalPriority,
|
|
81
85
|
contentRef,
|
|
82
86
|
...(initialFocusRef === undefined ? {} : { initialFocusRef }),
|
|
87
|
+
resolveInitialFocus: focusScope.enter,
|
|
88
|
+
layerRef: focusLayer,
|
|
83
89
|
...(returnFocusRef === undefined ? {} : { returnFocusRef }),
|
|
84
90
|
...(trigger === undefined ? {} : { fallbackReturnRef: triggerRef }),
|
|
85
91
|
onEscape: () => requestClose("escape"),
|
|
@@ -91,7 +97,7 @@ export const Dialog = forwardRef(function Dialog({ trigger, title, description,
|
|
|
91
97
|
event.preventDefault();
|
|
92
98
|
requestClose("outside");
|
|
93
99
|
}
|
|
94
|
-
}, children: _jsxs("div", { ref: mergedContentRef, id: contentId, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": description ? descriptionId : undefined, "aria-busy": busy || undefined, inert: !open, "aria-hidden": !open || undefined, tabIndex: -1, className: classNames("hjm-dialog", className), "data-hjm-modal-content": "", "data-size": size, "data-state": busy ? "busy" : "idle", children: [_jsxs("header", { className: "hjm-dialog__header", children: [_jsx("h2", { id: titleId, className: "hjm-dialog__title", children: title }), dismissible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }), description ? _jsx("p", { id: descriptionId, className: "hjm-dialog__description", children: description }) : null, children ? _jsx("div", { className: "hjm-dialog__body", children: children }) : null, footer ? _jsx("footer", { className: "hjm-dialog__footer", children: footer }) : null] }) }) })) : null] }));
|
|
100
|
+
}, children: _jsxs("div", { ref: mergedContentRef, id: contentId, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": description ? descriptionId : undefined, "aria-busy": busy || undefined, inert: !open, "aria-hidden": !open || undefined, tabIndex: -1, className: classNames("hjm-dialog", className), "data-hjm-modal-content": "", "data-size": size, "data-state": busy ? "busy" : "idle", children: [_jsxs("header", { className: "hjm-dialog__header", children: [_jsx("h2", { id: titleId, className: "hjm-dialog__title", children: title }), dismissible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }), description ? _jsx("p", { id: descriptionId, className: "hjm-dialog__description", children: description }) : null, children ? _jsx("div", { className: "hjm-dialog__body", children: _jsx(InitialFocusProvider, { scope: focusScope, children: children }) }) : null, footer ? _jsx("footer", { className: "hjm-dialog__footer", children: footer }) : null] }) }) })) : null] }));
|
|
95
101
|
});
|
|
96
102
|
export const AlertDialog = forwardRef(function AlertDialog({ trigger, request, icon, size = dialogRecipe.defaults.size, returnFocusRef, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, }, forwardedRef) {
|
|
97
103
|
const modalLayer = getModalLayer(modalPriority);
|
|
@@ -177,7 +183,7 @@ export const AlertDialog = forwardRef(function AlertDialog({ trigger, request, i
|
|
|
177
183
|
changeOpen(true, { reason: "trigger" });
|
|
178
184
|
}), open ? (_jsx(HjmPortal, { ...(portalContainer === undefined ? {} : { container: portalContainer }), children: _jsx("div", { className: "hjm-overlay", "data-kind": "alert-dialog", "data-modal-priority": modalPriority, "data-state": "open", style: { zIndex: modalLayer }, children: _jsxs("div", { ref: composeRefs(contentRef, forwardedRef), id: contentId, role: "alertdialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": `${descriptionId}${error ? ` ${errorId}` : ""}`, "aria-busy": busy || undefined, tabIndex: -1, className: classNames("hjm-alert-dialog", className), "data-hjm-modal-content": "", "data-size": size, "data-tone": tone, "data-state": busy ? "busy" : error ? "error" : "idle", children: [icon ? _jsx("div", { className: "hjm-alert-dialog__icon", "aria-hidden": "true", children: icon }) : null, _jsx("h2", { id: titleId, className: "hjm-alert-dialog__title", children: request.title }), _jsx("p", { id: descriptionId, className: "hjm-alert-dialog__description", children: request.description }), error ? _jsx("p", { id: errorId, className: "hjm-alert-dialog__error", role: "alert", children: error }) : null, _jsxs("div", { className: "hjm-alert-dialog__actions", children: [request.mode === "confirm" ? (_jsx(Button, { ref: cancelRef, tone: "secondary", disabled: busy || closing, onClick: () => cancel("cancel-action"), children: request.cancelLabel })) : null, _jsx(Button, { ref: confirmRef, tone: tone === "danger" ? "danger" : "primary", loading: busy, disabled: closing, onClick: () => void confirm(), children: request.confirmLabel })] })] }) }) })) : null] }));
|
|
179
185
|
});
|
|
180
|
-
export const Sheet = forwardRef(function Sheet({ trigger, title, description, children, footer, placement = sheetRecipe.defaults.placement, size = sheetRecipe.defaults.size, detents, activeDetent, onDetentChange, detentLabels, busy = false, dismissPolicy, closeLabel, initialFocusRef, returnFocusRef, onDismissComplete, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, showClose, }, forwardedRef) {
|
|
186
|
+
export const Sheet = forwardRef(function Sheet({ trigger, title, description, children, footer, placement = sheetRecipe.defaults.placement, size = sheetRecipe.defaults.size, detents, activeDetent, onDetentChange, detentLabels, busy = false, dismissPolicy, closeLabel, initialFocusRef, initialFocus = initialFocusDefaults.overlay, returnFocusRef, onDismissComplete, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, showClose, }, forwardedRef) {
|
|
181
187
|
const modalLayer = getModalLayer(modalPriority);
|
|
182
188
|
const [open, changeOpen] = useOpenState({
|
|
183
189
|
...(openProp === undefined ? {} : { open: openProp }),
|
|
@@ -255,11 +261,15 @@ export const Sheet = forwardRef(function Sheet({ trigger, title, description, ch
|
|
|
255
261
|
});
|
|
256
262
|
};
|
|
257
263
|
}, []);
|
|
264
|
+
const focusLayer = useRef(null);
|
|
265
|
+
const focusScope = useInitialFocusScope({ mode: initialFocus, active: open, layer: focusLayer });
|
|
258
266
|
useModalFocus({
|
|
259
267
|
active: open,
|
|
260
268
|
priority: modalPriority,
|
|
261
269
|
contentRef,
|
|
262
270
|
...(initialFocusRef === undefined ? {} : { initialFocusRef }),
|
|
271
|
+
resolveInitialFocus: focusScope.enter,
|
|
272
|
+
layerRef: focusLayer,
|
|
263
273
|
...(returnFocusRef === undefined ? {} : { returnFocusRef }),
|
|
264
274
|
...(trigger === undefined ? {} : { fallbackReturnRef: triggerRef }),
|
|
265
275
|
onEscape: () => requestClose("escape"),
|
|
@@ -307,7 +317,7 @@ export const Sheet = forwardRef(function Sheet({ trigger, title, description, ch
|
|
|
307
317
|
onDetentChange?.(next);
|
|
308
318
|
}, children: _jsx("span", { "aria-hidden": "true", className: "hjm-sheet__handle-bar" }) }) })) : showHandle ? (
|
|
309
319
|
// Without detents the handle is the visible close control for keyboard and switch users.
|
|
310
|
-
_jsx("div", { className: "hjm-sheet__handle-row", children: _jsx("button", { type: "button", className: "hjm-sheet__handle", "aria-label": closeLabel, disabled: closeBlocked, onClick: () => requestClose("close-action"), children: _jsx("span", { "aria-hidden": "true", className: "hjm-sheet__handle-bar" }) }) })) : null, description || (policy.dismissible && closeVisible) ? _jsxs("header", { className: "hjm-sheet__header", children: [description ? _jsx("div", { children: _jsx("p", { id: descriptionId, className: "hjm-sheet__description", children: description }) }) : null, policy.dismissible && closeVisible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy && !policy.dismissWhileBusy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }) : null] }), children ? _jsx("div", { className: "hjm-sheet__body", children: children }) : null, footer ? _jsx("footer", { className: "hjm-sheet__footer", children: footer }) : null] }) }) })) : null] }));
|
|
320
|
+
_jsx("div", { className: "hjm-sheet__handle-row", children: _jsx("button", { type: "button", className: "hjm-sheet__handle", "aria-label": closeLabel, disabled: closeBlocked, onClick: () => requestClose("close-action"), children: _jsx("span", { "aria-hidden": "true", className: "hjm-sheet__handle-bar" }) }) })) : null, description || (policy.dismissible && closeVisible) ? _jsxs("header", { className: "hjm-sheet__header", children: [description ? _jsx("div", { children: _jsx("p", { id: descriptionId, className: "hjm-sheet__description", children: description }) }) : null, policy.dismissible && closeVisible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy && !policy.dismissWhileBusy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }) : null] }), children ? _jsx("div", { className: "hjm-sheet__body", children: _jsx(InitialFocusProvider, { scope: focusScope, children: children }) }) : null, footer ? _jsx("footer", { className: "hjm-sheet__footer", children: footer }) : null] }) }) })) : null] }));
|
|
311
321
|
});
|
|
312
322
|
export const Tooltip = forwardRef(function Tooltip({ trigger, content, placement, align, pointerOpenDelayMs = tooltipBehaviorDefaults.pointerOpenDelayMs, focusOpenDelayMs = tooltipBehaviorDefaults.focusOpenDelayMs, portalContainer, open: openProp, defaultOpen, onOpenChange, className, layoutStyle, }, ref) {
|
|
313
323
|
const descriptor = resolveTooltipDescriptor({
|