@salt-ds/lab 1.0.0-alpha.93 → 1.0.0-alpha.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/css/salt-lab.css +163 -122
- package/dist-cjs/index.js +6 -8
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/toolbar-next/ToolbarContentNext.css.js +6 -0
- package/dist-cjs/toolbar-next/ToolbarContentNext.css.js.map +1 -0
- package/dist-cjs/toolbar-next/ToolbarContentNext.js +32 -0
- package/dist-cjs/toolbar-next/ToolbarContentNext.js.map +1 -0
- package/dist-cjs/toolbar-next/ToolbarNext.css.js +6 -0
- package/dist-cjs/toolbar-next/ToolbarNext.css.js.map +1 -0
- package/dist-cjs/toolbar-next/ToolbarNext.js +394 -0
- package/dist-cjs/toolbar-next/ToolbarNext.js.map +1 -0
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js +6 -0
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js.map +1 -0
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +705 -0
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +1 -0
- package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +165 -0
- package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +1 -0
- package/dist-cjs/toolbar-next/TooltrayNext.css.js +6 -0
- package/dist-cjs/toolbar-next/TooltrayNext.css.js.map +1 -0
- package/dist-cjs/toolbar-next/TooltrayNext.js +55 -0
- package/dist-cjs/toolbar-next/TooltrayNext.js.map +1 -0
- package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +391 -0
- package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -0
- package/dist-cjs/toolbar-next/toolbarNextUtils.js +215 -0
- package/dist-cjs/toolbar-next/toolbarNextUtils.js.map +1 -0
- package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +334 -0
- package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -0
- package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +743 -0
- package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +1 -0
- package/dist-es/index.js +3 -4
- package/dist-es/index.js.map +1 -1
- package/dist-es/toolbar-next/ToolbarContentNext.css.js +4 -0
- package/dist-es/toolbar-next/ToolbarContentNext.css.js.map +1 -0
- package/dist-es/toolbar-next/ToolbarContentNext.js +30 -0
- package/dist-es/toolbar-next/ToolbarContentNext.js.map +1 -0
- package/dist-es/toolbar-next/ToolbarNext.css.js +4 -0
- package/dist-es/toolbar-next/ToolbarNext.css.js.map +1 -0
- package/dist-es/toolbar-next/ToolbarNext.js +392 -0
- package/dist-es/toolbar-next/ToolbarNext.js.map +1 -0
- package/dist-es/toolbar-next/ToolbarNextOverflow.css.js +4 -0
- package/dist-es/toolbar-next/ToolbarNextOverflow.css.js.map +1 -0
- package/dist-es/toolbar-next/ToolbarNextOverflow.js +700 -0
- package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +1 -0
- package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +159 -0
- package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +1 -0
- package/dist-es/toolbar-next/TooltrayNext.css.js +4 -0
- package/dist-es/toolbar-next/TooltrayNext.css.js.map +1 -0
- package/dist-es/toolbar-next/TooltrayNext.js +53 -0
- package/dist-es/toolbar-next/TooltrayNext.js.map +1 -0
- package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +372 -0
- package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -0
- package/dist-es/toolbar-next/toolbarNextUtils.js +211 -0
- package/dist-es/toolbar-next/toolbarNextUtils.js.map +1 -0
- package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +332 -0
- package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -0
- package/dist-es/toolbar-next/useToolbarNextOverflow.js +741 -0
- package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +1 -0
- package/dist-types/index.d.ts +1 -1
- package/dist-types/toolbar-next/ToolbarContentNext.d.ts +11 -0
- package/dist-types/toolbar-next/ToolbarNext.d.ts +12 -0
- package/dist-types/toolbar-next/ToolbarNextOverflow.d.ts +34 -0
- package/dist-types/toolbar-next/ToolbarNextOverflowFloatingBoundary.d.ts +16 -0
- package/dist-types/toolbar-next/TooltrayNext.d.ts +37 -0
- package/dist-types/toolbar-next/index.d.ts +3 -0
- package/dist-types/toolbar-next/toolbarNextKeyboardUtils.d.ts +39 -0
- package/dist-types/toolbar-next/toolbarNextUtils.d.ts +42 -0
- package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +41 -0
- package/dist-types/toolbar-next/useToolbarNextOverflow.d.ts +37 -0
- package/package.json +2 -2
- package/dist-cjs/tree/Tree.css.js +0 -6
- package/dist-cjs/tree/Tree.css.js.map +0 -1
- package/dist-cjs/tree/Tree.js +0 -303
- package/dist-cjs/tree/Tree.js.map +0 -1
- package/dist-cjs/tree/TreeContext.js +0 -31
- package/dist-cjs/tree/TreeContext.js.map +0 -1
- package/dist-cjs/tree/TreeNode.css.js +0 -6
- package/dist-cjs/tree/TreeNode.css.js.map +0 -1
- package/dist-cjs/tree/TreeNode.js +0 -103
- package/dist-cjs/tree/TreeNode.js.map +0 -1
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +0 -6
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js.map +0 -1
- package/dist-cjs/tree/TreeNodeExpansionIcon.js +0 -62
- package/dist-cjs/tree/TreeNodeExpansionIcon.js.map +0 -1
- package/dist-cjs/tree/TreeNodeLabel.css.js +0 -6
- package/dist-cjs/tree/TreeNodeLabel.css.js.map +0 -1
- package/dist-cjs/tree/TreeNodeLabel.js +0 -26
- package/dist-cjs/tree/TreeNodeLabel.js.map +0 -1
- package/dist-cjs/tree/TreeNodeTrigger.css.js +0 -6
- package/dist-cjs/tree/TreeNodeTrigger.css.js.map +0 -1
- package/dist-cjs/tree/TreeNodeTrigger.js +0 -153
- package/dist-cjs/tree/TreeNodeTrigger.js.map +0 -1
- package/dist-cjs/tree/treeModel.js +0 -61
- package/dist-cjs/tree/treeModel.js.map +0 -1
- package/dist-cjs/tree/useTree.js +0 -337
- package/dist-cjs/tree/useTree.js.map +0 -1
- package/dist-es/tree/Tree.css.js +0 -4
- package/dist-es/tree/Tree.css.js.map +0 -1
- package/dist-es/tree/Tree.js +0 -301
- package/dist-es/tree/Tree.js.map +0 -1
- package/dist-es/tree/TreeContext.js +0 -26
- package/dist-es/tree/TreeContext.js.map +0 -1
- package/dist-es/tree/TreeNode.css.js +0 -4
- package/dist-es/tree/TreeNode.css.js.map +0 -1
- package/dist-es/tree/TreeNode.js +0 -101
- package/dist-es/tree/TreeNode.js.map +0 -1
- package/dist-es/tree/TreeNodeExpansionIcon.css.js +0 -4
- package/dist-es/tree/TreeNodeExpansionIcon.css.js.map +0 -1
- package/dist-es/tree/TreeNodeExpansionIcon.js +0 -60
- package/dist-es/tree/TreeNodeExpansionIcon.js.map +0 -1
- package/dist-es/tree/TreeNodeLabel.css.js +0 -4
- package/dist-es/tree/TreeNodeLabel.css.js.map +0 -1
- package/dist-es/tree/TreeNodeLabel.js +0 -24
- package/dist-es/tree/TreeNodeLabel.js.map +0 -1
- package/dist-es/tree/TreeNodeTrigger.css.js +0 -4
- package/dist-es/tree/TreeNodeTrigger.css.js.map +0 -1
- package/dist-es/tree/TreeNodeTrigger.js +0 -151
- package/dist-es/tree/TreeNodeTrigger.js.map +0 -1
- package/dist-es/tree/treeModel.js +0 -57
- package/dist-es/tree/treeModel.js.map +0 -1
- package/dist-es/tree/useTree.js +0 -335
- package/dist-es/tree/useTree.js.map +0 -1
- package/dist-types/tree/Tree.d.ts +0 -36
- package/dist-types/tree/TreeContext.d.ts +0 -77
- package/dist-types/tree/TreeNode.d.ts +0 -25
- package/dist-types/tree/TreeNodeExpansionIcon.d.ts +0 -4
- package/dist-types/tree/TreeNodeLabel.d.ts +0 -4
- package/dist-types/tree/TreeNodeTrigger.d.ts +0 -8
- package/dist-types/tree/index.d.ts +0 -4
- package/dist-types/tree/treeModel.d.ts +0 -24
- package/dist-types/tree/useTree.d.ts +0 -68
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const TOOLBAR_NEXT_SCOPE_ROOT_ATTR = "data-salt-toolbar-next-scope-root";
|
|
4
|
+
const TOOLBAR_NEXT_ITEM_ATTR = "data-salt-toolbar-next-item-id";
|
|
5
|
+
const TOOLBAR_NEXT_GROUP_KEY_ATTR = "data-salt-toolbar-next-overflow-group-key";
|
|
6
|
+
const TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR = "data-salt-toolbar-next-overflow-trigger";
|
|
7
|
+
const toolbarNextFocusableSelector = [
|
|
8
|
+
"button",
|
|
9
|
+
"[href]",
|
|
10
|
+
"input",
|
|
11
|
+
"select",
|
|
12
|
+
"textarea",
|
|
13
|
+
"[tabindex]"
|
|
14
|
+
].join(", ");
|
|
15
|
+
const textEntryInputTypes = /* @__PURE__ */ new Set([
|
|
16
|
+
"",
|
|
17
|
+
"date",
|
|
18
|
+
"datetime-local",
|
|
19
|
+
"email",
|
|
20
|
+
"month",
|
|
21
|
+
"number",
|
|
22
|
+
"password",
|
|
23
|
+
"search",
|
|
24
|
+
"tel",
|
|
25
|
+
"text",
|
|
26
|
+
"time",
|
|
27
|
+
"url",
|
|
28
|
+
"week"
|
|
29
|
+
]);
|
|
30
|
+
function getClosestToolbarNextScopeRoot(target) {
|
|
31
|
+
if (!(target instanceof Element)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return target.closest(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`);
|
|
35
|
+
}
|
|
36
|
+
function getToolbarNextItemId(target) {
|
|
37
|
+
var _a;
|
|
38
|
+
return ((_a = target == null ? void 0 : target.closest(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)) == null ? void 0 : _a.getAttribute(TOOLBAR_NEXT_ITEM_ATTR)) ?? null;
|
|
39
|
+
}
|
|
40
|
+
function isToolbarNextFocusFromPointerTarget(focusTarget, pointerTarget) {
|
|
41
|
+
if (!(pointerTarget instanceof Node)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (focusTarget === pointerTarget || focusTarget.contains(pointerTarget)) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (!(pointerTarget instanceof Element)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const focusItemId = getToolbarNextItemId(focusTarget);
|
|
51
|
+
const pointerItemId = getToolbarNextItemId(pointerTarget);
|
|
52
|
+
return focusItemId != null && focusItemId === pointerItemId;
|
|
53
|
+
}
|
|
54
|
+
function getToolbarNextScopeFocusableElements(scopeRoot, options = {}) {
|
|
55
|
+
return Array.from(
|
|
56
|
+
scopeRoot.querySelectorAll(toolbarNextFocusableSelector)
|
|
57
|
+
).filter((element) => {
|
|
58
|
+
return getClosestToolbarNextScopeRoot(element) === scopeRoot && (isToolbarNextFocusable(element, options) || isToolbarNextToggleGroupButton(element));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function getToolbarNextFocusMemory(scopeRoot, target, options = {}) {
|
|
62
|
+
const scopeElements = getToolbarNextScopeFocusableElements(
|
|
63
|
+
scopeRoot,
|
|
64
|
+
options
|
|
65
|
+
);
|
|
66
|
+
const scopeIndex = scopeElements.indexOf(target);
|
|
67
|
+
if (scopeIndex === -1) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const groupTrigger = target.closest(
|
|
71
|
+
`[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`
|
|
72
|
+
);
|
|
73
|
+
const groupKey = groupTrigger == null ? void 0 : groupTrigger.getAttribute(TOOLBAR_NEXT_GROUP_KEY_ATTR);
|
|
74
|
+
if (groupKey) {
|
|
75
|
+
return {
|
|
76
|
+
groupKey,
|
|
77
|
+
scopeIndex,
|
|
78
|
+
type: "overflow-trigger"
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const itemRoot = target.closest(`[${TOOLBAR_NEXT_ITEM_ATTR}]`);
|
|
82
|
+
const itemId = itemRoot == null ? void 0 : itemRoot.getAttribute(TOOLBAR_NEXT_ITEM_ATTR);
|
|
83
|
+
if (itemRoot && itemId) {
|
|
84
|
+
const itemElements = getToolbarNextItemFocusableElements(
|
|
85
|
+
itemRoot,
|
|
86
|
+
scopeRoot,
|
|
87
|
+
options
|
|
88
|
+
);
|
|
89
|
+
const controlIndex = itemElements.indexOf(target);
|
|
90
|
+
return {
|
|
91
|
+
controlIndex: Math.max(controlIndex, 0),
|
|
92
|
+
itemId,
|
|
93
|
+
scopeIndex,
|
|
94
|
+
type: "item"
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
scopeIndex,
|
|
99
|
+
type: "scope"
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function resolveToolbarNextFocusTarget(scopeRoot, focusMemory, {
|
|
103
|
+
includeTabIndexMinusOne,
|
|
104
|
+
items = [],
|
|
105
|
+
overflowedIds
|
|
106
|
+
} = {}) {
|
|
107
|
+
const focusableOptions = {
|
|
108
|
+
includeTabIndexMinusOne
|
|
109
|
+
};
|
|
110
|
+
if (!focusMemory) {
|
|
111
|
+
return getToolbarNextScopeFocusableElements(scopeRoot, focusableOptions)[0] ?? null;
|
|
112
|
+
}
|
|
113
|
+
const fallback = getToolbarNextFocusFallback(
|
|
114
|
+
scopeRoot,
|
|
115
|
+
focusMemory.scopeIndex,
|
|
116
|
+
focusableOptions
|
|
117
|
+
);
|
|
118
|
+
if (focusMemory.type === "overflow-trigger") {
|
|
119
|
+
const trigger = getToolbarNextOverflowTriggerElement(
|
|
120
|
+
scopeRoot,
|
|
121
|
+
focusMemory.groupKey
|
|
122
|
+
);
|
|
123
|
+
if (trigger) {
|
|
124
|
+
return trigger;
|
|
125
|
+
}
|
|
126
|
+
const firstVisibleItem = items.find((item) => {
|
|
127
|
+
return item.overflowGroupKey === focusMemory.groupKey;
|
|
128
|
+
});
|
|
129
|
+
if (firstVisibleItem) {
|
|
130
|
+
return getToolbarNextFocusableElementForItem(
|
|
131
|
+
scopeRoot,
|
|
132
|
+
firstVisibleItem.id,
|
|
133
|
+
0,
|
|
134
|
+
focusableOptions
|
|
135
|
+
) ?? fallback;
|
|
136
|
+
}
|
|
137
|
+
return fallback;
|
|
138
|
+
}
|
|
139
|
+
if (focusMemory.type === "item") {
|
|
140
|
+
const visibleItemTarget = getToolbarNextFocusableElementForItem(
|
|
141
|
+
scopeRoot,
|
|
142
|
+
focusMemory.itemId,
|
|
143
|
+
focusMemory.controlIndex,
|
|
144
|
+
focusableOptions
|
|
145
|
+
);
|
|
146
|
+
if (visibleItemTarget) {
|
|
147
|
+
return visibleItemTarget;
|
|
148
|
+
}
|
|
149
|
+
const item = items.find((entry) => entry.id === focusMemory.itemId);
|
|
150
|
+
if (item && (overflowedIds == null ? void 0 : overflowedIds.has(item.id))) {
|
|
151
|
+
return getToolbarNextOverflowTriggerElement(
|
|
152
|
+
scopeRoot,
|
|
153
|
+
item.overflowGroupKey
|
|
154
|
+
) ?? fallback;
|
|
155
|
+
}
|
|
156
|
+
return fallback;
|
|
157
|
+
}
|
|
158
|
+
return fallback;
|
|
159
|
+
}
|
|
160
|
+
function getToolbarNextDirectionalMoveTarget(scopeRoot, target, key, options = {}) {
|
|
161
|
+
if (key !== "ArrowLeft" && key !== "ArrowRight") {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
if (getToolbarNextKeyboardPolicy(target).preserveHorizontalArrows) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const toggleGroupButtons = getToggleGroupButtons(target);
|
|
168
|
+
if (toggleGroupButtons.length > 0) {
|
|
169
|
+
const visualDelta = getVisualDelta(scopeRoot, key);
|
|
170
|
+
const currentIndex2 = toggleGroupButtons.indexOf(target);
|
|
171
|
+
if (currentIndex2 === -1 || !isToggleGroupBoundary(
|
|
172
|
+
currentIndex2,
|
|
173
|
+
toggleGroupButtons.length,
|
|
174
|
+
visualDelta
|
|
175
|
+
)) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const scopeElements = getToolbarNextScopeFocusableElements(
|
|
180
|
+
scopeRoot,
|
|
181
|
+
options
|
|
182
|
+
);
|
|
183
|
+
const currentIndex = scopeElements.indexOf(target);
|
|
184
|
+
if (currentIndex === -1 || scopeElements.length <= 1) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const nextIndex = (currentIndex + getVisualDelta(scopeRoot, key) + scopeElements.length) % scopeElements.length;
|
|
188
|
+
return scopeElements[nextIndex] ?? null;
|
|
189
|
+
}
|
|
190
|
+
function getToolbarNextTabMoveTarget(scopeRoot, shiftKey) {
|
|
191
|
+
const focusableElements = getDocumentFocusableElements(
|
|
192
|
+
scopeRoot.ownerDocument
|
|
193
|
+
);
|
|
194
|
+
if (shiftKey) {
|
|
195
|
+
for (let index = focusableElements.length - 1; index >= 0; index -= 1) {
|
|
196
|
+
const element = focusableElements[index];
|
|
197
|
+
if (!element || scopeRoot.contains(element)) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (element.compareDocumentPosition(scopeRoot) & Node.DOCUMENT_POSITION_FOLLOWING) {
|
|
201
|
+
return element;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return focusableElements.find((element) => {
|
|
207
|
+
return !scopeRoot.contains(element) && !!(scopeRoot.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING);
|
|
208
|
+
}) ?? null;
|
|
209
|
+
}
|
|
210
|
+
function shouldToolbarNextPreserveNativeTab(target) {
|
|
211
|
+
return getToolbarNextKeyboardPolicy(target).preserveNativeTab;
|
|
212
|
+
}
|
|
213
|
+
function getToolbarNextItemFocusableElements(itemRoot, scopeRoot, options = {}) {
|
|
214
|
+
return Array.from(
|
|
215
|
+
itemRoot.querySelectorAll(toolbarNextFocusableSelector)
|
|
216
|
+
).filter((element) => {
|
|
217
|
+
return getClosestToolbarNextScopeRoot(element) === scopeRoot && (isToolbarNextFocusable(element, options) || isToolbarNextToggleGroupButton(element));
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
function getToolbarNextFocusableElementForItem(scopeRoot, itemId, controlIndex, options = {}) {
|
|
221
|
+
const itemRoot = scopeRoot.querySelector(
|
|
222
|
+
`[${TOOLBAR_NEXT_ITEM_ATTR}="${itemId}"]`
|
|
223
|
+
);
|
|
224
|
+
if (!itemRoot) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
const itemElements = getToolbarNextItemFocusableElements(
|
|
228
|
+
itemRoot,
|
|
229
|
+
scopeRoot,
|
|
230
|
+
options
|
|
231
|
+
);
|
|
232
|
+
return itemElements[Math.min(controlIndex, itemElements.length - 1)] ?? itemElements[0] ?? null;
|
|
233
|
+
}
|
|
234
|
+
function getToolbarNextOverflowTriggerElement(scopeRoot, groupKey) {
|
|
235
|
+
return scopeRoot.querySelector(
|
|
236
|
+
`[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}][${TOOLBAR_NEXT_GROUP_KEY_ATTR}="${groupKey}"]`
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
function getToolbarNextFocusFallback(scopeRoot, rememberedIndex, options = {}) {
|
|
240
|
+
const focusableElements = getToolbarNextScopeFocusableElements(
|
|
241
|
+
scopeRoot,
|
|
242
|
+
options
|
|
243
|
+
);
|
|
244
|
+
if (focusableElements.length === 0) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
return focusableElements[Math.max(0, Math.min(rememberedIndex, focusableElements.length - 1))] ?? focusableElements[0];
|
|
248
|
+
}
|
|
249
|
+
function getVisualDelta(scopeRoot, key) {
|
|
250
|
+
var _a;
|
|
251
|
+
const direction = (_a = scopeRoot.ownerDocument.defaultView) == null ? void 0 : _a.getComputedStyle(scopeRoot).direction;
|
|
252
|
+
if (key === "ArrowRight") {
|
|
253
|
+
return direction === "rtl" ? -1 : 1;
|
|
254
|
+
}
|
|
255
|
+
return direction === "rtl" ? 1 : -1;
|
|
256
|
+
}
|
|
257
|
+
function isToggleGroupBoundary(currentIndex, length, visualDelta) {
|
|
258
|
+
if (visualDelta > 0) {
|
|
259
|
+
return currentIndex === length - 1;
|
|
260
|
+
}
|
|
261
|
+
return currentIndex === 0;
|
|
262
|
+
}
|
|
263
|
+
function getToggleGroupButtons(target) {
|
|
264
|
+
const toggleGroup = target.closest(".saltToggleButtonGroup");
|
|
265
|
+
if (!toggleGroup || target.tagName !== "BUTTON") {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
return Array.from(toggleGroup.querySelectorAll("button")).filter(
|
|
269
|
+
(button) => isToolbarNextFocusable(button, { includeTabIndexMinusOne: true })
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
function isToolbarNextToggleGroupButton(target) {
|
|
273
|
+
return target.tagName === "BUTTON" && target.closest(".saltToggleButtonGroup") != null && isToolbarNextFocusable(target, { includeTabIndexMinusOne: true });
|
|
274
|
+
}
|
|
275
|
+
function getToolbarNextKeyboardPolicy(target) {
|
|
276
|
+
if (target.isContentEditable || isPlainTextInput(target) || isComboBoxInput(target)) {
|
|
277
|
+
return {
|
|
278
|
+
preserveHorizontalArrows: true,
|
|
279
|
+
preserveNativeTab: true
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (isDropdownControl(target)) {
|
|
283
|
+
return {
|
|
284
|
+
preserveHorizontalArrows: false,
|
|
285
|
+
preserveNativeTab: false
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
if (isSelectLikeControl(target) || target.closest(".saltDatePickerTrigger") != null) {
|
|
289
|
+
return {
|
|
290
|
+
preserveHorizontalArrows: false,
|
|
291
|
+
preserveNativeTab: true
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
preserveHorizontalArrows: false,
|
|
296
|
+
preserveNativeTab: false
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function isComboBoxInput(target) {
|
|
300
|
+
return target.tagName === "INPUT" && target.closest('[role="combobox"], .saltComboBox') != null;
|
|
301
|
+
}
|
|
302
|
+
function isDropdownControl(target) {
|
|
303
|
+
return target.closest(".saltDropdown") != null;
|
|
304
|
+
}
|
|
305
|
+
function isSelectLikeControl(target) {
|
|
306
|
+
return target.tagName === "SELECT" || target.closest('[role="combobox"], .saltComboBox, .saltDropdown') != null;
|
|
307
|
+
}
|
|
308
|
+
function isPlainTextInput(target) {
|
|
309
|
+
if (target.tagName === "TEXTAREA") {
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
if (target.tagName !== "INPUT") {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
return textEntryInputTypes.has(
|
|
316
|
+
target.type.toLowerCase()
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
function isNativeDisabledFormControl(target) {
|
|
320
|
+
return "disabled" in target && target.disabled;
|
|
321
|
+
}
|
|
322
|
+
function isToolbarNextFocusable(target, { includeTabIndexMinusOne = false } = {}) {
|
|
323
|
+
if (isNativeDisabledFormControl(target)) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
if (target.getAttribute("aria-hidden") === "true") {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
if (!includeTabIndexMinusOne && target.getAttribute("tabindex") === "-1") {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
if (target.hidden) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
const win = target.ownerDocument.defaultView;
|
|
336
|
+
if (!win) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
const styles = win.getComputedStyle(target);
|
|
340
|
+
if (styles.display === "none" || styles.visibility === "hidden") {
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
return target.getClientRects().length > 0;
|
|
344
|
+
}
|
|
345
|
+
function focusToolbarNextElement(target) {
|
|
346
|
+
if (target == null ? void 0 : target.isConnected) {
|
|
347
|
+
target.focus({ preventScroll: true });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function scheduleToolbarNextFocus(target, targetWindow = target == null ? void 0 : target.ownerDocument.defaultView) {
|
|
351
|
+
if (!target) {
|
|
352
|
+
return () => void 0;
|
|
353
|
+
}
|
|
354
|
+
if (targetWindow == null ? void 0 : targetWindow.requestAnimationFrame) {
|
|
355
|
+
const frame = targetWindow.requestAnimationFrame(() => {
|
|
356
|
+
focusToolbarNextElement(target);
|
|
357
|
+
});
|
|
358
|
+
return () => {
|
|
359
|
+
targetWindow.cancelAnimationFrame(frame);
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
queueMicrotask(() => {
|
|
363
|
+
focusToolbarNextElement(target);
|
|
364
|
+
});
|
|
365
|
+
return () => void 0;
|
|
366
|
+
}
|
|
367
|
+
function getDocumentFocusableElements(ownerDocument) {
|
|
368
|
+
return Array.from(
|
|
369
|
+
ownerDocument.querySelectorAll(toolbarNextFocusableSelector)
|
|
370
|
+
).filter((element) => isToolbarNextFocusable(element));
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
exports.TOOLBAR_NEXT_GROUP_KEY_ATTR = TOOLBAR_NEXT_GROUP_KEY_ATTR;
|
|
374
|
+
exports.TOOLBAR_NEXT_ITEM_ATTR = TOOLBAR_NEXT_ITEM_ATTR;
|
|
375
|
+
exports.TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR = TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR;
|
|
376
|
+
exports.TOOLBAR_NEXT_SCOPE_ROOT_ATTR = TOOLBAR_NEXT_SCOPE_ROOT_ATTR;
|
|
377
|
+
exports.focusToolbarNextElement = focusToolbarNextElement;
|
|
378
|
+
exports.getClosestToolbarNextScopeRoot = getClosestToolbarNextScopeRoot;
|
|
379
|
+
exports.getDocumentFocusableElements = getDocumentFocusableElements;
|
|
380
|
+
exports.getToolbarNextDirectionalMoveTarget = getToolbarNextDirectionalMoveTarget;
|
|
381
|
+
exports.getToolbarNextFocusMemory = getToolbarNextFocusMemory;
|
|
382
|
+
exports.getToolbarNextItemId = getToolbarNextItemId;
|
|
383
|
+
exports.getToolbarNextScopeFocusableElements = getToolbarNextScopeFocusableElements;
|
|
384
|
+
exports.getToolbarNextTabMoveTarget = getToolbarNextTabMoveTarget;
|
|
385
|
+
exports.isToolbarNextFocusFromPointerTarget = isToolbarNextFocusFromPointerTarget;
|
|
386
|
+
exports.isToolbarNextFocusable = isToolbarNextFocusable;
|
|
387
|
+
exports.resolveToolbarNextFocusTarget = resolveToolbarNextFocusTarget;
|
|
388
|
+
exports.scheduleToolbarNextFocus = scheduleToolbarNextFocus;
|
|
389
|
+
exports.shouldToolbarNextPreserveNativeTab = shouldToolbarNextPreserveNativeTab;
|
|
390
|
+
exports.toolbarNextFocusableSelector = toolbarNextFocusableSelector;
|
|
391
|
+
//# sourceMappingURL=toolbarNextKeyboardUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbarNextKeyboardUtils.js","sources":["../src/toolbar-next/toolbarNextKeyboardUtils.ts"],"sourcesContent":["import type { ToolbarNextOverflowItem } from \"./toolbarNextUtils\";\n\nexport const TOOLBAR_NEXT_SCOPE_ROOT_ATTR = \"data-salt-toolbar-next-scope-root\";\nexport const TOOLBAR_NEXT_ITEM_ATTR = \"data-salt-toolbar-next-item-id\";\nexport const TOOLBAR_NEXT_GROUP_KEY_ATTR =\n \"data-salt-toolbar-next-overflow-group-key\";\nexport const TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR =\n \"data-salt-toolbar-next-overflow-trigger\";\n\nexport const toolbarNextFocusableSelector = [\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 ToolbarNextFocusMemory =\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 ToolbarNextFocusableOptions {\n includeTabIndexMinusOne?: boolean;\n}\n\ninterface ToolbarNextKeyboardPolicy {\n preserveHorizontalArrows: boolean;\n preserveNativeTab: boolean;\n}\n\nexport function getClosestToolbarNextScopeRoot(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return null;\n }\n\n return target.closest<HTMLElement>(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`);\n}\n\nexport function getToolbarNextItemId(target: Element | null) {\n return (\n target\n ?.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR) ?? null\n );\n}\n\nexport function isToolbarNextFocusFromPointerTarget(\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 = getToolbarNextItemId(focusTarget);\n const pointerItemId = getToolbarNextItemId(pointerTarget);\n\n return focusItemId != null && focusItemId === pointerItemId;\n}\n\nexport function getToolbarNextScopeFocusableElements(\n scopeRoot: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n) {\n return Array.from(\n scopeRoot.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarNextScopeRoot(element) === scopeRoot &&\n (isToolbarNextFocusable(element, options) ||\n isToolbarNextToggleGroupButton(element))\n );\n });\n}\n\nexport function getToolbarNextFocusMemory(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n): ToolbarNextFocusMemory | null {\n const scopeElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n const scopeIndex = scopeElements.indexOf(target);\n if (scopeIndex === -1) {\n return null;\n }\n\n const groupTrigger = target.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`,\n );\n const groupKey = groupTrigger?.getAttribute(TOOLBAR_NEXT_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_NEXT_ITEM_ATTR}]`);\n const itemId = itemRoot?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR);\n\n if (itemRoot && itemId) {\n const itemElements = getToolbarNextItemFocusableElements(\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 resolveToolbarNextFocusTarget(\n scopeRoot: HTMLElement,\n focusMemory: ToolbarNextFocusMemory | null,\n {\n includeTabIndexMinusOne,\n items = [],\n overflowedIds,\n }: {\n items?: ToolbarNextOverflowItem[];\n includeTabIndexMinusOne?: boolean;\n overflowedIds?: Set<string>;\n } = {},\n) {\n const focusableOptions = {\n includeTabIndexMinusOne,\n };\n\n if (!focusMemory) {\n return (\n getToolbarNextScopeFocusableElements(scopeRoot, focusableOptions)[0] ??\n null\n );\n }\n\n const fallback = getToolbarNextFocusFallback(\n scopeRoot,\n focusMemory.scopeIndex,\n focusableOptions,\n );\n\n if (focusMemory.type === \"overflow-trigger\") {\n const trigger = getToolbarNextOverflowTriggerElement(\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 getToolbarNextFocusableElementForItem(\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 = getToolbarNextFocusableElementForItem(\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 getToolbarNextOverflowTriggerElement(\n scopeRoot,\n item.overflowGroupKey,\n ) ?? fallback\n );\n }\n\n return fallback;\n }\n\n return fallback;\n}\n\nexport function getToolbarNextDirectionalMoveTarget(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n key: string,\n options: ToolbarNextFocusableOptions = {},\n) {\n if (key !== \"ArrowLeft\" && key !== \"ArrowRight\") {\n return null;\n }\n\n if (getToolbarNextKeyboardPolicy(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 = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\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 getToolbarNextTabMoveTarget(\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 shouldToolbarNextPreserveNativeTab(target: HTMLElement) {\n return getToolbarNextKeyboardPolicy(target).preserveNativeTab;\n}\n\nfunction getToolbarNextItemFocusableElements(\n itemRoot: HTMLElement,\n scopeRoot: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n) {\n return Array.from(\n itemRoot.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarNextScopeRoot(element) === scopeRoot &&\n (isToolbarNextFocusable(element, options) ||\n isToolbarNextToggleGroupButton(element))\n );\n });\n}\n\nfunction getToolbarNextFocusableElementForItem(\n scopeRoot: HTMLElement,\n itemId: string,\n controlIndex: number,\n options: ToolbarNextFocusableOptions = {},\n) {\n const itemRoot = scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_NEXT_ITEM_ATTR}=\"${itemId}\"]`,\n );\n\n if (!itemRoot) {\n return null;\n }\n\n const itemElements = getToolbarNextItemFocusableElements(\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 getToolbarNextOverflowTriggerElement(\n scopeRoot: HTMLElement,\n groupKey: string,\n) {\n return scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}][${TOOLBAR_NEXT_GROUP_KEY_ATTR}=\"${groupKey}\"]`,\n );\n}\n\nfunction getToolbarNextFocusFallback(\n scopeRoot: HTMLElement,\n rememberedIndex: number,\n options: ToolbarNextFocusableOptions = {},\n) {\n const focusableElements = getToolbarNextScopeFocusableElements(\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) =>\n isToolbarNextFocusable(button, { includeTabIndexMinusOne: true }),\n );\n}\n\nfunction isToolbarNextToggleGroupButton(target: HTMLElement) {\n return (\n target.tagName === \"BUTTON\" &&\n target.closest(\".saltToggleButtonGroup\") != null &&\n isToolbarNextFocusable(target, { includeTabIndexMinusOne: true })\n );\n}\n\nfunction getToolbarNextKeyboardPolicy(\n target: HTMLElement,\n): ToolbarNextKeyboardPolicy {\n if (\n target.isContentEditable ||\n isPlainTextInput(target) ||\n isComboBoxInput(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 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 isToolbarNextFocusable(\n target: HTMLElement,\n { includeTabIndexMinusOne = false }: ToolbarNextFocusableOptions = {},\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\nexport function focusToolbarNextElement(\n target: HTMLElement | null | undefined,\n) {\n if (target?.isConnected) {\n target.focus({ preventScroll: true });\n }\n}\n\nexport function scheduleToolbarNextFocus(\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 focusToolbarNextElement(target);\n });\n\n return () => {\n targetWindow.cancelAnimationFrame(frame);\n };\n }\n\n queueMicrotask(() => {\n focusToolbarNextElement(target);\n });\n\n return () => undefined;\n}\n\nexport function getDocumentFocusableElements(ownerDocument: Document) {\n return Array.from(\n ownerDocument.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => isToolbarNextFocusable(element));\n}\n"],"names":["currentIndex"],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@salt-ds/core');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var ToolbarContentNext = require('./ToolbarContentNext.js');
|
|
6
|
+
var TooltrayNext = require('./TooltrayNext.js');
|
|
7
|
+
|
|
8
|
+
function buildContentOverflowRenderSlots(items, overflowedIds, activeNamedGroupKeys) {
|
|
9
|
+
const triggerGroupByItemId = /* @__PURE__ */ new Map();
|
|
10
|
+
for (const groupKey of activeNamedGroupKeys) {
|
|
11
|
+
const anchorItem = items.find((item) => {
|
|
12
|
+
return overflowedIds.has(item.id) && item.overflowGroupKey === groupKey;
|
|
13
|
+
});
|
|
14
|
+
if (anchorItem) {
|
|
15
|
+
triggerGroupByItemId.set(anchorItem.id, groupKey);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const slots = [];
|
|
19
|
+
let hasSurvivingPredecessor = false;
|
|
20
|
+
for (const item of items) {
|
|
21
|
+
const overflowed = overflowedIds.has(item.id);
|
|
22
|
+
const triggerGroupKey = triggerGroupByItemId.get(item.id);
|
|
23
|
+
const survives = !overflowed || triggerGroupKey != null;
|
|
24
|
+
if (overflowed && !triggerGroupKey) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
slots.push({
|
|
28
|
+
item,
|
|
29
|
+
overflowed,
|
|
30
|
+
showLeadingDecorations: item.leadingDecorations.length > 0 && hasSurvivingPredecessor && survives,
|
|
31
|
+
showTrailingDecorations: !overflowed && item.trailingDecorations.length > 0,
|
|
32
|
+
triggerGroupKey
|
|
33
|
+
});
|
|
34
|
+
if (survives) {
|
|
35
|
+
hasSurvivingPredecessor = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return slots;
|
|
39
|
+
}
|
|
40
|
+
function flattenToolbarChildren(children) {
|
|
41
|
+
const flattened = [];
|
|
42
|
+
react.Children.forEach(children, (child) => {
|
|
43
|
+
if (child == null || typeof child === "boolean") {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (react.isValidElement(child) && child.type === react.Fragment) {
|
|
47
|
+
flattened.push(...flattenToolbarChildren(child.props.children));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
flattened.push(child);
|
|
51
|
+
});
|
|
52
|
+
return flattened;
|
|
53
|
+
}
|
|
54
|
+
function isToolbarContentNextElement(child) {
|
|
55
|
+
return react.isValidElement(child) && child.type === ToolbarContentNext.ToolbarContentNext;
|
|
56
|
+
}
|
|
57
|
+
function isTooltrayElement(child) {
|
|
58
|
+
return react.isValidElement(child) && child.type === TooltrayNext.TooltrayNext;
|
|
59
|
+
}
|
|
60
|
+
function isDividerElement(child) {
|
|
61
|
+
return react.isValidElement(child) && child.type === core.Divider;
|
|
62
|
+
}
|
|
63
|
+
function buildItemId(contentKey, element, order) {
|
|
64
|
+
const elementKey = element.key != null ? String(element.key) : `tray-${order}`;
|
|
65
|
+
return `${contentKey}-${elementKey}-${order}`;
|
|
66
|
+
}
|
|
67
|
+
function buildOverflowGroupKey(contentKey, overflowGroup) {
|
|
68
|
+
return overflowGroup === "shared" ? "shared" : `${contentKey}:${overflowGroup}`;
|
|
69
|
+
}
|
|
70
|
+
function normalizeContentItems(children, contentKey) {
|
|
71
|
+
var _a;
|
|
72
|
+
const flattenedChildren = flattenToolbarChildren(children);
|
|
73
|
+
const items = [];
|
|
74
|
+
let pendingLeadingDecorations = [];
|
|
75
|
+
for (const child of flattenedChildren) {
|
|
76
|
+
if (isDividerElement(child)) {
|
|
77
|
+
pendingLeadingDecorations.push(child);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (!isTooltrayElement(child)) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const {
|
|
84
|
+
align = "start",
|
|
85
|
+
overflowGroup = "shared",
|
|
86
|
+
overflowLabel,
|
|
87
|
+
overflowMode = "independent",
|
|
88
|
+
overflowPriority = 0
|
|
89
|
+
} = child.props;
|
|
90
|
+
const order = items.length;
|
|
91
|
+
items.push({
|
|
92
|
+
align,
|
|
93
|
+
element: child,
|
|
94
|
+
id: buildItemId(contentKey, child, order),
|
|
95
|
+
leadingDecorations: pendingLeadingDecorations,
|
|
96
|
+
order,
|
|
97
|
+
overflowGroup,
|
|
98
|
+
overflowGroupKey: buildOverflowGroupKey(contentKey, overflowGroup),
|
|
99
|
+
overflowLabel,
|
|
100
|
+
overflowMode,
|
|
101
|
+
overflowPriority,
|
|
102
|
+
contentKey,
|
|
103
|
+
trailingDecorations: []
|
|
104
|
+
});
|
|
105
|
+
pendingLeadingDecorations = [];
|
|
106
|
+
}
|
|
107
|
+
if (pendingLeadingDecorations.length > 0 && items.length > 0) {
|
|
108
|
+
(_a = items[items.length - 1]) == null ? void 0 : _a.trailingDecorations.push(
|
|
109
|
+
...pendingLeadingDecorations
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
return items;
|
|
113
|
+
}
|
|
114
|
+
function normalizeExplicitContent(children) {
|
|
115
|
+
const content = [];
|
|
116
|
+
for (const [index, child] of children.entries()) {
|
|
117
|
+
if (!isToolbarContentNextElement(child)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const {
|
|
121
|
+
children: contentChildren,
|
|
122
|
+
position,
|
|
123
|
+
...contentProps
|
|
124
|
+
} = child.props;
|
|
125
|
+
const contentKey = child.key != null ? String(child.key) : `${position}-content-${index}`;
|
|
126
|
+
const items = normalizeContentItems(contentChildren, contentKey);
|
|
127
|
+
if (items == null) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
content.push({
|
|
131
|
+
implicit: false,
|
|
132
|
+
items,
|
|
133
|
+
key: contentKey,
|
|
134
|
+
position,
|
|
135
|
+
props: contentProps,
|
|
136
|
+
ref: core.getRefFromChildren(child)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return content;
|
|
140
|
+
}
|
|
141
|
+
function normalizeFlatChildren(children) {
|
|
142
|
+
const buckets = {
|
|
143
|
+
start: [],
|
|
144
|
+
center: [],
|
|
145
|
+
end: []
|
|
146
|
+
};
|
|
147
|
+
let currentPosition = "start";
|
|
148
|
+
for (const child of children) {
|
|
149
|
+
if (isTooltrayElement(child)) {
|
|
150
|
+
currentPosition = child.props.align ?? "start";
|
|
151
|
+
buckets[currentPosition].push(child);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (isDividerElement(child)) {
|
|
155
|
+
buckets[currentPosition].push(child);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return Object.keys(buckets).reduce((content, position) => {
|
|
161
|
+
const contentKey = `${position}-implicit`;
|
|
162
|
+
const contentItems = normalizeContentItems(buckets[position], contentKey);
|
|
163
|
+
if (contentItems == null || contentItems.length === 0) {
|
|
164
|
+
return content;
|
|
165
|
+
}
|
|
166
|
+
content.push({
|
|
167
|
+
implicit: true,
|
|
168
|
+
items: contentItems,
|
|
169
|
+
key: contentKey,
|
|
170
|
+
position,
|
|
171
|
+
props: {},
|
|
172
|
+
ref: null
|
|
173
|
+
});
|
|
174
|
+
return content;
|
|
175
|
+
}, []);
|
|
176
|
+
}
|
|
177
|
+
function normalizeToolbarChildren(children) {
|
|
178
|
+
const flattenedChildren = flattenToolbarChildren(children);
|
|
179
|
+
const hasContentChildren = flattenedChildren.some(
|
|
180
|
+
isToolbarContentNextElement
|
|
181
|
+
);
|
|
182
|
+
const hasOnlyContent = hasContentChildren && flattenedChildren.every(isToolbarContentNextElement);
|
|
183
|
+
const hasOnlyFlatChildren = flattenedChildren.every(
|
|
184
|
+
(child) => isTooltrayElement(child) || isDividerElement(child)
|
|
185
|
+
);
|
|
186
|
+
if (hasOnlyContent) {
|
|
187
|
+
const content = normalizeExplicitContent(flattenedChildren);
|
|
188
|
+
if (content == null) {
|
|
189
|
+
return { mode: "invalid", content: [] };
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
mode: "explicit",
|
|
193
|
+
content
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (hasOnlyFlatChildren) {
|
|
197
|
+
const content = normalizeFlatChildren(flattenedChildren);
|
|
198
|
+
if (content == null) {
|
|
199
|
+
return { mode: "invalid", content: [] };
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
mode: "flat",
|
|
203
|
+
content
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
mode: "invalid",
|
|
208
|
+
content: []
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
exports.buildContentOverflowRenderSlots = buildContentOverflowRenderSlots;
|
|
213
|
+
exports.flattenToolbarChildren = flattenToolbarChildren;
|
|
214
|
+
exports.normalizeToolbarChildren = normalizeToolbarChildren;
|
|
215
|
+
//# sourceMappingURL=toolbarNextUtils.js.map
|