@salt-ds/core 1.64.0 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/css/salt-core.css +243 -3
  3. package/dist-cjs/avatar/Avatar.css.js +1 -1
  4. package/dist-cjs/avatar/Avatar.js +12 -2
  5. package/dist-cjs/avatar/Avatar.js.map +1 -1
  6. package/dist-cjs/index.js +6 -0
  7. package/dist-cjs/index.js.map +1 -1
  8. package/dist-cjs/pagination/PageButton.css.js +1 -1
  9. package/dist-cjs/salt-provider/ThemeApplicator.js +1 -1
  10. package/dist-cjs/salt-provider/ThemeApplicator.js.map +1 -1
  11. package/dist-cjs/toolbar/Toolbar.css.js +6 -0
  12. package/dist-cjs/toolbar/Toolbar.css.js.map +1 -0
  13. package/dist-cjs/toolbar/Toolbar.js +401 -0
  14. package/dist-cjs/toolbar/Toolbar.js.map +1 -0
  15. package/dist-cjs/toolbar/ToolbarContent.css.js +6 -0
  16. package/dist-cjs/toolbar/ToolbarContent.css.js.map +1 -0
  17. package/dist-cjs/toolbar/ToolbarContent.js +38 -0
  18. package/dist-cjs/toolbar/ToolbarContent.js.map +1 -0
  19. package/dist-cjs/toolbar/ToolbarOverflow.css.js +6 -0
  20. package/dist-cjs/toolbar/ToolbarOverflow.css.js.map +1 -0
  21. package/dist-cjs/toolbar/ToolbarOverflow.js +712 -0
  22. package/dist-cjs/toolbar/ToolbarOverflow.js.map +1 -0
  23. package/dist-cjs/toolbar/ToolbarOverflowFloatingBoundary.js +160 -0
  24. package/dist-cjs/toolbar/ToolbarOverflowFloatingBoundary.js.map +1 -0
  25. package/dist-cjs/toolbar/Tooltray.css.js +6 -0
  26. package/dist-cjs/toolbar/Tooltray.css.js.map +1 -0
  27. package/dist-cjs/toolbar/Tooltray.js +59 -0
  28. package/dist-cjs/toolbar/Tooltray.js.map +1 -0
  29. package/dist-cjs/toolbar/toolbarKeyboardUtils.js +400 -0
  30. package/dist-cjs/toolbar/toolbarKeyboardUtils.js.map +1 -0
  31. package/dist-cjs/toolbar/toolbarUtils.js +220 -0
  32. package/dist-cjs/toolbar/toolbarUtils.js.map +1 -0
  33. package/dist-cjs/toolbar/useToolbarKeyboardNavigation.js +309 -0
  34. package/dist-cjs/toolbar/useToolbarKeyboardNavigation.js.map +1 -0
  35. package/dist-cjs/toolbar/useToolbarOverflow.js +750 -0
  36. package/dist-cjs/toolbar/useToolbarOverflow.js.map +1 -0
  37. package/dist-cjs/utils/mergeProps.js +2 -0
  38. package/dist-cjs/utils/mergeProps.js.map +1 -1
  39. package/dist-es/avatar/Avatar.css.js +1 -1
  40. package/dist-es/avatar/Avatar.js +12 -2
  41. package/dist-es/avatar/Avatar.js.map +1 -1
  42. package/dist-es/index.js +3 -0
  43. package/dist-es/index.js.map +1 -1
  44. package/dist-es/pagination/PageButton.css.js +1 -1
  45. package/dist-es/salt-provider/ThemeApplicator.js +1 -1
  46. package/dist-es/salt-provider/ThemeApplicator.js.map +1 -1
  47. package/dist-es/toolbar/Toolbar.css.js +4 -0
  48. package/dist-es/toolbar/Toolbar.css.js.map +1 -0
  49. package/dist-es/toolbar/Toolbar.js +399 -0
  50. package/dist-es/toolbar/Toolbar.js.map +1 -0
  51. package/dist-es/toolbar/ToolbarContent.css.js +4 -0
  52. package/dist-es/toolbar/ToolbarContent.css.js.map +1 -0
  53. package/dist-es/toolbar/ToolbarContent.js +36 -0
  54. package/dist-es/toolbar/ToolbarContent.js.map +1 -0
  55. package/dist-es/toolbar/ToolbarOverflow.css.js +4 -0
  56. package/dist-es/toolbar/ToolbarOverflow.css.js.map +1 -0
  57. package/dist-es/toolbar/ToolbarOverflow.js +707 -0
  58. package/dist-es/toolbar/ToolbarOverflow.js.map +1 -0
  59. package/dist-es/toolbar/ToolbarOverflowFloatingBoundary.js +154 -0
  60. package/dist-es/toolbar/ToolbarOverflowFloatingBoundary.js.map +1 -0
  61. package/dist-es/toolbar/Tooltray.css.js +4 -0
  62. package/dist-es/toolbar/Tooltray.css.js.map +1 -0
  63. package/dist-es/toolbar/Tooltray.js +57 -0
  64. package/dist-es/toolbar/Tooltray.js.map +1 -0
  65. package/dist-es/toolbar/toolbarKeyboardUtils.js +381 -0
  66. package/dist-es/toolbar/toolbarKeyboardUtils.js.map +1 -0
  67. package/dist-es/toolbar/toolbarUtils.js +216 -0
  68. package/dist-es/toolbar/toolbarUtils.js.map +1 -0
  69. package/dist-es/toolbar/useToolbarKeyboardNavigation.js +307 -0
  70. package/dist-es/toolbar/useToolbarKeyboardNavigation.js.map +1 -0
  71. package/dist-es/toolbar/useToolbarOverflow.js +748 -0
  72. package/dist-es/toolbar/useToolbarOverflow.js.map +1 -0
  73. package/dist-es/utils/mergeProps.js +2 -0
  74. package/dist-es/utils/mergeProps.js.map +1 -1
  75. package/dist-types/avatar/Avatar.d.ts +5 -0
  76. package/dist-types/index.d.ts +1 -0
  77. package/dist-types/toolbar/Toolbar.d.ts +12 -0
  78. package/dist-types/toolbar/ToolbarContent.d.ts +10 -0
  79. package/dist-types/toolbar/ToolbarOverflow.d.ts +34 -0
  80. package/dist-types/toolbar/ToolbarOverflowFloatingBoundary.d.ts +16 -0
  81. package/dist-types/toolbar/Tooltray.d.ts +36 -0
  82. package/dist-types/toolbar/index.d.ts +3 -0
  83. package/dist-types/toolbar/toolbarKeyboardUtils.d.ts +39 -0
  84. package/dist-types/toolbar/toolbarUtils.d.ts +44 -0
  85. package/dist-types/toolbar/useToolbarKeyboardNavigation.d.ts +42 -0
  86. package/dist-types/toolbar/useToolbarOverflow.d.ts +38 -0
  87. package/dist-types/utils/mergeProps.d.ts +4 -0
  88. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbarUtils.js","sources":["../src/toolbar/toolbarUtils.ts"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { Divider } from \"../divider\";\nimport { getRefFromChildren } from \"../utils\";\n\nimport { ToolbarContent, type ToolbarContentProps } from \"./ToolbarContent\";\nimport { Tooltray, type TooltrayProps } from \"./Tooltray\";\n\nexport type ToolbarMode = \"explicit\" | \"flat\" | \"invalid\";\n\ntype ToolbarChild = Exclude<ReactNode, boolean | null | undefined>;\ntype ToolbarContentPosition = ToolbarContentProps[\"position\"];\ntype TooltrayOverflowMode = NonNullable<TooltrayProps[\"overflowMode\"]>;\n\nexport interface ToolbarOverflowItem {\n align: NonNullable<TooltrayProps[\"align\"]>;\n element: ReactElement<TooltrayProps>;\n id: string;\n leadingDecorations: ReactElement[];\n order: number;\n overflowGroup: string;\n overflowGroupKey: string;\n overflowLabel?: string;\n overflowMode: TooltrayOverflowMode;\n overflowPriority: number;\n contentKey: string;\n trailingDecorations: ReactElement[];\n}\n\nexport interface ToolbarOverflowRenderSlot {\n item: ToolbarOverflowItem;\n overflowed: boolean;\n showLeadingDecorations: boolean;\n showTrailingDecorations: boolean;\n triggerGroupKey?: string;\n}\n\nexport interface ToolbarContentModel {\n implicit: boolean;\n items: ToolbarOverflowItem[];\n key: string;\n position: ToolbarContentPosition;\n props: Omit<ToolbarContentProps, \"children\" | \"position\">;\n ref: Ref<HTMLDivElement> | null;\n}\n\nexport interface ToolbarModel {\n mode: ToolbarMode;\n content: ToolbarContentModel[];\n}\n\nexport function buildContentOverflowRenderSlots(\n items: ToolbarOverflowItem[],\n overflowedIds: Set<string>,\n activeNamedGroupKeys: Set<string>,\n) {\n const triggerGroupByItemId = new Map<string, string>();\n\n for (const groupKey of activeNamedGroupKeys) {\n const anchorItem = items.find((item) => {\n return overflowedIds.has(item.id) && item.overflowGroupKey === groupKey;\n });\n\n if (anchorItem) {\n triggerGroupByItemId.set(anchorItem.id, groupKey);\n }\n }\n\n const slots: ToolbarOverflowRenderSlot[] = [];\n let hasSurvivingPredecessor = false;\n\n for (const item of items) {\n const overflowed = overflowedIds.has(item.id);\n const triggerGroupKey = triggerGroupByItemId.get(item.id);\n const survives = !overflowed || triggerGroupKey != null;\n\n if (overflowed && !triggerGroupKey) {\n continue;\n }\n\n slots.push({\n item,\n overflowed,\n showLeadingDecorations:\n item.leadingDecorations.length > 0 &&\n hasSurvivingPredecessor &&\n survives,\n showTrailingDecorations:\n !overflowed && item.trailingDecorations.length > 0,\n triggerGroupKey,\n });\n\n if (survives) {\n hasSurvivingPredecessor = true;\n }\n }\n\n return slots;\n}\n\nexport function flattenToolbarChildren(children: ReactNode): ToolbarChild[] {\n const flattened: ToolbarChild[] = [];\n\n Children.forEach(children, (child) => {\n if (child == null || typeof child === \"boolean\") {\n return;\n }\n\n if (isValidElement(child) && child.type === Fragment) {\n flattened.push(...flattenToolbarChildren(child.props.children));\n return;\n }\n\n flattened.push(child);\n });\n\n return flattened;\n}\n\nfunction isToolbarContentElement(\n child: ToolbarChild,\n): child is ReactElement<ToolbarContentProps> {\n return isValidElement(child) && child.type === ToolbarContent;\n}\n\nfunction isTooltrayElement(\n child: ToolbarChild,\n): child is ReactElement<TooltrayProps> {\n return isValidElement(child) && child.type === Tooltray;\n}\n\nfunction isDividerElement(child: ToolbarChild): child is ReactElement {\n return isValidElement(child) && child.type === Divider;\n}\n\nfunction buildItemId(\n contentKey: string,\n element: ReactElement<TooltrayProps>,\n order: number,\n) {\n const elementKey =\n element.key != null ? String(element.key) : `tray-${order}`;\n return `${contentKey}-${elementKey}-${order}`;\n}\n\nfunction buildOverflowGroupKey(contentKey: string, overflowGroup: string) {\n return overflowGroup === \"shared\"\n ? \"shared\"\n : `${contentKey}:${overflowGroup}`;\n}\n\nfunction normalizeContentItems(\n children: ReactNode,\n contentKey: string,\n): ToolbarOverflowItem[] | null {\n const flattenedChildren = flattenToolbarChildren(children);\n const items: ToolbarOverflowItem[] = [];\n let pendingLeadingDecorations: ReactElement[] = [];\n\n for (const child of flattenedChildren) {\n if (isDividerElement(child)) {\n pendingLeadingDecorations.push(child);\n continue;\n }\n\n if (!isTooltrayElement(child)) {\n return null;\n }\n\n const {\n align = \"start\",\n overflowGroup = \"shared\",\n overflowLabel,\n overflowMode = \"independent\",\n overflowPriority = 0,\n } = child.props;\n const order = items.length;\n\n items.push({\n align,\n element: child,\n id: buildItemId(contentKey, child, order),\n leadingDecorations: pendingLeadingDecorations,\n order,\n overflowGroup,\n overflowGroupKey: buildOverflowGroupKey(contentKey, overflowGroup),\n overflowLabel,\n overflowMode,\n overflowPriority,\n contentKey,\n trailingDecorations: [],\n });\n\n pendingLeadingDecorations = [];\n }\n\n if (pendingLeadingDecorations.length > 0 && items.length > 0) {\n items[items.length - 1]?.trailingDecorations.push(\n ...pendingLeadingDecorations,\n );\n }\n\n return items;\n}\n\nfunction normalizeExplicitContent(\n children: ToolbarChild[],\n): ToolbarContentModel[] | null {\n const content: ToolbarContentModel[] = [];\n\n for (const [index, child] of children.entries()) {\n if (!isToolbarContentElement(child)) {\n continue;\n }\n\n const {\n children: contentChildren,\n position,\n ...contentProps\n } = child.props;\n const contentKey =\n child.key != null ? String(child.key) : `${position}-content-${index}`;\n const items = normalizeContentItems(contentChildren, contentKey);\n\n if (items == null) {\n return null;\n }\n\n content.push({\n implicit: false,\n items,\n key: contentKey,\n position,\n props: contentProps,\n ref: getRefFromChildren(child),\n });\n }\n\n return content;\n}\n\nfunction normalizeFlatChildren(children: ToolbarChild[]) {\n const buckets: Record<ToolbarContentPosition, ToolbarChild[]> = {\n start: [],\n center: [],\n end: [],\n };\n let currentPosition: ToolbarContentPosition = \"start\";\n\n for (const child of children) {\n if (isTooltrayElement(child)) {\n currentPosition = child.props.align ?? \"start\";\n buckets[currentPosition].push(child);\n continue;\n }\n\n if (isDividerElement(child)) {\n buckets[currentPosition].push(child);\n continue;\n }\n\n return null;\n }\n\n return (Object.keys(buckets) as ToolbarContentPosition[]).reduce<\n ToolbarContentModel[]\n >((content, position) => {\n const contentKey = `${position}-implicit`;\n const contentItems = normalizeContentItems(buckets[position], contentKey);\n\n if (contentItems == null || contentItems.length === 0) {\n return content;\n }\n\n content.push({\n implicit: true,\n items: contentItems,\n key: contentKey,\n position,\n props: {},\n ref: null,\n });\n\n return content;\n }, []);\n}\n\nexport function normalizeToolbarChildren(children: ReactNode): ToolbarModel {\n const flattenedChildren = flattenToolbarChildren(children);\n const hasContentChildren = flattenedChildren.some(isToolbarContentElement);\n const hasOnlyContent =\n hasContentChildren && flattenedChildren.every(isToolbarContentElement);\n const hasOnlyFlatChildren = flattenedChildren.every(\n (child) => isTooltrayElement(child) || isDividerElement(child),\n );\n\n if (hasOnlyContent) {\n const content = normalizeExplicitContent(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"explicit\",\n content,\n };\n }\n\n if (hasOnlyFlatChildren) {\n const content = normalizeFlatChildren(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"flat\",\n content,\n };\n }\n\n return {\n mode: \"invalid\",\n content: [],\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,307 @@
