@salt-ds/core 1.60.0 → 1.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/css/salt-core.css +366 -1
  3. package/dist-cjs/index.js +16 -0
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/navigation-item/NavigationItem.js +2 -0
  6. package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
  7. package/dist-cjs/rating/Rating.css.js +6 -0
  8. package/dist-cjs/rating/Rating.css.js.map +1 -0
  9. package/dist-cjs/rating/Rating.js +140 -0
  10. package/dist-cjs/rating/Rating.js.map +1 -0
  11. package/dist-cjs/rating/RatingItem.css.js +6 -0
  12. package/dist-cjs/rating/RatingItem.css.js.map +1 -0
  13. package/dist-cjs/rating/RatingItem.js +75 -0
  14. package/dist-cjs/rating/RatingItem.js.map +1 -0
  15. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js +22 -20
  16. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  17. package/dist-cjs/tabs/Tab.css.js +6 -0
  18. package/dist-cjs/tabs/Tab.css.js.map +1 -0
  19. package/dist-cjs/tabs/Tab.js +211 -0
  20. package/dist-cjs/tabs/Tab.js.map +1 -0
  21. package/dist-cjs/tabs/TabAction.js +63 -0
  22. package/dist-cjs/tabs/TabAction.js.map +1 -0
  23. package/dist-cjs/tabs/TabBar.css.js +6 -0
  24. package/dist-cjs/tabs/TabBar.css.js.map +1 -0
  25. package/dist-cjs/tabs/TabBar.js +45 -0
  26. package/dist-cjs/tabs/TabBar.js.map +1 -0
  27. package/dist-cjs/tabs/TabList.css.js +6 -0
  28. package/dist-cjs/tabs/TabList.css.js.map +1 -0
  29. package/dist-cjs/tabs/TabList.js +281 -0
  30. package/dist-cjs/tabs/TabList.js.map +1 -0
  31. package/dist-cjs/tabs/TabPanel.css.js +6 -0
  32. package/dist-cjs/tabs/TabPanel.css.js.map +1 -0
  33. package/dist-cjs/tabs/TabPanel.js +98 -0
  34. package/dist-cjs/tabs/TabPanel.js.map +1 -0
  35. package/dist-cjs/tabs/TabTrigger.css.js +6 -0
  36. package/dist-cjs/tabs/TabTrigger.css.js.map +1 -0
  37. package/dist-cjs/tabs/TabTrigger.js +188 -0
  38. package/dist-cjs/tabs/TabTrigger.js.map +1 -0
  39. package/dist-cjs/tabs/Tabs.css.js +6 -0
  40. package/dist-cjs/tabs/Tabs.css.js.map +1 -0
  41. package/dist-cjs/tabs/Tabs.js +200 -0
  42. package/dist-cjs/tabs/Tabs.js.map +1 -0
  43. package/dist-cjs/tabs/internal/contexts/TabContext.js +26 -0
  44. package/dist-cjs/tabs/internal/contexts/TabContext.js.map +1 -0
  45. package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js +19 -0
  46. package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
  47. package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js +22 -0
  48. package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
  49. package/dist-cjs/tabs/internal/contexts/TabsContext.js +50 -0
  50. package/dist-cjs/tabs/internal/contexts/TabsContext.js.map +1 -0
  51. package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js +64 -0
  52. package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
  53. package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js +76 -0
  54. package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
  55. package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js +165 -0
  56. package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
  57. package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js +87 -0
  58. package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
  59. package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js +6 -0
  60. package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
  61. package/dist-cjs/tabs/internal/overflow/TabOverflowList.js +245 -0
  62. package/dist-cjs/tabs/internal/overflow/TabOverflowList.js.map +1 -0
  63. package/dist-cjs/tabs/internal/overflow/TabSlot.js +30 -0
  64. package/dist-cjs/tabs/internal/overflow/TabSlot.js.map +1 -0
  65. package/dist-cjs/tabs/internal/overflow/overflowMath.js +86 -0
  66. package/dist-cjs/tabs/internal/overflow/overflowMath.js.map +1 -0
  67. package/dist-cjs/tabs/internal/overflow/useOverflow.js +273 -0
  68. package/dist-cjs/tabs/internal/overflow/useOverflow.js.map +1 -0
  69. package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js +99 -0
  70. package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
  71. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +68 -0
  72. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
  73. package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js +92 -0
  74. package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
  75. package/dist-cjs/tabs/internal/overflow/widthMeasurement.js +42 -0
  76. package/dist-cjs/tabs/internal/overflow/widthMeasurement.js.map +1 -0
  77. package/dist-cjs/tabs/internal/registry/useCollection.js +197 -0
  78. package/dist-cjs/tabs/internal/registry/useCollection.js.map +1 -0
  79. package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js +206 -0
  80. package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
  81. package/dist-cjs/tabs/internal/utils/domUtils.js +13 -0
  82. package/dist-cjs/tabs/internal/utils/domUtils.js.map +1 -0
  83. package/dist-es/index.js +8 -0
  84. package/dist-es/index.js.map +1 -1
  85. package/dist-es/navigation-item/NavigationItem.js +2 -0
  86. package/dist-es/navigation-item/NavigationItem.js.map +1 -1
  87. package/dist-es/rating/Rating.css.js +4 -0
  88. package/dist-es/rating/Rating.css.js.map +1 -0
  89. package/dist-es/rating/Rating.js +138 -0
  90. package/dist-es/rating/Rating.js.map +1 -0
  91. package/dist-es/rating/RatingItem.css.js +4 -0
  92. package/dist-es/rating/RatingItem.css.js.map +1 -0
  93. package/dist-es/rating/RatingItem.js +73 -0
  94. package/dist-es/rating/RatingItem.js.map +1 -0
  95. package/dist-es/semantic-icon-provider/SemanticIconProvider.js +23 -21
  96. package/dist-es/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  97. package/dist-es/tabs/Tab.css.js +4 -0
  98. package/dist-es/tabs/Tab.css.js.map +1 -0
  99. package/dist-es/tabs/Tab.js +209 -0
  100. package/dist-es/tabs/Tab.js.map +1 -0
  101. package/dist-es/tabs/TabAction.js +61 -0
  102. package/dist-es/tabs/TabAction.js.map +1 -0
  103. package/dist-es/tabs/TabBar.css.js +4 -0
  104. package/dist-es/tabs/TabBar.css.js.map +1 -0
  105. package/dist-es/tabs/TabBar.js +43 -0
  106. package/dist-es/tabs/TabBar.js.map +1 -0
  107. package/dist-es/tabs/TabList.css.js +4 -0
  108. package/dist-es/tabs/TabList.css.js.map +1 -0
  109. package/dist-es/tabs/TabList.js +279 -0
  110. package/dist-es/tabs/TabList.js.map +1 -0
  111. package/dist-es/tabs/TabPanel.css.js +4 -0
  112. package/dist-es/tabs/TabPanel.css.js.map +1 -0
  113. package/dist-es/tabs/TabPanel.js +96 -0
  114. package/dist-es/tabs/TabPanel.js.map +1 -0
  115. package/dist-es/tabs/TabTrigger.css.js +4 -0
  116. package/dist-es/tabs/TabTrigger.css.js.map +1 -0
  117. package/dist-es/tabs/TabTrigger.js +186 -0
  118. package/dist-es/tabs/TabTrigger.js.map +1 -0
  119. package/dist-es/tabs/Tabs.css.js +4 -0
  120. package/dist-es/tabs/Tabs.css.js.map +1 -0
  121. package/dist-es/tabs/Tabs.js +198 -0
  122. package/dist-es/tabs/Tabs.js.map +1 -0
  123. package/dist-es/tabs/internal/contexts/TabContext.js +23 -0
  124. package/dist-es/tabs/internal/contexts/TabContext.js.map +1 -0
  125. package/dist-es/tabs/internal/contexts/TabListLayoutContext.js +16 -0
  126. package/dist-es/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
  127. package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js +19 -0
  128. package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
  129. package/dist-es/tabs/internal/contexts/TabsContext.js +47 -0
  130. package/dist-es/tabs/internal/contexts/TabsContext.js.map +1 -0
  131. package/dist-es/tabs/internal/hooks/useFocusWithRetry.js +62 -0
  132. package/dist-es/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
  133. package/dist-es/tabs/internal/hooks/useTabListRecovery.js +74 -0
  134. package/dist-es/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
  135. package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js +163 -0
  136. package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
  137. package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js +85 -0
  138. package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
  139. package/dist-es/tabs/internal/overflow/TabOverflowList.css.js +4 -0
  140. package/dist-es/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
  141. package/dist-es/tabs/internal/overflow/TabOverflowList.js +243 -0
  142. package/dist-es/tabs/internal/overflow/TabOverflowList.js.map +1 -0
  143. package/dist-es/tabs/internal/overflow/TabSlot.js +28 -0
  144. package/dist-es/tabs/internal/overflow/TabSlot.js.map +1 -0
  145. package/dist-es/tabs/internal/overflow/overflowMath.js +82 -0
  146. package/dist-es/tabs/internal/overflow/overflowMath.js.map +1 -0
  147. package/dist-es/tabs/internal/overflow/useOverflow.js +271 -0
  148. package/dist-es/tabs/internal/overflow/useOverflow.js.map +1 -0
  149. package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js +97 -0
  150. package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
  151. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +66 -0
  152. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
  153. package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js +90 -0
  154. package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
  155. package/dist-es/tabs/internal/overflow/widthMeasurement.js +36 -0
  156. package/dist-es/tabs/internal/overflow/widthMeasurement.js.map +1 -0
  157. package/dist-es/tabs/internal/registry/useCollection.js +195 -0
  158. package/dist-es/tabs/internal/registry/useCollection.js.map +1 -0
  159. package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js +204 -0
  160. package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
  161. package/dist-es/tabs/internal/utils/domUtils.js +11 -0
  162. package/dist-es/tabs/internal/utils/domUtils.js.map +1 -0
  163. package/dist-types/index.d.ts +2 -0
  164. package/dist-types/rating/Rating.d.ts +48 -0
  165. package/dist-types/rating/RatingItem.d.ts +47 -0
  166. package/dist-types/rating/index.d.ts +1 -0
  167. package/dist-types/semantic-icon-provider/SemanticIconProvider.d.ts +21 -19
  168. package/dist-types/tabs/Tab.d.ts +12 -0
  169. package/dist-types/tabs/TabAction.d.ts +4 -0
  170. package/dist-types/tabs/TabBar.d.ts +12 -0
  171. package/dist-types/tabs/TabList.d.ts +12 -0
  172. package/dist-types/tabs/TabPanel.d.ts +9 -0
  173. package/dist-types/tabs/TabTrigger.d.ts +4 -0
  174. package/dist-types/tabs/Tabs.d.ts +20 -0
  175. package/dist-types/tabs/index.d.ts +7 -0
  176. package/dist-types/tabs/internal/contexts/TabContext.d.ts +12 -0
  177. package/dist-types/tabs/internal/contexts/TabListLayoutContext.d.ts +9 -0
  178. package/dist-types/tabs/internal/contexts/TabSlotRegistryContext.d.ts +5 -0
  179. package/dist-types/tabs/internal/contexts/TabsContext.d.ts +43 -0
  180. package/dist-types/tabs/internal/hooks/useFocusWithRetry.d.ts +9 -0
  181. package/dist-types/tabs/internal/hooks/useTabListRecovery.d.ts +12 -0
  182. package/dist-types/tabs/internal/hooks/useTabRemovalHandler.d.ts +32 -0
  183. package/dist-types/tabs/internal/hooks/useTabSelectionFocus.d.ts +15 -0
  184. package/dist-types/tabs/internal/overflow/TabOverflowList.d.ts +10 -0
  185. package/dist-types/tabs/internal/overflow/TabSlot.d.ts +6 -0
  186. package/dist-types/tabs/internal/overflow/overflowMath.d.ts +18 -0
  187. package/dist-types/tabs/internal/overflow/useOverflow.d.ts +11 -0
  188. package/dist-types/tabs/internal/overflow/useOverflowLayoutState.d.ts +13 -0
  189. package/dist-types/tabs/internal/overflow/useOverflowSelectionState.d.ts +13 -0
  190. package/dist-types/tabs/internal/overflow/useRenderedTabWidth.d.ts +12 -0
  191. package/dist-types/tabs/internal/overflow/widthMeasurement.d.ts +5 -0
  192. package/dist-types/tabs/internal/registry/useCollection.d.ts +30 -0
  193. package/dist-types/tabs/internal/registry/useRenderedTabsRegistry.d.ts +12 -0
  194. package/dist-types/tabs/internal/utils/domUtils.d.ts +1 -0
  195. package/package.json +3 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # @salt-ds/core
