@salt-ds/core 1.59.1 → 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 (233) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/css/salt-core.css +366 -1
  3. package/dist-cjs/aria-announcer/AriaAnnounce.js +15 -3
  4. package/dist-cjs/aria-announcer/AriaAnnounce.js.map +1 -1
  5. package/dist-cjs/aria-announcer/AriaAnnouncerContext.js.map +1 -1
  6. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js +65 -43
  7. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  8. package/dist-cjs/aria-announcer/announcementRegistry.js +31 -0
  9. package/dist-cjs/aria-announcer/announcementRegistry.js.map +1 -0
  10. package/dist-cjs/aria-announcer/useAriaAnnouncer.js +44 -16
  11. package/dist-cjs/aria-announcer/useAriaAnnouncer.js.map +1 -1
  12. package/dist-cjs/index.js +17 -1
  13. package/dist-cjs/index.js.map +1 -1
  14. package/dist-cjs/navigation-item/NavigationItem.js +2 -0
  15. package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
  16. package/dist-cjs/pagination/Pagination.js +1 -0
  17. package/dist-cjs/pagination/Pagination.js.map +1 -1
  18. package/dist-cjs/rating/Rating.css.js +6 -0
  19. package/dist-cjs/rating/Rating.css.js.map +1 -0
  20. package/dist-cjs/rating/Rating.js +140 -0
  21. package/dist-cjs/rating/Rating.js.map +1 -0
  22. package/dist-cjs/rating/RatingItem.css.js +6 -0
  23. package/dist-cjs/rating/RatingItem.css.js.map +1 -0
  24. package/dist-cjs/rating/RatingItem.js +75 -0
  25. package/dist-cjs/rating/RatingItem.js.map +1 -0
  26. package/dist-cjs/salt-provider/SaltProvider.js +3 -1
  27. package/dist-cjs/salt-provider/SaltProvider.js.map +1 -1
  28. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js +22 -20
  29. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  30. package/dist-cjs/spinner/Spinner.js +1 -0
  31. package/dist-cjs/spinner/Spinner.js.map +1 -1
  32. package/dist-cjs/tabs/Tab.css.js +6 -0
  33. package/dist-cjs/tabs/Tab.css.js.map +1 -0
  34. package/dist-cjs/tabs/Tab.js +211 -0
  35. package/dist-cjs/tabs/Tab.js.map +1 -0
  36. package/dist-cjs/tabs/TabAction.js +63 -0
  37. package/dist-cjs/tabs/TabAction.js.map +1 -0
  38. package/dist-cjs/tabs/TabBar.css.js +6 -0
  39. package/dist-cjs/tabs/TabBar.css.js.map +1 -0
  40. package/dist-cjs/tabs/TabBar.js +45 -0
  41. package/dist-cjs/tabs/TabBar.js.map +1 -0
  42. package/dist-cjs/tabs/TabList.css.js +6 -0
  43. package/dist-cjs/tabs/TabList.css.js.map +1 -0
  44. package/dist-cjs/tabs/TabList.js +281 -0
  45. package/dist-cjs/tabs/TabList.js.map +1 -0
  46. package/dist-cjs/tabs/TabPanel.css.js +6 -0
  47. package/dist-cjs/tabs/TabPanel.css.js.map +1 -0
  48. package/dist-cjs/tabs/TabPanel.js +98 -0
  49. package/dist-cjs/tabs/TabPanel.js.map +1 -0
  50. package/dist-cjs/tabs/TabTrigger.css.js +6 -0
  51. package/dist-cjs/tabs/TabTrigger.css.js.map +1 -0
  52. package/dist-cjs/tabs/TabTrigger.js +188 -0
  53. package/dist-cjs/tabs/TabTrigger.js.map +1 -0
  54. package/dist-cjs/tabs/Tabs.css.js +6 -0
  55. package/dist-cjs/tabs/Tabs.css.js.map +1 -0
  56. package/dist-cjs/tabs/Tabs.js +200 -0
  57. package/dist-cjs/tabs/Tabs.js.map +1 -0
  58. package/dist-cjs/tabs/internal/contexts/TabContext.js +26 -0
  59. package/dist-cjs/tabs/internal/contexts/TabContext.js.map +1 -0
  60. package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js +19 -0
  61. package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
  62. package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js +22 -0
  63. package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
  64. package/dist-cjs/tabs/internal/contexts/TabsContext.js +50 -0
  65. package/dist-cjs/tabs/internal/contexts/TabsContext.js.map +1 -0
  66. package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js +64 -0
  67. package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
  68. package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js +76 -0
  69. package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
  70. package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js +165 -0
  71. package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
  72. package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js +87 -0
  73. package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
  74. package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js +6 -0
  75. package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
  76. package/dist-cjs/tabs/internal/overflow/TabOverflowList.js +245 -0
  77. package/dist-cjs/tabs/internal/overflow/TabOverflowList.js.map +1 -0
  78. package/dist-cjs/tabs/internal/overflow/TabSlot.js +30 -0
  79. package/dist-cjs/tabs/internal/overflow/TabSlot.js.map +1 -0
  80. package/dist-cjs/tabs/internal/overflow/overflowMath.js +86 -0
  81. package/dist-cjs/tabs/internal/overflow/overflowMath.js.map +1 -0
  82. package/dist-cjs/tabs/internal/overflow/useOverflow.js +273 -0
  83. package/dist-cjs/tabs/internal/overflow/useOverflow.js.map +1 -0
  84. package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js +99 -0
  85. package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
  86. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +68 -0
  87. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
  88. package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js +92 -0
  89. package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
  90. package/dist-cjs/tabs/internal/overflow/widthMeasurement.js +42 -0
  91. package/dist-cjs/tabs/internal/overflow/widthMeasurement.js.map +1 -0
  92. package/dist-cjs/tabs/internal/registry/useCollection.js +197 -0
  93. package/dist-cjs/tabs/internal/registry/useCollection.js.map +1 -0
  94. package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js +206 -0
  95. package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
  96. package/dist-cjs/tabs/internal/utils/domUtils.js +13 -0
  97. package/dist-cjs/tabs/internal/utils/domUtils.js.map +1 -0
  98. package/dist-cjs/tooltip/useAriaAnnounce.js +1 -0
  99. package/dist-cjs/tooltip/useAriaAnnounce.js.map +1 -1
  100. package/dist-es/aria-announcer/AriaAnnounce.js +15 -3
  101. package/dist-es/aria-announcer/AriaAnnounce.js.map +1 -1
  102. package/dist-es/aria-announcer/AriaAnnouncerContext.js.map +1 -1
  103. package/dist-es/aria-announcer/AriaAnnouncerProvider.js +67 -45
  104. package/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  105. package/dist-es/aria-announcer/announcementRegistry.js +28 -0
  106. package/dist-es/aria-announcer/announcementRegistry.js.map +1 -0
  107. package/dist-es/aria-announcer/useAriaAnnouncer.js +45 -17
  108. package/dist-es/aria-announcer/useAriaAnnouncer.js.map +1 -1
  109. package/dist-es/index.js +9 -1
  110. package/dist-es/index.js.map +1 -1
  111. package/dist-es/navigation-item/NavigationItem.js +2 -0
  112. package/dist-es/navigation-item/NavigationItem.js.map +1 -1
  113. package/dist-es/pagination/Pagination.js +1 -0
  114. package/dist-es/pagination/Pagination.js.map +1 -1
  115. package/dist-es/rating/Rating.css.js +4 -0
  116. package/dist-es/rating/Rating.css.js.map +1 -0
  117. package/dist-es/rating/Rating.js +138 -0
  118. package/dist-es/rating/Rating.js.map +1 -0
  119. package/dist-es/rating/RatingItem.css.js +4 -0
  120. package/dist-es/rating/RatingItem.css.js.map +1 -0
  121. package/dist-es/rating/RatingItem.js +73 -0
  122. package/dist-es/rating/RatingItem.js.map +1 -0
  123. package/dist-es/salt-provider/SaltProvider.js +3 -1
  124. package/dist-es/salt-provider/SaltProvider.js.map +1 -1
  125. package/dist-es/semantic-icon-provider/SemanticIconProvider.js +23 -21
  126. package/dist-es/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  127. package/dist-es/spinner/Spinner.js +1 -0
  128. package/dist-es/spinner/Spinner.js.map +1 -1
  129. package/dist-es/tabs/Tab.css.js +4 -0
  130. package/dist-es/tabs/Tab.css.js.map +1 -0
  131. package/dist-es/tabs/Tab.js +209 -0
  132. package/dist-es/tabs/Tab.js.map +1 -0
  133. package/dist-es/tabs/TabAction.js +61 -0
  134. package/dist-es/tabs/TabAction.js.map +1 -0
  135. package/dist-es/tabs/TabBar.css.js +4 -0
  136. package/dist-es/tabs/TabBar.css.js.map +1 -0
  137. package/dist-es/tabs/TabBar.js +43 -0
  138. package/dist-es/tabs/TabBar.js.map +1 -0
  139. package/dist-es/tabs/TabList.css.js +4 -0
  140. package/dist-es/tabs/TabList.css.js.map +1 -0
  141. package/dist-es/tabs/TabList.js +279 -0
  142. package/dist-es/tabs/TabList.js.map +1 -0
  143. package/dist-es/tabs/TabPanel.css.js +4 -0
  144. package/dist-es/tabs/TabPanel.css.js.map +1 -0
  145. package/dist-es/tabs/TabPanel.js +96 -0
  146. package/dist-es/tabs/TabPanel.js.map +1 -0
  147. package/dist-es/tabs/TabTrigger.css.js +4 -0
  148. package/dist-es/tabs/TabTrigger.css.js.map +1 -0
  149. package/dist-es/tabs/TabTrigger.js +186 -0
  150. package/dist-es/tabs/TabTrigger.js.map +1 -0
  151. package/dist-es/tabs/Tabs.css.js +4 -0
  152. package/dist-es/tabs/Tabs.css.js.map +1 -0
  153. package/dist-es/tabs/Tabs.js +198 -0
  154. package/dist-es/tabs/Tabs.js.map +1 -0
  155. package/dist-es/tabs/internal/contexts/TabContext.js +23 -0
  156. package/dist-es/tabs/internal/contexts/TabContext.js.map +1 -0
  157. package/dist-es/tabs/internal/contexts/TabListLayoutContext.js +16 -0
  158. package/dist-es/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
  159. package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js +19 -0
  160. package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
  161. package/dist-es/tabs/internal/contexts/TabsContext.js +47 -0
  162. package/dist-es/tabs/internal/contexts/TabsContext.js.map +1 -0
  163. package/dist-es/tabs/internal/hooks/useFocusWithRetry.js +62 -0
  164. package/dist-es/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
  165. package/dist-es/tabs/internal/hooks/useTabListRecovery.js +74 -0
  166. package/dist-es/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
  167. package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js +163 -0
  168. package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
  169. package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js +85 -0
  170. package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
  171. package/dist-es/tabs/internal/overflow/TabOverflowList.css.js +4 -0
  172. package/dist-es/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
  173. package/dist-es/tabs/internal/overflow/TabOverflowList.js +243 -0
  174. package/dist-es/tabs/internal/overflow/TabOverflowList.js.map +1 -0
  175. package/dist-es/tabs/internal/overflow/TabSlot.js +28 -0
  176. package/dist-es/tabs/internal/overflow/TabSlot.js.map +1 -0
  177. package/dist-es/tabs/internal/overflow/overflowMath.js +82 -0
  178. package/dist-es/tabs/internal/overflow/overflowMath.js.map +1 -0
  179. package/dist-es/tabs/internal/overflow/useOverflow.js +271 -0
  180. package/dist-es/tabs/internal/overflow/useOverflow.js.map +1 -0
  181. package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js +97 -0
  182. package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
  183. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +66 -0
  184. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
  185. package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js +90 -0
  186. package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
  187. package/dist-es/tabs/internal/overflow/widthMeasurement.js +36 -0
  188. package/dist-es/tabs/internal/overflow/widthMeasurement.js.map +1 -0
  189. package/dist-es/tabs/internal/registry/useCollection.js +195 -0
  190. package/dist-es/tabs/internal/registry/useCollection.js.map +1 -0
  191. package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js +204 -0
  192. package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
  193. package/dist-es/tabs/internal/utils/domUtils.js +11 -0
  194. package/dist-es/tabs/internal/utils/domUtils.js.map +1 -0
  195. package/dist-es/tooltip/useAriaAnnounce.js +1 -0
  196. package/dist-es/tooltip/useAriaAnnounce.js.map +1 -1
  197. package/dist-types/aria-announcer/AriaAnnounce.d.ts +9 -2
  198. package/dist-types/aria-announcer/AriaAnnouncerContext.d.ts +26 -2
  199. package/dist-types/aria-announcer/AriaAnnouncerProvider.d.ts +6 -7
  200. package/dist-types/aria-announcer/announcementRegistry.d.ts +5 -0
  201. package/dist-types/index.d.ts +2 -0
  202. package/dist-types/rating/Rating.d.ts +48 -0
  203. package/dist-types/rating/RatingItem.d.ts +47 -0
  204. package/dist-types/rating/index.d.ts +1 -0
  205. package/dist-types/semantic-icon-provider/SemanticIconProvider.d.ts +21 -19
  206. package/dist-types/tabs/Tab.d.ts +12 -0
  207. package/dist-types/tabs/TabAction.d.ts +4 -0
  208. package/dist-types/tabs/TabBar.d.ts +12 -0
  209. package/dist-types/tabs/TabList.d.ts +12 -0
  210. package/dist-types/tabs/TabPanel.d.ts +9 -0
  211. package/dist-types/tabs/TabTrigger.d.ts +4 -0
  212. package/dist-types/tabs/Tabs.d.ts +20 -0
  213. package/dist-types/tabs/index.d.ts +7 -0
  214. package/dist-types/tabs/internal/contexts/TabContext.d.ts +12 -0
  215. package/dist-types/tabs/internal/contexts/TabListLayoutContext.d.ts +9 -0
  216. package/dist-types/tabs/internal/contexts/TabSlotRegistryContext.d.ts +5 -0
  217. package/dist-types/tabs/internal/contexts/TabsContext.d.ts +43 -0
  218. package/dist-types/tabs/internal/hooks/useFocusWithRetry.d.ts +9 -0
  219. package/dist-types/tabs/internal/hooks/useTabListRecovery.d.ts +12 -0
  220. package/dist-types/tabs/internal/hooks/useTabRemovalHandler.d.ts +32 -0
  221. package/dist-types/tabs/internal/hooks/useTabSelectionFocus.d.ts +15 -0
  222. package/dist-types/tabs/internal/overflow/TabOverflowList.d.ts +10 -0
  223. package/dist-types/tabs/internal/overflow/TabSlot.d.ts +6 -0
  224. package/dist-types/tabs/internal/overflow/overflowMath.d.ts +18 -0
  225. package/dist-types/tabs/internal/overflow/useOverflow.d.ts +11 -0
  226. package/dist-types/tabs/internal/overflow/useOverflowLayoutState.d.ts +13 -0
  227. package/dist-types/tabs/internal/overflow/useOverflowSelectionState.d.ts +13 -0
  228. package/dist-types/tabs/internal/overflow/useRenderedTabWidth.d.ts +12 -0
  229. package/dist-types/tabs/internal/overflow/widthMeasurement.d.ts +5 -0
  230. package/dist-types/tabs/internal/registry/useCollection.d.ts +30 -0
  231. package/dist-types/tabs/internal/registry/useRenderedTabsRegistry.d.ts +12 -0
  232. package/dist-types/tabs/internal/utils/domUtils.d.ts +1 -0
  233. package/package.json +3 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,69 @@
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
+
41
+ ## 1.60.0
42
+
43
+ ### Minor Changes
44
+
45
+ - 5d4de6f: `AriaAnnouncer` prop `delay` is deprecated in favour of an `options` prop.
46
+
47
+ The `options` prop provides `ariaLive` which can be set to either `polite` or `assertive` depending on the use case.
48
+ It also provides `target`, which routes announcements to a specific `AriaAnnouncerProvider` target (useful for nested contexts such as dialogs/modals).
49
+
50
+ ```diff
51
+ const { announce } = useAriaAnnouncer();
52
+ - announce("message", 500)
53
+ + announce("message", { ariaLive: "polite" });
54
+ + announce("message", { target: "date-picker-overlay", ariaLive: "polite" });
55
+ ```
56
+
57
+ The `delay` is replaced by two DOM elements that are used to announce messages.
58
+ The first element is used for `assertive` messages and the second for `polite` messages.
59
+ Messages are queued and remain in the DOM for 300 msecs before being removed, negating the need for a delay.
60
+
61
+ By default using the options prop will default to `polite` announcements.
62
+
63
+ In addition `Spinner`, `Pagination` and `ContentStatus` have been updated to default to `polite` announcements, to meet firmwide accessibility standards.
64
+
65
+ As part of the refactor, fixed announcements triggered during component unmount/cleanup (e.g. `Spinner` `completionAnnouncement`) being blocked.
66
+
3
67
  ## 1.59.1
