@hjmds/react 1.7.0 → 1.9.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/README.md +21 -0
- package/THIRD_PARTY_NOTICES.md +57 -0
- package/dist/advanced-display.d.ts +3 -1
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +2 -2
- package/dist/advanced-display.js.map +1 -1
- package/dist/affix.d.ts +10 -0
- package/dist/affix.d.ts.map +1 -0
- package/dist/affix.js +51 -0
- package/dist/affix.js.map +1 -0
- package/dist/carousel-motion.d.ts +13 -0
- package/dist/carousel-motion.d.ts.map +1 -0
- package/dist/carousel-motion.js +35 -0
- package/dist/carousel-motion.js.map +1 -0
- package/dist/celebration.d.ts +8 -0
- package/dist/celebration.d.ts.map +1 -0
- package/dist/celebration.js +51 -0
- package/dist/celebration.js.map +1 -0
- package/dist/color-picker.d.ts +18 -0
- package/dist/color-picker.d.ts.map +1 -0
- package/dist/color-picker.js +40 -0
- package/dist/color-picker.js.map +1 -0
- package/dist/content-transition.d.ts +18 -0
- package/dist/content-transition.d.ts.map +1 -0
- package/dist/content-transition.js +33 -0
- package/dist/content-transition.js.map +1 -0
- package/dist/context-menu.d.ts.map +1 -1
- package/dist/context-menu.js +36 -9
- package/dist/context-menu.js.map +1 -1
- package/dist/date-picker.d.ts.map +1 -1
- package/dist/date-picker.js +39 -1
- package/dist/date-picker.js.map +1 -1
- package/dist/evidence.d.ts +106 -2
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +136 -64
- package/dist/evidence.js.map +1 -1
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +3 -2
- package/dist/layout.js.map +1 -1
- package/dist/masonry.d.ts +14 -0
- package/dist/masonry.d.ts.map +1 -0
- package/dist/masonry.js +13 -0
- package/dist/masonry.js.map +1 -0
- package/dist/menu-morph.d.ts +12 -0
- package/dist/menu-morph.d.ts.map +1 -0
- package/dist/menu-morph.js +80 -0
- package/dist/menu-morph.js.map +1 -0
- package/dist/menubar.d.ts.map +1 -1
- package/dist/menubar.js +24 -15
- package/dist/menubar.js.map +1 -1
- package/dist/modal.d.ts +1 -0
- package/dist/modal.d.ts.map +1 -1
- package/dist/modal.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +13 -1
- package/dist/navigation.js.map +1 -1
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +33 -2
- package/dist/overlays.js.map +1 -1
- package/dist/qr-code.d.ts +11 -0
- package/dist/qr-code.d.ts.map +1 -0
- package/dist/qr-code.js +14 -0
- package/dist/qr-code.js.map +1 -0
- package/dist/sortable.d.ts +14 -0
- package/dist/sortable.d.ts.map +1 -0
- package/dist/sortable.js +87 -0
- package/dist/sortable.js.map +1 -0
- package/dist/statistic-motion.d.ts +12 -0
- package/dist/statistic-motion.d.ts.map +1 -0
- package/dist/statistic-motion.js +23 -0
- package/dist/statistic-motion.js.map +1 -0
- package/dist/styles.css +166 -134
- package/dist/styles.layered.css +166 -134
- package/dist/swipe-actions.d.ts +13 -0
- package/dist/swipe-actions.d.ts.map +1 -0
- package/dist/swipe-actions.js +25 -0
- package/dist/swipe-actions.js.map +1 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +2 -1
- package/dist/theme.js.map +1 -1
- package/dist/thinking-orb.d.ts +9 -0
- package/dist/thinking-orb.d.ts.map +1 -0
- package/dist/thinking-orb.js +86 -0
- package/dist/thinking-orb.js.map +1 -0
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +14 -3
- package/dist/tree.js.map +1 -1
- package/dist/virtual-list.d.ts +14 -0
- package/dist/virtual-list.d.ts.map +1 -0
- package/dist/virtual-list.js +48 -0
- package/dist/virtual-list.js.map +1 -0
- package/dist/watermark.d.ts +12 -0
- package/dist/watermark.d.ts.map +1 -0
- package/dist/watermark.js +10 -0
- package/dist/watermark.js.map +1 -0
- package/package.json +122 -5
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 { 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 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 && nextOpen) {\n queueMicrotask(() => {\n if (pendingRequestRef.current === true) {\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 return 1000 + 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) 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)) 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 { 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 && nextOpen) {\n queueMicrotask(() => {\n if (pendingRequestRef.current === true) {\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 return 1000 + 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) 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)) 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"]}
|
package/dist/navigation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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"}
|
package/dist/navigation.js
CHANGED
|
@@ -147,7 +147,19 @@ export const Tabs = forwardRef(function Tabs(props, ref) {
|
|
|
147
147
|
setFocusValue(id);
|
|
148
148
|
if (activationMode === "automatic")
|
|
149
149
|
setValue(id);
|
|
150
|
-
queueMicrotask(() =>
|
|
150
|
+
queueMicrotask(() => {
|
|
151
|
+
const node = tabRefs.current.get(id);
|
|
152
|
+
if (!node)
|
|
153
|
+
return;
|
|
154
|
+
node.focus();
|
|
155
|
+
// The tab strip is horizontally scrollable; keyboard focus must bring an offscreen roving tab into view.
|
|
156
|
+
// `auto` preserves the consumer's scroll behavior, while `instant` prevents CSS smooth scrolling under reduced motion.
|
|
157
|
+
node.scrollIntoView({
|
|
158
|
+
block: "nearest",
|
|
159
|
+
inline: "nearest",
|
|
160
|
+
behavior: theme?.environment.reducedMotion ? "instant" : "auto",
|
|
161
|
+
});
|
|
162
|
+
});
|
|
151
163
|
};
|
|
152
164
|
const handleKeyDown = (event, id) => {
|
|
153
165
|
const intent = getTabNavigationIntent(event.key === " " ? "Space" : event.key, orientation, direction);
|
package/dist/navigation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n getTabNavigationIntent,\n getTabNavigationTarget,\n resolveInitialTabValue,\n tabsBehaviorDefaults,\n type TabsActivationMode,\n type TabsDirection,\n type TabsMountPolicy,\n type TabsOrientation,\n type TabsPanelMode,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n tabsRecipe,\n type TabSize,\n type TabsLayout,\n type TabsOverflow,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type TabLeadingRenderProps = Readonly<{\n selected: boolean;\n disabled: boolean;\n color: \"currentColor\";\n /** Pixel size resolved from `tabsRecipe.icon.glyph`. */\n size: number;\n /** Compatibility alias for product icon libraries that name this value explicitly. */\n glyphSize: number;\n}>;\n\nexport type TabItem = Readonly<{\n id: string;\n label: ReactNode;\n panel?: ReactNode;\n renderLeading?: (state: TabLeadingRenderProps) => ReactNode;\n disabled?: boolean;\n}>;\n\ntype TabsSelection =\n | Readonly<{\n value: string;\n defaultValue?: never;\n onValueChange(value: string): void;\n }>\n | Readonly<{\n value?: never;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n }>;\n\nexport type TabsProps = Omit<HTMLAttributes<HTMLDivElement>, \"dir\" | \"onChange\"> &\n TabsSelection &\n Readonly<{\n label: string;\n items: readonly TabItem[];\n activationMode?: TabsActivationMode;\n mountPolicy?: TabsMountPolicy;\n panelMode?: TabsPanelMode;\n orientation?: TabsOrientation;\n direction?: TabsDirection;\n loop?: boolean;\n size?: TabSize;\n layout?: TabsLayout;\n overflow?: TabsOverflow;\n /** Set false when panels are rendered separately with `TabPanel`. */\n renderPanels?: boolean;\n }>;\n\nfunction validateItems(items: readonly TabItem[]): void {\n if (items.length === 0) throw new TypeError(\"Tabs requires at least one item\");\n const ids = new Set<string>();\n for (const item of items) {\n if (item.id.trim().length === 0) throw new TypeError(\"Tabs item id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate Tabs item id: ${item.id}`);\n ids.add(item.id);\n }\n if (!items.some((item) => !item.disabled)) {\n throw new TypeError(\"Tabs requires at least one enabled item\");\n }\n}\n\nconst panelFocusableSelector = [\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\ntype TabPanelHostProps = HTMLAttributes<HTMLDivElement> & Readonly<{\n id: string;\n labelledBy: string;\n selected: boolean;\n dynamic: boolean;\n children: ReactNode;\n}>;\n\nfunction TabPanelHost({\n id,\n labelledBy,\n selected,\n dynamic,\n children,\n className,\n ...props\n}: TabPanelHostProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [hasFocusableContent, setHasFocusableContent] = useState(false);\n useEffect(() => {\n setHasFocusableContent(\n ref.current?.querySelector(panelFocusableSelector) !== null,\n );\n }, [children]);\n\n return (\n <div\n {...props}\n ref={ref}\n id={id}\n role=\"tabpanel\"\n className={classNames(\"hjm-tabs__panel\", className)}\n aria-labelledby={labelledBy}\n tabIndex={selected && !hasFocusableContent ? 0 : undefined}\n hidden={!selected}\n inert={selected ? undefined : true}\n data-state={selected ? \"active\" : \"inactive\"}\n data-panel-mode={dynamic ? \"dynamic\" : \"keyed\"}\n >\n {children}\n </div>\n );\n}\n\nfunction encodedTabId(value: string): string {\n return encodeURIComponent(value);\n}\n\nexport function getTabId(tabsId: string, value: string): string {\n return `${tabsId}-tab-${encodedTabId(value)}`;\n}\n\nexport function getTabPanelId(\n tabsId: string,\n value: string,\n mode: TabsPanelMode = \"keyed\",\n): string {\n return mode === \"dynamic\"\n ? `${tabsId}-panel`\n : `${tabsId}-panel-${encodedTabId(value)}`;\n}\n\nexport function getDynamicTabPanelId(tabsId: string): string {\n return getTabPanelId(tabsId, \"\", \"dynamic\");\n}\n\ntype ExternalTabPanelBaseProps = Omit<HTMLAttributes<HTMLDivElement>, \"id\"> &\n Readonly<{\n tabsId: string;\n activeValue: string;\n children: ReactNode;\n }>;\n\nexport type TabPanelProps = ExternalTabPanelBaseProps &\n (\n | Readonly<{\n mode: \"dynamic\";\n value?: never;\n mountPolicy?: never;\n }>\n | Readonly<{\n mode?: \"keyed\";\n value: string;\n mountPolicy?: TabsMountPolicy;\n }>\n );\n\n/** External panel host for products that keep routing, query, or scroll state outside Tabs. */\nexport function TabPanel(props: TabPanelProps) {\n const { tabsId, activeValue, children } = props;\n const dynamic = props.mode === \"dynamic\";\n const value = dynamic ? activeValue : props.value;\n const selected = value === activeValue;\n const mountPolicy = dynamic ? \"active\" : props.mountPolicy ?? tabsBehaviorDefaults.mountPolicy;\n let hostProps: Omit<HTMLAttributes<HTMLDivElement>, \"id\">;\n if (props.mode === \"dynamic\") {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n } else {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n value: _value,\n mountPolicy: _mountPolicy,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n }\n const [visited, setVisited] = useState(selected);\n useEffect(() => {\n if (selected) setVisited(true);\n }, [selected]);\n const mounted =\n dynamic ||\n selected ||\n mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && visited);\n if (!mounted) return null;\n return (\n <TabPanelHost\n {...hostProps}\n id={getTabPanelId(tabsId, value, dynamic ? \"dynamic\" : \"keyed\")}\n labelledBy={getTabId(tabsId, dynamic ? activeValue : value)}\n selected={selected}\n dynamic={dynamic}\n >\n {children}\n </TabPanelHost>\n );\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n props,\n ref,\n) {\n const {\n label,\n items,\n activationMode = tabsBehaviorDefaults.activationMode,\n mountPolicy = tabsBehaviorDefaults.mountPolicy,\n panelMode = tabsBehaviorDefaults.panelMode,\n orientation = tabsBehaviorDefaults.orientation,\n direction: directionProp,\n loop = tabsBehaviorDefaults.loop,\n size = tabsRecipe.defaults.size,\n layout = tabsRecipe.defaults.layout,\n overflow = tabsRecipe.defaults.overflow,\n renderPanels = true,\n className,\n id,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...rest\n } = props;\n validateItems(items);\n if (label.trim().length === 0) throw new TypeError(\"Tabs label must not be empty\");\n if (panelMode === \"dynamic\" && mountPolicy !== \"active\") {\n throw new TypeError(\"Tabs dynamic panelMode requires active mountPolicy\");\n }\n const descriptors = items.map((item) => ({\n id: item.id,\n label: item.id,\n ...(item.disabled === undefined ? {} : { disabled: item.disabled }),\n }));\n const initialValueRef = useRef<Readonly<{ value: string }> | null>(null);\n if (initialValueRef.current === null) {\n const resolved = resolveInitialTabValue(descriptors, defaultValue);\n if (resolved === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n initialValueRef.current = { value: resolved };\n }\n const initialValue = initialValueRef.current.value;\n const collectionFallback = items.find((item) => !item.disabled)?.id;\n if (collectionFallback === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n const [storedValue, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue: initialValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const controlled = valueProp !== undefined;\n const storedSelectionIsValid = items.some(\n (item) => item.id === storedValue && !item.disabled,\n );\n if (controlled && !storedSelectionIsValid) {\n throw new RangeError(`Tabs value must identify an enabled item: ${storedValue}`);\n }\n const value = storedSelectionIsValid ? storedValue : collectionFallback;\n const [focusValue, setFocusValue] = useState(value);\n const resolvedFocusValue = items.some(\n (item) => item.id === focusValue && !item.disabled,\n )\n ? focusValue\n : value;\n const [visited, setVisited] = useState<ReadonlySet<string>>(() => new Set([value]));\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const generatedId = useId().replaceAll(\":\", \"\");\n const baseId = id ?? `hjm-${generatedId}`;\n const theme = useOptionalHjmTheme();\n const direction = directionProp ?? theme?.environment.direction ?? tabsBehaviorDefaults.direction;\n\n useEffect(() => {\n if (!controlled && !storedSelectionIsValid) setValue(collectionFallback);\n }, [collectionFallback, controlled, setValue, storedSelectionIsValid]);\n useEffect(() => {\n if (!items.some((item) => item.id === focusValue && !item.disabled)) {\n setFocusValue(value);\n }\n }, [focusValue, items, value]);\n useEffect(() => {\n setVisited((current) => {\n const known = new Set(items.map((item) => item.id));\n const next = new Set([...current].filter((id) => known.has(id)));\n next.add(value);\n if (\n next.size === current.size &&\n [...next].every((id) => current.has(id))\n ) return current;\n return next;\n });\n }, [items, value]);\n\n const focusItem = (id: string) => {\n setFocusValue(id);\n if (activationMode === \"automatic\") setValue(id);\n queueMicrotask(() => tabRefs.current.get(id)?.focus());\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>, id: string) => {\n const intent = getTabNavigationIntent(\n event.key === \" \" ? \"Space\" : event.key as Parameters<typeof getTabNavigationIntent>[0],\n orientation,\n direction,\n );\n if (intent !== undefined) {\n const target = getTabNavigationTarget(descriptors, id, intent, loop);\n if (target !== undefined) {\n event.preventDefault();\n focusItem(target);\n }\n return;\n }\n if (\n activationMode === \"manual\" &&\n (event.key === \"Enter\" || event.key === \" \")\n ) {\n event.preventDefault();\n setValue(id);\n }\n };\n const panelId = (value: string) => getTabPanelId(baseId, value, panelMode);\n\n return (\n <div\n {...rest}\n ref={ref}\n id={baseId}\n className={classNames(\"hjm-tabs\", className)}\n data-size={size}\n data-layout={layout}\n data-overflow={overflow}\n data-orientation={orientation}\n data-mount-policy={mountPolicy}\n data-panel-mode={panelMode}\n data-state=\"ready\"\n dir={direction}\n >\n <div\n className=\"hjm-tabs__list\"\n role=\"tablist\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {items.map((item) => {\n const selected = item.id === value;\n const tabId = getTabId(baseId, item.id);\n const leadingSize = iconRecipe.sizes[tabsRecipe.icon.glyph];\n return (\n <button\n key={item.id}\n ref={(node) => {\n if (node) tabRefs.current.set(item.id, node);\n else tabRefs.current.delete(item.id);\n }}\n id={tabId}\n type=\"button\"\n role=\"tab\"\n className=\"hjm-tabs__tab\"\n data-state={selected ? \"selected\" : \"idle\"}\n aria-selected={selected}\n aria-controls={panelId(item.id)}\n tabIndex={item.id === resolvedFocusValue ? 0 : -1}\n disabled={item.disabled}\n onClick={() => {\n setFocusValue(item.id);\n setValue(item.id);\n }}\n onKeyDown={(event) => handleKeyDown(event, item.id)}\n >\n {item.renderLeading ? (\n <span aria-hidden=\"true\" className=\"hjm-tabs__leading\">\n {item.renderLeading({\n selected,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n glyphSize: leadingSize,\n })}\n </span>\n ) : null}\n {item.label}\n </button>\n );\n })}\n </div>\n {!renderPanels ? null : panelMode === \"dynamic\" ? (\n <TabPanelHost\n id={panelId(value)}\n labelledBy={getTabId(baseId, value)}\n selected\n dynamic\n >\n {items.find((item) => item.id === value)?.panel}\n </TabPanelHost>\n ) : items.map((item) => {\n const selected = item.id === value;\n const mounted = mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && (visited.has(item.id) || selected)) ||\n (mountPolicy === \"active\" && selected);\n return mounted ? (\n <TabPanelHost\n key={item.id}\n id={panelId(item.id)}\n labelledBy={getTabId(baseId, item.id)}\n selected={selected}\n dynamic={false}\n >\n {item.panel}\n </TabPanelHost>\n ) : null;\n })}\n </div>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n getTabNavigationIntent,\n getTabNavigationTarget,\n resolveInitialTabValue,\n tabsBehaviorDefaults,\n type TabsActivationMode,\n type TabsDirection,\n type TabsMountPolicy,\n type TabsOrientation,\n type TabsPanelMode,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n tabsRecipe,\n type TabSize,\n type TabsLayout,\n type TabsOverflow,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport type TabLeadingRenderProps = Readonly<{\n selected: boolean;\n disabled: boolean;\n color: \"currentColor\";\n /** Pixel size resolved from `tabsRecipe.icon.glyph`. */\n size: number;\n /** Compatibility alias for product icon libraries that name this value explicitly. */\n glyphSize: number;\n}>;\n\nexport type TabItem = Readonly<{\n id: string;\n label: ReactNode;\n panel?: ReactNode;\n renderLeading?: (state: TabLeadingRenderProps) => ReactNode;\n disabled?: boolean;\n}>;\n\ntype TabsSelection =\n | Readonly<{\n value: string;\n defaultValue?: never;\n onValueChange(value: string): void;\n }>\n | Readonly<{\n value?: never;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n }>;\n\nexport type TabsProps = Omit<HTMLAttributes<HTMLDivElement>, \"dir\" | \"onChange\"> &\n TabsSelection &\n Readonly<{\n label: string;\n items: readonly TabItem[];\n activationMode?: TabsActivationMode;\n mountPolicy?: TabsMountPolicy;\n panelMode?: TabsPanelMode;\n orientation?: TabsOrientation;\n direction?: TabsDirection;\n loop?: boolean;\n size?: TabSize;\n layout?: TabsLayout;\n overflow?: TabsOverflow;\n /** Set false when panels are rendered separately with `TabPanel`. */\n renderPanels?: boolean;\n }>;\n\nfunction validateItems(items: readonly TabItem[]): void {\n if (items.length === 0) throw new TypeError(\"Tabs requires at least one item\");\n const ids = new Set<string>();\n for (const item of items) {\n if (item.id.trim().length === 0) throw new TypeError(\"Tabs item id must not be empty\");\n if (ids.has(item.id)) throw new TypeError(`Duplicate Tabs item id: ${item.id}`);\n ids.add(item.id);\n }\n if (!items.some((item) => !item.disabled)) {\n throw new TypeError(\"Tabs requires at least one enabled item\");\n }\n}\n\nconst panelFocusableSelector = [\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\ntype TabPanelHostProps = HTMLAttributes<HTMLDivElement> & Readonly<{\n id: string;\n labelledBy: string;\n selected: boolean;\n dynamic: boolean;\n children: ReactNode;\n}>;\n\nfunction TabPanelHost({\n id,\n labelledBy,\n selected,\n dynamic,\n children,\n className,\n ...props\n}: TabPanelHostProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [hasFocusableContent, setHasFocusableContent] = useState(false);\n useEffect(() => {\n setHasFocusableContent(\n ref.current?.querySelector(panelFocusableSelector) !== null,\n );\n }, [children]);\n\n return (\n <div\n {...props}\n ref={ref}\n id={id}\n role=\"tabpanel\"\n className={classNames(\"hjm-tabs__panel\", className)}\n aria-labelledby={labelledBy}\n tabIndex={selected && !hasFocusableContent ? 0 : undefined}\n hidden={!selected}\n inert={selected ? undefined : true}\n data-state={selected ? \"active\" : \"inactive\"}\n data-panel-mode={dynamic ? \"dynamic\" : \"keyed\"}\n >\n {children}\n </div>\n );\n}\n\nfunction encodedTabId(value: string): string {\n return encodeURIComponent(value);\n}\n\nexport function getTabId(tabsId: string, value: string): string {\n return `${tabsId}-tab-${encodedTabId(value)}`;\n}\n\nexport function getTabPanelId(\n tabsId: string,\n value: string,\n mode: TabsPanelMode = \"keyed\",\n): string {\n return mode === \"dynamic\"\n ? `${tabsId}-panel`\n : `${tabsId}-panel-${encodedTabId(value)}`;\n}\n\nexport function getDynamicTabPanelId(tabsId: string): string {\n return getTabPanelId(tabsId, \"\", \"dynamic\");\n}\n\ntype ExternalTabPanelBaseProps = Omit<HTMLAttributes<HTMLDivElement>, \"id\"> &\n Readonly<{\n tabsId: string;\n activeValue: string;\n children: ReactNode;\n }>;\n\nexport type TabPanelProps = ExternalTabPanelBaseProps &\n (\n | Readonly<{\n mode: \"dynamic\";\n value?: never;\n mountPolicy?: never;\n }>\n | Readonly<{\n mode?: \"keyed\";\n value: string;\n mountPolicy?: TabsMountPolicy;\n }>\n );\n\n/** External panel host for products that keep routing, query, or scroll state outside Tabs. */\nexport function TabPanel(props: TabPanelProps) {\n const { tabsId, activeValue, children } = props;\n const dynamic = props.mode === \"dynamic\";\n const value = dynamic ? activeValue : props.value;\n const selected = value === activeValue;\n const mountPolicy = dynamic ? \"active\" : props.mountPolicy ?? tabsBehaviorDefaults.mountPolicy;\n let hostProps: Omit<HTMLAttributes<HTMLDivElement>, \"id\">;\n if (props.mode === \"dynamic\") {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n } else {\n const {\n tabsId: _tabsId,\n activeValue: _activeValue,\n children: _children,\n mode: _mode,\n value: _value,\n mountPolicy: _mountPolicy,\n ...htmlProps\n } = props;\n hostProps = htmlProps;\n }\n const [visited, setVisited] = useState(selected);\n useEffect(() => {\n if (selected) setVisited(true);\n }, [selected]);\n const mounted =\n dynamic ||\n selected ||\n mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && visited);\n if (!mounted) return null;\n return (\n <TabPanelHost\n {...hostProps}\n id={getTabPanelId(tabsId, value, dynamic ? \"dynamic\" : \"keyed\")}\n labelledBy={getTabId(tabsId, dynamic ? activeValue : value)}\n selected={selected}\n dynamic={dynamic}\n >\n {children}\n </TabPanelHost>\n );\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n props,\n ref,\n) {\n const {\n label,\n items,\n activationMode = tabsBehaviorDefaults.activationMode,\n mountPolicy = tabsBehaviorDefaults.mountPolicy,\n panelMode = tabsBehaviorDefaults.panelMode,\n orientation = tabsBehaviorDefaults.orientation,\n direction: directionProp,\n loop = tabsBehaviorDefaults.loop,\n size = tabsRecipe.defaults.size,\n layout = tabsRecipe.defaults.layout,\n overflow = tabsRecipe.defaults.overflow,\n renderPanels = true,\n className,\n id,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...rest\n } = props;\n validateItems(items);\n if (label.trim().length === 0) throw new TypeError(\"Tabs label must not be empty\");\n if (panelMode === \"dynamic\" && mountPolicy !== \"active\") {\n throw new TypeError(\"Tabs dynamic panelMode requires active mountPolicy\");\n }\n const descriptors = items.map((item) => ({\n id: item.id,\n label: item.id,\n ...(item.disabled === undefined ? {} : { disabled: item.disabled }),\n }));\n const initialValueRef = useRef<Readonly<{ value: string }> | null>(null);\n if (initialValueRef.current === null) {\n const resolved = resolveInitialTabValue(descriptors, defaultValue);\n if (resolved === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n initialValueRef.current = { value: resolved };\n }\n const initialValue = initialValueRef.current.value;\n const collectionFallback = items.find((item) => !item.disabled)?.id;\n if (collectionFallback === undefined) throw new TypeError(\"Tabs requires an enabled item\");\n const [storedValue, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue: initialValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const controlled = valueProp !== undefined;\n const storedSelectionIsValid = items.some(\n (item) => item.id === storedValue && !item.disabled,\n );\n if (controlled && !storedSelectionIsValid) {\n throw new RangeError(`Tabs value must identify an enabled item: ${storedValue}`);\n }\n const value = storedSelectionIsValid ? storedValue : collectionFallback;\n const [focusValue, setFocusValue] = useState(value);\n const resolvedFocusValue = items.some(\n (item) => item.id === focusValue && !item.disabled,\n )\n ? focusValue\n : value;\n const [visited, setVisited] = useState<ReadonlySet<string>>(() => new Set([value]));\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const generatedId = useId().replaceAll(\":\", \"\");\n const baseId = id ?? `hjm-${generatedId}`;\n const theme = useOptionalHjmTheme();\n const direction = directionProp ?? theme?.environment.direction ?? tabsBehaviorDefaults.direction;\n\n useEffect(() => {\n if (!controlled && !storedSelectionIsValid) setValue(collectionFallback);\n }, [collectionFallback, controlled, setValue, storedSelectionIsValid]);\n useEffect(() => {\n if (!items.some((item) => item.id === focusValue && !item.disabled)) {\n setFocusValue(value);\n }\n }, [focusValue, items, value]);\n useEffect(() => {\n setVisited((current) => {\n const known = new Set(items.map((item) => item.id));\n const next = new Set([...current].filter((id) => known.has(id)));\n next.add(value);\n if (\n next.size === current.size &&\n [...next].every((id) => current.has(id))\n ) return current;\n return next;\n });\n }, [items, value]);\n\n const focusItem = (id: string) => {\n setFocusValue(id);\n if (activationMode === \"automatic\") setValue(id);\n queueMicrotask(() => {\n const node = tabRefs.current.get(id);\n if (!node) return;\n node.focus();\n // The tab strip is horizontally scrollable; keyboard focus must bring an offscreen roving tab into view.\n // `auto` preserves the consumer's scroll behavior, while `instant` prevents CSS smooth scrolling under reduced motion.\n node.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n behavior: theme?.environment.reducedMotion ? \"instant\" : \"auto\",\n });\n });\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>, id: string) => {\n const intent = getTabNavigationIntent(\n event.key === \" \" ? \"Space\" : event.key as Parameters<typeof getTabNavigationIntent>[0],\n orientation,\n direction,\n );\n if (intent !== undefined) {\n const target = getTabNavigationTarget(descriptors, id, intent, loop);\n if (target !== undefined) {\n event.preventDefault();\n focusItem(target);\n }\n return;\n }\n if (\n activationMode === \"manual\" &&\n (event.key === \"Enter\" || event.key === \" \")\n ) {\n event.preventDefault();\n setValue(id);\n }\n };\n const panelId = (value: string) => getTabPanelId(baseId, value, panelMode);\n\n return (\n <div\n {...rest}\n ref={ref}\n id={baseId}\n className={classNames(\"hjm-tabs\", className)}\n data-size={size}\n data-layout={layout}\n data-overflow={overflow}\n data-orientation={orientation}\n data-mount-policy={mountPolicy}\n data-panel-mode={panelMode}\n data-state=\"ready\"\n dir={direction}\n >\n <div\n className=\"hjm-tabs__list\"\n role=\"tablist\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {items.map((item) => {\n const selected = item.id === value;\n const tabId = getTabId(baseId, item.id);\n const leadingSize = iconRecipe.sizes[tabsRecipe.icon.glyph];\n return (\n <button\n key={item.id}\n ref={(node) => {\n if (node) tabRefs.current.set(item.id, node);\n else tabRefs.current.delete(item.id);\n }}\n id={tabId}\n type=\"button\"\n role=\"tab\"\n className=\"hjm-tabs__tab\"\n data-state={selected ? \"selected\" : \"idle\"}\n aria-selected={selected}\n aria-controls={panelId(item.id)}\n tabIndex={item.id === resolvedFocusValue ? 0 : -1}\n disabled={item.disabled}\n onClick={() => {\n setFocusValue(item.id);\n setValue(item.id);\n }}\n onKeyDown={(event) => handleKeyDown(event, item.id)}\n >\n {item.renderLeading ? (\n <span aria-hidden=\"true\" className=\"hjm-tabs__leading\">\n {item.renderLeading({\n selected,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n glyphSize: leadingSize,\n })}\n </span>\n ) : null}\n {item.label}\n </button>\n );\n })}\n </div>\n {!renderPanels ? null : panelMode === \"dynamic\" ? (\n <TabPanelHost\n id={panelId(value)}\n labelledBy={getTabId(baseId, value)}\n selected\n dynamic\n >\n {items.find((item) => item.id === value)?.panel}\n </TabPanelHost>\n ) : items.map((item) => {\n const selected = item.id === value;\n const mounted = mountPolicy === \"always\" ||\n (mountPolicy === \"visited\" && (visited.has(item.id) || selected)) ||\n (mountPolicy === \"active\" && selected);\n return mounted ? (\n <TabPanelHost\n key={item.id}\n id={panelId(item.id)}\n labelledBy={getTabId(baseId, item.id)}\n selected={selected}\n dynamic={false}\n >\n {item.panel}\n </TabPanelHost>\n ) : null;\n })}\n </div>\n );\n});\n"]}
|
package/dist/overlays.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"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"}
|
package/dist/overlays.js
CHANGED
|
@@ -263,6 +263,7 @@ export const Tooltip = forwardRef(function Tooltip({ trigger, content, placement
|
|
|
263
263
|
});
|
|
264
264
|
const timerRef = useRef(undefined);
|
|
265
265
|
const suppressedRef = useRef(false);
|
|
266
|
+
const touchTapRef = useRef(null);
|
|
266
267
|
const triggerRef = useRef(null);
|
|
267
268
|
const [tooltipNode, setTooltipNode] = useState(null);
|
|
268
269
|
const id = `${useId().replaceAll(":", "")}-tooltip`;
|
|
@@ -319,6 +320,10 @@ export const Tooltip = forwardRef(function Tooltip({ trigger, content, placement
|
|
|
319
320
|
const renderedTrigger = cloneElement(trigger, {
|
|
320
321
|
ref: composeRefs(triggerProps.ref, triggerRef),
|
|
321
322
|
...(describedBy ? { "aria-describedby": describedBy } : {}),
|
|
323
|
+
onPointerDown: (event) => {
|
|
324
|
+
triggerProps.onPointerDown?.(event);
|
|
325
|
+
touchTapRef.current = event.pointerType === "touch" ? { wasVisible: visible } : null;
|
|
326
|
+
},
|
|
322
327
|
onPointerEnter: (event) => {
|
|
323
328
|
triggerProps.onPointerEnter?.(event);
|
|
324
329
|
if (event.pointerType === "touch")
|
|
@@ -356,11 +361,37 @@ export const Tooltip = forwardRef(function Tooltip({ trigger, content, placement
|
|
|
356
361
|
},
|
|
357
362
|
onClick: (event) => {
|
|
358
363
|
triggerProps.onClick?.(event);
|
|
359
|
-
|
|
360
|
-
|
|
364
|
+
const touchTap = touchTapRef.current;
|
|
365
|
+
touchTapRef.current = null;
|
|
366
|
+
if (event.defaultPrevented)
|
|
367
|
+
return;
|
|
368
|
+
// Touch has no hover, so a tap is the only way to show the hint. The tap's
|
|
369
|
+
// own focus already opened it; closing here (the mouse/keyboard path) made it
|
|
370
|
+
// flash for 1ms (2026-09-30 audit WR-0930-1). A second tap closes instead.
|
|
371
|
+
if (touchTap !== null && !touchTap.wasVisible) {
|
|
372
|
+
if (!visible)
|
|
373
|
+
schedule(true, 0, { reason: "pointer" });
|
|
374
|
+
return;
|
|
361
375
|
}
|
|
376
|
+
if (visible)
|
|
377
|
+
changeOpen(false, { reason: "trigger-activation" });
|
|
362
378
|
},
|
|
363
379
|
});
|
|
380
|
+
useEffect(() => {
|
|
381
|
+
if (!visible)
|
|
382
|
+
return;
|
|
383
|
+
// Tap-opened tooltips have no pointer-leave; an outside press dismisses them.
|
|
384
|
+
// Mobile Safari does not focus buttons on tap, so blur alone is not enough.
|
|
385
|
+
const onOutsidePress = (event) => {
|
|
386
|
+
if (containsEventTarget(triggerRef.current, event.target) ||
|
|
387
|
+
containsEventTarget(tooltipNode, event.target))
|
|
388
|
+
return;
|
|
389
|
+
clearTimer();
|
|
390
|
+
changeOpen(false, { reason: "blur" });
|
|
391
|
+
};
|
|
392
|
+
document.addEventListener("pointerdown", onOutsidePress, true);
|
|
393
|
+
return () => document.removeEventListener("pointerdown", onOutsidePress, true);
|
|
394
|
+
}, [changeOpen, tooltipNode, visible]);
|
|
364
395
|
const popupPosition = useAnchoredPopup(triggerRef, tooltipNode, {
|
|
365
396
|
align: descriptor.align,
|
|
366
397
|
placement: descriptor.placement,
|