2
2
 
3
+ ## 1.61.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2db14be: Added `Rating`.
8
+
9
+ `Rating` component allows users to submit feedback and view average scores on a defined scale, reflecting your product, service or experience.
10
+
11
+ ```tsx
12
+ <Rating aria-label="Rating" defaultValue={3} />
13
+ ```
14
+
15
+ - 7ffd0fd: Added `Tab`, `TabAction`, `TabBar`, `TabList`, `TabPanel`, `Tabs`, `TabTrigger`.
16
+
17
+ `Tabs` allow users to move between different views of related content without leave the current page.
18
+
19
+ ```tsx
20
+ <Tabs defaultValue="Home">
21
+ <TabBar>
22
+ <TabList aria-label="Example tablist">
23
+ <Tab value="Home">
24
+ <TabTrigger>Home</TabTrigger>
25
+ </Tab>
26
+ <Tab value="Transactions">
27
+ <TabTrigger>Transactions</TabTrigger>
28
+ </Tab>
29
+ <Tab value="Checks">
30
+ <TabTrigger>Checks</TabTrigger>
31
+ </Tab>
32
+ </TabList>
33
+ </TabBar>
34
+ </Tabs>
35
+ ```
36
+
37
+ ### Patch Changes
38
+
39
+ - e74d4d8: Fixed `aria-controls` on `NavigationItem` being applied to the outer wrapper element instead of the interactive trigger element.
40
+
3
41
  ## 1.60.0
