@salt-ds/lab 1.0.0-alpha.93 → 1.0.0-alpha.94

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 (131) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/css/salt-lab.css +163 -122
  3. package/dist-cjs/index.js +6 -8
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js +6 -0
  6. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js.map +1 -0
  7. package/dist-cjs/toolbar-next/ToolbarContentNext.js +32 -0
  8. package/dist-cjs/toolbar-next/ToolbarContentNext.js.map +1 -0
  9. package/dist-cjs/toolbar-next/ToolbarNext.css.js +6 -0
  10. package/dist-cjs/toolbar-next/ToolbarNext.css.js.map +1 -0
  11. package/dist-cjs/toolbar-next/ToolbarNext.js +394 -0
  12. package/dist-cjs/toolbar-next/ToolbarNext.js.map +1 -0
  13. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js +6 -0
  14. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js.map +1 -0
  15. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +705 -0
  16. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +1 -0
  17. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +165 -0
  18. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +1 -0
  19. package/dist-cjs/toolbar-next/TooltrayNext.css.js +6 -0
  20. package/dist-cjs/toolbar-next/TooltrayNext.css.js.map +1 -0
  21. package/dist-cjs/toolbar-next/TooltrayNext.js +55 -0
  22. package/dist-cjs/toolbar-next/TooltrayNext.js.map +1 -0
  23. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +391 -0
  24. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -0
  25. package/dist-cjs/toolbar-next/toolbarNextUtils.js +215 -0
  26. package/dist-cjs/toolbar-next/toolbarNextUtils.js.map +1 -0
  27. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +334 -0
  28. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -0
  29. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +743 -0
  30. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +1 -0
  31. package/dist-es/index.js +3 -4
  32. package/dist-es/index.js.map +1 -1
  33. package/dist-es/toolbar-next/ToolbarContentNext.css.js +4 -0
  34. package/dist-es/toolbar-next/ToolbarContentNext.css.js.map +1 -0
  35. package/dist-es/toolbar-next/ToolbarContentNext.js +30 -0
  36. package/dist-es/toolbar-next/ToolbarContentNext.js.map +1 -0
  37. package/dist-es/toolbar-next/ToolbarNext.css.js +4 -0
  38. package/dist-es/toolbar-next/ToolbarNext.css.js.map +1 -0
  39. package/dist-es/toolbar-next/ToolbarNext.js +392 -0
  40. package/dist-es/toolbar-next/ToolbarNext.js.map +1 -0
  41. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js +4 -0
  42. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js.map +1 -0
  43. package/dist-es/toolbar-next/ToolbarNextOverflow.js +700 -0
  44. package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +1 -0
  45. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +159 -0
  46. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +1 -0
  47. package/dist-es/toolbar-next/TooltrayNext.css.js +4 -0
  48. package/dist-es/toolbar-next/TooltrayNext.css.js.map +1 -0
  49. package/dist-es/toolbar-next/TooltrayNext.js +53 -0
  50. package/dist-es/toolbar-next/TooltrayNext.js.map +1 -0
  51. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +372 -0
  52. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -0
  53. package/dist-es/toolbar-next/toolbarNextUtils.js +211 -0
  54. package/dist-es/toolbar-next/toolbarNextUtils.js.map +1 -0
  55. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +332 -0
  56. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -0
  57. package/dist-es/toolbar-next/useToolbarNextOverflow.js +741 -0
  58. package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +1 -0
  59. package/dist-types/index.d.ts +1 -1
  60. package/dist-types/toolbar-next/ToolbarContentNext.d.ts +11 -0
  61. package/dist-types/toolbar-next/ToolbarNext.d.ts +12 -0
  62. package/dist-types/toolbar-next/ToolbarNextOverflow.d.ts +34 -0
  63. package/dist-types/toolbar-next/ToolbarNextOverflowFloatingBoundary.d.ts +16 -0
  64. package/dist-types/toolbar-next/TooltrayNext.d.ts +37 -0
  65. package/dist-types/toolbar-next/index.d.ts +3 -0
  66. package/dist-types/toolbar-next/toolbarNextKeyboardUtils.d.ts +39 -0
  67. package/dist-types/toolbar-next/toolbarNextUtils.d.ts +42 -0
  68. package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +41 -0
  69. package/dist-types/toolbar-next/useToolbarNextOverflow.d.ts +37 -0
  70. package/package.json +2 -2
  71. package/dist-cjs/tree/Tree.css.js +0 -6
  72. package/dist-cjs/tree/Tree.css.js.map +0 -1
  73. package/dist-cjs/tree/Tree.js +0 -303
  74. package/dist-cjs/tree/Tree.js.map +0 -1
  75. package/dist-cjs/tree/TreeContext.js +0 -31
  76. package/dist-cjs/tree/TreeContext.js.map +0 -1
  77. package/dist-cjs/tree/TreeNode.css.js +0 -6
  78. package/dist-cjs/tree/TreeNode.css.js.map +0 -1
  79. package/dist-cjs/tree/TreeNode.js +0 -103
  80. package/dist-cjs/tree/TreeNode.js.map +0 -1
  81. package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +0 -6
  82. package/dist-cjs/tree/TreeNodeExpansionIcon.css.js.map +0 -1
  83. package/dist-cjs/tree/TreeNodeExpansionIcon.js +0 -62
  84. package/dist-cjs/tree/TreeNodeExpansionIcon.js.map +0 -1
  85. package/dist-cjs/tree/TreeNodeLabel.css.js +0 -6
  86. package/dist-cjs/tree/TreeNodeLabel.css.js.map +0 -1
  87. package/dist-cjs/tree/TreeNodeLabel.js +0 -26
  88. package/dist-cjs/tree/TreeNodeLabel.js.map +0 -1
  89. package/dist-cjs/tree/TreeNodeTrigger.css.js +0 -6
  90. package/dist-cjs/tree/TreeNodeTrigger.css.js.map +0 -1
  91. package/dist-cjs/tree/TreeNodeTrigger.js +0 -153
  92. package/dist-cjs/tree/TreeNodeTrigger.js.map +0 -1
  93. package/dist-cjs/tree/treeModel.js +0 -61
  94. package/dist-cjs/tree/treeModel.js.map +0 -1
  95. package/dist-cjs/tree/useTree.js +0 -337
  96. package/dist-cjs/tree/useTree.js.map +0 -1
  97. package/dist-es/tree/Tree.css.js +0 -4
  98. package/dist-es/tree/Tree.css.js.map +0 -1
  99. package/dist-es/tree/Tree.js +0 -301
  100. package/dist-es/tree/Tree.js.map +0 -1
  101. package/dist-es/tree/TreeContext.js +0 -26
  102. package/dist-es/tree/TreeContext.js.map +0 -1
  103. package/dist-es/tree/TreeNode.css.js +0 -4
  104. package/dist-es/tree/TreeNode.css.js.map +0 -1
  105. package/dist-es/tree/TreeNode.js +0 -101
  106. package/dist-es/tree/TreeNode.js.map +0 -1
  107. package/dist-es/tree/TreeNodeExpansionIcon.css.js +0 -4
  108. package/dist-es/tree/TreeNodeExpansionIcon.css.js.map +0 -1
  109. package/dist-es/tree/TreeNodeExpansionIcon.js +0 -60
  110. package/dist-es/tree/TreeNodeExpansionIcon.js.map +0 -1
  111. package/dist-es/tree/TreeNodeLabel.css.js +0 -4
  112. package/dist-es/tree/TreeNodeLabel.css.js.map +0 -1
  113. package/dist-es/tree/TreeNodeLabel.js +0 -24
  114. package/dist-es/tree/TreeNodeLabel.js.map +0 -1
  115. package/dist-es/tree/TreeNodeTrigger.css.js +0 -4
  116. package/dist-es/tree/TreeNodeTrigger.css.js.map +0 -1
  117. package/dist-es/tree/TreeNodeTrigger.js +0 -151
  118. package/dist-es/tree/TreeNodeTrigger.js.map +0 -1
  119. package/dist-es/tree/treeModel.js +0 -57
  120. package/dist-es/tree/treeModel.js.map +0 -1
  121. package/dist-es/tree/useTree.js +0 -335
  122. package/dist-es/tree/useTree.js.map +0 -1
  123. package/dist-types/tree/Tree.d.ts +0 -36
  124. package/dist-types/tree/TreeContext.d.ts +0 -77
  125. package/dist-types/tree/TreeNode.d.ts +0 -25
  126. package/dist-types/tree/TreeNodeExpansionIcon.d.ts +0 -4
  127. package/dist-types/tree/TreeNodeLabel.d.ts +0 -4
  128. package/dist-types/tree/TreeNodeTrigger.d.ts +0 -8
  129. package/dist-types/tree/index.d.ts +0 -4
  130. package/dist-types/tree/treeModel.d.ts +0 -24
  131. package/dist-types/tree/useTree.d.ts +0 -68
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarNextOverflow.js","sources":["../src/toolbar-next/ToolbarNextOverflow.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport {\n Button,\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useIcon,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { compute } from \"compute-scroll-into-view\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ToolbarContentNext } from \"./ToolbarContentNext\";\nimport toolbarNextOverflowCss from \"./ToolbarNextOverflow.css\";\nimport {\n getToolbarNextOverflowBoundaryKey,\n isTargetInsideOverflowBoundary,\n ToolbarNextOverflowFloatingComponentProvider,\n useToolbarNextOverflowFloatingBoundary,\n} from \"./ToolbarNextOverflowFloatingBoundary\";\nimport {\n getDocumentFocusableElements,\n getToolbarNextFocusMemory,\n getToolbarNextScopeFocusableElements,\n getToolbarNextTabMoveTarget,\n scheduleToolbarNextFocus,\n shouldToolbarNextPreserveNativeTab,\n TOOLBAR_NEXT_GROUP_KEY_ATTR,\n TOOLBAR_NEXT_ITEM_ATTR,\n TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_NEXT_SCOPE_ROOT_ATTR,\n type ToolbarNextFocusMemory,\n toolbarNextFocusableSelector,\n} from \"./toolbarNextKeyboardUtils\";\nimport type {\n ToolbarNextContentModel,\n ToolbarNextOverflowItem,\n} from \"./toolbarNextUtils\";\nimport { buildContentOverflowRenderSlots } from \"./toolbarNextUtils\";\nimport { useToolbarNextKeyboardNavigation } from \"./useToolbarNextKeyboardNavigation\";\nimport type { ToolbarNextOverflowGroup } from \"./useToolbarNextOverflow\";\n\nconst withBaseName = makePrefixer(\"saltToolbarNextOverflow\");\n\nexport type ToolbarNextItemHostKind = \"main\" | \"measurement\" | \"overflow\";\n\nconst toolbarNextStatefulFocusRootSelector = [\n \".saltDateInput-focused\",\n \".saltInput-focused\",\n].join(\", \");\n\nconst toolbarNextOverflowFocusScrollRootSelector = [\n \".saltComboBox\",\n \".saltDateInput\",\n \".saltDropdown\",\n \".saltInput\",\n \".saltSwitch\",\n].join(\", \");\n\ntype ToolbarNextOverflowOpenModality = \"keyboard\" | \"pointer\" | null;\n\nfunction createToolbarNextFocusEvent(\n eventName: \"blur\" | \"focusout\",\n target: HTMLElement,\n relatedTarget: Element | null,\n) {\n const FocusEventCtor = target.ownerDocument.defaultView?.FocusEvent;\n const eventInit = {\n bubbles: eventName === \"focusout\",\n relatedTarget,\n };\n\n return FocusEventCtor\n ? new FocusEventCtor(eventName, eventInit)\n : new Event(eventName, eventInit);\n}\n\nfunction notifyToolbarNextReparentedFocusLoss(mountNode: HTMLDivElement) {\n const activeElement = mountNode.ownerDocument.activeElement;\n\n if (mountNode.contains(activeElement)) {\n return;\n }\n\n // Browser focus can move to the document when a portaled toolbar item is\n // reparented, without notifying controls that keep their own focused state.\n const staleFocusTargets = Array.from(\n mountNode.querySelectorAll<HTMLElement>(\n toolbarNextStatefulFocusRootSelector,\n ),\n )\n .map((root) =>\n root.querySelector<HTMLElement>(toolbarNextFocusableSelector),\n )\n .filter((target): target is HTMLElement => target != null);\n\n for (const target of staleFocusTargets) {\n const relatedTarget =\n activeElement instanceof Element ? activeElement : null;\n\n target.dispatchEvent(\n createToolbarNextFocusEvent(\"blur\", target, relatedTarget),\n );\n target.dispatchEvent(\n createToolbarNextFocusEvent(\"focusout\", target, relatedTarget),\n );\n }\n}\n\nfunction getToolbarNextOverflowFocusScrollTarget(target: HTMLElement) {\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`);\n const controlRoot = target.closest<HTMLElement>(\n toolbarNextOverflowFocusScrollRootSelector,\n );\n\n return controlRoot && itemRoot?.contains(controlRoot) ? controlRoot : target;\n}\n\nfunction getToolbarNextOverflowPanelInlinePadding(target: HTMLElement) {\n const panelContent = target.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const styles =\n panelContent?.ownerDocument.defaultView?.getComputedStyle(panelContent);\n\n return {\n left: Number.parseFloat(styles?.paddingLeft ?? \"0\") || 0,\n right: Number.parseFloat(styles?.paddingRight ?? \"0\") || 0,\n };\n}\n\nfunction scrollToolbarNextOverflowTargetIntoView(\n panel: HTMLDivElement | null,\n target: HTMLElement,\n) {\n if (!panel || !panel.contains(target)) {\n return;\n }\n\n const scrollTarget = getToolbarNextOverflowFocusScrollTarget(target);\n const actions = compute(scrollTarget, {\n block: \"nearest\",\n boundary: panel,\n inline: \"nearest\",\n scrollMode: \"if-needed\",\n });\n\n for (const { el, left, top } of actions) {\n if (el === panel) {\n const targetRect = scrollTarget.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportLeft = panelRect.left + panel.clientLeft;\n const viewportRight = viewportLeft + panel.clientWidth;\n const padding = getToolbarNextOverflowPanelInlinePadding(scrollTarget);\n const nextLeft =\n targetRect.left < viewportLeft + padding.left\n ? left - padding.left\n : targetRect.right > viewportRight - padding.right\n ? left + padding.right\n : left;\n\n el.scrollLeft = Math.max(0, nextLeft);\n } else {\n el.scrollLeft = left;\n }\n\n el.scrollTop = top;\n }\n}\n\nfunction canSeedOverflowFocusMemory(\n focusMemory: ToolbarNextFocusMemory | null | undefined,\n group: ToolbarNextOverflowGroup,\n): focusMemory is Extract<ToolbarNextFocusMemory, { type: \"item\" }> {\n return (\n focusMemory?.type === \"item\" &&\n group.items.some((item) => item.id === focusMemory.itemId)\n );\n}\n\ninterface ToolbarNextOverflowOwnersProps {\n hostNodes: Record<string, HTMLDivElement | null>;\n items: ToolbarNextOverflowItem[];\n}\n\nfunction ToolbarNextOverflowItemOwner({\n host,\n item,\n}: {\n host: HTMLDivElement | null;\n item: ToolbarNextOverflowItem;\n}) {\n const targetWindow = useWindow();\n const [mountNode, setMountNode] = useState<HTMLDivElement | null>(null);\n const mainToolbarTabIndexMemoryRef = useRef(\n new WeakMap<HTMLElement, string | null>(),\n );\n const lastOverflowBoundaryKeyRef = useRef<string | null>(null);\n const currentOverflowBoundaryKey = getToolbarNextOverflowBoundaryKey(host);\n\n if (host) {\n lastOverflowBoundaryKeyRef.current = currentOverflowBoundaryKey;\n }\n\n const boundaryKey = host\n ? currentOverflowBoundaryKey\n : lastOverflowBoundaryKeyRef.current;\n\n useIsomorphicLayoutEffect(() => {\n const nextMountNode = targetWindow?.document.createElement(\"div\");\n\n if (!nextMountNode) {\n return;\n }\n\n nextMountNode.className = withBaseName(\"contentHost\");\n setMountNode(nextMountNode);\n\n return () => {\n nextMountNode.parentElement?.removeChild(nextMountNode);\n };\n }, [targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n if (!mountNode) {\n return;\n }\n\n if (host) {\n if (mountNode.parentElement !== host) {\n host.appendChild(mountNode);\n notifyToolbarNextReparentedFocusLoss(mountNode);\n }\n\n const isMainToolbarHost =\n host\n .closest(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR) === \"main\";\n\n if (isMainToolbarHost) {\n const focusableElements = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n );\n\n for (const element of focusableElements) {\n const rememberedTabIndex =\n mainToolbarTabIndexMemoryRef.current.get(element);\n\n if (rememberedTabIndex !== undefined) {\n if (rememberedTabIndex == null) {\n element.removeAttribute(\"tabindex\");\n } else {\n element.setAttribute(\"tabindex\", rememberedTabIndex);\n }\n }\n }\n\n for (const element of focusableElements) {\n mainToolbarTabIndexMemoryRef.current.set(\n element,\n element.getAttribute(\"tabindex\"),\n );\n }\n }\n\n return;\n }\n\n notifyToolbarNextReparentedFocusLoss(mountNode);\n mountNode.parentElement?.removeChild(mountNode);\n }, [host, mountNode]);\n\n if (!mountNode) {\n return null;\n }\n\n const clonedItem = cloneElement(\n item.element as ReactElement<Record<string, ReactNode>>,\n {\n [TOOLBAR_NEXT_GROUP_KEY_ATTR]: item.overflowGroupKey,\n [TOOLBAR_NEXT_ITEM_ATTR]: item.id,\n },\n );\n const itemContent = (\n <ToolbarNextOverflowFloatingComponentProvider boundaryKey={boundaryKey}>\n {clonedItem}\n </ToolbarNextOverflowFloatingComponentProvider>\n );\n\n return createPortal(itemContent, mountNode);\n}\n\nexport function ToolbarNextOverflowOwners({\n hostNodes,\n items,\n}: ToolbarNextOverflowOwnersProps) {\n return (\n <>\n {items.map((item) => (\n <ToolbarNextOverflowItemOwner\n host={hostNodes[item.id] ?? null}\n item={item}\n key={item.id}\n />\n ))}\n </>\n );\n}\n\nfunction cloneDecorations(\n itemId: string,\n decorations: ReactElement[],\n slot: \"leading\" | \"trailing\",\n) {\n return Children.toArray(decorations).flatMap((decoration) => {\n if (!isValidElement(decoration)) {\n return [];\n }\n\n return [\n cloneElement(decoration, {\n key: `${itemId}-${slot}-${String(\n decoration.key ??\n (typeof decoration.type === \"string\"\n ? decoration.type\n : \"decoration\"),\n )}`,\n }),\n ];\n });\n}\n\nexport function ToolbarNextOverflowTriggerContent({\n label,\n named,\n}: {\n label: string;\n named: boolean;\n}) {\n const { OverflowIcon } = useIcon();\n\n if (named) {\n return <>{label}</>;\n }\n\n return <OverflowIcon aria-hidden />;\n}\n\nfunction getOverflowTriggerLabel(group: ToolbarNextOverflowGroup) {\n return group.named\n ? `${group.label} overflow. Hidden controls.`\n : \"Overflow. Hidden controls.\";\n}\n\ninterface ToolbarNextOverflowMenuProps {\n focusMemoryRef?: RefObject<ToolbarNextFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarNextItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n group: ToolbarNextOverflowGroup;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n}\n\nexport function ToolbarNextOverflowMenu({\n focusMemoryRef,\n getItemHostRef,\n group,\n onItemFocus,\n}: ToolbarNextOverflowMenuProps) {\n const panelId = useId();\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelContentRef = useRef<HTMLDivElement>(null);\n const [panelContentNode, setPanelContentNode] =\n useState<HTMLDivElement | null>(null);\n const wasOpenRef = useRef(false);\n const focusedOpenPanelRef = useRef(false);\n const openModalityRef = useRef<ToolbarNextOverflowOpenModality>(null);\n const floatingBoundary = useToolbarNextOverflowFloatingBoundary();\n const {\n focusEntryTarget,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberedFocusRef,\n } = useToolbarNextKeyboardNavigation({\n includeTabIndexMinusOne: true,\n items: group.items,\n scopeRef: panelContentRef,\n });\n\n const { refs, x, y, strategy, context, elements } = useFloatingUI({\n open,\n onOpenChange(nextOpen, _, reason) {\n setOpen(nextOpen);\n\n if (!nextOpen) {\n openModalityRef.current = null;\n }\n\n if (!nextOpen && reason === \"escape-key\") {\n scheduleToolbarNextFocus(triggerRef.current);\n }\n },\n placement: \"bottom-end\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context, {\n escapeKey: false,\n outsidePress(event) {\n return !isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.target,\n );\n },\n }),\n ]);\n\n const handleTriggerKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open && [\"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n openModalityRef.current = \"keyboard\";\n setOpen(true);\n return;\n }\n\n if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n }\n },\n [open],\n );\n\n const handleTriggerPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handleTriggerMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handlePanelKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (\n panelContent &&\n target instanceof HTMLElement &&\n shouldToolbarNextPreserveNativeTab(target)\n ) {\n const focusableElements = getDocumentFocusableElements(\n panelContent.ownerDocument,\n );\n const currentIndex = focusableElements.indexOf(target);\n const nextFocusTarget =\n focusableElements[currentIndex + (event.shiftKey ? -1 : 1)];\n\n if (\n currentIndex !== -1 &&\n nextFocusTarget &&\n panelContent.contains(nextFocusTarget)\n ) {\n return;\n }\n }\n }\n\n if (event.key === \"Tab\" && !event.shiftKey) {\n const toolbarRoot = triggerRef.current?.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const nextFocusTarget = toolbarRoot\n ? getToolbarNextTabMoveTarget(toolbarRoot, false)\n : null;\n\n if (nextFocusTarget) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(nextFocusTarget);\n }\n\n return;\n }\n\n if (event.key === \"Tab\" && event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n }\n }, []);\n\n const handleTriggerRef = useForkRef<HTMLButtonElement>(\n triggerRef,\n refs.setReference,\n );\n const handlePanelRef = useForkRef<HTMLDivElement>(panelRef, refs.setFloating);\n const handlePanelContentRef = useForkRef<HTMLDivElement>(\n panelContentRef,\n setPanelContentNode,\n );\n const handlePanelFocus = useCallback(\n (event: FocusEvent) => {\n handleScopeFocus(event);\n\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (!panelContent || !(target instanceof HTMLElement)) {\n return;\n }\n\n const focusMemory = getToolbarNextFocusMemory(panelContent, target, {\n includeTabIndexMinusOne: true,\n });\n\n if (focusMemory?.type !== \"item\") {\n return;\n }\n\n scrollToolbarNextOverflowTargetIntoView(panelRef.current, target);\n onItemFocus?.(focusMemory.itemId, focusMemory.controlIndex);\n },\n [handleScopeFocus, onItemFocus],\n );\n const { Component: FloatingComponent } = useFloatingComponent();\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n const externalFocusMemory = focusMemoryRef?.current;\n\n if (canSeedOverflowFocusMemory(externalFocusMemory, group)) {\n rememberedFocusRef.current = externalFocusMemory;\n }\n\n if (openModalityRef.current !== \"pointer\") {\n focusEntryTarget();\n }\n }\n\n wasOpenRef.current = open;\n }, [focusEntryTarget, focusMemoryRef, group, open, rememberedFocusRef]);\n\n useEffect(() => {\n if (!open || !panelContentNode) {\n return;\n }\n\n const handleFocusIn = (event: FocusEvent) => {\n handlePanelFocus(event);\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (\n isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.relatedTarget,\n )\n ) {\n return;\n }\n\n handleScopeBlur(event);\n };\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n handleScopeKeyDown(event);\n };\n const handlePointerDownCapture = (event: PointerEvent) => {\n handleScopePointerDown(event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented) {\n handlePanelKeyDown(event);\n }\n };\n\n panelContentNode.addEventListener(\"focusin\", handleFocusIn);\n panelContentNode.addEventListener(\"focusout\", handleFocusOut);\n panelContentNode.addEventListener(\"keydown\", handleKeyDownCapture, true);\n panelContentNode.addEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n panelContentNode.removeEventListener(\"focusin\", handleFocusIn);\n panelContentNode.removeEventListener(\"focusout\", handleFocusOut);\n panelContentNode.removeEventListener(\n \"keydown\",\n handleKeyDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n handlePanelFocus,\n handlePanelKeyDown,\n handleScopeBlur,\n handleScopeKeyDown,\n handleScopePointerDown,\n floatingBoundary,\n group.key,\n open,\n panelContentNode,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n focusedOpenPanelRef.current = false;\n return;\n }\n\n if (\n !panelContentNode ||\n focusedOpenPanelRef.current ||\n openModalityRef.current === \"pointer\"\n ) {\n return;\n }\n\n const getPanelFocusables = () =>\n getToolbarNextScopeFocusableElements(panelContentNode, {\n includeTabIndexMinusOne: true,\n });\n const focusEntryWhenReady = () => {\n const panelFocusables = getPanelFocusables();\n\n if (panelFocusables.length === 0) {\n return false;\n }\n\n focusedOpenPanelRef.current = true;\n focusEntryTarget();\n return true;\n };\n\n if (focusEntryWhenReady()) {\n return;\n }\n\n const panelWindow = panelContentNode.ownerDocument.defaultView;\n const mutationObserverCtor = panelWindow?.MutationObserver;\n const resizeObserverCtor = panelWindow?.ResizeObserver;\n let mutationObserver: MutationObserver | null = null;\n let resizeObserver: ResizeObserver | null = null;\n\n mutationObserver =\n mutationObserverCtor != null\n ? new mutationObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n resizeObserver =\n resizeObserverCtor != null\n ? new resizeObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n\n mutationObserver?.observe(panelContentNode, {\n childList: true,\n subtree: true,\n });\n resizeObserver?.observe(panelContentNode);\n\n return () => {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n };\n }, [focusEntryTarget, open, panelContentNode]);\n\n return (\n <div\n className={withBaseName(\"menu\")}\n data-overflowgroup={group.overflowGroup}\n >\n <Button\n appearance=\"transparent\"\n aria-controls={panelId}\n aria-expanded={open}\n aria-label={getOverflowTriggerLabel(group)}\n className={withBaseName(\"trigger\")}\n {...{\n [TOOLBAR_NEXT_GROUP_KEY_ATTR]: group.key,\n [TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR]: \"\",\n }}\n {...getReferenceProps({\n onKeyDown: handleTriggerKeyDown,\n onMouseDown: handleTriggerMouseDown,\n onPointerDown: handleTriggerPointerDown,\n })}\n ref={handleTriggerRef}\n sentiment=\"neutral\"\n >\n <ToolbarNextOverflowTriggerContent\n label={group.label}\n named={group.named}\n />\n </Button>\n <FloatingComponent\n {...getFloatingProps({\n role: \"presentation\",\n })}\n className={withBaseName(\"panel\")}\n focusManagerProps={\n context\n ? {\n context,\n initialFocus: -1,\n returnFocus: false,\n modal: false,\n closeOnFocusOut: false,\n }\n : undefined\n }\n id={panelId}\n left={x ?? 0}\n open={open}\n position={strategy}\n ref={handlePanelRef}\n top={y ?? 0}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n >\n <div\n aria-label={`${group.label} overflow`}\n aria-orientation=\"horizontal\"\n className={withBaseName(\"panelContent\")}\n {...{ [TOOLBAR_NEXT_SCOPE_ROOT_ATTR]: group.key }}\n role=\"toolbar\"\n ref={handlePanelContentRef}\n >\n {group.items.map((item, index) => (\n <div\n className={withBaseName(\"panelItem\")}\n key={`${group.id}-${item.id}`}\n >\n {index > 0 &&\n item.leadingDecorations.length > 0 &&\n cloneDecorations(item.id, item.leadingDecorations, \"leading\")}\n <div\n className={withBaseName(\"itemHost\")}\n ref={open ? getItemHostRef(item.id, \"overflow\") : null}\n />\n {cloneDecorations(item.id, item.trailingDecorations, \"trailing\")}\n </div>\n ))}\n </div>\n </FloatingComponent>\n </div>\n );\n}\n\nexport interface ToolbarNextOverflowContentProps {\n focusMemoryRef?: RefObject<ToolbarNextFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarNextItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n getItemRef: (id: string) => (node: HTMLDivElement | null) => void;\n getNamedTriggerRef: (id: string) => (node: HTMLDivElement | null) => void;\n getContentRef: (contentKey: string) => (node: HTMLDivElement | null) => void;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n overflowGroups: ToolbarNextOverflowGroup[];\n overflowedIds: Set<string>;\n content: ToolbarNextContentModel;\n}\n\nexport function ToolbarNextOverflowContent({\n content,\n focusMemoryRef,\n getItemHostRef,\n getItemRef,\n getNamedTriggerRef,\n getContentRef,\n onItemFocus,\n overflowGroups,\n overflowedIds,\n}: ToolbarNextOverflowContentProps) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toolbar-next-overflow\",\n css: toolbarNextOverflowCss,\n window: targetWindow,\n });\n\n const { className, ...contentProps } = content.props;\n const handleContentRef = useForkRef(content.ref, getContentRef(content.key));\n const overflowGroupByKey = new Map(\n overflowGroups.map((group) => [group.key, group] as const),\n );\n\n const renderSlots = buildContentOverflowRenderSlots(\n content.items,\n overflowedIds,\n new Set(overflowGroups.map((group) => group.key)),\n );\n\n return (\n <ToolbarContentNext\n {...contentProps}\n data-implicit={content.implicit || undefined}\n className={clsx(className, withBaseName(\"content\"))}\n position={content.position}\n ref={handleContentRef}\n >\n {renderSlots.map(\n ({\n item,\n overflowed,\n showLeadingDecorations,\n showTrailingDecorations,\n triggerGroupKey,\n }) => {\n const triggerGroup =\n triggerGroupKey != null\n ? overflowGroupByKey.get(triggerGroupKey)\n : undefined;\n\n return (\n <div\n className={withBaseName(\"slot\")}\n data-align={item.align}\n data-priority={item.overflowPriority}\n key={\n triggerGroup\n ? `${content.key}-${triggerGroup.id}-anchor-${item.id}`\n : item.id\n }\n ref={\n triggerGroup ? getNamedTriggerRef(item.id) : getItemRef(item.id)\n }\n >\n {showLeadingDecorations\n ? cloneDecorations(item.id, item.leadingDecorations, \"leading\")\n : null}\n {!overflowed ? (\n <div className={withBaseName(\"item\")}>\n <div\n className={withBaseName(\"itemHost\")}\n ref={getItemHostRef(item.id, \"main\")}\n />\n </div>\n ) : null}\n {triggerGroup ? (\n <div className={withBaseName(\"item\")}>\n <ToolbarNextOverflowMenu\n focusMemoryRef={focusMemoryRef}\n getItemHostRef={getItemHostRef}\n group={triggerGroup}\n onItemFocus={onItemFocus}\n />\n </div>\n ) : null}\n {showTrailingDecorations\n ? cloneDecorations(\n item.id,\n item.trailingDecorations,\n \"trailing\",\n )\n : null}\n </div>\n );\n },\n )}\n </ToolbarContentNext>\n );\n}\n"],"names":["elements","_a","toolbarNextOverflowCss"],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, useForkRef, useFloatingComponent, FloatingComponentProvider } from '@salt-ds/core';
3
+ import { clsx } from 'clsx';
4
+ import { createContext, forwardRef, useContext, useRef, useCallback, useEffect, useMemo } from 'react';
5
+ import { TOOLBAR_NEXT_SCOPE_ROOT_ATTR } from './toolbarNextKeyboardUtils.js';
6
+
7
+ const withBaseName = makePrefixer("saltToolbarNextOverflow");
8
+ const ToolbarNextOverflowFloatingBoundaryContext = createContext(null);
9
+ const ToolbarNextOverflowFloatingComponentContext = createContext(null);
10
+ function isNodeTarget(target) {
11
+ return target != null && "nodeType" in target;
12
+ }
13
+ function containsTarget(element, target) {
14
+ if (!element || !isNodeTarget(target)) {
15
+ return false;
16
+ }
17
+ return element === target || element.contains(target);
18
+ }
19
+ function ToolbarNextOverflowFloatingBoundaryProvider({
20
+ children
21
+ }) {
22
+ const floatingRootsRef = useRef(/* @__PURE__ */ new Map());
23
+ const registerFloatingRoot = useCallback(
24
+ (boundaryKey, root) => {
25
+ let floatingRoots = floatingRootsRef.current.get(boundaryKey);
26
+ if (!floatingRoots) {
27
+ floatingRoots = /* @__PURE__ */ new Set();
28
+ floatingRootsRef.current.set(boundaryKey, floatingRoots);
29
+ }
30
+ floatingRoots.add(root);
31
+ return () => {
32
+ const currentFloatingRoots = floatingRootsRef.current.get(boundaryKey);
33
+ currentFloatingRoots == null ? void 0 : currentFloatingRoots.delete(root);
34
+ if ((currentFloatingRoots == null ? void 0 : currentFloatingRoots.size) === 0) {
35
+ floatingRootsRef.current.delete(boundaryKey);
36
+ }
37
+ };
38
+ },
39
+ []
40
+ );
41
+ const isTargetInsideBoundary = useCallback(
42
+ (boundaryKey, target) => {
43
+ if (!isNodeTarget(target)) {
44
+ return false;
45
+ }
46
+ const floatingRoots = floatingRootsRef.current.get(boundaryKey);
47
+ if (!floatingRoots) {
48
+ return false;
49
+ }
50
+ for (const floatingRoot of floatingRoots) {
51
+ if (!floatingRoot.isConnected) {
52
+ floatingRoots.delete(floatingRoot);
53
+ continue;
54
+ }
55
+ if (floatingRoot === target || floatingRoot.contains(target)) {
56
+ return true;
57
+ }
58
+ }
59
+ if (floatingRoots.size === 0) {
60
+ floatingRootsRef.current.delete(boundaryKey);
61
+ }
62
+ return false;
63
+ },
64
+ []
65
+ );
66
+ const value = useMemo(
67
+ () => ({
68
+ isTargetInsideBoundary,
69
+ registerFloatingRoot
70
+ }),
71
+ [isTargetInsideBoundary, registerFloatingRoot]
72
+ );
73
+ return /* @__PURE__ */ jsx(ToolbarNextOverflowFloatingBoundaryContext.Provider, { value, children });
74
+ }
75
+ function useToolbarNextOverflowFloatingBoundary() {
76
+ return useContext(ToolbarNextOverflowFloatingBoundaryContext);
77
+ }
78
+ function isTargetInsideOverflowBoundary(panelContent, floatingBoundary, boundaryKey, target) {
79
+ if (containsTarget(panelContent, target)) {
80
+ return true;
81
+ }
82
+ return (floatingBoundary == null ? void 0 : floatingBoundary.isTargetInsideBoundary(boundaryKey, target)) ?? false;
83
+ }
84
+ function getToolbarNextOverflowBoundaryKey(host) {
85
+ const scopeRoot = host == null ? void 0 : host.closest(
86
+ `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`
87
+ );
88
+ const boundaryKey = scopeRoot == null ? void 0 : scopeRoot.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR);
89
+ return boundaryKey && boundaryKey !== "main" ? boundaryKey : null;
90
+ }
91
+ const ToolbarNextOverflowFloatingComponent = forwardRef(function ToolbarNextOverflowFloatingComponent2({ className, open, ...props }, ref) {
92
+ const componentContext = useContext(
93
+ ToolbarNextOverflowFloatingComponentContext
94
+ );
95
+ const unregisterRef = useRef(null);
96
+ const registerRef = useCallback(
97
+ (node) => {
98
+ var _a, _b;
99
+ (_a = unregisterRef.current) == null ? void 0 : _a.call(unregisterRef);
100
+ unregisterRef.current = null;
101
+ if (node && open) {
102
+ unregisterRef.current = (componentContext == null ? void 0 : componentContext.boundaryKey) != null ? ((_b = componentContext.floatingBoundary) == null ? void 0 : _b.registerFloatingRoot(
103
+ componentContext.boundaryKey,
104
+ node
105
+ )) ?? null : null;
106
+ }
107
+ },
108
+ [componentContext, open]
109
+ );
110
+ const handleRef = useForkRef(ref, registerRef);
111
+ useEffect(() => {
112
+ return () => {
113
+ var _a;
114
+ (_a = unregisterRef.current) == null ? void 0 : _a.call(unregisterRef);
115
+ unregisterRef.current = null;
116
+ };
117
+ }, []);
118
+ if (!componentContext) {
119
+ return null;
120
+ }
121
+ const { ParentFloatingComponent } = componentContext;
122
+ return /* @__PURE__ */ jsx(
123
+ ParentFloatingComponent,
124
+ {
125
+ className: clsx(
126
+ className,
127
+ componentContext.boundaryKey != null && withBaseName("floatingDescendant")
128
+ ),
129
+ open,
130
+ ...props,
131
+ ref: handleRef
132
+ }
133
+ );
134
+ });
135
+ function ToolbarNextOverflowFloatingComponentProvider({
136
+ boundaryKey,
137
+ children
138
+ }) {
139
+ const { Component: ParentFloatingComponent } = useFloatingComponent();
140
+ const floatingBoundary = useToolbarNextOverflowFloatingBoundary();
141
+ const value = useMemo(
142
+ () => ({
143
+ boundaryKey,
144
+ floatingBoundary,
145
+ ParentFloatingComponent
146
+ }),
147
+ [boundaryKey, floatingBoundary, ParentFloatingComponent]
148
+ );
149
+ return /* @__PURE__ */ jsx(ToolbarNextOverflowFloatingComponentContext.Provider, { value, children: /* @__PURE__ */ jsx(
150
+ FloatingComponentProvider,
151
+ {
152
+ Component: ToolbarNextOverflowFloatingComponent,
153
+ children
154
+ }
155
+ ) });
156
+ }
157
+
158
+ export { ToolbarNextOverflowFloatingBoundaryProvider, ToolbarNextOverflowFloatingComponentProvider, getToolbarNextOverflowBoundaryKey, isTargetInsideOverflowBoundary, useToolbarNextOverflowFloatingBoundary };
159
+ //# sourceMappingURL=ToolbarNextOverflowFloatingBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarNextOverflowFloatingBoundary.js","sources":["../src/toolbar-next/ToolbarNextOverflowFloatingBoundary.tsx"],"sourcesContent":["import {\n type FloatingComponentProps,\n FloatingComponentProvider,\n type FloatingComponentProviderProps,\n makePrefixer,\n useFloatingComponent,\n useForkRef,\n} from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n createContext,\n forwardRef,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { TOOLBAR_NEXT_SCOPE_ROOT_ATTR } from \"./toolbarNextKeyboardUtils\";\n\nconst withBaseName = makePrefixer(\"saltToolbarNextOverflow\");\n\ninterface ToolbarNextOverflowFloatingBoundaryContextValue {\n isTargetInsideBoundary: (\n boundaryKey: string,\n target: EventTarget | null,\n ) => boolean;\n registerFloatingRoot: (boundaryKey: string, root: HTMLElement) => () => void;\n}\n\nconst ToolbarNextOverflowFloatingBoundaryContext =\n createContext<ToolbarNextOverflowFloatingBoundaryContextValue | null>(null);\n\ninterface ToolbarNextOverflowFloatingComponentContextValue {\n boundaryKey: string | null;\n floatingBoundary: ToolbarNextOverflowFloatingBoundaryContextValue | null;\n ParentFloatingComponent: FloatingComponentProviderProps[\"Component\"];\n}\n\nconst ToolbarNextOverflowFloatingComponentContext =\n createContext<ToolbarNextOverflowFloatingComponentContextValue | null>(null);\n\nfunction isNodeTarget(target: EventTarget | null): target is Node {\n return target != null && \"nodeType\" in target;\n}\n\nfunction containsTarget(\n element: HTMLElement | null,\n target: EventTarget | null,\n) {\n if (!element || !isNodeTarget(target)) {\n return false;\n }\n\n return element === target || element.contains(target);\n}\n\nexport function ToolbarNextOverflowFloatingBoundaryProvider({\n children,\n}: {\n children: ReactNode;\n}) {\n const floatingRootsRef = useRef(new Map<string, Set<HTMLElement>>());\n\n const registerFloatingRoot = useCallback(\n (boundaryKey: string, root: HTMLElement) => {\n let floatingRoots = floatingRootsRef.current.get(boundaryKey);\n\n if (!floatingRoots) {\n floatingRoots = new Set<HTMLElement>();\n floatingRootsRef.current.set(boundaryKey, floatingRoots);\n }\n\n floatingRoots.add(root);\n\n return () => {\n const currentFloatingRoots = floatingRootsRef.current.get(boundaryKey);\n\n currentFloatingRoots?.delete(root);\n\n if (currentFloatingRoots?.size === 0) {\n floatingRootsRef.current.delete(boundaryKey);\n }\n };\n },\n [],\n );\n\n const isTargetInsideBoundary = useCallback(\n (boundaryKey: string, target: EventTarget | null) => {\n if (!isNodeTarget(target)) {\n return false;\n }\n\n const floatingRoots = floatingRootsRef.current.get(boundaryKey);\n\n if (!floatingRoots) {\n return false;\n }\n\n for (const floatingRoot of floatingRoots) {\n if (!floatingRoot.isConnected) {\n floatingRoots.delete(floatingRoot);\n continue;\n }\n\n if (floatingRoot === target || floatingRoot.contains(target)) {\n return true;\n }\n }\n\n if (floatingRoots.size === 0) {\n floatingRootsRef.current.delete(boundaryKey);\n }\n\n return false;\n },\n [],\n );\n\n const value = useMemo(\n () => ({\n isTargetInsideBoundary,\n registerFloatingRoot,\n }),\n [isTargetInsideBoundary, registerFloatingRoot],\n );\n\n return (\n <ToolbarNextOverflowFloatingBoundaryContext.Provider value={value}>\n {children}\n </ToolbarNextOverflowFloatingBoundaryContext.Provider>\n );\n}\n\nexport function useToolbarNextOverflowFloatingBoundary() {\n return useContext(ToolbarNextOverflowFloatingBoundaryContext);\n}\n\nexport function isTargetInsideOverflowBoundary(\n panelContent: HTMLElement | null,\n floatingBoundary: ToolbarNextOverflowFloatingBoundaryContextValue | null,\n boundaryKey: string,\n target: EventTarget | null,\n) {\n if (containsTarget(panelContent, target)) {\n return true;\n }\n\n return floatingBoundary?.isTargetInsideBoundary(boundaryKey, target) ?? false;\n}\n\nexport function getToolbarNextOverflowBoundaryKey(host: HTMLElement | null) {\n const scopeRoot = host?.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const boundaryKey = scopeRoot?.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR);\n\n return boundaryKey && boundaryKey !== \"main\" ? boundaryKey : null;\n}\n\nconst ToolbarNextOverflowFloatingComponent = forwardRef<\n HTMLDivElement,\n FloatingComponentProps\n>(function ToolbarNextOverflowFloatingComponent(\n { className, open, ...props },\n ref,\n) {\n const componentContext = useContext(\n ToolbarNextOverflowFloatingComponentContext,\n );\n const unregisterRef = useRef<(() => void) | null>(null);\n const registerRef = useCallback(\n (node: HTMLDivElement | null) => {\n unregisterRef.current?.();\n unregisterRef.current = null;\n\n if (node && open) {\n unregisterRef.current =\n componentContext?.boundaryKey != null\n ? (componentContext.floatingBoundary?.registerFloatingRoot(\n componentContext.boundaryKey,\n node,\n ) ?? null)\n : null;\n }\n },\n [componentContext, open],\n );\n const handleRef = useForkRef<HTMLDivElement>(ref, registerRef);\n\n useEffect(() => {\n return () => {\n unregisterRef.current?.();\n unregisterRef.current = null;\n };\n }, []);\n\n if (!componentContext) {\n return null;\n }\n\n const { ParentFloatingComponent } = componentContext;\n\n return (\n <ParentFloatingComponent\n className={clsx(\n className,\n componentContext.boundaryKey != null &&\n withBaseName(\"floatingDescendant\"),\n )}\n open={open}\n {...props}\n ref={handleRef}\n />\n );\n});\n\nexport function ToolbarNextOverflowFloatingComponentProvider({\n boundaryKey,\n children,\n}: {\n boundaryKey: string | null;\n children: ReactNode;\n}) {\n const { Component: ParentFloatingComponent } = useFloatingComponent();\n const floatingBoundary = useToolbarNextOverflowFloatingBoundary();\n const value = useMemo(\n () => ({\n boundaryKey,\n floatingBoundary,\n ParentFloatingComponent,\n }),\n [boundaryKey, floatingBoundary, ParentFloatingComponent],\n );\n\n return (\n <ToolbarNextOverflowFloatingComponentContext.Provider value={value}>\n <FloatingComponentProvider\n Component={ToolbarNextOverflowFloatingComponent}\n >\n {children}\n </FloatingComponentProvider>\n </ToolbarNextOverflowFloatingComponentContext.Provider>\n );\n}\n"],"names":["ToolbarNextOverflowFloatingComponent"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltTooltrayNext {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: var(--salt-spacing-100);\n min-width: 0;\n}\n\n.saltTooltrayNext > * {\n flex-shrink: 0;\n}\n\n.saltTooltrayNext[data-align=\"end\"] {\n margin-inline-start: auto;\n}\n\n.saltTooltrayNext[data-align=\"center\"] {\n margin-inline-start: auto;\n margin-inline-end: auto;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=TooltrayNext.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TooltrayNext.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,53 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef } from 'react';
7
+ import css_248z from './TooltrayNext.css.js';
8
+
9
+ const withBaseName = makePrefixer("saltTooltrayNext");
10
+ const TooltrayNext = forwardRef(
11
+ function TooltrayNext2({
12
+ "aria-label": ariaLabel,
13
+ "aria-labelledby": ariaLabelledby,
14
+ align = "start",
15
+ children,
16
+ className,
17
+ overflowGroup = "shared",
18
+ overflowLabel,
19
+ overflowMode = "independent",
20
+ overflowPriority = 0,
21
+ role,
22
+ ...rest
23
+ }, ref) {
24
+ const targetWindow = useWindow();
25
+ useComponentCssInjection({
26
+ testId: "salt-tooltray-next",
27
+ css: css_248z,
28
+ window: targetWindow
29
+ });
30
+ return /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ className: clsx(withBaseName(), className),
34
+ ...rest,
35
+ "data-align": align,
36
+ "data-overflow-group": overflowGroup,
37
+ "data-overflow-label": overflowLabel,
38
+ "data-overflow-mode": overflowMode,
39
+ "data-overflow-priority": overflowPriority,
40
+ ref,
41
+ role,
42
+ ...role != null ? {
43
+ "aria-label": ariaLabel,
44
+ "aria-labelledby": ariaLabelledby
45
+ } : {},
46
+ children
47
+ }
48
+ );
49
+ }
50
+ );
51
+
52
+ export { TooltrayNext };
53
+ //# sourceMappingURL=TooltrayNext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TooltrayNext.js","sources":["../src/toolbar-next/TooltrayNext.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport tooltrayCss from \"./TooltrayNext.css\";\n\nexport type TooltrayNextOverflowMode = \"none\" | \"independent\" | \"grouped\";\n\nexport interface TooltrayNextProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"align\"> {\n /**\n * Alignment of the tooltray.\n * - When a `TooltrayNext` is used directly inside `ToolbarNext`, this acts as\n * shorthand for which toolbar band the tray belongs to.\n * - When a `TooltrayNext` is used inside `ToolbarContentNext`, this alignment is\n * local to that content area.\n *\n * Defaults to `\"start\"`.\n */\n align?: \"start\" | \"end\" | \"center\";\n /**\n * Controls how this tray participates in `ToolbarNext` overflow.\n *\n * Defaults to `\"independent\"`.\n */\n overflowMode?: TooltrayNextOverflowMode;\n /**\n * Higher numbers overflow before lower numbers.\n *\n * Defaults to `0`.\n */\n overflowPriority?: number;\n /**\n * Collapse this tray into the shared overflow or a named local overflow.\n *\n * Defaults to `\"shared\"`.\n */\n overflowGroup?: \"shared\" | string;\n /**\n * Accessible label for the named overflow trigger.\n */\n overflowLabel?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltTooltrayNext\");\n\nexport const TooltrayNext = forwardRef<HTMLDivElement, TooltrayNextProps>(\n function TooltrayNext(\n {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n align = \"start\",\n children,\n className,\n overflowGroup = \"shared\",\n overflowLabel,\n overflowMode = \"independent\",\n overflowPriority = 0,\n role,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tooltray-next\",\n css: tooltrayCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n {...rest}\n data-align={align}\n data-overflow-group={overflowGroup}\n data-overflow-label={overflowLabel}\n data-overflow-mode={overflowMode}\n data-overflow-priority={overflowPriority}\n ref={ref}\n role={role}\n {...(role != null\n ? {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n }\n : {})}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["TooltrayNext","tooltrayCss"],"mappings":";;;;;;;;AA8CA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA;AAE7C,MAAM,YAAA,GAAe,UAAA;AAAA,EAC1B,SAASA,aAAAA,CACP;AAAA,IACE,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,cAAA;AAAA,IACnB,KAAA,GAAQ,OAAA;AAAA,IACR,QAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA,GAAgB,QAAA;AAAA,IAChB,aAAA;AAAA,IACA,YAAA,GAAe,aAAA;AAAA,IACf,gBAAA,GAAmB,CAAA;AAAA,IACnB,IAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,oBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACxC,GAAG,IAAA;AAAA,QACJ,YAAA,EAAY,KAAA;AAAA,QACZ,qBAAA,EAAqB,aAAA;AAAA,QACrB,qBAAA,EAAqB,aAAA;AAAA,QACrB,oBAAA,EAAoB,YAAA;AAAA,QACpB,wBAAA,EAAwB,gBAAA;AAAA,QACxB,GAAA;AAAA,QACA,IAAA;AAAA,QACC,GAAI,QAAQ,IAAA,GACT;AAAA,UACE,YAAA,EAAc,SAAA;AAAA,UACd,iBAAA,EAAmB;AAAA,YAErB,EAAC;AAAA,QAEJ;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}