@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.
Files changed (171) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/css/salt-lab.css +53 -25
  3. package/dist-cjs/list-deprecated/ListStateContext.js +1 -1
  4. package/dist-cjs/list-deprecated/ListStateContext.js.map +1 -1
  5. package/dist-cjs/tabs-next/TabBar.css.js +1 -1
  6. package/dist-cjs/tabs-next/TabBar.js +1 -1
  7. package/dist-cjs/tabs-next/TabBar.js.map +1 -1
  8. package/dist-cjs/tabs-next/TabListLayoutContext.js +13 -0
  9. package/dist-cjs/tabs-next/TabListLayoutContext.js.map +1 -0
  10. package/dist-cjs/tabs-next/TabListNext.css.js +1 -1
  11. package/dist-cjs/tabs-next/TabListNext.js +179 -33
  12. package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
  13. package/dist-cjs/tabs-next/TabNext.js +111 -7
  14. package/dist-cjs/tabs-next/TabNext.js.map +1 -1
  15. package/dist-cjs/tabs-next/TabNextAction.js +25 -2
  16. package/dist-cjs/tabs-next/TabNextAction.js.map +1 -1
  17. package/dist-cjs/tabs-next/TabNextPanel.js +31 -16
  18. package/dist-cjs/tabs-next/TabNextPanel.js.map +1 -1
  19. package/dist-cjs/tabs-next/TabNextTrigger.js +110 -9
  20. package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
  21. package/dist-cjs/tabs-next/TabOverflowList.css.js +1 -1
  22. package/dist-cjs/tabs-next/TabOverflowList.js +168 -64
  23. package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
  24. package/dist-cjs/tabs-next/TabSlot.js +30 -0
  25. package/dist-cjs/tabs-next/TabSlot.js.map +1 -0
  26. package/dist-cjs/tabs-next/TabSlotRegistryContext.js +16 -0
  27. package/dist-cjs/tabs-next/TabSlotRegistryContext.js.map +1 -0
  28. package/dist-cjs/tabs-next/TabsNext.css.js +6 -0
  29. package/dist-cjs/tabs-next/TabsNext.css.js.map +1 -0
  30. package/dist-cjs/tabs-next/TabsNext.js +113 -47
  31. package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
  32. package/dist-cjs/tabs-next/TabsNextContext.js +17 -3
  33. package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
  34. package/dist-cjs/tabs-next/domUtils.js +13 -0
  35. package/dist-cjs/tabs-next/domUtils.js.map +1 -0
  36. package/dist-cjs/tabs-next/hooks/overflowMath.js +86 -0
  37. package/dist-cjs/tabs-next/hooks/overflowMath.js.map +1 -0
  38. package/dist-cjs/tabs-next/hooks/useCollection.js +147 -41
  39. package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
  40. package/dist-cjs/tabs-next/hooks/useFocusWithRetry.js +64 -0
  41. package/dist-cjs/tabs-next/hooks/useFocusWithRetry.js.map +1 -0
  42. package/dist-cjs/tabs-next/hooks/useOverflow.js +240 -156
  43. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  44. package/dist-cjs/tabs-next/hooks/useOverflowLayoutState.js +99 -0
  45. package/dist-cjs/tabs-next/hooks/useOverflowLayoutState.js.map +1 -0
  46. package/dist-cjs/tabs-next/hooks/useOverflowSelectionState.js +60 -0
  47. package/dist-cjs/tabs-next/hooks/useOverflowSelectionState.js.map +1 -0
  48. package/dist-cjs/tabs-next/hooks/useRenderedTabWidth.js +92 -0
  49. package/dist-cjs/tabs-next/hooks/useRenderedTabWidth.js.map +1 -0
  50. package/dist-cjs/tabs-next/hooks/useRenderedTabsRegistry.js +200 -0
  51. package/dist-cjs/tabs-next/hooks/useRenderedTabsRegistry.js.map +1 -0
  52. package/dist-cjs/tabs-next/hooks/useTabListRecovery.js +76 -0
  53. package/dist-cjs/tabs-next/hooks/useTabListRecovery.js.map +1 -0
  54. package/dist-cjs/tabs-next/hooks/useTabRemovalHandler.js +165 -0
  55. package/dist-cjs/tabs-next/hooks/useTabRemovalHandler.js.map +1 -0
  56. package/dist-cjs/tabs-next/hooks/useTabSelectionFocus.js +80 -0
  57. package/dist-cjs/tabs-next/hooks/useTabSelectionFocus.js.map +1 -0
  58. package/dist-cjs/tabs-next/widthMeasurement.js +42 -0
  59. package/dist-cjs/tabs-next/widthMeasurement.js.map +1 -0
  60. package/dist-cjs/tree/Tree.css.js +1 -1
  61. package/dist-cjs/tree/TreeNode.css.js +1 -1
  62. package/dist-cjs/tree/TreeNode.js +1 -1
  63. package/dist-cjs/tree/TreeNode.js.map +1 -1
  64. package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +1 -1
  65. package/dist-cjs/tree/TreeNodeTrigger.css.js +1 -1
  66. package/dist-cjs/tree/TreeNodeTrigger.js +2 -2
  67. package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -1
  68. package/dist-cjs/utils/useEventCallback.js +5 -5
  69. package/dist-cjs/utils/useEventCallback.js.map +1 -1
  70. package/dist-es/list-deprecated/ListStateContext.js +1 -1
  71. package/dist-es/list-deprecated/ListStateContext.js.map +1 -1
  72. package/dist-es/tabs-next/TabBar.css.js +1 -1
  73. package/dist-es/tabs-next/TabBar.js +1 -1
  74. package/dist-es/tabs-next/TabBar.js.map +1 -1
  75. package/dist-es/tabs-next/TabListLayoutContext.js +10 -0
  76. package/dist-es/tabs-next/TabListLayoutContext.js.map +1 -0
  77. package/dist-es/tabs-next/TabListNext.css.js +1 -1
  78. package/dist-es/tabs-next/TabListNext.js +182 -36
  79. package/dist-es/tabs-next/TabListNext.js.map +1 -1
  80. package/dist-es/tabs-next/TabNext.js +113 -9
  81. package/dist-es/tabs-next/TabNext.js.map +1 -1
  82. package/dist-es/tabs-next/TabNextAction.js +25 -2
  83. package/dist-es/tabs-next/TabNextAction.js.map +1 -1
  84. package/dist-es/tabs-next/TabNextPanel.js +31 -16
  85. package/dist-es/tabs-next/TabNextPanel.js.map +1 -1
  86. package/dist-es/tabs-next/TabNextTrigger.js +110 -9
  87. package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
  88. package/dist-es/tabs-next/TabOverflowList.css.js +1 -1
  89. package/dist-es/tabs-next/TabOverflowList.js +172 -68
  90. package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
  91. package/dist-es/tabs-next/TabSlot.js +28 -0
  92. package/dist-es/tabs-next/TabSlot.js.map +1 -0
  93. package/dist-es/tabs-next/TabSlotRegistryContext.js +13 -0
  94. package/dist-es/tabs-next/TabSlotRegistryContext.js.map +1 -0
  95. package/dist-es/tabs-next/TabsNext.css.js +4 -0
  96. package/dist-es/tabs-next/TabsNext.css.js.map +1 -0
  97. package/dist-es/tabs-next/TabsNext.js +114 -48
  98. package/dist-es/tabs-next/TabsNext.js.map +1 -1
  99. package/dist-es/tabs-next/TabsNextContext.js +17 -3
  100. package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
  101. package/dist-es/tabs-next/domUtils.js +11 -0
  102. package/dist-es/tabs-next/domUtils.js.map +1 -0
  103. package/dist-es/tabs-next/hooks/overflowMath.js +82 -0
  104. package/dist-es/tabs-next/hooks/overflowMath.js.map +1 -0
  105. package/dist-es/tabs-next/hooks/useCollection.js +148 -42
  106. package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
  107. package/dist-es/tabs-next/hooks/useFocusWithRetry.js +62 -0
  108. package/dist-es/tabs-next/hooks/useFocusWithRetry.js.map +1 -0
  109. package/dist-es/tabs-next/hooks/useOverflow.js +242 -158
  110. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  111. package/dist-es/tabs-next/hooks/useOverflowLayoutState.js +97 -0
  112. package/dist-es/tabs-next/hooks/useOverflowLayoutState.js.map +1 -0
  113. package/dist-es/tabs-next/hooks/useOverflowSelectionState.js +58 -0
  114. package/dist-es/tabs-next/hooks/useOverflowSelectionState.js.map +1 -0
  115. package/dist-es/tabs-next/hooks/useRenderedTabWidth.js +90 -0
  116. package/dist-es/tabs-next/hooks/useRenderedTabWidth.js.map +1 -0
  117. package/dist-es/tabs-next/hooks/useRenderedTabsRegistry.js +198 -0
  118. package/dist-es/tabs-next/hooks/useRenderedTabsRegistry.js.map +1 -0
  119. package/dist-es/tabs-next/hooks/useTabListRecovery.js +74 -0
  120. package/dist-es/tabs-next/hooks/useTabListRecovery.js.map +1 -0
  121. package/dist-es/tabs-next/hooks/useTabRemovalHandler.js +163 -0
  122. package/dist-es/tabs-next/hooks/useTabRemovalHandler.js.map +1 -0
  123. package/dist-es/tabs-next/hooks/useTabSelectionFocus.js +78 -0
  124. package/dist-es/tabs-next/hooks/useTabSelectionFocus.js.map +1 -0
  125. package/dist-es/tabs-next/widthMeasurement.js +36 -0
  126. package/dist-es/tabs-next/widthMeasurement.js.map +1 -0
  127. package/dist-es/tree/Tree.css.js +1 -1
  128. package/dist-es/tree/TreeNode.css.js +1 -1
  129. package/dist-es/tree/TreeNode.js +1 -1
  130. package/dist-es/tree/TreeNode.js.map +1 -1
  131. package/dist-es/tree/TreeNodeExpansionIcon.css.js +1 -1
  132. package/dist-es/tree/TreeNodeTrigger.css.js +1 -1
  133. package/dist-es/tree/TreeNodeTrigger.js +2 -2
  134. package/dist-es/tree/TreeNodeTrigger.js.map +1 -1
  135. package/dist-es/utils/useEventCallback.js +5 -5
  136. package/dist-es/utils/useEventCallback.js.map +1 -1
  137. package/dist-types/cascading-menu/internal/useMenuTriggerHandlers.d.ts +1 -1
  138. package/dist-types/list-deprecated/ListStateContext.d.ts +7 -2
  139. package/dist-types/tabs-next/TabListLayoutContext.d.ts +9 -0
  140. package/dist-types/tabs-next/TabNext.d.ts +1 -1
  141. package/dist-types/tabs-next/TabNextPanel.d.ts +2 -1
  142. package/dist-types/tabs-next/TabOverflowList.d.ts +3 -4
  143. package/dist-types/tabs-next/TabSlot.d.ts +6 -0
  144. package/dist-types/tabs-next/TabSlotRegistryContext.d.ts +5 -0
  145. package/dist-types/tabs-next/TabsNext.d.ts +2 -1
  146. package/dist-types/tabs-next/TabsNextContext.d.ts +26 -4
  147. package/dist-types/tabs-next/domUtils.d.ts +1 -0
  148. package/dist-types/tabs-next/hooks/overflowMath.d.ts +18 -0
  149. package/dist-types/tabs-next/hooks/useCollection.d.ts +15 -3
  150. package/dist-types/tabs-next/hooks/useFocusWithRetry.d.ts +9 -0
  151. package/dist-types/tabs-next/hooks/useOverflow.d.ts +5 -5
  152. package/dist-types/tabs-next/hooks/useOverflowLayoutState.d.ts +13 -0
  153. package/dist-types/tabs-next/hooks/useOverflowSelectionState.d.ts +13 -0
  154. package/dist-types/tabs-next/hooks/useRenderedTabWidth.d.ts +12 -0
  155. package/dist-types/tabs-next/hooks/useRenderedTabsRegistry.d.ts +12 -0
  156. package/dist-types/tabs-next/hooks/useTabListRecovery.d.ts +12 -0
  157. package/dist-types/tabs-next/hooks/useTabRemovalHandler.d.ts +32 -0
  158. package/dist-types/tabs-next/hooks/useTabSelectionFocus.d.ts +15 -0
  159. package/dist-types/tabs-next/widthMeasurement.d.ts +5 -0
  160. package/dist-types/utils/useEventCallback.d.ts +1 -1
  161. package/package.json +2 -2
  162. package/dist-cjs/tabs-next/hooks/useFocusOutside.js +0 -25
  163. package/dist-cjs/tabs-next/hooks/useFocusOutside.js.map +0 -1
  164. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js +0 -93
  165. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +0 -1
  166. package/dist-es/tabs-next/hooks/useFocusOutside.js +0 -23
  167. package/dist-es/tabs-next/hooks/useFocusOutside.js.map +0 -1
  168. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js +0 -91
  169. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +0 -1
  170. package/dist-types/tabs-next/hooks/useFocusOutside.d.ts +0 -2
  171. 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-overflowWarning {
2998
- display: none;
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: center;
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: center;
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-border) * -1) 0 0 var(--salt-selectable-borderColor-selected), 0 var(--salt-size-border) 0 0 var(--salt-selectable-borderColor-selected);
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
- width: var(--salt-size-selectable);
3822
- height: var(--salt-size-selectable);
3823
- min-width: var(--salt-size-selectable);
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/4ab77bbb-d93c-4e89-bc2e-478a2cbac219.css */
4275
+ /* src/133f6296-6356-4cbf-8225-c555b1a7031b.css */
@@ -2,7 +2,7 @@
2
2
 