4
42
 
5
43
  ### Minor Changes
package/css/salt-core.css CHANGED
@@ -3685,6 +3685,118 @@ a:focus .saltCard-interactable.saltCard-disabled {
3685
3685
  transform: scale(1.01);
3686
3686
  }
3687
3687
 
3688
+ /* src/rating/Rating.css */
3689
+ .saltRating {
3690
+ display: inline-flex;
3691
+ box-sizing: border-box;
3692
+ }
3693
+ .saltFormField .saltRating-container {
3694
+ height: var(--salt-size-base);
3695
+ padding-top: calc(var(--salt-spacing-100) + var(--salt-spacing-fixed-100));
3696
+ }
3697
+ .saltFormField .saltRating-label {
3698
+ min-height: var(--salt-size-base);
3699
+ padding-top: var(--salt-spacing-100);
3700
+ }
3701
+ .saltRating-labelBottom {
3702
+ flex-direction: column;
3703
+ align-items: flex-start;
3704
+ gap: var(--salt-spacing-75);
3705
+ }
3706
+ .saltRating-labelRight {
3707
+ flex-direction: row;
3708
+ gap: var(--salt-spacing-150);
3709
+ }
3710
+ .saltRating-container {
3711
+ display: flex;
3712
+ flex-direction: row;
3713
+ gap: var(--salt-spacing-150);
3714
+ flex-wrap: nowrap;
3715
+ justify-content: flex-start;
3716
+ padding-top: var(--salt-spacing-fixed-100);
3717
+ padding-bottom: var(--salt-spacing-fixed-100);
3718
+ box-sizing: border-box;
3719
+ }
3720
+ .saltRating-label {
3721
+ color: var(--salt-content-primary-foreground);
3722
+ font-family: var(--salt-text-fontFamily);
3723
+ font-size: var(--salt-text-fontSize);
3724
+ font-weight: var(--salt-text-fontWeight);
3725
+ line-height: var(--salt-text-lineHeight);
3726
+ box-sizing: border-box;
3727
+ }
3728
+
3729
+ /* src/rating/RatingItem.css */
3730
+ .saltRatingItem {
3731
+ height: var(--salt-size-icon);
3732
+ width: var(--salt-size-icon);
3733
+ display: flex;
3734
+ position: relative;
3735
+ align-items: center;
3736
+ justify-content: center;
3737
+ cursor: var(--salt-cursor-hover);
3738
+ }
3739
+ .saltRatingItem-disabled,
3740
+ .saltRatingItem-readOnly {
3741
+ cursor: default;
3742
+ }
3743
+ .saltRatingItem-input {
3744
+ position: absolute;
3745
+ opacity: 0;
3746
+ width: 100%;
3747
+ height: 100%;
3748
+ margin: 0;
3749
+ cursor: inherit;
3750
+ z-index: 1;
3751
+ }
3752
+ .saltRatingItem-input::before {
3753
+ content: "";
3754
+ position: absolute;
3755
+ width: 100%;
3756
+ height: 100%;
3757
+ padding: var(--salt-spacing-fixed-600);
3758
+ transform: translate(-50%, -50%);
3759
+ top: 50%;
3760
+ left: 50%;
3761
+ box-sizing: content-box;
3762
+ }
3763
+ .saltRatingItem-icon {
3764
+ pointer-events: none;
3765
+ display: flex;
3766
+ align-items: center;
3767
+ justify-content: center;
3768
+ color: var(--salt-sentiment-neutral-dataviz);
3769
+ }
3770
+ .saltRatingItem-icon .saltIcon {
3771
+ --saltIcon-size: var(--salt-size-icon);
3772
+ }
3773
+ .saltRatingItem-input:focus-visible ~ .saltRatingItem-icon::after {
3774
+ content: "";
3775
+ position: absolute;
3776
+ width: 100%;
3777
+ height: 100%;
3778
+ padding: var(--salt-spacing-fixed-600);
3779
+ transform: translate(-50%, -50%);
3780
+ top: 50%;
3781
+ left: 50%;
3782
+ box-sizing: content-box;
3783
+ border-radius: var(--salt-palette-corner-strongest);
3784
+ outline: var(--salt-focused-outline);
3785
+ outline-offset: calc(-1 * var(--salt-spacing-fixed-200));
3786
+ }
3787
+ .saltRatingItem-disabled {
3788
+ cursor: var(--salt-cursor-disabled);
3789
+ opacity: 0.4;
3790
+ }
3791
+ .saltRatingItem-disabled .saltRatingItem-input {
3792
+ cursor: var(--salt-cursor-disabled);
3793
+ }
3794
+ .saltRatingItem-selected .saltRatingItem-icon,
3795
+ .saltRatingItem-hovered .saltRatingItem-icon,
3796
+ .saltRatingItem-unselecting .saltRatingItem-icon {
3797
+ color: var(--salt-sentiment-accent-dataviz);
3798
+ }
3799
+
3688
3800
  /* src/salt-provider/SaltProvider.css */
