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