@hjmds/react 1.13.1 → 1.15.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.
Files changed (127) hide show
  1. package/dist/agreement.d.ts.map +1 -1
  2. package/dist/agreement.js +5 -3
  3. package/dist/agreement.js.map +1 -1
  4. package/dist/asset.d.ts.map +1 -1
  5. package/dist/asset.js +4 -1
  6. package/dist/asset.js.map +1 -1
  7. package/dist/clipboard.d.ts.map +1 -1
  8. package/dist/clipboard.js +39 -5
  9. package/dist/clipboard.js.map +1 -1
  10. package/dist/code-block.d.ts.map +1 -1
  11. package/dist/code-block.js +3 -1
  12. package/dist/code-block.js.map +1 -1
  13. package/dist/collapsible.d.ts +4 -0
  14. package/dist/collapsible.d.ts.map +1 -1
  15. package/dist/collapsible.js +4 -4
  16. package/dist/collapsible.js.map +1 -1
  17. package/dist/command-palette.d.ts.map +1 -1
  18. package/dist/command-palette.js +3 -1
  19. package/dist/command-palette.js.map +1 -1
  20. package/dist/content-transition.d.ts +7 -3
  21. package/dist/content-transition.d.ts.map +1 -1
  22. package/dist/content-transition.js +47 -3
  23. package/dist/content-transition.js.map +1 -1
  24. package/dist/context-menu.d.ts.map +1 -1
  25. package/dist/context-menu.js +3 -1
  26. package/dist/context-menu.js.map +1 -1
  27. package/dist/date-entry.d.ts +9 -0
  28. package/dist/date-entry.d.ts.map +1 -0
  29. package/dist/date-entry.js +13 -0
  30. package/dist/date-entry.js.map +1 -0
  31. package/dist/design-profile.d.ts +18 -0
  32. package/dist/design-profile.d.ts.map +1 -0
  33. package/dist/design-profile.js +27 -0
  34. package/dist/design-profile.js.map +1 -0
  35. package/dist/document-resource.d.ts +3 -0
  36. package/dist/document-resource.d.ts.map +1 -0
  37. package/dist/document-resource.js +2 -0
  38. package/dist/document-resource.js.map +1 -0
  39. package/dist/effect-surface.d.ts.map +1 -1
  40. package/dist/effect-surface.js +2 -2
  41. package/dist/effect-surface.js.map +1 -1
  42. package/dist/evidence.d.ts +1 -1
  43. package/dist/evidence.js +1 -1
  44. package/dist/evidence.js.map +1 -1
  45. package/dist/field-group.d.ts +22 -0
  46. package/dist/field-group.d.ts.map +1 -0
  47. package/dist/field-group.js +20 -0
  48. package/dist/field-group.js.map +1 -0
  49. package/dist/floating-action-button.d.ts +1 -1
  50. package/dist/forms.d.ts +1 -0
  51. package/dist/forms.d.ts.map +1 -1
  52. package/dist/forms.js +5 -3
  53. package/dist/forms.js.map +1 -1
  54. package/dist/heading.d.ts.map +1 -1
  55. package/dist/heading.js +3 -1
  56. package/dist/heading.js.map +1 -1
  57. package/dist/image-comparison.d.ts +12 -0
  58. package/dist/image-comparison.d.ts.map +1 -0
  59. package/dist/image-comparison.js +14 -0
  60. package/dist/image-comparison.js.map +1 -0
  61. package/dist/internal/document-resource.d.ts +9 -0
  62. package/dist/internal/document-resource.d.ts.map +1 -0
  63. package/dist/internal/document-resource.js +37 -0
  64. package/dist/internal/document-resource.js.map +1 -0
  65. package/dist/internal/overlay-origin-motion.d.ts +13 -0
  66. package/dist/internal/overlay-origin-motion.d.ts.map +1 -0
  67. package/dist/internal/overlay-origin-motion.js +76 -0
  68. package/dist/internal/overlay-origin-motion.js.map +1 -0
  69. package/dist/internal.d.ts +54 -0
  70. package/dist/internal.d.ts.map +1 -1
  71. package/dist/internal.js +7 -1
  72. package/dist/internal.js.map +1 -1
  73. package/dist/layout.d.ts.map +1 -1
  74. package/dist/layout.js +6 -3
  75. package/dist/layout.js.map +1 -1
  76. package/dist/menubar.d.ts.map +1 -1
  77. package/dist/menubar.js +3 -1
  78. package/dist/menubar.js.map +1 -1
  79. package/dist/navigation.d.ts.map +1 -1
  80. package/dist/navigation.js +30 -9
  81. package/dist/navigation.js.map +1 -1
  82. package/dist/overlays.d.ts +3 -0
  83. package/dist/overlays.d.ts.map +1 -1
  84. package/dist/overlays.js +16 -12
  85. package/dist/overlays.js.map +1 -1
  86. package/dist/popover.d.ts +3 -0
  87. package/dist/popover.d.ts.map +1 -1
  88. package/dist/popover.js +11 -5
  89. package/dist/popover.js.map +1 -1
  90. package/dist/portal.d.ts +3 -1
  91. package/dist/portal.d.ts.map +1 -1
  92. package/dist/portal.js +5 -2
  93. package/dist/portal.js.map +1 -1
  94. package/dist/progressive-blur.d.ts +7 -0
  95. package/dist/progressive-blur.d.ts.map +1 -0
  96. package/dist/progressive-blur.js +20 -0
  97. package/dist/progressive-blur.js.map +1 -0
  98. package/dist/provider.d.ts +4 -0
  99. package/dist/provider.d.ts.map +1 -1
  100. package/dist/provider.js +5 -2
  101. package/dist/provider.js.map +1 -1
  102. package/dist/rating.d.ts +19 -0
  103. package/dist/rating.d.ts.map +1 -0
  104. package/dist/rating.js +34 -0
  105. package/dist/rating.js.map +1 -0
  106. package/dist/screens.d.ts +7 -2
  107. package/dist/screens.d.ts.map +1 -1
  108. package/dist/screens.js +20 -7
  109. package/dist/screens.js.map +1 -1
  110. package/dist/selection.d.ts +4 -0
  111. package/dist/selection.d.ts.map +1 -1
  112. package/dist/selection.js +48 -3
  113. package/dist/selection.js.map +1 -1
  114. package/dist/styles.css +69 -9
  115. package/dist/styles.layered.css +69 -9
  116. package/dist/task-list.d.ts +6 -1
  117. package/dist/task-list.d.ts.map +1 -1
  118. package/dist/task-list.js +8 -3
  119. package/dist/task-list.js.map +1 -1
  120. package/dist/text-annotation.d.ts +10 -0
  121. package/dist/text-annotation.d.ts.map +1 -0
  122. package/dist/text-annotation.js +107 -0
  123. package/dist/text-annotation.js.map +1 -0
  124. package/dist/theme.d.ts.map +1 -1
  125. package/dist/theme.js +28 -7
  126. package/dist/theme.js.map +1 -1
  127. package/package.json +38 -3