3689
3801
  .salt-provider {
3690
3802
  display: contents;
@@ -4308,6 +4420,188 @@ table.saltTable td.saltTable-td-align-right {
4308
4420
  overflow: auto;
4309
4421
  }
4310
4422
 
4423
+ /* src/tabs/Tab.css */
4424
+ .saltTab {
4425
+ display: inline-flex;
4426
+ align-items: center;
4427
+ justify-content: center;
4428
+ appearance: none;
4429
+ -webkit-appearance: none;
4430
+ gap: var(--salt-spacing-100);
4431
+ border: none;
4432
+ border-left: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) transparent;
4433
+ border-right: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) transparent;
4434
+ white-space: pre;
4435
+ min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));
4436
+ min-width: 4em;
4437
+ padding: var(--salt-spacing-50) var(--salt-spacing-100);
4438
+ position: relative;
4439
+ flex-shrink: 0;
4440
+ box-sizing: border-box;
4441
+ overflow: hidden;
4442
+ cursor: var(--salt-cursor-hover);
4443
+ color: var(--salt-content-primary-foreground);
4444
+ font-weight: var(--salt-text-fontWeight);
4445
+ font-family: var(--salt-text-fontFamily);
4446
+ text-align: var(--salt-text-textAlign);
4447
+ letter-spacing: var(--salt-text-letterSpacing);
4448
+ line-height: var(--salt-text-lineHeight);
4449
+ font-size: var(--salt-text-fontSize);
4450
+ max-width: 100%;
4451
+ }
4452
+ @supports selector(:has(*)) {
4453
+ .saltTabList:has([data-overflowbutton]) .saltTab {
4454
+ max-width: calc(100% - var(--salt-spacing-100) - var(--salt-size-base));
4455
+ }
4456
+ }
4457
+ .saltTab::after {
4458
+ content: "";
4459
+ position: absolute;
4460
+ left: calc(var(--salt-size-fixed-100) * -1);
4461
+ right: calc(var(--salt-size-fixed-100) * -1);
4462
+ height: var(--salt-size-indicator);
4463
+ }
4464
+ .saltTabList-bordered .saltTab::after {
4465
+ top: 0;
4466
+ }
4467
+ .saltTabList-transparent .saltTab::after {
4468
+ bottom: 0;
4469
+ }
4470
+ .saltTab:hover::after,
4471
+ .saltTab-focusVisible::after {
4472
+ background: var(--salt-navigable-indicator-hover);
4473
+ }
4474
+ .saltTab-disabled:hover::after,
4475
+ .saltTab-disabled.saltTab-focusVisible::after {
4476
+ background: none;
4477
+ }
4478
+ .saltTab-focusVisible {
4479
+ outline: var(--salt-focused-outline);
4480
+ }
4481
+ .saltTabList-bordered .saltTab.saltTab-selected {
4482
+ background: var(--saltTabList-activeColor);
4483
+ border-left: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-secondary-borderColor);
4484
+ border-right: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-secondary-borderColor);
4485
+ }
4486
+ .saltTab.saltTab-selected::after {
4487
+ background: var(--salt-navigable-accent-indicator-active);
4488
+ }
4489
+ .saltTab.saltTab-disabled {
4490
+ cursor: var(--salt-cursor-disabled);
4491
+ color: var(--salt-content-primary-foreground-disabled);
4492
+ }
4493
+
4494
+ /* src/tabs/TabBar.css */
4495
+ .saltTabBar {
4496
+ display: flex;
4497
+ align-items: center;
4498
+ flex-direction: row;
4499
+ position: relative;
4500
+ box-sizing: border-box;
4501
+ min-width: 0;
4502
+ max-width: 100%;
4503
+ }
4504
+ .saltTabBar-strip {
4505
+ display: flex;
4506
+ align-items: center;
4507
+ flex-direction: row;
4508
+ flex: 1 1 auto;
4509
+ gap: var(--salt-spacing-100);
4510
+ box-sizing: border-box;
4511
+ min-width: 0;
4512
+ max-width: 100%;
4513
+ }
4514
+ .saltTabBar-divider::before {
4515
+ content: "";
4516
+ position: absolute;
4517
+ inset: auto 0 0 0;
4518
+ height: var(--salt-size-fixed-100);
4519
+ border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-secondary-borderColor);
4520
+ }
4521
+ .saltTabBar-inset {
4522
+ padding-left: var(--salt-spacing-300);
4523
+ padding-right: var(--salt-spacing-300);
4524
+ }
4525
+
4526
+ /* src/tabs/TabList.css */
4527
+ .saltTabList {
4528
+ display: flex;
4529
+ flex-wrap: nowrap;
4530
+ justify-content: flex-start;
4531
+ align-items: center;
4532
+ position: relative;
4533
+ background: transparent;
4534
+ min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));
4535
+ gap: var(--salt-spacing-100);
4536
+ max-width: 100%;
4537
+ min-width: 0;
4538
+ flex: 0 1 auto;
4539
+ }
4540
+ .saltTabList-center {
4541
+ justify-content: center;
4542
+ }
4543
+ .saltTabList-right {
4544
+ justify-content: flex-end;
4545
+ }
4546
+ .saltTabList-activeColorPrimary {
4547
+ --saltTabList-activeColor: var(--salt-container-primary-background);
4548
+ }
4549
+ .saltTabList-activeColorSecondary {
4550
+ --saltTabList-activeColor: var(--salt-container-secondary-background);
4551
+ }
4552
+ .saltTabList-activeColorTertiary {
4553
+ --saltTabList-activeColor: var(--salt-container-tertiary-background);
4554
+ }
4555
+ .saltTabList-measureContainer {
4556
+ position: absolute;
4557
+ top: 0;
4558
+ left: 0;
4559
+ height: 0;
4560
+ overflow: hidden;
4561
+ pointer-events: none;
4562
+ visibility: hidden;
4563
+ white-space: nowrap;
4564
+ }
4565
+
4566
+ /* src/tabs/TabPanel.css */
4567
+ .saltTabPanel {
4568
+ height: 100%;
4569
+ width: 100%;
4570
+ }
4571
+ .saltTabPanel[hidden] {
4572
+ display: none;
4573
+ }
4574
+ .saltTabPanel:focus-visible {
4575
+ outline: var(--salt-focused-outline);
4576
+ }
4577
+
4578
+ /* src/tabs/TabTrigger.css */
4579
+ .saltTabTrigger {
4580
+ all: unset;
4581
+ display: flex;
4582
+ gap: var(--salt-spacing-100);
4583
+ align-items: center;
4584
+ justify-content: center;
4585
+ flex: 1;
4586
+ overflow: hidden;
4587
+ }
4588
+ .saltTabTrigger::before {
4589
+ content: "";
4590
+ position: absolute;
4591
+ width: 100%;
4592
+ height: 100%;
4593
+ left: 0;
4594
+ top: 0;
4595
+ }
4596
+ .saltTabTrigger:focus-visible {
4597
+ outline: none;
4598
+ }
4599
+
4600
+ /* src/tabs/Tabs.css */
4601
+ .saltTabs {
4602
+ min-width: 0;
4603
+ }
4604
+
4311
4605
  /* src/tag/Tag.css */
