@salt-ds/lab 1.0.0-alpha.88 → 1.0.0-alpha.89
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 +14 -0
- package/css/salt-lab.css +53 -25
- package/dist-cjs/list-deprecated/ListStateContext.js +1 -1
- package/dist-cjs/list-deprecated/ListStateContext.js.map +1 -1
- package/dist-cjs/tabs-next/TabBar.css.js +1 -1
- package/dist-cjs/tabs-next/TabBar.js +1 -1
- package/dist-cjs/tabs-next/TabBar.js.map +1 -1
- package/dist-cjs/tabs-next/TabListLayoutContext.js +13 -0
- package/dist-cjs/tabs-next/TabListLayoutContext.js.map +1 -0
- package/dist-cjs/tabs-next/TabListNext.css.js +1 -1
- package/dist-cjs/tabs-next/TabListNext.js +179 -33
- package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
- package/dist-cjs/tabs-next/TabNext.js +111 -7
- package/dist-cjs/tabs-next/TabNext.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextAction.js +25 -2
- package/dist-cjs/tabs-next/TabNextAction.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextPanel.js +31 -16
- package/dist-cjs/tabs-next/TabNextPanel.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextTrigger.js +110 -9
- package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
- package/dist-cjs/tabs-next/TabOverflowList.css.js +1 -1
- package/dist-cjs/tabs-next/TabOverflowList.js +168 -64
- package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
- package/dist-cjs/tabs-next/TabSlot.js +30 -0
- package/dist-cjs/tabs-next/TabSlot.js.map +1 -0
- package/dist-cjs/tabs-next/TabSlotRegistryContext.js +16 -0
- package/dist-cjs/tabs-next/TabSlotRegistryContext.js.map +1 -0
- package/dist-cjs/tabs-next/TabsNext.css.js +6 -0
- package/dist-cjs/tabs-next/TabsNext.css.js.map +1 -0
- package/dist-cjs/tabs-next/TabsNext.js +113 -47
- package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
- package/dist-cjs/tabs-next/TabsNextContext.js +17 -3
- package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
- package/dist-cjs/tabs-next/domUtils.js +13 -0
- package/dist-cjs/tabs-next/domUtils.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/overflowMath.js +86 -0
- package/dist-cjs/tabs-next/hooks/overflowMath.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useCollection.js +147 -41
- package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useFocusWithRetry.js +64 -0
- package/dist-cjs/tabs-next/hooks/useFocusWithRetry.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useOverflow.js +240 -156
- package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useOverflowLayoutState.js +99 -0
- package/dist-cjs/tabs-next/hooks/useOverflowLayoutState.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useOverflowSelectionState.js +60 -0
- package/dist-cjs/tabs-next/hooks/useOverflowSelectionState.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useRenderedTabWidth.js +92 -0
- package/dist-cjs/tabs-next/hooks/useRenderedTabWidth.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useRenderedTabsRegistry.js +200 -0
- package/dist-cjs/tabs-next/hooks/useRenderedTabsRegistry.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useTabListRecovery.js +76 -0
- package/dist-cjs/tabs-next/hooks/useTabListRecovery.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useTabRemovalHandler.js +165 -0
- package/dist-cjs/tabs-next/hooks/useTabRemovalHandler.js.map +1 -0
- package/dist-cjs/tabs-next/hooks/useTabSelectionFocus.js +80 -0
- package/dist-cjs/tabs-next/hooks/useTabSelectionFocus.js.map +1 -0
- package/dist-cjs/tabs-next/widthMeasurement.js +42 -0
- package/dist-cjs/tabs-next/widthMeasurement.js.map +1 -0
- package/dist-cjs/tree/Tree.css.js +1 -1
- package/dist-cjs/tree/TreeNode.css.js +1 -1
- package/dist-cjs/tree/TreeNode.js +1 -1
- package/dist-cjs/tree/TreeNode.js.map +1 -1
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +1 -1
- package/dist-cjs/tree/TreeNodeTrigger.css.js +1 -1
- package/dist-cjs/tree/TreeNodeTrigger.js +2 -2
- package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -1
- package/dist-cjs/utils/useEventCallback.js +5 -5
- package/dist-cjs/utils/useEventCallback.js.map +1 -1
- package/dist-es/list-deprecated/ListStateContext.js +1 -1
- package/dist-es/list-deprecated/ListStateContext.js.map +1 -1
- package/dist-es/tabs-next/TabBar.css.js +1 -1
- package/dist-es/tabs-next/TabBar.js +1 -1
- package/dist-es/tabs-next/TabBar.js.map +1 -1
- package/dist-es/tabs-next/TabListLayoutContext.js +10 -0
- package/dist-es/tabs-next/TabListLayoutContext.js.map +1 -0
- package/dist-es/tabs-next/TabListNext.css.js +1 -1
- package/dist-es/tabs-next/TabListNext.js +182 -36
- package/dist-es/tabs-next/TabListNext.js.map +1 -1
- package/dist-es/tabs-next/TabNext.js +113 -9
- package/dist-es/tabs-next/TabNext.js.map +1 -1
- package/dist-es/tabs-next/TabNextAction.js +25 -2
- package/dist-es/tabs-next/TabNextAction.js.map +1 -1
- package/dist-es/tabs-next/TabNextPanel.js +31 -16
- package/dist-es/tabs-next/TabNextPanel.js.map +1 -1
- package/dist-es/tabs-next/TabNextTrigger.js +110 -9
- package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
- package/dist-es/tabs-next/TabOverflowList.css.js +1 -1
- package/dist-es/tabs-next/TabOverflowList.js +172 -68
- package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
- package/dist-es/tabs-next/TabSlot.js +28 -0
- package/dist-es/tabs-next/TabSlot.js.map +1 -0
- package/dist-es/tabs-next/TabSlotRegistryContext.js +13 -0
- package/dist-es/tabs-next/TabSlotRegistryContext.js.map +1 -0
- package/dist-es/tabs-next/TabsNext.css.js +4 -0
- package/dist-es/tabs-next/TabsNext.css.js.map +1 -0
- package/dist-es/tabs-next/TabsNext.js +114 -48
- package/dist-es/tabs-next/TabsNext.js.map +1 -1
- package/dist-es/tabs-next/TabsNextContext.js +17 -3
- package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
- package/dist-es/tabs-next/domUtils.js +11 -0
- package/dist-es/tabs-next/domUtils.js.map +1 -0
- package/dist-es/tabs-next/hooks/overflowMath.js +82 -0
- package/dist-es/tabs-next/hooks/overflowMath.js.map +1 -0
- package/dist-es/tabs-next/hooks/useCollection.js +148 -42
- package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
- package/dist-es/tabs-next/hooks/useFocusWithRetry.js +62 -0
- package/dist-es/tabs-next/hooks/useFocusWithRetry.js.map +1 -0
- package/dist-es/tabs-next/hooks/useOverflow.js +242 -158
- package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
- package/dist-es/tabs-next/hooks/useOverflowLayoutState.js +97 -0
- package/dist-es/tabs-next/hooks/useOverflowLayoutState.js.map +1 -0
- package/dist-es/tabs-next/hooks/useOverflowSelectionState.js +58 -0
- package/dist-es/tabs-next/hooks/useOverflowSelectionState.js.map +1 -0
- package/dist-es/tabs-next/hooks/useRenderedTabWidth.js +90 -0
- package/dist-es/tabs-next/hooks/useRenderedTabWidth.js.map +1 -0
- package/dist-es/tabs-next/hooks/useRenderedTabsRegistry.js +198 -0
- package/dist-es/tabs-next/hooks/useRenderedTabsRegistry.js.map +1 -0
- package/dist-es/tabs-next/hooks/useTabListRecovery.js +74 -0
- package/dist-es/tabs-next/hooks/useTabListRecovery.js.map +1 -0
- package/dist-es/tabs-next/hooks/useTabRemovalHandler.js +163 -0
- package/dist-es/tabs-next/hooks/useTabRemovalHandler.js.map +1 -0
- package/dist-es/tabs-next/hooks/useTabSelectionFocus.js +78 -0
- package/dist-es/tabs-next/hooks/useTabSelectionFocus.js.map +1 -0
- package/dist-es/tabs-next/widthMeasurement.js +36 -0
- package/dist-es/tabs-next/widthMeasurement.js.map +1 -0
- package/dist-es/tree/Tree.css.js +1 -1
- package/dist-es/tree/TreeNode.css.js +1 -1
- package/dist-es/tree/TreeNode.js +1 -1
- package/dist-es/tree/TreeNode.js.map +1 -1
- package/dist-es/tree/TreeNodeExpansionIcon.css.js +1 -1
- package/dist-es/tree/TreeNodeTrigger.css.js +1 -1
- package/dist-es/tree/TreeNodeTrigger.js +2 -2
- package/dist-es/tree/TreeNodeTrigger.js.map +1 -1
- package/dist-es/utils/useEventCallback.js +5 -5
- package/dist-es/utils/useEventCallback.js.map +1 -1
- package/dist-types/cascading-menu/internal/useMenuTriggerHandlers.d.ts +1 -1
- package/dist-types/list-deprecated/ListStateContext.d.ts +7 -2
- package/dist-types/tabs-next/TabListLayoutContext.d.ts +9 -0
- package/dist-types/tabs-next/TabNext.d.ts +1 -1
- package/dist-types/tabs-next/TabNextPanel.d.ts +2 -1
- package/dist-types/tabs-next/TabOverflowList.d.ts +3 -4
- package/dist-types/tabs-next/TabSlot.d.ts +6 -0
- package/dist-types/tabs-next/TabSlotRegistryContext.d.ts +5 -0
- package/dist-types/tabs-next/TabsNext.d.ts +2 -1
- package/dist-types/tabs-next/TabsNextContext.d.ts +26 -4
- package/dist-types/tabs-next/domUtils.d.ts +1 -0
- package/dist-types/tabs-next/hooks/overflowMath.d.ts +18 -0
- package/dist-types/tabs-next/hooks/useCollection.d.ts +15 -3
- package/dist-types/tabs-next/hooks/useFocusWithRetry.d.ts +9 -0
- package/dist-types/tabs-next/hooks/useOverflow.d.ts +5 -5
- package/dist-types/tabs-next/hooks/useOverflowLayoutState.d.ts +13 -0
- package/dist-types/tabs-next/hooks/useOverflowSelectionState.d.ts +13 -0
- package/dist-types/tabs-next/hooks/useRenderedTabWidth.d.ts +12 -0
- package/dist-types/tabs-next/hooks/useRenderedTabsRegistry.d.ts +12 -0
- package/dist-types/tabs-next/hooks/useTabListRecovery.d.ts +12 -0
- package/dist-types/tabs-next/hooks/useTabRemovalHandler.d.ts +32 -0
- package/dist-types/tabs-next/hooks/useTabSelectionFocus.d.ts +15 -0
- package/dist-types/tabs-next/widthMeasurement.d.ts +5 -0
- package/dist-types/utils/useEventCallback.d.ts +1 -1
- package/package.json +2 -2
- package/dist-cjs/tabs-next/hooks/useFocusOutside.js +0 -25
- package/dist-cjs/tabs-next/hooks/useFocusOutside.js.map +0 -1
- package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js +0 -93
- package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +0 -1
- package/dist-es/tabs-next/hooks/useFocusOutside.js +0 -23
- package/dist-es/tabs-next/hooks/useFocusOutside.js.map +0 -1
- package/dist-es/tabs-next/hooks/useRestoreActiveTab.js +0 -91
- package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +0 -1
- package/dist-types/tabs-next/hooks/useFocusOutside.d.ts +0 -2
- package/dist-types/tabs-next/hooks/useRestoreActiveTab.d.ts +0 -10
|
@@ -5,18 +5,23 @@ var react$1 = require('@floating-ui/react');
|
|
|
5
5
|
var core = require('@salt-ds/core');
|
|
6
6
|
var styles = require('@salt-ds/styles');
|
|
7
7
|
var window = require('@salt-ds/window');
|
|
8
|
+
var clsx = require('clsx');
|
|
8
9
|
var react = require('react');
|
|
9
|
-
var
|
|
10
|
+
var domUtils = require('./domUtils.js');
|
|
10
11
|
var TabOverflowList$1 = require('./TabOverflowList.css.js');
|
|
12
|
+
var TabSlot = require('./TabSlot.js');
|
|
13
|
+
var TabsNextContext = require('./TabsNextContext.js');
|
|
14
|
+
var widthMeasurement = require('./widthMeasurement.js');
|
|
11
15
|
|
|
12
16
|
const withBaseName = core.makePrefixer("saltTabOverflow");
|
|
13
17
|
const TabOverflowList = react.forwardRef(
|
|
14
18
|
function TabOverflowList2(props, ref) {
|
|
19
|
+
var _a, _b;
|
|
15
20
|
const {
|
|
16
21
|
buttonRef,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
className,
|
|
23
|
+
hiddenValues,
|
|
24
|
+
order,
|
|
20
25
|
open,
|
|
21
26
|
setOpen,
|
|
22
27
|
...rest
|
|
@@ -27,104 +32,203 @@ const TabOverflowList = react.forwardRef(
|
|
|
27
32
|
css: TabOverflowList$1,
|
|
28
33
|
window: targetWindow
|
|
29
34
|
});
|
|
35
|
+
const overflowRef = react.useRef(null);
|
|
36
|
+
const hadOverflowItemsRef = react.useRef(false);
|
|
30
37
|
const { OverflowIcon } = core.useIcon();
|
|
31
|
-
const {
|
|
38
|
+
const { registerTab, updateTab, activeTab } = TabsNextContext.useTabsNext();
|
|
39
|
+
const { refs, x, y, strategy, context, elements } = core.useFloatingUI({
|
|
32
40
|
open,
|
|
33
41
|
onOpenChange(open2, _, reason) {
|
|
42
|
+
var _a2;
|
|
43
|
+
setOpen(open2);
|
|
34
44
|
if (reason === "escape-key") {
|
|
35
|
-
|
|
36
|
-
var _a, _b, _c;
|
|
37
|
-
const allTabs = ((_a = tabstripRef.current) == null ? void 0 : _a.querySelectorAll(
|
|
38
|
-
'[role="tab"]:not([aria-hidden])'
|
|
39
|
-
)) ?? [];
|
|
40
|
-
const numberOfTabsInOverflow = ((_b = listRef.current) == null ? void 0 : _b.querySelectorAll('[role="tab"]').length) ?? 0;
|
|
41
|
-
(_c = allTabs[allTabs.length - numberOfTabsInOverflow - 1]) == null ? void 0 : _c.focus({
|
|
42
|
-
preventScroll: true
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
+
(_a2 = overflowRef.current) == null ? void 0 : _a2.focus();
|
|
45
46
|
}
|
|
46
|
-
setOpen(open2);
|
|
47
47
|
},
|
|
48
48
|
placement: "bottom-start",
|
|
49
49
|
middleware: [
|
|
50
50
|
react$1.offset(1),
|
|
51
51
|
react$1.size({
|
|
52
|
-
apply({ elements, availableHeight }) {
|
|
53
|
-
Object.assign(
|
|
52
|
+
apply({ elements: elements2, availableHeight }) {
|
|
53
|
+
Object.assign(elements2.floating.style, {
|
|
54
54
|
maxHeight: `max(calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5), calc(${availableHeight}px - var(--salt-spacing-100)))`
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
}),
|
|
58
|
-
react$1.flip()
|
|
58
|
+
react$1.flip(),
|
|
59
|
+
react$1.shift({
|
|
60
|
+
padding: 8
|
|
61
|
+
})
|
|
59
62
|
]
|
|
60
63
|
});
|
|
61
|
-
const { getFloatingProps } = react$1.useInteractions([
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const handleListRef = core.useForkRef(
|
|
66
|
-
const handleFocusOutside = react.useCallback(() => {
|
|
67
|
-
setOpen(false);
|
|
68
|
-
}, [setOpen]);
|
|
69
|
-
useFocusOutside.useFocusOutside(
|
|
70
|
-
rootRef,
|
|
71
|
-
handleFocusOutside,
|
|
72
|
-
open,
|
|
73
|
-
"[data-floating-ui-portal]"
|
|
74
|
-
);
|
|
75
|
-
const handleClick = () => {
|
|
76
|
-
var _a, _b;
|
|
77
|
-
if (!open) {
|
|
78
|
-
(_b = (_a = listRef.current) == null ? void 0 : _a.querySelectorAll('[role="tab"]')[0]) == null ? void 0 : _b.focus({ preventScroll: true });
|
|
79
|
-
} else {
|
|
80
|
-
setOpen(false);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
const handleFocus = () => {
|
|
84
|
-
setOpen(true);
|
|
85
|
-
};
|
|
64
|
+
const { getFloatingProps, getReferenceProps } = react$1.useInteractions([
|
|
65
|
+
react$1.useClick(context),
|
|
66
|
+
react$1.useDismiss(context)
|
|
67
|
+
]);
|
|
68
|
+
const handleListRef = core.useForkRef(ref, refs.setFloating);
|
|
86
69
|
const handleButtonRef = core.useForkRef(
|
|
87
70
|
buttonRef,
|
|
88
71
|
refs.setReference
|
|
89
72
|
);
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
73
|
+
const handleRef = core.useForkRef(handleButtonRef, overflowRef);
|
|
74
|
+
const { Component: FloatingComponent } = core.useFloatingComponent();
|
|
75
|
+
const overflowId = core.useId();
|
|
76
|
+
const overlayId = core.useId();
|
|
77
|
+
const handleFocus = () => {
|
|
78
|
+
if (overflowId) {
|
|
79
|
+
activeTab.current = { value: overflowId, id: overflowId };
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const handleFloatingKeyDown = (event) => {
|
|
83
|
+
if (event.key !== "Tab") {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (event.shiftKey) {
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
setOpen(false);
|
|
89
|
+
const scheduleFocus = targetWindow == null ? void 0 : targetWindow.requestAnimationFrame;
|
|
90
|
+
if (scheduleFocus) {
|
|
91
|
+
scheduleFocus(
|
|
92
|
+
() => {
|
|
93
|
+
var _a2;
|
|
94
|
+
return (_a2 = overflowRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
queueMicrotask(
|
|
100
|
+
() => {
|
|
101
|
+
var _a2;
|
|
102
|
+
return (_a2 = overflowRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const overflowItemCount = hiddenValues.length;
|
|
109
|
+
const hasOverflowItems = overflowItemCount > 0;
|
|
110
|
+
const initialOrderRef = react.useRef(order);
|
|
111
|
+
react.useEffect(() => {
|
|
112
|
+
var _a2;
|
|
113
|
+
const tabList = (_a2 = overflowRef.current) == null ? void 0 : _a2.parentElement;
|
|
114
|
+
const resizeObserverCtor = targetWindow == null ? void 0 : targetWindow.ResizeObserver;
|
|
115
|
+
if (!open || !tabList || !resizeObserverCtor) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const observedElements = [tabList, tabList.parentElement].filter(
|
|
119
|
+
(element) => element != null
|
|
120
|
+
);
|
|
121
|
+
const widths = widthMeasurement.seedWidthMap(observedElements);
|
|
122
|
+
const resizeObserver = new resizeObserverCtor(
|
|
123
|
+
(entries) => {
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
if (!domUtils.isHTMLElement(entry.target)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const nextWidth = entry.contentRect.width || widthMeasurement.getMeasuredWidth(entry.target);
|
|
129
|
+
if (widthMeasurement.updateWidthMap(widths, entry.target, nextWidth)) {
|
|
130
|
+
setOpen(false);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
for (const element of observedElements) {
|
|
137
|
+
resizeObserver.observe(element);
|
|
138
|
+
}
|
|
139
|
+
return () => {
|
|
140
|
+
resizeObserver.disconnect();
|
|
141
|
+
};
|
|
142
|
+
}, [open, setOpen, targetWindow]);
|
|
143
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
144
|
+
if (open && !hasOverflowItems) {
|
|
145
|
+
setOpen(false);
|
|
146
|
+
}
|
|
147
|
+
}, [hasOverflowItems, open, setOpen]);
|
|
148
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
149
|
+
if (hasOverflowItems && !hadOverflowItemsRef.current) {
|
|
150
|
+
setOpen(false);
|
|
151
|
+
}
|
|
152
|
+
hadOverflowItemsRef.current = hasOverflowItems;
|
|
153
|
+
}, [hasOverflowItems, setOpen]);
|
|
154
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
155
|
+
if (overflowId && overflowRef.current && hasOverflowItems) {
|
|
156
|
+
const item = {
|
|
157
|
+
id: overflowId,
|
|
158
|
+
value: overflowId,
|
|
159
|
+
element: overflowRef.current,
|
|
160
|
+
location: "main",
|
|
161
|
+
order: initialOrderRef.current
|
|
162
|
+
};
|
|
163
|
+
return registerTab(item);
|
|
164
|
+
}
|
|
165
|
+
}, [hasOverflowItems, overflowId, registerTab]);
|
|
166
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
167
|
+
if (!overflowId || !hasOverflowItems) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
updateTab(overflowId, {
|
|
171
|
+
element: overflowRef.current,
|
|
172
|
+
location: "main",
|
|
173
|
+
order
|
|
174
|
+
});
|
|
175
|
+
}, [hasOverflowItems, order, overflowId, updateTab]);
|
|
176
|
+
if (!hasOverflowItems) return null;
|
|
177
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
94
178
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
95
179
|
core.Button,
|
|
96
180
|
{
|
|
181
|
+
className: clsx.clsx(withBaseName(), className),
|
|
97
182
|
"data-overflowbutton": true,
|
|
98
|
-
tabIndex: -1,
|
|
99
183
|
appearance: "transparent",
|
|
100
184
|
sentiment: "neutral",
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
185
|
+
...getReferenceProps({
|
|
186
|
+
onFocus: handleFocus
|
|
187
|
+
}),
|
|
188
|
+
ref: handleRef,
|
|
189
|
+
"aria-label": "Overflow",
|
|
104
190
|
"aria-expanded": open,
|
|
105
|
-
"aria-controls":
|
|
106
|
-
"aria-hidden": "true",
|
|
191
|
+
"aria-controls": overlayId,
|
|
107
192
|
role: "tab",
|
|
108
|
-
|
|
193
|
+
tabIndex: -1,
|
|
109
194
|
...rest,
|
|
110
195
|
children: /* @__PURE__ */ jsxRuntime.jsx(OverflowIcon, { "aria-hidden": true })
|
|
111
196
|
}
|
|
112
197
|
),
|
|
113
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
114
|
-
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
199
|
+
FloatingComponent,
|
|
115
200
|
{
|
|
116
201
|
ref: handleListRef,
|
|
117
202
|
...getFloatingProps({
|
|
118
|
-
|
|
119
|
-
|
|
203
|
+
id: overlayId,
|
|
204
|
+
onKeyDown: handleFloatingKeyDown
|
|
120
205
|
}),
|
|
206
|
+
focusManagerProps: context ? {
|
|
207
|
+
context,
|
|
208
|
+
initialFocus: 0,
|
|
209
|
+
returnFocus: false,
|
|
210
|
+
modal: false,
|
|
211
|
+
closeOnFocusOut: true
|
|
212
|
+
} : void 0,
|
|
121
213
|
className: withBaseName("list"),
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
214
|
+
open,
|
|
215
|
+
left: x ?? 0,
|
|
216
|
+
top: y ?? 0,
|
|
217
|
+
position: strategy,
|
|
218
|
+
width: (_a = elements.floating) == null ? void 0 : _a.offsetWidth,
|
|
219
|
+
height: (_b = elements.floating) == null ? void 0 : _b.offsetHeight,
|
|
220
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
221
|
+
"div",
|
|
222
|
+
{
|
|
223
|
+
role: "tablist",
|
|
224
|
+
"aria-orientation": "vertical",
|
|
225
|
+
className: withBaseName("listContainer"),
|
|
226
|
+
"aria-label": "Overflow tab options",
|
|
227
|
+
children: hiddenValues.map((value) => /* @__PURE__ */ jsxRuntime.jsx(TabSlot.TabSlot, { slotId: `overflow:${value}`, value }, value))
|
|
228
|
+
}
|
|
229
|
+
)
|
|
126
230
|
}
|
|
127
|
-
)
|
|
231
|
+
)
|
|
128
232
|
] });
|
|
129
233
|
}
|
|
130
234
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabOverflowList.js","sources":["../src/tabs-next/TabOverflowList.tsx"],"sourcesContent":["import {\n FloatingTree,\n flip,\n offset,\n size,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport {\n Button,\n makePrefixer,\n useFloatingUI,\n useForkRef,\n useIcon,\n useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n Children,\n type ComponentPropsWithoutRef,\n type Dispatch,\n forwardRef,\n type ReactNode,\n type Ref,\n type RefObject,\n type SetStateAction,\n useCallback,\n useRef,\n} from \"react\";\nimport { useFocusOutside } from \"./hooks/useFocusOutside\";\nimport tabOverflowListCss from \"./TabOverflowList.css\";\n\ninterface TabOverflowListProps extends ComponentPropsWithoutRef<\"button\"> {\n buttonRef?: Ref<HTMLButtonElement>;\n tabstripRef: RefObject<HTMLDivElement>;\n children?: ReactNode;\n isMeasuring?: boolean;\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n}\n\nconst withBaseName = makePrefixer(\"saltTabOverflow\");\n\nexport const TabOverflowList = forwardRef<HTMLDivElement, TabOverflowListProps>(\n function TabOverflowList(props, ref) {\n const {\n buttonRef,\n tabstripRef,\n children,\n isMeasuring,\n open,\n setOpen,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tabs-next-overflow-list\",\n css: tabOverflowListCss,\n window: targetWindow,\n });\n\n const { OverflowIcon } = useIcon();\n\n const { refs, x, y, strategy, context } = useFloatingUI({\n open: open,\n onOpenChange(open, _, reason) {\n if (reason === \"escape-key\") {\n queueMicrotask(() => {\n const allTabs =\n tabstripRef.current?.querySelectorAll<HTMLElement>(\n '[role=\"tab\"]:not([aria-hidden])',\n ) ?? [];\n const numberOfTabsInOverflow =\n listRef.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')\n .length ?? 0;\n\n allTabs[allTabs.length - numberOfTabsInOverflow - 1]?.focus({\n preventScroll: true,\n });\n });\n }\n\n setOpen(open);\n },\n placement: \"bottom-start\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `max(calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5), calc(${availableHeight}px - var(--salt-spacing-100)))`,\n });\n },\n }),\n flip(),\n ],\n });\n\n const { getFloatingProps } = useInteractions([useDismiss(context)]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const handleRootRef = useForkRef(rootRef, ref);\n const listRef = useRef<HTMLDivElement>(null);\n const handleListRef = useForkRef<HTMLDivElement>(listRef, refs.setFloating);\n\n const handleFocusOutside = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n useFocusOutside(\n rootRef,\n handleFocusOutside,\n open,\n \"[data-floating-ui-portal]\",\n );\n\n const handleClick = () => {\n if (!open) {\n listRef.current\n ?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[0]\n ?.focus({ preventScroll: true });\n } else {\n setOpen(false);\n }\n };\n\n const handleFocus = () => {\n setOpen(true);\n };\n\n const handleButtonRef = useForkRef<HTMLButtonElement>(\n buttonRef,\n refs.setReference,\n );\n\n const listId = useId();\n\n const childCount = Children.count(children);\n if (childCount === 0 && !isMeasuring) return null;\n\n return (\n <div className={withBaseName()} ref={handleRootRef} data-overflow>\n <Button\n data-overflowbutton\n tabIndex={-1}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleClick}\n ref={handleButtonRef}\n aria-label={`Overflow menu. ${childCount} tabs hidden`}\n aria-expanded={open}\n aria-controls={listId}\n aria-hidden=\"true\"\n role=\"tab\"\n aria-haspopup\n {...rest}\n >\n <OverflowIcon aria-hidden />\n </Button>\n <FloatingTree>\n <div\n ref={handleListRef}\n {...getFloatingProps({\n onFocus: handleFocus,\n role: \"presentation\",\n })}\n className={withBaseName(\"list\")}\n data-hidden={!open}\n style={\n open\n ? { left: x ?? 0, top: y ?? 0, position: strategy }\n : undefined\n }\n id={listId}\n >\n <div className={withBaseName(\"listContainer\")}>{children}</div>\n </div>\n </FloatingTree>\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabOverflowList","useWindow","useComponentCssInjection","tabOverflowListCss","useIcon","useFloatingUI","open","offset","size","flip","useInteractions","useDismiss","useRef","useForkRef","useCallback","useFocusOutside","useId","Children","jsxs","jsx","Button","FloatingTree"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TabOverflowList.js","sources":["../src/tabs-next/TabOverflowList.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport {\n Button,\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useIcon,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type Dispatch,\n forwardRef,\n type KeyboardEvent,\n type Ref,\n type SetStateAction,\n useEffect,\n useRef,\n} from \"react\";\nimport { isHTMLElement } from \"./domUtils\";\nimport tabOverflowListCss from \"./TabOverflowList.css\";\nimport { TabSlot } from \"./TabSlot\";\nimport { useTabsNext } from \"./TabsNextContext\";\nimport {\n getMeasuredWidth,\n seedWidthMap,\n updateWidthMap,\n} from \"./widthMeasurement\";\n\ninterface TabOverflowListProps extends ComponentPropsWithoutRef<\"button\"> {\n buttonRef?: Ref<HTMLButtonElement>;\n hiddenValues: string[];\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n order: number;\n}\n\nconst withBaseName = makePrefixer(\"saltTabOverflow\");\n\nexport const TabOverflowList = forwardRef<HTMLDivElement, TabOverflowListProps>(\n function TabOverflowList(props, ref) {\n const {\n buttonRef,\n className,\n hiddenValues,\n order,\n open,\n setOpen,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tabs-next-overflow-list\",\n css: tabOverflowListCss,\n window: targetWindow,\n });\n\n const overflowRef = useRef<HTMLButtonElement>(null);\n const hadOverflowItemsRef = useRef(false);\n\n const { OverflowIcon } = useIcon();\n const { registerTab, updateTab, activeTab } = useTabsNext();\n\n const { refs, x, y, strategy, context, elements } = useFloatingUI({\n open: open,\n onOpenChange(open, _, reason) {\n setOpen(open);\n\n if (reason === \"escape-key\") {\n overflowRef.current?.focus();\n }\n },\n placement: \"bottom-start\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `max(calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5), calc(${availableHeight}px - var(--salt-spacing-100)))`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context),\n ]);\n\n const handleListRef = useForkRef<HTMLDivElement>(ref, refs.setFloating);\n\n const handleButtonRef = useForkRef<HTMLButtonElement>(\n buttonRef,\n refs.setReference,\n );\n const handleRef = useForkRef(handleButtonRef, overflowRef);\n\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const overflowId = useId();\n const overlayId = useId();\n\n const handleFocus = () => {\n if (overflowId) {\n activeTab.current = { value: overflowId, id: overflowId };\n }\n };\n\n const handleFloatingKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") {\n return;\n }\n\n if (event.shiftKey) {\n event.preventDefault();\n setOpen(false);\n const scheduleFocus = targetWindow?.requestAnimationFrame;\n if (scheduleFocus) {\n scheduleFocus(() =>\n overflowRef.current?.focus({ preventScroll: true }),\n );\n return;\n }\n\n queueMicrotask(() =>\n overflowRef.current?.focus({ preventScroll: true }),\n );\n return;\n }\n };\n\n const overflowItemCount = hiddenValues.length;\n const hasOverflowItems = overflowItemCount > 0;\n const initialOrderRef = useRef(order);\n\n useEffect(() => {\n const tabList = overflowRef.current?.parentElement;\n const resizeObserverCtor = (\n targetWindow as\n | (Window & { ResizeObserver?: typeof ResizeObserver })\n | undefined\n )?.ResizeObserver;\n if (!open || !tabList || !resizeObserverCtor) {\n return;\n }\n\n const observedElements = [tabList, tabList.parentElement].filter(\n (element): element is HTMLElement => element != null,\n );\n const widths = seedWidthMap(observedElements);\n\n const resizeObserver = new resizeObserverCtor(\n (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n if (!isHTMLElement(entry.target)) {\n continue;\n }\n\n const nextWidth =\n entry.contentRect.width || getMeasuredWidth(entry.target);\n if (updateWidthMap(widths, entry.target, nextWidth)) {\n setOpen(false);\n return;\n }\n }\n },\n );\n\n for (const element of observedElements) {\n resizeObserver.observe(element);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [open, setOpen, targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n if (open && !hasOverflowItems) {\n setOpen(false);\n }\n }, [hasOverflowItems, open, setOpen]);\n\n useIsomorphicLayoutEffect(() => {\n if (hasOverflowItems && !hadOverflowItemsRef.current) {\n setOpen(false);\n }\n\n hadOverflowItemsRef.current = hasOverflowItems;\n }, [hasOverflowItems, setOpen]);\n\n useIsomorphicLayoutEffect(() => {\n if (overflowId && overflowRef.current && hasOverflowItems) {\n const item = {\n id: overflowId,\n value: overflowId,\n element: overflowRef.current,\n location: \"main\" as const,\n order: initialOrderRef.current,\n };\n\n return registerTab(item);\n }\n }, [hasOverflowItems, overflowId, registerTab]);\n\n useIsomorphicLayoutEffect(() => {\n if (!overflowId || !hasOverflowItems) {\n return;\n }\n\n updateTab(overflowId, {\n element: overflowRef.current,\n location: \"main\",\n order,\n });\n }, [hasOverflowItems, order, overflowId, updateTab]);\n\n if (!hasOverflowItems) return null;\n\n return (\n <>\n <Button\n className={clsx(withBaseName(), className)}\n data-overflowbutton\n appearance=\"transparent\"\n sentiment=\"neutral\"\n {...getReferenceProps({\n onFocus: handleFocus,\n })}\n ref={handleRef}\n aria-label=\"Overflow\"\n aria-expanded={open}\n aria-controls={overlayId}\n role=\"tab\"\n tabIndex={-1}\n {...rest}\n >\n <OverflowIcon aria-hidden />\n </Button>\n <FloatingComponent\n ref={handleListRef}\n {...getFloatingProps({\n id: overlayId,\n onKeyDown: handleFloatingKeyDown,\n })}\n focusManagerProps={\n context\n ? {\n context,\n initialFocus: 0,\n returnFocus: false,\n modal: false,\n closeOnFocusOut: true,\n }\n : undefined\n }\n className={withBaseName(\"list\")}\n open={open}\n left={x ?? 0}\n top={y ?? 0}\n position={strategy}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n >\n <div\n role=\"tablist\"\n aria-orientation=\"vertical\"\n className={withBaseName(\"listContainer\")}\n aria-label=\"Overflow tab options\"\n >\n {hiddenValues.map((value) => (\n <TabSlot key={value} slotId={`overflow:${value}`} value={value} />\n ))}\n </div>\n </FloatingComponent>\n </>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabOverflowList","useWindow","useComponentCssInjection","tabOverflowListCss","useRef","useIcon","useTabsNext","useFloatingUI","open","_a","offset","size","elements","flip","shift","useInteractions","useClick","useDismiss","useForkRef","useFloatingComponent","useId","useEffect","seedWidthMap","isHTMLElement","getMeasuredWidth","updateWidthMap","useIsomorphicLayoutEffect","jsxs","Fragment","jsx","Button","clsx","TabSlot"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var TabSlotRegistryContext = require('./TabSlotRegistryContext.js');
|
|
6
|
+
|
|
7
|
+
function TabSlot({ slotId, value, ...rest }) {
|
|
8
|
+
const slotRegistry = TabSlotRegistryContext.useTabSlotRegistry();
|
|
9
|
+
const handleRef = react.useCallback(
|
|
10
|
+
(element) => {
|
|
11
|
+
slotRegistry == null ? void 0 : slotRegistry.registerSlot(slotId, element);
|
|
12
|
+
},
|
|
13
|
+
[slotId, slotRegistry]
|
|
14
|
+
);
|
|
15
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
16
|
+
"div",
|
|
17
|
+
{
|
|
18
|
+
role: "presentation",
|
|
19
|
+
"data-tabslot": "",
|
|
20
|
+
"data-slotid": slotId,
|
|
21
|
+
"data-value": value,
|
|
22
|
+
ref: handleRef,
|
|
23
|
+
style: { display: "contents" },
|
|
24
|
+
...rest
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
exports.TabSlot = TabSlot;
|
|
30
|
+
//# sourceMappingURL=TabSlot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabSlot.js","sources":["../src/tabs-next/TabSlot.tsx"],"sourcesContent":["import { type ComponentPropsWithoutRef, useCallback } from \"react\";\nimport { useTabSlotRegistry } from \"./TabSlotRegistryContext\";\n\nexport interface TabSlotProps extends ComponentPropsWithoutRef<\"div\"> {\n slotId: string;\n value: string;\n}\n\nexport function TabSlot({ slotId, value, ...rest }: TabSlotProps) {\n const slotRegistry = useTabSlotRegistry();\n const handleRef = useCallback(\n (element: HTMLDivElement | null) => {\n slotRegistry?.registerSlot(slotId, element);\n },\n [slotId, slotRegistry],\n );\n\n return (\n <div\n role=\"presentation\"\n data-tabslot=\"\"\n data-slotid={slotId}\n data-value={value}\n ref={handleRef}\n style={{ display: \"contents\" }}\n {...rest}\n />\n );\n}\n"],"names":["useTabSlotRegistry","useCallback","jsx"],"mappings":";;;;;;AAQO,SAAS,QAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,GAAG,MAAK,EAAiB;AAChE,EAAA,MAAM,eAAeA,yCAAA,EAAmB;AACxC,EAAA,MAAM,SAAA,GAAYC,iBAAA;AAAA,IAChB,CAAC,OAAA,KAAmC;AAClC,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,aAAa,MAAA,EAAQ,OAAA,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,cAAA;AAAA,MACL,cAAA,EAAa,EAAA;AAAA,MACb,aAAA,EAAa,MAAA;AAAA,MACb,YAAA,EAAY,KAAA;AAAA,MACZ,GAAA,EAAK,SAAA;AAAA,MACL,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAW;AAAA,MAC5B,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@salt-ds/core');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const TabSlotRegistryContext = core.createContext(
|
|
7
|
+
"TabSlotRegistryContext",
|
|
8
|
+
null
|
|
9
|
+
);
|
|
10
|
+
function useTabSlotRegistry() {
|
|
11
|
+
return react.useContext(TabSlotRegistryContext);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.TabSlotRegistryContext = TabSlotRegistryContext;
|
|
15
|
+
exports.useTabSlotRegistry = useTabSlotRegistry;
|
|
16
|
+
//# sourceMappingURL=TabSlotRegistryContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabSlotRegistryContext.js","sources":["../src/tabs-next/TabSlotRegistryContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\n\nexport interface TabSlotRegistryContextValue {\n registerSlot: (slotId: string, element: HTMLDivElement | null) => void;\n}\n\nexport const TabSlotRegistryContext =\n createContext<TabSlotRegistryContextValue | null>(\n \"TabSlotRegistryContext\",\n null,\n );\n\nexport function useTabSlotRegistry() {\n return useContext(TabSlotRegistryContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAOO,MAAM,sBAAA,GACXA,kBAAA;AAAA,EACE,wBAAA;AAAA,EACA;AACF;AAEK,SAAS,kBAAA,GAAqB;AACnC,EAAA,OAAOC,iBAAW,sBAAsB,CAAA;AAC1C;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabsNext.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -2,93 +2,140 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
5
7
|
var clsx = require('clsx');
|
|
6
8
|
var react = require('react');
|
|
7
9
|
var useCollection = require('./hooks/useCollection.js');
|
|
10
|
+
var useOverflowSelectionState = require('./hooks/useOverflowSelectionState.js');
|
|
11
|
+
var useRenderedTabsRegistry = require('./hooks/useRenderedTabsRegistry.js');
|
|
12
|
+
var TabsNext$1 = require('./TabsNext.css.js');
|
|
8
13
|
var TabsNextContext = require('./TabsNextContext.js');
|
|
9
14
|
|
|
10
15
|
const withBaseName = core.makePrefixer("saltTabsNext");
|
|
16
|
+
function setValueIdMapEntry(map, value, id) {
|
|
17
|
+
if (map.get(value) === id) {
|
|
18
|
+
return map;
|
|
19
|
+
}
|
|
20
|
+
const next = new Map(map);
|
|
21
|
+
next.set(value, id);
|
|
22
|
+
return next;
|
|
23
|
+
}
|
|
24
|
+
function removeValueIdMapEntry(map, value, id) {
|
|
25
|
+
if (map.get(value) !== id) {
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
28
|
+
const next = new Map(map);
|
|
29
|
+
next.delete(value);
|
|
30
|
+
return next;
|
|
31
|
+
}
|
|
11
32
|
const TabsNext = react.forwardRef(
|
|
12
33
|
function TabsNext2(props, ref) {
|
|
13
34
|
const { className, children, value, defaultValue, onChange, ...rest } = props;
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
35
|
+
const targetWindow = window.useWindow();
|
|
36
|
+
styles.useComponentCssInjection({
|
|
37
|
+
testId: "salt-tabs-next",
|
|
38
|
+
css: TabsNext$1,
|
|
39
|
+
window: targetWindow
|
|
19
40
|
});
|
|
41
|
+
const [valueToTabIdMap, setValueToIdMap] = react.useState(
|
|
42
|
+
() => /* @__PURE__ */ new Map()
|
|
43
|
+
);
|
|
44
|
+
const [valueToPanelIdMap, setValueToPanelIdMap] = react.useState(
|
|
45
|
+
() => /* @__PURE__ */ new Map()
|
|
46
|
+
);
|
|
47
|
+
const {
|
|
48
|
+
renderMode,
|
|
49
|
+
registerBootstrapTab,
|
|
50
|
+
setBootstrapTabReady,
|
|
51
|
+
setBootstrapOverflowReady,
|
|
52
|
+
registerRenderedTab,
|
|
53
|
+
updateRenderedTab,
|
|
54
|
+
getRenderedTab,
|
|
55
|
+
getRenderedTabOrder,
|
|
56
|
+
renderedTabs
|
|
57
|
+
} = useRenderedTabsRegistry.useRenderedTabsRegistry();
|
|
20
58
|
const {
|
|
21
59
|
registerItem,
|
|
60
|
+
updateItem,
|
|
22
61
|
item,
|
|
23
62
|
getNext,
|
|
24
63
|
getPrevious,
|
|
25
64
|
getFirst,
|
|
26
65
|
getLast,
|
|
27
|
-
|
|
28
|
-
|
|
66
|
+
itemAt,
|
|
67
|
+
getIndex,
|
|
68
|
+
sortItems,
|
|
69
|
+
removalVersion,
|
|
70
|
+
getRemovedItems
|
|
71
|
+
} = useCollection.useCollection({ targetWindow, wrap: true });
|
|
29
72
|
const activeTab = react.useRef();
|
|
30
|
-
const removedActiveTabRef = react.useRef(void 0);
|
|
31
73
|
const [menuOpen, setMenuOpen] = react.useState(false);
|
|
32
74
|
const [selected, setSelectedState] = core.useControlled({
|
|
33
75
|
controlled: value,
|
|
34
76
|
default: defaultValue,
|
|
35
|
-
name: "
|
|
77
|
+
name: "TabsNext",
|
|
36
78
|
state: "selected"
|
|
37
79
|
});
|
|
38
|
-
const
|
|
39
|
-
(event,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
80
|
+
const commitSelection = react.useCallback(
|
|
81
|
+
(event, newValue) => {
|
|
82
|
+
setSelectedState(newValue);
|
|
83
|
+
if (selected !== newValue) {
|
|
84
|
+
onChange == null ? void 0 : onChange(event, newValue);
|
|
85
|
+
}
|
|
43
86
|
},
|
|
44
|
-
[onChange]
|
|
87
|
+
[onChange, selected]
|
|
45
88
|
);
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
});
|
|
52
|
-
return () => {
|
|
53
|
-
var _a;
|
|
54
|
-
cleanup();
|
|
55
|
-
setValueToIdMap(({ map }) => {
|
|
56
|
-
map.delete(item2.value);
|
|
57
|
-
return { map };
|
|
58
|
-
});
|
|
59
|
-
if (((_a = activeTab.current) == null ? void 0 : _a.value) !== item2.value) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
removedActiveTabRef.current = item2.value;
|
|
63
|
-
};
|
|
89
|
+
const { selectionFromOverflowValueRef, setSelected } = useOverflowSelectionState.useOverflowSelectionState({
|
|
90
|
+
commitSelection,
|
|
91
|
+
menuOpen,
|
|
92
|
+
selected,
|
|
93
|
+
setMenuOpen
|
|
64
94
|
});
|
|
95
|
+
const registerTab = react.useCallback(
|
|
96
|
+
(tab) => {
|
|
97
|
+
const cleanup = registerItem(tab);
|
|
98
|
+
setValueToIdMap((map) => setValueIdMapEntry(map, tab.value, tab.id));
|
|
99
|
+
return () => {
|
|
100
|
+
cleanup();
|
|
101
|
+
setValueToIdMap(
|
|
102
|
+
(map) => removeValueIdMapEntry(map, tab.value, tab.id)
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
[registerItem]
|
|
107
|
+
);
|
|
65
108
|
const registerPanel = react.useCallback((id, value2) => {
|
|
66
|
-
setValueToPanelIdMap((
|
|
67
|
-
map.set(value2, id);
|
|
68
|
-
return { map };
|
|
69
|
-
});
|
|
109
|
+
setValueToPanelIdMap((map) => setValueIdMapEntry(map, value2, id));
|
|
70
110
|
return () => {
|
|
71
|
-
|
|
72
|
-
map.delete(value2);
|
|
73
|
-
return { map };
|
|
74
|
-
});
|
|
111
|
+
setValueToPanelIdMap((map) => removeValueIdMapEntry(map, value2, id));
|
|
75
112
|
};
|
|
76
113
|
}, []);
|
|
77
114
|
const getPanelId = react.useCallback(
|
|
78
115
|
(value2) => {
|
|
79
|
-
return valueToPanelIdMap.
|
|
116
|
+
return valueToPanelIdMap.get(value2);
|
|
80
117
|
},
|
|
81
118
|
[valueToPanelIdMap]
|
|
82
119
|
);
|
|
83
120
|
const getTabId = react.useCallback(
|
|
84
121
|
(value2) => {
|
|
85
|
-
return valueToTabIdMap.
|
|
122
|
+
return valueToTabIdMap.get(value2);
|
|
86
123
|
},
|
|
87
124
|
[valueToTabIdMap]
|
|
88
125
|
);
|
|
89
126
|
const context = react.useMemo(
|
|
90
127
|
() => ({
|
|
128
|
+
renderMode,
|
|
129
|
+
registerBootstrapTab,
|
|
130
|
+
setBootstrapTabReady,
|
|
131
|
+
setBootstrapOverflowReady,
|
|
91
132
|
registerTab,
|
|
133
|
+
updateTab: updateItem,
|
|
134
|
+
registerRenderedTab,
|
|
135
|
+
updateRenderedTab,
|
|
136
|
+
getRenderedTab,
|
|
137
|
+
getRenderedTabOrder,
|
|
138
|
+
renderedTabs,
|
|
92
139
|
registerPanel,
|
|
93
140
|
getPanelId,
|
|
94
141
|
getTabId,
|
|
@@ -99,15 +146,29 @@ const TabsNext = react.forwardRef(
|
|
|
99
146
|
getPrevious,
|
|
100
147
|
getFirst,
|
|
101
148
|
getLast,
|
|
102
|
-
items,
|
|
103
149
|
activeTab,
|
|
150
|
+
selectionFromOverflowValueRef,
|
|
104
151
|
menuOpen,
|
|
105
152
|
setMenuOpen,
|
|
106
|
-
|
|
153
|
+
itemAt,
|
|
154
|
+
getIndex,
|
|
155
|
+
sortItems,
|
|
156
|
+
removalVersion,
|
|
157
|
+
getRemovedItems
|
|
107
158
|
}),
|
|
108
159
|
[
|
|
160
|
+
renderMode,
|
|
161
|
+
registerBootstrapTab,
|
|
162
|
+
setBootstrapTabReady,
|
|
163
|
+
setBootstrapOverflowReady,
|
|
109
164
|
registerPanel,
|
|
110
165
|
registerTab,
|
|
166
|
+
updateItem,
|
|
167
|
+
registerRenderedTab,
|
|
168
|
+
updateRenderedTab,
|
|
169
|
+
getRenderedTab,
|
|
170
|
+
getRenderedTabOrder,
|
|
171
|
+
renderedTabs,
|
|
111
172
|
getPanelId,
|
|
112
173
|
getTabId,
|
|
113
174
|
selected,
|
|
@@ -117,8 +178,13 @@ const TabsNext = react.forwardRef(
|
|
|
117
178
|
getPrevious,
|
|
118
179
|
getFirst,
|
|
119
180
|
getLast,
|
|
120
|
-
|
|
121
|
-
|
|
181
|
+
menuOpen,
|
|
182
|
+
itemAt,
|
|
183
|
+
getIndex,
|
|
184
|
+
sortItems,
|
|
185
|
+
removalVersion,
|
|
186
|
+
getRemovedItems,
|
|
187
|
+
selectionFromOverflowValueRef
|
|
122
188
|
]
|
|
123
189
|
);
|
|
124
190
|
return /* @__PURE__ */ jsxRuntime.jsx(TabsNextContext.TabsNextContext.Provider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx.clsx(withBaseName(), className), ref, ...rest, children }) });
|