@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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @salt-ds/lab
|
|
2
2
|
|
|
3
|
+
## 1.0.0-alpha.89
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e131baa: Improved `useEventCallback`'s stability.
|
|
8
|
+
- 7427b2c: - Updated spacing between tree node elements.
|
|
9
|
+
- Fixed missing gap between node elements.
|
|
10
|
+
- Fixed node focus indicator outline placement.
|
|
11
|
+
- 39e684a: Fixed incorrect Tooltip positioning and behavior when used with TreeNodeTrigger.
|
|
12
|
+
- b9c81ae: Refactored Tabs to address accessibility issues, known bugs and improve stability.
|
|
13
|
+
- Updated dependencies [e131baa]
|
|
14
|
+
- Updated dependencies [2d2d62b]
|
|
15
|
+
- @salt-ds/core@1.59.1
|
|
16
|
+
|
|
3
17
|
## 1.0.0-alpha.88
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/css/salt-lab.css
CHANGED
|
@@ -2949,9 +2949,20 @@
|
|
|
2949
2949
|
display: flex;
|
|
2950
2950
|
align-items: center;
|
|
2951
2951
|
flex-direction: row;
|
|
2952
|
-
gap: var(--salt-spacing-100);
|
|
2953
2952
|
position: relative;
|
|
2954
2953
|
box-sizing: border-box;
|
|
2954
|
+
min-width: 0;
|
|
2955
|
+
max-width: 100%;
|
|
2956
|
+
}
|
|
2957
|
+
.saltTabBar-strip {
|
|
2958
|
+
display: flex;
|
|
2959
|
+
align-items: center;
|
|
2960
|
+
flex-direction: row;
|
|
2961
|
+
flex: 1 1 auto;
|
|
2962
|
+
gap: var(--salt-spacing-100);
|
|
2963
|
+
box-sizing: border-box;
|
|
2964
|
+
min-width: 0;
|
|
2965
|
+
max-width: 100%;
|
|
2955
2966
|
}
|
|
2956
2967
|
.saltTabBar-divider::before {
|
|
2957
2968
|
content: "";
|
|
@@ -2976,8 +2987,8 @@
|
|
|
2976
2987
|
min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));
|
|
2977
2988
|
gap: var(--salt-spacing-100);
|
|
2978
2989
|
max-width: 100%;
|
|
2979
|
-
width: 100%;
|
|
2980
2990
|
min-width: 0;
|
|
2991
|
+
flex: 0 1 auto;
|
|
2981
2992
|
}
|
|
2982
2993
|
.saltTabListNext-center {
|
|
2983
2994
|
justify-content: center;
|
|
@@ -2994,8 +3005,15 @@
|
|
|
2994
3005
|
.saltTabListNext-activeColorTertiary {
|
|
2995
3006
|
--saltTabListNext-activeColor: var(--salt-container-tertiary-background);
|
|
2996
3007
|
}
|
|
2997
|
-
.saltTabListNext-
|
|
2998
|
-
|
|
3008
|
+
.saltTabListNext-measureContainer {
|
|
3009
|
+
position: absolute;
|
|
3010
|
+
top: 0;
|
|
3011
|
+
left: 0;
|
|
3012
|
+
height: 0;
|
|
3013
|
+
overflow: hidden;
|
|
3014
|
+
pointer-events: none;
|
|
3015
|
+
visibility: hidden;
|
|
3016
|
+
white-space: nowrap;
|
|
2999
3017
|
}
|
|
3000
3018
|
|
|
3001
3019
|
/* src/tabs-next/TabNext.css */
|
|
@@ -3113,10 +3131,10 @@
|
|
|
3113
3131
|
overflow: hidden;
|
|
3114
3132
|
overflow-y: auto;
|
|
3115
3133
|
position: absolute;
|
|
3116
|
-
z-index: var(--salt-zIndex-flyover);
|
|
3117
3134
|
box-shadow: var(--salt-overlayable-shadow-popout);
|
|
3118
3135
|
box-sizing: border-box;
|
|
3119
3136
|
border-radius: var(--salt-palette-corner, 0);
|
|
3137
|
+
z-index: var(--salt-zIndex-flyover);
|
|
3120
3138
|
}
|
|
3121
3139
|
.saltTabOverflow-listContainer {
|
|
3122
3140
|
display: flex;
|
|
@@ -3125,12 +3143,6 @@
|
|
|
3125
3143
|
max-height: inherit;
|
|
3126
3144
|
min-height: inherit;
|
|
3127
3145
|
}
|
|
3128
|
-
.saltTabOverflow-list[data-hidden=true] {
|
|
3129
|
-
opacity: 0;
|
|
3130
|
-
pointer-events: none;
|
|
3131
|
-
width: 1px;
|
|
3132
|
-
height: 1px;
|
|
3133
|
-
}
|
|
3134
3146
|
.saltTabOverflow-list .saltTabNext {
|
|
3135
3147
|
color: var(--salt-content-primary-foreground);
|
|
3136
3148
|
background: var(--salt-selectable-background);
|
|
@@ -3175,6 +3187,11 @@
|
|
|
3175
3187
|
box-shadow: 0 calc(var(--salt-size-fixed-100) * -1) 0 0 var(--salt-selectable-borderColor-selected), 0 var(--salt-size-fixed-100) 0 0 var(--salt-selectable-borderColor-selected);
|
|
3176
3188
|
}
|
|
3177
3189
|
|
|
3190
|
+
/* src/tabs-next/TabsNext.css */
|
|
3191
|
+
.saltTabsNext {
|
|
3192
|
+
min-width: 0;
|
|
3193
|
+
}
|
|
3194
|
+
|
|
3178
3195
|
/* src/toast-group/ToastGroup.css */
|
|
3179
3196
|
.saltToastGroup {
|
|
3180
3197
|
width: var(--toastGroup-width);
|
|
@@ -3685,6 +3702,9 @@
|
|
|
3685
3702
|
|
|
3686
3703
|
/* src/tree/Tree.css */
|
|
3687
3704
|
.saltTree {
|
|
3705
|
+
display: flex;
|
|
3706
|
+
flex-direction: column;
|
|
3707
|
+
gap: var(--salt-spacing-fixed-100);
|
|
3688
3708
|
list-style: none;
|
|
3689
3709
|
margin: 0;
|
|
3690
3710
|
padding: 0;
|
|
@@ -3708,18 +3728,24 @@
|
|
|
3708
3728
|
.saltTreeNode:focus-visible > .saltTreeNodeTrigger,
|
|
3709
3729
|
.saltTreeNode-focusVisible > .saltTreeNodeTrigger {
|
|
3710
3730
|
outline: var(--salt-focused-outline);
|
|
3731
|
+
outline-offset: calc(var(--salt-size-fixed-100) * -2);
|
|
3711
3732
|
position: relative;
|
|
3712
3733
|
z-index: calc(var(--salt-zIndex-default) + 1);
|
|
3713
3734
|
}
|
|
3714
3735
|
.saltTreeNode-selected:focus-visible > .saltTreeNodeTrigger,
|
|
3715
3736
|
.saltTreeNode-selected.saltTreeNode-focusVisible > .saltTreeNodeTrigger {
|
|
3716
3737
|
outline: var(--salt-focused-outline);
|
|
3738
|
+
outline-offset: calc(var(--salt-size-fixed-100) * -2);
|
|
3717
3739
|
z-index: calc(var(--salt-zIndex-default) + 1);
|
|
3718
3740
|
}
|
|
3719
3741
|
.saltTreeNode-group {
|
|
3742
|
+
display: flex;
|
|
3743
|
+
flex-direction: column;
|
|
3744
|
+
gap: var(--salt-spacing-fixed-100);
|
|
3720
3745
|
list-style: none;
|
|
3721
3746
|
margin: 0;
|
|
3722
3747
|
padding: 0;
|
|
3748
|
+
padding-top: var(--salt-spacing-fixed-100);
|
|
3723
3749
|
}
|
|
3724
3750
|
.saltTreeNode-checkbox {
|
|
3725
3751
|
flex-shrink: 0;
|
|
@@ -3727,7 +3753,7 @@
|
|
|
3727
3753
|
}
|
|
3728
3754
|
.saltTreeNode-icon {
|
|
3729
3755
|
display: flex;
|
|
3730
|
-
align-items:
|
|
3756
|
+
align-items: flex-start;
|
|
3731
3757
|
justify-content: center;
|
|
3732
3758
|
width: var(--salt-size-selectable);
|
|
3733
3759
|
min-width: var(--salt-size-selectable);
|
|
@@ -3741,7 +3767,7 @@
|
|
|
3741
3767
|
/* src/tree/TreeNodeExpansionIcon.css */
|
|
3742
3768
|
.saltTreeNodeExpansionIcon {
|
|
3743
3769
|
display: flex;
|
|
3744
|
-
align-items:
|
|
3770
|
+
align-items: flex-start;
|
|
3745
3771
|
justify-content: center;
|
|
3746
3772
|
width: var(--salt-size-selectable);
|
|
3747
3773
|
min-width: var(--salt-size-selectable);
|
|
@@ -3786,13 +3812,12 @@
|
|
|
3786
3812
|
padding-bottom: calc((var(--salt-size-base) - var(--salt-size-selectable)) / 2);
|
|
3787
3813
|
padding-right: var(--salt-spacing-100);
|
|
3788
3814
|
--saltTreeNodeTrigger-indentStep: calc(var(--salt-size-selectable) + var(--salt-spacing-100));
|
|
3815
|
+
--saltTreeNodeTrigger-iconOffsetY: calc((var(--salt-text-lineHeight) - max(var(--salt-size-icon), 12px)) / 2);
|
|
3816
|
+
--saltTreeNodeTrigger-directIconInsetX: max(0px, calc((var(--salt-size-selectable) - max(var(--salt-size-icon), 12px)) / 2));
|
|
3789
3817
|
padding-left: calc(var(--salt-spacing-100) + (var(--saltTreeNodeTrigger-indentStep) * (var(--saltTreeNode-level, 1) - 1)));
|
|
3790
3818
|
background: var(--salt-selectable-background);
|
|
3791
3819
|
color: var(--salt-content-primary-foreground);
|
|
3792
3820
|
}
|
|
3793
|
-
[aria-multiselectable=true] .saltTreeNodeTrigger {
|
|
3794
|
-
--saltTreeNodeTrigger-indentStep: calc(var(--salt-size-selectable) + var(--salt-spacing-150));
|
|
3795
|
-
}
|
|
3796
3821
|
.saltTreeNodeTrigger:hover {
|
|
3797
3822
|
background: var(--salt-selectable-background-hover);
|
|
3798
3823
|
}
|
|
@@ -3802,7 +3827,7 @@
|
|
|
3802
3827
|
}
|
|
3803
3828
|
.saltTreeNode-selected > .saltTreeNodeTrigger {
|
|
3804
3829
|
background: var(--salt-selectable-background-selected);
|
|
3805
|
-
box-shadow: 0 calc(var(--salt-size-
|
|
3830
|
+
box-shadow: 0 calc(var(--salt-size-fixed-100) * -1) 0 0 var(--salt-selectable-borderColor-selected), 0 var(--salt-size-fixed-100) 0 0 var(--salt-selectable-borderColor-selected);
|
|
3806
3831
|
position: relative;
|
|
3807
3832
|
z-index: var(--salt-zIndex-default);
|
|
3808
3833
|
}
|
|
@@ -3817,17 +3842,20 @@
|
|
|
3817
3842
|
background: var(--salt-selectable-background);
|
|
3818
3843
|
color: var(--salt-content-primary-foreground);
|
|
3819
3844
|
}
|
|
3845
|
+
.saltTreeNodeTrigger > .saltTreeNode-checkbox {
|
|
3846
|
+
margin-block: calc((var(--salt-text-lineHeight) - var(--salt-size-selectable)) / 2);
|
|
3847
|
+
}
|
|
3848
|
+
.saltTreeNodeTrigger > .saltTreeNodeExpansionIcon > .saltTreeNodeExpansionIcon-icon,
|
|
3849
|
+
.saltTreeNodeTrigger > .saltTreeNode-icon > .saltIcon {
|
|
3850
|
+
--saltIcon-margin: var(--saltTreeNodeTrigger-iconOffsetY) 0 0 0;
|
|
3851
|
+
}
|
|
3820
3852
|
.saltTreeNodeTrigger > .saltIcon {
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3853
|
+
--saltIcon-margin: var(--saltTreeNodeTrigger-iconOffsetY) 0 0 0;
|
|
3854
|
+
box-sizing: content-box;
|
|
3855
|
+
padding-inline: var(--saltTreeNodeTrigger-directIconInsetX);
|
|
3824
3856
|
flex-shrink: 0;
|
|
3825
3857
|
color: var(--salt-content-primary-foreground);
|
|
3826
3858
|
}
|
|
3827
|
-
.saltTreeNodeTrigger > .saltTreeNode-checkbox {
|
|
3828
|
-
margin-left: calc(var(--salt-spacing-150) - var(--salt-spacing-100));
|
|
3829
|
-
margin-right: calc(var(--salt-spacing-150) - var(--salt-spacing-100));
|
|
3830
|
-
}
|
|
3831
3859
|
|
|
3832
3860
|
/* src/window/ElectronWindow.css */
|
|
3833
3861
|
.saltWindow {
|
|
@@ -4244,4 +4272,4 @@
|
|
|
4244
4272
|
margin: calc(var(--salt-size-unit) / 2) 0;
|
|
4245
4273
|
}
|
|
4246
4274
|
|
|
4247
|
-
/* src/
|
|
4275
|
+
/* src/133f6296-6356-4cbf-8225-c555b1a7031b.css */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListStateContext.js","sources":["../src/list-deprecated/ListStateContext.
|
|
1
|
+
{"version":3,"file":"ListStateContext.js","sources":["../src/list-deprecated/ListStateContext.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\ninterface ListStateContextValue {\n state: any;\n helpers: any;\n}\n\nexport const ListStateContext = createContext<\n ListStateContextValue | undefined\n>(undefined);\n\nexport const useListStateContext = () => {\n const context = useContext(ListStateContext);\n\n if (!context) {\n throw new Error(\n \"useListStateContext must be used inside of a ListStateContext Provider.\",\n );\n }\n\n return context;\n};\n"],"names":["createContext","useContext"],"mappings":";;;;AAOO,MAAM,gBAAA,GAAmBA,oBAE9B,MAAS;AAEJ,MAAM,sBAAsB,MAAM;AACvC,EAAA,MAAM,OAAA,GAAUC,iBAAW,gBAAgB,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".saltTabBar {\n display: flex;\n align-items: center;\n flex-direction: row;\n gap: var(--salt-spacing-100);\n
|
|
3
|
+
var css_248z = ".saltTabBar {\n display: flex;\n align-items: center;\n flex-direction: row;\n position: relative;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n}\n\n.saltTabBar-strip {\n display: flex;\n align-items: center;\n flex-direction: row;\n flex: 1 1 auto;\n gap: var(--salt-spacing-100);\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n}\n\n.saltTabBar-divider::before {\n content: \"\";\n position: absolute;\n inset: auto 0 0 0;\n height: var(--salt-size-fixed-100);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-secondary-borderColor);\n}\n\n.saltTabBar-inset {\n padding-left: var(--salt-spacing-300);\n padding-right: var(--salt-spacing-300);\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = css_248z;
|
|
6
6
|
//# sourceMappingURL=TabBar.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabBar.js","sources":["../src/tabs-next/TabBar.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport tabBarCss from \"./TabBar.css\";\n\nexport interface TabBarProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Styling variant with a bottom separator. Defaults to false\n */\n divider?: boolean;\n /**\n * Styling variant with left and right padding. Defaults to false\n */\n inset?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltTabBar\");\n\nexport const TabBar = forwardRef<HTMLDivElement, TabBarProps>(\n function TabBar(props, ref) {\n const { className, children, divider, inset, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-bar\",\n css: tabBarCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"divider\")]: divider,\n [withBaseName(\"inset\")]: inset,\n },\n className,\n )}\n {...rest}\n ref={ref}\n >\n {children}
|
|
1
|
+
{"version":3,"file":"TabBar.js","sources":["../src/tabs-next/TabBar.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport tabBarCss from \"./TabBar.css\";\n\nexport interface TabBarProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Styling variant with a bottom separator. Defaults to false\n */\n divider?: boolean;\n /**\n * Styling variant with left and right padding. Defaults to false\n */\n inset?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltTabBar\");\n\nexport const TabBar = forwardRef<HTMLDivElement, TabBarProps>(\n function TabBar(props, ref) {\n const { className, children, divider, inset, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-bar\",\n css: tabBarCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"divider\")]: divider,\n [withBaseName(\"inset\")]: inset,\n },\n className,\n )}\n {...rest}\n ref={ref}\n >\n <div className={withBaseName(\"strip\")}>{children}</div>\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabBar","useWindow","useComponentCssInjection","tabBarCss","jsx","clsx"],"mappings":";;;;;;;;;;AAkBA,MAAM,YAAA,GAAeA,kBAAa,YAAY,CAAA;AAEvC,MAAM,MAAA,GAASC,gBAAA;AAAA,EACpB,SAASC,OAAAA,CAAO,KAAA,EAAO,GAAA,EAAK;AAC1B,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,SAAS,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AAEzD,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,cAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACEC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,SAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG,OAAA;AAAA,YAC3B,CAAC,YAAA,CAAa,OAAO,CAAC,GAAG;AAAA,WAC3B;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEA,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,OAAO,GAAI,QAAA,EAAS;AAAA;AAAA,KACnD;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@salt-ds/core');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const TabListLayoutContext = core.createContext("TabListLayoutContext", null);
|
|
7
|
+
function useTabListLayout() {
|
|
8
|
+
return react.useContext(TabListLayoutContext);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
exports.TabListLayoutContext = TabListLayoutContext;
|
|
12
|
+
exports.useTabListLayout = useTabListLayout;
|
|
13
|
+
//# sourceMappingURL=TabListLayoutContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabListLayoutContext.js","sources":["../src/tabs-next/TabListLayoutContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\n\nexport type TabSlotLocation = \"hidden\" | \"main\" | \"overflow\";\n\nexport interface TabListLayoutContextValue {\n getLocation: (value: string) => TabSlotLocation;\n overflowActiveValue: string | null;\n setOverflowActiveValue: (value: string | null) => void;\n moveOverflowFocus: (\n key: \"ArrowDown\" | \"ArrowUp\" | \"Home\" | \"End\",\n value: string,\n ) => boolean;\n}\n\nexport const TabListLayoutContext =\n createContext<TabListLayoutContextValue | null>(\"TabListLayoutContext\", null);\n\nexport function useTabListLayout() {\n return useContext(TabListLayoutContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAeO,MAAM,oBAAA,GACXA,kBAAA,CAAgD,sBAAA,EAAwB,IAAI;AAEvE,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAOC,iBAAW,oBAAoB,CAAA;AACxC;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css_248z = "/* Component class applied to the root element */\n.saltTabListNext {\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n position: relative;\n background: transparent;\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n gap: var(--salt-spacing-100);\n max-width: 100%;\n width:
|
|
3
|
+
var css_248z = "/* Component class applied to the root element */\n.saltTabListNext {\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n position: relative;\n background: transparent;\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n gap: var(--salt-spacing-100);\n max-width: 100%;\n min-width: 0;\n flex: 0 1 auto;\n}\n\n.saltTabListNext-center {\n justify-content: center;\n}\n\n.saltTabListNext-right {\n justify-content: flex-end;\n}\n\n.saltTabListNext-activeColorPrimary {\n --saltTabListNext-activeColor: var(--salt-container-primary-background);\n}\n\n.saltTabListNext-activeColorSecondary {\n --saltTabListNext-activeColor: var(--salt-container-secondary-background);\n}\n\n.saltTabListNext-activeColorTertiary {\n --saltTabListNext-activeColor: var(--salt-container-tertiary-background);\n}\n\n.saltTabListNext-measureContainer {\n position: absolute;\n top: 0;\n left: 0;\n height: 0;\n overflow: hidden;\n pointer-events: none;\n visibility: hidden;\n white-space: nowrap;\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = css_248z;
|
|
6
6
|
//# sourceMappingURL=TabListNext.css.js.map
|
|
@@ -6,19 +6,26 @@ var styles = require('@salt-ds/styles');
|
|
|
6
6
|
var window = require('@salt-ds/window');
|
|
7
7
|
var clsx = require('clsx');
|
|
8
8
|
var react = require('react');
|
|
9
|
+
var useFocusWithRetry = require('./hooks/useFocusWithRetry.js');
|
|
9
10
|
var useOverflow = require('./hooks/useOverflow.js');
|
|
10
|
-
var
|
|
11
|
+
var useOverflowLayoutState = require('./hooks/useOverflowLayoutState.js');
|
|
12
|
+
var useTabListRecovery = require('./hooks/useTabListRecovery.js');
|
|
13
|
+
var useTabRemovalHandler = require('./hooks/useTabRemovalHandler.js');
|
|
14
|
+
var useTabSelectionFocus = require('./hooks/useTabSelectionFocus.js');
|
|
15
|
+
var TabListLayoutContext = require('./TabListLayoutContext.js');
|
|
11
16
|
var TabListNext$1 = require('./TabListNext.css.js');
|
|
12
17
|
var TabOverflowList = require('./TabOverflowList.js');
|
|
18
|
+
var TabSlot = require('./TabSlot.js');
|
|
19
|
+
var TabSlotRegistryContext = require('./TabSlotRegistryContext.js');
|
|
13
20
|
var TabsNextContext = require('./TabsNextContext.js');
|
|
14
21
|
|
|
15
22
|
const withBaseName = core.makePrefixer("saltTabListNext");
|
|
23
|
+
const MAX_FOCUS_RETRY_ATTEMPTS = 120;
|
|
16
24
|
const TabListNext = react.forwardRef(
|
|
17
|
-
function
|
|
25
|
+
function TabListNext2(props, ref) {
|
|
18
26
|
const {
|
|
19
27
|
appearance = "bordered",
|
|
20
28
|
activeColor = "primary",
|
|
21
|
-
"aria-describedby": ariaDescribedBy,
|
|
22
29
|
children,
|
|
23
30
|
className,
|
|
24
31
|
onKeyDown,
|
|
@@ -31,61 +38,185 @@ const TabListNext = react.forwardRef(
|
|
|
31
38
|
window: targetWindow
|
|
32
39
|
});
|
|
33
40
|
const {
|
|
41
|
+
renderMode,
|
|
34
42
|
selected,
|
|
43
|
+
setSelected,
|
|
44
|
+
setBootstrapOverflowReady,
|
|
35
45
|
getNext,
|
|
36
46
|
getPrevious,
|
|
37
47
|
getFirst,
|
|
38
48
|
getLast,
|
|
39
|
-
|
|
49
|
+
getIndex,
|
|
50
|
+
item,
|
|
51
|
+
itemAt,
|
|
40
52
|
activeTab,
|
|
53
|
+
selectionFromOverflowValueRef,
|
|
41
54
|
menuOpen,
|
|
42
55
|
setMenuOpen,
|
|
43
|
-
|
|
56
|
+
sortItems,
|
|
57
|
+
getRemovedItems,
|
|
58
|
+
getRenderedTab,
|
|
59
|
+
renderedTabs,
|
|
60
|
+
removalVersion
|
|
44
61
|
} = TabsNextContext.useTabsNext();
|
|
45
62
|
const tabstripRef = react.useRef(null);
|
|
63
|
+
const overflowListRef = react.useRef(null);
|
|
64
|
+
const slotMapRef = react.useRef(/* @__PURE__ */ new Map());
|
|
65
|
+
const removalRecoveryRafRef = react.useRef(null);
|
|
66
|
+
const pendingRemovalRecoveryRef = react.useRef(false);
|
|
67
|
+
const pendingRemovalRecoveryRetriesRef = react.useRef(0);
|
|
68
|
+
const [slotVersion, setSlotVersion] = react.useState(0);
|
|
46
69
|
const handleRef = core.useForkRef(tabstripRef, ref);
|
|
47
70
|
const overflowButtonRef = react.useRef(null);
|
|
48
|
-
const
|
|
71
|
+
const { announce } = core.useAriaAnnouncer();
|
|
72
|
+
const overflowMenuOpen = renderMode === "portal" ? menuOpen : false;
|
|
73
|
+
const [visibleValues, hiddenValues, isMeasuring] = useOverflow.useOverflow({
|
|
49
74
|
container: tabstripRef,
|
|
50
|
-
|
|
51
|
-
children,
|
|
75
|
+
menuOpen: overflowMenuOpen,
|
|
52
76
|
selected,
|
|
77
|
+
tabs: renderedTabs,
|
|
53
78
|
overflowButton: overflowButtonRef
|
|
54
79
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
80
|
+
react.useEffect(() => {
|
|
81
|
+
setBootstrapOverflowReady(
|
|
82
|
+
renderMode === "inline" && renderedTabs.length > 0 && !isMeasuring
|
|
83
|
+
);
|
|
84
|
+
}, [
|
|
85
|
+
isMeasuring,
|
|
86
|
+
renderMode,
|
|
87
|
+
renderedTabs.length,
|
|
88
|
+
setBootstrapOverflowReady
|
|
89
|
+
]);
|
|
90
|
+
const { resolvedOverflowActiveValue, tabListLayoutContext } = useOverflowLayoutState.useOverflowLayoutState({
|
|
91
|
+
hiddenValues,
|
|
92
|
+
menuOpen,
|
|
93
|
+
overflowMenuOpen,
|
|
94
|
+
visibleValues
|
|
60
95
|
});
|
|
96
|
+
const registerSlot = react.useCallback(
|
|
97
|
+
(slotId, element) => {
|
|
98
|
+
const currentElement = slotMapRef.current.get(slotId) ?? null;
|
|
99
|
+
if (currentElement === element) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (element) {
|
|
103
|
+
slotMapRef.current.set(slotId, element);
|
|
104
|
+
} else {
|
|
105
|
+
slotMapRef.current.delete(slotId);
|
|
106
|
+
}
|
|
107
|
+
setSlotVersion((currentVersion) => currentVersion + 1);
|
|
108
|
+
},
|
|
109
|
+
[]
|
|
110
|
+
);
|
|
111
|
+
const slotRegistryContext = react.useMemo(
|
|
112
|
+
() => ({ registerSlot }),
|
|
113
|
+
[registerSlot]
|
|
114
|
+
);
|
|
115
|
+
const slotAssignments = react.useMemo(() => {
|
|
116
|
+
const nextAssignments = /* @__PURE__ */ new Map();
|
|
117
|
+
for (const value of visibleValues) {
|
|
118
|
+
nextAssignments.set(value, `main:${value}`);
|
|
119
|
+
}
|
|
120
|
+
for (const value of hiddenValues) {
|
|
121
|
+
nextAssignments.set(
|
|
122
|
+
value,
|
|
123
|
+
menuOpen ? `overflow:${value}` : `measure:${value}`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
map: nextAssignments,
|
|
128
|
+
version: slotVersion
|
|
129
|
+
};
|
|
130
|
+
}, [hiddenValues, menuOpen, slotVersion, visibleValues]);
|
|
131
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
132
|
+
var _a;
|
|
133
|
+
if (renderMode !== "portal") {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
for (const [value, slotId] of slotAssignments.map) {
|
|
137
|
+
const host = (_a = getRenderedTab(value)) == null ? void 0 : _a.host;
|
|
138
|
+
const slot = slotMapRef.current.get(slotId);
|
|
139
|
+
if (host && slot && host.parentElement !== slot) {
|
|
140
|
+
slot.appendChild(host);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}, [getRenderedTab, renderMode, slotAssignments]);
|
|
61
144
|
const handleKeyDown = (event) => {
|
|
62
|
-
var _a, _b
|
|
145
|
+
var _a, _b;
|
|
63
146
|
onKeyDown == null ? void 0 : onKeyDown(event);
|
|
147
|
+
if (menuOpen) return;
|
|
64
148
|
const actionMap = {
|
|
65
149
|
ArrowRight: getNext,
|
|
66
150
|
ArrowLeft: getPrevious,
|
|
67
151
|
Home: getFirst,
|
|
68
|
-
End: getLast
|
|
69
|
-
ArrowUp: menuOpen ? getPrevious : void 0,
|
|
70
|
-
ArrowDown: menuOpen ? getNext : void 0
|
|
152
|
+
End: getLast
|
|
71
153
|
};
|
|
72
154
|
const action = actionMap[event.key];
|
|
73
155
|
if (action) {
|
|
74
156
|
event.preventDefault();
|
|
157
|
+
sortItems();
|
|
75
158
|
const activeTabId = (_a = activeTab.current) == null ? void 0 : _a.id;
|
|
76
159
|
if (!activeTabId) return;
|
|
77
160
|
const nextItem = action(activeTabId);
|
|
78
161
|
if (nextItem) {
|
|
79
|
-
(
|
|
80
|
-
block: "nearest",
|
|
81
|
-
inline: "nearest"
|
|
82
|
-
});
|
|
83
|
-
(_d = nextItem.element) == null ? void 0 : _d.focus({ preventScroll: true });
|
|
162
|
+
(_b = nextItem.element) == null ? void 0 : _b.focus({ preventScroll: true });
|
|
84
163
|
}
|
|
85
164
|
}
|
|
86
165
|
};
|
|
87
|
-
const
|
|
88
|
-
|
|
166
|
+
const getSelectedTabElement = react.useCallback(() => {
|
|
167
|
+
var _a, _b, _c;
|
|
168
|
+
return ((_a = tabstripRef.current) == null ? void 0 : _a.querySelector(
|
|
169
|
+
'[role="tab"][aria-selected="true"]'
|
|
170
|
+
)) ?? ((_c = item((_b = activeTab.current) == null ? void 0 : _b.id)) == null ? void 0 : _c.element);
|
|
171
|
+
}, [item, activeTab]);
|
|
172
|
+
const { focusElementWithRetry } = useFocusWithRetry.useFocusWithRetry({
|
|
173
|
+
maxAttempts: MAX_FOCUS_RETRY_ATTEMPTS,
|
|
174
|
+
targetWindow
|
|
175
|
+
});
|
|
176
|
+
useTabSelectionFocus.useTabSelectionFocus({
|
|
177
|
+
announce,
|
|
178
|
+
focusElementWithRetry,
|
|
179
|
+
getRenderedTab,
|
|
180
|
+
getSelectedTabElement,
|
|
181
|
+
menuOpen,
|
|
182
|
+
resolvedOverflowActiveValue,
|
|
183
|
+
selected,
|
|
184
|
+
selectionFromOverflowValueRef,
|
|
185
|
+
targetWindow
|
|
186
|
+
});
|
|
187
|
+
const handleTabRemoval = useTabRemovalHandler.useTabRemovalHandler({
|
|
188
|
+
activeTab,
|
|
189
|
+
focusElementWithRetry,
|
|
190
|
+
getFirst,
|
|
191
|
+
getIndex,
|
|
192
|
+
getLast,
|
|
193
|
+
getRemovedItems,
|
|
194
|
+
getRenderedTab,
|
|
195
|
+
getSelectedTabElement,
|
|
196
|
+
item,
|
|
197
|
+
itemAt,
|
|
198
|
+
maxRetryAttempts: MAX_FOCUS_RETRY_ATTEMPTS,
|
|
199
|
+
menuOpen,
|
|
200
|
+
overflowButtonRef,
|
|
201
|
+
overflowListRef,
|
|
202
|
+
pendingRemovalRecoveryRef,
|
|
203
|
+
pendingRemovalRecoveryRetriesRef,
|
|
204
|
+
removalRecoveryRafRef,
|
|
205
|
+
selected,
|
|
206
|
+
setSelected,
|
|
207
|
+
tabstripRef,
|
|
208
|
+
targetWindow
|
|
209
|
+
});
|
|
210
|
+
useTabListRecovery.useTabListRecovery({
|
|
211
|
+
removalVersion,
|
|
212
|
+
targetWindow,
|
|
213
|
+
tabstripRef,
|
|
214
|
+
overflowListRef,
|
|
215
|
+
handleTabRemoval,
|
|
216
|
+
pendingRemovalRecoveryRef,
|
|
217
|
+
pendingRemovalRecoveryRetriesRef
|
|
218
|
+
});
|
|
219
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
89
220
|
"div",
|
|
90
221
|
{
|
|
91
222
|
role: "tablist",
|
|
@@ -96,26 +227,41 @@ const TabListNext = react.forwardRef(
|
|
|
96
227
|
withBaseName(`activeColor${core.capitalize(activeColor)}`),
|
|
97
228
|
className
|
|
98
229
|
),
|
|
99
|
-
"data-ismeasuring": isMeasuring ? true : void 0,
|
|
230
|
+
"data-ismeasuring": renderMode === "portal" && isMeasuring ? true : void 0,
|
|
100
231
|
ref: handleRef,
|
|
101
232
|
onKeyDown: handleKeyDown,
|
|
102
|
-
"aria-describedby": clsx.clsx(ariaDescribedBy, warningId) || void 0,
|
|
103
233
|
...rest,
|
|
104
|
-
children: [
|
|
105
|
-
|
|
106
|
-
|
|
234
|
+
children: renderMode === "inline" ? children : /* @__PURE__ */ jsxRuntime.jsx(TabSlotRegistryContext.TabSlotRegistryContext.Provider, { value: slotRegistryContext, children: /* @__PURE__ */ jsxRuntime.jsxs(TabListLayoutContext.TabListLayoutContext.Provider, { value: tabListLayoutContext, children: [
|
|
235
|
+
children,
|
|
236
|
+
visibleValues.map((value) => /* @__PURE__ */ jsxRuntime.jsx(TabSlot.TabSlot, { slotId: `main:${value}`, value }, value)),
|
|
237
|
+
!menuOpen && hiddenValues.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
238
|
+
"div",
|
|
239
|
+
{
|
|
240
|
+
"aria-hidden": "true",
|
|
241
|
+
role: "presentation",
|
|
242
|
+
className: withBaseName("measureContainer"),
|
|
243
|
+
children: hiddenValues.map((value) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
244
|
+
TabSlot.TabSlot,
|
|
245
|
+
{
|
|
246
|
+
slotId: `measure:${value}`,
|
|
247
|
+
value
|
|
248
|
+
},
|
|
249
|
+
`measure-${value}`
|
|
250
|
+
))
|
|
251
|
+
}
|
|
252
|
+
) : null,
|
|
107
253
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
108
254
|
TabOverflowList.TabOverflowList,
|
|
109
255
|
{
|
|
110
|
-
isMeasuring,
|
|
111
256
|
buttonRef: overflowButtonRef,
|
|
112
|
-
|
|
257
|
+
hiddenValues,
|
|
113
258
|
open: menuOpen,
|
|
259
|
+
order: renderedTabs.length,
|
|
114
260
|
setOpen: setMenuOpen,
|
|
115
|
-
|
|
261
|
+
ref: overflowListRef
|
|
116
262
|
}
|
|
117
263
|
)
|
|
118
|
-
]
|
|
264
|
+
] }) })
|
|
119
265
|
}
|
|
120
266
|
);
|
|
121
267
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabListNext.js","sources":["../src/tabs-next/TabListNext.tsx"],"sourcesContent":["import { capitalize, makePrefixer, useForkRef, useId } 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 forwardRef,\n type KeyboardEvent,\n useRef,\n} from \"react\";\nimport { useOverflow } from \"./hooks/useOverflow\";\nimport { useRestoreActiveTab } from \"./hooks/useRestoreActiveTab\";\nimport tablistNextCss from \"./TabListNext.css\";\nimport { TabOverflowList } from \"./TabOverflowList\";\nimport { useTabsNext } from \"./TabsNextContext\";\n\nconst withBaseName = makePrefixer(\"saltTabListNext\");\n\nexport interface TabListNextProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * Styling active color variant. Defaults to \"primary\".\n */\n activeColor?: \"primary\" | \"secondary\" | \"tertiary\";\n /**\n * The appearance of the tabs. Defaults to \"bordered\".\n */\n appearance?: \"bordered\" | \"transparent\";\n}\n\nexport const TabListNext = forwardRef<HTMLDivElement, TabListNextProps>(\n function TabstripNext(props, ref) {\n const {\n appearance = \"bordered\",\n activeColor = \"primary\",\n \"aria-describedby\": ariaDescribedBy,\n children,\n className,\n onKeyDown,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tablist-next\",\n css: tablistNextCss,\n window: targetWindow,\n });\n\n const {\n selected,\n getNext,\n getPrevious,\n getFirst,\n getLast,\n items,\n activeTab,\n menuOpen,\n setMenuOpen,\n removedActiveTabRef,\n } = useTabsNext();\n\n const tabstripRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(tabstripRef, ref);\n const overflowButtonRef = useRef<HTMLButtonElement>(null);\n\n const [visible, hidden, isMeasuring, realSelectedIndexRef] = useOverflow({\n container: tabstripRef,\n tabs: items,\n children,\n selected,\n overflowButton: overflowButtonRef,\n });\n\n useRestoreActiveTab({\n container: tabstripRef,\n tabs: items,\n realSelectedIndex: realSelectedIndexRef,\n removedActiveTabRef,\n });\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n const actionMap = {\n ArrowRight: getNext,\n ArrowLeft: getPrevious,\n Home: getFirst,\n End: getLast,\n ArrowUp: menuOpen ? getPrevious : undefined,\n ArrowDown: menuOpen ? getNext : undefined,\n };\n\n const action = actionMap[event.key as keyof typeof actionMap];\n\n if (action) {\n event.preventDefault();\n const activeTabId = activeTab.current?.id;\n if (!activeTabId) return;\n const nextItem = action(activeTabId);\n if (nextItem) {\n nextItem.element?.parentElement?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n nextItem.element?.focus({ preventScroll: true });\n }\n }\n };\n\n const warningId = useId();\n\n return (\n <div\n role=\"tablist\"\n className={clsx(\n withBaseName(),\n withBaseName(appearance),\n withBaseName(\"horizontal\"),\n withBaseName(`activeColor${capitalize(activeColor)}`),\n className,\n )}\n data-ismeasuring={isMeasuring ? true : undefined}\n ref={handleRef}\n onKeyDown={handleKeyDown}\n aria-describedby={clsx(ariaDescribedBy, warningId) || undefined}\n {...rest}\n >\n {!isMeasuring && hidden.length > 0 && (\n <span id={warningId} className={withBaseName(\"overflowWarning\")}>\n Note: This tab list includes overflow; tab positions may be\n inaccurate or change when a tab is selected\n </span>\n )}\n {visible}\n <TabOverflowList\n isMeasuring={isMeasuring}\n buttonRef={overflowButtonRef}\n tabstripRef={tabstripRef}\n open={menuOpen}\n setOpen={setMenuOpen}\n >\n {hidden}\n </TabOverflowList>\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","useWindow","useComponentCssInjection","tablistNextCss","useTabsNext","useRef","useForkRef","useOverflow","useRestoreActiveTab","useId","jsxs","clsx","capitalize","jsx","TabOverflowList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TabListNext.js","sources":["../src/tabs-next/TabListNext.tsx"],"sourcesContent":["import {\n capitalize,\n makePrefixer,\n useAriaAnnouncer,\n useForkRef,\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 forwardRef,\n type KeyboardEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useFocusWithRetry } from \"./hooks/useFocusWithRetry\";\nimport { useOverflow } from \"./hooks/useOverflow\";\nimport { useOverflowLayoutState } from \"./hooks/useOverflowLayoutState\";\nimport { useTabListRecovery } from \"./hooks/useTabListRecovery\";\nimport { useTabRemovalHandler } from \"./hooks/useTabRemovalHandler\";\nimport { useTabSelectionFocus } from \"./hooks/useTabSelectionFocus\";\nimport { TabListLayoutContext } from \"./TabListLayoutContext\";\nimport tablistNextCss from \"./TabListNext.css\";\nimport { TabOverflowList } from \"./TabOverflowList\";\nimport { TabSlot } from \"./TabSlot\";\nimport { TabSlotRegistryContext } from \"./TabSlotRegistryContext\";\nimport { useTabsNext } from \"./TabsNextContext\";\n\nconst withBaseName = makePrefixer(\"saltTabListNext\");\nconst MAX_FOCUS_RETRY_ATTEMPTS = 120;\n\nexport interface TabListNextProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * Styling active color variant. Defaults to \"primary\".\n */\n activeColor?: \"primary\" | \"secondary\" | \"tertiary\";\n /**\n * The appearance of the tabs. Defaults to \"bordered\".\n */\n appearance?: \"bordered\" | \"transparent\";\n}\n\nexport const TabListNext = forwardRef<HTMLDivElement, TabListNextProps>(\n function TabListNext(props, ref) {\n const {\n appearance = \"bordered\",\n activeColor = \"primary\",\n children,\n className,\n onKeyDown,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tablist-next\",\n css: tablistNextCss,\n window: targetWindow,\n });\n\n const {\n renderMode,\n selected,\n setSelected,\n setBootstrapOverflowReady,\n getNext,\n getPrevious,\n getFirst,\n getLast,\n getIndex,\n item,\n itemAt,\n activeTab,\n selectionFromOverflowValueRef,\n menuOpen,\n setMenuOpen,\n sortItems,\n getRemovedItems,\n getRenderedTab,\n renderedTabs,\n removalVersion,\n } = useTabsNext();\n\n const tabstripRef = useRef<HTMLDivElement>(null);\n const overflowListRef = useRef<HTMLDivElement>(null);\n const slotMapRef = useRef<Map<string, HTMLDivElement>>(new Map());\n const removalRecoveryRafRef = useRef<number | null>(null);\n const pendingRemovalRecoveryRef = useRef(false);\n const pendingRemovalRecoveryRetriesRef = useRef(0);\n const [slotVersion, setSlotVersion] = useState(0);\n\n const handleRef = useForkRef(tabstripRef, ref);\n const overflowButtonRef = useRef<HTMLButtonElement>(null);\n\n const { announce } = useAriaAnnouncer();\n const overflowMenuOpen = renderMode === \"portal\" ? menuOpen : false;\n\n const [visibleValues, hiddenValues, isMeasuring] = useOverflow({\n container: tabstripRef,\n menuOpen: overflowMenuOpen,\n selected,\n tabs: renderedTabs,\n overflowButton: overflowButtonRef,\n });\n\n useEffect(() => {\n setBootstrapOverflowReady(\n renderMode === \"inline\" && renderedTabs.length > 0 && !isMeasuring,\n );\n }, [\n isMeasuring,\n renderMode,\n renderedTabs.length,\n setBootstrapOverflowReady,\n ]);\n\n const { resolvedOverflowActiveValue, tabListLayoutContext } =\n useOverflowLayoutState({\n hiddenValues,\n menuOpen,\n overflowMenuOpen,\n visibleValues,\n });\n const registerSlot = useCallback(\n (slotId: string, element: HTMLDivElement | null) => {\n const currentElement = slotMapRef.current.get(slotId) ?? null;\n if (currentElement === element) {\n return;\n }\n\n if (element) {\n slotMapRef.current.set(slotId, element);\n } else {\n slotMapRef.current.delete(slotId);\n }\n\n setSlotVersion((currentVersion) => currentVersion + 1);\n },\n [],\n );\n const slotRegistryContext = useMemo(\n () => ({ registerSlot }),\n [registerSlot],\n );\n const slotAssignments = useMemo(() => {\n const nextAssignments = new Map<string, string>();\n\n for (const value of visibleValues) {\n nextAssignments.set(value, `main:${value}`);\n }\n\n for (const value of hiddenValues) {\n nextAssignments.set(\n value,\n menuOpen ? `overflow:${value}` : `measure:${value}`,\n );\n }\n\n return {\n map: nextAssignments,\n version: slotVersion,\n };\n }, [hiddenValues, menuOpen, slotVersion, visibleValues]);\n\n useIsomorphicLayoutEffect(() => {\n if (renderMode !== \"portal\") {\n return;\n }\n\n for (const [value, slotId] of slotAssignments.map) {\n const host = getRenderedTab(value)?.host;\n const slot = slotMapRef.current.get(slotId);\n\n if (host && slot && host.parentElement !== slot) {\n slot.appendChild(host);\n }\n }\n }, [getRenderedTab, renderMode, slotAssignments]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (menuOpen) return;\n\n const actionMap = {\n ArrowRight: getNext,\n ArrowLeft: getPrevious,\n Home: getFirst,\n End: getLast,\n };\n\n const action = actionMap[event.key as keyof typeof actionMap];\n\n if (action) {\n event.preventDefault();\n // Item registration/sorting is raf-driven; flush before keyboard nav to\n // avoid navigating against stale collection order/registration.\n sortItems();\n const activeTabId = activeTab.current?.id;\n if (!activeTabId) return;\n const nextItem = action(activeTabId);\n if (nextItem) {\n // Scrolling is handled by TabTrigger.\n nextItem.element?.focus({ preventScroll: true });\n }\n }\n };\n\n const getSelectedTabElement = useCallback(() => {\n return (\n tabstripRef.current?.querySelector<HTMLElement>(\n '[role=\"tab\"][aria-selected=\"true\"]',\n ) ?? item(activeTab.current?.id)?.element\n );\n }, [item, activeTab]);\n const { focusElementWithRetry } = useFocusWithRetry({\n maxAttempts: MAX_FOCUS_RETRY_ATTEMPTS,\n targetWindow,\n });\n useTabSelectionFocus({\n announce,\n focusElementWithRetry,\n getRenderedTab,\n getSelectedTabElement,\n menuOpen,\n resolvedOverflowActiveValue,\n selected,\n selectionFromOverflowValueRef,\n targetWindow,\n });\n\n const handleTabRemoval = useTabRemovalHandler({\n activeTab,\n focusElementWithRetry,\n getFirst,\n getIndex,\n getLast,\n getRemovedItems,\n getRenderedTab,\n getSelectedTabElement,\n item,\n itemAt,\n maxRetryAttempts: MAX_FOCUS_RETRY_ATTEMPTS,\n menuOpen,\n overflowButtonRef,\n overflowListRef,\n pendingRemovalRecoveryRef,\n pendingRemovalRecoveryRetriesRef,\n removalRecoveryRafRef,\n selected,\n setSelected,\n tabstripRef,\n targetWindow,\n });\n\n useTabListRecovery({\n removalVersion,\n targetWindow,\n tabstripRef,\n overflowListRef,\n handleTabRemoval,\n pendingRemovalRecoveryRef,\n pendingRemovalRecoveryRetriesRef,\n });\n\n return (\n <div\n role=\"tablist\"\n className={clsx(\n withBaseName(),\n withBaseName(appearance),\n withBaseName(\"horizontal\"),\n withBaseName(`activeColor${capitalize(activeColor)}`),\n className,\n )}\n data-ismeasuring={\n renderMode === \"portal\" && isMeasuring ? true : undefined\n }\n ref={handleRef}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {renderMode === \"inline\" ? (\n children\n ) : (\n <TabSlotRegistryContext.Provider value={slotRegistryContext}>\n <TabListLayoutContext.Provider value={tabListLayoutContext}>\n {children}\n {visibleValues.map((value) => (\n <TabSlot key={value} slotId={`main:${value}`} value={value} />\n ))}\n {!menuOpen && hiddenValues.length > 0 ? (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n className={withBaseName(\"measureContainer\")}\n >\n {hiddenValues.map((value) => (\n <TabSlot\n key={`measure-${value}`}\n slotId={`measure:${value}`}\n value={value}\n />\n ))}\n </div>\n ) : null}\n <TabOverflowList\n buttonRef={overflowButtonRef}\n hiddenValues={hiddenValues}\n open={menuOpen}\n order={renderedTabs.length}\n setOpen={setMenuOpen}\n ref={overflowListRef}\n />\n </TabListLayoutContext.Provider>\n </TabSlotRegistryContext.Provider>\n )}\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabListNext","useWindow","useComponentCssInjection","tablistNextCss","useTabsNext","useRef","useState","useForkRef","useAriaAnnouncer","useOverflow","useEffect","useOverflowLayoutState","useCallback","useMemo","useIsomorphicLayoutEffect","useFocusWithRetry","useTabSelectionFocus","useTabRemovalHandler","useTabListRecovery","jsx","clsx","capitalize","TabSlotRegistryContext","jsxs","TabListLayoutContext","TabSlot","TabOverflowList"],"mappings":"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"}
|