4312
4606
  .saltTag {
4313
4607
  height: calc(var(--salt-size-base) - var(--salt-spacing-100));
@@ -5838,4 +6132,75 @@ label.saltText small,
5838
6132
  color: var(--salt-status-error-foreground-informative);
5839
6133
  }
5840
6134
 
5841
- /* src/efc56242-ef47-4712-a837-ef6de7fe6004.css */
6135
+ /* src/tabs/internal/overflow/TabOverflowList.css */
6136
+ .saltTabOverflowList {
6137
+ position: relative;
6138
+ }
6139
+ .saltTabOverflowList-list {
6140
+ background: var(--salt-container-primary-background);
6141
+ border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);
6142
+ overflow: hidden;
6143
+ overflow-y: auto;
6144
+ position: absolute;
6145
+ box-shadow: var(--salt-overlayable-shadow-popout);
6146
+ box-sizing: border-box;
6147
+ border-radius: var(--salt-palette-corner, 0);
6148
+ z-index: var(--salt-zIndex-flyover);
6149
+ }
6150
+ .saltTabOverflowList-listContainer {
6151
+ display: flex;
6152
+ flex-direction: column;
6153
+ gap: var(--salt-spacing-fixed-100);
6154
+ max-height: inherit;
6155
+ min-height: inherit;
6156
+ }
6157
+ .saltTabOverflowList-list .saltTab {
6158
+ color: var(--salt-content-primary-foreground);
6159
+ background: var(--salt-selectable-background);
6160
+ font-size: var(--salt-text-fontSize);
6161
+ font-weight: var(--salt-text-fontWeight);
6162
+ min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));
6163
+ padding-left: var(--salt-spacing-100);
6164
+ padding-right: var(--salt-spacing-100);
6165
+ display: flex;
6166
+ gap: var(--salt-spacing-100);
6167
+ position: relative;
6168
+ align-items: center;
6169
+ cursor: var(--salt-cursor-hover);
6170
+ box-sizing: border-box;
6171
+ flex-shrink: 0;
6172
+ justify-content: flex-start;
6173
+ }
6174
+ @supports selector(:has(*)) {
6175
+ .saltTabList:has([data-overflowbutton]) .saltTabOverflowList-list .saltTab {
6176
+ max-width: unset;
6177
+ }
6178
+ }
6179
+ .saltTabOverflowList-list .saltTab .saltTabTrigger {
6180
+ justify-content: start;
6181
+ }
6182
+ .saltTabOverflowList-list .saltTab::after {
6183
+ display: none;
6184
+ }
6185
+ .saltTabOverflowList-list .saltTab-focusVisible {
6186
+ outline: var(--salt-focused-outline);
6187
+ outline-offset: calc(var(--salt-size-fixed-100) * -2);
6188
+ }
6189
+ .saltTabOverflowList-list .saltTab:hover {
6190
+ background: var(--salt-selectable-background-hover);
6191
+ }
6192
+ .saltTabOverflowList-list .saltTab-disabled {
6193
+ color: var(--salt-content-primary-foreground-disabled);
6194
+ cursor: var(--salt-cursor-disabled);
6195
+ }
6196
+ .saltTabOverflowList-list .saltTab-disabled:hover,
6197
+ .saltTabOverflowList-list .saltTab-disabled:active {
6198
+ background: var(--salt-selectable-background);
6199
+ box-shadow: none;
6200
+ }
6201
+ .saltTabOverflowList-list .saltTab:active {
6202
+ background: var(--salt-selectable-background-selected);
6203
+ 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);
6204
+ }
6205
+
6206
+ /* src/79885058-087e-4d2c-b20a-41af8dda6a7e.css */
package/dist-cjs/index.js CHANGED
@@ -90,6 +90,7 @@ var LinearProgress = require('./progress/LinearProgress/LinearProgress.js');
90
90
  var RadioButton = require('./radio-button/RadioButton.js');
91
91
  var RadioButtonGroup = require('./radio-button/RadioButtonGroup.js');
92
92
  var RadioButtonIcon = require('./radio-button/RadioButtonIcon.js');
93
+ var Rating = require('./rating/Rating.js');
93
94
  var SaltProvider = require('./salt-provider/SaltProvider.js');
94
95
  var Scrim = require('./scrim/Scrim.js');
95
96
  var SegmentedButtonGroup = require('./segmented-button-group/SegmentedButtonGroup.js');
@@ -114,6 +115,13 @@ var TFoot = require('./table/TFoot.js');
114
115
  var TH = require('./table/TH.js');
115
116
  var THead = require('./table/THead.js');
116
117
  var TR = require('./table/TR.js');
118
+ var Tab = require('./tabs/Tab.js');
119
+ var TabAction = require('./tabs/TabAction.js');
120
+ var TabBar = require('./tabs/TabBar.js');
121
+ var TabList = require('./tabs/TabList.js');
122
+ var TabPanel = require('./tabs/TabPanel.js');
123
+ var Tabs = require('./tabs/Tabs.js');
124
+ var TabTrigger = require('./tabs/TabTrigger.js');
117
125
  var Tag = require('./tag/Tag.js');