4
68
 
5
69
  ### Patch 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/1811ae6e-f5ef-4979-9e24-35bfb4a6a50d.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 */
@@ -5,14 +5,26 @@ var React = require('react');
5
5
  var useAriaAnnouncer = require('./useAriaAnnouncer.js');
6
6
 
7
7
  const AriaAnnounce = ({
8
- announcement
8
+ announcement,
9
+ delay,
10
+ ariaLive,
11
+ duration,
12
+ target
9
13
  }) => {
10
14
  const { announce } = useAriaAnnouncer.useAriaAnnouncer();
11
15
  React.useEffect(() => {
12
16
  if (announcement) {
13
- announce(announcement);
17
+ if (delay !== void 0) {
18
+ announce(announcement, delay);
19
+ } else {
20
+ announce(announcement, {
21
+ ...ariaLive ? { ariaLive } : {},
22
+ ...duration !== void 0 ? { duration } : {},
23
+ ...target ? { target } : {}
24
+ });
25
+ }
14
26
  }
15
- }, [announce, announcement]);
27
+ }, [announce, announcement, ariaLive, delay, duration, target]);
16
28
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
17
29
  };
18
30
 
@@ -1 +1 @@
1
- {"version":3,"file":"AriaAnnounce.js","sources":["../src/aria-announcer/AriaAnnounce.tsx"],"sourcesContent":["import { type ComponentType, useEffect } from \"react\";\n\nimport { useAriaAnnouncer } from \"./useAriaAnnouncer\";\n\nexport interface AriaAnnounceProps {\n /**\n * String which will be announced by screen readers on change\n */\n announcement?: string;\n}\n\nexport const AriaAnnounce: ComponentType<AriaAnnounceProps> = ({\n announcement,\n}) => {\n const { announce } = useAriaAnnouncer();\n\n useEffect(() => {\n if (announcement) {\n announce(announcement);\n }\n }, [announce, announcement]);\n\n // biome-ignore lint/complexity/noUselessFragments: If we return null here, react-docgen wouldn't be able to locate the component.\n return <></>;\n};\n"],"names":["useAriaAnnouncer","useEffect","jsx","Fragment"],"mappings":";;;;;;AAWO,MAAM,eAAiD,CAAC;AAAA,EAC7D;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIA,iCAAA,EAAiB;AAEtC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,QAAA,CAAS,YAAY,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,YAAY,CAAC,CAAA;AAG3B,EAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAE,CAAA;AACX;;;;"}
1
+ {"version":3,"file":"AriaAnnounce.js","sources":["../src/aria-announcer/AriaAnnounce.tsx"],"sourcesContent":["import { type ComponentType, useEffect } from \"react\";\nimport type { AnnounceFnOptions } from \"./AriaAnnouncerContext\";\nimport { useAriaAnnouncer } from \"./useAriaAnnouncer\";\n\nexport interface AriaAnnounceProps extends AnnounceFnOptions {\n /**\n * String to be announced by screenreader.\n */\n announcement?: string;\n /**\n * Legacy option, precede the announcement with a delay.\n * @deprecated\n * useAriaAnnouncer `delay` arg is deprecated, use your own `setTimeout` or consider using `duration` through `AnnounceFnOptions` instead.\n */\n delay?: number;\n}\n\nexport const AriaAnnounce: ComponentType<AriaAnnounceProps> = ({\n announcement,\n delay,\n ariaLive,\n duration,\n target,\n}) => {\n const { announce } = useAriaAnnouncer();\n\n useEffect(() => {\n if (announcement) {\n if (delay !== undefined) {\n announce(announcement, delay);\n } else {\n announce(announcement, {\n ...(ariaLive ? { ariaLive } : {}),\n ...(duration !== undefined ? { duration } : {}),\n ...(target ? { target } : {}),\n });\n }\n }\n }, [announce, announcement, ariaLive, delay, duration, target]);\n\n // biome-ignore lint/complexity/noUselessFragments: If we return null here, react-docgen wouldn't be able to locate the component.\n return <></>;\n};\n"],"names":["useAriaAnnouncer","useEffect","jsx","Fragment"],"mappings":";;;;;;AAiBO,MAAM,eAAiD,CAAC;AAAA,EAC7D,YAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIA,iCAAA,EAAiB;AAEtC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,QAAA,CAAS,cAAc,KAAK,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,YAAA,EAAc;AAAA,UACrB,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,UAC/B,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,UAC7C,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW;AAAC,SAC5B,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,YAAA,EAAc,UAAU,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA;AAG9D,EAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAE,CAAA;AACX;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AriaAnnouncerContext.js","sources":["../src/aria-announcer/AriaAnnouncerContext.ts"],"sourcesContent":["import { createContext } from \"react\";\n\nexport type AnnounceFn = (announcement: string, delay?: number) => void;\n\nexport type AriaAnnouncer = {\n announce: AnnounceFn;\n};\n\nexport const AriaAnnouncerContext = createContext<AriaAnnouncer | undefined>(\n undefined,\n);\n"],"names":["createContext"],"mappings":";;;;AAQO,MAAM,oBAAA,GAAuBA,mBAAA;AAAA,EAClC;AACF;;;;"}
1
+ {"version":3,"file":"AriaAnnouncerContext.js","sources":["../src/aria-announcer/AriaAnnouncerContext.ts"],"sourcesContent":["import { type AriaAttributes, createContext } from \"react\";\n\nexport type AnnounceFnOptions = {\n /**\n * Assertiveness\n */\n ariaLive?: Exclude<AriaAttributes[\"aria-live\"], \"off\">;\n /**\n * How long (ms) the announcement should remain in the DOM before being removed.\n * Defaults to the provider's ANNOUNCEMENT_TIME_IN_DOM.\n */\n duration?: number;\n /**\n * Optional named target live region.\n * When set, announcements can be routed to a provider registered with the same target.\n */\n target?: string;\n};\n\nexport type AriaAnnouncer = {\n /**\n * TODO remove legacy `delay` arg (number) in favour of `options` (AnnounceFnOptions) as a breaking change\n */\n /**\n * Announcer function\n * @param announcement - announcement to queue for screenreader.\n * @param legacyDelayOrOptions, deprecated `delay` or `options` for announcement\n */\n announce: (\n announcement: string,\n legacyDelayOrOptions?: number | AnnounceFnOptions,\n ) => void;\n};\n\nexport const AriaAnnouncerContext = createContext<AriaAnnouncer | undefined>(\n undefined,\n);\n"],"names":["createContext"],"mappings":";;;;AAkCO,MAAM,oBAAA,GAAuBA,mBAAA;AAAA,EAClC;AACF;;;;"}
@@ -2,57 +2,74 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
+ var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
5
6
  var AriaAnnouncerContext = require('./AriaAnnouncerContext.js');