3
3
  var react = require('react');
4
4
 
5
- const ListStateContext = react.createContext();
5
+ const ListStateContext = react.createContext(void 0);
6
6
  const useListStateContext = () => {
7
7
  const context = react.useContext(ListStateContext);
8
8
  if (!context) {
@@ -1 +1 @@
1
- {"version":3,"file":"ListStateContext.js","sources":["../src/list-deprecated/ListStateContext.js"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\nexport const ListStateContext = createContext();\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":";;;;AAEO,MAAM,mBAAmBA,mBAAA;AAEzB,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
+ {"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 position: relative;\n box-sizing: border-box;\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";
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
@@ -31,7 +31,7 @@ const TabBar = react.forwardRef(
31
31
  ),
32
32
  ...rest,
33
33
  ref,
34
- children
34
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("strip"), children })
35
35
  }
36
36
  );
37
37
  }
@@ -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}\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,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
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: 100%;\n min-width: 0;\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-overflowWarning {\n display: none;\n}\n";
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 useRestoreActiveTab = require('./hooks/useRestoreActiveTab.js');
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 TabstripNext(props, ref) {
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
- items,
49
+ getIndex,
50
+ item,
51
+ itemAt,
40
52
  activeTab,
53
+ selectionFromOverflowValueRef,
41
54
  menuOpen,
42
55
  setMenuOpen,
43
- removedActiveTabRef
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 [visible, hidden, isMeasuring, realSelectedIndexRef] = useOverflow.useOverflow({
71
+ const { announce } = core.useAriaAnnouncer();
72
+ const overflowMenuOpen = renderMode === "portal" ? menuOpen : false;
73
+ const [visibleValues, hiddenValues, isMeasuring] = useOverflow.useOverflow({
49
74
  container: tabstripRef,
50
- tabs: items,
51
- children,
75
+ menuOpen: overflowMenuOpen,
52
76
  selected,
77
+ tabs: renderedTabs,
53
78
  overflowButton: overflowButtonRef
54
79
  });
55
- useRestoreActiveTab.useRestoreActiveTab({
56
- container: tabstripRef,
57
- tabs: items,
58
- realSelectedIndex: realSelectedIndexRef,
59
- removedActiveTabRef
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, _c, _d;
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
- (_c = (_b = nextItem.element) == null ? void 0 : _b.parentElement) == null ? void 0 : _c.scrollIntoView({
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 warningId = core.useId();
88
- return /* @__PURE__ */ jsxRuntime.jsxs(
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
- !isMeasuring && hidden.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { id: warningId, className: withBaseName("overflowWarning"), children: "Note: This tab list includes overflow; tab positions may be inaccurate or change when a tab is selected" }),
106
- visible,
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
- tabstripRef,
257
+ hiddenValues,
113
258
  open: menuOpen,
259
+ order: renderedTabs.length,
114
260
  setOpen: setMenuOpen,
115
- children: hidden
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":";;;;;;;;;;;;;;;;;;;;;AAiCA,MAAM,YAAA,GAAeA,kBAAa,iBAAiB,CAAA;AACnD,MAAM,wBAAA,GAA2B,GAAA;AAc1B,MAAM,WAAA,GAAcC,gBAAA;AAAA,EACzB,SAASC,YAAAA,CAAY,KAAA,EAAO,GAAA,EAAK;AAC/B,IAAA,MAAM;AAAA,MACJ,UAAA,GAAa,UAAA;AAAA,MACb,WAAA,GAAc,SAAA;AAAA,MACd,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AACJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,mBAAA;AAAA,MACR,GAAA,EAAKC,aAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM;AAAA,MACJ,UAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,yBAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,6BAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,QACEC,2BAAA,EAAY;AAEhB,IAAA,MAAM,WAAA,GAAcC,aAAuB,IAAI,CAAA;AAC/C,IAAA,MAAM,eAAA,GAAkBA,aAAuB,IAAI,CAAA;AACnD,IAAA,MAAM,UAAA,GAAaA,YAAA,iBAAoC,IAAI,GAAA,EAAK,CAAA;AAChE,IAAA,MAAM,qBAAA,GAAwBA,aAAsB,IAAI,CAAA;AACxD,IAAA,MAAM,yBAAA,GAA4BA,aAAO,KAAK,CAAA;AAC9C,IAAA,MAAM,gCAAA,GAAmCA,aAAO,CAAC,CAAA;AACjD,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAS,CAAC,CAAA;AAEhD,IAAA,MAAM,SAAA,GAAYC,eAAA,CAAW,WAAA,EAAa,GAAG,CAAA;AAC7C,IAAA,MAAM,iBAAA,GAAoBF,aAA0B,IAAI,CAAA;AAExD,IAAA,MAAM,EAAE,QAAA,EAAS,GAAIG,qBAAA,EAAiB;AACtC,IAAA,MAAM,gBAAA,GAAmB,UAAA,KAAe,QAAA,GAAW,QAAA,GAAW,KAAA;AAE9D,IAAA,MAAM,CAAC,aAAA,EAAe,YAAA,EAAc,WAAW,IAAIC,uBAAA,CAAY;AAAA,MAC7D,SAAA,EAAW,WAAA;AAAA,MACX,QAAA,EAAU,gBAAA;AAAA,MACV,QAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,yBAAA;AAAA,QACE,UAAA,KAAe,QAAA,IAAY,YAAA,CAAa,MAAA,GAAS,KAAK,CAAC;AAAA,OACzD;AAAA,IACF,CAAA,EAAG;AAAA,MACD,WAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA,CAAa,MAAA;AAAA,MACb;AAAA,KACD,CAAA;AAED,IAAA,MAAM,EAAE,2BAAA,EAA6B,oBAAA,EAAqB,GACxDC,6CAAA,CAAuB;AAAA,MACrB,YAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AACH,IAAA,MAAM,YAAA,GAAeC,iBAAA;AAAA,MACnB,CAAC,QAAgB,OAAA,KAAmC;AAClD,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AACzD,QAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,QACxC,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,QAClC;AAEA,QAAA,cAAA,CAAe,CAAC,cAAA,KAAmB,cAAA,GAAiB,CAAC,CAAA;AAAA,MACvD,CAAA;AAAA,MACA;AAAC,KACH;AACA,IAAA,MAAM,mBAAA,GAAsBC,aAAA;AAAA,MAC1B,OAAO,EAAE,YAAA,EAAa,CAAA;AAAA,MACtB,CAAC,YAAY;AAAA,KACf;AACA,IAAA,MAAM,eAAA,GAAkBA,cAAQ,MAAM;AACpC,MAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAEhD,MAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,QAAA,eAAA,CAAgB,GAAA,CAAI,KAAA,EAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5C;AAEA,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,QAAA,eAAA,CAAgB,GAAA;AAAA,UACd,KAAA;AAAA,UACA,QAAA,GAAW,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,GAAK,WAAW,KAAK,CAAA;AAAA,SACnD;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,eAAA;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,GAAG,CAAC,YAAA,EAAc,QAAA,EAAU,WAAA,EAAa,aAAa,CAAC,CAAA;AAEvD,IAAAC,8BAAA,CAA0B,MAAM;AAzKpC,MAAA,IAAA,EAAA;AA0KM,MAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,gBAAgB,GAAA,EAAK;AACjD,QAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,cAAA,CAAe,KAAK,CAAA,KAApB,IAAA,GAAA,MAAA,GAAA,EAAA,CAAuB,IAAA;AACpC,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAE1C,QAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,IAAA,CAAK,aAAA,KAAkB,IAAA,EAAM;AAC/C,UAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF,CAAA,EAAG,CAAC,cAAA,EAAgB,UAAA,EAAY,eAAe,CAAC,CAAA;AAEhD,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyC;AAxLpE,MAAA,IAAA,EAAA,EAAA,EAAA;AAyLM,MAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAY,KAAA,CAAA;AAEZ,MAAA,IAAI,QAAA,EAAU;AAEd,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW,WAAA;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK;AAAA,OACP;AAEA,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,GAA6B,CAAA;AAE5D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,CAAM,cAAA,EAAe;AAGrB,QAAA,SAAA,EAAU;AACV,QAAA,MAAM,WAAA,GAAA,CAAc,EAAA,GAAA,SAAA,CAAU,OAAA,KAAV,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,CAAA,EAAA,GAAA,QAAA,CAAS,OAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,KAAA,CAAM,EAAE,eAAe,IAAA,EAAK,CAAA;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwBF,kBAAY,MAAM;AArNpD,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAsNM,MAAA,OAAA,CAAA,CACE,EAAA,GAAA,WAAA,CAAY,YAAZ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,aAAA;AAAA,QACnB;AAAA,OAAA,MAAA,CACG,WAAK,EAAA,GAAA,SAAA,CAAU,OAAA,KAAV,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,EAAE,MAA1B,IAAA,GAAA,MAAA,GAAA,EAAA,CAA6B,OAAA,CAAA;AAAA,IAEtC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,EAAE,qBAAA,EAAsB,GAAIG,mCAAA,CAAkB;AAAA,MAClD,WAAA,EAAa,wBAAA;AAAA,MACb;AAAA,KACD,CAAA;AACD,IAAAC,yCAAA,CAAqB;AAAA,MACnB,QAAA;AAAA,MACA,qBAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAA;AAAA,MACA,QAAA;AAAA,MACA,2BAAA;AAAA,MACA,QAAA;AAAA,MACA,6BAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,mBAAmBC,yCAAA,CAAqB;AAAA,MAC5C,SAAA;AAAA,MACA,qBAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,gBAAA,EAAkB,wBAAA;AAAA,MAClB,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,yBAAA;AAAA,MACA,gCAAA;AAAA,MACA,qBAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAAC,qCAAA,CAAmB;AAAA,MACjB,cAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,yBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,uBACEC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAWC,SAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,UAAU,CAAA;AAAA,UACvB,aAAa,YAAY,CAAA;AAAA,UACzB,YAAA,CAAa,CAAA,WAAA,EAAcC,eAAA,CAAW,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,UACpD;AAAA,SACF;AAAA,QACA,kBAAA,EACE,UAAA,KAAe,QAAA,IAAY,WAAA,GAAc,IAAA,GAAO,MAAA;AAAA,QAElD,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAW,aAAA;AAAA,QACV,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,UAAA,KAAe,QAAA,GACd,QAAA,mBAEAF,cAAA,CAACG,8CAAuB,QAAA,EAAvB,EAAgC,KAAA,EAAO,mBAAA,EACtC,QAAA,kBAAAC,eAAA,CAACC,yCAAA,CAAqB,QAAA,EAArB,EAA8B,OAAO,oBAAA,EACnC,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,qBAClBL,cAAA,CAACM,eAAA,EAAA,EAAoB,MAAA,EAAQ,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,EAAI,KAAA,EAAA,EAAhC,KAA8C,CAC7D,CAAA;AAAA,UACA,CAAC,QAAA,IAAY,YAAA,CAAa,MAAA,GAAS,CAAA,mBAClCN,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAY,MAAA;AAAA,cACZ,IAAA,EAAK,cAAA;AAAA,cACL,SAAA,EAAW,aAAa,kBAAkB,CAAA;AAAA,cAEzC,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,qBACjBA,cAAA;AAAA,gBAACM,eAAA;AAAA,gBAAA;AAAA,kBAEC,MAAA,EAAQ,WAAW,KAAK,CAAA,CAAA;AAAA,kBACxB;AAAA,iBAAA;AAAA,gBAFK,WAAW,KAAK,CAAA;AAAA,eAIxB;AAAA;AAAA,WACH,GACE,IAAA;AAAA,0BACJN,cAAA;AAAA,YAACO,+BAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,iBAAA;AAAA,cACX,YAAA;AAAA,cACA,IAAA,EAAM,QAAA;AAAA,cACN,OAAO,YAAA,CAAa,MAAA;AAAA,cACpB,OAAA,EAAS,WAAA;AAAA,cACT,GAAA,EAAK;AAAA;AAAA;AACP,SAAA,EACF,CAAA,EACF;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;;;;"}