118
126
  var Code = require('./text/Code.js');
119
127
  var Display = require('./text/Display.js');
@@ -276,6 +284,7 @@ exports.LinearProgress = LinearProgress.LinearProgress;
276
284
  exports.RadioButton = RadioButton.RadioButton;
277
285
  exports.RadioButtonGroup = RadioButtonGroup.RadioButtonGroup;
278
286
  exports.RadioButtonIcon = RadioButtonIcon.RadioButtonIcon;
287
+ exports.Rating = Rating.Rating;
279
288
  exports.BreakpointContext = SaltProvider.BreakpointContext;
280
289
  exports.DEFAULT_DENSITY = SaltProvider.DEFAULT_DENSITY;
281
290
  exports.DensityContext = SaltProvider.DensityContext;
@@ -312,6 +321,13 @@ exports.TFoot = TFoot.TFoot;
312
321
  exports.TH = TH.TH;
313
322
  exports.THead = THead.THead;
314
323
  exports.TR = TR.TR;
324
+ exports.Tab = Tab.Tab;
325
+ exports.TabAction = TabAction.TabAction;
326
+ exports.TabBar = TabBar.TabBar;
327
+ exports.TabList = TabList.TabList;
328
+ exports.TabPanel = TabPanel.TabPanel;
329
+ exports.Tabs = Tabs.Tabs;
330
+ exports.TabTrigger = TabTrigger.TabTrigger;
315
331
  exports.Tag = Tag.Tag;
316
332
  exports.Code = Code.Code;
317
333
  exports.Display1 = Display.Display1;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -30,6 +30,7 @@ const NavigationItem = React.forwardRef(
30
30
  level = 0,
31
31
  onExpand,
32
32
  style: styleProp,
33
+ "aria-controls": ariaControls,
33
34
  ...rest
34
35
  } = props;
35
36
  const targetWindow = window.useWindow();
@@ -67,6 +68,7 @@ const NavigationItem = React.forwardRef(
67
68
  ),