7
+ var announcementRegistry = require('./announcementRegistry.js');
6
8
 
7
- const ARIA_ANNOUNCE_DELAY = 150;
8
- function AriaAnnouncerProvider({
9
- children,
10
- style
11
- }) {
12
- const [currentAnnouncement, setCurrentAnnouncement] = React.useState("");
13
- const announcementsRef = React.useRef([]);
14
- const isAnnouncingRef = React.useRef(false);
15
- const mountedRef = React.useRef(true);
16
- const announceAll = React.useCallback(() => {
17
- isAnnouncingRef.current = true;
18
- if (mountedRef.current) {
19
- setCurrentAnnouncement("");
20
- requestAnimationFrame(() => {
21
- if (mountedRef.current && announcementsRef.current.length) {
22
- const announcement = announcementsRef.current.shift();
23
- setCurrentAnnouncement(announcement);
24
- setTimeout(() => {
25
- announceAll();
26
- }, ARIA_ANNOUNCE_DELAY);
27
- } else {
28
- isAnnouncingRef.current = false;
29
- }
30
- });
9
+ const ANNOUNCEMENT_TIME_IN_DOM = 300;
10
+ const AnnouncementRegion = React.forwardRef(function AnnouncementRegion2(props, ref) {
11
+ return /* @__PURE__ */ jsxRuntime.jsx(
12
+ "div",
13
+ {
14
+ "aria-atomic": false,
15
+ ref,
16
+ ...props
31
17
  }
32
- }, []);
33
- const announce = React.useCallback(
34
- (announcement) => {
35
- announcementsRef.current.push(announcement);
36
- if (!isAnnouncingRef.current) {
37
- announceAll();
18
+ );
19
+ });
20
+ const AriaAnnouncerProvider = React.forwardRef(function AriaAnnouncerProvider2({ children, style, target, ...rest }, ref) {
21
+ const [politeAnnouncements, setPoliteAnnouncements] = React.useState([]);
22
+ const [assertiveAnnouncements, setAssertiveAnnouncements] = React.useState([]);
23
+ const idCounterRef = React.useRef(0);
24
+ const makeAnnouncement = React.useCallback(
25
+ (message, assertiveness = "polite", duration = ANNOUNCEMENT_TIME_IN_DOM) => {
26
+ idCounterRef.current += 1;
27
+ const id = `announce-${assertiveness}-${Date.now()}-${idCounterRef.current}`;
28
+ if (assertiveness === "polite") {
29
+ setPoliteAnnouncements((previous) => {
30
+ return previous.concat({ id, message });
31
+ });
32
+ setTimeout(() => {
33
+ setPoliteAnnouncements(
34
+ (previous) => previous.filter((announcement) => announcement.id !== id)
35
+ );
36
+ }, duration);
37
+ } else {
38
+ setAssertiveAnnouncements((previous) => {
39
+ return previous.concat({ id, message });
40
+ });
41
+ setTimeout(() => {
42
+ setAssertiveAnnouncements(
43
+ (previous) => previous.filter((announcement) => announcement.id !== id)
44
+ );
45
+ }, duration);
38
46
  }
39
47
  },
40
- [announceAll]
48
+ []
49
+ );
50
+ const announce = React.useCallback(
51
+ (announcement, legacyDelayOrOptions = {}) => {
52
+ const options = typeof legacyDelayOrOptions === "object" && legacyDelayOrOptions ? legacyDelayOrOptions : {};
53
+ makeAnnouncement(
54
+ announcement,
55
+ options.ariaLive,
56
+ options.duration ?? ANNOUNCEMENT_TIME_IN_DOM
57
+ );
58
+ },
59
+ [makeAnnouncement]
41
60
  );
42
- React.useEffect(() => {
43
- mountedRef.current = true;
44
- return () => {
45
- mountedRef.current = false;
46
- };
47
- }, []);
48
61
  const value = React.useMemo(() => ({ announce }), [announce]);
62
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
63
+ if (!target) {
64
+ return;
65
+ }
66
+ return announcementRegistry.registerAnnouncementTarget(target, announce);
67
+ }, [announce, target]);
49
68
  return /* @__PURE__ */ jsxRuntime.jsxs(AriaAnnouncerContext.AriaAnnouncerContext.Provider, { value, children: [
50
69
  children,
51
- /* @__PURE__ */ jsxRuntime.jsx(
70
+ /* @__PURE__ */ jsxRuntime.jsxs(
52
71
  "div",
53
72
  {
54
- "aria-atomic": "true",
55
- "aria-live": "assertive",
56
73
  style: {
57
74
  position: "absolute",
58
75
  height: 1,
@@ -65,12 +82,17 @@ function AriaAnnouncerProvider({
65
82
  borderWidth: 0,
66
83
  ...style
67
84
  },
68
- children: currentAnnouncement
85
+ ...rest,
86
+ ref,
87
+ children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx(AnnouncementRegion, { "aria-live": "polite", children: politeAnnouncements.map((announcement) => /* @__PURE__ */ jsxRuntime.jsx("div", { children: announcement.message }, `polite-${announcement.id}`)) }),
89
+ /* @__PURE__ */ jsxRuntime.jsx(AnnouncementRegion, { "aria-live": "assertive", children: assertiveAnnouncements.map((announcement) => /* @__PURE__ */ jsxRuntime.jsx("div", { children: announcement.message }, `assertive-${announcement.id}`)) })
90
+ ]
69
91
  }
70
92
  )
71
93
  ] });
72
- }
94
+ });
73
95
 
74
- exports.ARIA_ANNOUNCE_DELAY = ARIA_ANNOUNCE_DELAY;
96
+ exports.ANNOUNCEMENT_TIME_IN_DOM = ANNOUNCEMENT_TIME_IN_DOM;
75
97
  exports.AriaAnnouncerProvider = AriaAnnouncerProvider;
76
98
  //# sourceMappingURL=AriaAnnouncerProvider.js.map