@salt-ds/lab 1.0.0-alpha.87 → 1.0.0-alpha.89

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 (177) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/css/salt-lab.css +64 -45
  3. package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
  4. package/dist-cjs/contact-details/ContactDetails.css.js +1 -1
  5. package/dist-cjs/list-deprecated/ListStateContext.js +1 -1
  6. package/dist-cjs/list-deprecated/ListStateContext.js.map +1 -1
  7. package/dist-cjs/tabs-next/TabBar.css.js +1 -1
  8. package/dist-cjs/tabs-next/TabBar.js +1 -1
  9. package/dist-cjs/tabs-next/TabBar.js.map +1 -1
  10. package/dist-cjs/tabs-next/TabListLayoutContext.js +13 -0
  11. package/dist-cjs/tabs-next/TabListLayoutContext.js.map +1 -0
  12. package/dist-cjs/tabs-next/TabListNext.css.js +1 -1
  13. package/dist-cjs/tabs-next/TabListNext.js +179 -33
  14. package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
  15. package/dist-cjs/tabs-next/TabNext.js +111 -7
  16. package/dist-cjs/tabs-next/TabNext.js.map +1 -1
  17. package/dist-cjs/tabs-next/TabNextAction.js +25 -2
  18. package/dist-cjs/tabs-next/TabNextAction.js.map +1 -1
  19. package/dist-cjs/tabs-next/TabNextPanel.js +31 -16
  20. package/dist-cjs/tabs-next/TabNextPanel.js.map +1 -1
  21. package/dist-cjs/tabs-next/TabNextTrigger.js +110 -9
  22. package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
  23. package/dist-cjs/tabs-next/TabOverflowList.css.js +1 -1
  24. package/dist-cjs/tabs-next/TabOverflowList.js +168 -64
  25. package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
  26. package/dist-cjs/tabs-next/TabSlot.js +30 -0
  27. package/dist-cjs/tabs-next/TabSlot.js.map +1 -0
  28. package/dist-cjs/tabs-next/TabSlotRegistryContext.js +16 -0
  29. package/dist-cjs/tabs-next/TabSlotRegistryContext.js.map +1 -0
  30. package/dist-cjs/tabs-next/TabsNext.css.js +6 -0
  31. package/dist-cjs/tabs-next/TabsNext.css.js.map +1 -0
  32. package/dist-cjs/tabs-next/TabsNext.js +113 -47
  33. package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
  34. package/dist-cjs/tabs-next/TabsNextContext.js +17 -3
  35. package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
  36. package/dist-cjs/tabs-next/domUtils.js +13 -0
  37. package/dist-cjs/tabs-next/domUtils.js.map +1 -0
  38. package/dist-cjs/tabs-next/hooks/overflowMath.js +86 -0
  39. package/dist-cjs/tabs-next/hooks/overflowMath.js.map +1 -0
  40. package/dist-cjs/tabs-next/hooks/useCollection.js +147 -41
  41. package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
  42. package/dist-cjs/tabs-next/hooks/useFocusWithRetry.js +64 -0
  43. package/dist-cjs/tabs-next/hooks/useFocusWithRetry.js.map +1 -0
  44. package/dist-cjs/tabs-next/hooks/useOverflow.js +240 -156
  45. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  46. package/dist-cjs/tabs-next/hooks/useOverflowLayoutState.js +99 -0
  47. package/dist-cjs/tabs-next/hooks/useOverflowLayoutState.js.map +1 -0
  48. package/dist-cjs/tabs-next/hooks/useOverflowSelectionState.js +60 -0
  49. package/dist-cjs/tabs-next/hooks/useOverflowSelectionState.js.map +1 -0
  50. package/dist-cjs/tabs-next/hooks/useRenderedTabWidth.js +92 -0
  51. package/dist-cjs/tabs-next/hooks/useRenderedTabWidth.js.map +1 -0
  52. package/dist-cjs/tabs-next/hooks/useRenderedTabsRegistry.js +200 -0
  53. package/dist-cjs/tabs-next/hooks/useRenderedTabsRegistry.js.map +1 -0
  54. package/dist-cjs/tabs-next/hooks/useTabListRecovery.js +76 -0
  55. package/dist-cjs/tabs-next/hooks/useTabListRecovery.js.map +1 -0
  56. package/dist-cjs/tabs-next/hooks/useTabRemovalHandler.js +165 -0
  57. package/dist-cjs/tabs-next/hooks/useTabRemovalHandler.js.map +1 -0
  58. package/dist-cjs/tabs-next/hooks/useTabSelectionFocus.js +80 -0
  59. package/dist-cjs/tabs-next/hooks/useTabSelectionFocus.js.map +1 -0
  60. package/dist-cjs/tabs-next/widthMeasurement.js +42 -0
  61. package/dist-cjs/tabs-next/widthMeasurement.js.map +1 -0
  62. package/dist-cjs/tree/Tree.css.js +1 -1
  63. package/dist-cjs/tree/TreeNode.css.js +1 -1
  64. package/dist-cjs/tree/TreeNode.js +1 -1
  65. package/dist-cjs/tree/TreeNode.js.map +1 -1
  66. package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +1 -1
  67. package/dist-cjs/tree/TreeNodeTrigger.css.js +1 -1
  68. package/dist-cjs/tree/TreeNodeTrigger.js +2 -2
  69. package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -1
  70. package/dist-cjs/utils/useEventCallback.js +5 -5
  71. package/dist-cjs/utils/useEventCallback.js.map +1 -1
  72. package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
  73. package/dist-es/contact-details/ContactDetails.css.js +1 -1
  74. package/dist-es/list-deprecated/ListStateContext.js +1 -1
  75. package/dist-es/list-deprecated/ListStateContext.js.map +1 -1
  76. package/dist-es/tabs-next/TabBar.css.js +1 -1
  77. package/dist-es/tabs-next/TabBar.js +1 -1
  78. package/dist-es/tabs-next/TabBar.js.map +1 -1
  79. package/dist-es/tabs-next/TabListLayoutContext.js +10 -0
  80. package/dist-es/tabs-next/TabListLayoutContext.js.map +1 -0
  81. package/dist-es/tabs-next/TabListNext.css.js +1 -1
  82. package/dist-es/tabs-next/TabListNext.js +182 -36
  83. package/dist-es/tabs-next/TabListNext.js.map +1 -1
  84. package/dist-es/tabs-next/TabNext.js +113 -9
  85. package/dist-es/tabs-next/TabNext.js.map +1 -1
  86. package/dist-es/tabs-next/TabNextAction.js +25 -2
  87. package/dist-es/tabs-next/TabNextAction.js.map +1 -1
  88. package/dist-es/tabs-next/TabNextPanel.js +31 -16
  89. package/dist-es/tabs-next/TabNextPanel.js.map +1 -1
  90. package/dist-es/tabs-next/TabNextTrigger.js +110 -9
  91. package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
  92. package/dist-es/tabs-next/TabOverflowList.css.js +1 -1
  93. package/dist-es/tabs-next/TabOverflowList.js +172 -68
  94. package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
  95. package/dist-es/tabs-next/TabSlot.js +28 -0
  96. package/dist-es/tabs-next/TabSlot.js.map +1 -0
  97. package/dist-es/tabs-next/TabSlotRegistryContext.js +13 -0
  98. package/dist-es/tabs-next/TabSlotRegistryContext.js.map +1 -0
  99. package/dist-es/tabs-next/TabsNext.css.js +4 -0
  100. package/dist-es/tabs-next/TabsNext.css.js.map +1 -0
  101. package/dist-es/tabs-next/TabsNext.js +114 -48
  102. package/dist-es/tabs-next/TabsNext.js.map +1 -1
  103. package/dist-es/tabs-next/TabsNextContext.js +17 -3
  104. package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
  105. package/dist-es/tabs-next/domUtils.js +11 -0
  106. package/dist-es/tabs-next/domUtils.js.map +1 -0
  107. package/dist-es/tabs-next/hooks/overflowMath.js +82 -0
  108. package/dist-es/tabs-next/hooks/overflowMath.js.map +1 -0
  109. package/dist-es/tabs-next/hooks/useCollection.js +148 -42
  110. package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
  111. package/dist-es/tabs-next/hooks/useFocusWithRetry.js +62 -0
  112. package/dist-es/tabs-next/hooks/useFocusWithRetry.js.map +1 -0
  113. package/dist-es/tabs-next/hooks/useOverflow.js +242 -158
  114. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  115. package/dist-es/tabs-next/hooks/useOverflowLayoutState.js +97 -0
  116. package/dist-es/tabs-next/hooks/useOverflowLayoutState.js.map +1 -0
  117. package/dist-es/tabs-next/hooks/useOverflowSelectionState.js +58 -0
  118. package/dist-es/tabs-next/hooks/useOverflowSelectionState.js.map +1 -0
  119. package/dist-es/tabs-next/hooks/useRenderedTabWidth.js +90 -0
  120. package/dist-es/tabs-next/hooks/useRenderedTabWidth.js.map +1 -0
  121. package/dist-es/tabs-next/hooks/useRenderedTabsRegistry.js +198 -0
  122. package/dist-es/tabs-next/hooks/useRenderedTabsRegistry.js.map +1 -0
  123. package/dist-es/tabs-next/hooks/useTabListRecovery.js +74 -0
  124. package/dist-es/tabs-next/hooks/useTabListRecovery.js.map +1 -0
  125. package/dist-es/tabs-next/hooks/useTabRemovalHandler.js +163 -0
  126. package/dist-es/tabs-next/hooks/useTabRemovalHandler.js.map +1 -0
  127. package/dist-es/tabs-next/hooks/useTabSelectionFocus.js +78 -0
  128. package/dist-es/tabs-next/hooks/useTabSelectionFocus.js.map +1 -0
  129. package/dist-es/tabs-next/widthMeasurement.js +36 -0
  130. package/dist-es/tabs-next/widthMeasurement.js.map +1 -0
  131. package/dist-es/tree/Tree.css.js +1 -1
  132. package/dist-es/tree/TreeNode.css.js +1 -1
  133. package/dist-es/tree/TreeNode.js +1 -1
  134. package/dist-es/tree/TreeNode.js.map +1 -1
  135. package/dist-es/tree/TreeNodeExpansionIcon.css.js +1 -1
  136. package/dist-es/tree/TreeNodeTrigger.css.js +1 -1
  137. package/dist-es/tree/TreeNodeTrigger.js +2 -2
  138. package/dist-es/tree/TreeNodeTrigger.js.map +1 -1
  139. package/dist-es/utils/useEventCallback.js +5 -5
  140. package/dist-es/utils/useEventCallback.js.map +1 -1
  141. package/dist-types/cascading-menu/internal/useMenuTriggerHandlers.d.ts +1 -1
  142. package/dist-types/list-deprecated/ListStateContext.d.ts +7 -2
  143. package/dist-types/tabs-next/TabListLayoutContext.d.ts +9 -0
  144. package/dist-types/tabs-next/TabNext.d.ts +1 -1
  145. package/dist-types/tabs-next/TabNextPanel.d.ts +2 -1
  146. package/dist-types/tabs-next/TabOverflowList.d.ts +3 -4
  147. package/dist-types/tabs-next/TabSlot.d.ts +6 -0
  148. package/dist-types/tabs-next/TabSlotRegistryContext.d.ts +5 -0
  149. package/dist-types/tabs-next/TabsNext.d.ts +2 -1
  150. package/dist-types/tabs-next/TabsNextContext.d.ts +26 -4
  151. package/dist-types/tabs-next/domUtils.d.ts +1 -0
  152. package/dist-types/tabs-next/hooks/overflowMath.d.ts +18 -0
  153. package/dist-types/tabs-next/hooks/useCollection.d.ts +15 -3
  154. package/dist-types/tabs-next/hooks/useFocusWithRetry.d.ts +9 -0
  155. package/dist-types/tabs-next/hooks/useOverflow.d.ts +5 -5
  156. package/dist-types/tabs-next/hooks/useOverflowLayoutState.d.ts +13 -0
  157. package/dist-types/tabs-next/hooks/useOverflowSelectionState.d.ts +13 -0
  158. package/dist-types/tabs-next/hooks/useRenderedTabWidth.d.ts +12 -0
  159. package/dist-types/tabs-next/hooks/useRenderedTabsRegistry.d.ts +12 -0
  160. package/dist-types/tabs-next/hooks/useTabListRecovery.d.ts +12 -0
  161. package/dist-types/tabs-next/hooks/useTabRemovalHandler.d.ts +32 -0
  162. package/dist-types/tabs-next/hooks/useTabSelectionFocus.d.ts +15 -0
  163. package/dist-types/tabs-next/widthMeasurement.d.ts +5 -0
  164. package/dist-types/tokenized-input/internal/InputPill.d.ts +1 -1
  165. package/dist-types/tokenized-input-next/internal/InputPill.d.ts +1 -1
  166. package/dist-types/utils/useEventCallback.d.ts +1 -1
  167. package/package.json +3 -3
  168. package/dist-cjs/tabs-next/hooks/useFocusOutside.js +0 -25
  169. package/dist-cjs/tabs-next/hooks/useFocusOutside.js.map +0 -1
  170. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js +0 -93
  171. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +0 -1
  172. package/dist-es/tabs-next/hooks/useFocusOutside.js +0 -23
  173. package/dist-es/tabs-next/hooks/useFocusOutside.js.map +0 -1
  174. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js +0 -91
  175. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +0 -1
  176. package/dist-types/tabs-next/hooks/useFocusOutside.d.ts +0 -2
  177. package/dist-types/tabs-next/hooks/useRestoreActiveTab.d.ts +0 -10
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTabRemovalHandler.js","sources":["../src/tabs-next/hooks/useTabRemovalHandler.ts"],"sourcesContent":["import {\n type MutableRefObject,\n type RefObject,\n useCallback,\n useEffect,\n} from \"react\";\nimport { useEventCallback } from \"../../utils/useEventCallback\";\nimport { isHTMLElement } from \"../domUtils\";\nimport type { Item, TabsNextContextValue } from \"../TabsNextContext\";\n\ninterface RemovedItem {\n id: string;\n value: string;\n staleIndex?: number;\n}\n\ninterface UseTabRemovalHandlerArgs {\n activeTab: MutableRefObject<Pick<Item, \"id\" | \"value\"> | undefined>;\n focusElementWithRetry: (\n getElement: () => HTMLElement | null | undefined,\n ) => void;\n getFirst: TabsNextContextValue[\"getFirst\"];\n getIndex: TabsNextContextValue[\"getIndex\"];\n getLast: TabsNextContextValue[\"getLast\"];\n getRemovedItems: () => Map<string, RemovedItem>;\n getRenderedTab: TabsNextContextValue[\"getRenderedTab\"];\n getSelectedTabElement: () => HTMLElement | null | undefined;\n item: TabsNextContextValue[\"item\"];\n itemAt: TabsNextContextValue[\"itemAt\"];\n maxRetryAttempts: number;\n menuOpen: boolean;\n overflowButtonRef: RefObject<HTMLButtonElement | null>;\n overflowListRef: RefObject<HTMLDivElement | null>;\n pendingRemovalRecoveryRef: MutableRefObject<boolean>;\n pendingRemovalRecoveryRetriesRef: MutableRefObject<number>;\n removalRecoveryRafRef: MutableRefObject<number | null>;\n selected?: string;\n setSelected: TabsNextContextValue[\"setSelected\"];\n tabstripRef: RefObject<HTMLDivElement | null>;\n targetWindow: Window | null | undefined;\n}\n\nfunction hasLostDocumentFocus(doc: Document) {\n const activeElement = doc.activeElement;\n return (\n !activeElement ||\n activeElement === doc.body ||\n activeElement === doc.documentElement ||\n !activeElement.isConnected\n );\n}\n\nfunction getVisibleSelectedTab(\n tabstrip: HTMLDivElement | null,\n excludedId?: string,\n) {\n if (!tabstrip) {\n return null;\n }\n\n const tabs = tabstrip.querySelectorAll<HTMLElement>(\n ':scope > [data-tabslot] [role=\"tab\"][aria-selected=\"true\"]',\n );\n\n return (\n Array.from(tabs).find((tab) => {\n if (excludedId && tab.id === excludedId) {\n return false;\n }\n\n return tab.isConnected;\n }) ?? null\n );\n}\n\nexport function useTabRemovalHandler({\n activeTab,\n focusElementWithRetry,\n getFirst,\n getIndex,\n getLast,\n getRemovedItems,\n getRenderedTab,\n getSelectedTabElement,\n item,\n itemAt,\n maxRetryAttempts,\n menuOpen,\n overflowButtonRef,\n overflowListRef,\n pendingRemovalRecoveryRef,\n pendingRemovalRecoveryRetriesRef,\n removalRecoveryRafRef,\n selected,\n setSelected,\n tabstripRef,\n targetWindow,\n}: UseTabRemovalHandlerArgs) {\n const clearPendingRemovalRecovery = useCallback(() => {\n pendingRemovalRecoveryRef.current = false;\n pendingRemovalRecoveryRetriesRef.current = 0;\n }, [pendingRemovalRecoveryRef, pendingRemovalRecoveryRetriesRef]);\n\n const handleTabRemoval = useEventCallback(() => {\n const doc = targetWindow?.document;\n if (!doc) return;\n\n const activeTabWasSelected = activeTab.current?.value === selected;\n\n const shouldRecoverFocus = () => {\n if (hasLostDocumentFocus(doc)) return true;\n\n const activeElement = doc.activeElement;\n if (!isHTMLElement(activeElement)) return false;\n\n if (!menuOpen) {\n if (activeElement === overflowButtonRef.current) {\n return activeTabWasSelected;\n }\n\n return (\n tabstripRef.current?.contains(activeElement) &&\n activeElement.getAttribute(\"role\") !== \"tab\"\n );\n }\n\n if (activeElement === overflowButtonRef.current) {\n return true;\n }\n\n if (overflowListRef.current?.contains(activeElement)) {\n // When closing tabs from the overflow menu, focus can remain within\n // the floating UI rather than falling back to body.\n return activeElement.getAttribute(\"role\") !== \"tab\";\n }\n\n return false;\n };\n\n // If focus was lost due to deletion, browsers may report body/html or a\n // disconnected active element depending on browser behavior.\n if (!shouldRecoverFocus()) {\n if (\n pendingRemovalRecoveryRef.current &&\n removalRecoveryRafRef.current == null\n ) {\n if (pendingRemovalRecoveryRetriesRef.current < maxRetryAttempts) {\n pendingRemovalRecoveryRetriesRef.current += 1;\n if (!targetWindow?.requestAnimationFrame) {\n handleTabRemoval();\n return;\n }\n\n removalRecoveryRafRef.current = targetWindow.requestAnimationFrame(\n () => {\n removalRecoveryRafRef.current = null;\n handleTabRemoval();\n },\n );\n } else {\n clearPendingRemovalRecovery();\n }\n }\n return;\n }\n\n if (!activeTab.current) {\n clearPendingRemovalRecovery();\n return;\n }\n\n const removedItems = getRemovedItems();\n const removed = removedItems.get(activeTab.current.id);\n if (!removed) {\n clearPendingRemovalRecovery();\n return;\n }\n\n clearPendingRemovalRecovery();\n const removedWasSelected = removed.value === selected;\n const baseIndex = removed.staleIndex ?? -1;\n const removedId = removed.id;\n\n const restoreFocus = () => {\n const restoredTab = item(removedId);\n const restoredRenderedTab = getRenderedTab(removed.value);\n const focusMovedToOverflowButton =\n doc.activeElement === overflowButtonRef.current;\n\n // Overflow menu updates can temporarily remount tabs. If the tab is\n // back and focus was lost to a disconnected node, restore focus to the\n // remounted tab rather than treating it as a real deletion.\n if (\n restoredTab?.element?.isConnected &&\n restoredRenderedTab?.trigger === restoredTab.element &&\n !(removedWasSelected && focusMovedToOverflowButton)\n ) {\n if (shouldRecoverFocus()) {\n focusElementWithRetry(() => item(removedId)?.element);\n }\n return;\n }\n\n if (!shouldRecoverFocus()) {\n return;\n }\n\n let nextTab =\n (baseIndex >= 0 ? itemAt(baseIndex) : null) ??\n (baseIndex > 0 ? itemAt(baseIndex - 1) : null) ??\n getLast() ??\n getFirst();\n\n if (nextTab?.element === overflowButtonRef.current) {\n const overflowIndex = getIndex(nextTab.id);\n nextTab =\n (overflowIndex > 0 ? itemAt(overflowIndex - 1) : null) ??\n (baseIndex > 0 ? itemAt(baseIndex - 1) : null) ??\n getFirst();\n }\n\n if (!nextTab?.element) return;\n\n if (\n removedWasSelected &&\n !menuOpen &&\n !getVisibleSelectedTab(tabstripRef.current, removedId)\n ) {\n activeTab.current = { id: nextTab.id, value: nextTab.value };\n setSelected(null, nextTab.value);\n }\n\n focusElementWithRetry(() => {\n if (removedWasSelected) {\n return getSelectedTabElement() ?? nextTab?.element;\n }\n\n return nextTab?.element;\n });\n };\n\n if (!targetWindow?.requestAnimationFrame) {\n restoreFocus();\n return;\n }\n\n targetWindow.requestAnimationFrame(() => {\n targetWindow.requestAnimationFrame(() => {\n restoreFocus();\n });\n });\n });\n\n useEffect(() => {\n return () => {\n if (removalRecoveryRafRef.current != null && targetWindow) {\n targetWindow.cancelAnimationFrame(removalRecoveryRafRef.current);\n }\n };\n }, [removalRecoveryRafRef, targetWindow]);\n\n return handleTabRemoval;\n}\n"],"names":["useCallback","useEventCallback","_a","isHTMLElement","useEffect"],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ var core = require('@salt-ds/core');
4
+ var domAccessibilityApi = require('dom-accessibility-api');
5
+ var react = require('react');
6
+
7
+ function hasLostDocumentFocus(doc) {
8
+ const activeElement = doc.activeElement;
9
+ return !activeElement || activeElement === doc.body || activeElement === doc.documentElement || !activeElement.isConnected;
10
+ }
11
+ function getTabAccessibleName(element) {
12
+ return domAccessibilityApi.computeAccessibleName(element).trim();
13
+ }
14
+ function useTabSelectionFocus({
15
+ announce,
16
+ focusElementWithRetry,
17
+ getRenderedTab,
18
+ getSelectedTabElement,
19
+ menuOpen,
20
+ resolvedOverflowActiveValue,
21
+ selected,
22
+ selectionFromOverflowValueRef,
23
+ targetWindow
24
+ }) {
25
+ const previousSelected = core.usePrevious(selected, [selected]);
26
+ const focusSelectedTab = react.useCallback(() => {
27
+ focusElementWithRetry(getSelectedTabElement);
28
+ }, [focusElementWithRetry, getSelectedTabElement]);
29
+ core.useIsomorphicLayoutEffect(() => {
30
+ if (!menuOpen || !resolvedOverflowActiveValue) {
31
+ return;
32
+ }
33
+ focusElementWithRetry(
34
+ () => {
35
+ var _a;
36
+ return (_a = getRenderedTab(resolvedOverflowActiveValue)) == null ? void 0 : _a.trigger;
37
+ }
38
+ );
39
+ }, [
40
+ focusElementWithRetry,
41
+ getRenderedTab,
42
+ menuOpen,
43
+ resolvedOverflowActiveValue
44
+ ]);
45
+ core.useIsomorphicLayoutEffect(() => {
46
+ const doc = targetWindow == null ? void 0 : targetWindow.document;
47
+ if (!doc || selected === void 0 || previousSelected === void 0 || selected === previousSelected) {
48
+ return;
49
+ }
50
+ if (!hasLostDocumentFocus(doc)) {
51
+ return;
52
+ }
53
+ focusSelectedTab();
54
+ }, [focusSelectedTab, previousSelected, selected, targetWindow]);
55
+ core.useIsomorphicLayoutEffect(() => {
56
+ const selectedFromOverflow = selectionFromOverflowValueRef.current;
57
+ if (selectedFromOverflow == null || selected === void 0 || selected === previousSelected) {
58
+ return;
59
+ }
60
+ if (selected !== selectedFromOverflow) {
61
+ selectionFromOverflowValueRef.current = null;
62
+ return;
63
+ }
64
+ focusSelectedTab();
65
+ const selectedTab = getSelectedTabElement();
66
+ const selectedTabName = selectedTab ? getTabAccessibleName(selectedTab) || selected : selected;
67
+ announce(`${selectedTabName} moved to main tab list`, 100);
68
+ selectionFromOverflowValueRef.current = null;
69
+ }, [
70
+ announce,
71
+ getSelectedTabElement,
72
+ previousSelected,
73
+ focusSelectedTab,
74
+ selected,
75
+ selectionFromOverflowValueRef
76
+ ]);
77
+ }
78
+
79
+ exports.useTabSelectionFocus = useTabSelectionFocus;
80
+ //# sourceMappingURL=useTabSelectionFocus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTabSelectionFocus.js","sources":["../src/tabs-next/hooks/useTabSelectionFocus.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect, usePrevious } from \"@salt-ds/core\";\nimport { computeAccessibleName } from \"dom-accessibility-api\";\nimport type { MutableRefObject } from \"react\";\nimport { useCallback } from \"react\";\nimport type { TabsNextContextValue } from \"../TabsNextContext\";\n\nfunction hasLostDocumentFocus(doc: Document) {\n const activeElement = doc.activeElement;\n return (\n !activeElement ||\n activeElement === doc.body ||\n activeElement === doc.documentElement ||\n !activeElement.isConnected\n );\n}\n\nfunction getTabAccessibleName(element: HTMLElement) {\n return computeAccessibleName(element).trim();\n}\n\ninterface UseTabSelectionFocusArgs {\n announce: (message: string, timeout?: number) => void;\n focusElementWithRetry: (\n getElement: () => HTMLElement | null | undefined,\n ) => void;\n getRenderedTab: TabsNextContextValue[\"getRenderedTab\"];\n getSelectedTabElement: () => HTMLElement | null | undefined;\n menuOpen: boolean;\n resolvedOverflowActiveValue: string | null;\n selected?: string;\n selectionFromOverflowValueRef: MutableRefObject<string | null>;\n targetWindow: Window | null | undefined;\n}\n\nexport function useTabSelectionFocus({\n announce,\n focusElementWithRetry,\n getRenderedTab,\n getSelectedTabElement,\n menuOpen,\n resolvedOverflowActiveValue,\n selected,\n selectionFromOverflowValueRef,\n targetWindow,\n}: UseTabSelectionFocusArgs) {\n const previousSelected = usePrevious(selected, [selected]);\n\n const focusSelectedTab = useCallback(() => {\n focusElementWithRetry(getSelectedTabElement);\n }, [focusElementWithRetry, getSelectedTabElement]);\n\n useIsomorphicLayoutEffect(() => {\n if (!menuOpen || !resolvedOverflowActiveValue) {\n return;\n }\n\n focusElementWithRetry(\n () => getRenderedTab(resolvedOverflowActiveValue)?.trigger,\n );\n }, [\n focusElementWithRetry,\n getRenderedTab,\n menuOpen,\n resolvedOverflowActiveValue,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n const doc = targetWindow?.document;\n if (\n !doc ||\n selected === undefined ||\n previousSelected === undefined ||\n selected === previousSelected\n ) {\n return;\n }\n\n if (!hasLostDocumentFocus(doc)) {\n return;\n }\n\n focusSelectedTab();\n }, [focusSelectedTab, previousSelected, selected, targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n const selectedFromOverflow = selectionFromOverflowValueRef.current;\n if (\n selectedFromOverflow == null ||\n selected === undefined ||\n selected === previousSelected\n ) {\n return;\n }\n\n if (selected !== selectedFromOverflow) {\n selectionFromOverflowValueRef.current = null;\n return;\n }\n\n focusSelectedTab();\n\n const selectedTab = getSelectedTabElement();\n const selectedTabName = selectedTab\n ? getTabAccessibleName(selectedTab) || selected\n : selected;\n\n announce(`${selectedTabName} moved to main tab list`, 100);\n selectionFromOverflowValueRef.current = null;\n }, [\n announce,\n getSelectedTabElement,\n previousSelected,\n focusSelectedTab,\n selected,\n selectionFromOverflowValueRef,\n ]);\n}\n"],"names":["computeAccessibleName","usePrevious","useCallback","useIsomorphicLayoutEffect"],"mappings":";;;;;;AAMA,SAAS,qBAAqB,GAAA,EAAe;AAC3C,EAAA,MAAM,gBAAgB,GAAA,CAAI,aAAA;AAC1B,EAAA,OACE,CAAC,iBACD,aAAA,KAAkB,GAAA,CAAI,QACtB,aAAA,KAAkB,GAAA,CAAI,eAAA,IACtB,CAAC,aAAA,CAAc,WAAA;AAEnB;AAEA,SAAS,qBAAqB,OAAA,EAAsB;AAClD,EAAA,OAAOA,yCAAA,CAAsB,OAAO,CAAA,CAAE,IAAA,EAAK;AAC7C;AAgBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA,EACA,2BAAA;AAAA,EACA,QAAA;AAAA,EACA,6BAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,gBAAA,GAAmBC,gBAAA,CAAY,QAAA,EAAU,CAAC,QAAQ,CAAC,CAAA;AAEzD,EAAA,MAAM,gBAAA,GAAmBC,kBAAY,MAAM;AACzC,IAAA,qBAAA,CAAsB,qBAAqB,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,qBAAA,EAAuB,qBAAqB,CAAC,CAAA;AAEjD,EAAAC,8BAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,2BAAA,EAA6B;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,qBAAA;AAAA,MACE,MAAG;AAzDT,QAAA,IAAA,EAAA;AAyDY,QAAA,OAAA,CAAA,EAAA,GAAA,cAAA,CAAe,2BAA2B,MAA1C,IAAA,GAAA,MAAA,GAAA,EAAA,CAA6C,OAAA;AAAA,MAAA;AAAA,KACrD;AAAA,EACF,CAAA,EAAG;AAAA,IACD,qBAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAA,8BAAA,CAA0B,MAAM;AAC9B,IAAA,MAAM,MAAM,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,QAAA;AAC1B,IAAA,IACE,CAAC,GAAA,IACD,QAAA,KAAa,UACb,gBAAA,KAAqB,MAAA,IACrB,aAAa,gBAAA,EACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,oBAAA,CAAqB,GAAG,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,EAAiB;AAAA,EACnB,GAAG,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,QAAA,EAAU,YAAY,CAAC,CAAA;AAE/D,EAAAA,8BAAA,CAA0B,MAAM;AAC9B,IAAA,MAAM,uBAAuB,6BAAA,CAA8B,OAAA;AAC3D,IAAA,IACE,oBAAA,IAAwB,IAAA,IACxB,QAAA,KAAa,MAAA,IACb,aAAa,gBAAA,EACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,oBAAA,EAAsB;AACrC,MAAA,6BAAA,CAA8B,OAAA,GAAU,IAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,EAAiB;AAEjB,IAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,IAAA,MAAM,eAAA,GAAkB,WAAA,GACpB,oBAAA,CAAqB,WAAW,KAAK,QAAA,GACrC,QAAA;AAEJ,IAAA,QAAA,CAAS,CAAA,EAAG,eAAe,CAAA,uBAAA,CAAA,EAA2B,GAAG,CAAA;AACzD,IAAA,6BAAA,CAA8B,OAAA,GAAU,IAAA;AAAA,EAC1C,CAAA,EAAG;AAAA,IACD,QAAA;AAAA,IACA,qBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;;"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const WIDTH_EPSILON = 0.5;
4
+ function getMeasuredWidth(element) {
5
+ if (!element) {
6
+ return 0;
7
+ }
8
+ const width = element.getBoundingClientRect().width;
9
+ return width || element.clientWidth || 0;
10
+ }
11
+ function getIntrinsicMeasuredWidth(element) {
12
+ if (!element) {
13
+ return 0;
14
+ }
15
+ const borderWidth = element.offsetWidth - element.clientWidth;
16
+ return Math.max(getMeasuredWidth(element), element.scrollWidth + borderWidth);
17
+ }
18
+ function getGapValue(styles) {
19
+ return Number.parseFloat(styles.columnGap || styles.gap || "0") || 0;
20
+ }
21
+ function seedWidthMap(elements) {
22
+ const widths = /* @__PURE__ */ new Map();
23
+ for (const element of elements) {
24
+ widths.set(element, getMeasuredWidth(element));
25
+ }
26
+ return widths;
27
+ }
28
+ function updateWidthMap(widths, element, nextWidth, epsilon = WIDTH_EPSILON) {
29
+ const previousWidth = widths.get(element);
30
+ widths.set(element, nextWidth);
31
+ if (previousWidth === void 0) {
32
+ return false;
33
+ }
34
+ return Math.abs(previousWidth - nextWidth) > epsilon;
35
+ }
36
+
37
+ exports.getGapValue = getGapValue;
38
+ exports.getIntrinsicMeasuredWidth = getIntrinsicMeasuredWidth;
39
+ exports.getMeasuredWidth = getMeasuredWidth;
40
+ exports.seedWidthMap = seedWidthMap;
41
+ exports.updateWidthMap = updateWidthMap;
42
+ //# sourceMappingURL=widthMeasurement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widthMeasurement.js","sources":["../src/tabs-next/widthMeasurement.ts"],"sourcesContent":["const WIDTH_EPSILON = 0.5;\n\nexport function getMeasuredWidth(element: HTMLElement | null | undefined) {\n if (!element) {\n return 0;\n }\n\n const width = element.getBoundingClientRect().width;\n return width || element.clientWidth || 0;\n}\n\nexport function getIntrinsicMeasuredWidth(\n element: HTMLElement | null | undefined,\n) {\n if (!element) {\n return 0;\n }\n\n const borderWidth = element.offsetWidth - element.clientWidth;\n return Math.max(getMeasuredWidth(element), element.scrollWidth + borderWidth);\n}\n\nexport function getGapValue(styles: CSSStyleDeclaration) {\n return Number.parseFloat(styles.columnGap || styles.gap || \"0\") || 0;\n}\n\nexport function seedWidthMap(elements: HTMLElement[]) {\n const widths = new Map<HTMLElement, number>();\n for (const element of elements) {\n widths.set(element, getMeasuredWidth(element));\n }\n return widths;\n}\n\nexport function updateWidthMap(\n widths: Map<HTMLElement, number>,\n element: HTMLElement,\n nextWidth: number,\n epsilon = WIDTH_EPSILON,\n) {\n const previousWidth = widths.get(element);\n widths.set(element, nextWidth);\n\n if (previousWidth === undefined) {\n return false;\n }\n\n return Math.abs(previousWidth - nextWidth) > epsilon;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,aAAA,GAAgB,GAAA;AAEf,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,qBAAA,EAAsB,CAAE,KAAA;AAC9C,EAAA,OAAO,KAAA,IAAS,QAAQ,WAAA,IAAe,CAAA;AACzC;AAEO,SAAS,0BACd,OAAA,EACA;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,GAAc,OAAA,CAAQ,WAAA;AAClD,EAAA,OAAO,KAAK,GAAA,CAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAA,CAAQ,cAAc,WAAW,CAAA;AAC9E;AAEO,SAAS,YAAY,MAAA,EAA6B;AACvD,EAAA,OAAO,OAAO,UAAA,CAAW,MAAA,CAAO,aAAa,MAAA,CAAO,GAAA,IAAO,GAAG,CAAA,IAAK,CAAA;AACrE;AAEO,SAAS,aAAa,QAAA,EAAyB;AACpD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAA,CACd,MAAA,EACA,OAAA,EACA,SAAA,EACA,UAAU,aAAA,EACV;AACA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACxC,EAAA,MAAA,CAAO,GAAA,CAAI,SAAS,SAAS,CAAA;AAE7B,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,aAAA,GAAgB,SAAS,CAAA,GAAI,OAAA;AAC/C;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = ".saltTree {\n list-style: none;\n margin: 0;\n padding: 0;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n}\n\n.saltTree-disabled {\n cursor: var(--salt-cursor-disabled);\n}\n";
3
+ var css_248z = ".saltTree {\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-fixed-100);\n list-style: none;\n margin: 0;\n padding: 0;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n}\n\n.saltTree-disabled {\n cursor: var(--salt-cursor-disabled);\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=Tree.css.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = ".saltTreeNode {\n list-style: none;\n position: relative;\n cursor: var(--salt-cursor-hover);\n}\n\n.saltTreeNode:focus {\n outline: none;\n}\n\n/* Focus visible styles - applied when keyboard navigation is used */\n.saltTreeNode:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n outline: var(--salt-focused-outline);\n position: relative;\n z-index: calc(var(--salt-zIndex-default) + 1);\n}\n\n/* Selected + focus visible */\n.saltTreeNode-selected:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-selected.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n outline: var(--salt-focused-outline);\n z-index: calc(var(--salt-zIndex-default) + 1);\n}\n\n/* Disabled cursor */\n.saltTreeNode-disabled {\n cursor: var(--salt-cursor-disabled);\n}\n\n.saltTreeNode-group {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.saltTreeNode-checkbox {\n flex-shrink: 0;\n height: var(--salt-size-selectable);\n}\n\n.saltTreeNode-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--salt-size-selectable);\n min-width: var(--salt-size-selectable);\n height: var(--salt-size-selectable);\n flex-shrink: 0;\n}\n\n.saltTreeNode-icon > * {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNode-disabled .saltTreeNode-icon > * {\n color: var(--salt-content-primary-foreground-disabled);\n}\n";
3
+ var css_248z = ".saltTreeNode {\n list-style: none;\n position: relative;\n cursor: var(--salt-cursor-hover);\n}\n\n.saltTreeNode:focus {\n outline: none;\n}\n\n/* Focus visible styles - applied when keyboard navigation is used */\n.saltTreeNode:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-size-fixed-100) * -2);\n position: relative;\n z-index: calc(var(--salt-zIndex-default) + 1);\n}\n\n/* Selected + focus visible */\n.saltTreeNode-selected:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-selected.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-size-fixed-100) * -2);\n z-index: calc(var(--salt-zIndex-default) + 1);\n}\n\n.saltTreeNode-group {\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-fixed-100);\n list-style: none;\n margin: 0;\n padding: 0;\n padding-top: var(--salt-spacing-fixed-100);\n}\n\n.saltTreeNode-checkbox {\n flex-shrink: 0;\n height: var(--salt-size-selectable);\n}\n\n.saltTreeNode-icon {\n display: flex;\n align-items: flex-start;\n justify-content: center;\n width: var(--salt-size-selectable);\n min-width: var(--salt-size-selectable);\n height: var(--salt-size-selectable);\n flex-shrink: 0;\n}\n\n.saltTreeNode-icon > * {\n color: var(--salt-content-primary-foreground);\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=TreeNode.css.js.map
@@ -88,7 +88,7 @@ const TreeNode = react.forwardRef(
88
88
  ]
89
89
  );
