@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,381 @@
1
+ const TOOLBAR_SCOPE_ROOT_ATTR = "data-salt-toolbar-scope-root";
2
+ const TOOLBAR_ITEM_ATTR = "data-salt-toolbar-item-id";
3
+ const TOOLBAR_GROUP_KEY_ATTR = "data-salt-toolbar-overflow-group-key";
4
+ const TOOLBAR_OVERFLOW_TRIGGER_ATTR = "data-salt-toolbar-overflow-trigger";
5
+ const toolbarFocusableSelector = [
6
+ "button",
7
+ "[href]",
8
+ "input",
9
+ "select",
10
+ "textarea",
11
+ "[tabindex]"
12
+ ].join(", ");
13
+ const textEntryInputTypes = /* @__PURE__ */ new Set([
14
+ "",
15
+ "date",
16
+ "datetime-local",
17
+ "email",
18
+ "month",
19
+ "number",
20
+ "password",
21
+ "search",
22
+ "tel",
23
+ "text",
24
+ "time",
25
+ "url",
26
+ "week"
27
+ ]);
28
+ function getClosestToolbarScopeRoot(target) {
29
+ if (!(target instanceof Element)) {
30
+ return null;
31
+ }
32
+ return target.closest(`[${TOOLBAR_SCOPE_ROOT_ATTR}]`);
33
+ }
34
+ function getToolbarItemId(target) {
35
+ var _a;
36
+ return ((_a = target == null ? void 0 : target.closest(`[${TOOLBAR_ITEM_ATTR}]`)) == null ? void 0 : _a.getAttribute(TOOLBAR_ITEM_ATTR)) ?? null;
37
+ }
38
+ function isToolbarFocusFromPointerTarget(focusTarget, pointerTarget) {
39
+ if (!(pointerTarget instanceof Node)) {
40
+ return false;
41
+ }
42
+ if (focusTarget === pointerTarget || focusTarget.contains(pointerTarget)) {
43
+ return true;
44
+ }
45
+ if (!(pointerTarget instanceof Element)) {
46
+ return false;
47
+ }
48
+ const focusItemId = getToolbarItemId(focusTarget);
49
+ const pointerItemId = getToolbarItemId(pointerTarget);
50
+ return focusItemId != null && focusItemId === pointerItemId;
51
+ }
52
+ function getToolbarScopeFocusableElements(scopeRoot, options = {}) {
53
+ return Array.from(
54
+ scopeRoot.querySelectorAll(toolbarFocusableSelector)
55
+ ).filter((element) => {
56
+ return getClosestToolbarScopeRoot(element) === scopeRoot && (isToolbarFocusable(element, options) || isToolbarToggleGroupButton(element));
57
+ });
58
+ }
59
+ function getToolbarFocusMemory(scopeRoot, target, options = {}) {
60
+ const scopeElements = getToolbarScopeFocusableElements(scopeRoot, options);
61
+ const scopeIndex = scopeElements.indexOf(target);
62
+ if (scopeIndex === -1) {
63
+ return null;
64
+ }
65
+ const groupTrigger = target.closest(
66
+ `[${TOOLBAR_OVERFLOW_TRIGGER_ATTR}]`
67
+ );
68
+ const groupKey = groupTrigger == null ? void 0 : groupTrigger.getAttribute(TOOLBAR_GROUP_KEY_ATTR);
69
+ if (groupKey) {
70
+ return {
71
+ groupKey,
72
+ scopeIndex,
73
+ type: "overflow-trigger"
74
+ };
75
+ }
76
+ const itemRoot = target.closest(`[${TOOLBAR_ITEM_ATTR}]`);
77
+ const itemId = itemRoot == null ? void 0 : itemRoot.getAttribute(TOOLBAR_ITEM_ATTR);
78
+ if (itemRoot && itemId) {
79
+ const itemElements = getToolbarItemFocusableElements(
80
+ itemRoot,
81
+ scopeRoot,
82
+ options
83
+ );
84
+ const controlIndex = itemElements.indexOf(target);
85
+ return {
86
+ controlIndex: Math.max(controlIndex, 0),
87
+ itemId,
88
+ scopeIndex,
89
+ type: "item"
90
+ };
91
+ }
92
+ return {
93
+ scopeIndex,
94
+ type: "scope"
95
+ };
96
+ }
97
+ function resolveToolbarFocusTarget(scopeRoot, focusMemory, {
98
+ includeTabIndexMinusOne,
99
+ items = [],
100
+ overflowedIds
101
+ } = {}) {
102
+ const focusableOptions = {
103
+ includeTabIndexMinusOne
104
+ };
105
+ if (!focusMemory) {
106
+ return getToolbarScopeFocusableElements(scopeRoot, focusableOptions)[0] ?? null;
107
+ }
108
+ const fallback = getToolbarFocusFallback(
109
+ scopeRoot,
110
+ focusMemory.scopeIndex,
111
+ focusableOptions
112
+ );
113
+ if (focusMemory.type === "overflow-trigger") {
114
+ const trigger = getToolbarOverflowTriggerElement(
115
+ scopeRoot,
116
+ focusMemory.groupKey
117
+ );
118
+ if (trigger) {
119
+ return trigger;
120
+ }
121
+ const firstVisibleItem = items.find((item) => {
122
+ return item.overflowGroupKey === focusMemory.groupKey;
123
+ });
124
+ if (firstVisibleItem) {
125
+ return getToolbarFocusableElementForItem(
126
+ scopeRoot,
127
+ firstVisibleItem.id,
128
+ 0,
129
+ focusableOptions
130
+ ) ?? fallback;
131
+ }
132
+ return fallback;
133
+ }
134
+ if (focusMemory.type === "item") {
135
+ const visibleItemTarget = getToolbarFocusableElementForItem(
136
+ scopeRoot,
137
+ focusMemory.itemId,
138
+ focusMemory.controlIndex,
139
+ focusableOptions
140
+ );
141
+ if (visibleItemTarget) {
142
+ return visibleItemTarget;
143
+ }
144
+ const item = items.find((entry) => entry.id === focusMemory.itemId);
145
+ if (item && (overflowedIds == null ? void 0 : overflowedIds.has(item.id))) {
146
+ return getToolbarOverflowTriggerElement(scopeRoot, item.overflowGroupKey) ?? fallback;
147
+ }
148
+ return fallback;
149
+ }
150
+ return fallback;
151
+ }
152
+ function getToolbarDirectionalMoveTarget(scopeRoot, target, key, options = {}) {
153
+ if (key !== "ArrowLeft" && key !== "ArrowRight") {
154
+ return null;
155
+ }
156
+ if (getToolbarKeyboardPolicy(target).preserveHorizontalArrows) {
157
+ return null;
158
+ }
159
+ const toggleGroupButtons = getToggleGroupButtons(target);
160
+ if (toggleGroupButtons.length > 0) {
161
+ const visualDelta = getVisualDelta(scopeRoot, key);
162
+ const currentIndex2 = toggleGroupButtons.indexOf(target);
163
+ if (currentIndex2 === -1 || !isToggleGroupBoundary(
164
+ currentIndex2,
165
+ toggleGroupButtons.length,
166
+ visualDelta
167
+ )) {
168
+ return null;
169
+ }
170
+ }
171
+ const scopeElements = getToolbarScopeFocusableElements(scopeRoot, options);
172
+ const currentIndex = scopeElements.indexOf(target);
173
+ if (currentIndex === -1 || scopeElements.length <= 1) {
174
+ return null;
175
+ }
176
+ const nextIndex = (currentIndex + getVisualDelta(scopeRoot, key) + scopeElements.length) % scopeElements.length;
177
+ return scopeElements[nextIndex] ?? null;
178
+ }
179
+ function getToolbarTabMoveTarget(scopeRoot, shiftKey) {
180
+ const focusableElements = getDocumentFocusableElements(
181
+ scopeRoot.ownerDocument
182
+ );
183
+ if (shiftKey) {
184
+ for (let index = focusableElements.length - 1; index >= 0; index -= 1) {
185
+ const element = focusableElements[index];
186
+ if (!element || scopeRoot.contains(element)) {
187
+ continue;
188
+ }
189
+ if (element.compareDocumentPosition(scopeRoot) & Node.DOCUMENT_POSITION_FOLLOWING) {
190
+ return element;
191
+ }
192
+ }
193
+ return null;
194
+ }
195
+ return focusableElements.find((element) => {
196
+ return !scopeRoot.contains(element) && !!(scopeRoot.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING);
197
+ }) ?? null;
198
+ }
199
+ function shouldToolbarPreserveNativeTab(target) {
200
+ return getToolbarKeyboardPolicy(target).preserveNativeTab;
201
+ }
202
+ function getToolbarItemFocusableElements(itemRoot, scopeRoot, options = {}) {
203
+ return Array.from(
204
+ itemRoot.querySelectorAll(toolbarFocusableSelector)
205
+ ).filter((element) => {
206
+ return getClosestToolbarScopeRoot(element) === scopeRoot && (isToolbarFocusable(element, options) || isToolbarToggleGroupButton(element));
207
+ });
208
+ }
209
+ function getToolbarFocusableElementForItem(scopeRoot, itemId, controlIndex, options = {}) {
210
+ const itemRoot = scopeRoot.querySelector(
211
+ `[${TOOLBAR_ITEM_ATTR}="${itemId}"]`
212
+ );
213
+ if (!itemRoot) {
214
+ return null;
215
+ }
216
+ const itemElements = getToolbarItemFocusableElements(
217
+ itemRoot,
218
+ scopeRoot,
219
+ options
220
+ );
221
+ return itemElements[Math.min(controlIndex, itemElements.length - 1)] ?? itemElements[0] ?? null;
222
+ }
223
+ function getToolbarOverflowTriggerElement(scopeRoot, groupKey) {
224
+ return scopeRoot.querySelector(
225
+ `[${TOOLBAR_OVERFLOW_TRIGGER_ATTR}][${TOOLBAR_GROUP_KEY_ATTR}="${groupKey}"]`
226
+ );
227
+ }
228
+ function getToolbarFocusFallback(scopeRoot, rememberedIndex, options = {}) {
229
+ const focusableElements = getToolbarScopeFocusableElements(
230
+ scopeRoot,
231
+ options
232
+ );
233
+ if (focusableElements.length === 0) {
234
+ return null;
235
+ }
236
+ return focusableElements[Math.max(0, Math.min(rememberedIndex, focusableElements.length - 1))] ?? focusableElements[0];
237
+ }
238
+ function getVisualDelta(scopeRoot, key) {
239
+ var _a;
240
+ const direction = (_a = scopeRoot.ownerDocument.defaultView) == null ? void 0 : _a.getComputedStyle(scopeRoot).direction;
241
+ if (key === "ArrowRight") {
242
+ return direction === "rtl" ? -1 : 1;
243
+ }
244
+ return direction === "rtl" ? 1 : -1;
245
+ }
246
+ function isToggleGroupBoundary(currentIndex, length, visualDelta) {
247
+ if (visualDelta > 0) {
248
+ return currentIndex === length - 1;
249
+ }
250
+ return currentIndex === 0;
251
+ }
252
+ function getToggleGroupButtons(target) {
253
+ const toggleGroup = target.closest(".saltToggleButtonGroup");
254
+ if (!toggleGroup || target.tagName !== "BUTTON") {
255
+ return [];
256
+ }
257
+ return Array.from(toggleGroup.querySelectorAll("button")).filter(
258
+ (button) => isToolbarFocusable(button, { includeTabIndexMinusOne: true })
259
+ );
260
+ }
261
+ function isToolbarToggleGroupButton(target) {
262
+ return target.tagName === "BUTTON" && target.closest(".saltToggleButtonGroup") != null && isToolbarFocusable(target, { includeTabIndexMinusOne: true });
263
+ }
264
+ function getToolbarKeyboardPolicy(target) {
265
+ if (target.isContentEditable || isPlainTextInput(target) || isComboBoxInput(target) || isPillInputPill(target)) {
266
+ return {
267
+ preserveHorizontalArrows: true,
268
+ preserveNativeTab: true
269
+ };
270
+ }
271
+ if (isDropdownControl(target)) {
272
+ return {
273
+ preserveHorizontalArrows: false,
274
+ preserveNativeTab: false
275
+ };
276
+ }
277
+ if (isSelectLikeControl(target) || target.closest(".saltDatePickerTrigger") != null) {
278
+ return {
279
+ preserveHorizontalArrows: false,
280
+ preserveNativeTab: true
281
+ };
282
+ }
283
+ return {
284
+ preserveHorizontalArrows: false,
285
+ preserveNativeTab: false
286
+ };
287
+ }
288
+ function isComboBoxInput(target) {
289
+ return target.tagName === "INPUT" && target.closest('[role="combobox"], .saltComboBox') != null;
290
+ }
291
+ function isPillInputPill(target) {
292
+ return target.tagName === "BUTTON" && target.classList.contains("saltPill") && target.closest(".saltPillInput") != null;
293
+ }
294
+ function isDropdownControl(target) {
295
+ return target.closest(".saltDropdown") != null;
296
+ }
297
+ function isSelectLikeControl(target) {
298
+ return target.tagName === "SELECT" || target.closest('[role="combobox"], .saltComboBox, .saltDropdown') != null;
299
+ }
300
+ function isPlainTextInput(target) {
301
+ if (target.tagName === "TEXTAREA") {
302
+ return true;
303
+ }
304
+ if (target.tagName !== "INPUT") {
305
+ return false;
306
+ }
307
+ return textEntryInputTypes.has(
308
+ target.type.toLowerCase()
309
+ );
310
+ }
311
+ function isNativeDisabledFormControl(target) {
312
+ return "disabled" in target && target.disabled;
313
+ }
314
+ function isToolbarFocusable(target, { includeTabIndexMinusOne = false } = {}) {
315
+ if (isNativeDisabledFormControl(target)) {
316
+ return false;
317
+ }
318
+ if (target.getAttribute("aria-hidden") === "true") {
319
+ return false;
320
+ }
321
+ if (!includeTabIndexMinusOne && target.getAttribute("tabindex") === "-1") {
322
+ return false;
323
+ }
324
+ if (target.hidden) {
325
+ return false;
326
+ }
327
+ const win = target.ownerDocument.defaultView;
328
+ if (!win) {
329
+ return false;
330
+ }
331
+ const styles = win.getComputedStyle(target);
332
+ if (styles.display === "none" || styles.visibility === "hidden") {
333
+ return false;
334
+ }
335
+ return target.getClientRects().length > 0;
336
+ }
337
+ const toolbarFocusEntryOverrides = [
338
+ { root: ".saltComboBox", interactive: 'input[role="combobox"]' }
339
+ ];
340
+ function focusToolbarElement(target) {
341
+ const focusTarget = resolveToolbarFocusEntryTarget(target);
342
+ if (focusTarget == null ? void 0 : focusTarget.isConnected) {
343
+ focusTarget.focus({ preventScroll: true });
344
+ }
345
+ }
346
+ function resolveToolbarFocusEntryTarget(target) {
347
+ if (!target) {
348
+ return target;
349
+ }
350
+ for (const { root, interactive } of toolbarFocusEntryOverrides) {
351
+ if (target.matches(root)) {
352
+ return target.querySelector(interactive) ?? target;
353
+ }
354
+ }
355
+ return target;
356
+ }
357
+ function scheduleToolbarFocus(target, targetWindow = target == null ? void 0 : target.ownerDocument.defaultView) {
358
+ if (!target) {
359
+ return () => void 0;
360
+ }
361
+ if (targetWindow == null ? void 0 : targetWindow.requestAnimationFrame) {
362
+ const frame = targetWindow.requestAnimationFrame(() => {
363
+ focusToolbarElement(target);
364
+ });
365
+ return () => {
366
+ targetWindow.cancelAnimationFrame(frame);
367
+ };
368
+ }
369
+ queueMicrotask(() => {
370
+ focusToolbarElement(target);
371
+ });
372
+ return () => void 0;
373
+ }
374
+ function getDocumentFocusableElements(ownerDocument) {
375
+ return Array.from(
376
+ ownerDocument.querySelectorAll(toolbarFocusableSelector)
377
+ ).filter((element) => isToolbarFocusable(element));
378
+ }
379
+
380
+ export { TOOLBAR_GROUP_KEY_ATTR, TOOLBAR_ITEM_ATTR, TOOLBAR_OVERFLOW_TRIGGER_ATTR, TOOLBAR_SCOPE_ROOT_ATTR, focusToolbarElement, getClosestToolbarScopeRoot, getDocumentFocusableElements, getToolbarDirectionalMoveTarget, getToolbarFocusMemory, getToolbarItemId, getToolbarScopeFocusableElements, getToolbarTabMoveTarget, isToolbarFocusFromPointerTarget, isToolbarFocusable, resolveToolbarFocusTarget, scheduleToolbarFocus, shouldToolbarPreserveNativeTab, toolbarFocusableSelector };
381
+ //# sourceMappingURL=toolbarKeyboardUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbarKeyboardUtils.js","sources":["../src/toolbar/toolbarKeyboardUtils.ts"],"sourcesContent":["import type { ToolbarOverflowItem } from \"./toolbarUtils\";\n\nexport const TOOLBAR_SCOPE_ROOT_ATTR = \"data-salt-toolbar-scope-root\";\nexport const TOOLBAR_ITEM_ATTR = \"data-salt-toolbar-item-id\";\nexport const TOOLBAR_GROUP_KEY_ATTR = \"data-salt-toolbar-overflow-group-key\";\nexport const TOOLBAR_OVERFLOW_TRIGGER_ATTR =\n \"data-salt-toolbar-overflow-trigger\";\n\nexport const toolbarFocusableSelector = [\n \"button\",\n \"[href]\",\n \"input\",\n \"select\",\n \"textarea\",\n \"[tabindex]\",\n].join(\", \");\n\nconst textEntryInputTypes = new Set([\n \"\",\n \"date\",\n \"datetime-local\",\n \"email\",\n \"month\",\n \"number\",\n \"password\",\n \"search\",\n \"tel\",\n \"text\",\n \"time\",\n \"url\",\n \"week\",\n]);\n\nexport type ToolbarFocusMemory =\n | {\n controlIndex: number;\n itemId: string;\n scopeIndex: number;\n type: \"item\";\n }\n | {\n groupKey: string;\n scopeIndex: number;\n type: \"overflow-trigger\";\n }\n | {\n scopeIndex: number;\n type: \"scope\";\n };\n\nexport interface ToolbarFocusableOptions {\n includeTabIndexMinusOne?: boolean;\n}\n\ninterface ToolbarKeyboardPolicy {\n preserveHorizontalArrows: boolean;\n preserveNativeTab: boolean;\n}\n\nexport function getClosestToolbarScopeRoot(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return null;\n }\n\n return target.closest<HTMLElement>(`[${TOOLBAR_SCOPE_ROOT_ATTR}]`);\n}\n\nexport function getToolbarItemId(target: Element | null) {\n return (\n target\n ?.closest<HTMLElement>(`[${TOOLBAR_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_ITEM_ATTR) ?? null\n );\n}\n\nexport function isToolbarFocusFromPointerTarget(\n focusTarget: HTMLElement,\n pointerTarget: EventTarget | null,\n) {\n if (!(pointerTarget instanceof Node)) {\n return false;\n }\n\n if (focusTarget === pointerTarget || focusTarget.contains(pointerTarget)) {\n return true;\n }\n\n if (!(pointerTarget instanceof Element)) {\n return false;\n }\n\n const focusItemId = getToolbarItemId(focusTarget);\n const pointerItemId = getToolbarItemId(pointerTarget);\n\n return focusItemId != null && focusItemId === pointerItemId;\n}\n\nexport function getToolbarScopeFocusableElements(\n scopeRoot: HTMLElement,\n options: ToolbarFocusableOptions = {},\n) {\n return Array.from(\n scopeRoot.querySelectorAll<HTMLElement>(toolbarFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarScopeRoot(element) === scopeRoot &&\n (isToolbarFocusable(element, options) ||\n isToolbarToggleGroupButton(element))\n );\n });\n}\n\nexport function getToolbarFocusMemory(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n options: ToolbarFocusableOptions = {},\n): ToolbarFocusMemory | null {\n const scopeElements = getToolbarScopeFocusableElements(scopeRoot, options);\n const scopeIndex = scopeElements.indexOf(target);\n if (scopeIndex === -1) {\n return null;\n }\n\n const groupTrigger = target.closest<HTMLElement>(\n `[${TOOLBAR_OVERFLOW_TRIGGER_ATTR}]`,\n );\n const groupKey = groupTrigger?.getAttribute(TOOLBAR_GROUP_KEY_ATTR);\n\n if (groupKey) {\n return {\n groupKey,\n scopeIndex,\n type: \"overflow-trigger\",\n };\n }\n\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_ITEM_ATTR}]`);\n const itemId = itemRoot?.getAttribute(TOOLBAR_ITEM_ATTR);\n\n if (itemRoot && itemId) {\n const itemElements = getToolbarItemFocusableElements(\n itemRoot,\n scopeRoot,\n options,\n );\n const controlIndex = itemElements.indexOf(target);\n\n return {\n controlIndex: Math.max(controlIndex, 0),\n itemId,\n scopeIndex,\n type: \"item\",\n };\n }\n\n return {\n scopeIndex,\n type: \"scope\",\n };\n}\n\nexport function resolveToolbarFocusTarget(\n scopeRoot: HTMLElement,\n focusMemory: ToolbarFocusMemory | null,\n {\n includeTabIndexMinusOne,\n items = [],\n overflowedIds,\n }: {\n items?: ToolbarOverflowItem[];\n includeTabIndexMinusOne?: boolean;\n overflowedIds?: Set<string>;\n } = {},\n) {\n const focusableOptions = {\n includeTabIndexMinusOne,\n };\n\n if (!focusMemory) {\n return (\n getToolbarScopeFocusableElements(scopeRoot, focusableOptions)[0] ?? null\n );\n }\n\n const fallback = getToolbarFocusFallback(\n scopeRoot,\n focusMemory.scopeIndex,\n focusableOptions,\n );\n\n if (focusMemory.type === \"overflow-trigger\") {\n const trigger = getToolbarOverflowTriggerElement(\n scopeRoot,\n focusMemory.groupKey,\n );\n\n if (trigger) {\n return trigger;\n }\n\n const firstVisibleItem = items.find((item) => {\n return item.overflowGroupKey === focusMemory.groupKey;\n });\n\n if (firstVisibleItem) {\n return (\n getToolbarFocusableElementForItem(\n scopeRoot,\n firstVisibleItem.id,\n 0,\n focusableOptions,\n ) ?? fallback\n );\n }\n\n return fallback;\n }\n\n if (focusMemory.type === \"item\") {\n const visibleItemTarget = getToolbarFocusableElementForItem(\n scopeRoot,\n focusMemory.itemId,\n focusMemory.controlIndex,\n focusableOptions,\n );\n\n if (visibleItemTarget) {\n return visibleItemTarget;\n }\n\n const item = items.find((entry) => entry.id === focusMemory.itemId);\n\n if (item && overflowedIds?.has(item.id)) {\n return (\n getToolbarOverflowTriggerElement(scopeRoot, item.overflowGroupKey) ??\n fallback\n );\n }\n\n return fallback;\n }\n\n return fallback;\n}\n\nexport function getToolbarDirectionalMoveTarget(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n key: string,\n options: ToolbarFocusableOptions = {},\n) {\n if (key !== \"ArrowLeft\" && key !== \"ArrowRight\") {\n return null;\n }\n\n if (getToolbarKeyboardPolicy(target).preserveHorizontalArrows) {\n return null;\n }\n\n const toggleGroupButtons = getToggleGroupButtons(target);\n\n if (toggleGroupButtons.length > 0) {\n const visualDelta = getVisualDelta(scopeRoot, key);\n const currentIndex = toggleGroupButtons.indexOf(target);\n\n if (\n currentIndex === -1 ||\n !isToggleGroupBoundary(\n currentIndex,\n toggleGroupButtons.length,\n visualDelta,\n )\n ) {\n return null;\n }\n }\n\n const scopeElements = getToolbarScopeFocusableElements(scopeRoot, options);\n const currentIndex = scopeElements.indexOf(target);\n\n if (currentIndex === -1 || scopeElements.length <= 1) {\n return null;\n }\n\n const nextIndex =\n (currentIndex + getVisualDelta(scopeRoot, key) + scopeElements.length) %\n scopeElements.length;\n\n return scopeElements[nextIndex] ?? null;\n}\n\nexport function getToolbarTabMoveTarget(\n scopeRoot: HTMLElement,\n shiftKey: boolean,\n) {\n const focusableElements = getDocumentFocusableElements(\n scopeRoot.ownerDocument,\n );\n\n if (shiftKey) {\n for (let index = focusableElements.length - 1; index >= 0; index -= 1) {\n const element = focusableElements[index];\n\n if (!element || scopeRoot.contains(element)) {\n continue;\n }\n\n if (\n element.compareDocumentPosition(scopeRoot) &\n Node.DOCUMENT_POSITION_FOLLOWING\n ) {\n return element;\n }\n }\n\n return null;\n }\n\n return (\n focusableElements.find((element) => {\n return (\n !scopeRoot.contains(element) &&\n !!(\n scopeRoot.compareDocumentPosition(element) &\n Node.DOCUMENT_POSITION_FOLLOWING\n )\n );\n }) ?? null\n );\n}\n\nexport function shouldToolbarPreserveNativeTab(target: HTMLElement) {\n return getToolbarKeyboardPolicy(target).preserveNativeTab;\n}\n\nfunction getToolbarItemFocusableElements(\n itemRoot: HTMLElement,\n scopeRoot: HTMLElement,\n options: ToolbarFocusableOptions = {},\n) {\n return Array.from(\n itemRoot.querySelectorAll<HTMLElement>(toolbarFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarScopeRoot(element) === scopeRoot &&\n (isToolbarFocusable(element, options) ||\n isToolbarToggleGroupButton(element))\n );\n });\n}\n\nfunction getToolbarFocusableElementForItem(\n scopeRoot: HTMLElement,\n itemId: string,\n controlIndex: number,\n options: ToolbarFocusableOptions = {},\n) {\n const itemRoot = scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_ITEM_ATTR}=\"${itemId}\"]`,\n );\n\n if (!itemRoot) {\n return null;\n }\n\n const itemElements = getToolbarItemFocusableElements(\n itemRoot,\n scopeRoot,\n options,\n );\n\n return (\n itemElements[Math.min(controlIndex, itemElements.length - 1)] ??\n itemElements[0] ??\n null\n );\n}\n\nfunction getToolbarOverflowTriggerElement(\n scopeRoot: HTMLElement,\n groupKey: string,\n) {\n return scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_OVERFLOW_TRIGGER_ATTR}][${TOOLBAR_GROUP_KEY_ATTR}=\"${groupKey}\"]`,\n );\n}\n\nfunction getToolbarFocusFallback(\n scopeRoot: HTMLElement,\n rememberedIndex: number,\n options: ToolbarFocusableOptions = {},\n) {\n const focusableElements = getToolbarScopeFocusableElements(\n scopeRoot,\n options,\n );\n\n if (focusableElements.length === 0) {\n return null;\n }\n\n return (\n focusableElements[\n Math.max(0, Math.min(rememberedIndex, focusableElements.length - 1))\n ] ?? focusableElements[0]\n );\n}\n\nfunction getVisualDelta(scopeRoot: HTMLElement, key: string) {\n const direction =\n scopeRoot.ownerDocument.defaultView?.getComputedStyle(scopeRoot).direction;\n\n if (key === \"ArrowRight\") {\n return direction === \"rtl\" ? -1 : 1;\n }\n\n return direction === \"rtl\" ? 1 : -1;\n}\n\nfunction isToggleGroupBoundary(\n currentIndex: number,\n length: number,\n visualDelta: number,\n) {\n if (visualDelta > 0) {\n return currentIndex === length - 1;\n }\n\n return currentIndex === 0;\n}\n\nfunction getToggleGroupButtons(target: HTMLElement) {\n const toggleGroup = target.closest<HTMLElement>(\".saltToggleButtonGroup\");\n\n if (!toggleGroup || target.tagName !== \"BUTTON\") {\n return [];\n }\n\n return Array.from(toggleGroup.querySelectorAll<HTMLElement>(\"button\")).filter(\n (button) => isToolbarFocusable(button, { includeTabIndexMinusOne: true }),\n );\n}\n\nfunction isToolbarToggleGroupButton(target: HTMLElement) {\n return (\n target.tagName === \"BUTTON\" &&\n target.closest(\".saltToggleButtonGroup\") != null &&\n isToolbarFocusable(target, { includeTabIndexMinusOne: true })\n );\n}\n\nfunction getToolbarKeyboardPolicy(target: HTMLElement): ToolbarKeyboardPolicy {\n if (\n target.isContentEditable ||\n isPlainTextInput(target) ||\n isComboBoxInput(target) ||\n isPillInputPill(target)\n ) {\n return {\n preserveHorizontalArrows: true,\n preserveNativeTab: true,\n };\n }\n\n if (isDropdownControl(target)) {\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: false,\n };\n }\n\n if (\n isSelectLikeControl(target) ||\n target.closest(\".saltDatePickerTrigger\") != null\n ) {\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: true,\n };\n }\n\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: false,\n };\n}\n\nfunction isComboBoxInput(target: HTMLElement) {\n return (\n target.tagName === \"INPUT\" &&\n target.closest('[role=\"combobox\"], .saltComboBox') != null\n );\n}\n\nfunction isPillInputPill(target: HTMLElement) {\n return (\n target.tagName === \"BUTTON\" &&\n target.classList.contains(\"saltPill\") &&\n target.closest(\".saltPillInput\") != null\n );\n}\n\nfunction isDropdownControl(target: HTMLElement) {\n return target.closest(\".saltDropdown\") != null;\n}\n\nfunction isSelectLikeControl(target: HTMLElement) {\n return (\n target.tagName === \"SELECT\" ||\n target.closest('[role=\"combobox\"], .saltComboBox, .saltDropdown') != null\n );\n}\n\nfunction isPlainTextInput(target: HTMLElement) {\n if (target.tagName === \"TEXTAREA\") {\n return true;\n }\n\n if (target.tagName !== \"INPUT\") {\n return false;\n }\n\n return textEntryInputTypes.has(\n (target as HTMLInputElement).type.toLowerCase(),\n );\n}\n\nfunction isNativeDisabledFormControl(target: HTMLElement) {\n return (\n \"disabled\" in target &&\n (target as HTMLButtonElement | HTMLInputElement).disabled\n );\n}\n\nexport function isToolbarFocusable(\n target: HTMLElement,\n { includeTabIndexMinusOne = false }: ToolbarFocusableOptions = {},\n) {\n if (isNativeDisabledFormControl(target)) {\n return false;\n }\n\n if (target.getAttribute(\"aria-hidden\") === \"true\") {\n return false;\n }\n\n if (!includeTabIndexMinusOne && target.getAttribute(\"tabindex\") === \"-1\") {\n return false;\n }\n\n if (target.hidden) {\n return false;\n }\n\n const win = target.ownerDocument.defaultView;\n\n if (!win) {\n return false;\n }\n\n const styles = win.getComputedStyle(target);\n\n if (styles.display === \"none\" || styles.visibility === \"hidden\") {\n return false;\n }\n\n return target.getClientRects().length > 0;\n}\n\n// Composite controls whose focus root (the element toolbar focus restore lands\n// on) differs from the inner element that handles keyboard interaction.\n// Restoring focus to the root would leave ArrowDown/Enter/Space targeting a\n// non-interactive wrapper, so we redirect to the interactive element\nconst toolbarFocusEntryOverrides = [\n { root: \".saltComboBox\", interactive: 'input[role=\"combobox\"]' },\n] as const;\n\nexport function focusToolbarElement(target: HTMLElement | null | undefined) {\n const focusTarget = resolveToolbarFocusEntryTarget(target);\n\n if (focusTarget?.isConnected) {\n focusTarget.focus({ preventScroll: true });\n }\n}\n\nfunction resolveToolbarFocusEntryTarget(\n target: HTMLElement | null | undefined,\n) {\n if (!target) {\n return target;\n }\n\n for (const { root, interactive } of toolbarFocusEntryOverrides) {\n if (target.matches(root)) {\n return target.querySelector<HTMLElement>(interactive) ?? target;\n }\n }\n\n return target;\n}\n\nexport function scheduleToolbarFocus(\n target: HTMLElement | null | undefined,\n targetWindow = target?.ownerDocument.defaultView,\n) {\n if (!target) {\n return () => undefined;\n }\n\n if (targetWindow?.requestAnimationFrame) {\n const frame = targetWindow.requestAnimationFrame(() => {\n focusToolbarElement(target);\n });\n\n return () => {\n targetWindow.cancelAnimationFrame(frame);\n };\n }\n\n queueMicrotask(() => {\n focusToolbarElement(target);\n });\n\n return () => undefined;\n}\n\nexport function getDocumentFocusableElements(ownerDocument: Document) {\n return Array.from(\n ownerDocument.querySelectorAll<HTMLElement>(toolbarFocusableSelector),\n ).filter((element) => isToolbarFocusable(element));\n}\n"],"names":["currentIndex"],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ import { Children, isValidElement, Fragment } from 'react';
2
+ import { Divider } from '../divider/Divider.js';
3
+ import { getRefFromChildren } from '../utils/getRefFromChildren.js';
4
+ import 'clsx';
5
+ import 'react/jsx-runtime';
6
+ import '../utils/useFloatingUI/useFloatingUI.js';
7
+ import '../utils/useId.js';
8
+ import '../salt-provider/SaltProvider.js';
9
+ import '../viewport/ViewportProvider.js';
10
+ import { ToolbarContent } from './ToolbarContent.js';
11
+ import { Tooltray } from './Tooltray.js';
12
+
13
+ function buildContentOverflowRenderSlots(items, overflowedIds, activeNamedGroupKeys) {
14
+ const triggerGroupByItemId = /* @__PURE__ */ new Map();
15
+ for (const groupKey of activeNamedGroupKeys) {
16
+ const anchorItem = items.find((item) => {
17
+ return overflowedIds.has(item.id) && item.overflowGroupKey === groupKey;
18
+ });
19
+ if (anchorItem) {
20
+ triggerGroupByItemId.set(anchorItem.id, groupKey);
21
+ }
22
+ }
23
+ const slots = [];
24
+ let hasSurvivingPredecessor = false;
25
+ for (const item of items) {
26
+ const overflowed = overflowedIds.has(item.id);
27
+ const triggerGroupKey = triggerGroupByItemId.get(item.id);
28
+ const survives = !overflowed || triggerGroupKey != null;
29
+ if (overflowed && !triggerGroupKey) {
30
+ continue;
31
+ }
32
+ slots.push({
33
+ item,
34
+ overflowed,
35
+ showLeadingDecorations: item.leadingDecorations.length > 0 && hasSurvivingPredecessor && survives,
36
+ showTrailingDecorations: !overflowed && item.trailingDecorations.length > 0,
37
+ triggerGroupKey
38
+ });
39
+ if (survives) {
40
+ hasSurvivingPredecessor = true;
41
+ }
42
+ }
43
+ return slots;
44
+ }
45
+ function flattenToolbarChildren(children) {
46
+ const flattened = [];
47
+ Children.forEach(children, (child) => {
48
+ if (child == null || typeof child === "boolean") {
49
+ return;
50
+ }
51
+ if (isValidElement(child) && child.type === Fragment) {
52
+ flattened.push(...flattenToolbarChildren(child.props.children));
53
+ return;
54
+ }
55
+ flattened.push(child);
56
+ });
57
+ return flattened;
58
+ }
59
+ function isToolbarContentElement(child) {
60
+ return isValidElement(child) && child.type === ToolbarContent;
61
+ }
62
+ function isTooltrayElement(child) {
63
+ return isValidElement(child) && child.type === Tooltray;
64
+ }
65
+ function isDividerElement(child) {
66
+ return isValidElement(child) && child.type === Divider;
67
+ }
68
+ function buildItemId(contentKey, element, order) {
69
+ const elementKey = element.key != null ? String(element.key) : `tray-${order}`;
70
+ return `${contentKey}-${elementKey}-${order}`;
71
+ }
72
+ function buildOverflowGroupKey(contentKey, overflowGroup) {
73
+ return overflowGroup === "shared" ? "shared" : `${contentKey}:${overflowGroup}`;
74
+ }
75
+ function normalizeContentItems(children, contentKey) {
76
+ var _a;
77
+ const flattenedChildren = flattenToolbarChildren(children);
78
+ const items = [];
79
+ let pendingLeadingDecorations = [];
80
+ for (const child of flattenedChildren) {
81
+ if (isDividerElement(child)) {
82
+ pendingLeadingDecorations.push(child);
83
+ continue;
84
+ }
85
+ if (!isTooltrayElement(child)) {
86
+ return null;
87
+ }
88
+ const {
89
+ align = "start",
90
+ overflowGroup = "shared",
91
+ overflowLabel,
92
+ overflowMode = "independent",
93
+ overflowPriority = 0
94
+ } = child.props;
95
+ const order = items.length;
96
+ items.push({
97
+ align,
98
+ element: child,
99
+ id: buildItemId(contentKey, child, order),
100
+ leadingDecorations: pendingLeadingDecorations,
101
+ order,
102
+ overflowGroup,
103
+ overflowGroupKey: buildOverflowGroupKey(contentKey, overflowGroup),
104
+ overflowLabel,
105
+ overflowMode,
106
+ overflowPriority,
107
+ contentKey,
108
+ trailingDecorations: []
109
+ });
110
+ pendingLeadingDecorations = [];
111
+ }
112
+ if (pendingLeadingDecorations.length > 0 && items.length > 0) {
113
+ (_a = items[items.length - 1]) == null ? void 0 : _a.trailingDecorations.push(
114
+ ...pendingLeadingDecorations
115
+ );
116
+ }
117
+ return items;
118
+ }
119
+ function normalizeExplicitContent(children) {
120
+ const content = [];
121
+ for (const [index, child] of children.entries()) {
122
+ if (!isToolbarContentElement(child)) {
123
+ continue;
124
+ }
125
+ const {
126
+ children: contentChildren,
127
+ position,
128
+ ...contentProps
129
+ } = child.props;
130
+ const contentKey = child.key != null ? String(child.key) : `${position}-content-${index}`;
131
+ const items = normalizeContentItems(contentChildren, contentKey);
132
+ if (items == null) {
133
+ return null;
134
+ }
135
+ content.push({
136
+ implicit: false,
137
+ items,
138
+ key: contentKey,
139
+ position,
140
+ props: contentProps,
141
+ ref: getRefFromChildren(child)
142
+ });
143
+ }
144
+ return content;
145
+ }
146
+ function normalizeFlatChildren(children) {
147
+ const buckets = {
148
+ start: [],
149
+ center: [],
150
+ end: []
151
+ };
152
+ let currentPosition = "start";
153
+ for (const child of children) {
154
+ if (isTooltrayElement(child)) {
155
+ currentPosition = child.props.align ?? "start";
156
+ buckets[currentPosition].push(child);
157
+ continue;
158
+ }
159
+ if (isDividerElement(child)) {
160
+ buckets[currentPosition].push(child);
161
+ continue;
162
+ }
163
+ return null;
164
+ }
165
+ return Object.keys(buckets).reduce((content, position) => {
166
+ const contentKey = `${position}-implicit`;
167
+ const contentItems = normalizeContentItems(buckets[position], contentKey);
168
+ if (contentItems == null || contentItems.length === 0) {
169
+ return content;
170
+ }
171
+ content.push({
172
+ implicit: true,
173
+ items: contentItems,
174
+ key: contentKey,
175
+ position,
176
+ props: {},
177
+ ref: null
178
+ });
179
+ return content;
180
+ }, []);
181
+ }
182
+ function normalizeToolbarChildren(children) {
183
+ const flattenedChildren = flattenToolbarChildren(children);
184
+ const hasContentChildren = flattenedChildren.some(isToolbarContentElement);
185
+ const hasOnlyContent = hasContentChildren && flattenedChildren.every(isToolbarContentElement);
186
+ const hasOnlyFlatChildren = flattenedChildren.every(
187
+ (child) => isTooltrayElement(child) || isDividerElement(child)
188
+ );
189
+ if (hasOnlyContent) {
190
+ const content = normalizeExplicitContent(flattenedChildren);
191
+ if (content == null) {
192
+ return { mode: "invalid", content: [] };
193
+ }
194
+ return {
195
+ mode: "explicit",
196
+ content
197
+ };
198
+ }
199
+ if (hasOnlyFlatChildren) {
200
+ const content = normalizeFlatChildren(flattenedChildren);
201
+ if (content == null) {
202
+ return { mode: "invalid", content: [] };
203
+ }
204
+ return {
205
+ mode: "flat",
206
+ content
207
+ };
208
+ }
209
+ return {
210
+ mode: "invalid",
211
+ content: []
212
+ };
213
+ }
214
+
215
+ export { buildContentOverflowRenderSlots, flattenToolbarChildren, normalizeToolbarChildren };
216
+ //# sourceMappingURL=toolbarUtils.js.map