68
69
  render: render ?? (isLink ? void 0 : /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button" })),
69
70
  "aria-expanded": isLink ? void 0 : expanded,
71
+ "aria-controls": ariaControls,
70
72
  onClick: handleClick,
71
73
  "aria-current": isLink && active ? "page" : void 0,
72
74
  href,
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationItem.js","sources":["../src/navigation-item/NavigationItem.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MouseEvent,\n type MouseEventHandler,\n} from \"react\";\nimport type { RenderPropsType } from \"../utils\";\nimport { makePrefixer } from \"../utils\";\nimport { ExpansionIcon } from \"./ExpansionIcon\";\nimport navigationItemCss from \"./NavigationItem.css\";\nimport { NavigationItemAction } from \"./NavigationItemAction\";\n\nexport interface NavigationItemProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Whether the navigation item is active.\n */\n active?: boolean;\n /**\n * Whether the nested group is collapsed and there is an active nested item within it.\n */\n blurActive?: boolean;\n /**\n * Whether the navigation item is expanded.\n */\n expanded?: boolean;\n /**\n * Level of nesting.\n */\n level?: number;\n /**\n * The orientation of the navigation item.\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * Whether the navigation item is a parent with nested items.\n */\n parent?: boolean;\n /**\n * Render prop to enable customisation of navigation item element.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * Action to be triggered when the navigation item is expanded.\n */\n onExpand?: MouseEventHandler<HTMLButtonElement>;\n /**\n * Href to be passed to the Link element.\n */\n href?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltNavigationItem\");\n\nexport const NavigationItem = forwardRef<HTMLDivElement, NavigationItemProps>(\n function NavigationItem(props, ref) {\n const {\n active,\n blurActive,\n render,\n children,\n className,\n expanded = false,\n href,\n orientation = \"horizontal\",\n parent,\n level = 0,\n onExpand,\n style: styleProp,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-navigation-item\",\n css: navigationItemCss,\n window: targetWindow,\n });\n\n const style = {\n ...styleProp,\n \"--saltNavigationItem-level\": `${level}`,\n };\n\n const isLink = href !== undefined;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onExpand?.(event);\n };\n\n return (\n <div\n ref={ref}\n className={clsx(withBaseName(), className)}\n style={style}\n {...rest}\n >\n <NavigationItemAction\n className={clsx(\n withBaseName(\"wrapper\"),\n {\n [withBaseName(\"active\")]: active || blurActive,\n [withBaseName(\"blurActive\")]: blurActive,\n [withBaseName(\"rootItem\")]: level === 0,\n },\n withBaseName(orientation),\n )}\n render={render ?? (isLink ? undefined : <button type=\"button\" />)}\n aria-expanded={isLink ? undefined : expanded}\n onClick={handleClick}\n aria-current={isLink && active ? \"page\" : undefined}\n href={href}\n >\n <span className={withBaseName(\"label\")}>{children}</span>\n {parent ? (\n <ExpansionIcon expanded={expanded} orientation={orientation} />\n ) : null}\n </NavigationItemAction>\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","NavigationItem","useWindow","useComponentCssInjection","navigationItemCss","jsx","clsx","jsxs","NavigationItemAction","ExpansionIcon"],"mappings":";;;;;;;;;;;;;;;;AAsDA,MAAM,YAAA,GAAeA,0BAAa,oBAAoB,CAAA;AAE/C,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAC5B,SAASC,eAAAA,CAAe,KAAA,EAAO,GAAA,EAAK;AAClC,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,GAAW,KAAA;AAAA,MACX,IAAA;AAAA,MACA,WAAA,GAAc,YAAA;AAAA,MACd,MAAA;AAAA,MACA,KAAA,GAAQ,CAAA;AAAA,MACR,QAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,gBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,GAAG,SAAA;AAAA,MACH,4BAAA,EAA8B,GAAG,KAAK,CAAA;AAAA,KACxC;AAEA,IAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AAExB,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,uBACEC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,KAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEJ,QAAA,kBAAAC,eAAA;AAAA,UAACC,yCAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWF,SAAA;AAAA,cACT,aAAa,SAAS,CAAA;AAAA,cACtB;AAAA,gBACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA,IAAU,UAAA;AAAA,gBACpC,CAAC,YAAA,CAAa,YAAY,CAAC,GAAG,UAAA;AAAA,gBAC9B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,KAAA,KAAU;AAAA,eACxC;AAAA,cACA,aAAa,WAAW;AAAA,aAC1B;AAAA,YACA,QAAQ,MAAA,KAAW,MAAA,GAAS,yBAAYD,cAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,CAAA,CAAA;AAAA,YAC9D,eAAA,EAAe,SAAS,MAAA,GAAY,QAAA;AAAA,YACpC,OAAA,EAAS,WAAA;AAAA,YACT,cAAA,EAAc,MAAA,IAAU,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,YAC1C,IAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,OAAO,GAAI,QAAA,EAAS,CAAA;AAAA,cACjD,MAAA,mBACCA,cAAA,CAACI,2BAAA,EAAA,EAAc,QAAA,EAAoB,aAA0B,CAAA,GAC3D;AAAA;AAAA;AAAA;AACN;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"NavigationItem.js","sources":["../src/navigation-item/NavigationItem.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MouseEvent,\n type MouseEventHandler,\n} from \"react\";\nimport type { RenderPropsType } from \"../utils\";\nimport { makePrefixer } from \"../utils\";\nimport { ExpansionIcon } from \"./ExpansionIcon\";\nimport navigationItemCss from \"./NavigationItem.css\";\nimport { NavigationItemAction } from \"./NavigationItemAction\";\n\nexport interface NavigationItemProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Whether the navigation item is active.\n */\n active?: boolean;\n /**\n * Whether the nested group is collapsed and there is an active nested item within it.\n */\n blurActive?: boolean;\n /**\n * Whether the navigation item is expanded.\n */\n expanded?: boolean;\n /**\n * Level of nesting.\n */\n level?: number;\n /**\n * The orientation of the navigation item.\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * Whether the navigation item is a parent with nested items.\n */\n parent?: boolean;\n /**\n * Render prop to enable customisation of navigation item element.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * Action to be triggered when the navigation item is expanded.\n */\n onExpand?: MouseEventHandler<HTMLButtonElement>;\n /**\n * Href to be passed to the Link element.\n */\n href?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltNavigationItem\");\n\nexport const NavigationItem = forwardRef<HTMLDivElement, NavigationItemProps>(\n function NavigationItem(props, ref) {\n const {\n active,\n blurActive,\n render,\n children,\n className,\n expanded = false,\n href,\n orientation = \"horizontal\",\n parent,\n level = 0,\n onExpand,\n style: styleProp,\n \"aria-controls\": ariaControls,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-navigation-item\",\n css: navigationItemCss,\n window: targetWindow,\n });\n\n const style = {\n ...styleProp,\n \"--saltNavigationItem-level\": `${level}`,\n };\n\n const isLink = href !== undefined;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onExpand?.(event);\n };\n\n return (\n <div\n ref={ref}\n className={clsx(withBaseName(), className)}\n style={style}\n {...rest}\n >\n <NavigationItemAction\n className={clsx(\n withBaseName(\"wrapper\"),\n {\n [withBaseName(\"active\")]: active || blurActive,\n [withBaseName(\"blurActive\")]: blurActive,\n [withBaseName(\"rootItem\")]: level === 0,\n },\n withBaseName(orientation),\n )}\n render={render ?? (isLink ? undefined : <button type=\"button\" />)}\n aria-expanded={isLink ? undefined : expanded}\n aria-controls={ariaControls}\n onClick={handleClick}\n aria-current={isLink && active ? \"page\" : undefined}\n href={href}\n >\n <span className={withBaseName(\"label\")}>{children}</span>\n {parent ? (\n <ExpansionIcon expanded={expanded} orientation={orientation} />\n ) : null}\n </NavigationItemAction>\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","NavigationItem","useWindow","useComponentCssInjection","navigationItemCss","jsx","clsx","jsxs","NavigationItemAction","ExpansionIcon"],"mappings":";;;;;;;;;;;;;;;;AAsDA,MAAM,YAAA,GAAeA,0BAAa,oBAAoB,CAAA;AAE/C,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAC5B,SAASC,eAAAA,CAAe,KAAA,EAAO,GAAA,EAAK;AAClC,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,GAAW,KAAA;AAAA,MACX,IAAA;AAAA,MACA,WAAA,GAAc,YAAA;AAAA,MACd,MAAA;AAAA,MACA,KAAA,GAAQ,CAAA;AAAA,MACR,QAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB,YAAA;AAAA,MACjB,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,gBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,GAAG,SAAA;AAAA,MACH,4BAAA,EAA8B,GAAG,KAAK,CAAA;AAAA,KACxC;AAEA,IAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AAExB,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,uBACEC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,KAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEJ,QAAA,kBAAAC,eAAA;AAAA,UAACC,yCAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWF,SAAA;AAAA,cACT,aAAa,SAAS,CAAA;AAAA,cACtB;AAAA,gBACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA,IAAU,UAAA;AAAA,gBACpC,CAAC,YAAA,CAAa,YAAY,CAAC,GAAG,UAAA;AAAA,gBAC9B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,KAAA,KAAU;AAAA,eACxC;AAAA,cACA,aAAa,WAAW;AAAA,aAC1B;AAAA,YACA,QAAQ,MAAA,KAAW,MAAA,GAAS,yBAAYD,cAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,CAAA,CAAA;AAAA,YAC9D,eAAA,EAAe,SAAS,MAAA,GAAY,QAAA;AAAA,YACpC,eAAA,EAAe,YAAA;AAAA,YACf,OAAA,EAAS,WAAA;AAAA,YACT,cAAA,EAAc,MAAA,IAAU,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,YAC1C,IAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,OAAO,GAAI,QAAA,EAAS,CAAA;AAAA,cACjD,MAAA,mBACCA,cAAA,CAACI,2BAAA,EAAA,EAAc,QAAA,EAAoB,aAA0B,CAAA,GAC3D;AAAA;AAAA;AAAA;AACN;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var css_248z = ".saltRating {\n display: inline-flex;\n box-sizing: border-box;\n}\n\n.saltFormField .saltRating-container {\n height: var(--salt-size-base);\n padding-top: calc(var(--salt-spacing-100) + var(--salt-spacing-fixed-100));\n}\n\n.saltFormField .saltRating-label {\n min-height: var(--salt-size-base);\n padding-top: var(--salt-spacing-100);\n}\n\n.saltRating-labelBottom {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--salt-spacing-75);\n}\n\n.saltRating-labelRight {\n flex-direction: row;\n gap: var(--salt-spacing-150);\n}\n\n.saltRating-container {\n display: flex;\n flex-direction: row;\n gap: var(--salt-spacing-150);\n flex-wrap: nowrap;\n justify-content: flex-start;\n padding-top: var(--salt-spacing-fixed-100);\n padding-bottom: var(--salt-spacing-fixed-100);\n box-sizing: border-box;\n}\n\n.saltRating-label {\n color: var(--salt-content-primary-foreground);\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n box-sizing: border-box;\n}\n";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=Rating.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rating.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var clsx = require('clsx');
7
+ var React = require('react');
8
+ require('../form-field-context/FormFieldContext.js');
9
+ var useFormFieldProps = require('../form-field-context/useFormFieldProps.js');
10
+ var capitalize = require('../utils/capitalize.js');
11
+ var makePrefixer = require('../utils/makePrefixer.js');
12
+ var useControlled = require('../utils/useControlled.js');
13
+ require('../utils/useFloatingUI/useFloatingUI.js');
14
+ var useId = require('../utils/useId.js');
15
+ require('../salt-provider/SaltProvider.js');
16
+ require('../viewport/ViewportProvider.js');
17
+ var Rating$1 = require('./Rating.css.js');
18
+ var RatingItem = require('./RatingItem.js');
19
+
20
+ const withBaseName = makePrefixer.makePrefixer("saltRating");
21
+ const defaultGetLabel = (value) => `${value} Star${value > 1 ? "s" : ""}`;
22
+ const Rating = React.forwardRef(function Rating2({
23
+ value: valueProp,
24
+ defaultValue = 0,
25
+ name: nameProp,
26
+ onChange,
27
+ className,
28
+ readOnly: readOnlyProp,
29
+ disabled: disabledProp,
30
+ max = 5,
31
+ getLabel = defaultGetLabel,
32
+ getVisibleLabel,
33
+ labelPlacement = "right",
34
+ "aria-label": ariaLabel,
35
+ "aria-labelledby": ariaLabelledBy,
36
+ "aria-describedby": ariaDescribedBy,
37
+ ...restProps
38
+ }, ref) {
39
+ const targetWindow = window.useWindow();
40
+ styles.useComponentCssInjection({
41
+ testId: "salt-rating",
42
+ css: Rating$1,
43
+ window: targetWindow
44
+ });
45
+ const {
46
+ disabled: formFieldDisabled,
47
+ readOnly: formFieldReadOnly,
48
+ a11yProps: {
49
+ "aria-describedby": formFieldDescribedBy,
50
+ "aria-labelledby": formFieldLabelledBy
51
+ } = {}
52
+ } = useFormFieldProps.useFormFieldProps();
53
+ const disabled = formFieldDisabled || disabledProp;
54
+ const readOnly = formFieldReadOnly || readOnlyProp;
55
+ const [hoveredValue, setHoveredValue] = React.useState(0);
56
+ const [selected, setSelected] = useControlled.useControlled({
57
+ controlled: valueProp,
58
+ default: defaultValue,
59
+ name: "Rating",
60
+ state: "value"
61
+ });
62
+ const name = useId.useId(nameProp);
63
+ const handleMouseEnter = (event) => {
64
+ if (readOnly || disabled) return;
65
+ const itemValue = Number.parseInt(event.currentTarget.value, 10);
66
+ setHoveredValue(itemValue);
67
+ };
68
+ const handleChange = (event) => {
69
+ if (readOnly) {
70
+ event.preventDefault();
71
+ return;
72
+ }
73
+ const itemValue = Number.parseInt(event.currentTarget.value, 10);
74
+ setSelected(itemValue);
75
+ onChange == null ? void 0 : onChange(event, itemValue);
76
+ };
77
+ return /* @__PURE__ */ jsxRuntime.jsxs(
78
+ "div",
79
+ {
80
+ ref,
81
+ className: clsx.clsx(
82
+ withBaseName(),
83
+ withBaseName(`label${capitalize.capitalize(labelPlacement)}`),
84
+ className
85
+ ),
86
+ ...restProps,
87
+ children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx(
89
+ "div",
90
+ {
91
+ role: "radiogroup",
92
+ className: withBaseName("container"),
93
+ "aria-readonly": readOnly || void 0,
94
+ "aria-label": ariaLabel,
95
+ "aria-labelledby": clsx.clsx(formFieldLabelledBy, ariaLabelledBy) || void 0,
96
+ "aria-describedby": clsx.clsx(formFieldDescribedBy, ariaDescribedBy) || void 0,
97
+ onMouseLeave: () => setHoveredValue(0),
98
+ children: Array.from({ length: max }, (_, index) => {
99
+ const itemValue = index + 1;
100
+ const isHovered = hoveredValue > 0 && itemValue <= hoveredValue;
101
+ const isSelected = hoveredValue === 0 && itemValue <= selected;
102
+ const isUnselecting = hoveredValue > 0 && itemValue > hoveredValue && itemValue <= selected;
103
+ return /* @__PURE__ */ jsxRuntime.jsx(
104
+ RatingItem.RatingItem,
105
+ {
106
+ currentRating: selected,
107
+ isHovered,
108
+ isSelected,
109
+ isUnselecting,
110
+ onMouseEnter: handleMouseEnter,
111
+ onChange: handleChange,
112
+ value: itemValue,
113
+ readOnly,
114
+ disabled,
115
+ name,
116
+ "aria-label": getLabel == null ? void 0 : getLabel(itemValue)
117
+ },
118
+ itemValue
119
+ );
120
+ })
121
+ }
122
+ ),
123
+ getVisibleLabel && /* @__PURE__ */ jsxRuntime.jsx(
124
+ "div",
125
+ {
126
+ className: clsx.clsx(
127
+ withBaseName("label"),
128
+ withBaseName(`label-${labelPlacement}`)
129
+ ),
130
+ "aria-hidden": true,
131
+ children: getVisibleLabel(hoveredValue || selected, max)
132
+ }
133
+ )
134
+ ]
135
+ }
136
+ );
137
+ });
138
+
139
+ exports.Rating = Rating;
140
+ //# sourceMappingURL=Rating.js.map