90
90
  const defaultContent = usesLabelProp ? /* @__PURE__ */ jsxRuntime.jsxs(TreeNodeTrigger.TreeNodeTrigger, { children: [
91
- Icon ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": true, className: withBaseName("icon") }) : null,
91
+ Icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: withBaseName("icon"), children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": true }) }) : null,
92
92
  /* @__PURE__ */ jsxRuntime.jsx(TreeNodeLabel.TreeNodeLabel, { children: label })
93
93
  ] }) : null;
94
94
  return /* @__PURE__ */ jsxRuntime.jsx(TreeContext.TreeNodeProvider, { value: nodeContext, children: usesLabelProp ? defaultContent : contentChildren });
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNode.js","sources":["../src/tree/TreeNode.tsx"],"sourcesContent":["import { makePrefixer, useId } from \"@salt-ds/core\";\nimport type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n Children,\n type ComponentType,\n forwardRef,\n isValidElement,\n type ReactNode,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport {\n TreeNodeProvider,\n useTreeContext,\n useTreeNodeContext,\n} from \"./TreeContext\";\nimport treeNodeCss from \"./TreeNode.css\";\nimport { TreeNodeLabel } from \"./TreeNodeLabel\";\nimport { TreeNodeTrigger } from \"./TreeNodeTrigger\";\n\nexport interface TreeNodeProps {\n /**\n * Unique value representing this node within the tree\n */\n value: string;\n /**\n * Label for the node. When provided, TreeNode automatically renders a TreeNodeTrigger.\n */\n label?: ReactNode;\n /**\n * Optional icon to display before the label\n */\n icon?: ComponentType<IconProps>;\n /**\n * Whether the node is disabled.\n */\n disabled?: boolean;\n /**\n * Child nodes or content.\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltTreeNode\");\n\n// Need to take another look at this because its slightly brittle - alternative could be:\n// TreeNode having a 'content' prop that takes <TreeNodeTrigger> etc. and then `children` is reserved for other <TreeNode>'s\n// or a 'render' prop if we want to pass any state down. Simplifies it massively because then its clear children is for sub trees.\nfunction separateChildren(children: ReactNode): {\n contentChildren: ReactNode[];\n nodeChildren: ReactNode[];\n} {\n const contentChildren: ReactNode[] = [];\n const nodeChildren: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && typeof child.props.value === \"string\") {\n nodeChildren.push(child);\n } else if (child != null) {\n contentChildren.push(child);\n }\n });\n\n return { contentChildren, nodeChildren };\n}\n\nexport const TreeNode = forwardRef<HTMLLIElement, TreeNodeProps>(\n function TreeNode(props, ref) {\n const {\n value,\n label,\n icon: Icon,\n disabled: disabledProp,\n children,\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node\",\n css: treeNodeCss,\n window: targetWindow,\n });\n\n const id = useId(value) ?? value;\n\n const {\n expandedState,\n selectedSet,\n disabled: treeDisabled,\n disabledIdsSet,\n indeterminateState,\n getElement,\n } = useTreeContext();\n\n const parentContext = useTreeNodeContext();\n const level = (parentContext?.level ?? 0) + 1;\n\n const disabled = treeDisabled || disabledProp || disabledIdsSet.has(value);\n const expanded = expandedState.has(value);\n const selected = selectedSet.has(value);\n const indeterminate = indeterminateState.has(value);\n\n const usesLabelProp = label !== undefined;\n const { contentChildren, nodeChildren } = useMemo(\n () =>\n usesLabelProp\n ? { contentChildren: [], nodeChildren: Children.toArray(children) }\n : separateChildren(children),\n [children, usesLabelProp],\n );\n\n const hasChildren = nodeChildren.length > 0;\n\n // Forward ref to the <li> element rendered by TreeNodeTrigger\n useImperativeHandle(ref, () => getElement(value) as HTMLLIElement, [\n getElement,\n value,\n ]);\n\n const nodeContext = useMemo(\n () => ({\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n selected,\n indeterminate,\n nodeChildren,\n }),\n [\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n selected,\n indeterminate,\n nodeChildren,\n ],\n );\n\n const defaultContent = usesLabelProp ? (\n <TreeNodeTrigger>\n {Icon ? <Icon aria-hidden className={withBaseName(\"icon\")} /> : null}\n <TreeNodeLabel>{label}</TreeNodeLabel>\n </TreeNodeTrigger>\n ) : null;\n\n return (\n <TreeNodeProvider value={nodeContext}>\n {usesLabelProp ? defaultContent : contentChildren}\n </TreeNodeProvider>\n );\n },\n);\n"],"names":["makePrefixer","Children","isValidElement","forwardRef","TreeNode","useWindow","useComponentCssInjection","treeNodeCss","useId","useTreeContext","useTreeNodeContext","useMemo","useImperativeHandle","jsxs","TreeNodeTrigger","jsx","TreeNodeLabel","TreeNodeProvider"],"mappings":"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"}
1
+ {"version":3,"file":"TreeNode.js","sources":["../src/tree/TreeNode.tsx"],"sourcesContent":["import { makePrefixer, useId } from \"@salt-ds/core\";\nimport type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n Children,\n type ComponentType,\n forwardRef,\n isValidElement,\n type ReactNode,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport {\n TreeNodeProvider,\n useTreeContext,\n useTreeNodeContext,\n} from \"./TreeContext\";\nimport treeNodeCss from \"./TreeNode.css\";\nimport { TreeNodeLabel } from \"./TreeNodeLabel\";\nimport { TreeNodeTrigger } from \"./TreeNodeTrigger\";\n\nexport interface TreeNodeProps {\n /**\n * Unique value representing this node within the tree\n */\n value: string;\n /**\n * Label for the node. When provided, TreeNode automatically renders a TreeNodeTrigger.\n */\n label?: ReactNode;\n /**\n * Optional icon to display before the label\n */\n icon?: ComponentType<IconProps>;\n /**\n * Whether the node is disabled.\n */\n disabled?: boolean;\n /**\n * Child nodes or content.\n */\n children?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltTreeNode\");\n\n// Need to take another look at this because its slightly brittle - alternative could be:\n// TreeNode having a 'content' prop that takes <TreeNodeTrigger> etc. and then `children` is reserved for other <TreeNode>'s\n// or a 'render' prop if we want to pass any state down. Simplifies it massively because then its clear children is for sub trees.\nfunction separateChildren(children: ReactNode): {\n contentChildren: ReactNode[];\n nodeChildren: ReactNode[];\n} {\n const contentChildren: ReactNode[] = [];\n const nodeChildren: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && typeof child.props.value === \"string\") {\n nodeChildren.push(child);\n } else if (child != null) {\n contentChildren.push(child);\n }\n });\n\n return { contentChildren, nodeChildren };\n}\n\nexport const TreeNode = forwardRef<HTMLLIElement, TreeNodeProps>(\n function TreeNode(props, ref) {\n const {\n value,\n label,\n icon: Icon,\n disabled: disabledProp,\n children,\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node\",\n css: treeNodeCss,\n window: targetWindow,\n });\n\n const id = useId(value) ?? value;\n\n const {\n expandedState,\n selectedSet,\n disabled: treeDisabled,\n disabledIdsSet,\n indeterminateState,\n getElement,\n } = useTreeContext();\n\n const parentContext = useTreeNodeContext();\n const level = (parentContext?.level ?? 0) + 1;\n\n const disabled = treeDisabled || disabledProp || disabledIdsSet.has(value);\n const expanded = expandedState.has(value);\n const selected = selectedSet.has(value);\n const indeterminate = indeterminateState.has(value);\n\n const usesLabelProp = label !== undefined;\n const { contentChildren, nodeChildren } = useMemo(\n () =>\n usesLabelProp\n ? { contentChildren: [], nodeChildren: Children.toArray(children) }\n : separateChildren(children),\n [children, usesLabelProp],\n );\n\n const hasChildren = nodeChildren.length > 0;\n\n // Forward ref to the <li> element rendered by TreeNodeTrigger\n useImperativeHandle(ref, () => getElement(value) as HTMLLIElement, [\n getElement,\n value,\n ]);\n\n const nodeContext = useMemo(\n () => ({\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n selected,\n indeterminate,\n nodeChildren,\n }),\n [\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n selected,\n indeterminate,\n nodeChildren,\n ],\n );\n\n const defaultContent = usesLabelProp ? (\n <TreeNodeTrigger>\n {Icon ? (\n <span className={withBaseName(\"icon\")}>\n <Icon aria-hidden />\n </span>\n ) : null}\n <TreeNodeLabel>{label}</TreeNodeLabel>\n </TreeNodeTrigger>\n ) : null;\n\n return (\n <TreeNodeProvider value={nodeContext}>\n {usesLabelProp ? defaultContent : contentChildren}\n </TreeNodeProvider>\n );\n },\n);\n"],"names":["makePrefixer","Children","isValidElement","forwardRef","TreeNode","useWindow","useComponentCssInjection","treeNodeCss","useId","useTreeContext","useTreeNodeContext","useMemo","useImperativeHandle","jsxs","TreeNodeTrigger","jsx","TreeNodeLabel","TreeNodeProvider"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = ".saltTreeNodeExpansionIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--salt-size-selectable);\n min-width: var(--salt-size-selectable);\n height: var(--salt-size-selectable);\n flex-shrink: 0;\n position: relative;\n}\n\n.saltTreeNodeExpansionIcon-icon {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeExpansionIcon::before {\n content: \"\";\n display: block;\n position: absolute;\n width: var(--salt-size-base);\n height: var(--salt-size-base);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.saltTreeNode-disabled .saltTreeNodeExpansionIcon-icon {\n color: var(--salt-content-primary-foreground-disabled);\n}\n";
3
+ var css_248z = ".saltTreeNodeExpansionIcon {\n display: flex;\n align-items: flex-start;\n justify-content: center;\n width: var(--salt-size-selectable);\n min-width: var(--salt-size-selectable);\n height: var(--salt-size-selectable);\n flex-shrink: 0;\n position: relative;\n}\n\n.saltTreeNodeExpansionIcon-icon {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeExpansionIcon::before {\n content: \"\";\n display: block;\n position: absolute;\n width: var(--salt-size-base);\n height: var(--salt-size-base);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=TreeNodeExpansionIcon.css.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = ".saltTreeNodeTrigger {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--salt-spacing-100);\n width: 100%;\n min-height: var(--salt-size-base);\n\n padding-top: calc((var(--salt-size-base) - var(--salt-size-selectable)) / 2);\n padding-bottom: calc((var(--salt-size-base) - var(--salt-size-selectable)) / 2);\n padding-right: var(--salt-spacing-100);\n /* Base padding for level-1 nodes, plus one indent step per additional level.\n Each indent step = (selectable element width + gap).\n Level-1 nodes get no extra indent; level-2 gets 1 step, level-3 gets 2, etc.\n --saltTreeNodeTrigger-indentStep is overridden in multiselect to account\n for the wider spacing around the checkbox. */\n --saltTreeNodeTrigger-indentStep: calc(var(--salt-size-selectable) + var(--salt-spacing-100));\n padding-left: calc(var(--salt-spacing-100) + (var(--saltTreeNodeTrigger-indentStep) * (var(--saltTreeNode-level, 1) - 1)));\n background: var(--salt-selectable-background);\n color: var(--salt-content-primary-foreground);\n}\n\n[aria-multiselectable=\"true\"] .saltTreeNodeTrigger {\n --saltTreeNodeTrigger-indentStep: calc(var(--salt-size-selectable) + var(--salt-spacing-150));\n}\n\n.saltTreeNodeTrigger:hover {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTreeNode:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTreeNode-selected > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-selected);\n box-shadow:\n 0 calc(var(--salt-size-border) * -1) 0 0 var(--salt-selectable-borderColor-selected),\n 0 var(--salt-size-border) 0 0 var(--salt-selectable-borderColor-selected);\n position: relative;\n z-index: var(--salt-zIndex-default);\n}\n\n.saltTreeNode-selected:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-selected.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-selected);\n}\n\n.saltTreeNode-disabled > .saltTreeNodeTrigger {\n color: var(--salt-content-primary-foreground-disabled);\n background: var(--salt-selectable-background-disabled);\n}\n\n.saltTreeNodeTrigger > .saltIcon {\n width: var(--salt-size-selectable);\n height: var(--salt-size-selectable);\n min-width: var(--salt-size-selectable);\n flex-shrink: 0;\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeTrigger > .saltTreeNode-checkbox {\n margin-left: calc(var(--salt-spacing-150) - var(--salt-spacing-100));\n margin-right: calc(var(--salt-spacing-150) - var(--salt-spacing-100));\n}\n\n.saltTreeNode-disabled .saltTreeNodeTrigger > .saltIcon {\n color: var(--salt-content-primary-foreground-disabled);\n}\n";
3
+ var css_248z = ".saltTreeNodeTrigger {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--salt-spacing-100);\n width: 100%;\n min-height: var(--salt-size-base);\n\n padding-top: calc((var(--salt-size-base) - var(--salt-size-selectable)) / 2);\n padding-bottom: calc((var(--salt-size-base) - var(--salt-size-selectable)) / 2);\n padding-right: var(--salt-spacing-100);\n /* Keep a fixed spacing-100 outer left padding for all nodes, then add one\n indent step per additional level. Each indent step = (selectable element\n width + inter-item gap).\n Level-1 nodes get no extra indent; level-2 gets 1 step, level-3 gets 2, etc.\n */\n --saltTreeNodeTrigger-indentStep: calc(var(--salt-size-selectable) + var(--salt-spacing-100));\n /* Icons clamp to 12px minimum in Icon, so align against the rendered size. */\n --saltTreeNodeTrigger-iconOffsetY: calc((var(--salt-text-lineHeight) - max(var(--salt-size-icon), 12px)) / 2);\n --saltTreeNodeTrigger-directIconInsetX: max(0px, calc((var(--salt-size-selectable) - max(var(--salt-size-icon), 12px)) / 2));\n padding-left: calc(var(--salt-spacing-100) + (var(--saltTreeNodeTrigger-indentStep) * (var(--saltTreeNode-level, 1) - 1)));\n background: var(--salt-selectable-background);\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeTrigger:hover {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTreeNode:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTreeNode-selected > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-selected);\n box-shadow:\n 0 calc(var(--salt-size-fixed-100) * -1) 0 0 var(--salt-selectable-borderColor-selected),\n 0 var(--salt-size-fixed-100) 0 0 var(--salt-selectable-borderColor-selected);\n position: relative;\n z-index: var(--salt-zIndex-default);\n}\n\n.saltTreeNode-selected:focus-visible > .saltTreeNodeTrigger,\n.saltTreeNode-selected.saltTreeNode-focusVisible > .saltTreeNodeTrigger {\n background: var(--salt-selectable-background-selected);\n}\n\n.saltTreeNode-disabled > .saltTreeNodeTrigger,\n.saltTreeNode-disabled:hover > .saltTreeNodeTrigger {\n opacity: 0.4;\n cursor: var(--salt-cursor-disabled);\n\n background: var(--salt-selectable-background);\n color: var(--salt-content-primary-foreground);\n}\n\n.saltTreeNodeTrigger > .saltTreeNode-checkbox {\n margin-block: calc((var(--salt-text-lineHeight) - var(--salt-size-selectable)) / 2);\n}\n\n.saltTreeNodeTrigger > .saltTreeNodeExpansionIcon > .saltTreeNodeExpansionIcon-icon,\n.saltTreeNodeTrigger > .saltTreeNode-icon > .saltIcon {\n --saltIcon-margin: var(--saltTreeNodeTrigger-iconOffsetY) 0 0 0;\n}\n\n.saltTreeNodeTrigger > .saltIcon {\n --saltIcon-margin: var(--saltTreeNodeTrigger-iconOffsetY) 0 0 0;\n box-sizing: content-box;\n padding-inline: var(--saltTreeNodeTrigger-directIconInsetX);\n flex-shrink: 0;\n color: var(--salt-content-primary-foreground);\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=TreeNodeTrigger.css.js.map
@@ -77,8 +77,8 @@ const TreeNodeTrigger = react.forwardRef(function TreeNodeTrigger2(props, ref) {
77
77
  select(event, value);
78
78
  };
79
79
  const handleFocus = (event) => {
80
- onFocus == null ? void 0 : onFocus(event);
81
80
  if (event.target !== event.currentTarget) return;
81
+ onFocus == null ? void 0 : onFocus(event);
82
82
  if (!wasMouseDownRef.current) {
83
83
  setFocusVisible(true);
84
84
  }
@@ -86,8 +86,8 @@ const TreeNodeTrigger = react.forwardRef(function TreeNodeTrigger2(props, ref) {
86
86
  setActiveNode(value);
87
87
  };
88
88
  const handleBlur = (event) => {
89
- onBlur == null ? void 0 : onBlur(event);
90
89
  if (event.target !== event.currentTarget) return;
90
+ onBlur == null ? void 0 : onBlur(event);
91
91
  setFocusVisible(false);
92
92
  };
93
93
  const handleMouseDown = (event) => {
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodeTrigger.js","sources":["../src/tree/TreeNodeTrigger.tsx"],"sourcesContent":["import { CheckboxIcon, makePrefixer, useForkRef } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n forwardRef,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useTreeContext, useTreeNodeContext } from \"./TreeContext\";\nimport { TreeNodeExpansionIcon } from \"./TreeNodeExpansionIcon\";\nimport treeNodeTriggerCss from \"./TreeNodeTrigger.css\";\n\nexport interface TreeNodeTriggerProps extends ComponentPropsWithoutRef<\"li\"> {}\n\nconst withBaseName = makePrefixer(\"saltTreeNodeTrigger\");\nconst withNodeBaseName = makePrefixer(\"saltTreeNode\");\n\n/**\n * The forwarded ref points to the inner trigger content span (for tooltip positioning),\n * while the <li> handles focus, ARIA, and event handling.\n */\nexport const TreeNodeTrigger = forwardRef<\n HTMLSpanElement,\n TreeNodeTriggerProps\n>(function TreeNodeTrigger(props, ref) {\n const {\n className,\n children,\n style,\n onClick,\n onFocus,\n onBlur,\n onMouseDown,\n onKeyDown,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node-trigger\",\n css: treeNodeTriggerCss,\n window: targetWindow,\n });\n\n const nodeContext = useTreeNodeContext();\n if (!nodeContext) {\n throw new Error(\"TreeNodeTrigger must be used within a TreeNode\");\n }\n\n const {\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n selected,\n indeterminate,\n nodeChildren,\n } = nodeContext;\n\n const {\n multiselect,\n activeNode,\n setActiveNode,\n select,\n tabbableNodeId,\n registerElement,\n } = useTreeContext();\n\n const nodeRef = useRef<HTMLLIElement>(null);\n const triggerContentRef = useForkRef(useRef<HTMLSpanElement>(null), ref);\n const wasMouseDownRef = useRef(false);\n const [focusVisible, setFocusVisible] = useState(false);\n\n const isActive = activeNode === value;\n\n const isTabbable = tabbableNodeId === value;\n\n useEffect(() => {\n if (nodeRef.current) {\n return registerElement(value, nodeRef.current);\n }\n }, [value, registerElement]);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n onClick?.(event);\n if (disabled) return;\n const target = event.target as HTMLElement;\n if (target.closest(\".saltTreeNodeExpansionIcon\")) return;\n const nestedTreeItem = target.closest('[role=\"treeitem\"]');\n if (nestedTreeItem && nestedTreeItem !== nodeRef.current) {\n return;\n }\n setActiveNode(value);\n select(event, value);\n };\n\n const handleFocus = (event: FocusEvent<HTMLLIElement>) => {\n onFocus?.(event);\n if (event.target !== event.currentTarget) return;\n if (!wasMouseDownRef.current) {\n setFocusVisible(true);\n }\n wasMouseDownRef.current = false;\n setActiveNode(value);\n };\n\n const handleBlur = (event: FocusEvent<HTMLLIElement>) => {\n onBlur?.(event);\n if (event.target !== event.currentTarget) return;\n setFocusVisible(false);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLLIElement>) => {\n wasMouseDownRef.current = true;\n onMouseDown?.(event);\n };\n\n return (\n <li\n ref={nodeRef}\n id={id}\n role=\"treeitem\"\n aria-expanded={hasChildren ? expanded : undefined}\n aria-selected={multiselect ? undefined : selected}\n aria-checked={\n multiselect ? (indeterminate ? \"mixed\" : selected) : undefined\n }\n aria-level={level}\n aria-disabled={disabled || undefined}\n tabIndex={isTabbable ? 0 : -1}\n className={clsx(\n withNodeBaseName(),\n {\n [withNodeBaseName(\"expanded\")]: expanded,\n [withNodeBaseName(\"selected\")]: selected && !multiselect,\n [withNodeBaseName(\"active\")]: isActive,\n [withNodeBaseName(\"disabled\")]: disabled,\n [withNodeBaseName(\"hasChildren\")]: hasChildren,\n [withNodeBaseName(\"focusVisible\")]: focusVisible,\n },\n className,\n )}\n style={\n {\n \"--saltTreeNode-level\": level,\n ...style,\n } as CSSProperties\n }\n onClick={handleClick}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseDown={handleMouseDown}\n onKeyDown={onKeyDown}\n {...rest}\n >\n <span ref={triggerContentRef} className={withBaseName()}>\n <TreeNodeExpansionIcon />\n {multiselect && (\n <CheckboxIcon\n checked={selected}\n indeterminate={indeterminate}\n disabled={disabled}\n className={withNodeBaseName(\"checkbox\")}\n />\n )}\n {children}\n </span>\n\n {hasChildren && expanded && (\n <ul role=\"group\" className={withNodeBaseName(\"group\")}>\n {nodeChildren}\n </ul>\n )}\n </li>\n );\n});\n"],"names":["makePrefixer","forwardRef","TreeNodeTrigger","useWindow","useComponentCssInjection","treeNodeTriggerCss","useTreeNodeContext","useTreeContext","useRef","useForkRef","useState","useEffect","jsxs","clsx","jsx","TreeNodeExpansionIcon","CheckboxIcon"],"mappings":"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"}
1
+ {"version":3,"file":"TreeNodeTrigger.js","sources":["../src/tree/TreeNodeTrigger.tsx"],"sourcesContent":["import { CheckboxIcon, makePrefixer, useForkRef } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n forwardRef,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useTreeContext, useTreeNodeContext } from \"./TreeContext\";\nimport { TreeNodeExpansionIcon } from \"./TreeNodeExpansionIcon\";\nimport treeNodeTriggerCss from \"./TreeNodeTrigger.css\";\n\nexport interface TreeNodeTriggerProps extends ComponentPropsWithoutRef<\"li\"> {}\n\nconst withBaseName = makePrefixer(\"saltTreeNodeTrigger\");\nconst withNodeBaseName = makePrefixer(\"saltTreeNode\");\n\n/**\n * The forwarded ref points to the inner trigger content span (for tooltip positioning),\n * while the <li> handles focus, ARIA, and event handling.\n */\nexport const TreeNodeTrigger = forwardRef<\n HTMLSpanElement,\n TreeNodeTriggerProps\n>(function TreeNodeTrigger(props, ref) {\n const {\n className,\n children,\n style,\n onClick,\n onFocus,\n onBlur,\n onMouseDown,\n onKeyDown,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tree-node-trigger\",\n css: treeNodeTriggerCss,\n window: targetWindow,\n });\n\n const nodeContext = useTreeNodeContext();\n if (!nodeContext) {\n throw new Error(\"TreeNodeTrigger must be used within a TreeNode\");\n }\n\n const {\n value,\n level,\n hasChildren,\n expanded,\n disabled,\n id,\n selected,\n indeterminate,\n nodeChildren,\n } = nodeContext;\n\n const {\n multiselect,\n activeNode,\n setActiveNode,\n select,\n tabbableNodeId,\n registerElement,\n } = useTreeContext();\n\n const nodeRef = useRef<HTMLLIElement>(null);\n const triggerContentRef = useForkRef(useRef<HTMLSpanElement>(null), ref);\n const wasMouseDownRef = useRef(false);\n const [focusVisible, setFocusVisible] = useState(false);\n\n const isActive = activeNode === value;\n\n const isTabbable = tabbableNodeId === value;\n\n useEffect(() => {\n if (nodeRef.current) {\n return registerElement(value, nodeRef.current);\n }\n }, [value, registerElement]);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n onClick?.(event);\n if (disabled) return;\n const target = event.target as HTMLElement;\n if (target.closest(\".saltTreeNodeExpansionIcon\")) return;\n const nestedTreeItem = target.closest('[role=\"treeitem\"]');\n if (nestedTreeItem && nestedTreeItem !== nodeRef.current) {\n return;\n }\n setActiveNode(value);\n select(event, value);\n };\n\n const handleFocus = (event: FocusEvent<HTMLLIElement>) => {\n if (event.target !== event.currentTarget) return;\n onFocus?.(event);\n if (!wasMouseDownRef.current) {\n setFocusVisible(true);\n }\n wasMouseDownRef.current = false;\n setActiveNode(value);\n };\n\n const handleBlur = (event: FocusEvent<HTMLLIElement>) => {\n if (event.target !== event.currentTarget) return;\n onBlur?.(event);\n setFocusVisible(false);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLLIElement>) => {\n wasMouseDownRef.current = true;\n onMouseDown?.(event);\n };\n\n return (\n <li\n ref={nodeRef}\n id={id}\n role=\"treeitem\"\n aria-expanded={hasChildren ? expanded : undefined}\n aria-selected={multiselect ? undefined : selected}\n aria-checked={\n multiselect ? (indeterminate ? \"mixed\" : selected) : undefined\n }\n aria-level={level}\n aria-disabled={disabled || undefined}\n tabIndex={isTabbable ? 0 : -1}\n className={clsx(\n withNodeBaseName(),\n {\n [withNodeBaseName(\"expanded\")]: expanded,\n [withNodeBaseName(\"selected\")]: selected && !multiselect,\n [withNodeBaseName(\"active\")]: isActive,\n [withNodeBaseName(\"disabled\")]: disabled,\n [withNodeBaseName(\"hasChildren\")]: hasChildren,\n [withNodeBaseName(\"focusVisible\")]: focusVisible,\n },\n className,\n )}\n style={\n {\n \"--saltTreeNode-level\": level,\n ...style,\n } as CSSProperties\n }\n onClick={handleClick}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseDown={handleMouseDown}\n onKeyDown={onKeyDown}\n {...rest}\n >\n <span ref={triggerContentRef} className={withBaseName()}>\n <TreeNodeExpansionIcon />\n {multiselect && (\n <CheckboxIcon\n checked={selected}\n indeterminate={indeterminate}\n disabled={disabled}\n className={withNodeBaseName(\"checkbox\")}\n />\n )}\n {children}\n </span>\n\n {hasChildren && expanded && (\n <ul role=\"group\" className={withNodeBaseName(\"group\")}>\n {nodeChildren}\n </ul>\n )}\n </li>\n );\n});\n"],"names":["makePrefixer","forwardRef","TreeNodeTrigger","useWindow","useComponentCssInjection","treeNodeTriggerCss","useTreeNodeContext","useTreeContext","useRef","useForkRef","useState","useEffect","jsxs","clsx","jsx","TreeNodeExpansionIcon","CheckboxIcon"],"mappings":"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"}
@@ -7,12 +7,12 @@ function useEventCallback(fn) {
7
7
  const ref = react.useRef(fn);
8
8
  core.useIsomorphicLayoutEffect(() => {
9
9
  ref.current = fn;
10
- });
10
+ }, [fn]);
11
11
  return react.useCallback(
12
- (...args) => (
13
- // biome-ignore lint/complexity/noCommaOperator: This is a valid use case for the comma operator
14
- (0, ref.current)(...args)
15
- ),
12
+ ((...args) => {
13
+ const latestFn = ref.current;
14
+ return latestFn(...args);
15
+ }),
16
16
  []
17
17
  );
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useEventCallback.js","sources":["../src/utils/useEventCallback.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { useCallback, useRef } from \"react\";\n\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n */\nexport function useEventCallback<Args extends unknown[], Return>(\n fn: (...args: Args) => Return,\n): (...args: Args) => Return {\n const ref = useRef(fn);\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n });\n return useCallback(\n (...args: Args) =>\n // biome-ignore lint/complexity/noCommaOperator: This is a valid use case for the comma operator\n (void 0, ref.current)(...args),\n [],\n );\n}\n"],"names":["useRef","useIsomorphicLayoutEffect","useCallback"],"mappings":";;;;;AAMO,SAAS,iBACd,EAAA,EAC2B;AAC3B,EAAA,MAAM,GAAA,GAAMA,aAAO,EAAE,CAAA;AACrB,EAAAC,8BAAA,CAA0B,MAAM;AAC9B,IAAA,GAAA,CAAI,OAAA,GAAU,EAAA;AAAA,EAChB,CAAC,CAAA;AACD,EAAA,OAAOC,iBAAA;AAAA,IACL,CAAA,GAAI,IAAA;AAAA;AAAA,MAAA,IAEO,GAAA,CAAI,OAAA,EAAS,GAAG,IAAI;AAAA,KAAA;AAAA,IAC/B;AAAC,GACH;AACF;;;;"}
1
+ {"version":3,"file":"useEventCallback.js","sources":["../src/utils/useEventCallback.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { useCallback, useRef } from \"react\";\n\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n */\nexport function useEventCallback<const T extends (...args: any[]) => void>(\n fn: T,\n): T {\n const ref = useRef<T>(fn);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback(\n ((...args: any[]) => {\n const latestFn = ref.current;\n return latestFn(...args);\n }) as T,\n [],\n );\n}\n"],"names":["useRef","useIsomorphicLayoutEffect","useCallback"],"mappings":";;;;;AAMO,SAAS,iBACd,EAAA,EACG;AACH,EAAA,MAAM,GAAA,GAAMA,aAAU,EAAE,CAAA;AAExB,EAAAC,8BAAA,CAA0B,MAAM;AAC9B,IAAA,GAAA,CAAI,OAAA,GAAU,EAAA;AAAA,EAChB,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAEP,EAAA,OAAOC,iBAAA;AAAA,KACJ,IAAI,IAAA,KAAgB;AACnB,MAAA,MAAM,WAAW,GAAA,CAAI,OAAA;AACrB,MAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IACzB,CAAA;AAAA,IACA;AAAC,GACH;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".salt-density-touch {\n --calendar-day-highlight-size: 14px;\n}\n.salt-density-low {\n --calendar-day-highlight-size: 12px;\n}\n.salt-density-medium {\n --calendar-day-highlight-size: 10px;\n}\n.salt-density-high {\n --calendar-day-highlight-size: 8px;\n}\n\n.saltCalendarDay {\n --calendar-day-zIndex-content: calc(var(--salt-zIndex-default) + 1);\n --calendar-day-zIndex-highlight: calc(var(--calendar-day-zIndex-content) + 2);\n font-family: var(--salt-text-fontFamily);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n font-size: var(--salt-text-fontSize);\n width: var(--salt-size-base);\n height: var(--salt-size-base);\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n cursor: var(--salt-cursor-hover);\n border: none;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n}\n\n.saltCalendarDay-content {\n margin: 0 var(--salt-spacing-50);\n width: 100%;\n z-index: var(--calendar-day-zIndex-content);\n}\n\n.saltCalendarDay:hover {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd),\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before,\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd),\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before {\n border-radius: 0;\n}\n\n.saltCalendarDay-focused,\n.saltCalendarDay:focus,\n.saltCalendarDay:focus-visible {\n outline: none;\n z-index: var(--calendar-day-zIndex-content);\n}\n\n.saltCalendarDay-focused:focus-visible::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-focused-outlineWidth) * -1);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-selected .saltCalendarDay-content,\n.saltCalendarDay-selected:hover .saltCalendarDay-content,\n.saltCalendarDay-selectedStart .saltCalendarDay-content,\n.saltCalendarDay-hoveredStart .saltCalendarDay-content,\n.saltCalendarDay-selectedSpan .saltCalendarDay-content,\n.saltCalendarDay-hoveredSpan .saltCalendarDay-content,\n.saltCalendarDay-selectedEnd .saltCalendarDay-content,\n.saltCalendarDay-hoveredEnd .saltCalendarDay-content {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before,\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: calc(var(--calendar-gap) * -1);\n right: calc(var(--calendar-gap) * -1);\n bottom: 0;\n background: var(--salt-selectable-background-hover);\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n.saltCalendarDay-selectedStart::before,\n.saltCalendarDay-selectedEnd::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--salt-selectable-background-selected);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n.saltCalendarDay-selectedStart,\n.saltCalendarDay-selectedStart::before,\n.saltCalendarDay-focused.saltCalendarDay-selectedStart,\n.saltCalendarDay-focused.saltCalendarDay-selectedStart::before {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-focused.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart),\n.saltCalendarDay-focused.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart)::before,\n.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart),\n.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart)::before {\n border-radius: 0 var(--salt-palette-corner-weak, 0) var(--salt-palette-corner-weak, 0) 0;\n}\n\n.saltCalendarDay-focused.saltCalendarDay-selectedSameDay,\n.saltCalendarDay-focused.saltCalendarDay-selectedSameDay::before,\n.saltCalendarDay-selectedSameDay,\n.saltCalendarDay-selectedSameDay::before {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n/** Single selection styles */\n\n.saltCalendarMonth-single .saltCalendarDay:hover:not(.saltCalendarDay-selected) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-single .saltCalendarDay-selected::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-selected);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n/** Range selection styles */\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-selectedSpan,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredSpan {\n outline-offset: calc(calc(var(--salt-focused-outlineWidth) * -1));\n}\n\n.saltCalendarMonth-range .saltCalendarDay:hover:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-range .saltCalendarDay:hover.saltCalendarDay-selectedSpan::before,\n.saltCalendarMonth-range .saltCalendarDay:hover.saltCalendarDay-hoveredSpan::before,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-selectedStart)::before,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-selectedStart)::before {\n border-radius: 0;\n}\n\n.saltCalendarMonth-range .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd) {\n border-radius: 0;\n}\n\n.saltCalendarMonth-range .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-unselectable)::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: calc(var(--calendar-gap) * -1);\n right: 0;\n bottom: 0;\n background: var(--salt-selectable-background-hover);\n border-radius: 0;\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n/** Offset range styles */\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan,\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan::before {\n border-radius: 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-focused.saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart),\n.saltCalendarMonth-offset .saltCalendarDay-focused.saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart)::before {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay:hover:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd)::before {\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-background-hover);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-background-hover);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredStart,\n.saltCalendarMonth-offset .saltCalendarDay-selectedStart {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay.saltCalendarDay-hoveredEnd,\n.saltCalendarMonth-offset .saltCalendarDay-selectedEnd {\n border-radius: 0 var(--salt-palette-corner-weak, 0) var(--salt-palette-corner-weak, 0) 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan,\n.saltCalendarMonth-offset .saltCalendarDay-selectedSpan {\n border-radius: 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-selectedStart.saltCalendarDay-selectedEnd {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-outOfRange {\n color: var(--salt-content-secondary-foreground);\n}\n.saltCalendarDay-outOfRange:hover {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltCalendarDay-outOfRange .saltCalendarDay-today > span:last-of-type {\n border-bottom: var(--salt-size-indicator) var(--salt-borderStyle-solid) var(--salt-content-secondary-foreground);\n}\n\n.saltCalendarDay-outOfRange .saltCalendarDay-highlighted::after {\n background: var(--salt-content-secondary-foreground);\n}\n\n.saltCalendarDay-unselectable,\n.saltCalendarDay-unselectable:hover {\n background: var(--salt-selectable-background-disabled);\n cursor: var(--salt-cursor-disabled);\n}\n\n.saltCalendarDay-highlighted {\n position: absolute;\n left: 0;\n right: 0;\n height: 100%;\n overflow: hidden;\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-selectedEnd .saltCalendarDay-highlighted {\n right: 1px;\n}\n.saltCalendarDay-selectedSpan .saltCalendarDay-highlighted {\n right: -1px;\n}\n\n.saltCalendarDay-selectedStart .saltCalendarDay-highlighted,\n.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd) .saltCalendarDay-highlighted,\n.saltCalendarDay-hoveredSpan .saltCalendarDay-highlighted,\n.saltCalendarDay-selectedSpan .saltCalendarDay-highlighted {\n border-radius: 0;\n}\n\n.saltCalendarDay-selectedSameDay .saltCalendarDay-highlighted {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-highlighted::after {\n content: \"\";\n top: 0;\n right: 0;\n box-sizing: border-box;\n height: var(--calendar-day-highlight-size); /* TODO: change for size-modifier when available */\n width: var(--calendar-day-highlight-size);\n background: var(--salt-accent-background);\n position: absolute;\n clip-path: polygon(100% 0, 100% 100%, 0 0);\n z-index: var(--calendar-day-zIndex-highlight);\n}\n.saltCalendarDay-focused:focus-visible .saltCalendarDay-highlighted::after {\n border: var(--salt-focused-outline);\n}\n\n.saltCalendarDay-unselectable::after {\n content: \"\";\n height: var(--salt-size-fixed-100);\n width: calc(100% - var(--salt-spacing-100));\n background: var(--salt-content-secondary-foreground);\n position: absolute;\n}\n\n.saltCalendarDay-today > span:last-of-type::after {\n content: \"\";\n display: block;\n width: calc(100% - calc(var(--salt-spacing-50) * 2));\n height: var(--salt-size-indicator);\n background: var(--salt-accent-borderColor);\n border-radius: var(--salt-palette-corner-weak);\n position: absolute;\n bottom: var(--salt-spacing-50);\n left: var(--salt-spacing-50);\n right: var(--salt-spacing-50);\n}\n\n.saltCalendarDay-hidden {\n visibility: hidden;\n}\n";
1
+ var css_248z = ".salt-density-touch {\n --calendar-day-highlight-size: 14px;\n}\n.salt-density-low {\n --calendar-day-highlight-size: 12px;\n}\n.salt-density-medium {\n --calendar-day-highlight-size: 10px;\n}\n.salt-density-high {\n --calendar-day-highlight-size: 8px;\n}\n\n.saltCalendarDay {\n --calendar-day-zIndex-content: calc(var(--salt-zIndex-default) + 1);\n --calendar-day-zIndex-highlight: calc(var(--calendar-day-zIndex-content) + 2);\n font-family: var(--salt-text-fontFamily);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n font-size: var(--salt-text-fontSize);\n width: var(--salt-size-base);\n height: var(--salt-size-base);\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n cursor: var(--salt-cursor-hover);\n border: none;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n}\n\n.saltCalendarDay-content {\n margin: 0 var(--salt-spacing-50);\n width: 100%;\n z-index: var(--calendar-day-zIndex-content);\n}\n\n.saltCalendarDay:hover {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd),\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before,\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd),\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before {\n border-radius: 0;\n}\n\n.saltCalendarDay-focused,\n.saltCalendarDay:focus,\n.saltCalendarDay:focus-visible {\n outline: none;\n z-index: var(--calendar-day-zIndex-content);\n}\n\n.saltCalendarDay-focused:focus-visible::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-focused-outlineWidth) * -1);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-selected .saltCalendarDay-content,\n.saltCalendarDay-selected:hover .saltCalendarDay-content,\n.saltCalendarDay-selectedStart .saltCalendarDay-content,\n.saltCalendarDay-hoveredStart .saltCalendarDay-content,\n.saltCalendarDay-selectedSpan .saltCalendarDay-content,\n.saltCalendarDay-hoveredSpan .saltCalendarDay-content,\n.saltCalendarDay-selectedEnd .saltCalendarDay-content,\n.saltCalendarDay-hoveredEnd .saltCalendarDay-content {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before,\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: calc(var(--calendar-gap) * -1);\n right: calc(var(--calendar-gap) * -1);\n bottom: 0;\n background: var(--salt-selectable-background-hover);\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n.saltCalendarDay-selectedStart::before,\n.saltCalendarDay-selectedEnd::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--salt-selectable-background-selected);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n.saltCalendarDay-selectedStart,\n.saltCalendarDay-selectedStart::before,\n.saltCalendarDay-focused.saltCalendarDay-selectedStart,\n.saltCalendarDay-focused.saltCalendarDay-selectedStart::before {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-focused.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart),\n.saltCalendarDay-focused.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart)::before,\n.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart),\n.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart)::before {\n border-radius: 0 var(--salt-palette-corner-weak, 0) var(--salt-palette-corner-weak, 0) 0;\n}\n\n.saltCalendarDay-focused.saltCalendarDay-selectedSameDay,\n.saltCalendarDay-focused.saltCalendarDay-selectedSameDay::before,\n.saltCalendarDay-selectedSameDay,\n.saltCalendarDay-selectedSameDay::before {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n/** Single selection styles */\n\n.saltCalendarMonth-single .saltCalendarDay:hover:not(.saltCalendarDay-selected) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-single .saltCalendarDay-selected::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-selected);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n/** Range selection styles */\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-selectedSpan,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredSpan {\n outline-offset: calc(calc(var(--salt-focused-outlineWidth) * -1));\n}\n\n.saltCalendarMonth-range .saltCalendarDay:hover:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-range .saltCalendarDay:hover.saltCalendarDay-selectedSpan::before,\n.saltCalendarMonth-range .saltCalendarDay:hover.saltCalendarDay-hoveredSpan::before,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-selectedStart)::before,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-selectedStart)::before {\n border-radius: 0;\n}\n\n.saltCalendarMonth-range .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd) {\n border-radius: 0;\n}\n\n.saltCalendarMonth-range .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-unselectable)::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: calc(var(--calendar-gap) * -1);\n right: 0;\n bottom: 0;\n background: var(--salt-selectable-background-hover);\n border-radius: 0;\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n/** Offset range styles */\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan,\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan::before {\n border-radius: 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-focused.saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart),\n.saltCalendarMonth-offset .saltCalendarDay-focused.saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart)::before {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay:hover:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd)::before {\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-background-hover);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-background-hover);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredStart,\n.saltCalendarMonth-offset .saltCalendarDay-selectedStart {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay.saltCalendarDay-hoveredEnd,\n.saltCalendarMonth-offset .saltCalendarDay-selectedEnd {\n border-radius: 0 var(--salt-palette-corner-weak, 0) var(--salt-palette-corner-weak, 0) 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan,\n.saltCalendarMonth-offset .saltCalendarDay-selectedSpan {\n border-radius: 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-selectedStart.saltCalendarDay-selectedEnd {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-outOfRange {\n color: var(--salt-content-secondary-foreground);\n}\n.saltCalendarDay-outOfRange:hover {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltCalendarDay-outOfRange .saltCalendarDay-today > span:last-of-type {\n border-bottom: var(--salt-size-indicator) var(--salt-borderStyle-solid) var(--salt-content-secondary-foreground);\n}\n\n.saltCalendarDay-outOfRange .saltCalendarDay-highlighted::after {\n background: var(--salt-content-secondary-foreground);\n}\n\n.saltCalendarDay-unselectable,\n.saltCalendarDay-unselectable:hover {\n background: var(--salt-selectable-background-disabled);\n cursor: var(--salt-cursor-disabled);\n}\n\n.saltCalendarDay-highlighted {\n position: absolute;\n left: 0;\n right: 0;\n height: 100%;\n overflow: hidden;\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-selectedEnd .saltCalendarDay-highlighted {\n right: 1px;\n}\n.saltCalendarDay-selectedSpan .saltCalendarDay-highlighted {\n right: -1px;\n}\n\n.saltCalendarDay-selectedStart .saltCalendarDay-highlighted,\n.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd) .saltCalendarDay-highlighted,\n.saltCalendarDay-hoveredSpan .saltCalendarDay-highlighted,\n.saltCalendarDay-selectedSpan .saltCalendarDay-highlighted {\n border-radius: 0;\n}\n\n.saltCalendarDay-selectedSameDay .saltCalendarDay-highlighted {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-highlighted::after {\n content: \"\";\n top: 0;\n right: 0;\n box-sizing: border-box;\n height: var(--calendar-day-highlight-size); /* TODO: change for size-modifier when available */\n width: var(--calendar-day-highlight-size);\n background: var(--salt-sentiment-accent-background);\n position: absolute;\n clip-path: polygon(100% 0, 100% 100%, 0 0);\n z-index: var(--calendar-day-zIndex-highlight);\n}\n.saltCalendarDay-focused:focus-visible .saltCalendarDay-highlighted::after {\n border: var(--salt-focused-outline);\n}\n\n.saltCalendarDay-unselectable::after {\n content: \"\";\n height: var(--salt-size-fixed-100);\n width: calc(100% - var(--salt-spacing-100));\n background: var(--salt-content-secondary-foreground);\n position: absolute;\n}\n\n.saltCalendarDay-today > span:last-of-type::after {\n content: \"\";\n display: block;\n width: calc(100% - calc(var(--salt-spacing-50) * 2));\n height: var(--salt-size-indicator);\n background: var(--salt-sentiment-accent-borderColor);\n border-radius: var(--salt-palette-corner-weak);\n position: absolute;\n bottom: var(--salt-spacing-50);\n left: var(--salt-spacing-50);\n right: var(--salt-spacing-50);\n}\n\n.saltCalendarDay-hidden {\n visibility: hidden;\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=CalendarDay.css.js.map
@@ -1,4 +1,4 @@
1
- var css_248z = ".salt-density-touch {\n --contactDetails-default-primary-fontSize: 30px;\n --contactDetails-default-secondary-fontSize: 16px;\n --contactDetails-compact-primary-fontSize: 16px;\n --contactDetails-compact-secondary-fontSize: 14px;\n --contactDetails-icon-size: 18px;\n --contactDetails-label-width: 80px;\n}\n\n.salt-density-low {\n --contactDetails-compact-primary-fontSize: 14px;\n --contactDetails-default-primary-fontSize: 24px;\n --contactDetails-compact-secondary-fontSize: 14px;\n --contactDetails-default-secondary-fontSize: 14px;\n --contactDetails-label-width: 70px;\n --contactDetails-icon-size: 16px;\n}\n\n.salt-density-medium {\n --contactDetails-compact-primary-fontSize: 12px;\n --contactDetails-default-primary-fontSize: 18px;\n --contactDetails-compact-secondary-fontSize: 12px;\n --contactDetails-default-secondary-fontSize: 12px;\n --contactDetails-label-width: 60px;\n --contactDetails-icon-size: 14px;\n}\n\n.salt-density-high {\n --contactDetails-compact-primary-fontSize: 11px;\n --contactDetails-default-primary-fontSize: 14px;\n --contactDetails-compact-secondary-fontSize: 11px;\n --contactDetails-default-secondary-fontSize: 11px;\n --contactDetails-label-width: 60px;\n --contactDetails-icon-size: 12px;\n}\n\n.saltContactDetails {\n --contactDetails-color: var(--salt-content-primary-foreground);\n --contactDetails-label-color: var(--salt-content-secondary-foreground);\n --contactDetails-noAvatar-color: var(--salt-accent-background);\n --contactDetails-noAvatar-indicator-width: 4px;\n --contactDetails-favoriteToggle-fill: var(--contactDetails-deselected-icon-color);\n --contactDetails-favoriteToggle-marginRight: 0px;\n --contactDetails-favoriteToggle-marginTop: 0px;\n --contactDetails-mini-secondaryInfo-marginLeft: var(--salt-size-unit);\n --contactDetails-mini-stacked-secondaryInfo-marginLeft: calc(var(--salt-size-unit) * 2);\n --contactDetails-compact-tertiaryInfo-marginLeft: var(--salt-size-unit);\n\n /* TODO: Check below tokens with design */\n --contactDetails-separator-color: var(--salt-separable-secondary-borderColor);\n}\n\n.saltContactDetails {\n display: grid;\n padding: var(--salt-size-unit);\n}\n\n.saltContactDetails.saltContactDetails-noAvatar {\n padding-left: 0;\n}\n\n.saltContactDetails.saltContactDetails-embedded {\n padding: 0;\n}\n\n.saltContactDetails-default,\n.saltContactDetails-default-stacked {\n --contactDetails-primary-fontSize: var(--contactDetails-default-primary-fontSize);\n --contactDetails-secondary-fontSize: var(--contactDetails-default-secondary-fontSize);\n}\n\n.saltContactDetails-compact,\n.saltContactDetails-compact-stacked {\n --contactDetails-primary-fontSize: var(--contactDetails-compact-primary-fontSize);\n --contactDetails-secondary-fontSize: var(--contactDetails-compact-secondary-fontSize);\n}\n\n.saltContactDetails-mini,\n.saltContactDetails-mini-stacked {\n --contactDetails-primary-fontSize: var(--contactDetails-compact-primary-fontSize);\n --contactDetails-secondary-fontSize: var(--contactDetails-compact-secondary-fontSize);\n}\n\n.saltContactDetails-default {\n color: var(--contactDetails-color);\n grid-template-columns: auto auto 1fr auto;\n grid-template-rows: auto auto auto auto auto;\n grid-template-areas:\n \"noAvatar avatar primary favorite\"\n \"noAvatar avatar secondary secondary\"\n \"noAvatar avatar tertiary tertiary\"\n \". . actions metadataExpander\"\n \". . metadata metadata\";\n}\n\n.saltContactDetails-default-stacked {\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto auto auto auto auto auto;\n grid-template-areas:\n \"noAvatar avatar avatar\"\n \"noAvatar primary favorite\"\n \"noAvatar secondary secondary\"\n \"noAvatar tertiary tertiary\"\n \". actions metadataExpander\"\n \". metadata metadata\";\n}\n\n.saltContactDetails-compact {\n grid-template-columns: auto auto auto 1fr auto;\n grid-template-rows: auto auto auto;\n grid-template-areas:\n \"noAvatar avatar primary primary favorite\"\n \"noAvatar avatar secondary tertiary tertiary\"\n \". . actions actions actions\";\n}\n\n.saltContactDetails-compact-stacked {\n grid-template-columns: auto auto 1fr auto;\n grid-template-rows: auto auto auto auto;\n grid-template-areas:\n \"noAvatar avatar primary favorite\"\n \"noAvatar avatar secondary favorite\"\n \"noAvatar avatar tertiary tertiary\"\n \". . actions actions\";\n}\n\n.saltContactDetails-mini,\n.saltContactDetails-mini-stacked {\n grid-template-columns: auto minmax(60px, 1fr) auto;\n grid-template-rows: auto;\n grid-template-areas: \"primary secondary favorite\";\n}\n\n.saltContactDetails-noAvatar-indicator {\n grid-area: noAvatar;\n width: var(--contactDetails-noAvatar-indicator-width);\n background: var(--contactDetails-noAvatar-color);\n margin-right: var(--salt-size-unit);\n}\n\n.saltContactAvatar {\n grid-area: avatar;\n margin-right: var(--salt-size-unit);\n}\n\n.saltContactAvatar-stacked {\n margin-bottom: var(--salt-size-unit);\n}\n\n.saltContactActions {\n grid-area: actions;\n display: flex;\n margin-top: var(--salt-size-unit);\n margin-left: calc(var(--salt-size-unit) * -1);\n}\n\n.saltContactPrimaryInfo {\n grid-area: primary;\n}\n\n.saltContactDetails-default .saltContactPrimaryInfo {\n margin-bottom: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactSecondaryInfo {\n grid-area: secondary;\n}\n\n.saltContactDetails-mini .saltContactSecondaryInfo {\n margin-left: var(--contactDetails-mini-secondaryInfo-marginLeft);\n}\n\n/* TODO Mini-stacked does not really look \"stacked\". Is it a bug? */\n.saltContactDetails-mini-stacked .saltContactSecondaryInfo {\n margin-left: var(--contactDetails-mini-stacked-secondaryInfo-marginLeft);\n}\n\n.saltContactSecondaryInfo-icon {\n margin-right: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactTertiaryInfo {\n grid-area: tertiary;\n}\n\n.saltContactDetails-compact .saltContactTertiaryInfo {\n margin-left: var(--contactDetails-compact-tertiaryInfo-marginLeft);\n}\n\n.saltContactTertiaryInfo-icon {\n margin-right: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactMetadata {\n grid-area: metadata;\n display: flex;\n flex-direction: column;\n padding-top: var(--salt-size-unit);\n padding-bottom: var(--salt-size-unit);\n}\n\n.saltContactMetadata-expander {\n grid-area: metadataExpander;\n margin-top: var(--salt-size-unit);\n}\n\n.saltContactMetadata-separator {\n width: 100%;\n height: 1px;\n background: var(--contactDetails-separator-color);\n margin-bottom: var(--salt-size-unit);\n}\n\n.saltContactMetadataItem {\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-bottom: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactMetadataItem:last-child {\n margin-bottom: unset;\n}\n\n.saltContactMetadata-stacked .saltContactMetadataItem {\n flex-direction: column;\n align-items: flex-start;\n}\n\n.saltContactMetadataItem-icon {\n margin-right: calc(var(--salt-size-unit) * 2);\n padding-left: 1px;\n}\n\n.saltContactMetadataItem-label {\n flex-shrink: 0;\n color: var(--contactDetails-label-color);\n margin-right: calc(var(--salt-size-unit) * 2);\n width: var(--contactDetails-label-width);\n}\n\n.saltContactFavoriteToggle {\n align-self: start;\n grid-area: favorite;\n justify-self: center;\n line-height: var(--contactDetails-primary-fontSize);\n margin-right: var(--contactDetails-favoriteToggle-marginRight);\n margin-top: var(--contactDetails-favoriteToggle-marginTop);\n}\n\n.saltContactFavoriteToggle-svg {\n fill: var(--contactDetails-favoriteToggle-fill);\n}\n\n.saltContactFavoriteToggle-focusVisible {\n outline: none;\n}\n\n.saltContactFavoriteToggle-focused {\n outline: var(--salt-focused-outline);\n}\n\n.saltContactFavoriteToggle-deselected {\n --contactDetails-favoriteToggle-fill: var(--salt-accent-borderColor);\n}\n\n.saltContactFavoriteToggle-selecting {\n --contactDetails-favoriteToggle-fill: var(--salt-selectable-foreground-hover);\n}\n\n.saltContactFavoriteToggle-selected {\n --contactDetails-favoriteToggle-fill: var(--salt-selectable-foreground-selected);\n}\n\n.saltContactFavoriteToggle-deselecting {\n --contactDetails-favoriteToggle-fill: var(--salt-selectable-foreground-hover);\n}\n\n.saltContactFavoriteToggle-svg {\n height: var(--contactDetails-icon-size);\n width: var(--contactDetails-icon-size);\n}\n";
1
+ var css_248z = ".salt-density-touch {\n --contactDetails-default-primary-fontSize: 30px;\n --contactDetails-default-secondary-fontSize: 16px;\n --contactDetails-compact-primary-fontSize: 16px;\n --contactDetails-compact-secondary-fontSize: 14px;\n --contactDetails-icon-size: 18px;\n --contactDetails-label-width: 80px;\n}\n\n.salt-density-low {\n --contactDetails-compact-primary-fontSize: 14px;\n --contactDetails-default-primary-fontSize: 24px;\n --contactDetails-compact-secondary-fontSize: 14px;\n --contactDetails-default-secondary-fontSize: 14px;\n --contactDetails-label-width: 70px;\n --contactDetails-icon-size: 16px;\n}\n\n.salt-density-medium {\n --contactDetails-compact-primary-fontSize: 12px;\n --contactDetails-default-primary-fontSize: 18px;\n --contactDetails-compact-secondary-fontSize: 12px;\n --contactDetails-default-secondary-fontSize: 12px;\n --contactDetails-label-width: 60px;\n --contactDetails-icon-size: 14px;\n}\n\n.salt-density-high {\n --contactDetails-compact-primary-fontSize: 11px;\n --contactDetails-default-primary-fontSize: 14px;\n --contactDetails-compact-secondary-fontSize: 11px;\n --contactDetails-default-secondary-fontSize: 11px;\n --contactDetails-label-width: 60px;\n --contactDetails-icon-size: 12px;\n}\n\n.saltContactDetails {\n --contactDetails-color: var(--salt-content-primary-foreground);\n --contactDetails-label-color: var(--salt-content-secondary-foreground);\n --contactDetails-noAvatar-color: var(--salt-sentiment-accent-background);\n --contactDetails-noAvatar-indicator-width: 4px;\n --contactDetails-favoriteToggle-fill: var(--contactDetails-deselected-icon-color);\n --contactDetails-favoriteToggle-marginRight: 0px;\n --contactDetails-favoriteToggle-marginTop: 0px;\n --contactDetails-mini-secondaryInfo-marginLeft: var(--salt-size-unit);\n --contactDetails-mini-stacked-secondaryInfo-marginLeft: calc(var(--salt-size-unit) * 2);\n --contactDetails-compact-tertiaryInfo-marginLeft: var(--salt-size-unit);\n\n /* TODO: Check below tokens with design */\n --contactDetails-separator-color: var(--salt-separable-secondary-borderColor);\n}\n\n.saltContactDetails {\n display: grid;\n padding: var(--salt-size-unit);\n}\n\n.saltContactDetails.saltContactDetails-noAvatar {\n padding-left: 0;\n}\n\n.saltContactDetails.saltContactDetails-embedded {\n padding: 0;\n}\n\n.saltContactDetails-default,\n.saltContactDetails-default-stacked {\n --contactDetails-primary-fontSize: var(--contactDetails-default-primary-fontSize);\n --contactDetails-secondary-fontSize: var(--contactDetails-default-secondary-fontSize);\n}\n\n.saltContactDetails-compact,\n.saltContactDetails-compact-stacked {\n --contactDetails-primary-fontSize: var(--contactDetails-compact-primary-fontSize);\n --contactDetails-secondary-fontSize: var(--contactDetails-compact-secondary-fontSize);\n}\n\n.saltContactDetails-mini,\n.saltContactDetails-mini-stacked {\n --contactDetails-primary-fontSize: var(--contactDetails-compact-primary-fontSize);\n --contactDetails-secondary-fontSize: var(--contactDetails-compact-secondary-fontSize);\n}\n\n.saltContactDetails-default {\n color: var(--contactDetails-color);\n grid-template-columns: auto auto 1fr auto;\n grid-template-rows: auto auto auto auto auto;\n grid-template-areas:\n \"noAvatar avatar primary favorite\"\n \"noAvatar avatar secondary secondary\"\n \"noAvatar avatar tertiary tertiary\"\n \". . actions metadataExpander\"\n \". . metadata metadata\";\n}\n\n.saltContactDetails-default-stacked {\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto auto auto auto auto auto;\n grid-template-areas:\n \"noAvatar avatar avatar\"\n \"noAvatar primary favorite\"\n \"noAvatar secondary secondary\"\n \"noAvatar tertiary tertiary\"\n \". actions metadataExpander\"\n \". metadata metadata\";\n}\n\n.saltContactDetails-compact {\n grid-template-columns: auto auto auto 1fr auto;\n grid-template-rows: auto auto auto;\n grid-template-areas:\n \"noAvatar avatar primary primary favorite\"\n \"noAvatar avatar secondary tertiary tertiary\"\n \". . actions actions actions\";\n}\n\n.saltContactDetails-compact-stacked {\n grid-template-columns: auto auto 1fr auto;\n grid-template-rows: auto auto auto auto;\n grid-template-areas:\n \"noAvatar avatar primary favorite\"\n \"noAvatar avatar secondary favorite\"\n \"noAvatar avatar tertiary tertiary\"\n \". . actions actions\";\n}\n\n.saltContactDetails-mini,\n.saltContactDetails-mini-stacked {\n grid-template-columns: auto minmax(60px, 1fr) auto;\n grid-template-rows: auto;\n grid-template-areas: \"primary secondary favorite\";\n}\n\n.saltContactDetails-noAvatar-indicator {\n grid-area: noAvatar;\n width: var(--contactDetails-noAvatar-indicator-width);\n background: var(--contactDetails-noAvatar-color);\n margin-right: var(--salt-size-unit);\n}\n\n.saltContactAvatar {\n grid-area: avatar;\n margin-right: var(--salt-size-unit);\n}\n\n.saltContactAvatar-stacked {\n margin-bottom: var(--salt-size-unit);\n}\n\n.saltContactActions {\n grid-area: actions;\n display: flex;\n margin-top: var(--salt-size-unit);\n margin-left: calc(var(--salt-size-unit) * -1);\n}\n\n.saltContactPrimaryInfo {\n grid-area: primary;\n}\n\n.saltContactDetails-default .saltContactPrimaryInfo {\n margin-bottom: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactSecondaryInfo {\n grid-area: secondary;\n}\n\n.saltContactDetails-mini .saltContactSecondaryInfo {\n margin-left: var(--contactDetails-mini-secondaryInfo-marginLeft);\n}\n\n/* TODO Mini-stacked does not really look \"stacked\". Is it a bug? */\n.saltContactDetails-mini-stacked .saltContactSecondaryInfo {\n margin-left: var(--contactDetails-mini-stacked-secondaryInfo-marginLeft);\n}\n\n.saltContactSecondaryInfo-icon {\n margin-right: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactTertiaryInfo {\n grid-area: tertiary;\n}\n\n.saltContactDetails-compact .saltContactTertiaryInfo {\n margin-left: var(--contactDetails-compact-tertiaryInfo-marginLeft);\n}\n\n.saltContactTertiaryInfo-icon {\n margin-right: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactMetadata {\n grid-area: metadata;\n display: flex;\n flex-direction: column;\n padding-top: var(--salt-size-unit);\n padding-bottom: var(--salt-size-unit);\n}\n\n.saltContactMetadata-expander {\n grid-area: metadataExpander;\n margin-top: var(--salt-size-unit);\n}\n\n.saltContactMetadata-separator {\n width: 100%;\n height: 1px;\n background: var(--contactDetails-separator-color);\n margin-bottom: var(--salt-size-unit);\n}\n\n.saltContactMetadataItem {\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-bottom: calc(var(--salt-size-unit) * 0.5);\n}\n\n.saltContactMetadataItem:last-child {\n margin-bottom: unset;\n}\n\n.saltContactMetadata-stacked .saltContactMetadataItem {\n flex-direction: column;\n align-items: flex-start;\n}\n\n.saltContactMetadataItem-icon {\n margin-right: calc(var(--salt-size-unit) * 2);\n padding-left: 1px;\n}\n\n.saltContactMetadataItem-label {\n flex-shrink: 0;\n color: var(--contactDetails-label-color);\n margin-right: calc(var(--salt-size-unit) * 2);\n width: var(--contactDetails-label-width);\n}\n\n.saltContactFavoriteToggle {\n align-self: start;\n grid-area: favorite;\n justify-self: center;\n line-height: var(--contactDetails-primary-fontSize);\n margin-right: var(--contactDetails-favoriteToggle-marginRight);\n margin-top: var(--contactDetails-favoriteToggle-marginTop);\n}\n\n.saltContactFavoriteToggle-svg {\n fill: var(--contactDetails-favoriteToggle-fill);\n}\n\n.saltContactFavoriteToggle-focusVisible {\n outline: none;\n}\n\n.saltContactFavoriteToggle-focused {\n outline: var(--salt-focused-outline);\n}\n\n.saltContactFavoriteToggle-deselected {\n --contactDetails-favoriteToggle-fill: var(--salt-sentiment-accent-borderColor);\n}\n\n.saltContactFavoriteToggle-selecting {\n --contactDetails-favoriteToggle-fill: var(--salt-selectable-foreground-hover);\n}\n\n.saltContactFavoriteToggle-selected {\n --contactDetails-favoriteToggle-fill: var(--salt-selectable-foreground-selected);\n}\n\n.saltContactFavoriteToggle-deselecting {\n --contactDetails-favoriteToggle-fill: var(--salt-selectable-foreground-hover);\n}\n\n.saltContactFavoriteToggle-svg {\n height: var(--contactDetails-icon-size);\n width: var(--contactDetails-icon-size);\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=ContactDetails.css.js.map
@@ -1,6 +1,6 @@
1
1
  import { createContext, useContext } from 'react';
2
2
 
3
- const ListStateContext = createContext();
3
+ const ListStateContext = createContext(void 0);
4
4
  const useListStateContext = () => {
5
5
  const context = useContext(ListStateContext);
6
6
  if (!context) {
@@ -1 +1 @@
1
- {"version":3,"file":"ListStateContext.js","sources":["../src/list-deprecated/ListStateContext.js"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\nexport const ListStateContext = createContext();\n\nexport const useListStateContext = () => {\n const context = useContext(ListStateContext);\n\n if (!context) {\n throw new Error(\n \"useListStateContext must be used inside of a ListStateContext Provider.\",\n );\n }\n\n return context;\n};\n"],"names":[],"mappings":";;AAEO,MAAM,mBAAmB,aAAA;AAEzB,MAAM,sBAAsB,MAAM;AACvC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;;;;"}
1
+ {"version":3,"file":"ListStateContext.js","sources":["../src/list-deprecated/ListStateContext.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\ninterface ListStateContextValue {\n state: any;\n helpers: any;\n}\n\nexport const ListStateContext = createContext<\n ListStateContextValue | undefined\n>(undefined);\n\nexport const useListStateContext = () => {\n const context = useContext(ListStateContext);\n\n if (!context) {\n throw new Error(\n \"useListStateContext must be used inside of a ListStateContext Provider.\",\n );\n }\n\n return context;\n};\n"],"names":[],"mappings":";;AAOO,MAAM,gBAAA,GAAmB,cAE9B,MAAS;AAEJ,MAAM,sBAAsB,MAAM;AACvC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltTabBar {\n display: flex;\n align-items: center;\n flex-direction: row;\n gap: var(--salt-spacing-100);\n position: relative;\n box-sizing: border-box;\n}\n\n.saltTabBar-divider::before {\n content: \"\";\n position: absolute;\n inset: auto 0 0 0;\n height: var(--salt-size-fixed-100);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-secondary-borderColor);\n}\n\n.saltTabBar-inset {\n padding-left: var(--salt-spacing-300);\n padding-right: var(--salt-spacing-300);\n}\n";
1
+ var css_248z = ".saltTabBar {\n display: flex;\n align-items: center;\n flex-direction: row;\n position: relative;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n}\n\n.saltTabBar-strip {\n display: flex;\n align-items: center;\n flex-direction: row;\n flex: 1 1 auto;\n gap: var(--salt-spacing-100);\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n}\n\n.saltTabBar-divider::before {\n content: \"\";\n position: absolute;\n inset: auto 0 0 0;\n height: var(--salt-size-fixed-100);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-secondary-borderColor);\n}\n\n.saltTabBar-inset {\n padding-left: var(--salt-spacing-300);\n padding-right: var(--salt-spacing-300);\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=TabBar.css.js.map
@@ -29,7 +29,7 @@ const TabBar = forwardRef(
29
29
  ),
30
30
  ...rest,
31
31
  ref,
32
- children
32
+ children: /* @__PURE__ */ jsx("div", { className: withBaseName("strip"), children })
33
33
  }
34
34
  );
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TabBar.js","sources":["../src/tabs-next/TabBar.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 ComponentPropsWithRef, forwardRef } from \"react\";\nimport tabBarCss from \"./TabBar.css\";\n\nexport interface TabBarProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Styling variant with a bottom separator. Defaults to false\n */\n divider?: boolean;\n /**\n * Styling variant with left and right padding. Defaults to false\n */\n inset?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltTabBar\");\n\nexport const TabBar = forwardRef<HTMLDivElement, TabBarProps>(\n function TabBar(props, ref) {\n const { className, children, divider, inset, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-bar\",\n css: tabBarCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"divider\")]: divider,\n [withBaseName(\"inset\")]: inset,\n },\n className,\n )}\n {...rest}\n ref={ref}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["TabBar","tabBarCss"],"mappings":";;;;;;;;AAkBA,MAAM,YAAA,GAAe,aAAa,YAAY,CAAA;AAEvC,MAAM,MAAA,GAAS,UAAA;AAAA,EACpB,SAASA,OAAAA,CAAO,KAAA,EAAO,GAAA,EAAK;AAC1B,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,SAAS,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AAEzD,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,cAAA;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;AAAA,UACT,YAAA,EAAa;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG,OAAA;AAAA,YAC3B,CAAC,YAAA,CAAa,OAAO,CAAC,GAAG;AAAA,WAC3B;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"TabBar.js","sources":["../src/tabs-next/TabBar.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 ComponentPropsWithRef, forwardRef } from \"react\";\nimport tabBarCss from \"./TabBar.css\";\n\nexport interface TabBarProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Styling variant with a bottom separator. Defaults to false\n */\n divider?: boolean;\n /**\n * Styling variant with left and right padding. Defaults to false\n */\n inset?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltTabBar\");\n\nexport const TabBar = forwardRef<HTMLDivElement, TabBarProps>(\n function TabBar(props, ref) {\n const { className, children, divider, inset, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-bar\",\n css: tabBarCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"divider\")]: divider,\n [withBaseName(\"inset\")]: inset,\n },\n className,\n )}\n {...rest}\n ref={ref}\n >\n <div className={withBaseName(\"strip\")}>{children}</div>\n </div>\n );\n },\n);\n"],"names":["TabBar","tabBarCss"],"mappings":";;;;;;;;AAkBA,MAAM,YAAA,GAAe,aAAa,YAAY,CAAA;AAEvC,MAAM,MAAA,GAAS,UAAA;AAAA,EACpB,SAASA,OAAAA,CAAO,KAAA,EAAO,GAAA,EAAK;AAC1B,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,SAAS,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AAEzD,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,cAAA;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;AAAA,UACT,YAAA,EAAa;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG,OAAA;AAAA,YAC3B,CAAC,YAAA,CAAa,OAAO,CAAC,GAAG;AAAA,WAC3B;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEA,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,OAAO,GAAI,QAAA,EAAS;AAAA;AAAA,KACnD;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,10 @@
1
+ import { createContext } from '@salt-ds/core';
2
+ import { useContext } from 'react';
3
+
4
+ const TabListLayoutContext = createContext("TabListLayoutContext", null);
5
+ function useTabListLayout() {
6
+ return useContext(TabListLayoutContext);
7
+ }
8
+
9
+ export { TabListLayoutContext, useTabListLayout };
10
+ //# sourceMappingURL=TabListLayoutContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabListLayoutContext.js","sources":["../src/tabs-next/TabListLayoutContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\n\nexport type TabSlotLocation = \"hidden\" | \"main\" | \"overflow\";\n\nexport interface TabListLayoutContextValue {\n getLocation: (value: string) => TabSlotLocation;\n overflowActiveValue: string | null;\n setOverflowActiveValue: (value: string | null) => void;\n moveOverflowFocus: (\n key: \"ArrowDown\" | \"ArrowUp\" | \"Home\" | \"End\",\n value: string,\n ) => boolean;\n}\n\nexport const TabListLayoutContext =\n createContext<TabListLayoutContextValue | null>(\"TabListLayoutContext\", null);\n\nexport function useTabListLayout() {\n return useContext(TabListLayoutContext);\n}\n"],"names":[],"mappings":";;;AAeO,MAAM,oBAAA,GACX,aAAA,CAAgD,sBAAA,EAAwB,IAAI;AAEvE,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAO,WAAW,oBAAoB,CAAA;AACxC;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = "/* Component class applied to the root element */\n.saltTabListNext {\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n position: relative;\n background: transparent;\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n gap: var(--salt-spacing-100);\n max-width: 100%;\n width: 100%;\n min-width: 0;\n}\n\n.saltTabListNext-center {\n justify-content: center;\n}\n\n.saltTabListNext-right {\n justify-content: flex-end;\n}\n\n.saltTabListNext-activeColorPrimary {\n --saltTabListNext-activeColor: var(--salt-container-primary-background);\n}\n\n.saltTabListNext-activeColorSecondary {\n --saltTabListNext-activeColor: var(--salt-container-secondary-background);\n}\n\n.saltTabListNext-activeColorTertiary {\n --saltTabListNext-activeColor: var(--salt-container-tertiary-background);\n}\n\n.saltTabListNext-overflowWarning {\n display: none;\n}\n";
1
+ var css_248z = "/* Component class applied to the root element */\n.saltTabListNext {\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n position: relative;\n background: transparent;\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n gap: var(--salt-spacing-100);\n max-width: 100%;\n min-width: 0;\n flex: 0 1 auto;\n}\n\n.saltTabListNext-center {\n justify-content: center;\n}\n\n.saltTabListNext-right {\n justify-content: flex-end;\n}\n\n.saltTabListNext-activeColorPrimary {\n --saltTabListNext-activeColor: var(--salt-container-primary-background);\n}\n\n.saltTabListNext-activeColorSecondary {\n --saltTabListNext-activeColor: var(--salt-container-secondary-background);\n}\n\n.saltTabListNext-activeColorTertiary {\n --saltTabListNext-activeColor: var(--salt-container-tertiary-background);\n}\n\n.saltTabListNext-measureContainer {\n position: absolute;\n top: 0;\n left: 0;\n height: 0;\n overflow: hidden;\n pointer-events: none;\n visibility: hidden;\n white-space: nowrap;\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=TabListNext.css.js.map