@@ -1 +1 @@
1
- {"version":3,"file":"popover.js","sourceRoot":"","sources":["../src/popover.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cloneElement, createContext, forwardRef, useCallback, useContext, useEffect, useId, useRef, useState, useSyncExternalStore, type CSSProperties, type ReactNode, type RefObject } from \"react\";\nimport { canDismissPopover, popoverBehaviorDefaults, popoverHoverDelay, popoverRecipe, resolvePopoverDescriptor, validatePopoverOpenState, type PopoverDescriptor, type PopoverDismissPolicy, type PopoverDismissReason, type PopoverOpenChangeDetails, type PopoverOpenOn, type PopoverOpenState } from \"@hjmds/design-contracts/components/popover\";\nimport { easing, layer } from \"@hjmds/design-contracts/foundations\";\nimport { Button } from \"./actions.js\";\nimport { classNames, composeRefs } from \"./internal.js\";\nimport { AnchoredPortal, getPopoverOwner, useAnchoredPopup } from \"./portal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport type { OverlayTrigger } from \"./overlays.js\";\n\nexport type PopoverContentActions = Readonly<{ close(): void }>;\n// No `layoutStyle`: renders the caller's trigger plus an anchored portal; place the trigger instead.\nexport type PopoverProps = PopoverOpenState & Readonly<{\n trigger: OverlayTrigger;\n title: string;\n closeLabel: string;\n description?: string;\n descriptor?: PopoverDescriptor;\n children?: ReactNode | ((actions: PopoverContentActions) => ReactNode);\n dismissPolicy?: Partial<PopoverDismissPolicy>;\n /**\n * `\"hover\"` adds pointer enter/leave on top of the click path; it never\n * replaces it, because hover does not exist on touch or for a keyboard.\n */\n openOn?: PopoverOpenOn;\n initialFocusRef?: RefObject<HTMLElement | null>;\n portalContainer?: HTMLElement;\n className?: string;\n}>;\nconst ParentPopoverOpen = createContext(true);\nconst motionQuery = \"(prefers-reduced-motion: reduce)\";\nfunction subscribeSystemMotion(notify: () => void) {\n const media = window.matchMedia(motionQuery); media.addEventListener(\"change\", notify);\n return () => media.removeEventListener(\"change\", notify);\n}\nconst readSystemMotion = () => window.matchMedia(motionQuery).matches;\nconst readServerMotion = () => false;\nconst focusable = 'a[href],button,input,select,textarea,[tabindex]';\nfunction tabStops(container: HTMLElement): HTMLElement[] {\n return [...container.querySelectorAll<HTMLElement>(focusable)].filter((node) =>\n node.tabIndex >= 0 && !node.matches(\":disabled\") && !node.closest('[inert],[hidden],[aria-hidden=\"true\"]') && node.getClientRects().length > 0 && getComputedStyle(node).visibility !== \"hidden\",\n ).sort((a, b) => (a.tabIndex > 0 ? a.tabIndex : Infinity) - (b.tabIndex > 0 ? b.tabIndex : Infinity));\n}\nfunction contains(content: HTMLElement, target: Node): boolean {\n if (content.contains(target)) return true;\n const visited = new Set<HTMLElement>(); let owner = getPopoverOwner(target);\n while (owner && !visited.has(owner)) {\n if (owner === content) return true;\n visited.add(owner); owner = getPopoverOwner(owner.parentElement);\n }\n return false;\n}\n\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(function Popover({ trigger, title, closeLabel,\n description, descriptor = {}, children, dismissPolicy, openOn = popoverBehaviorDefaults.openOn, initialFocusRef, portalContainer, className,\n open: controlledOpen, defaultOpen, onOpenChange }, ref) {\n if (!title.trim() || !closeLabel.trim()) throw new TypeError(\"Popover title and closeLabel must not be empty\");\n const resolved = resolvePopoverDescriptor(descriptor);\n validatePopoverOpenState({ ...(controlledOpen === undefined ? {} : { open: controlledOpen }), ...(defaultOpen === undefined ? {} : { defaultOpen }), ...(onOpenChange ? { onOpenChange } : {}) } as PopoverOpenState);\n const policy = { ...popoverBehaviorDefaults, ...dismissPolicy };\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const parentOpen = useContext(ParentPopoverOpen);\n const open = parentOpen && (controlledOpen ?? internalOpen);\n const previousParentOpen = useRef(parentOpen);\n useEffect(() => {\n if (!parentOpen && previousParentOpen.current && (controlledOpen ?? internalOpen)) {\n // A closed parent ends the child's session; reopening it must not resurrect\n // a stale uncontrolled submenu or leave a controlled owner uninformed.\n if (controlledOpen === undefined) setInternalOpen(false);\n onOpenChange?.(false, { reason: \"programmatic\" });\n }\n previousParentOpen.current = parentOpen;\n }, [parentOpen, controlledOpen, internalOpen, onOpenChange]);\n const theme = useOptionalHjmTheme();\n const systemReduced = useSyncExternalStore(subscribeSystemMotion, readSystemMotion, readServerMotion);\n const reduced = theme?.environment.reducedMotion ?? systemReduced;\n const [present, setPresent] = useState(open);\n const [node, setNode] = useState<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const closeReason = useRef<PopoverDismissReason | undefined>(undefined);\n const focusWasInside = useRef(false);\n const didFocus = useRef(false);\n const requestPending = useRef(false);\n const id = `${useId().replaceAll(\":\", \"\")}-popover`;\n const state = useRef({ open, policy, onOpenChange, controlledOpen }); state.current = { open, policy, onOpenChange, controlledOpen };\n const change = useCallback((next: boolean, reason: PopoverOpenChangeDetails[\"reason\"]) => {\n const current = state.current;\n if (next === current.open || requestPending.current) return;\n if (!next && !canDismissPopover(reason as PopoverDismissReason, current.policy)) return;\n requestPending.current = true;\n // Deduplicate one interaction, but let a controlled owner reject it and receive a later attempt.\n queueMicrotask(() => { requestPending.current = false; });\n closeReason.current = next ? undefined : reason as PopoverDismissReason;\n if (current.controlledOpen === undefined) setInternalOpen(next);\n current.onOpenChange?.(next, { reason });\n }, []);\n useEffect(() => {\n if (open) { setPresent(true); return; }\n if (!present) return;\n // Keep only the exit surface briefly; inert/aria-hidden exclude it immediately.\n // A parent context closes nested popovers in the same render, including their portals.\n if (reduced) { setPresent(false); return; }\n const timeout = setTimeout(() => setPresent(false), popoverRecipe.transition.exit.duration);\n return () => clearTimeout(timeout);\n }, [open, present, reduced]);\n const position = useAnchoredPopup(triggerRef, open || present ? node : null, {\n placement: resolved.placement, align: resolved.align, gap: popoverRecipe.sideOffset,\n // Contextual forms share the dropdown tier with menus (DOM order puts a popover opened\n // from a menu above it) and stay below tooltips; a modal owner supplies its own layer\n // through the shared positioning helper.\n viewportPadding: popoverRecipe.collisionPadding, zIndex: layer.dropdown, fallbackAxis: true,\n });\n const setContent = useCallback((value: HTMLDivElement | null) => { setNode(value); }, []);\n const contentRef = useCallback(composeRefs(setContent, ref), [setContent, ref]);\n useEffect(() => {\n if (!open) {\n if (didFocus.current) {\n didFocus.current = false;\n const reason = closeReason.current;\n if ((reason === undefined || reason === \"programmatic\" || reason === \"escape\" || reason === \"close-action\") && focusWasInside.current) {\n queueMicrotask(() => {\n const active = document.activeElement;\n if (active === document.body || (node && active instanceof Node && contains(node, active))) triggerRef.current?.focus({ preventScroll: true });\n });\n }\n }\n closeReason.current = undefined; return;\n }\n if (!node || position.style.visibility !== \"visible\" || didFocus.current) return;\n didFocus.current = true;\n const initial = initialFocusRef?.current;\n const target = initial && contains(node, initial) ? initial : tabStops(node.querySelector<HTMLElement>(\"[data-hjm-popover-body]\")!)[0] ?? node;\n target.focus({ preventScroll: true }); focusWasInside.current = true;\n }, [open, node, position.style.visibility, initialFocusRef]);\n useEffect(() => {\n if (!open || !node) return;\n let pointerOutside = false;\n const inside = (target: EventTarget | null): target is Node => target instanceof Node && (contains(node, target) || triggerRef.current?.contains(target) === true);\n const pointer = (event: PointerEvent) => {\n pointerOutside = !inside(event.target);\n if (pointerOutside) change(false, \"outside-pointer\");\n };\n const pointerEnd = () => { pointerOutside = false; };\n const focus = (event: FocusEvent) => {\n focusWasInside.current = event.target instanceof Node && contains(node, event.target);\n if (!inside(event.target) && !pointerOutside) change(false, \"outside-focus\");\n };\n const keyboard = (event: KeyboardEvent) => {\n if (event.defaultPrevented || !inside(event.target)) return;\n const owner = getPopoverOwner(event.target instanceof Node ? event.target : null);\n if (owner && owner !== node) return;\n if (event.key === \"Escape\") { event.preventDefault(); event.stopPropagation(); change(false, \"escape\"); }\n if (event.key !== \"Tab\" || !(event.target instanceof Node) || !contains(node, event.target)) return;\n const stops = tabStops(node); const first = stops[0]; const last = stops.at(-1);\n if (event.shiftKey && (document.activeElement === first || document.activeElement === node)) {\n event.preventDefault(); triggerRef.current?.focus(); change(false, \"outside-focus\");\n } else if (!event.shiftKey && (document.activeElement === last || stops.length === 0)) {\n const all = tabStops(document.body).filter((item) => !contains(node, item));\n const index = all.indexOf(triggerRef.current!); const next = index >= 0 ? all[index + 1] : undefined;\n // Portals sit at the end of body; continue after the trigger's logical position.\n if (next) { event.preventDefault(); next.focus(); change(false, \"outside-focus\"); }\n }\n };\n document.addEventListener(\"pointerdown\", pointer); document.addEventListener(\"pointerup\", pointerEnd); document.addEventListener(\"pointercancel\", pointerEnd);\n document.addEventListener(\"focusin\", focus); document.addEventListener(\"keydown\", keyboard);\n return () => { document.removeEventListener(\"pointerdown\", pointer); document.removeEventListener(\"pointerup\", pointerEnd); document.removeEventListener(\"pointercancel\", pointerEnd); document.removeEventListener(\"focusin\", focus); document.removeEventListener(\"keydown\", keyboard); };\n }, [open, node, change]);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const cancelHover = useCallback(() => { if (hoverTimer.current !== undefined) { clearTimeout(hoverTimer.current); hoverTimer.current = undefined; } }, []);\n useEffect(() => cancelHover, [cancelHover]);\n const scheduleHover = useCallback((next: boolean) => {\n cancelHover();\n // Delays on both edges: opening instantly turns a pass-through into a flash,\n // and closing instantly makes the gap between trigger and panel untraversable.\n hoverTimer.current = setTimeout(\n () => change(next, next ? \"trigger\" : \"outside-pointer\"),\n next ? popoverHoverDelay.open : popoverHoverDelay.close,\n );\n }, [cancelHover, change]);\n const hoverHandlers = openOn === \"hover\"\n ? {\n onPointerEnter: (event: { pointerType?: string }) => { if (event.pointerType !== \"touch\") scheduleHover(true); },\n onPointerLeave: (event: { pointerType?: string }) => { if (event.pointerType !== \"touch\") scheduleHover(false); },\n }\n : {};\n const triggerProps = trigger.props;\n const renderedTrigger = cloneElement(trigger, {\n ref: composeRefs(triggerProps.ref, triggerRef), \"aria-haspopup\": \"dialog\", \"aria-expanded\": open, \"aria-controls\": id,\n ...hoverHandlers,\n onClick: (event) => {\n triggerProps.onClick?.(event);\n if (event.defaultPrevented || triggerProps.disabled || triggerProps[\"aria-disabled\"] === true || triggerProps[\"aria-disabled\"] === \"true\") return;\n change(!open, open ? \"close-action\" : \"trigger\");\n },\n });\n const style = { ...position.style, \"--hjm-popover-max-width\": `${popoverRecipe.maxWidth}px`,\n \"--hjm-popover-duration\": `${open ? popoverRecipe.transition.enter.duration : reduced ? 0 : popoverRecipe.transition.exit.duration}ms`,\n \"--hjm-popover-easing\": `cubic-bezier(${easing[open ? popoverRecipe.transition.enter.easing : popoverRecipe.transition.exit.easing].join(\", \")})`,\n minWidth: Math.min(popoverRecipe.minWidth, Number(position.style.maxWidth ?? popoverRecipe.minWidth)),\n boxShadow: `0 ${popoverRecipe.surface.shadow.offsetY}px ${popoverRecipe.surface.shadow.radius}px ${popoverRecipe.surface.shadow.color}${Math.round(popoverRecipe.surface.shadow.opacity * 255).toString(16).padStart(2, \"0\")}`,\n\n } as CSSProperties;\n return <>{renderedTrigger}{open || present ? <AnchoredPortal anchorRef={triggerRef} ssrFallback=\"inline\" {...(portalContainer ? { container: portalContainer } : {})}>\n <ParentPopoverOpen.Provider value={open}><div ref={contentRef} id={id} role=\"dialog\" tabIndex={-1} data-hjm-popover-content=\"\" data-state={open ? \"open\" : \"closed\"}\n aria-hidden={!open || undefined} inert={!open || undefined} aria-label={resolved.accessibilityLabel} aria-labelledby={resolved.accessibilityLabel ? undefined : `${id}-title`} aria-describedby={description ? `${id}-description` : undefined}\n className={classNames(\"hjm-popover\", className)} style={style} data-placement={position.placement} data-align={position.align} {...hoverHandlers}\n onAnimationEnd={(event) => { if (!open && event.target === event.currentTarget) setPresent(false); }}>\n <div className=\"hjm-popover__header\"><h2 id={`${id}-title`} className=\"hjm-popover__title\">{title}</h2><Button tone=\"ghost\" onClick={() => change(false, \"close-action\")}>{closeLabel}</Button></div>\n {description ? <p id={`${id}-description`} className=\"hjm-popover__description\">{description}</p> : null}\n <div data-hjm-popover-body=\"\" className=\"hjm-popover__body\">{typeof children === \"function\" ? children({ close: () => change(false, \"close-action\") }) : children}</div>\n </div></ParentPopoverOpen.Provider>\n </AnchoredPortal> : null}</>;\n});\n"]}
1
+ {"version":3,"file":"popover.js","sourceRoot":"","sources":["../src/popover.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cloneElement, createContext, forwardRef, useCallback, useContext, useEffect, useId, useRef, useState, useSyncExternalStore, type CSSProperties, type ReactNode, type RefObject } from \"react\";\nimport { canDismissPopover, popoverBehaviorDefaults, popoverHoverDelay, popoverRecipe, resolvePopoverDescriptor, validatePopoverOpenState, type PopoverDescriptor, type PopoverDismissPolicy, type PopoverDismissReason, type PopoverOpenChangeDetails, type PopoverOpenOn, type PopoverOpenState } from \"@hjmds/design-contracts/components/popover\";\nimport { easing, layer } from \"@hjmds/design-contracts/foundations\";\nimport type { TransitionRect } from \"@hjmds/design-contracts/content-transition\";\nimport { useOverlayOriginMotion } from \"./internal/overlay-origin-motion.js\";\nimport { Button } from \"./actions.js\";\nimport { classNames, composeRefs } from \"./internal.js\";\nimport { AnchoredPortal, getPopoverOwner, useAnchoredPopup } from \"./portal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport type { OverlayTrigger } from \"./overlays.js\";\n\nexport type PopoverContentActions = Readonly<{ close(): void }>;\n// No `layoutStyle`: renders the caller's trigger plus an anchored portal; place the trigger instead.\nexport type PopoverProps = PopoverOpenState & Readonly<{\n trigger: OverlayTrigger;\n title: string;\n closeLabel: string;\n description?: string;\n descriptor?: PopoverDescriptor;\n children?: ReactNode | ((actions: PopoverContentActions) => ReactNode);\n dismissPolicy?: Partial<PopoverDismissPolicy>;\n /**\n * `\"hover\"` adds pointer enter/leave on top of the click path; it never\n * replaces it, because hover does not exist on touch or for a keyboard.\n */\n openOn?: PopoverOpenOn;\n /** Optional trigger bounds in viewport coordinates; state and focus remain non-modal. */\n motionOrigin?: TransitionRect;\n initialFocusRef?: RefObject<HTMLElement | null>;\n portalContainer?: HTMLElement;\n className?: string;\n}>;\nconst ParentPopoverOpen = createContext(true);\nconst motionQuery = \"(prefers-reduced-motion: reduce)\";\nfunction subscribeSystemMotion(notify: () => void) {\n const media = window.matchMedia(motionQuery); media.addEventListener(\"change\", notify);\n return () => media.removeEventListener(\"change\", notify);\n}\nconst readSystemMotion = () => window.matchMedia(motionQuery).matches;\nconst readServerMotion = () => false;\nconst focusable = 'a[href],button,input,select,textarea,[tabindex]';\nfunction tabStops(container: HTMLElement): HTMLElement[] {\n return [...container.querySelectorAll<HTMLElement>(focusable)].filter((node) =>\n node.tabIndex >= 0 && !node.matches(\":disabled\") && !node.closest('[inert],[hidden],[aria-hidden=\"true\"]') && node.getClientRects().length > 0 && getComputedStyle(node).visibility !== \"hidden\",\n ).sort((a, b) => (a.tabIndex > 0 ? a.tabIndex : Infinity) - (b.tabIndex > 0 ? b.tabIndex : Infinity));\n}\nfunction contains(content: HTMLElement, target: Node): boolean {\n if (content.contains(target)) return true;\n const visited = new Set<HTMLElement>(); let owner = getPopoverOwner(target);\n while (owner && !visited.has(owner)) {\n if (owner === content) return true;\n visited.add(owner); owner = getPopoverOwner(owner.parentElement);\n }\n return false;\n}\n\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(function Popover({ trigger, title, closeLabel,\n description, descriptor = {}, children, dismissPolicy, openOn = popoverBehaviorDefaults.openOn, initialFocusRef, portalContainer, className, motionOrigin,\n open: controlledOpen, defaultOpen, onOpenChange }, ref) {\n if (!title.trim() || !closeLabel.trim()) throw new TypeError(\"Popover title and closeLabel must not be empty\");\n const resolved = resolvePopoverDescriptor(descriptor);\n validatePopoverOpenState({ ...(controlledOpen === undefined ? {} : { open: controlledOpen }), ...(defaultOpen === undefined ? {} : { defaultOpen }), ...(onOpenChange ? { onOpenChange } : {}) } as PopoverOpenState);\n const policy = { ...popoverBehaviorDefaults, ...dismissPolicy };\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const parentOpen = useContext(ParentPopoverOpen);\n const open = parentOpen && (controlledOpen ?? internalOpen);\n const previousParentOpen = useRef(parentOpen);\n useEffect(() => {\n if (!parentOpen && previousParentOpen.current && (controlledOpen ?? internalOpen)) {\n // A closed parent ends the child's session; reopening it must not resurrect\n // a stale uncontrolled submenu or leave a controlled owner uninformed.\n if (controlledOpen === undefined) setInternalOpen(false);\n onOpenChange?.(false, { reason: \"programmatic\" });\n }\n previousParentOpen.current = parentOpen;\n }, [parentOpen, controlledOpen, internalOpen, onOpenChange]);\n const theme = useOptionalHjmTheme();\n const systemReduced = useSyncExternalStore(subscribeSystemMotion, readSystemMotion, readServerMotion);\n const reduced = theme?.environment.reducedMotion ?? systemReduced;\n const [present, setPresent] = useState(open);\n const [node, setNode] = useState<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const closeReason = useRef<PopoverDismissReason | undefined>(undefined);\n const focusWasInside = useRef(false);\n const didFocus = useRef(false);\n const requestPending = useRef(false);\n const id = `${useId().replaceAll(\":\", \"\")}-popover`;\n const state = useRef({ open, policy, onOpenChange, controlledOpen }); state.current = { open, policy, onOpenChange, controlledOpen };\n const change = useCallback((next: boolean, reason: PopoverOpenChangeDetails[\"reason\"]) => {\n const current = state.current;\n if (next === current.open || requestPending.current) return;\n if (!next && !canDismissPopover(reason as PopoverDismissReason, current.policy)) return;\n requestPending.current = true;\n // Deduplicate one interaction, but let a controlled owner reject it and receive a later attempt.\n queueMicrotask(() => { requestPending.current = false; });\n closeReason.current = next ? undefined : reason as PopoverDismissReason;\n if (current.controlledOpen === undefined) setInternalOpen(next);\n current.onOpenChange?.(next, { reason });\n }, []);\n useEffect(() => {\n if (open) { setPresent(true); return; }\n if (!present) return;\n // Keep only the exit surface briefly; inert/aria-hidden exclude it immediately.\n // A parent context closes nested popovers in the same render, including their portals.\n if (reduced) { setPresent(false); return; }\n const timeout = setTimeout(() => setPresent(false), popoverRecipe.transition.exit.duration);\n return () => clearTimeout(timeout);\n }, [open, present, reduced]);\n const position = useAnchoredPopup(triggerRef, open || present ? node : null, {\n placement: resolved.placement, align: resolved.align, gap: popoverRecipe.sideOffset,\n // Contextual forms share the dropdown tier with menus (DOM order puts a popover opened\n // from a menu above it) and stay below tooltips; a modal owner supplies its own layer\n // through the shared positioning helper.\n viewportPadding: popoverRecipe.collisionPadding, zIndex: layer.dropdown, fallbackAxis: true, layoutDimensions: motionOrigin !== undefined,\n });\n const motion = useOverlayOriginMotion(open, motionOrigin, reduced, {\n ready: position.style.visibility === \"visible\", transition: popoverRecipe.transition,\n });\n const setContent = useCallback((value: HTMLDivElement | null) => { setNode(value); }, []);\n const contentRef = useCallback(composeRefs(setContent, ref, motion.setNode), [setContent, ref, motion.setNode]);\n useEffect(() => {\n if (!open) {\n if (didFocus.current) {\n didFocus.current = false;\n const reason = closeReason.current;\n if ((reason === undefined || reason === \"programmatic\" || reason === \"escape\" || reason === \"close-action\") && focusWasInside.current) {\n queueMicrotask(() => {\n const active = document.activeElement;\n if (active === document.body || (node && active instanceof Node && contains(node, active))) triggerRef.current?.focus({ preventScroll: true });\n });\n }\n }\n closeReason.current = undefined; return;\n }\n if (!node || position.style.visibility !== \"visible\" || didFocus.current) return;\n didFocus.current = true;\n const initial = initialFocusRef?.current;\n const target = initial && contains(node, initial) ? initial : tabStops(node.querySelector<HTMLElement>(\"[data-hjm-popover-body]\")!)[0] ?? node;\n target.focus({ preventScroll: true }); focusWasInside.current = true;\n }, [open, node, position.style.visibility, initialFocusRef]);\n useEffect(() => {\n if (!open || !node) return;\n let pointerOutside = false;\n const inside = (target: EventTarget | null): target is Node => target instanceof Node && (contains(node, target) || triggerRef.current?.contains(target) === true);\n const pointer = (event: PointerEvent) => {\n pointerOutside = !inside(event.target);\n if (pointerOutside) change(false, \"outside-pointer\");\n };\n const pointerEnd = () => { pointerOutside = false; };\n const focus = (event: FocusEvent) => {\n focusWasInside.current = event.target instanceof Node && contains(node, event.target);\n if (!inside(event.target) && !pointerOutside) change(false, \"outside-focus\");\n };\n const keyboard = (event: KeyboardEvent) => {\n if (event.defaultPrevented || !inside(event.target)) return;\n const owner = getPopoverOwner(event.target instanceof Node ? event.target : null);\n if (owner && owner !== node) return;\n if (event.key === \"Escape\") { event.preventDefault(); event.stopPropagation(); change(false, \"escape\"); }\n if (event.key !== \"Tab\" || !(event.target instanceof Node) || !contains(node, event.target)) return;\n const stops = tabStops(node); const first = stops[0]; const last = stops.at(-1);\n if (event.shiftKey && (document.activeElement === first || document.activeElement === node)) {\n event.preventDefault(); triggerRef.current?.focus(); change(false, \"outside-focus\");\n } else if (!event.shiftKey && (document.activeElement === last || stops.length === 0)) {\n const all = tabStops(document.body).filter((item) => !contains(node, item));\n const index = all.indexOf(triggerRef.current!); const next = index >= 0 ? all[index + 1] : undefined;\n // Portals sit at the end of body; continue after the trigger's logical position.\n if (next) { event.preventDefault(); next.focus(); change(false, \"outside-focus\"); }\n }\n };\n document.addEventListener(\"pointerdown\", pointer); document.addEventListener(\"pointerup\", pointerEnd); document.addEventListener(\"pointercancel\", pointerEnd);\n document.addEventListener(\"focusin\", focus); document.addEventListener(\"keydown\", keyboard);\n return () => { document.removeEventListener(\"pointerdown\", pointer); document.removeEventListener(\"pointerup\", pointerEnd); document.removeEventListener(\"pointercancel\", pointerEnd); document.removeEventListener(\"focusin\", focus); document.removeEventListener(\"keydown\", keyboard); };\n }, [open, node, change]);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const cancelHover = useCallback(() => { if (hoverTimer.current !== undefined) { clearTimeout(hoverTimer.current); hoverTimer.current = undefined; } }, []);\n useEffect(() => cancelHover, [cancelHover]);\n const scheduleHover = useCallback((next: boolean) => {\n cancelHover();\n // Delays on both edges: opening instantly turns a pass-through into a flash,\n // and closing instantly makes the gap between trigger and panel untraversable.\n hoverTimer.current = setTimeout(\n () => change(next, next ? \"trigger\" : \"outside-pointer\"),\n next ? popoverHoverDelay.open : popoverHoverDelay.close,\n );\n }, [cancelHover, change]);\n const hoverHandlers = openOn === \"hover\"\n ? {\n onPointerEnter: (event: { pointerType?: string }) => { if (event.pointerType !== \"touch\") scheduleHover(true); },\n onPointerLeave: (event: { pointerType?: string }) => { if (event.pointerType !== \"touch\") scheduleHover(false); },\n }\n : {};\n const triggerProps = trigger.props;\n const renderedTrigger = cloneElement(trigger, {\n ref: composeRefs(triggerProps.ref, triggerRef), \"aria-haspopup\": \"dialog\", \"aria-expanded\": open, \"aria-controls\": id,\n ...hoverHandlers,\n onClick: (event) => {\n triggerProps.onClick?.(event);\n if (event.defaultPrevented || triggerProps.disabled || triggerProps[\"aria-disabled\"] === true || triggerProps[\"aria-disabled\"] === \"true\") return;\n change(!open, open ? \"close-action\" : \"trigger\");\n },\n });\n const style = { ...position.style, \"--hjm-popover-max-width\": `${popoverRecipe.maxWidth}px`,\n \"--hjm-popover-duration\": `${open ? popoverRecipe.transition.enter.duration : reduced ? 0 : popoverRecipe.transition.exit.duration}ms`,\n \"--hjm-popover-easing\": `cubic-bezier(${easing[open ? popoverRecipe.transition.enter.easing : popoverRecipe.transition.exit.easing].join(\", \")})`,\n minWidth: Math.min(popoverRecipe.minWidth, Number(position.style.maxWidth ?? popoverRecipe.minWidth)),\n // Keep the legacy recipe without a profile; portal context variables follow\n // the nearest provider so an open editor cannot retain neutral elevation.\n boxShadow: theme?.designProfile ? \"var(--hjm-shadow-floating)\" : `0 ${popoverRecipe.surface.shadow.offsetY}px ${popoverRecipe.surface.shadow.radius}px ${popoverRecipe.surface.shadow.color}${Math.round(popoverRecipe.surface.shadow.opacity * 255).toString(16).padStart(2, \"0\")}`,\n\n } as CSSProperties;\n return <>{renderedTrigger}{open || present || motion.visible ? <AnchoredPortal anchorRef={triggerRef} ssrFallback=\"inline\" {...(portalContainer ? { container: portalContainer } : {})}>\n <ParentPopoverOpen.Provider value={open}><div ref={contentRef} id={id} role=\"dialog\" tabIndex={-1} data-hjm-popover-content=\"\" data-state={open ? \"open\" : \"closed\"}\n aria-hidden={!open || undefined} inert={!open || undefined} aria-label={resolved.accessibilityLabel} aria-labelledby={resolved.accessibilityLabel ? undefined : `${id}-title`} aria-describedby={description ? `${id}-description` : undefined}\n className={classNames(\"hjm-popover\", className)} style={style} data-placement={position.placement} data-align={position.align} {...hoverHandlers}\n onAnimationEnd={(event) => { if (!open && event.target === event.currentTarget) setPresent(false); }}>\n <div className=\"hjm-popover__header\"><h2 id={`${id}-title`} className=\"hjm-popover__title\">{title}</h2><Button tone=\"ghost\" onClick={() => change(false, \"close-action\")}>{closeLabel}</Button></div>\n {description ? <p id={`${id}-description`} className=\"hjm-popover__description\">{description}</p> : null}\n <div data-hjm-popover-body=\"\" className=\"hjm-popover__body\">{typeof children === \"function\" ? children({ close: () => change(false, \"close-action\") }) : children}</div>\n </div></ParentPopoverOpen.Provider>\n </AnchoredPortal> : null}</>;\n});\n"]}
package/dist/portal.d.ts CHANGED
@@ -25,12 +25,14 @@ type AnchoredPopupOptions = Readonly<{
25
25
  zIndex?: number;
26
26
  /** Wide contextual content may switch to the block axis in a narrow viewport. */
27
27
  fallbackAxis?: boolean;
28
+ /** Ignore presentation transforms when sizing an animated surface. */
29
+ layoutDimensions?: boolean;
28
30
  }>;
