@salt-ds/lab 1.0.0-alpha.92 → 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 +116 -0
- package/css/salt-lab.css +166 -249
- package/dist-cjs/index.js +6 -24
- 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 -12
- 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 -2
- 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/side-panel/SidePanel.css.js +0 -6
- package/dist-cjs/side-panel/SidePanel.css.js.map +0 -1
- package/dist-cjs/side-panel/SidePanel.js +0 -197
- package/dist-cjs/side-panel/SidePanel.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelCloseButton.js +0 -38
- package/dist-cjs/side-panel/SidePanelCloseButton.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelContent.css.js +0 -6
- package/dist-cjs/side-panel/SidePanelContent.css.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelContent.js +0 -66
- package/dist-cjs/side-panel/SidePanelContent.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelHeader.css.js +0 -6
- package/dist-cjs/side-panel/SidePanelHeader.css.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelHeader.js +0 -26
- package/dist-cjs/side-panel/SidePanelHeader.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelProvider.js +0 -78
- package/dist-cjs/side-panel/SidePanelProvider.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelTitle.css.js +0 -6
- package/dist-cjs/side-panel/SidePanelTitle.css.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelTitle.js +0 -48
- package/dist-cjs/side-panel/SidePanelTitle.js.map +0 -1
- package/dist-cjs/side-panel/SidePanelTrigger.js +0 -37
- package/dist-cjs/side-panel/SidePanelTrigger.js.map +0 -1
- package/dist-cjs/side-panel/internal/SidePanelContext.js +0 -32
- package/dist-cjs/side-panel/internal/SidePanelContext.js.map +0 -1
- package/dist-cjs/side-panel/internal/useIsScrollable.js +0 -50
- package/dist-cjs/side-panel/internal/useIsScrollable.js.map +0 -1
- package/dist-cjs/side-panel/internal/useSidePanelTabOrder.js +0 -214
- package/dist-cjs/side-panel/internal/useSidePanelTabOrder.js.map +0 -1
- package/dist-cjs/side-panel/useSidePanel.js +0 -43
- package/dist-cjs/side-panel/useSidePanel.js.map +0 -1
- 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 -300
- 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/side-panel/SidePanel.css.js +0 -4
- package/dist-es/side-panel/SidePanel.css.js.map +0 -1
- package/dist-es/side-panel/SidePanel.js +0 -195
- package/dist-es/side-panel/SidePanel.js.map +0 -1
- package/dist-es/side-panel/SidePanelCloseButton.js +0 -36
- package/dist-es/side-panel/SidePanelCloseButton.js.map +0 -1
- package/dist-es/side-panel/SidePanelContent.css.js +0 -4
- package/dist-es/side-panel/SidePanelContent.css.js.map +0 -1
- package/dist-es/side-panel/SidePanelContent.js +0 -64
- package/dist-es/side-panel/SidePanelContent.js.map +0 -1
- package/dist-es/side-panel/SidePanelHeader.css.js +0 -4
- package/dist-es/side-panel/SidePanelHeader.css.js.map +0 -1
- package/dist-es/side-panel/SidePanelHeader.js +0 -24
- package/dist-es/side-panel/SidePanelHeader.js.map +0 -1
- package/dist-es/side-panel/SidePanelProvider.js +0 -76
- package/dist-es/side-panel/SidePanelProvider.js.map +0 -1
- package/dist-es/side-panel/SidePanelTitle.css.js +0 -4
- package/dist-es/side-panel/SidePanelTitle.css.js.map +0 -1
- package/dist-es/side-panel/SidePanelTitle.js +0 -46
- package/dist-es/side-panel/SidePanelTitle.js.map +0 -1
- package/dist-es/side-panel/SidePanelTrigger.js +0 -35
- package/dist-es/side-panel/SidePanelTrigger.js.map +0 -1
- package/dist-es/side-panel/internal/SidePanelContext.js +0 -29
- package/dist-es/side-panel/internal/SidePanelContext.js.map +0 -1
- package/dist-es/side-panel/internal/useIsScrollable.js +0 -48
- package/dist-es/side-panel/internal/useIsScrollable.js.map +0 -1
- package/dist-es/side-panel/internal/useSidePanelTabOrder.js +0 -212
- package/dist-es/side-panel/internal/useSidePanelTabOrder.js.map +0 -1
- package/dist-es/side-panel/useSidePanel.js +0 -41
- package/dist-es/side-panel/useSidePanel.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 -298
- 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/side-panel/SidePanel.d.ts +0 -26
- package/dist-types/side-panel/SidePanelCloseButton.d.ts +0 -2
- package/dist-types/side-panel/SidePanelContent.d.ts +0 -5
- package/dist-types/side-panel/SidePanelHeader.d.ts +0 -5
- package/dist-types/side-panel/SidePanelProvider.d.ts +0 -20
- package/dist-types/side-panel/SidePanelTitle.d.ts +0 -3
- package/dist-types/side-panel/SidePanelTrigger.d.ts +0 -3
- package/dist-types/side-panel/index.d.ts +0 -8
- package/dist-types/side-panel/internal/SidePanelContext.d.ts +0 -52
- package/dist-types/side-panel/internal/index.d.ts +0 -3
- package/dist-types/side-panel/internal/useIsScrollable.d.ts +0 -2
- package/dist-types/side-panel/internal/useSidePanelTabOrder.d.ts +0 -7
- package/dist-types/side-panel/useSidePanel.d.ts +0 -58
- 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,332 @@
|
|
|
1
|
+
import { useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { getToolbarNextFocusMemory, getToolbarNextScopeFocusableElements, TOOLBAR_NEXT_ITEM_ATTR, TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR, TOOLBAR_NEXT_GROUP_KEY_ATTR, resolveToolbarNextFocusTarget, focusToolbarNextElement, getClosestToolbarNextScopeRoot, isToolbarNextFocusFromPointerTarget, TOOLBAR_NEXT_SCOPE_ROOT_ATTR, shouldToolbarNextPreserveNativeTab, getToolbarNextTabMoveTarget, getToolbarNextDirectionalMoveTarget } from './toolbarNextKeyboardUtils.js';
|
|
3
|
+
|
|
4
|
+
function useToolbarNextKeyboardNavigation({
|
|
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 restoreFrameRef = useRef(null);
|
|
14
|
+
const shouldPreserveItemMemoryForTrigger = useCallback(
|
|
15
|
+
(groupKey) => {
|
|
16
|
+
const rememberedFocus = rememberedFocusRef.current;
|
|
17
|
+
if ((rememberedFocus == null ? void 0 : rememberedFocus.type) !== "item") {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const item = items.find((entry) => entry.id === rememberedFocus.itemId);
|
|
21
|
+
return (item == null ? void 0 : item.overflowGroupKey) === groupKey && (overflowedIds == null || overflowedIds.has(item.id));
|
|
22
|
+
},
|
|
23
|
+
[items, overflowedIds]
|
|
24
|
+
);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
return () => {
|
|
27
|
+
var _a;
|
|
28
|
+
const frame = restoreFrameRef.current;
|
|
29
|
+
const win = (_a = scopeRef.current) == null ? void 0 : _a.ownerDocument.defaultView;
|
|
30
|
+
if (frame != null && win) {
|
|
31
|
+
win.cancelAnimationFrame(frame);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}, [scopeRef]);
|
|
35
|
+
const rememberTarget = useCallback(
|
|
36
|
+
(target) => {
|
|
37
|
+
const scopeRoot = scopeRef.current;
|
|
38
|
+
if (!scopeRoot) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const focusMemory = getToolbarNextFocusMemory(scopeRoot, target, {
|
|
42
|
+
includeTabIndexMinusOne
|
|
43
|
+
});
|
|
44
|
+
if (focusMemory) {
|
|
45
|
+
if (focusMemory.type === "overflow-trigger" && shouldPreserveItemMemoryForTrigger(focusMemory.groupKey)) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
rememberedFocusRef.current = focusMemory;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
[includeTabIndexMinusOne, scopeRef, shouldPreserveItemMemoryForTrigger]
|
|
52
|
+
);
|
|
53
|
+
const rememberItemFocus = useCallback(
|
|
54
|
+
(itemId, controlIndex) => {
|
|
55
|
+
var _a;
|
|
56
|
+
const scopeRoot = scopeRef.current;
|
|
57
|
+
if (!scopeRoot) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const focusables = getToolbarNextScopeFocusableElements(scopeRoot, {
|
|
61
|
+
includeTabIndexMinusOne
|
|
62
|
+
});
|
|
63
|
+
const itemFocusables = focusables.filter((element) => {
|
|
64
|
+
var _a2;
|
|
65
|
+
return ((_a2 = element.closest(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)) == null ? void 0 : _a2.getAttribute(TOOLBAR_NEXT_ITEM_ATTR)) === itemId;
|
|
66
|
+
});
|
|
67
|
+
const item = items.find((entry) => entry.id === itemId);
|
|
68
|
+
const visibleItemTarget = itemFocusables[Math.min(controlIndex, itemFocusables.length - 1)] ?? itemFocusables[0];
|
|
69
|
+
const overflowTriggerTarget = item ? focusables.find((element) => {
|
|
70
|
+
const trigger = element.closest(
|
|
71
|
+
`[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`
|
|
72
|
+
);
|
|
73
|
+
return (trigger == null ? void 0 : trigger.getAttribute(TOOLBAR_NEXT_GROUP_KEY_ATTR)) === item.overflowGroupKey;
|
|
74
|
+
}) : void 0;
|
|
75
|
+
const scopeIndex = Math.max(
|
|
76
|
+
focusables.indexOf(visibleItemTarget ?? overflowTriggerTarget),
|
|
77
|
+
((_a = rememberedFocusRef.current) == null ? void 0 : _a.scopeIndex) ?? 0
|
|
78
|
+
);
|
|
79
|
+
const focusMemory = {
|
|
80
|
+
controlIndex,
|
|
81
|
+
itemId,
|
|
82
|
+
scopeIndex,
|
|
83
|
+
type: "item"
|
|
84
|
+
};
|
|
85
|
+
rememberedFocusRef.current = focusMemory;
|
|
86
|
+
},
|
|
87
|
+
[includeTabIndexMinusOne, items, scopeRef]
|
|
88
|
+
);
|
|
89
|
+
const focusEntryTarget = useCallback(() => {
|
|
90
|
+
const scopeRoot = scopeRef.current;
|
|
91
|
+
if (!scopeRoot) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const target = resolveToolbarNextFocusTarget(
|
|
95
|
+
scopeRoot,
|
|
96
|
+
rememberedFocusRef.current,
|
|
97
|
+
{
|
|
98
|
+
items,
|
|
99
|
+
includeTabIndexMinusOne,
|
|
100
|
+
overflowedIds
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
if (!target) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
queueMicrotask(() => {
|
|
107
|
+
focusToolbarNextElement(target);
|
|
108
|
+
});
|
|
109
|
+
}, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
|
|
110
|
+
const restoreEntryFocus = useCallback((target) => {
|
|
111
|
+
restoringEntryFocusRef.current = true;
|
|
112
|
+
const restoreFocus = () => {
|
|
113
|
+
restoreFrameRef.current = null;
|
|
114
|
+
focusToolbarNextElement(target);
|
|
115
|
+
};
|
|
116
|
+
const win = target.ownerDocument.defaultView;
|
|
117
|
+
if (win == null ? void 0 : win.requestAnimationFrame) {
|
|
118
|
+
const currentFrame = restoreFrameRef.current;
|
|
119
|
+
if (currentFrame != null) {
|
|
120
|
+
win.cancelAnimationFrame(currentFrame);
|
|
121
|
+
}
|
|
122
|
+
restoreFrameRef.current = win.requestAnimationFrame(restoreFocus);
|
|
123
|
+
} else {
|
|
124
|
+
queueMicrotask(restoreFocus);
|
|
125
|
+
}
|
|
126
|
+
}, []);
|
|
127
|
+
const handleScopeFocus = useCallback(
|
|
128
|
+
(event) => {
|
|
129
|
+
var _a;
|
|
130
|
+
const scopeRoot = scopeRef.current;
|
|
131
|
+
const target = event.target;
|
|
132
|
+
if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarNextScopeRoot(target) !== scopeRoot) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (restoringEntryFocusRef.current) {
|
|
136
|
+
restoringEntryFocusRef.current = false;
|
|
137
|
+
pointerDownTargetRef.current = null;
|
|
138
|
+
rememberTarget(target);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const relatedTarget = event.relatedTarget;
|
|
142
|
+
const enteringFromOutside = !(relatedTarget instanceof HTMLElement) || getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;
|
|
143
|
+
if (!enteringFromOutside) {
|
|
144
|
+
pointerDownTargetRef.current = null;
|
|
145
|
+
rememberTarget(target);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const targetMemory = getToolbarNextFocusMemory(scopeRoot, target, {
|
|
149
|
+
includeTabIndexMinusOne
|
|
150
|
+
});
|
|
151
|
+
const pointerDownTarget = pointerDownTargetRef.current;
|
|
152
|
+
pointerDownTargetRef.current = null;
|
|
153
|
+
const focusFromPointerTarget = isToolbarNextFocusFromPointerTarget(
|
|
154
|
+
target,
|
|
155
|
+
pointerDownTarget
|
|
156
|
+
);
|
|
157
|
+
if (focusFromPointerTarget) {
|
|
158
|
+
rememberTarget(target);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if ((targetMemory == null ? void 0 : targetMemory.type) === "overflow-trigger") {
|
|
162
|
+
const shouldPreserve = shouldPreserveItemMemoryForTrigger(
|
|
163
|
+
targetMemory.groupKey
|
|
164
|
+
);
|
|
165
|
+
if (shouldPreserve) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (((_a = rememberedFocusRef.current) == null ? void 0 : _a.type) === "item") {
|
|
169
|
+
const restoreTarget2 = resolveToolbarNextFocusTarget(
|
|
170
|
+
scopeRoot,
|
|
171
|
+
rememberedFocusRef.current,
|
|
172
|
+
{
|
|
173
|
+
items,
|
|
174
|
+
includeTabIndexMinusOne,
|
|
175
|
+
overflowedIds
|
|
176
|
+
}
|
|
177
|
+
);
|
|
178
|
+
if (restoreTarget2 && restoreTarget2 !== target) {
|
|
179
|
+
restoreEntryFocus(restoreTarget2);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
rememberedFocusRef.current = targetMemory;
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const restoreTarget = resolveToolbarNextFocusTarget(
|
|
187
|
+
scopeRoot,
|
|
188
|
+
rememberedFocusRef.current,
|
|
189
|
+
{
|
|
190
|
+
items,
|
|
191
|
+
includeTabIndexMinusOne,
|
|
192
|
+
overflowedIds
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
if (restoreTarget && restoreTarget !== target) {
|
|
196
|
+
restoreEntryFocus(restoreTarget);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
rememberTarget(target);
|
|
200
|
+
},
|
|
201
|
+
[
|
|
202
|
+
includeTabIndexMinusOne,
|
|
203
|
+
items,
|
|
204
|
+
overflowedIds,
|
|
205
|
+
rememberTarget,
|
|
206
|
+
restoreEntryFocus,
|
|
207
|
+
scopeRef,
|
|
208
|
+
shouldPreserveItemMemoryForTrigger
|
|
209
|
+
]
|
|
210
|
+
);
|
|
211
|
+
const handleFocusCapture = useCallback(
|
|
212
|
+
(event) => {
|
|
213
|
+
handleScopeFocus(event);
|
|
214
|
+
},
|
|
215
|
+
[handleScopeFocus]
|
|
216
|
+
);
|
|
217
|
+
const handleScopePointerDown = useCallback(
|
|
218
|
+
(event) => {
|
|
219
|
+
const scopeRoot = scopeRef.current;
|
|
220
|
+
const target = event.target;
|
|
221
|
+
if (!scopeRoot || !(target instanceof Element) || getClosestToolbarNextScopeRoot(target) !== scopeRoot) {
|
|
222
|
+
pointerDownTargetRef.current = null;
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
pointerDownTargetRef.current = target;
|
|
226
|
+
},
|
|
227
|
+
[scopeRef]
|
|
228
|
+
);
|
|
229
|
+
const handlePointerDownCapture = useCallback(
|
|
230
|
+
(event) => {
|
|
231
|
+
handleScopePointerDown(event);
|
|
232
|
+
},
|
|
233
|
+
[handleScopePointerDown]
|
|
234
|
+
);
|
|
235
|
+
const handleScopeBlur = useCallback(
|
|
236
|
+
(event) => {
|
|
237
|
+
const scopeRoot = scopeRef.current;
|
|
238
|
+
const target = event.target;
|
|
239
|
+
if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarNextScopeRoot(target) !== scopeRoot) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const relatedTarget = event.relatedTarget;
|
|
243
|
+
const leavingScope = !(relatedTarget instanceof HTMLElement) || getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;
|
|
244
|
+
if (leavingScope) {
|
|
245
|
+
rememberTarget(target);
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
[rememberTarget, scopeRef]
|
|
249
|
+
);
|
|
250
|
+
const handleBlurCapture = useCallback(
|
|
251
|
+
(event) => {
|
|
252
|
+
handleScopeBlur(event);
|
|
253
|
+
},
|
|
254
|
+
[handleScopeBlur]
|
|
255
|
+
);
|
|
256
|
+
const handleScopeKeyDown = useCallback(
|
|
257
|
+
(event) => {
|
|
258
|
+
const scopeRoot = scopeRef.current;
|
|
259
|
+
const target = event.target;
|
|
260
|
+
if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarNextScopeRoot(target) !== scopeRoot || event.altKey || event.ctrlKey || event.metaKey) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (event.key === "Tab" && scopeRoot.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR) === "main" && !shouldToolbarNextPreserveNativeTab(target)) {
|
|
264
|
+
const moveTarget2 = getToolbarNextTabMoveTarget(
|
|
265
|
+
scopeRoot,
|
|
266
|
+
event.shiftKey
|
|
267
|
+
);
|
|
268
|
+
event.preventDefault();
|
|
269
|
+
event.stopPropagation();
|
|
270
|
+
rememberTarget(target);
|
|
271
|
+
queueMicrotask(() => {
|
|
272
|
+
if (moveTarget2 == null ? void 0 : moveTarget2.isConnected) {
|
|
273
|
+
focusToolbarNextElement(moveTarget2);
|
|
274
|
+
} else {
|
|
275
|
+
target.blur();
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const moveTarget = getToolbarNextDirectionalMoveTarget(
|
|
281
|
+
scopeRoot,
|
|
282
|
+
target,
|
|
283
|
+
event.key,
|
|
284
|
+
{ includeTabIndexMinusOne }
|
|
285
|
+
);
|
|
286
|
+
if (!moveTarget) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
event.preventDefault();
|
|
290
|
+
event.stopPropagation();
|
|
291
|
+
rememberTarget(moveTarget);
|
|
292
|
+
focusToolbarNextElement(moveTarget);
|
|
293
|
+
},
|
|
294
|
+
[includeTabIndexMinusOne, rememberTarget, scopeRef]
|
|
295
|
+
);
|
|
296
|
+
const handleKeyDownCapture = useCallback(
|
|
297
|
+
(event) => {
|
|
298
|
+
handleScopeKeyDown(event);
|
|
299
|
+
},
|
|
300
|
+
[handleScopeKeyDown]
|
|
301
|
+
);
|
|
302
|
+
const getEntryFocusable = useCallback(() => {
|
|
303
|
+
const scopeRoot = scopeRef.current;
|
|
304
|
+
if (!scopeRoot) {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
return resolveToolbarNextFocusTarget(scopeRoot, rememberedFocusRef.current, {
|
|
308
|
+
items,
|
|
309
|
+
includeTabIndexMinusOne,
|
|
310
|
+
overflowedIds
|
|
311
|
+
}) ?? getToolbarNextScopeFocusableElements(scopeRoot, {
|
|
312
|
+
includeTabIndexMinusOne
|
|
313
|
+
})[0] ?? null;
|
|
314
|
+
}, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
|
|
315
|
+
return {
|
|
316
|
+
focusEntryTarget,
|
|
317
|
+
getEntryFocusable,
|
|
318
|
+
handleBlurCapture,
|
|
319
|
+
handleFocusCapture,
|
|
320
|
+
handleKeyDownCapture,
|
|
321
|
+
handlePointerDownCapture,
|
|
322
|
+
handleScopeBlur,
|
|
323
|
+
handleScopeFocus,
|
|
324
|
+
handleScopeKeyDown,
|
|
325
|
+
handleScopePointerDown,
|
|
326
|
+
rememberItemFocus,
|
|
327
|
+
rememberedFocusRef
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export { useToolbarNextKeyboardNavigation };
|
|
332
|
+
//# sourceMappingURL=useToolbarNextKeyboardNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToolbarNextKeyboardNavigation.js","sources":["../src/toolbar-next/useToolbarNextKeyboardNavigation.ts"],"sourcesContent":["import {\n type FocusEventHandler,\n type KeyboardEventHandler,\n type PointerEventHandler,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport {\n focusToolbarNextElement,\n getClosestToolbarNextScopeRoot,\n getToolbarNextDirectionalMoveTarget,\n getToolbarNextFocusMemory,\n getToolbarNextScopeFocusableElements,\n getToolbarNextTabMoveTarget,\n isToolbarNextFocusFromPointerTarget,\n resolveToolbarNextFocusTarget,\n shouldToolbarNextPreserveNativeTab,\n TOOLBAR_NEXT_GROUP_KEY_ATTR,\n TOOLBAR_NEXT_ITEM_ATTR,\n TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_NEXT_SCOPE_ROOT_ATTR,\n type ToolbarNextFocusMemory,\n} from \"./toolbarNextKeyboardUtils\";\nimport type { ToolbarNextOverflowItem } from \"./toolbarNextUtils\";\n\ninterface UseToolbarNextKeyboardNavigationProps {\n includeTabIndexMinusOne?: boolean;\n items?: ToolbarNextOverflowItem[];\n overflowedIds?: Set<string>;\n scopeRef: RefObject<HTMLElement | null>;\n}\n\ninterface ToolbarNextFocusEvent {\n relatedTarget: EventTarget | null;\n target: EventTarget | null;\n}\n\ninterface ToolbarNextKeyDownEvent {\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 ToolbarNextPointerEvent {\n target: EventTarget | null;\n}\n\nexport function useToolbarNextKeyboardNavigation({\n includeTabIndexMinusOne = false,\n items = [],\n overflowedIds,\n scopeRef,\n}: UseToolbarNextKeyboardNavigationProps) {\n const rememberedFocusRef = useRef<ToolbarNextFocusMemory | null>(null);\n const pointerDownTargetRef = useRef<EventTarget | null>(null);\n const restoringEntryFocusRef = useRef(false);\n const restoreFrameRef = useRef<number | null>(null);\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 useEffect(() => {\n return () => {\n const frame = restoreFrameRef.current;\n const win = scopeRef.current?.ownerDocument.defaultView;\n\n if (frame != null && win) {\n win.cancelAnimationFrame(frame);\n }\n };\n }, [scopeRef]);\n\n const rememberTarget = useCallback(\n (target: HTMLElement) => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const focusMemory = getToolbarNextFocusMemory(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 = getToolbarNextScopeFocusableElements(scopeRoot, {\n includeTabIndexMinusOne,\n });\n const itemFocusables = focusables.filter((element) => {\n return (\n element\n .closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_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_NEXT_OVERFLOW_TRIGGER_ATTR}]`,\n );\n\n return (\n trigger?.getAttribute(TOOLBAR_NEXT_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: ToolbarNextFocusMemory = {\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 = resolveToolbarNextFocusTarget(\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 focusToolbarNextElement(target);\n });\n }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);\n\n const restoreEntryFocus = useCallback((target: HTMLElement) => {\n restoringEntryFocusRef.current = true;\n\n const restoreFocus = () => {\n restoreFrameRef.current = null;\n\n focusToolbarNextElement(target);\n };\n const win = target.ownerDocument.defaultView;\n\n if (win?.requestAnimationFrame) {\n const currentFrame = restoreFrameRef.current;\n if (currentFrame != null) {\n win.cancelAnimationFrame(currentFrame);\n }\n\n restoreFrameRef.current = win.requestAnimationFrame(restoreFocus);\n } else {\n queueMicrotask(restoreFocus);\n }\n }, []);\n\n const handleScopeFocus = useCallback(\n (event: ToolbarNextFocusEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(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 getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;\n\n if (!enteringFromOutside) {\n pointerDownTargetRef.current = null;\n rememberTarget(target);\n return;\n }\n\n const targetMemory = getToolbarNextFocusMemory(scopeRoot, target, {\n includeTabIndexMinusOne,\n });\n const pointerDownTarget = pointerDownTargetRef.current;\n pointerDownTargetRef.current = null;\n const focusFromPointerTarget = isToolbarNextFocusFromPointerTarget(\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 = resolveToolbarNextFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (restoreTarget && restoreTarget !== target) {\n restoreEntryFocus(restoreTarget);\n return;\n }\n }\n\n rememberedFocusRef.current = targetMemory;\n return;\n }\n\n const restoreTarget = resolveToolbarNextFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (restoreTarget && restoreTarget !== target) {\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: ToolbarNextPointerEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof Element) ||\n getClosestToolbarNextScopeRoot(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: ToolbarNextFocusEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(target) !== scopeRoot\n ) {\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n const leavingScope =\n !(relatedTarget instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(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: ToolbarNextKeyDownEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(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_NEXT_SCOPE_ROOT_ATTR) === \"main\" &&\n !shouldToolbarNextPreserveNativeTab(target)\n ) {\n const moveTarget = getToolbarNextTabMoveTarget(\n scopeRoot,\n event.shiftKey,\n );\n\n event.preventDefault();\n event.stopPropagation();\n\n rememberTarget(target);\n queueMicrotask(() => {\n if (moveTarget?.isConnected) {\n focusToolbarNextElement(moveTarget);\n } else {\n target.blur();\n }\n });\n return;\n }\n\n const moveTarget = getToolbarNextDirectionalMoveTarget(\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 focusToolbarNextElement(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 resolveToolbarNextFocusTarget(scopeRoot, rememberedFocusRef.current, {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n }) ??\n getToolbarNextScopeFocusableElements(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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"}
|