1
+ import { useRef, useCallback } from 'react';
2
+ import { getToolbarFocusMemory, getToolbarScopeFocusableElements, TOOLBAR_ITEM_ATTR, TOOLBAR_OVERFLOW_TRIGGER_ATTR, TOOLBAR_GROUP_KEY_ATTR, resolveToolbarFocusTarget, focusToolbarElement, getClosestToolbarScopeRoot, isToolbarFocusFromPointerTarget, TOOLBAR_SCOPE_ROOT_ATTR, shouldToolbarPreserveNativeTab, getToolbarTabMoveTarget, getToolbarDirectionalMoveTarget } from './toolbarKeyboardUtils.js';
3
+
4
+ function useToolbarKeyboardNavigation({
5
+ includeTabIndexMinusOne = false,
6
+ items = [],
7
+ overflowedIds,
8
+ scopeRef
9
+ }) {
10
+ const rememberedFocusRef = useRef(null);
11
+ const pointerDownTargetRef = useRef(null);
12
+ const restoringEntryFocusRef = useRef(false);
13
+ const shouldPreserveItemMemoryForTrigger = useCallback(
14
+ (groupKey) => {
15
+ const rememberedFocus = rememberedFocusRef.current;
16
+ if ((rememberedFocus == null ? void 0 : rememberedFocus.type) !== "item") {
17
+ return false;
18
+ }
19
+ const item = items.find((entry) => entry.id === rememberedFocus.itemId);
20
+ return (item == null ? void 0 : item.overflowGroupKey) === groupKey && (overflowedIds == null || overflowedIds.has(item.id));
21
+ },
22
+ [items, overflowedIds]
23
+ );
24
+ const rememberTarget = useCallback(
25
+ (target) => {
26
+ const scopeRoot = scopeRef.current;
27
+ if (!scopeRoot) {
28
+ return;
29
+ }
30
+ const focusMemory = getToolbarFocusMemory(scopeRoot, target, {
31
+ includeTabIndexMinusOne
32
+ });
33
+ if (focusMemory) {
34
+ if (focusMemory.type === "overflow-trigger" && shouldPreserveItemMemoryForTrigger(focusMemory.groupKey)) {
35
+ return;
36
+ }
37
+ rememberedFocusRef.current = focusMemory;
38
+ }
39
+ },
40
+ [includeTabIndexMinusOne, scopeRef, shouldPreserveItemMemoryForTrigger]
41
+ );
42
+ const rememberItemFocus = useCallback(
43
+ (itemId, controlIndex) => {
44
+ var _a;
45
+ const scopeRoot = scopeRef.current;
46
+ if (!scopeRoot) {
47
+ return;
48
+ }
49
+ const focusables = getToolbarScopeFocusableElements(scopeRoot, {
50
+ includeTabIndexMinusOne
51
+ });
52
+ const itemFocusables = focusables.filter((element) => {
53
+ var _a2;
54
+ return ((_a2 = element.closest(`[${TOOLBAR_ITEM_ATTR}]`)) == null ? void 0 : _a2.getAttribute(TOOLBAR_ITEM_ATTR)) === itemId;
55
+ });
56
+ const item = items.find((entry) => entry.id === itemId);
57
+ const visibleItemTarget = itemFocusables[Math.min(controlIndex, itemFocusables.length - 1)] ?? itemFocusables[0];
58
+ const overflowTriggerTarget = item ? focusables.find((element) => {
59
+ const trigger = element.closest(
60
+ `[${TOOLBAR_OVERFLOW_TRIGGER_ATTR}]`
61
+ );
62
+ return (trigger == null ? void 0 : trigger.getAttribute(TOOLBAR_GROUP_KEY_ATTR)) === item.overflowGroupKey;
63
+ }) : void 0;
64
+ const scopeIndex = Math.max(
65
+ focusables.indexOf(visibleItemTarget ?? overflowTriggerTarget),
66
+ ((_a = rememberedFocusRef.current) == null ? void 0 : _a.scopeIndex) ?? 0
67
+ );
68
+ const focusMemory = {
69
+ controlIndex,
70
+ itemId,
71
+ scopeIndex,
72
+ type: "item"
73
+ };
74
+ rememberedFocusRef.current = focusMemory;
75
+ },
76
+ [includeTabIndexMinusOne, items, scopeRef]
77
+ );
78
+ const focusEntryTarget = useCallback(() => {
79
+ const scopeRoot = scopeRef.current;
80
+ if (!scopeRoot) {
81
+ return;
82
+ }
83
+ const target = resolveToolbarFocusTarget(
84
+ scopeRoot,
85
+ rememberedFocusRef.current,
86
+ {
87
+ items,
88
+ includeTabIndexMinusOne,
89
+ overflowedIds
90
+ }
91
+ );
92
+ if (!target) {
93
+ return;
94
+ }
95
+ queueMicrotask(() => {
96
+ focusToolbarElement(target);
97
+ });
98
+ }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
99
+ const restoreEntryFocus = useCallback((target) => {
100
+ restoringEntryFocusRef.current = true;
101
+ focusToolbarElement(target);
102
+ }, []);
103
+ const handleScopeFocus = useCallback(
104
+ (event) => {
105
+ var _a;
106
+ const scopeRoot = scopeRef.current;
107
+ const target = event.target;
108
+ if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarScopeRoot(target) !== scopeRoot) {
109
+ return;
110
+ }
111
+ if (restoringEntryFocusRef.current) {
112
+ restoringEntryFocusRef.current = false;
113
+ pointerDownTargetRef.current = null;
114
+ rememberTarget(target);
115
+ return;
116
+ }
117
+ const relatedTarget = event.relatedTarget;
118
+ const enteringFromOutside = !(relatedTarget instanceof HTMLElement) || getClosestToolbarScopeRoot(relatedTarget) !== scopeRoot;
119
+ if (!enteringFromOutside) {
120
+ pointerDownTargetRef.current = null;
121
+ rememberTarget(target);
122
+ return;
123
+ }
124
+ const targetMemory = getToolbarFocusMemory(scopeRoot, target, {
125
+ includeTabIndexMinusOne
126
+ });
127
+ const pointerDownTarget = pointerDownTargetRef.current;
128
+ pointerDownTargetRef.current = null;
129
+ const focusFromPointerTarget = isToolbarFocusFromPointerTarget(
130
+ target,
131
+ pointerDownTarget
132
+ );
133
+ if (focusFromPointerTarget) {
134
+ rememberTarget(target);
135
+ return;
136
+ }
137
+ if ((targetMemory == null ? void 0 : targetMemory.type) === "overflow-trigger") {
138
+ const shouldPreserve = shouldPreserveItemMemoryForTrigger(
139
+ targetMemory.groupKey
140
+ );
141
+ if (shouldPreserve) {
142
+ return;
143
+ }
144
+ if (((_a = rememberedFocusRef.current) == null ? void 0 : _a.type) === "item") {
145
+ const restoreTarget2 = resolveToolbarFocusTarget(
146
+ scopeRoot,
147
+ rememberedFocusRef.current,
148
+ {
149
+ items,
150
+ includeTabIndexMinusOne,
151
+ overflowedIds
152
+ }
153
+ );
154
+ if (restoreTarget2 && restoreTarget2 !== target) {
155
+ event.stopPropagation();
156
+ restoreEntryFocus(restoreTarget2);
157
+ return;
158
+ }
159
+ }
160
+ rememberedFocusRef.current = targetMemory;
161
+ return;
162
+ }
163
+ const restoreTarget = resolveToolbarFocusTarget(
164
+ scopeRoot,
165
+ rememberedFocusRef.current,
166
+ {
167
+ items,
168
+ includeTabIndexMinusOne,
169
+ overflowedIds
170
+ }
171
+ );
172
+ if (restoreTarget && restoreTarget !== target) {
173
+ event.stopPropagation();
174
+ restoreEntryFocus(restoreTarget);
175
+ return;
176
+ }
177
+ rememberTarget(target);
178
+ },
179
+ [
180
+ includeTabIndexMinusOne,
181
+ items,
182
+ overflowedIds,
183
+ rememberTarget,
184
+ restoreEntryFocus,
185
+ scopeRef,
186
+ shouldPreserveItemMemoryForTrigger
187
+ ]
188
+ );
189
+ const handleFocusCapture = useCallback(
190
+ (event) => {
191
+ handleScopeFocus(event);
192
+ },
193
+ [handleScopeFocus]
194
+ );
195
+ const handleScopePointerDown = useCallback(
196
+ (event) => {
197
+ const scopeRoot = scopeRef.current;
198
+ const target = event.target;
199
+ if (!scopeRoot || !(target instanceof Element) || getClosestToolbarScopeRoot(target) !== scopeRoot) {
200
+ pointerDownTargetRef.current = null;
201
+ return;
202
+ }
203
+ pointerDownTargetRef.current = target;
204
+ },
205
+ [scopeRef]
206
+ );
207
+ const handlePointerDownCapture = useCallback(
208
+ (event) => {
209
+ handleScopePointerDown(event);
210
+ },
211
+ [handleScopePointerDown]
212
+ );
213
+ const handleScopeBlur = useCallback(
214
+ (event) => {
215
+ const scopeRoot = scopeRef.current;
216
+ const target = event.target;
217
+ if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarScopeRoot(target) !== scopeRoot) {
218
+ return;
219
+ }
220
+ const relatedTarget = event.relatedTarget;
221
+ const leavingScope = !(relatedTarget instanceof HTMLElement) || getClosestToolbarScopeRoot(relatedTarget) !== scopeRoot;
222
+ if (leavingScope) {
223
+ rememberTarget(target);
224
+ }
225
+ },
226
+ [rememberTarget, scopeRef]
227
+ );
228
+ const handleBlurCapture = useCallback(
229
+ (event) => {
230
+ handleScopeBlur(event);
231
+ },
232
+ [handleScopeBlur]
233
+ );
234
+ const handleScopeKeyDown = useCallback(
235
+ (event) => {
236
+ const scopeRoot = scopeRef.current;
237
+ const target = event.target;
238
+ if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarScopeRoot(target) !== scopeRoot || event.altKey || event.ctrlKey || event.metaKey) {
239
+ return;
240
+ }
241
+ if (event.key === "Tab" && scopeRoot.getAttribute(TOOLBAR_SCOPE_ROOT_ATTR) === "main" && !shouldToolbarPreserveNativeTab(target)) {
242
+ const moveTarget2 = getToolbarTabMoveTarget(scopeRoot, event.shiftKey);
243
+ event.preventDefault();
244
+ event.stopPropagation();
245
+ rememberTarget(target);
246
+ queueMicrotask(() => {
247
+ if (moveTarget2 == null ? void 0 : moveTarget2.isConnected) {
248
+ focusToolbarElement(moveTarget2);
249
+ } else {
250
+ target.blur();
251
+ }
252
+ });
253
+ return;
254
+ }
255
+ const moveTarget = getToolbarDirectionalMoveTarget(
256
+ scopeRoot,
257
+ target,
258
+ event.key,
259
+ { includeTabIndexMinusOne }
260
+ );
261
+ if (!moveTarget) {
262
+ return;
263
+ }
264
+ event.preventDefault();
265
+ event.stopPropagation();
266
+ rememberTarget(moveTarget);
267
+ focusToolbarElement(moveTarget);
268
+ },
269
+ [includeTabIndexMinusOne, rememberTarget, scopeRef]
270
+ );
271
+ const handleKeyDownCapture = useCallback(
272
+ (event) => {
273
+ handleScopeKeyDown(event);
274
+ },
275
+ [handleScopeKeyDown]
276
+ );
277
+ const getEntryFocusable = useCallback(() => {
278
+ const scopeRoot = scopeRef.current;
279
+ if (!scopeRoot) {
280
+ return null;
281
+ }
282
+ return resolveToolbarFocusTarget(scopeRoot, rememberedFocusRef.current, {
283
+ items,
284
+ includeTabIndexMinusOne,
285
+ overflowedIds
286
+ }) ?? getToolbarScopeFocusableElements(scopeRoot, {
287
+ includeTabIndexMinusOne
288
+ })[0] ?? null;
289
+ }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
290
+ return {
291
+ focusEntryTarget,
292
+ getEntryFocusable,
293
+ handleBlurCapture,
294
+ handleFocusCapture,
295
+ handleKeyDownCapture,
296
+ handlePointerDownCapture,
297
+ handleScopeBlur,
298
+ handleScopeFocus,
299
+ handleScopeKeyDown,
300
+ handleScopePointerDown,
301
+ rememberItemFocus,
302
+ rememberedFocusRef
303
+ };
304
+ }
305
+
306
+ export { useToolbarKeyboardNavigation };
307
+ //# sourceMappingURL=useToolbarKeyboardNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToolbarKeyboardNavigation.js","sources":["../src/toolbar/useToolbarKeyboardNavigation.ts"],"sourcesContent":["import {\n type FocusEventHandler,\n type KeyboardEventHandler,\n type PointerEventHandler,\n type RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport {\n focusToolbarElement,\n getClosestToolbarScopeRoot,\n getToolbarDirectionalMoveTarget,\n getToolbarFocusMemory,\n getToolbarScopeFocusableElements,\n getToolbarTabMoveTarget,\n isToolbarFocusFromPointerTarget,\n resolveToolbarFocusTarget,\n shouldToolbarPreserveNativeTab,\n TOOLBAR_GROUP_KEY_ATTR,\n TOOLBAR_ITEM_ATTR,\n TOOLBAR_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_SCOPE_ROOT_ATTR,\n type ToolbarFocusMemory,\n} from \"./toolbarKeyboardUtils\";\nimport type { ToolbarOverflowItem } from \"./toolbarUtils\";\n\ninterface UseToolbarKeyboardNavigationProps {\n includeTabIndexMinusOne?: boolean;\n items?: ToolbarOverflowItem[];\n overflowedIds?: Set<string>;\n scopeRef: RefObject<HTMLElement | null>;\n}\n\ninterface ToolbarFocusEvent {\n relatedTarget: EventTarget | null;\n stopPropagation: () => void;\n target: EventTarget | null;\n}\n\ninterface ToolbarKeyDownEvent {\n altKey: boolean;\n ctrlKey: boolean;\n key: string;\n metaKey: boolean;\n preventDefault: () => void;\n shiftKey: boolean;\n stopPropagation: () => void;\n target: EventTarget | null;\n}\n\ninterface ToolbarPointerEvent {\n target: EventTarget | null;\n}\n\nexport function useToolbarKeyboardNavigation({\n includeTabIndexMinusOne = false,\n items = [],\n overflowedIds,\n scopeRef,\n}: UseToolbarKeyboardNavigationProps) {\n const rememberedFocusRef = useRef<ToolbarFocusMemory | null>(null);\n const pointerDownTargetRef = useRef<EventTarget | null>(null);\n const restoringEntryFocusRef = useRef(false);\n\n const shouldPreserveItemMemoryForTrigger = useCallback(\n (groupKey: string) => {\n const rememberedFocus = rememberedFocusRef.current;\n\n if (rememberedFocus?.type !== \"item\") {\n return false;\n }\n\n const item = items.find((entry) => entry.id === rememberedFocus.itemId);\n\n return (\n item?.overflowGroupKey === groupKey &&\n (overflowedIds == null || overflowedIds.has(item.id))\n );\n },\n [items, overflowedIds],\n );\n\n const rememberTarget = useCallback(\n (target: HTMLElement) => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const focusMemory = getToolbarFocusMemory(scopeRoot, target, {\n includeTabIndexMinusOne,\n });\n\n if (focusMemory) {\n if (\n focusMemory.type === \"overflow-trigger\" &&\n shouldPreserveItemMemoryForTrigger(focusMemory.groupKey)\n ) {\n return;\n }\n\n rememberedFocusRef.current = focusMemory;\n }\n },\n [includeTabIndexMinusOne, scopeRef, shouldPreserveItemMemoryForTrigger],\n );\n\n const rememberItemFocus = useCallback(\n (itemId: string, controlIndex: number) => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const focusables = getToolbarScopeFocusableElements(scopeRoot, {\n includeTabIndexMinusOne,\n });\n const itemFocusables = focusables.filter((element) => {\n return (\n element\n .closest<HTMLElement>(`[${TOOLBAR_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_ITEM_ATTR) === itemId\n );\n });\n const item = items.find((entry) => entry.id === itemId);\n const visibleItemTarget =\n itemFocusables[Math.min(controlIndex, itemFocusables.length - 1)] ??\n itemFocusables[0];\n const overflowTriggerTarget = item\n ? focusables.find((element) => {\n const trigger = element.closest<HTMLElement>(\n `[${TOOLBAR_OVERFLOW_TRIGGER_ATTR}]`,\n );\n\n return (\n trigger?.getAttribute(TOOLBAR_GROUP_KEY_ATTR) ===\n item.overflowGroupKey\n );\n })\n : undefined;\n const scopeIndex = Math.max(\n focusables.indexOf(visibleItemTarget ?? overflowTriggerTarget),\n rememberedFocusRef.current?.scopeIndex ?? 0,\n );\n const focusMemory: ToolbarFocusMemory = {\n controlIndex,\n itemId,\n scopeIndex,\n type: \"item\",\n };\n\n rememberedFocusRef.current = focusMemory;\n },\n [includeTabIndexMinusOne, items, scopeRef],\n );\n\n const focusEntryTarget = useCallback(() => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const target = resolveToolbarFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (!target) {\n return;\n }\n\n queueMicrotask(() => {\n focusToolbarElement(target);\n });\n }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);\n\n const restoreEntryFocus = useCallback((target: HTMLElement) => {\n restoringEntryFocusRef.current = true;\n focusToolbarElement(target);\n }, []);\n\n const handleScopeFocus = useCallback(\n (event: ToolbarFocusEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarScopeRoot(target) !== scopeRoot\n ) {\n return;\n }\n\n if (restoringEntryFocusRef.current) {\n restoringEntryFocusRef.current = false;\n pointerDownTargetRef.current = null;\n rememberTarget(target);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n const enteringFromOutside =\n !(relatedTarget instanceof HTMLElement) ||\n getClosestToolbarScopeRoot(relatedTarget) !== scopeRoot;\n\n if (!enteringFromOutside) {\n pointerDownTargetRef.current = null;\n rememberTarget(target);\n return;\n }\n\n const targetMemory = getToolbarFocusMemory(scopeRoot, target, {\n includeTabIndexMinusOne,\n });\n const pointerDownTarget = pointerDownTargetRef.current;\n pointerDownTargetRef.current = null;\n const focusFromPointerTarget = isToolbarFocusFromPointerTarget(\n target,\n pointerDownTarget,\n );\n\n if (focusFromPointerTarget) {\n rememberTarget(target);\n return;\n }\n\n if (targetMemory?.type === \"overflow-trigger\") {\n const shouldPreserve = shouldPreserveItemMemoryForTrigger(\n targetMemory.groupKey,\n );\n if (shouldPreserve) {\n return;\n }\n\n if (rememberedFocusRef.current?.type === \"item\") {\n const restoreTarget = resolveToolbarFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (restoreTarget && restoreTarget !== target) {\n event.stopPropagation();\n restoreEntryFocus(restoreTarget);\n return;\n }\n }\n\n rememberedFocusRef.current = targetMemory;\n return;\n }\n\n const restoreTarget = resolveToolbarFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (restoreTarget && restoreTarget !== target) {\n event.stopPropagation();\n restoreEntryFocus(restoreTarget);\n return;\n }\n\n rememberTarget(target);\n },\n [\n includeTabIndexMinusOne,\n items,\n overflowedIds,\n rememberTarget,\n restoreEntryFocus,\n scopeRef,\n shouldPreserveItemMemoryForTrigger,\n ],\n );\n\n const handleFocusCapture = useCallback<FocusEventHandler<HTMLElement>>(\n (event) => {\n handleScopeFocus(event);\n },\n [handleScopeFocus],\n );\n\n const handleScopePointerDown = useCallback(\n (event: ToolbarPointerEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof Element) ||\n getClosestToolbarScopeRoot(target) !== scopeRoot\n ) {\n pointerDownTargetRef.current = null;\n return;\n }\n\n pointerDownTargetRef.current = target;\n },\n [scopeRef],\n );\n\n const handlePointerDownCapture = useCallback<\n PointerEventHandler<HTMLElement>\n >(\n (event) => {\n handleScopePointerDown(event);\n },\n [handleScopePointerDown],\n );\n\n const handleScopeBlur = useCallback(\n (event: ToolbarFocusEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarScopeRoot(target) !== scopeRoot\n ) {\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n const leavingScope =\n !(relatedTarget instanceof HTMLElement) ||\n getClosestToolbarScopeRoot(relatedTarget) !== scopeRoot;\n\n if (leavingScope) {\n rememberTarget(target);\n }\n },\n [rememberTarget, scopeRef],\n );\n\n const handleBlurCapture = useCallback<FocusEventHandler<HTMLElement>>(\n (event) => {\n handleScopeBlur(event);\n },\n [handleScopeBlur],\n );\n\n const handleScopeKeyDown = useCallback(\n (event: ToolbarKeyDownEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarScopeRoot(target) !== scopeRoot ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey\n ) {\n return;\n }\n\n if (\n event.key === \"Tab\" &&\n scopeRoot.getAttribute(TOOLBAR_SCOPE_ROOT_ATTR) === \"main\" &&\n !shouldToolbarPreserveNativeTab(target)\n ) {\n const moveTarget = getToolbarTabMoveTarget(scopeRoot, event.shiftKey);\n\n event.preventDefault();\n event.stopPropagation();\n\n rememberTarget(target);\n queueMicrotask(() => {\n if (moveTarget?.isConnected) {\n focusToolbarElement(moveTarget);\n } else {\n target.blur();\n }\n });\n return;\n }\n\n const moveTarget = getToolbarDirectionalMoveTarget(\n scopeRoot,\n target,\n event.key,\n { includeTabIndexMinusOne },\n );\n\n if (!moveTarget) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n rememberTarget(moveTarget);\n focusToolbarElement(moveTarget);\n },\n [includeTabIndexMinusOne, rememberTarget, scopeRef],\n );\n\n const handleKeyDownCapture = useCallback<KeyboardEventHandler<HTMLElement>>(\n (event) => {\n handleScopeKeyDown(event);\n },\n [handleScopeKeyDown],\n );\n\n const getEntryFocusable = useCallback(() => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return null;\n }\n\n return (\n resolveToolbarFocusTarget(scopeRoot, rememberedFocusRef.current, {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n }) ??\n getToolbarScopeFocusableElements(scopeRoot, {\n includeTabIndexMinusOne,\n })[0] ??\n null\n );\n }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);\n\n return {\n focusEntryTarget,\n getEntryFocusable,\n handleBlurCapture,\n handleFocusCapture,\n handleKeyDownCapture,\n handlePointerDownCapture,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberItemFocus,\n rememberedFocusRef,\n };\n}\n"],"names":["_a","restoreTarget","moveTarget"],"mappings":"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"}