29
31
  /**
30
32
  * Positions a fixed portal popup against its anchor using logical alignment.
31
33
  * The popup flips vertically and shifts horizontally to stay inside the visual
32
34
  * viewport, then follows every scroll/resize source that can move either node.
33
35
  */
34
- export declare function useAnchoredPopup(anchorRef: RefObject<HTMLElement | null>, popup: HTMLElement | null, { align, fallbackAxis, gap, matchAnchorWidth, placement: preferredPlacement, viewportPadding, zIndex, }?: AnchoredPopupOptions): AnchoredPopupPosition;
36
+ export declare function useAnchoredPopup(anchorRef: RefObject<HTMLElement | null>, popup: HTMLElement | null, { align, fallbackAxis, layoutDimensions, gap, matchAnchorWidth, placement: preferredPlacement, viewportPadding, zIndex, }?: AnchoredPopupOptions): AnchoredPopupPosition;
35
37
  export {};
36
38
  //# sourceMappingURL=portal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../src/portal.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACjC,CAAC,CAAC;AAEH,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAMrE;AAyDD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAoB,GACrB,EAAE,WAAW,aA8Bb;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC5D,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAExE,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC,CAAC;AAEH,KAAK,oBAAoB,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC,CAAC;AA6BH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,KAAK,EAAE,WAAW,GAAG,IAAI,EACzB,EACE,KAAe,EACf,YAAoB,EACpB,GAAO,EACP,gBAAwB,EACxB,SAAS,EAAE,kBAA6B,EACxC,eAAoB,EACpB,MAAuB,GACxB,GAAE,oBAAyB,GAC3B,qBAAqB,CA+LvB"}
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../src/portal.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACjC,CAAC,CAAC;AAEH,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAMrE;AAyDD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAoB,GACrB,EAAE,WAAW,aA8Bb;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC5D,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAExE,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC,CAAC;AAEH,KAAK,oBAAoB,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC,CAAC;AA6BH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,KAAK,EAAE,WAAW,GAAG,IAAI,EACzB,EACE,KAAe,EACf,YAAoB,EACpB,gBAAwB,EACxB,GAAO,EACP,gBAAwB,EACxB,SAAS,EAAE,kBAA6B,EACxC,eAAoB,EACpB,MAAuB,GACxB,GAAE,oBAAyB,GAC3B,qBAAqB,CAkMvB"}
package/dist/portal.js CHANGED
@@ -119,7 +119,7 @@ function samePosition(previous, next) {
119
119
  * The popup flips vertically and shifts horizontally to stay inside the visual
120
120
  * viewport, then follows every scroll/resize source that can move either node.
121
121
  */
122
- export function useAnchoredPopup(anchorRef, popup, { align = "start", fallbackAxis = false, gap = 8, matchAnchorWidth = false, placement: preferredPlacement = "bottom", viewportPadding = 16, zIndex = layer.dropdown, } = {}) {
122
+ export function useAnchoredPopup(anchorRef, popup, { align = "start", fallbackAxis = false, layoutDimensions = false, gap = 8, matchAnchorWidth = false, placement: preferredPlacement = "bottom", viewportPadding = 16, zIndex = layer.dropdown, } = {}) {
123
123
  const [position, setPosition] = useState(() => ({
124
124
  ...hiddenPopupPosition,
125
125
  align,
@@ -129,7 +129,9 @@ export function useAnchoredPopup(anchorRef, popup, { align = "start", fallbackAx
129
129
  if (!anchor || !popup || !anchor.isConnected || !popup.isConnected)
130
130
  return;
131
131
  const anchorRect = anchor.getBoundingClientRect();
132
- const popupRect = popup.getBoundingClientRect();
132
+ // Origin transitions may temporarily shrink/enlarge the surface. Collision
133
+ // placement needs its final layout size, otherwise resize/scroll makes it drift.
134
+ const popupRect = layoutDimensions ? { width: popup.offsetWidth, height: popup.offsetHeight } : popup.getBoundingClientRect();
133
135
  const visualViewport = window.visualViewport;
134
136
  const viewportLeft = visualViewport?.offsetLeft ?? 0;
135
137
  const viewportTop = visualViewport?.offsetTop ?? 0;
@@ -250,6 +252,7 @@ export function useAnchoredPopup(anchorRef, popup, { align = "start", fallbackAx
250
252
  align,
251
253
  anchorRef,
252
254
  fallbackAxis,
255
+ layoutDimensions,
253
256
  gap,
254
257
  matchAnchorWidth,
255
258
  popup,
@@ -1 +1 @@
1
- {"version":3,"file":"portal.js","sourceRoot":"","sources":["../src/portal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PortalProps = Readonly<{\n anchorRef: RefObject<HTMLElement | null>;\n children: ReactNode;\n container?: HTMLElement;\n /** Anchored non-modal popups may render inline until hydration moves them. */\n ssrFallback?: \"none\" | \"inline\";\n}>;\n\n/** Nearest interactive popover, including descendants rendered through another portal. */\nexport function getPopoverOwner(node: Node | null): HTMLElement | null {\n const element = node instanceof Element ? node : node?.parentElement;\n const direct = element?.closest<HTMLElement>(\"[data-hjm-popover-content]\");\n if (direct) return direct;\n const ownerId = element?.closest<HTMLElement>(\"[data-hjm-popover-owner]\")?.getAttribute(\"data-hjm-popover-owner\");\n return ownerId ? document.getElementById(ownerId) : null;\n}\n\n/**\n * Copies the closest provider DOM boundary instead of importing provider\n * runtime code, keeping granular form/overlay entry points lightweight.\n */\nfunction synchronizePortalEnvironment(host: HTMLDivElement, anchor: HTMLElement | null): void {\n // Modal ownership and non-modal ownership are separate: nested selects/menus\n // must belong to both, so outside focus does not close their parent popover.\n const popoverOwner = getPopoverOwner(anchor);\n if (popoverOwner?.id) host.setAttribute(\"data-hjm-popover-owner\", popoverOwner.id);\n else host.removeAttribute(\"data-hjm-popover-owner\");\n const source = anchor?.closest<HTMLElement>(\"[data-hjm-provider], [data-hjm-portal]\") ?? null;\n const directModalOwner = anchor?.closest<HTMLElement>(\"[data-hjm-modal-content]\") ?? null;\n const inheritedOwnerId = anchor\n ?.closest<HTMLElement>(\"[data-hjm-popup-owner]\")\n ?.getAttribute(\"data-hjm-popup-owner\") ?? null;\n const modalOwner = directModalOwner ??\n (inheritedOwnerId === null ? null : document.getElementById(inheritedOwnerId));\n if (modalOwner?.id) host.setAttribute(\"data-hjm-popup-owner\", modalOwner.id);\n else host.removeAttribute(\"data-hjm-popup-owner\");\n if (source) {\n host.removeAttribute(\"style\");\n for (let index = 0; index < source.style.length; index += 1) {\n const property = source.style.item(index);\n if (\n property.startsWith(\"--hjm-\") ||\n property === \"background-color\" ||\n property === \"color\" ||\n property === \"color-scheme\" ||\n property === \"font-family\" ||\n property === \"font-size\" ||\n property === \"line-height\"\n ) {\n host.style.setProperty(\n property,\n source.style.getPropertyValue(property),\n source.style.getPropertyPriority(property),\n );\n }\n }\n for (const attribute of [\"data-motion\", \"data-theme\", \"data-text-scale\", \"data-large-text\"] as const) {\n const value = source.getAttribute(attribute);\n if (value === null) host.removeAttribute(attribute);\n else host.setAttribute(attribute, value);\n }\n host.dir = source.dir;\n return;\n }\n host.removeAttribute(\"style\");\n host.removeAttribute(\"data-motion\");\n host.removeAttribute(\"data-theme\");\n host.removeAttribute(\"data-text-scale\");\n host.removeAttribute(\"data-large-text\");\n host.dir = anchor?.closest<HTMLElement>(\"[dir]\")?.dir ?? \"\";\n}\n\nexport function AnchoredPortal({\n anchorRef,\n children,\n container,\n ssrFallback = \"none\",\n}: PortalProps) {\n const [mounted, setMounted] = useState(false);\n const hostRef = useRef<HTMLDivElement | null>(null);\n const setHostRef = useCallback((host: HTMLDivElement | null) => {\n hostRef.current = host;\n if (host) synchronizePortalEnvironment(host, anchorRef.current);\n }, [anchorRef]);\n useEffect(() => setMounted(true), []);\n useEffect(() => {\n const host = hostRef.current;\n const source = anchorRef.current?.closest<HTMLElement>(\n \"[data-hjm-provider], [data-hjm-portal]\",\n ) ?? null;\n if (!host || !source || typeof MutationObserver === \"undefined\") return;\n const observer = new MutationObserver(() => {\n synchronizePortalEnvironment(host, anchorRef.current);\n });\n observer.observe(source, {\n attributes: true,\n attributeFilter: [\"data-motion\", \"data-theme\", \"data-text-scale\", \"data-large-text\", \"dir\", \"style\"],\n });\n return () => observer.disconnect();\n }, [anchorRef, mounted]);\n if (!mounted) return ssrFallback === \"inline\" ? children : null;\n return createPortal(\n <div ref={setHostRef} className=\"hjm-root hjm-portal\" data-hjm-portal=\"\">\n {children}\n </div>,\n container ?? document.body,\n );\n}\n\nexport type AnchoredPopupAlign = \"start\" | \"center\" | \"end\";\nexport type AnchoredPopupPlacement = \"bottom\" | \"top\" | \"start\" | \"end\";\n\ntype AnchoredPopupPosition = Readonly<{\n align: AnchoredPopupAlign;\n placement: AnchoredPopupPlacement;\n style: CSSProperties;\n}>;\n\ntype AnchoredPopupOptions = Readonly<{\n align?: AnchoredPopupAlign;\n gap?: number;\n matchAnchorWidth?: boolean;\n placement?: AnchoredPopupPlacement;\n viewportPadding?: number;\n zIndex?: number;\n /** Wide contextual content may switch to the block axis in a narrow viewport. */\n fallbackAxis?: boolean;\n}>;\n\nconst hiddenPopupPosition: AnchoredPopupPosition = {\n align: \"start\",\n placement: \"bottom\",\n style: {\n position: \"fixed\",\n inset: \"auto\",\n left: 0,\n top: 0,\n visibility: \"hidden\",\n },\n};\n\nfunction samePosition(\n previous: AnchoredPopupPosition,\n next: AnchoredPopupPosition,\n): boolean {\n return previous.align === next.align &&\n previous.placement === next.placement &&\n previous.style.left === next.style.left &&\n previous.style.top === next.style.top &&\n previous.style.minWidth === next.style.minWidth &&\n previous.style.maxWidth === next.style.maxWidth &&\n previous.style.maxHeight === next.style.maxHeight &&\n previous.style.zIndex === next.style.zIndex &&\n previous.style.visibility === next.style.visibility;\n}\n\n/**\n * Positions a fixed portal popup against its anchor using logical alignment.\n * The popup flips vertically and shifts horizontally to stay inside the visual\n * viewport, then follows every scroll/resize source that can move either node.\n */\nexport function useAnchoredPopup(\n anchorRef: RefObject<HTMLElement | null>,\n popup: HTMLElement | null,\n {\n align = \"start\",\n fallbackAxis = false,\n gap = 8,\n matchAnchorWidth = false,\n placement: preferredPlacement = \"bottom\",\n viewportPadding = 16,\n zIndex = layer.dropdown,\n }: AnchoredPopupOptions = {},\n): AnchoredPopupPosition {\n const [position, setPosition] = useState<AnchoredPopupPosition>(() => ({\n ...hiddenPopupPosition,\n align,\n }));\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor || !popup || !anchor.isConnected || !popup.isConnected) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const popupRect = popup.getBoundingClientRect();\n const visualViewport = window.visualViewport;\n const viewportLeft = visualViewport?.offsetLeft ?? 0;\n const viewportTop = visualViewport?.offsetTop ?? 0;\n const viewportWidth = visualViewport?.width ?? window.innerWidth;\n const viewportHeight = visualViewport?.height ?? window.innerHeight;\n const viewportRight = viewportLeft + viewportWidth;\n const viewportBottom = viewportTop + viewportHeight;\n const availableBottom = Math.max(0, viewportBottom - viewportPadding - anchorRect.bottom - gap);\n const availableTop = Math.max(0, anchorRect.top - viewportTop - viewportPadding - gap);\n const availableLeft = Math.max(0, anchorRect.left - viewportLeft - viewportPadding - gap);\n const availableRight = Math.max(0, viewportRight - viewportPadding - anchorRect.right - gap);\n const maximumPopupHeight = Math.max(0, viewportHeight - (2 * viewportPadding));\n const maximumPopupWidth = Math.max(0, viewportWidth - (2 * viewportPadding));\n const desiredPopupHeight = Math.min(\n Math.max(popupRect.height, popup.scrollHeight),\n maximumPopupHeight,\n );\n const desiredPopupWidth = Math.min(\n Math.max(popupRect.width, popup.scrollWidth, matchAnchorWidth ? anchorRect.width : 0),\n maximumPopupWidth,\n );\n const direction = getComputedStyle(anchor).direction;\n const directModalOwner = anchor.closest<HTMLElement>(\"[data-hjm-modal-content]\");\n const inheritedOwnerId = anchor\n .closest<HTMLElement>(\"[data-hjm-popup-owner]\")\n ?.getAttribute(\"data-hjm-popup-owner\") ?? null;\n const modalOwner = directModalOwner ??\n (inheritedOwnerId === null ? null : document.getElementById(inheritedOwnerId));\n const modalLayerValue = modalOwner\n ?.closest<HTMLElement>(\".hjm-overlay\")\n ?.style.zIndex ?? \"\";\n const modalLayer = Number.parseInt(modalLayerValue, 10);\n const resolvedZIndex = Number.isFinite(modalLayer) ? modalLayer + 1 : zIndex;\n const logicalStartAtLeft = direction !== \"rtl\";\n const preferredPhysicalPlacement = preferredPlacement === \"start\"\n ? (logicalStartAtLeft ? \"left\" : \"right\")\n : preferredPlacement === \"end\"\n ? (logicalStartAtLeft ? \"right\" : \"left\")\n : preferredPlacement;\n let physicalPlacement: \"bottom\" | \"top\" | \"left\" | \"right\" =\n preferredPhysicalPlacement;\n if (\n physicalPlacement === \"bottom\" &&\n desiredPopupHeight > availableBottom &&\n availableTop > availableBottom\n ) physicalPlacement = \"top\";\n else if (\n physicalPlacement === \"top\" &&\n desiredPopupHeight > availableTop &&\n availableBottom > availableTop\n ) physicalPlacement = \"bottom\";\n else if (\n physicalPlacement === \"left\" &&\n desiredPopupWidth > availableLeft &&\n availableRight > availableLeft\n ) physicalPlacement = \"right\";\n else if (\n physicalPlacement === \"right\" &&\n desiredPopupWidth > availableRight &&\n availableLeft > availableRight\n ) physicalPlacement = \"left\";\n // A wide form cannot fit beside a centered mobile trigger. Preserve readable\n // content by trying the block axis; existing compact popup defaults stay unchanged.\n if (fallbackAxis && (physicalPlacement === \"left\" || physicalPlacement === \"right\") &&\n Math.max(availableLeft, availableRight) < desiredPopupWidth) {\n physicalPlacement = availableBottom >= availableTop ? \"bottom\" : \"top\";\n }\n const placement: AnchoredPopupPlacement = physicalPlacement === \"left\"\n ? (logicalStartAtLeft ? \"start\" : \"end\")\n : physicalPlacement === \"right\"\n ? (logicalStartAtLeft ? \"end\" : \"start\")\n : physicalPlacement;\n const availableHeight = physicalPlacement === \"bottom\"\n ? availableBottom\n : physicalPlacement === \"top\"\n ? availableTop\n : maximumPopupHeight;\n const availableWidth = physicalPlacement === \"left\"\n ? availableLeft\n : physicalPlacement === \"right\"\n ? availableRight\n : maximumPopupWidth;\n const popupHeight = Math.min(desiredPopupHeight, Math.max(0, availableHeight));\n const popupWidth = Math.min(desiredPopupWidth, Math.max(0, availableWidth));\n const alignLeftEdge = align === \"start\" ? logicalStartAtLeft : !logicalStartAtLeft;\n const inlineAlignedLeft = align === \"center\"\n ? anchorRect.left + ((anchorRect.width - popupWidth) / 2)\n : alignLeftEdge\n ? anchorRect.left\n : anchorRect.right - popupWidth;\n const blockAlignedTop = align === \"center\"\n ? anchorRect.top + ((anchorRect.height - popupHeight) / 2)\n : align === \"start\"\n ? anchorRect.top\n : anchorRect.bottom - popupHeight;\n const desiredLeft = physicalPlacement === \"left\"\n ? anchorRect.left - gap - popupWidth\n : physicalPlacement === \"right\"\n ? anchorRect.right + gap\n : inlineAlignedLeft;\n const maximumLeft = Math.max(\n viewportLeft + viewportPadding,\n viewportRight - viewportPadding - popupWidth,\n );\n const left = Math.min(\n Math.max(desiredLeft, viewportLeft + viewportPadding),\n maximumLeft,\n );\n const desiredTop = physicalPlacement === \"bottom\"\n ? anchorRect.bottom + gap\n : physicalPlacement === \"top\"\n ? anchorRect.top - gap - popupHeight\n : blockAlignedTop;\n const maximumTop = Math.max(\n viewportTop + viewportPadding,\n viewportBottom - viewportPadding - popupHeight,\n );\n const top = Math.min(\n Math.max(desiredTop, viewportTop + viewportPadding),\n maximumTop,\n );\n const next: AnchoredPopupPosition = {\n align,\n placement,\n style: {\n position: \"fixed\",\n inset: \"auto\",\n left: Math.round(left),\n top: Math.round(top),\n minWidth: matchAnchorWidth\n ? Math.round(Math.min(anchorRect.width, availableWidth, maximumPopupWidth))\n : undefined,\n maxWidth: Math.max(0, availableWidth),\n maxHeight: Math.max(0, availableHeight),\n visibility: \"visible\",\n zIndex: resolvedZIndex,\n },\n };\n setPosition((previous) => samePosition(previous, next) ? previous : next);\n }, [\n align,\n anchorRef,\n fallbackAxis,\n gap,\n matchAnchorWidth,\n popup,\n preferredPlacement,\n viewportPadding,\n zIndex,\n ]);\n\n useEffect(() => {\n if (!popup) {\n setPosition({ ...hiddenPopupPosition, align });\n return;\n }\n update();\n const frame = requestAnimationFrame(update);\n const handleViewportChange = () => update();\n window.addEventListener(\"resize\", handleViewportChange);\n window.addEventListener(\"scroll\", handleViewportChange, true);\n window.visualViewport?.addEventListener(\"resize\", handleViewportChange);\n window.visualViewport?.addEventListener(\"scroll\", handleViewportChange);\n const resizeObserver = typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(update);\n if (anchorRef.current) resizeObserver?.observe(anchorRef.current);\n resizeObserver?.observe(popup);\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", handleViewportChange);\n window.removeEventListener(\"scroll\", handleViewportChange, true);\n window.visualViewport?.removeEventListener(\"resize\", handleViewportChange);\n window.visualViewport?.removeEventListener(\"scroll\", handleViewportChange);\n resizeObserver?.disconnect();\n };\n }, [align, anchorRef, popup, update]);\n\n return position;\n}\n"]}
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../src/portal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { layer } from \"@hjmds/design-contracts/foundations\";\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PortalProps = Readonly<{\n anchorRef: RefObject<HTMLElement | null>;\n children: ReactNode;\n container?: HTMLElement;\n /** Anchored non-modal popups may render inline until hydration moves them. */\n ssrFallback?: \"none\" | \"inline\";\n}>;\n\n/** Nearest interactive popover, including descendants rendered through another portal. */\nexport function getPopoverOwner(node: Node | null): HTMLElement | null {\n const element = node instanceof Element ? node : node?.parentElement;\n const direct = element?.closest<HTMLElement>(\"[data-hjm-popover-content]\");\n if (direct) return direct;\n const ownerId = element?.closest<HTMLElement>(\"[data-hjm-popover-owner]\")?.getAttribute(\"data-hjm-popover-owner\");\n return ownerId ? document.getElementById(ownerId) : null;\n}\n\n/**\n * Copies the closest provider DOM boundary instead of importing provider\n * runtime code, keeping granular form/overlay entry points lightweight.\n */\nfunction synchronizePortalEnvironment(host: HTMLDivElement, anchor: HTMLElement | null): void {\n // Modal ownership and non-modal ownership are separate: nested selects/menus\n // must belong to both, so outside focus does not close their parent popover.\n const popoverOwner = getPopoverOwner(anchor);\n if (popoverOwner?.id) host.setAttribute(\"data-hjm-popover-owner\", popoverOwner.id);\n else host.removeAttribute(\"data-hjm-popover-owner\");\n const source = anchor?.closest<HTMLElement>(\"[data-hjm-provider], [data-hjm-portal]\") ?? null;\n const directModalOwner = anchor?.closest<HTMLElement>(\"[data-hjm-modal-content]\") ?? null;\n const inheritedOwnerId = anchor\n ?.closest<HTMLElement>(\"[data-hjm-popup-owner]\")\n ?.getAttribute(\"data-hjm-popup-owner\") ?? null;\n const modalOwner = directModalOwner ??\n (inheritedOwnerId === null ? null : document.getElementById(inheritedOwnerId));\n if (modalOwner?.id) host.setAttribute(\"data-hjm-popup-owner\", modalOwner.id);\n else host.removeAttribute(\"data-hjm-popup-owner\");\n if (source) {\n host.removeAttribute(\"style\");\n for (let index = 0; index < source.style.length; index += 1) {\n const property = source.style.item(index);\n if (\n property.startsWith(\"--hjm-\") ||\n property === \"background-color\" ||\n property === \"color\" ||\n property === \"color-scheme\" ||\n property === \"font-family\" ||\n property === \"font-size\" ||\n property === \"line-height\"\n ) {\n host.style.setProperty(\n property,\n source.style.getPropertyValue(property),\n source.style.getPropertyPriority(property),\n );\n }\n }\n for (const attribute of [\"data-motion\", \"data-theme\", \"data-text-scale\", \"data-large-text\"] as const) {\n const value = source.getAttribute(attribute);\n if (value === null) host.removeAttribute(attribute);\n else host.setAttribute(attribute, value);\n }\n host.dir = source.dir;\n return;\n }\n host.removeAttribute(\"style\");\n host.removeAttribute(\"data-motion\");\n host.removeAttribute(\"data-theme\");\n host.removeAttribute(\"data-text-scale\");\n host.removeAttribute(\"data-large-text\");\n host.dir = anchor?.closest<HTMLElement>(\"[dir]\")?.dir ?? \"\";\n}\n\nexport function AnchoredPortal({\n anchorRef,\n children,\n container,\n ssrFallback = \"none\",\n}: PortalProps) {\n const [mounted, setMounted] = useState(false);\n const hostRef = useRef<HTMLDivElement | null>(null);\n const setHostRef = useCallback((host: HTMLDivElement | null) => {\n hostRef.current = host;\n if (host) synchronizePortalEnvironment(host, anchorRef.current);\n }, [anchorRef]);\n useEffect(() => setMounted(true), []);\n useEffect(() => {\n const host = hostRef.current;\n const source = anchorRef.current?.closest<HTMLElement>(\n \"[data-hjm-provider], [data-hjm-portal]\",\n ) ?? null;\n if (!host || !source || typeof MutationObserver === \"undefined\") return;\n const observer = new MutationObserver(() => {\n synchronizePortalEnvironment(host, anchorRef.current);\n });\n observer.observe(source, {\n attributes: true,\n attributeFilter: [\"data-motion\", \"data-theme\", \"data-text-scale\", \"data-large-text\", \"dir\", \"style\"],\n });\n return () => observer.disconnect();\n }, [anchorRef, mounted]);\n if (!mounted) return ssrFallback === \"inline\" ? children : null;\n return createPortal(\n <div ref={setHostRef} className=\"hjm-root hjm-portal\" data-hjm-portal=\"\">\n {children}\n </div>,\n container ?? document.body,\n );\n}\n\nexport type AnchoredPopupAlign = \"start\" | \"center\" | \"end\";\nexport type AnchoredPopupPlacement = \"bottom\" | \"top\" | \"start\" | \"end\";\n\ntype AnchoredPopupPosition = Readonly<{\n align: AnchoredPopupAlign;\n placement: AnchoredPopupPlacement;\n style: CSSProperties;\n}>;\n\ntype AnchoredPopupOptions = Readonly<{\n align?: AnchoredPopupAlign;\n gap?: number;\n matchAnchorWidth?: boolean;\n placement?: AnchoredPopupPlacement;\n viewportPadding?: number;\n zIndex?: number;\n /** Wide contextual content may switch to the block axis in a narrow viewport. */\n fallbackAxis?: boolean;\n /** Ignore presentation transforms when sizing an animated surface. */\n layoutDimensions?: boolean;\n}>;\n\nconst hiddenPopupPosition: AnchoredPopupPosition = {\n align: \"start\",\n placement: \"bottom\",\n style: {\n position: \"fixed\",\n inset: \"auto\",\n left: 0,\n top: 0,\n visibility: \"hidden\",\n },\n};\n\nfunction samePosition(\n previous: AnchoredPopupPosition,\n next: AnchoredPopupPosition,\n): boolean {\n return previous.align === next.align &&\n previous.placement === next.placement &&\n previous.style.left === next.style.left &&\n previous.style.top === next.style.top &&\n previous.style.minWidth === next.style.minWidth &&\n previous.style.maxWidth === next.style.maxWidth &&\n previous.style.maxHeight === next.style.maxHeight &&\n previous.style.zIndex === next.style.zIndex &&\n previous.style.visibility === next.style.visibility;\n}\n\n/**\n * Positions a fixed portal popup against its anchor using logical alignment.\n * The popup flips vertically and shifts horizontally to stay inside the visual\n * viewport, then follows every scroll/resize source that can move either node.\n */\nexport function useAnchoredPopup(\n anchorRef: RefObject<HTMLElement | null>,\n popup: HTMLElement | null,\n {\n align = \"start\",\n fallbackAxis = false,\n layoutDimensions = false,\n gap = 8,\n matchAnchorWidth = false,\n placement: preferredPlacement = \"bottom\",\n viewportPadding = 16,\n zIndex = layer.dropdown,\n }: AnchoredPopupOptions = {},\n): AnchoredPopupPosition {\n const [position, setPosition] = useState<AnchoredPopupPosition>(() => ({\n ...hiddenPopupPosition,\n align,\n }));\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor || !popup || !anchor.isConnected || !popup.isConnected) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n // Origin transitions may temporarily shrink/enlarge the surface. Collision\n // placement needs its final layout size, otherwise resize/scroll makes it drift.\n const popupRect = layoutDimensions ? { width: popup.offsetWidth, height: popup.offsetHeight } : popup.getBoundingClientRect();\n const visualViewport = window.visualViewport;\n const viewportLeft = visualViewport?.offsetLeft ?? 0;\n const viewportTop = visualViewport?.offsetTop ?? 0;\n const viewportWidth = visualViewport?.width ?? window.innerWidth;\n const viewportHeight = visualViewport?.height ?? window.innerHeight;\n const viewportRight = viewportLeft + viewportWidth;\n const viewportBottom = viewportTop + viewportHeight;\n const availableBottom = Math.max(0, viewportBottom - viewportPadding - anchorRect.bottom - gap);\n const availableTop = Math.max(0, anchorRect.top - viewportTop - viewportPadding - gap);\n const availableLeft = Math.max(0, anchorRect.left - viewportLeft - viewportPadding - gap);\n const availableRight = Math.max(0, viewportRight - viewportPadding - anchorRect.right - gap);\n const maximumPopupHeight = Math.max(0, viewportHeight - (2 * viewportPadding));\n const maximumPopupWidth = Math.max(0, viewportWidth - (2 * viewportPadding));\n const desiredPopupHeight = Math.min(\n Math.max(popupRect.height, popup.scrollHeight),\n maximumPopupHeight,\n );\n const desiredPopupWidth = Math.min(\n Math.max(popupRect.width, popup.scrollWidth, matchAnchorWidth ? anchorRect.width : 0),\n maximumPopupWidth,\n );\n const direction = getComputedStyle(anchor).direction;\n const directModalOwner = anchor.closest<HTMLElement>(\"[data-hjm-modal-content]\");\n const inheritedOwnerId = anchor\n .closest<HTMLElement>(\"[data-hjm-popup-owner]\")\n ?.getAttribute(\"data-hjm-popup-owner\") ?? null;\n const modalOwner = directModalOwner ??\n (inheritedOwnerId === null ? null : document.getElementById(inheritedOwnerId));\n const modalLayerValue = modalOwner\n ?.closest<HTMLElement>(\".hjm-overlay\")\n ?.style.zIndex ?? \"\";\n const modalLayer = Number.parseInt(modalLayerValue, 10);\n const resolvedZIndex = Number.isFinite(modalLayer) ? modalLayer + 1 : zIndex;\n const logicalStartAtLeft = direction !== \"rtl\";\n const preferredPhysicalPlacement = preferredPlacement === \"start\"\n ? (logicalStartAtLeft ? \"left\" : \"right\")\n : preferredPlacement === \"end\"\n ? (logicalStartAtLeft ? \"right\" : \"left\")\n : preferredPlacement;\n let physicalPlacement: \"bottom\" | \"top\" | \"left\" | \"right\" =\n preferredPhysicalPlacement;\n if (\n physicalPlacement === \"bottom\" &&\n desiredPopupHeight > availableBottom &&\n availableTop > availableBottom\n ) physicalPlacement = \"top\";\n else if (\n physicalPlacement === \"top\" &&\n desiredPopupHeight > availableTop &&\n availableBottom > availableTop\n ) physicalPlacement = \"bottom\";\n else if (\n physicalPlacement === \"left\" &&\n desiredPopupWidth > availableLeft &&\n availableRight > availableLeft\n ) physicalPlacement = \"right\";\n else if (\n physicalPlacement === \"right\" &&\n desiredPopupWidth > availableRight &&\n availableLeft > availableRight\n ) physicalPlacement = \"left\";\n // A wide form cannot fit beside a centered mobile trigger. Preserve readable\n // content by trying the block axis; existing compact popup defaults stay unchanged.\n if (fallbackAxis && (physicalPlacement === \"left\" || physicalPlacement === \"right\") &&\n Math.max(availableLeft, availableRight) < desiredPopupWidth) {\n physicalPlacement = availableBottom >= availableTop ? \"bottom\" : \"top\";\n }\n const placement: AnchoredPopupPlacement = physicalPlacement === \"left\"\n ? (logicalStartAtLeft ? \"start\" : \"end\")\n : physicalPlacement === \"right\"\n ? (logicalStartAtLeft ? \"end\" : \"start\")\n : physicalPlacement;\n const availableHeight = physicalPlacement === \"bottom\"\n ? availableBottom\n : physicalPlacement === \"top\"\n ? availableTop\n : maximumPopupHeight;\n const availableWidth = physicalPlacement === \"left\"\n ? availableLeft\n : physicalPlacement === \"right\"\n ? availableRight\n : maximumPopupWidth;\n const popupHeight = Math.min(desiredPopupHeight, Math.max(0, availableHeight));\n const popupWidth = Math.min(desiredPopupWidth, Math.max(0, availableWidth));\n const alignLeftEdge = align === \"start\" ? logicalStartAtLeft : !logicalStartAtLeft;\n const inlineAlignedLeft = align === \"center\"\n ? anchorRect.left + ((anchorRect.width - popupWidth) / 2)\n : alignLeftEdge\n ? anchorRect.left\n : anchorRect.right - popupWidth;\n const blockAlignedTop = align === \"center\"\n ? anchorRect.top + ((anchorRect.height - popupHeight) / 2)\n : align === \"start\"\n ? anchorRect.top\n : anchorRect.bottom - popupHeight;\n const desiredLeft = physicalPlacement === \"left\"\n ? anchorRect.left - gap - popupWidth\n : physicalPlacement === \"right\"\n ? anchorRect.right + gap\n : inlineAlignedLeft;\n const maximumLeft = Math.max(\n viewportLeft + viewportPadding,\n viewportRight - viewportPadding - popupWidth,\n );\n const left = Math.min(\n Math.max(desiredLeft, viewportLeft + viewportPadding),\n maximumLeft,\n );\n const desiredTop = physicalPlacement === \"bottom\"\n ? anchorRect.bottom + gap\n : physicalPlacement === \"top\"\n ? anchorRect.top - gap - popupHeight\n : blockAlignedTop;\n const maximumTop = Math.max(\n viewportTop + viewportPadding,\n viewportBottom - viewportPadding - popupHeight,\n );\n const top = Math.min(\n Math.max(desiredTop, viewportTop + viewportPadding),\n maximumTop,\n );\n const next: AnchoredPopupPosition = {\n align,\n placement,\n style: {\n position: \"fixed\",\n inset: \"auto\",\n left: Math.round(left),\n top: Math.round(top),\n minWidth: matchAnchorWidth\n ? Math.round(Math.min(anchorRect.width, availableWidth, maximumPopupWidth))\n : undefined,\n maxWidth: Math.max(0, availableWidth),\n maxHeight: Math.max(0, availableHeight),\n visibility: \"visible\",\n zIndex: resolvedZIndex,\n },\n };\n setPosition((previous) => samePosition(previous, next) ? previous : next);\n }, [\n align,\n anchorRef,\n fallbackAxis,\n layoutDimensions,\n gap,\n matchAnchorWidth,\n popup,\n preferredPlacement,\n viewportPadding,\n zIndex,\n ]);\n\n useEffect(() => {\n if (!popup) {\n setPosition({ ...hiddenPopupPosition, align });\n return;\n }\n update();\n const frame = requestAnimationFrame(update);\n const handleViewportChange = () => update();\n window.addEventListener(\"resize\", handleViewportChange);\n window.addEventListener(\"scroll\", handleViewportChange, true);\n window.visualViewport?.addEventListener(\"resize\", handleViewportChange);\n window.visualViewport?.addEventListener(\"scroll\", handleViewportChange);\n const resizeObserver = typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(update);\n if (anchorRef.current) resizeObserver?.observe(anchorRef.current);\n resizeObserver?.observe(popup);\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", handleViewportChange);\n window.removeEventListener(\"scroll\", handleViewportChange, true);\n window.visualViewport?.removeEventListener(\"resize\", handleViewportChange);\n window.visualViewport?.removeEventListener(\"scroll\", handleViewportChange);\n resizeObserver?.disconnect();\n };\n }, [align, anchorRef, popup, update]);\n\n return position;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { type ProgressiveBlurDescriptor } from '@hjmds/design-contracts/progressive-blur';
2
+ export type ProgressiveBlurProps = Readonly<{
3
+ descriptor: ProgressiveBlurDescriptor;
4
+ }>;
5
+ /** Place after the content inside a positioned, clipped host. Never wrap content. */
6
+ export declare function ProgressiveBlur({ descriptor }: ProgressiveBlurProps): import("react").JSX.Element | null;
7
+ //# sourceMappingURL=progressive-blur.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-blur.d.ts","sourceRoot":"","sources":["../src/progressive-blur.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAElH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAAE,UAAU,EAAE,yBAAyB,CAAA;CAAE,CAAC,CAAC;AACvF,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,EAAE,UAAU,EAAE,EAAE,oBAAoB,sCAenE"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { resolveProgressiveBlur } from '@hjmds/design-contracts/progressive-blur';
3
+ import { useHjmTheme } from './provider.js';
4
+ /** Place after the content inside a positioned, clipped host. Never wrap content. */
5
+ export function ProgressiveBlur({ descriptor }) {
6
+ const { environment } = useHjmTheme();
7
+ const effect = resolveProgressiveBlur(descriptor, environment.direction);
8
+ if (!effect.visible)
9
+ return null;
10
+ const vertical = effect.side === 'top' || effect.side === 'bottom';
11
+ const toward = { top: 'top', bottom: 'bottom', left: 'left', right: 'right' }[effect.side];
12
+ return _jsx("div", { "aria-hidden": "true", "data-hjm-progressive-blur": effect.side, style: { position: 'absolute', pointerEvents: 'none', [effect.side]: 0, ...(vertical ? { left: 0, right: 0, height: effect.extent } : { top: 0, bottom: 0, width: effect.extent }) }, children: effect.layers.map((layer, index) => {
13
+ const mask = `linear-gradient(to ${toward}, transparent ${layer.start * 100}%, black ${layer.end * 100}%)`;
14
+ // Pixel mapping is Web-only. Native hosts calibrate their own intensity;
15
+ // a CSS radius is not portable to platform blur engines.
16
+ const blur = `blur(${layer.strength * 16}px)`;
17
+ return _jsx("div", { style: { position: 'absolute', inset: 0, pointerEvents: 'none', backdropFilter: blur, WebkitBackdropFilter: blur, maskImage: mask, WebkitMaskImage: mask } }, index);
18
+ }) });
19
+ }
20
+ //# sourceMappingURL=progressive-blur.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-blur.js","sourceRoot":"","sources":["../src/progressive-blur.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,sBAAsB,EAAkC,MAAM,0CAA0C,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,EAAE,UAAU,EAAwB;IAClE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;IACnE,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,6BAAiB,MAAM,+BAA4B,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,YACxP,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAClC,MAAM,IAAI,GAAG,sBAAsB,MAAM,iBAAiB,KAAK,CAAC,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;YAC3G,yEAAyE;YACzE,yDAAyD;YACzD,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC,QAAQ,GAAG,EAAE,KAAK,CAAC;YAC9C,OAAO,cAAiB,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAjK,KAAK,CAAgK,CAAC;QACzL,CAAC,CAAC,GACE,CAAC;AACT,CAAC","sourcesContent":["import { resolveProgressiveBlur, type ProgressiveBlurDescriptor } from '@hjmds/design-contracts/progressive-blur';\nimport { useHjmTheme } from './provider.js';\nexport type ProgressiveBlurProps = Readonly<{ descriptor: ProgressiveBlurDescriptor }>;\n/** Place after the content inside a positioned, clipped host. Never wrap content. */\nexport function ProgressiveBlur({ descriptor }: ProgressiveBlurProps) {\n const { environment } = useHjmTheme();\n const effect = resolveProgressiveBlur(descriptor, environment.direction);\n if (!effect.visible) return null;\n const vertical = effect.side === 'top' || effect.side === 'bottom';\n const toward = { top: 'top', bottom: 'bottom', left: 'left', right: 'right' }[effect.side];\n return <div aria-hidden=\"true\" data-hjm-progressive-blur={effect.side} style={{ position: 'absolute', pointerEvents: 'none', [effect.side]: 0, ...(vertical ? { left: 0, right: 0, height: effect.extent } : { top: 0, bottom: 0, width: effect.extent }) }}>\n {effect.layers.map((layer, index) => {\n const mask = `linear-gradient(to ${toward}, transparent ${layer.start * 100}%, black ${layer.end * 100}%)`;\n // Pixel mapping is Web-only. Native hosts calibrate their own intensity;\n // a CSS radius is not portable to platform blur engines.\n const blur = `blur(${layer.strength * 16}px)`;\n return <div key={index} style={{ position: 'absolute', inset: 0, pointerEvents: 'none', backdropFilter: blur, WebkitBackdropFilter: blur, maskImage: mask, WebkitMaskImage: mask }} />;\n })}\n </div>;\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { HjmDesignProfile } from "@hjmds/design-contracts/design-profile";
1
2
  import { type DesignSystemDensity, type DesignSystemDirection, type DesignSystemProviderValue, type DesignSystemTextScale, type ResolveDesignSystemEnvironmentOptions } from "@hjmds/design-contracts/components/design-system-provider";
2
3
  import type { ResolvedTheme, ThemePreference } from "@hjmds/design-contracts/colors";
3
4
  import { type HTMLAttributes, type ReactNode } from "react";
@@ -26,6 +27,8 @@ type HjmProviderEnvironmentProps = Readonly<{
26
27
  * following the OS theme and reduced-motion settings.
27
28
  */
28
29
  brandPalette?: HjmBrandPalette;
30
+ /** Appearance and interaction defaults defined once by the product. Explicit props win. */
31
+ designProfile?: HjmDesignProfile;
29
32
  }>;
30
33
  type HjmProviderValueProps = Readonly<{
31
34
  /** Complete, validated environment and semantic product palette. */
@@ -38,6 +41,7 @@ type HjmProviderValueProps = Readonly<{
38
41
  density?: never;
39
42
  systemTheme?: never;
40
43
  brandPalette?: never;
44
+ designProfile?: never;
41
45
  }>;
42
46
  /**
43
47
  * How the provider's own host element participates in layout and painting.
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,qCAAqC,EAC3C,MAAM,2DAA2D,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAErF,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAMf,0FAA0F;AAC1F,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,qCAAqC,CAAC,cAAc,CAAC,CAAC,CAAC;AAUjG,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,IAAI,OAAO,CAAC;CAC5B,CAAC,CAAC;AAkBH,KAAK,2BAA2B,GAAG,QAAQ,CAAC;IAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sFAAsF;IACtF,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,mFAAmF;IACnF,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC,CAAC,CAAC;AAEH,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,oEAAoE;IACpE,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC;AAGrD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,cAAc,CAAC,cAAc,CAAC,EAC9B,UAAU,GAAG,KAAK,CACnB,GACC,QAAQ,CAAC;IACP,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,CAAC,GAAG,CAAC,2BAA2B,GAAG,qBAAqB,CAAC,CAAC;AAE7D,eAAO,MAAM,WAAW,6GAiHvB,CAAC;AAEF,wBAAgB,WAAW,IAAI,yBAAyB,CAMvD;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,IAAI,yBAAyB,GAAG,IAAI,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,EACrF,UAAU,EAAE,QAAQ,CAAC;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GACnE,WAAW,GAAG,OAAO,CAMvB;AAED,uEAAuE;AACvE,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
package/dist/provider.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DesignProfileContext } from "./internal.js";
2
3
  import { designSystemEnvironmentDefaults, isLargeTextScale, resolveDensityDefault, resolveDesignSystemProviderValue, validateDesignSystemProviderValue, } from "@hjmds/design-contracts/components/design-system-provider";
3
4
  import { tooltipBehaviorDefaults } from "@hjmds/design-contracts/components/tooltip";
4
5
  import { createContext, forwardRef, useCallback, useContext, useRef, useState, useSyncExternalStore, } from "react";
@@ -21,8 +22,9 @@ function subscribeMedia(query, callback) {
21
22
  function useMediaQuery(query, observe = true) {
22
23
  return useSyncExternalStore((callback) => observe ? subscribeMedia(query, callback) : () => undefined, () => observe && window.matchMedia(query).matches, () => false);
23
24
  }
24
- export const HjmProvider = forwardRef(function HjmProvider({ children, theme, direction, textScale, reducedMotion, minimumVisualTarget, density, systemTheme, brandPalette: suppliedBrandPalette, host = "surface", value: suppliedValue, className, style, ...rest }, ref) {
25
+ export const HjmProvider = forwardRef(function HjmProvider({ children, theme, direction, textScale, reducedMotion, minimumVisualTarget, density, systemTheme, brandPalette: suppliedBrandPalette, designProfile: suppliedDesignProfile, host = "surface", value: suppliedValue, className, style, ...rest }, ref) {
25
26
  const parent = useContext(HjmThemeContext);
27
+ const designProfile = suppliedDesignProfile ?? parent?.designProfile;
26
28
  const inheritedBrandPalette = useContext(HjmBrandPaletteContext);
27
29
  const brandPalette = suppliedBrandPalette ?? inheritedBrandPalette;
28
30
  const observesSystem = suppliedValue === undefined;
@@ -40,6 +42,7 @@ export const HjmProvider = forwardRef(function HjmProvider({ children, theme, di
40
42
  const value = suppliedValue ?? resolveDesignSystemProviderValue(input, {
41
43
  systemTheme: resolvedSystemTheme,
42
44
  ...(brandPalette === undefined ? {} : { brandPalette }),
45
+ ...(designProfile === undefined ? {} : { designProfile }),
43
46
  ...(parent === null ? {} : { parent: parent.environment }),
44
47
  ...(reducedMotion === undefined && parent === null
45
48
  ? { systemReducedMotion: prefersReducedMotion }
@@ -85,7 +88,7 @@ export const HjmProvider = forwardRef(function HjmProvider({ children, theme, di
85
88
  // module into granular entries like ./selection and blow their gzip budgets.
86
89
  // See issue #20.
87
90
  const largeText = isLargeTextScale(environment.textScale) ? "true" : undefined;
88
- return (_jsx(HjmThemeContext.Provider, { value: value, children: _jsx(HjmBrandPaletteContext.Provider, { value: suppliedValue === undefined ? brandPalette : undefined, children: _jsx(TooltipCoordinatorContext.Provider, { value: tooltipCoordinator, children: _jsx("div", { ...rest, ref: ref, className: classNames("hjm-root", className), "data-hjm-provider": "", "data-host": host, "data-motion": environment.reducedMotion ? "reduced" : "full", "data-theme": environment.theme, "data-text-scale": environment.textScale, "data-large-text": largeText, dir: environment.direction, style: { ...createHjmThemeStyle(value), ...style }, children: children }) }) }) }));
91
+ return (_jsx(HjmThemeContext.Provider, { value: value, children: _jsx(DesignProfileContext.Provider, { value: value.designProfile, children: _jsx(HjmBrandPaletteContext.Provider, { value: suppliedValue === undefined ? brandPalette : undefined, children: _jsx(TooltipCoordinatorContext.Provider, { value: tooltipCoordinator, children: _jsx("div", { ...rest, ref: ref, className: classNames("hjm-root", className), "data-hjm-provider": "", "data-host": host, "data-motion": environment.reducedMotion ? "reduced" : "full", "data-theme": environment.theme, "data-design-profile": value.designProfile?.id, "data-text-scale": environment.textScale, "data-large-text": largeText, dir: environment.direction, style: { ...createHjmThemeStyle(value), ...style }, children: children }) }) }) }) }));
89
92
  });
90
93
  export function useHjmTheme() {
91
94
  const value = useContext(HjmThemeContext);
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n designSystemEnvironmentDefaults,\n isLargeTextScale,\n resolveDensityDefault,\n resolveDesignSystemProviderValue,\n validateDesignSystemProviderValue,\n type DesignSystemDensity,\n type DesignSystemDirection,\n type DesignSystemProviderValue,\n type DesignSystemTextScale,\n type ResolveDesignSystemEnvironmentOptions,\n} from \"@hjmds/design-contracts/components/design-system-provider\";\nimport type { ResolvedTheme, ThemePreference } from \"@hjmds/design-contracts/colors\";\nimport { tooltipBehaviorDefaults } from \"@hjmds/design-contracts/components/tooltip\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useState,\n useSyncExternalStore,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\nconst HjmThemeContext = createContext<DesignSystemProviderValue | null>(null);\n\n/** Per-theme partial palette merged over the HJM defaults; see docs/brand-boundary.md. */\nexport type HjmBrandPalette = NonNullable<ResolveDesignSystemEnvironmentOptions[\"brandPalette\"]>;\n\n/**\n * The nearest ancestor's brand palette. A nested provider (for example one that\n * only changes density) keeps the product brand instead of falling back to the\n * HJM defaults, because the resolved palette alone cannot be split back into\n * defaults and overrides.\n */\nconst HjmBrandPaletteContext = createContext<HjmBrandPalette | undefined>(undefined);\n\nexport type TooltipCoordinator = Readonly<{\n activeId: string | null;\n activate(id: string): void;\n deactivate(id: string): void;\n shouldSkipDelay(): boolean;\n}>;\n\nconst TooltipCoordinatorContext = createContext<TooltipCoordinator | null>(null);\n\nfunction subscribeMedia(query: string, callback: () => void): () => void {\n const media = window.matchMedia(query);\n media.addEventListener(\"change\", callback);\n return () => media.removeEventListener(\"change\", callback);\n}\n\nfunction useMediaQuery(query: string, observe = true): boolean {\n return useSyncExternalStore(\n (callback) => observe ? subscribeMedia(query, callback) : () => undefined,\n () => observe && window.matchMedia(query).matches,\n () => false,\n );\n}\n\ntype HjmProviderEnvironmentProps = Readonly<{\n value?: never;\n theme?: ThemePreference;\n direction?: DesignSystemDirection;\n textScale?: DesignSystemTextScale;\n reducedMotion?: boolean;\n minimumVisualTarget?: boolean;\n /** Default row/menu/table density below this provider; each component's prop wins. */\n density?: DesignSystemDensity;\n /** Deterministic SSR/test override; otherwise prefers-color-scheme is observed. */\n systemTheme?: ResolvedTheme;\n /**\n * The supported brand route (docs/brand-boundary.md). Before 1.5.0 the only way\n * to brand was a hand-built `value`, which also stopped the provider from\n * following the OS theme and reduced-motion settings.\n */\n brandPalette?: HjmBrandPalette;\n}>;\n\ntype HjmProviderValueProps = Readonly<{\n /** Complete, validated environment and semantic product palette. */\n value: DesignSystemProviderValue;\n theme?: never;\n direction?: never;\n textScale?: never;\n reducedMotion?: never;\n minimumVisualTarget?: never;\n density?: never;\n systemTheme?: never;\n brandPalette?: never;\n}>;\n\n/**\n * How the provider's own host element participates in layout and painting.\n *\n * `surface` (default) paints the HJM background, text color and UI typography,\n * which is what a page whose root *is* the provider needs. A product whose\n * document root already paints its surface previously had to neutralise the\n * host with an inline `display: contents` style, re-entering product code into\n * the renderer boundary; `contents` is that intent as a supported axis — the\n * element still carries the CSS variables, `dir` and data attributes.\n */\nexport type HjmProviderHost = \"surface\" | \"contents\";\n\n// No `layoutStyle`: a theme/context provider, not a placed component; place its children.\nexport type HjmProviderProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"dir\"\n> &\n Readonly<{\n children: ReactNode;\n host?: HjmProviderHost;\n }> & (HjmProviderEnvironmentProps | HjmProviderValueProps);\n\nexport const HjmProvider = forwardRef<HTMLDivElement, HjmProviderProps>(\n function HjmProvider(\n {\n children,\n theme,\n direction,\n textScale,\n reducedMotion,\n minimumVisualTarget,\n density,\n systemTheme,\n brandPalette: suppliedBrandPalette,\n host = \"surface\",\n value: suppliedValue,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const parent = useContext(HjmThemeContext);\n const inheritedBrandPalette = useContext(HjmBrandPaletteContext);\n const brandPalette = suppliedBrandPalette ?? inheritedBrandPalette;\n const observesSystem = suppliedValue === undefined;\n const prefersDark = useMediaQuery(\"(prefers-color-scheme: dark)\", observesSystem);\n const prefersReducedMotion = useMediaQuery(\n \"(prefers-reduced-motion: reduce)\",\n observesSystem,\n );\n const resolvedSystemTheme = systemTheme ?? (prefersDark ? \"dark\" : \"light\");\n const input = {\n ...(theme === undefined ? {} : { theme }),\n ...(direction === undefined ? {} : { direction }),\n ...(textScale === undefined ? {} : { textScale }),\n ...(reducedMotion === undefined ? {} : { reducedMotion }),\n ...(minimumVisualTarget === undefined ? {} : { minimumVisualTarget }),\n ...(density === undefined ? {} : { density }),\n };\n const value = suppliedValue ?? resolveDesignSystemProviderValue(input, {\n systemTheme: resolvedSystemTheme,\n ...(brandPalette === undefined ? {} : { brandPalette }),\n ...(parent === null ? {} : { parent: parent.environment }),\n ...(reducedMotion === undefined && parent === null\n ? { systemReducedMotion: prefersReducedMotion }\n : {}),\n });\n validateDesignSystemProviderValue(value);\n const environment = value.environment;\n const [activeTooltipId, setActiveTooltipId] = useState<string | null>(null);\n const activeTooltipIdRef = useRef<string | null>(null);\n const lastTooltipTransitionAtRef = useRef(Number.NEGATIVE_INFINITY);\n activeTooltipIdRef.current = activeTooltipId;\n const activateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current === id) return current;\n if (current !== null) lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = id;\n return id;\n });\n }, []);\n const deactivateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current !== id) return current;\n lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = null;\n return null;\n });\n }, []);\n const shouldSkipTooltipDelay = useCallback(\n () =>\n activeTooltipIdRef.current !== null ||\n Date.now() - lastTooltipTransitionAtRef.current <\n tooltipBehaviorDefaults.skipDelayMs,\n [],\n );\n const tooltipCoordinator: TooltipCoordinator = {\n activeId: activeTooltipId,\n activate: activateTooltip,\n deactivate: deactivateTooltip,\n shouldSkipDelay: shouldSkipTooltipDelay,\n };\n\n // `data-text-scale` is a number, so a stylesheet cannot ask whether it crossed\n // `largeTextThreshold`. The provider resolves that comparison once and publishes\n // the answer; letting each renderer read the environment instead would pull this\n // module into granular entries like ./selection and blow their gzip budgets.\n // See issue #20.\n const largeText = isLargeTextScale(environment.textScale) ? \"true\" : undefined;\n\n return (\n <HjmThemeContext.Provider value={value}>\n <HjmBrandPaletteContext.Provider value={suppliedValue === undefined ? brandPalette : undefined}>\n <TooltipCoordinatorContext.Provider value={tooltipCoordinator}>\n <div\n {...rest}\n ref={ref}\n className={classNames(\"hjm-root\", className)}\n data-hjm-provider=\"\"\n data-host={host}\n data-motion={environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={environment.theme}\n data-text-scale={environment.textScale}\n data-large-text={largeText}\n dir={environment.direction}\n style={{ ...createHjmThemeStyle(value), ...style }}\n >\n {children}\n </div>\n </TooltipCoordinatorContext.Provider>\n </HjmBrandPaletteContext.Provider>\n </HjmThemeContext.Provider>\n );\n },\n);\n\nexport function useHjmTheme(): DesignSystemProviderValue {\n const value = useContext(HjmThemeContext);\n if (value === null) {\n throw new Error(\"useHjmTheme must be used inside HjmProvider\");\n }\n return value;\n}\n\n/** Renderer components use the browser default direction when no provider is present. */\nexport function useOptionalHjmTheme(): DesignSystemProviderValue | null {\n return useContext(HjmThemeContext);\n}\n\n/**\n * Resolves the provider's density onto one component's own density vocabulary.\n * Outside a provider the component's recipe default stands — a global axis must\n * not make an unwrapped renderer behave differently from a wrapped one at rest.\n */\nexport function useHjmDensityDefault<Comfortable extends string, Compact extends string>(\n vocabulary: Readonly<{ comfortable: Comfortable; compact: Compact }>,\n): Comfortable | Compact {\n const theme = useContext(HjmThemeContext);\n return resolveDensityDefault(\n theme?.environment.density ?? designSystemEnvironmentDefaults.density,\n vocabulary,\n );\n}\n\n/** Internal provider-scoped coordination used by Tooltip renderers. */\nexport function useTooltipCoordinator(): TooltipCoordinator | null {\n return useContext(TooltipCoordinatorContext);\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { DesignProfileContext } from \"./internal.js\";\nimport type { HjmDesignProfile } from \"@hjmds/design-contracts/design-profile\";\nimport {\n designSystemEnvironmentDefaults,\n isLargeTextScale,\n resolveDensityDefault,\n resolveDesignSystemProviderValue,\n validateDesignSystemProviderValue,\n type DesignSystemDensity,\n type DesignSystemDirection,\n type DesignSystemProviderValue,\n type DesignSystemTextScale,\n type ResolveDesignSystemEnvironmentOptions,\n} from \"@hjmds/design-contracts/components/design-system-provider\";\nimport type { ResolvedTheme, ThemePreference } from \"@hjmds/design-contracts/colors\";\nimport { tooltipBehaviorDefaults } from \"@hjmds/design-contracts/components/tooltip\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useState,\n useSyncExternalStore,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport { createHjmThemeStyle } from \"./theme.js\";\n\nconst HjmThemeContext = createContext<DesignSystemProviderValue | null>(null);\n\n/** Per-theme partial palette merged over the HJM defaults; see docs/brand-boundary.md. */\nexport type HjmBrandPalette = NonNullable<ResolveDesignSystemEnvironmentOptions[\"brandPalette\"]>;\n\n/**\n * The nearest ancestor's brand palette. A nested provider (for example one that\n * only changes density) keeps the product brand instead of falling back to the\n * HJM defaults, because the resolved palette alone cannot be split back into\n * defaults and overrides.\n */\nconst HjmBrandPaletteContext = createContext<HjmBrandPalette | undefined>(undefined);\n\nexport type TooltipCoordinator = Readonly<{\n activeId: string | null;\n activate(id: string): void;\n deactivate(id: string): void;\n shouldSkipDelay(): boolean;\n}>;\n\nconst TooltipCoordinatorContext = createContext<TooltipCoordinator | null>(null);\n\nfunction subscribeMedia(query: string, callback: () => void): () => void {\n const media = window.matchMedia(query);\n media.addEventListener(\"change\", callback);\n return () => media.removeEventListener(\"change\", callback);\n}\n\nfunction useMediaQuery(query: string, observe = true): boolean {\n return useSyncExternalStore(\n (callback) => observe ? subscribeMedia(query, callback) : () => undefined,\n () => observe && window.matchMedia(query).matches,\n () => false,\n );\n}\n\ntype HjmProviderEnvironmentProps = Readonly<{\n value?: never;\n theme?: ThemePreference;\n direction?: DesignSystemDirection;\n textScale?: DesignSystemTextScale;\n reducedMotion?: boolean;\n minimumVisualTarget?: boolean;\n /** Default row/menu/table density below this provider; each component's prop wins. */\n density?: DesignSystemDensity;\n /** Deterministic SSR/test override; otherwise prefers-color-scheme is observed. */\n systemTheme?: ResolvedTheme;\n /**\n * The supported brand route (docs/brand-boundary.md). Before 1.5.0 the only way\n * to brand was a hand-built `value`, which also stopped the provider from\n * following the OS theme and reduced-motion settings.\n */\n brandPalette?: HjmBrandPalette;\n /** Appearance and interaction defaults defined once by the product. Explicit props win. */\n designProfile?: HjmDesignProfile;\n}>;\n\ntype HjmProviderValueProps = Readonly<{\n /** Complete, validated environment and semantic product palette. */\n value: DesignSystemProviderValue;\n theme?: never;\n direction?: never;\n textScale?: never;\n reducedMotion?: never;\n minimumVisualTarget?: never;\n density?: never;\n systemTheme?: never;\n brandPalette?: never;\n designProfile?: never;\n}>;\n\n/**\n * How the provider's own host element participates in layout and painting.\n *\n * `surface` (default) paints the HJM background, text color and UI typography,\n * which is what a page whose root *is* the provider needs. A product whose\n * document root already paints its surface previously had to neutralise the\n * host with an inline `display: contents` style, re-entering product code into\n * the renderer boundary; `contents` is that intent as a supported axis — the\n * element still carries the CSS variables, `dir` and data attributes.\n */\nexport type HjmProviderHost = \"surface\" | \"contents\";\n\n// No `layoutStyle`: a theme/context provider, not a placed component; place its children.\nexport type HjmProviderProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"dir\"\n> &\n Readonly<{\n children: ReactNode;\n host?: HjmProviderHost;\n }> & (HjmProviderEnvironmentProps | HjmProviderValueProps);\n\nexport const HjmProvider = forwardRef<HTMLDivElement, HjmProviderProps>(\n function HjmProvider(\n {\n children,\n theme,\n direction,\n textScale,\n reducedMotion,\n minimumVisualTarget,\n density,\n systemTheme,\n brandPalette: suppliedBrandPalette,\n designProfile: suppliedDesignProfile,\n host = \"surface\",\n value: suppliedValue,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const parent = useContext(HjmThemeContext);\n const designProfile = suppliedDesignProfile ?? parent?.designProfile;\n const inheritedBrandPalette = useContext(HjmBrandPaletteContext);\n const brandPalette = suppliedBrandPalette ?? inheritedBrandPalette;\n const observesSystem = suppliedValue === undefined;\n const prefersDark = useMediaQuery(\"(prefers-color-scheme: dark)\", observesSystem);\n const prefersReducedMotion = useMediaQuery(\n \"(prefers-reduced-motion: reduce)\",\n observesSystem,\n );\n const resolvedSystemTheme = systemTheme ?? (prefersDark ? \"dark\" : \"light\");\n const input = {\n ...(theme === undefined ? {} : { theme }),\n ...(direction === undefined ? {} : { direction }),\n ...(textScale === undefined ? {} : { textScale }),\n ...(reducedMotion === undefined ? {} : { reducedMotion }),\n ...(minimumVisualTarget === undefined ? {} : { minimumVisualTarget }),\n ...(density === undefined ? {} : { density }),\n };\n const value = suppliedValue ?? resolveDesignSystemProviderValue(input, {\n systemTheme: resolvedSystemTheme,\n ...(brandPalette === undefined ? {} : { brandPalette }),\n ...(designProfile === undefined ? {} : { designProfile }),\n ...(parent === null ? {} : { parent: parent.environment }),\n ...(reducedMotion === undefined && parent === null\n ? { systemReducedMotion: prefersReducedMotion }\n : {}),\n });\n validateDesignSystemProviderValue(value);\n const environment = value.environment;\n const [activeTooltipId, setActiveTooltipId] = useState<string | null>(null);\n const activeTooltipIdRef = useRef<string | null>(null);\n const lastTooltipTransitionAtRef = useRef(Number.NEGATIVE_INFINITY);\n activeTooltipIdRef.current = activeTooltipId;\n const activateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current === id) return current;\n if (current !== null) lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = id;\n return id;\n });\n }, []);\n const deactivateTooltip = useCallback((id: string) => {\n setActiveTooltipId((current) => {\n if (current !== id) return current;\n lastTooltipTransitionAtRef.current = Date.now();\n activeTooltipIdRef.current = null;\n return null;\n });\n }, []);\n const shouldSkipTooltipDelay = useCallback(\n () =>\n activeTooltipIdRef.current !== null ||\n Date.now() - lastTooltipTransitionAtRef.current <\n tooltipBehaviorDefaults.skipDelayMs,\n [],\n );\n const tooltipCoordinator: TooltipCoordinator = {\n activeId: activeTooltipId,\n activate: activateTooltip,\n deactivate: deactivateTooltip,\n shouldSkipDelay: shouldSkipTooltipDelay,\n };\n\n // `data-text-scale` is a number, so a stylesheet cannot ask whether it crossed\n // `largeTextThreshold`. The provider resolves that comparison once and publishes\n // the answer; letting each renderer read the environment instead would pull this\n // module into granular entries like ./selection and blow their gzip budgets.\n // See issue #20.\n const largeText = isLargeTextScale(environment.textScale) ? \"true\" : undefined;\n\n return (\n <HjmThemeContext.Provider value={value}>\n <DesignProfileContext.Provider value={value.designProfile}>\n <HjmBrandPaletteContext.Provider value={suppliedValue === undefined ? brandPalette : undefined}>\n <TooltipCoordinatorContext.Provider value={tooltipCoordinator}>\n <div\n {...rest}\n ref={ref}\n className={classNames(\"hjm-root\", className)}\n data-hjm-provider=\"\"\n data-host={host}\n data-motion={environment.reducedMotion ? \"reduced\" : \"full\"}\n data-theme={environment.theme}\n data-design-profile={value.designProfile?.id}\n data-text-scale={environment.textScale}\n data-large-text={largeText}\n dir={environment.direction}\n style={{ ...createHjmThemeStyle(value), ...style }}\n >\n {children}\n </div>\n </TooltipCoordinatorContext.Provider>\n </HjmBrandPaletteContext.Provider>\n </DesignProfileContext.Provider>\n </HjmThemeContext.Provider>\n );\n },\n);\n\nexport function useHjmTheme(): DesignSystemProviderValue {\n const value = useContext(HjmThemeContext);\n if (value === null) {\n throw new Error(\"useHjmTheme must be used inside HjmProvider\");\n }\n return value;\n}\n\n/** Renderer components use the browser default direction when no provider is present. */\nexport function useOptionalHjmTheme(): DesignSystemProviderValue | null {\n return useContext(HjmThemeContext);\n}\n\n/**\n * Resolves the provider's density onto one component's own density vocabulary.\n * Outside a provider the component's recipe default stands — a global axis must\n * not make an unwrapped renderer behave differently from a wrapped one at rest.\n */\nexport function useHjmDensityDefault<Comfortable extends string, Compact extends string>(\n vocabulary: Readonly<{ comfortable: Comfortable; compact: Compact }>,\n): Comfortable | Compact {\n const theme = useContext(HjmThemeContext);\n return resolveDensityDefault(\n theme?.environment.density ?? designSystemEnvironmentDefaults.density,\n vocabulary,\n );\n}\n\n/** Internal provider-scoped coordination used by Tooltip renderers. */\nexport function useTooltipCoordinator(): TooltipCoordinator | null {\n return useContext(TooltipCoordinatorContext);\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { HjmCompositionStyleProp } from "./composition-style.js";
2
+ import { type RatingDescriptor } from "@hjmds/design-contracts/reference-controls";
3
+ export type RatingProps = RatingDescriptor & Readonly<{
4
+ /** Product-localized score and unrated text, also used as the radio name. */
5
+ getValueLabel: (value: number | null) => string;
6
+ disabled?: boolean;
7
+ layoutStyle?: HjmCompositionStyleProp;
8
+ clearLabel?: string;
9
+ name?: string;
10
+ }> & (Readonly<{
11
+ readOnly: true;
12
+ onValueChange?: never;
13
+ }> | Readonly<{
14
+ readOnly?: false;
15
+ onValueChange: (value: number | null) => void;
16
+ }>);
17
+ /** Controlled score input, with a distinct non-interactive average representation. */
18
+ export declare function Rating(props: RatingProps): import("react").JSX.Element;
19
+ //# sourceMappingURL=rating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.d.ts","sourceRoot":"","sources":["../src/rating.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAGlG,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,QAAQ,CAAC;IACpD,6EAA6E;IAC7E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,GAAG,CAAC,QAAQ,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GAAG,QAAQ,CAAC;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CAAE,CAAC,CAAC,CAAC;AAM3I,sFAAsF;AACtF,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,+BA4BxC"}