@astryxdesign/core 0.7.5 → 0.7.6-canary.0d71e8d

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 (912) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +5 -5
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +183 -5
  6. package/dist/AppShell/observeMainOverflow.d.ts +9 -0
  7. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
  8. package/dist/AppShell/observeMainOverflow.js +125 -0
  9. package/dist/Avatar/Avatar.d.ts.map +1 -1
  10. package/dist/Avatar/Avatar.js +12 -3
  11. package/dist/Badge/Badge.d.ts.map +1 -1
  12. package/dist/Badge/Badge.js +7 -1
  13. package/dist/BottomSheet/BottomSheet.js +1 -1
  14. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  16. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  17. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  18. package/dist/BottomSheet/useSheetGestures.js +30 -3
  19. package/dist/Button/Button.js +4 -4
  20. package/dist/Carousel/Carousel.d.ts +3 -1
  21. package/dist/Carousel/Carousel.d.ts.map +1 -1
  22. package/dist/Carousel/Carousel.js +12 -3
  23. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  25. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  26. package/dist/ClickableCard/ClickableCard.js +37 -4
  27. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  28. package/dist/ComplexSelector/ComplexSelector.js +41 -4
  29. package/dist/DateInput/DateInput.d.ts.map +1 -1
  30. package/dist/DateInput/DateInput.js +12 -4
  31. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  32. package/dist/DateInput/MonthScroller.js +101 -15
  33. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  34. package/dist/DateInput/TouchDateField.js +8 -3
  35. package/dist/DateInput/Wheel.d.ts.map +1 -1
  36. package/dist/DateInput/Wheel.js +11 -7
  37. package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
  38. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  39. package/dist/DateInput/usePointerDragScroll.js +25 -9
  40. package/dist/DateInput/useScrollSettle.d.ts +3 -1
  41. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  42. package/dist/DateInput/useScrollSettle.js +37 -8
  43. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  44. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  45. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  46. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  47. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  48. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  49. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  50. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  51. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  52. package/dist/Dialog/Dialog.d.ts.map +1 -1
  53. package/dist/Dialog/Dialog.js +34 -9
  54. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  55. package/dist/Dialog/DialogHeader.js +5 -4
  56. package/dist/Divider/Divider.d.ts.map +1 -1
  57. package/dist/Divider/Divider.js +2 -1
  58. package/dist/Drawer/Drawer.d.ts +1 -0
  59. package/dist/Drawer/Drawer.d.ts.map +1 -1
  60. package/dist/Drawer/Drawer.js +7 -2
  61. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  62. package/dist/DropdownMenu/DropdownMenu.js +35 -22
  63. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  64. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  65. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  66. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  67. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  68. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  69. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  70. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  71. package/dist/EmptyState/EmptyState.js +2 -1
  72. package/dist/Field/FieldLabel.d.ts +1 -1
  73. package/dist/Field/FieldLabel.d.ts.map +1 -1
  74. package/dist/Field/FieldLabel.js +4 -4
  75. package/dist/Field/InputClearButton.js +3 -3
  76. package/dist/Field/PanelSearchInput.js +2 -2
  77. package/dist/FieldStatus/FieldStatus.d.ts +3 -0
  78. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  79. package/dist/FieldStatus/FieldStatus.js +3 -2
  80. package/dist/FileInput/FileInput.d.ts +3 -0
  81. package/dist/FileInput/FileInput.d.ts.map +1 -1
  82. package/dist/FileInput/FileInput.js +34 -13
  83. package/dist/Heading/Heading.js +1 -1
  84. package/dist/Icon/Icon.js +1 -1
  85. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  86. package/dist/Indicator/CheckIndicator.js +2 -1
  87. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  88. package/dist/Indicator/CheckboxIndicator.js +3 -1
  89. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  90. package/dist/Indicator/RadioIndicator.js +3 -1
  91. package/dist/Item/Item.d.ts.map +1 -1
  92. package/dist/Item/Item.js +21 -7
  93. package/dist/Item/ItemSwipeLayer.js +1 -1
  94. package/dist/Layer/popoverOperations.d.ts +27 -0
  95. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  96. package/dist/Layer/popoverOperations.js +159 -0
  97. package/dist/Layer/useLayer.d.ts +1 -1
  98. package/dist/Layer/useLayer.d.ts.map +1 -1
  99. package/dist/Layer/useLayer.js +120 -65
  100. package/dist/Layout/Layout.js +1 -1
  101. package/dist/Layout/LayoutContent.js +1 -1
  102. package/dist/Layout/LayoutFooter.js +1 -1
  103. package/dist/Layout/LayoutHeader.js +1 -1
  104. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  105. package/dist/Lightbox/Lightbox.js +5 -0
  106. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  107. package/dist/Link/Link.d.ts.map +1 -1
  108. package/dist/Link/Link.js +8 -3
  109. package/dist/List/List.js +1 -1
  110. package/dist/List/ListItem.js +3 -3
  111. package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
  112. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  113. package/dist/MobileNav/MobileNav.js +7 -2
  114. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  115. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  116. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  117. package/dist/MultiSelector/MultiSelector.js +26 -10
  118. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  119. package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
  120. package/dist/NumberInput/NumberInput.d.ts +3 -1
  121. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  122. package/dist/NumberInput/NumberInput.js +26 -5
  123. package/dist/NumberInput/numberParser.d.ts +3 -0
  124. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  125. package/dist/NumberInput/numberParser.js +7 -44
  126. package/dist/Outline/Outline.d.ts.map +1 -1
  127. package/dist/Outline/Outline.js +27 -0
  128. package/dist/Popover/Popover.d.ts.map +1 -1
  129. package/dist/Popover/Popover.js +32 -12
  130. package/dist/Popover/usePopover.d.ts.map +1 -1
  131. package/dist/Popover/usePopover.js +10 -3
  132. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  133. package/dist/PowerSearch/PowerSearch.js +37 -30
  134. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  135. package/dist/ProgressBar/ProgressBar.js +16 -12
  136. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  137. package/dist/RadioList/RadioListItem.js +11 -3
  138. package/dist/Resizable/useResizable.d.ts.map +1 -1
  139. package/dist/Resizable/useResizable.js +28 -2
  140. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  141. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  142. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  143. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  144. package/dist/Selector/useSelectorPresentation.js +20 -4
  145. package/dist/SideNav/SideNavItem.d.ts +2 -2
  146. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  147. package/dist/SideNav/SideNavItem.js +18 -7
  148. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  149. package/dist/Skeleton/Skeleton.js +1 -1
  150. package/dist/Slider/Slider.d.ts.map +1 -1
  151. package/dist/Slider/Slider.js +10 -2
  152. package/dist/Spinner/Spinner.d.ts.map +1 -1
  153. package/dist/Spinner/Spinner.js +3 -3
  154. package/dist/Stack/Stack.js +1 -1
  155. package/dist/Stack/StackItem.js +1 -1
  156. package/dist/Stepper/Step.d.ts.map +1 -1
  157. package/dist/Stepper/Step.js +26 -6
  158. package/dist/Switch/Switch.d.ts.map +1 -1
  159. package/dist/Switch/Switch.js +10 -3
  160. package/dist/TabList/TabList.d.ts.map +1 -1
  161. package/dist/TabList/TabList.js +16 -1
  162. package/dist/Table/Table.d.ts.map +1 -1
  163. package/dist/Table/Table.js +36 -10
  164. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  165. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  166. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  167. package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
  168. package/dist/Text/Text.js +1 -1
  169. package/dist/Text/useTruncation.d.ts.map +1 -1
  170. package/dist/Text/useTruncation.js +23 -5
  171. package/dist/TextArea/TextArea.d.ts +1 -1
  172. package/dist/TextArea/TextArea.d.ts.map +1 -1
  173. package/dist/TextArea/TextArea.js +13 -2
  174. package/dist/TextInput/TextInput.d.ts.map +1 -1
  175. package/dist/TextInput/TextInput.js +3 -3
  176. package/dist/TimeInput/TimeInput.d.ts +6 -2
  177. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  178. package/dist/TimeInput/TimeInput.js +21 -14
  179. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  180. package/dist/TimeInput/TouchTimeField.js +5 -4
  181. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  182. package/dist/Timestamp/Timestamp.js +2 -2
  183. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  184. package/dist/Toast/Toast.d.ts.map +1 -1
  185. package/dist/Toast/Toast.js +60 -20
  186. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  187. package/dist/Toast/ToastViewport.js +101 -54
  188. package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
  189. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  190. package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
  191. package/dist/Token/Token.d.ts +1 -1
  192. package/dist/Token/Token.d.ts.map +1 -1
  193. package/dist/Token/Token.js +52 -5
  194. package/dist/Token/TokenLink.d.ts.map +1 -1
  195. package/dist/Token/TokenLink.js +14 -2
  196. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  197. package/dist/Tokenizer/Tokenizer.js +44 -7
  198. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  199. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
  200. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
  201. package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
  202. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  203. package/dist/Toolbar/Toolbar.js +2 -1
  204. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  205. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  206. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  207. package/dist/TopNav/TopNavMenu.js +1 -0
  208. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  209. package/dist/TreeList/TreeListItem.js +27 -4
  210. package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
  211. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  212. package/dist/Typeahead/BaseTypeahead.js +43 -7
  213. package/dist/Typeahead/Typeahead.d.ts +1 -1
  214. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  215. package/dist/Typeahead/Typeahead.js +43 -9
  216. package/dist/astryx.css +25 -4
  217. package/dist/gestures/GestureArena.d.ts +32 -1
  218. package/dist/gestures/GestureArena.d.ts.map +1 -1
  219. package/dist/gestures/GestureArena.js +110 -9
  220. package/dist/gestures/GestureHost.d.ts +351 -0
  221. package/dist/gestures/GestureHost.d.ts.map +1 -0
  222. package/dist/gestures/GestureHost.js +1773 -0
  223. package/dist/gestures/GestureRecognizer.d.ts +13 -1
  224. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  225. package/dist/gestures/GestureRecognizer.js +19 -1
  226. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  227. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  228. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  229. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  230. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  231. package/dist/gestures/PanGestureRecognizer.js +3 -0
  232. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  233. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  234. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  235. package/dist/gestures/PressTracker.d.ts +112 -0
  236. package/dist/gestures/PressTracker.d.ts.map +1 -0
  237. package/dist/gestures/PressTracker.js +267 -0
  238. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  239. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  240. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  241. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  242. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  243. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  244. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  245. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/TapGestureRecognizer.js +3 -0
  247. package/dist/gestures/VelocityTracker.d.ts +6 -2
  248. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  249. package/dist/gestures/VelocityTracker.js +7 -3
  250. package/dist/gestures/haptics.d.ts +65 -0
  251. package/dist/gestures/haptics.d.ts.map +1 -0
  252. package/dist/gestures/haptics.js +182 -0
  253. package/dist/gestures/index.d.ts +37 -0
  254. package/dist/gestures/index.d.ts.map +1 -0
  255. package/dist/gestures/index.js +25 -0
  256. package/dist/gestures/nativeScroll.d.ts +42 -0
  257. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  258. package/dist/gestures/nativeScroll.js +228 -0
  259. package/dist/gestures/touchAction.d.ts +60 -0
  260. package/dist/gestures/touchAction.d.ts.map +1 -0
  261. package/dist/gestures/touchAction.js +157 -0
  262. package/dist/gestures/touchActionRule.d.ts +34 -0
  263. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  264. package/dist/gestures/touchActionRule.js +140 -0
  265. package/dist/gestures/types.d.ts +18 -7
  266. package/dist/gestures/types.d.ts.map +1 -1
  267. package/dist/gestures/types.js +22 -2
  268. package/dist/gestures/useGestureRecognizer.d.ts +56 -0
  269. package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
  270. package/dist/gestures/useGestureRecognizer.js +226 -0
  271. package/dist/hooks/index.d.ts +1 -1
  272. package/dist/hooks/index.d.ts.map +1 -1
  273. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  274. package/dist/hooks/modalAnnounce.js +107 -61
  275. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
  276. package/dist/hooks/scrollKeyboardDelegation.js +7 -3
  277. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  278. package/dist/hooks/useAdaptivePresentation.js +4 -1
  279. package/dist/hooks/useAnnounce.d.ts +101 -42
  280. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  281. package/dist/hooks/useAnnounce.js +161 -75
  282. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  283. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  284. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  285. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  286. package/dist/hooks/useBusyAnnouncement.js +6 -12
  287. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  288. package/dist/hooks/useMenuHover.js +12 -1
  289. package/dist/hooks/useScrollOverflow.d.ts +2 -1
  290. package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
  291. package/dist/hooks/useScrollOverflow.js +56 -10
  292. package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
  294. package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
  295. package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
  296. package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
  297. package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
  298. package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
  299. package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
  300. package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
  301. package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
  302. package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
  304. package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
  306. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  307. package/dist/i18n/generated-locales/en.generated.js +8 -5
  308. package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
  309. package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
  310. package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
  311. package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
  312. package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
  313. package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
  314. package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
  315. package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
  316. package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
  317. package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
  318. package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
  319. package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
  320. package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
  321. package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
  322. package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
  323. package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
  324. package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
  326. package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
  328. package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
  329. package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
  330. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  331. package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
  332. package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
  333. package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
  334. package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
  335. package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
  336. package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
  337. package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
  338. package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
  339. package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
  340. package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
  341. package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
  342. package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
  343. package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
  344. package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
  345. package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
  346. package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
  347. package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
  348. package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
  349. package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
  350. package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
  351. package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
  352. package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
  353. package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
  354. package/dist/i18n/useListFormatter.d.ts +9 -0
  355. package/dist/i18n/useListFormatter.d.ts.map +1 -0
  356. package/dist/i18n/useListFormatter.js +41 -0
  357. package/dist/motion/animator.d.ts +83 -8
  358. package/dist/motion/animator.d.ts.map +1 -1
  359. package/dist/motion/animator.js +701 -119
  360. package/dist/motion/coast.d.ts +4 -1
  361. package/dist/motion/coast.d.ts.map +1 -1
  362. package/dist/motion/coast.js +4 -2
  363. package/dist/motion/reducedMotion.d.ts.map +1 -1
  364. package/dist/motion/reducedMotion.js +6 -2
  365. package/dist/motion/reducedMotionPlan.d.ts +7 -0
  366. package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
  367. package/dist/motion/reducedMotionPlan.js +14 -1
  368. package/dist/motion/resolveMotion.d.ts +42 -0
  369. package/dist/motion/resolveMotion.d.ts.map +1 -0
  370. package/dist/motion/resolveMotion.js +43 -0
  371. package/dist/motion/roleValue.d.ts +2 -1
  372. package/dist/motion/roleValue.d.ts.map +1 -1
  373. package/dist/motion/roleValue.js +2 -1
  374. package/dist/motion/uikit/timing.d.ts +7 -1
  375. package/dist/motion/uikit/timing.d.ts.map +1 -1
  376. package/dist/motion/uikit/timing.js +19 -1
  377. package/dist/theme/defineTheme.d.ts +19 -5
  378. package/dist/theme/defineTheme.d.ts.map +1 -1
  379. package/dist/theme/defineTheme.js +64 -4
  380. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  381. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  382. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  383. package/dist/theme/domainTokens/index.d.ts +5 -4
  384. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  385. package/dist/theme/domainTokens/index.js +5 -9
  386. package/dist/theme/index.d.ts +1 -0
  387. package/dist/theme/index.d.ts.map +1 -1
  388. package/dist/theme/motionKnobs.d.ts +56 -0
  389. package/dist/theme/motionKnobs.d.ts.map +1 -0
  390. package/dist/theme/motionKnobs.js +48 -0
  391. package/dist/theme/resolveThemeValues.d.ts +11 -4
  392. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  393. package/dist/theme/resolveThemeValues.js +40 -4
  394. package/dist/theme/themeAdaptations.d.ts +7 -3
  395. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  396. package/dist/theme/themeAdaptations.js +36 -7
  397. package/dist/theme/themeMotion.d.ts +96 -0
  398. package/dist/theme/themeMotion.d.ts.map +1 -0
  399. package/dist/theme/themeMotion.js +177 -0
  400. package/dist/theme/tokenReferences.d.ts +31 -0
  401. package/dist/theme/tokenReferences.d.ts.map +1 -0
  402. package/dist/theme/tokenReferences.js +132 -0
  403. package/dist/theme/tokens.d.ts +1 -0
  404. package/dist/theme/tokens.d.ts.map +1 -1
  405. package/dist/theme/tokens.js +9 -129
  406. package/dist/theme/tokens.stylex.d.ts +12 -0
  407. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  408. package/dist/theme/tokens.stylex.js +12 -0
  409. package/dist/utils/focusOutline.stylex.d.ts +6 -0
  410. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  411. package/dist/utils/focusOutline.stylex.js +7 -0
  412. package/dist/utils/focusReturn.d.ts +17 -1
  413. package/dist/utils/focusReturn.d.ts.map +1 -1
  414. package/dist/utils/focusReturn.js +11 -4
  415. package/dist/utils/getNodeText.d.ts +8 -0
  416. package/dist/utils/getNodeText.d.ts.map +1 -0
  417. package/dist/utils/getNodeText.js +37 -0
  418. package/dist/utils/interactionModality.d.ts +11 -2
  419. package/dist/utils/interactionModality.d.ts.map +1 -1
  420. package/dist/utils/interactionModality.js +58 -5
  421. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  422. package/dist/utils/interactionOverlay.stylex.js +17 -8
  423. package/dist/utils/plainDate.d.ts +2 -0
  424. package/dist/utils/plainDate.d.ts.map +1 -1
  425. package/dist/utils/plainDate.js +46 -3
  426. package/dist/utils/presentation.d.ts +50 -0
  427. package/dist/utils/presentation.d.ts.map +1 -0
  428. package/dist/utils/presentation.js +125 -0
  429. package/dist/utils/pressFeedback.d.ts.map +1 -1
  430. package/dist/utils/pressFeedback.js +20 -1
  431. package/dist/utils/primaryClick.d.ts +11 -0
  432. package/dist/utils/primaryClick.d.ts.map +1 -0
  433. package/dist/utils/primaryClick.js +25 -0
  434. package/dist/utils/sharedMutationObserver.d.ts +19 -11
  435. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  436. package/dist/utils/sharedMutationObserver.js +66 -26
  437. package/dist/utils/timeFormat.d.ts +47 -0
  438. package/dist/utils/timeFormat.d.ts.map +1 -0
  439. package/dist/utils/timeFormat.js +240 -0
  440. package/dist/utils/touchPresentation.d.ts +2 -2
  441. package/dist/utils/touchPresentation.d.ts.map +1 -1
  442. package/dist/utils/touchPresentation.js +13 -8
  443. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  444. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  445. package/dist/utils/touchPresentation.stylex.js +33 -0
  446. package/dist/utils/touchQueries.d.ts +13 -0
  447. package/dist/utils/touchQueries.d.ts.map +1 -0
  448. package/dist/utils/touchQueries.js +15 -0
  449. package/dist/utils/unicodeDigits.d.ts +20 -0
  450. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  451. package/dist/utils/unicodeDigits.js +70 -0
  452. package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
  453. package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
  454. package/dist/utils/useFocusAcrossSwap.js +41 -0
  455. package/locales/af-ZA.json +0 -21
  456. package/locales/ar-SA.json +0 -21
  457. package/locales/ca-ES.json +0 -21
  458. package/locales/cs-CZ.json +0 -21
  459. package/locales/da-DK.json +0 -21
  460. package/locales/de-DE.json +0 -21
  461. package/locales/el-GR.json +0 -21
  462. package/locales/en.json +35 -23
  463. package/locales/es-ES.json +0 -21
  464. package/locales/fi-FI.json +0 -21
  465. package/locales/fr-FR.json +0 -21
  466. package/locales/he-IL.json +0 -21
  467. package/locales/hu-HU.json +0 -21
  468. package/locales/it-IT.json +0 -21
  469. package/locales/ja-JP.json +0 -21
  470. package/locales/ko-KR.json +0 -21
  471. package/locales/nl-NL.json +0 -21
  472. package/locales/no-NO.json +0 -21
  473. package/locales/pl-PL.json +0 -21
  474. package/locales/pseudo.json +23 -14
  475. package/locales/pt-BR.json +0 -21
  476. package/locales/pt-PT.json +0 -21
  477. package/locales/ro-RO.json +0 -21
  478. package/locales/ru-RU.json +0 -21
  479. package/locales/sr-SP.json +0 -21
  480. package/locales/sv-SE.json +0 -21
  481. package/locales/tr-TR.json +0 -21
  482. package/locales/uk-UA.json +0 -21
  483. package/locales/vi-VN.json +0 -21
  484. package/locales/zh-CN.json +0 -21
  485. package/locales/zh-TW.json +0 -21
  486. package/package.json +5 -4
  487. package/src/AlertDialog/AlertDialog.tsx +6 -5
  488. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  489. package/src/AppShell/AppShell.doc.mjs +1 -1
  490. package/src/AppShell/AppShell.spec.md +9 -12
  491. package/src/AppShell/AppShell.test.tsx +164 -2
  492. package/src/AppShell/AppShell.tsx +225 -5
  493. package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
  494. package/src/AppShell/observeMainOverflow.test.ts +173 -0
  495. package/src/AppShell/observeMainOverflow.ts +143 -0
  496. package/src/Avatar/Avatar.spec.md +22 -22
  497. package/src/Avatar/Avatar.tsx +18 -1
  498. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  499. package/src/Badge/Badge.doc.mjs +1 -1
  500. package/src/Badge/Badge.tsx +19 -2
  501. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  502. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  503. package/src/BottomSheet/BottomSheet.tsx +1 -1
  504. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  505. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  506. package/src/BottomSheet/useSheetGestures.ts +37 -6
  507. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  508. package/src/Button/Button.tsx +4 -4
  509. package/src/Calendar/Calendar.spec.md +87 -48
  510. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  511. package/src/Carousel/Carousel.doc.mjs +1 -1
  512. package/src/Carousel/Carousel.spec.md +9 -9
  513. package/src/Carousel/Carousel.test.tsx +124 -3
  514. package/src/Carousel/Carousel.tsx +10 -2
  515. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  516. package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
  517. package/src/Chat/ChatComposer.spec.md +75 -59
  518. package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
  519. package/src/Chat/ChatDictationButton.spec.md +126 -81
  520. package/src/Chat/ChatLayout.spec.md +41 -36
  521. package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
  522. package/src/Chat/ChatMessage.spec.md +64 -65
  523. package/src/Chat/ChatSendButton.spec.md +78 -67
  524. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  525. package/src/Citation/Citation.spec.md +60 -47
  526. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  527. package/src/ClickableCard/ClickableCard.tsx +48 -4
  528. package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
  529. package/src/Collapsible/Collapsible.spec.md +2 -0
  530. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  531. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  532. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  533. package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
  534. package/src/ComplexSelector/ComplexSelector.tsx +41 -4
  535. package/src/ContextMenu/ContextMenu.spec.md +84 -56
  536. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  537. package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
  538. package/src/DateInput/DateInput.spec.md +74 -57
  539. package/src/DateInput/DateInput.test.tsx +115 -3
  540. package/src/DateInput/DateInput.tsx +29 -14
  541. package/src/DateInput/DateInputTouch.test.tsx +120 -0
  542. package/src/DateInput/MonthScroller.tsx +106 -20
  543. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  544. package/src/DateInput/TouchDateField.tsx +14 -3
  545. package/src/DateInput/Wheel.tsx +9 -6
  546. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  547. package/src/DateInput/usePointerDragScroll.ts +34 -10
  548. package/src/DateInput/useScrollSettle.ts +38 -7
  549. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  550. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  551. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  552. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  553. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  554. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  555. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  556. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  557. package/src/Dialog/Dialog.test.tsx +216 -2
  558. package/src/Dialog/Dialog.tsx +42 -9
  559. package/src/Dialog/DialogHeader.tsx +5 -4
  560. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  561. package/src/Divider/Divider.tsx +2 -1
  562. package/src/Drawer/Drawer.spec.md +111 -80
  563. package/src/Drawer/Drawer.test.tsx +35 -0
  564. package/src/Drawer/Drawer.tsx +13 -2
  565. package/src/Drawer/DrawerHeader.spec.md +181 -0
  566. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  567. package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
  568. package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
  569. package/src/DropdownMenu/DropdownMenu.tsx +43 -21
  570. package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
  571. package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
  572. package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
  573. package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
  574. package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
  575. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
  576. package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
  577. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  578. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  579. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  580. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  581. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  582. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  583. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  584. package/src/EmptyState/EmptyState.spec.md +35 -29
  585. package/src/EmptyState/EmptyState.tsx +2 -1
  586. package/src/Field/FieldLabel.tsx +5 -4
  587. package/src/Field/InputClearButton.tsx +3 -3
  588. package/src/Field/PanelSearchInput.tsx +2 -2
  589. package/src/FieldStatus/FieldStatus.tsx +9 -2
  590. package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
  591. package/src/FileInput/FileInput.test.tsx +159 -0
  592. package/src/FileInput/FileInput.tsx +34 -6
  593. package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
  594. package/src/FormLayout/FormLayout.spec.md +11 -20
  595. package/src/Heading/Heading.tsx +1 -1
  596. package/src/Icon/Icon.tsx +1 -1
  597. package/src/Indicator/CheckIndicator.spec.md +47 -42
  598. package/src/Indicator/CheckIndicator.tsx +2 -1
  599. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  600. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  601. package/src/Indicator/Indicator.spec.md +188 -0
  602. package/src/Indicator/RadioIndicator.tsx +3 -1
  603. package/src/Item/Item.test.tsx +60 -0
  604. package/src/Item/Item.tsx +16 -8
  605. package/src/Item/ItemSwipeLayer.tsx +1 -1
  606. package/src/Kbd/Kbd.spec.md +81 -38
  607. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  608. package/src/Layer/popoverOperations.test.ts +205 -0
  609. package/src/Layer/popoverOperations.ts +172 -0
  610. package/src/Layer/useLayer.test.tsx +426 -4
  611. package/src/Layer/useLayer.tsx +145 -77
  612. package/src/Layout/Layout.spec.md +127 -131
  613. package/src/Layout/Layout.tsx +1 -1
  614. package/src/Layout/LayoutContent.spec.md +205 -0
  615. package/src/Layout/LayoutContent.tsx +1 -1
  616. package/src/Layout/LayoutFooter.spec.md +190 -0
  617. package/src/Layout/LayoutFooter.tsx +1 -1
  618. package/src/Layout/LayoutHeader.spec.md +193 -0
  619. package/src/Layout/LayoutHeader.tsx +1 -1
  620. package/src/Layout/LayoutPanel.spec.md +194 -0
  621. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  622. package/src/Lightbox/Lightbox.test.tsx +18 -0
  623. package/src/Lightbox/Lightbox.tsx +5 -0
  624. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  625. package/src/Link/Link.spec.md +3 -2
  626. package/src/Link/Link.tsx +11 -0
  627. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  628. package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
  629. package/src/List/List.tsx +1 -1
  630. package/src/List/ListItem.spec.md +205 -0
  631. package/src/List/ListItem.tsx +3 -3
  632. package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
  633. package/src/MetadataList/MetadataList.spec.md +187 -0
  634. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  635. package/src/MobileNav/MobileNav.test.tsx +15 -0
  636. package/src/MobileNav/MobileNav.tsx +9 -1
  637. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  638. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  639. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  640. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  641. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  642. package/src/MultiSelector/MultiSelector.tsx +25 -10
  643. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  644. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  645. package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
  646. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  647. package/src/NumberInput/NumberInput.spec.md +59 -37
  648. package/src/NumberInput/NumberInput.test.tsx +68 -7
  649. package/src/NumberInput/NumberInput.tsx +44 -4
  650. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  651. package/src/NumberInput/numberParser.ts +7 -45
  652. package/src/Outline/Outline.spec.md +165 -69
  653. package/src/Outline/Outline.test.tsx +67 -2
  654. package/src/Outline/Outline.tsx +23 -0
  655. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
  656. package/src/OverflowList/OverflowList.spec.md +102 -55
  657. package/src/Pagination/Pagination.spec.md +158 -84
  658. package/src/Popover/Popover.test.tsx +84 -0
  659. package/src/Popover/Popover.tsx +34 -14
  660. package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
  661. package/src/Popover/usePopover.tsx +10 -3
  662. package/src/PowerSearch/PowerSearch.test.tsx +24 -0
  663. package/src/PowerSearch/PowerSearch.tsx +42 -31
  664. package/src/ProgressBar/ProgressBar.spec.md +143 -119
  665. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  666. package/src/ProgressBar/ProgressBar.tsx +58 -10
  667. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  668. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  669. package/src/RadioList/RadioList.spec.md +1 -1
  670. package/src/RadioList/RadioList.test.tsx +84 -0
  671. package/src/RadioList/RadioListItem.tsx +11 -2
  672. package/src/Resizable/Resizable.spec.md +144 -124
  673. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  674. package/src/Resizable/useResizable.test.ts +43 -0
  675. package/src/Resizable/useResizable.ts +32 -9
  676. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  677. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  678. package/src/Selector/Selector.test.tsx +90 -1
  679. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  680. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  681. package/src/Selector/useSelectorPresentation.ts +31 -3
  682. package/src/SideNav/SideNav.test.tsx +151 -4
  683. package/src/SideNav/SideNavItem.spec.md +14 -24
  684. package/src/SideNav/SideNavItem.tsx +27 -10
  685. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  686. package/src/Skeleton/Skeleton.tsx +3 -1
  687. package/src/Slider/Slider.test.tsx +31 -0
  688. package/src/Slider/Slider.tsx +8 -3
  689. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  690. package/src/Spinner/Spinner.tsx +5 -3
  691. package/src/Stack/Stack.tsx +1 -1
  692. package/src/Stack/StackItem.tsx +1 -1
  693. package/src/Stepper/Step.spec.md +36 -42
  694. package/src/Stepper/Step.tsx +33 -6
  695. package/src/Stepper/Stepper.doc.mjs +1 -1
  696. package/src/Stepper/Stepper.test.tsx +69 -7
  697. package/src/Switch/Switch.spec.md +1 -1
  698. package/src/Switch/Switch.test.tsx +66 -1
  699. package/src/Switch/Switch.tsx +11 -3
  700. package/src/TabList/TabList.test.tsx +58 -4
  701. package/src/TabList/TabList.tsx +16 -1
  702. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  703. package/src/Table/Table.spec.md +1 -1
  704. package/src/Table/Table.test.tsx +32 -0
  705. package/src/Table/Table.tsx +43 -11
  706. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  707. package/src/Table/__tests__/Table.a11y.states.ts +1 -5
  708. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  709. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  710. package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
  711. package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
  712. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
  713. package/src/Text/Text.tsx +1 -1
  714. package/src/Text/useTruncation.test.tsx +128 -1
  715. package/src/Text/useTruncation.ts +23 -5
  716. package/src/TextArea/TextArea.spec.md +10 -13
  717. package/src/TextArea/TextArea.test.tsx +60 -0
  718. package/src/TextArea/TextArea.tsx +15 -1
  719. package/src/TextInput/TextInput.test.tsx +21 -0
  720. package/src/TextInput/TextInput.tsx +3 -1
  721. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  722. package/src/TimeInput/Presentation.test.tsx +21 -0
  723. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  724. package/src/TimeInput/TimeInput.spec.md +58 -61
  725. package/src/TimeInput/TimeInput.test.tsx +76 -0
  726. package/src/TimeInput/TimeInput.tsx +36 -18
  727. package/src/TimeInput/TouchTimeField.tsx +4 -6
  728. package/src/Timestamp/Timestamp.spec.md +6 -12
  729. package/src/Timestamp/Timestamp.test.tsx +30 -5
  730. package/src/Timestamp/Timestamp.tsx +6 -2
  731. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  732. package/src/Toast/Toast.spec.md +15 -24
  733. package/src/Toast/Toast.tsx +104 -36
  734. package/src/Toast/ToastViewport.test.tsx +798 -1
  735. package/src/Toast/ToastViewport.tsx +121 -53
  736. package/src/ToggleButton/ToggleButton.test.tsx +27 -0
  737. package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
  738. package/src/Token/Token.doc.mjs +2 -2
  739. package/src/Token/Token.spec.md +52 -61
  740. package/src/Token/Token.test.tsx +104 -0
  741. package/src/Token/Token.tsx +75 -5
  742. package/src/Token/TokenLink.tsx +21 -7
  743. package/src/Tokenizer/Tokenizer.spec.md +18 -4
  744. package/src/Tokenizer/Tokenizer.test.tsx +176 -0
  745. package/src/Tokenizer/Tokenizer.tsx +48 -12
  746. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
  747. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  748. package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
  749. package/src/Toolbar/Toolbar.spec.md +5 -6
  750. package/src/Toolbar/Toolbar.test.tsx +30 -0
  751. package/src/Toolbar/Toolbar.tsx +2 -1
  752. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  753. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  754. package/src/TopNav/TopNav.test.tsx +27 -0
  755. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  756. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  757. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  758. package/src/TopNav/TopNavMenu.tsx +1 -0
  759. package/src/TreeList/TreeList.test.tsx +26 -0
  760. package/src/TreeList/TreeListItem.tsx +26 -4
  761. package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
  762. package/src/Typeahead/BaseTypeahead.spec.md +45 -45
  763. package/src/Typeahead/BaseTypeahead.tsx +48 -9
  764. package/src/Typeahead/Typeahead.test.tsx +294 -11
  765. package/src/Typeahead/Typeahead.tsx +51 -9
  766. package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
  767. package/src/__tests__/pressState.ts +8 -4
  768. package/src/gestures/GestureArena.ts +111 -11
  769. package/src/gestures/GestureHost.ts +2064 -0
  770. package/src/gestures/GestureRecognizer.ts +21 -1
  771. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  772. package/src/gestures/PanGestureRecognizer.ts +4 -0
  773. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  774. package/src/gestures/PressTracker.ts +386 -0
  775. package/src/gestures/README.md +420 -0
  776. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  777. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  778. package/src/gestures/TapGestureRecognizer.ts +4 -0
  779. package/src/gestures/VelocityTracker.ts +10 -3
  780. package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
  781. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  782. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  783. package/src/gestures/__tests__/PressTracker.test.ts +275 -0
  784. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  785. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  786. package/src/gestures/__tests__/arena.test.ts +40 -0
  787. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  788. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  789. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  790. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  791. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  792. package/src/gestures/__tests__/haptics.test.ts +187 -0
  793. package/src/gestures/__tests__/harness.ts +52 -4
  794. package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
  795. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  796. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  797. package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
  798. package/src/gestures/haptics.ts +203 -0
  799. package/src/gestures/index.ts +79 -0
  800. package/src/gestures/nativeScroll.ts +277 -0
  801. package/src/gestures/touchAction.ts +191 -0
  802. package/src/gestures/touchActionRule.ts +157 -0
  803. package/src/gestures/types.ts +30 -9
  804. package/src/gestures/useGestureRecognizer.ts +305 -0
  805. package/src/hooks/index.ts +5 -1
  806. package/src/hooks/modalAnnounce.ts +129 -72
  807. package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
  808. package/src/hooks/scrollKeyboardDelegation.ts +9 -3
  809. package/src/hooks/useAdaptivePresentation.ts +4 -1
  810. package/src/hooks/useAnnounce.doc.mjs +35 -3
  811. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  812. package/src/hooks/useAnnounce.ts +209 -102
  813. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  814. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  815. package/src/hooks/useBusyAnnouncement.ts +7 -10
  816. package/src/hooks/useMenuHover.ts +15 -1
  817. package/src/hooks/useScrollOverflow.doc.mjs +1 -1
  818. package/src/hooks/useScrollOverflow.test.tsx +102 -1
  819. package/src/hooks/useScrollOverflow.ts +59 -10
  820. package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
  821. package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
  822. package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
  823. package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
  824. package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
  825. package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
  826. package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
  827. package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
  828. package/src/i18n/generated-locales/en.generated.ts +9 -6
  829. package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
  830. package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
  831. package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
  832. package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
  833. package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
  834. package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
  835. package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
  836. package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
  837. package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
  838. package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
  839. package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
  840. package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
  841. package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
  842. package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
  843. package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
  844. package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
  845. package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
  846. package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
  847. package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
  848. package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
  849. package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
  850. package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
  851. package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
  852. package/src/i18n/useListFormatter.ts +42 -0
  853. package/src/motion/MEASUREMENTS.md +2 -1
  854. package/src/motion/README.md +113 -33
  855. package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
  856. package/src/motion/__tests__/motionBundle.ts +14 -0
  857. package/src/motion/animator.test.ts +1125 -32
  858. package/src/motion/animator.ts +932 -130
  859. package/src/motion/coast.ts +10 -3
  860. package/src/motion/reducedMotion.ts +12 -2
  861. package/src/motion/reducedMotionPlan.test.ts +26 -0
  862. package/src/motion/reducedMotionPlan.ts +20 -1
  863. package/src/motion/resolveMotion.test.ts +123 -0
  864. package/src/motion/resolveMotion.ts +68 -0
  865. package/src/motion/roleValue.ts +2 -1
  866. package/src/motion/roles.test.ts +21 -4
  867. package/src/motion/uikit/tableImports.test.ts +293 -0
  868. package/src/motion/uikit/timing.ts +15 -1
  869. package/src/motion/uikit/values.test.ts +23 -12
  870. package/src/theme/Theme.doc.mjs +1 -1
  871. package/src/theme/defineTheme.ts +117 -8
  872. package/src/theme/derivedVarRegistry.test.ts +4 -0
  873. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  874. package/src/theme/domainTokens/index.ts +6 -10
  875. package/src/theme/expandMotionScale.test.ts +1 -1
  876. package/src/theme/index.ts +5 -0
  877. package/src/theme/motionKnobs.ts +82 -0
  878. package/src/theme/resolveThemeValues.ts +68 -6
  879. package/src/theme/themeAdaptations.ts +52 -12
  880. package/src/theme/themeMotion.test.ts +620 -0
  881. package/src/theme/themeMotion.ts +221 -0
  882. package/src/theme/tokenReferences.ts +149 -0
  883. package/src/theme/tokens.stylex.ts +10 -0
  884. package/src/theme/tokens.ts +15 -158
  885. package/src/utils/focusOutline.stylex.ts +28 -0
  886. package/src/utils/focusReturn.ts +17 -6
  887. package/src/utils/getNodeText.test.ts +24 -0
  888. package/src/utils/getNodeText.ts +37 -0
  889. package/src/utils/interactionModality.test.ts +45 -1
  890. package/src/utils/interactionModality.ts +64 -5
  891. package/src/utils/interactionOverlay.stylex.ts +12 -3
  892. package/src/utils/plainDate.test.ts +90 -0
  893. package/src/utils/plainDate.ts +58 -3
  894. package/src/utils/presentation.test.ts +380 -0
  895. package/src/utils/presentation.ts +180 -0
  896. package/src/utils/pressFeedback.test.ts +138 -0
  897. package/src/utils/pressFeedback.ts +34 -11
  898. package/src/utils/pressGesture.test.ts +9 -0
  899. package/src/utils/pressPaintPriority.test.ts +80 -0
  900. package/src/utils/primaryClick.test.ts +38 -0
  901. package/src/utils/primaryClick.ts +28 -0
  902. package/src/utils/sharedMutationObserver.test.ts +54 -1
  903. package/src/utils/sharedMutationObserver.ts +87 -29
  904. package/src/utils/timeFormat.test.ts +204 -0
  905. package/src/utils/timeFormat.ts +314 -0
  906. package/src/utils/touchPresentation.stylex.ts +43 -0
  907. package/src/utils/touchPresentation.test.ts +140 -1
  908. package/src/utils/touchPresentation.ts +13 -8
  909. package/src/utils/touchQueries.ts +15 -0
  910. package/src/utils/unicodeDigits.test.ts +44 -0
  911. package/src/utils/unicodeDigits.ts +71 -0
  912. package/src/utils/useFocusAcrossSwap.ts +55 -0
@@ -2,9 +2,11 @@
2
2
 
3
3
  /**
4
4
  * @file scrollKeyboardDelegation.ts
5
- * @input A named, overflowing viewport and its real content box
5
+ * @input A named, overflowing viewport and its real content box (the viewport
6
+ * itself when it has no separate content box)
6
7
  * @output Focus-time delegation with native forward and reverse Tab traversal
7
- * @position Private useScrollableArea keyboard behavior; no DOM observers or scrolling
8
+ * @position Private keyboard behavior of useScrollableArea and of AppShell's main
9
+ * region; no DOM observers or scrolling
8
10
  */
9
11
 
10
12
  import { FOCUSABLE_SELECTOR } from "./focusableSelector.js";
@@ -22,7 +24,9 @@ function isSequential(element) {
22
24
  }
23
25
  function firstDelegationTarget(viewport, content) {
24
26
  const candidates = content.querySelectorAll(FOCUSABLE_SELECTOR);
25
- let first = content.matches(FOCUSABLE_SELECTOR) && isSequential(content) ? content : null;
27
+ // A viewport that is its own content box is the stop being entered, never
28
+ // the target it delegates to.
29
+ let first = content !== viewport && content.matches(FOCUSABLE_SELECTOR) && isSequential(content) ? content : null;
26
30
  for (const candidate of candidates) {
27
31
  // After finding the first target, only positive tabindex can precede it.
28
32
  // Ordinary trailing controls need no visibility or layout reads.
@@ -1 +1 @@
1
- {"version":3,"file":"useAdaptivePresentation.d.ts","sourceRoot":"","sources":["../../src/hooks/useAdaptivePresentation.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,CAAC;AAC3E,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAChD,oBAAoB,EACpB,UAAU,CACX,CAAC;AAMF,eAAO,MAAM,gCAAgC,QAAsB,CAAC;AAKpE;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,oBAAoB,GACjC,4BAA4B,CA4B9B"}
1
+ {"version":3,"file":"useAdaptivePresentation.d.ts","sourceRoot":"","sources":["../../src/hooks/useAdaptivePresentation.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,CAAC;AAC3E,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAChD,oBAAoB,EACpB,UAAU,CACX,CAAC;AAMF,eAAO,MAAM,gCAAgC,QAAsB,CAAC;AAKpE;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,oBAAoB,GACjC,4BAA4B,CA4B9B"}
@@ -7,7 +7,10 @@
7
7
  * @input Uses React's external-store subscription over window.matchMedia
8
8
  * and the touch presentation's compact-touch query
9
9
  * @output Resolves popover/bottom-sheet presentation policy
10
- * @position Internal overlay policy shared across component families
10
+ * @position Internal overlay policy shared across component families. A
11
+ * component that also switches input modes under a finger resolves its
12
+ * `presentation` with usePresentation (utils/presentation.ts), whose
13
+ * surface is this one's
11
14
  */
12
15
  import { useCallback, useSyncExternalStore } from 'react';
13
16
  import { COMPACT_TOUCH_QUERY, useCompactDefinition } from "../utils/touchPresentation.js";
@@ -3,10 +3,11 @@
3
3
  * @input Uses React context and useCallback; DOM APIs and cancellable
4
4
  * animation frames for a singleton live-region pair on the page body and
5
5
  * one persistent polite/assertive pair inside each open Astryx modal
6
- * @output Exports useAnnounce hook and AnnouncePoliteness type; the internal
7
- * modal context, the in-dialog region writer the busy-announcement hook
8
- * uses, and the hook the modal route (`modalAnnounce.ts`, loaded only with
9
- * an Astryx modal) installs itself through
6
+ * @output Exports useAnnounce hook (with its `hasReplace` option),
7
+ * AnnouncePoliteness and UseAnnounceOptions types; the internal modal
8
+ * context, the in-dialog region writer the busy-announcement hook uses, and
9
+ * the hook the modal route (`modalAnnounce.ts`, loaded only with an Astryx
10
+ * modal) installs itself through
10
11
  * @position Core a11y hook; provides imperative screen-reader announcements.
11
12
  * A message follows the nearest open native modal enclosing its caller
12
13
  * (`spec:AST-086` FR14): inside an Astryx modal it is written to that
@@ -14,10 +15,14 @@
14
15
  * while a native modal is open; otherwise to the shared page-body pair.
15
16
  * Containers are created empty (FR3), carry the two urgencies (FR5), join
16
17
  * messages written before the previous is exposed and say an identical
17
- * same-frame repeat once (FR9), and clear shortly after each announcement;
18
+ * same-frame repeat once (FR9), except that a `hasReplace` instance's
19
+ * message withdraws that instance's previous one not yet exposed, and clear
20
+ * shortly after each announcement;
18
21
  * the route in `modalAnnounce.ts` hands a message still unexposed when its
19
22
  * modal stops being exposed to the channel exposed after it — the modal
20
- * then on top, or the page body once no modal is open.
23
+ * then on top, or the page body once no modal is open. Each write keeps a
24
+ * receipt per announcer beside the words, which follows them wherever
25
+ * they are moved, so the announcer can take back its own share.
21
26
  *
22
27
  * SYNC: When modified, update:
23
28
  * - /packages/core/src/hooks/index.ts
@@ -35,7 +40,57 @@ export type AnnouncePoliteness = 'polite' | 'assertive';
35
40
  * Imperative screen-reader announcement function.
36
41
  */
37
42
  export type AnnounceFn = (message: string, politeness?: AnnouncePoliteness) => void;
38
- export declare function announceMessage(message: string, politeness: AnnouncePoliteness): void;
43
+ /** Options for `useAnnounce`. */
44
+ export interface UseAnnounceOptions {
45
+ /**
46
+ * The instance states one current state of its owner, such as a search's
47
+ * result count: each message it writes withdraws the instance's previous
48
+ * message while that one is not yet exposed, whatever their urgencies, and
49
+ * is spoken in the region of its own urgency; a message already exposed has
50
+ * been heard and stays. Messages from other instances, and from instances
51
+ * without `hasReplace`, still join (`spec:AST-086` FR9). Give each state a
52
+ * component reports its own instance.
53
+ * @default false
54
+ */
55
+ hasReplace?: boolean;
56
+ }
57
+ /**
58
+ * Takes back one announcer's share of a message while it is not yet exposed,
59
+ * wherever the route put it. @internal
60
+ */
61
+ export type WithdrawAnnouncement = () => void;
62
+ /**
63
+ * One announcer's share of words on their way to being exposed. Whatever
64
+ * holds the words keeps the receipt beside them; when the words move — a
65
+ * modal hands them to the channel exposed after it, or releases words it
66
+ * held through an exit — the mover points the receipt at the new place, so
67
+ * the announcer's handle follows its words. @internal
68
+ */
69
+ export interface AnnounceReceipt {
70
+ withdraw: WithdrawAnnouncement | null;
71
+ }
72
+ /** Words waiting to be exposed, with their announcers' receipts. @internal */
73
+ export interface WaitingWords {
74
+ readonly text: string;
75
+ readonly receipts: ReadonlyArray<AnnounceReceipt>;
76
+ }
77
+ /**
78
+ * The announcer's handle to `receipt`: it takes back the words wherever they
79
+ * are now, once. @internal
80
+ */
81
+ export declare function handleOf(receipt: AnnounceReceipt): WithdrawAnnouncement;
82
+ /**
83
+ * Move `waiting` words elsewhere, one delivery per announcer and in order,
84
+ * and point each receipt at its delivery, so every announcer can still take
85
+ * back its own share (`spec:AST-086` FR9, FR14). The deliveries join where
86
+ * they land, so the words are spoken once. @internal
87
+ */
88
+ export declare function forwardWaiting(waiting: ReadonlyArray<WaitingWords>, deliver: (text: string) => WithdrawAnnouncement | null): void;
89
+ /**
90
+ * Write `message` to the shared region for `politeness`, joining the messages
91
+ * not yet exposed. Returns how to take this write back while it waits.
92
+ */
93
+ export declare function announceMessage(message: string, politeness: AnnouncePoliteness): WithdrawAnnouncement | null;
39
94
  /**
40
95
  * Clear any pending announcement from a region without announcing anything new.
41
96
  * Used when the triggering context goes away (e.g. a search query is cleared),
@@ -54,6 +109,12 @@ export declare function clearRegion(politeness: AnnouncePoliteness): void;
54
109
  * announced, so users browsing the DOM later do not encounter stale status
55
110
  * text; announcing again before the clear simply resets the countdown.
56
111
  *
112
+ * An instance created with `hasReplace` states one current state, such as a
113
+ * search's result count: each message it writes withdraws its previous one
114
+ * while that one is not yet exposed, so typing faster than a frame says only
115
+ * the latest count (`spec:AST-086` FR9).
116
+ *
117
+ * @param options - `hasReplace` (default false)
57
118
  * @example
58
119
  * ```
59
120
  * function Search() {
@@ -65,7 +126,7 @@ export declare function clearRegion(politeness: AnnouncePoliteness): void;
65
126
  * }
66
127
  * ```
67
128
  */
68
- export declare function useAnnounce(): AnnounceFn;
129
+ export declare function useAnnounce({ hasReplace, }?: UseAnnounceOptions): AnnounceFn;
69
130
  /**
70
131
  * What an Astryx modal tells the hooks beneath it: where its dialog element
71
132
  * is, and the modal above it, so a caller inside a non-modal sheet nested in
@@ -79,12 +140,17 @@ export interface ModalAnnounceScope {
79
140
  export declare const ModalAnnounceContext: import("react").Context<ModalAnnounceScope | null>;
80
141
  /** The modal route `modalAnnounce.ts` installs when a provider loads it. */
81
142
  export interface ModalRoute {
82
- /** `useAnnounce` from inside `scope`: route `message` by where it is. */
83
- announce(scope: ModalAnnounceScope, message: string, politeness: AnnouncePoliteness): void;
84
- /** Speak inside `dialog` with the exposure, covered and hold rules. */
85
- announceInModal(dialog: HTMLDialogElement, message: string, politeness: AnnouncePoliteness): void;
86
- /** Withdraw an announcer's share, written or held. */
87
- withdrawFromModalPending(dialog: HTMLDialogElement, message: string, politeness: AnnouncePoliteness): void;
143
+ /**
144
+ * `useAnnounce` from inside `scope`: route `message` by where it is, and
145
+ * return how to take this write back while it waits (a `hasReplace`
146
+ * instance's next message does).
147
+ */
148
+ announce(scope: ModalAnnounceScope, message: string, politeness: AnnouncePoliteness): WithdrawAnnouncement | null;
149
+ /**
150
+ * Speak inside `dialog` with the exposure, covered and hold rules, and
151
+ * return how to take this write back while it waits.
152
+ */
153
+ announceInModal(dialog: HTMLDialogElement, message: string, politeness: AnnouncePoliteness): WithdrawAnnouncement | null;
88
154
  }
89
155
  /** Called once by `modalAnnounce.ts` as it loads. @internal */
90
156
  export declare function installModalRoute(route: ModalRoute): void;
@@ -103,45 +169,38 @@ export declare function enclosingModalDialog(element: Element | null | undefined
103
169
  * exposure, covered and hold rules; without it — a native modal an app
104
170
  * renders without Astryx, and no Astryx modal anywhere — the words are
105
171
  * written to the dialog while it is open as a modal, else to the shared
106
- * channel. Internal: used by the busy-announcement hook.
172
+ * channel. Returns how to take the words back while they wait, wherever they
173
+ * move, so a busy start overtaken by its own outcome is never heard ahead of
174
+ * it inside a modal (`spec:AST-086` FR8). Internal: used by the
175
+ * busy-announcement hook.
107
176
  */
108
- export declare function announceInModal(dialog: HTMLDialogElement, message: string, politeness?: AnnouncePoliteness): void;
109
- /**
110
- * Withdraw one announcer's share of `message` from `dialog` before it is
111
- * exposed, written to its region or held by the route for the dialog's
112
- * close, so a busy start overtaken by its own outcome is never heard ahead
113
- * of it inside a modal (`spec:AST-086` FR8). Internal: used by the
114
- * busy-announcement hook's settle function.
115
- */
116
- export declare function withdrawFromModalPending(dialog: HTMLDialogElement, message: string, politeness?: AnnouncePoliteness): void;
177
+ export declare function announceInModal(dialog: HTMLDialogElement, message: string, politeness?: AnnouncePoliteness): WithdrawAnnouncement | null;
117
178
  /** What the route asks of the writer in the write frame. @internal */
118
179
  export interface ModalWriteGuard {
119
180
  isExposed: () => boolean;
120
- redirect: (joinedMessage: string) => void;
181
+ /** Deliver the waiting words elsewhere, forwarding their receipts. */
182
+ redirect: (waiting: ReadonlyArray<WaitingWords>) => void;
121
183
  }
122
184
  /** Words written to `target` that assistive technology has not had yet. */
123
185
  export declare function unexposedMessages(target: HTMLElement): string[];
186
+ /**
187
+ * The words written to `target` that assistive technology has not had yet,
188
+ * with their announcers' receipts, for a hand-off that forwards them.
189
+ */
190
+ export declare function unexposedWords(target: HTMLElement): WaitingWords[];
124
191
  export declare function modalRegion(dialog: HTMLDialogElement, politeness: AnnouncePoliteness): HTMLElement | null;
125
192
  /**
126
193
  * Write `message` to the modal `dialog`'s own live region for `politeness`,
127
194
  * joining it to messages written there that are not yet exposed and saying
128
- * an identical repeat once; a holder count per text lets one announcer take
129
- * its share back (`withdrawFromModalPending`). The region-writing core,
130
- * shared by the full modal route and by the busy-announcement hook's fallback
131
- * for a native modal an app renders without Astryx. `guard`, supplied by the
132
- * route, re-checks exposure in the write frame and redirects the joined words
133
- * when the dialog stopped being exposed meanwhile.
134
- */
135
- export declare function writeModalRegion(dialog: HTMLDialogElement, message: string, politeness: AnnouncePoliteness, guard?: ModalWriteGuard): void;
136
- /**
137
- * Withdraw one announcer's share of `message` from `dialog`'s region before
138
- * it is exposed — written but not yet spoken — so a busy start overtaken by
139
- * its own outcome is never heard ahead of it (`spec:AST-086` FR8). The
140
- * message stays while another announcer holds it. The region half of
141
- * `withdrawFromModalPending`; the route also drops words it holds for the
142
- * dialog's close.
143
- */
144
- export declare function withdrawFromModalRegion(dialog: HTMLDialogElement, message: string, politeness?: AnnouncePoliteness): void;
195
+ * an identical repeat once. The region-writing core, shared by the full
196
+ * modal route and by the busy-announcement hook's fallback for a native
197
+ * modal an app renders without Astryx. `guard`, supplied by the route,
198
+ * re-checks exposure in the write frame and redirects the waiting words when
199
+ * the dialog stopped being exposed meanwhile. Returns this announcer's
200
+ * handle: it takes back only its own share, only while the words wait, and
201
+ * follows them when the route moves them.
202
+ */
203
+ export declare function writeModalRegion(dialog: HTMLDialogElement, message: string, politeness: AnnouncePoliteness, guard?: ModalWriteGuard): WithdrawAnnouncement;
145
204
  /**
146
205
  * Withdraw whatever the dialog's region for `politeness` holds or is about to
147
206
  * hold, as an empty message does on the shared channel. A dialog that never
@@ -1 +1 @@
1
- {"version":3,"file":"useAnnounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useAnnounce.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAnnounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useAnnounce.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,11 @@
7
7
  * @input Uses React context and useCallback; DOM APIs and cancellable
8
8
  * animation frames for a singleton live-region pair on the page body and
9
9
  * one persistent polite/assertive pair inside each open Astryx modal
10
- * @output Exports useAnnounce hook and AnnouncePoliteness type; the internal
11
- * modal context, the in-dialog region writer the busy-announcement hook
12
- * uses, and the hook the modal route (`modalAnnounce.ts`, loaded only with
13
- * an Astryx modal) installs itself through
10
+ * @output Exports useAnnounce hook (with its `hasReplace` option),
11
+ * AnnouncePoliteness and UseAnnounceOptions types; the internal modal
12
+ * context, the in-dialog region writer the busy-announcement hook uses, and
13
+ * the hook the modal route (`modalAnnounce.ts`, loaded only with an Astryx
14
+ * modal) installs itself through
14
15
  * @position Core a11y hook; provides imperative screen-reader announcements.
15
16
  * A message follows the nearest open native modal enclosing its caller
16
17
  * (`spec:AST-086` FR14): inside an Astryx modal it is written to that
@@ -18,15 +19,19 @@
18
19
  * while a native modal is open; otherwise to the shared page-body pair.
19
20
  * Containers are created empty (FR3), carry the two urgencies (FR5), join
20
21
  * messages written before the previous is exposed and say an identical
21
- * same-frame repeat once (FR9), and clear shortly after each announcement;
22
+ * same-frame repeat once (FR9), except that a `hasReplace` instance's
23
+ * message withdraws that instance's previous one not yet exposed, and clear
24
+ * shortly after each announcement;
22
25
  * the route in `modalAnnounce.ts` hands a message still unexposed when its
23
26
  * modal stops being exposed to the channel exposed after it — the modal
24
- * then on top, or the page body once no modal is open.
27
+ * then on top, or the page body once no modal is open. Each write keeps a
28
+ * receipt per announcer beside the words, which follows them wherever
29
+ * they are moved, so the announcer can take back its own share.
25
30
  *
26
31
  * SYNC: When modified, update:
27
32
  * - /packages/core/src/hooks/index.ts
28
33
  */
29
- import { createContext, use, useCallback } from 'react';
34
+ import { createContext, use, useCallback, useRef } from 'react';
30
35
 
31
36
  /**
32
37
  * Announcement urgency:
@@ -40,6 +45,51 @@ import { createContext, use, useCallback } from 'react';
40
45
  * Imperative screen-reader announcement function.
41
46
  */
42
47
 
48
+ /** Options for `useAnnounce`. */
49
+
50
+ /**
51
+ * Takes back one announcer's share of a message while it is not yet exposed,
52
+ * wherever the route put it. @internal
53
+ */
54
+
55
+ /**
56
+ * One announcer's share of words on their way to being exposed. Whatever
57
+ * holds the words keeps the receipt beside them; when the words move — a
58
+ * modal hands them to the channel exposed after it, or releases words it
59
+ * held through an exit — the mover points the receipt at the new place, so
60
+ * the announcer's handle follows its words. @internal
61
+ */
62
+
63
+ /** Words waiting to be exposed, with their announcers' receipts. @internal */
64
+
65
+ /**
66
+ * The announcer's handle to `receipt`: it takes back the words wherever they
67
+ * are now, once. @internal
68
+ */
69
+ export function handleOf(receipt) {
70
+ return () => {
71
+ const withdraw = receipt.withdraw;
72
+ receipt.withdraw = null;
73
+ withdraw?.();
74
+ };
75
+ }
76
+
77
+ /**
78
+ * Move `waiting` words elsewhere, one delivery per announcer and in order,
79
+ * and point each receipt at its delivery, so every announcer can still take
80
+ * back its own share (`spec:AST-086` FR9, FR14). The deliveries join where
81
+ * they land, so the words are spoken once. @internal
82
+ */
83
+ export function forwardWaiting(waiting, deliver) {
84
+ for (const {
85
+ text,
86
+ receipts
87
+ } of waiting) {
88
+ for (const receipt of receipts) {
89
+ receipt.withdraw = deliver(text);
90
+ }
91
+ }
92
+ }
43
93
  const CONTAINER_ATTR = 'data-astryx-live-region';
44
94
 
45
95
  // Visually-hidden clip block (matches the VisuallyHidden primitive). Applied
@@ -134,17 +184,22 @@ function getRegions() {
134
184
  };
135
185
  return regions;
136
186
  }
187
+
188
+ /**
189
+ * Write `message` to the shared region for `politeness`, joining the messages
190
+ * not yet exposed. Returns how to take this write back while it waits.
191
+ */
137
192
  export function announceMessage(message, politeness) {
138
193
  const r = getRegions();
139
194
  if (!r) {
140
- return;
195
+ return null;
141
196
  }
142
197
  const target = politeness === 'assertive' ? r.assertive : r.polite;
143
198
  const repeat = pendingMessages[politeness].find(pending => pending.text === message);
144
199
  if (repeat != null) {
145
200
  repeat.holders += 1;
146
201
  lastJoined = repeat;
147
- return;
202
+ return () => withdrawPendingAnnouncement(repeat, politeness);
148
203
  }
149
204
  const pending = {
150
205
  text: message,
@@ -168,6 +223,7 @@ export function announceMessage(message, politeness) {
168
223
  // indefinitely. Scheduled per announce, so a newer announcement always
169
224
  // resets the countdown (the delay comfortably outlasts the rAF re-set).
170
225
  scheduleClear(politeness, target);
226
+ return () => withdrawPendingAnnouncement(pending, politeness);
171
227
  }
172
228
 
173
229
  /**
@@ -197,6 +253,12 @@ export function clearRegion(politeness) {
197
253
  * announced, so users browsing the DOM later do not encounter stale status
198
254
  * text; announcing again before the clear simply resets the countdown.
199
255
  *
256
+ * An instance created with `hasReplace` states one current state, such as a
257
+ * search's result count: each message it writes withdraws its previous one
258
+ * while that one is not yet exposed, so typing faster than a frame says only
259
+ * the latest count (`spec:AST-086` FR9).
260
+ *
261
+ * @param options - `hasReplace` (default false)
200
262
  * @example
201
263
  * ```
202
264
  * function Search() {
@@ -208,25 +270,38 @@ export function clearRegion(politeness) {
208
270
  * }
209
271
  * ```
210
272
  */
211
- export function useAnnounce() {
273
+ export function useAnnounce({
274
+ hasReplace = false
275
+ } = {}) {
212
276
  const modal = use(ModalAnnounceContext);
277
+ // A `hasReplace` instance's latest write, which its next message takes back
278
+ // if assistive technology has not had it yet.
279
+ const withdrawPreviousRef = useRef(null);
213
280
  return useCallback((message, politeness = 'polite') => {
281
+ if (hasReplace) {
282
+ const withdrawPrevious = withdrawPreviousRef.current;
283
+ withdrawPreviousRef.current = null;
284
+ withdrawPrevious?.();
285
+ }
286
+ let written;
214
287
  // Inside an Astryx modal's provider: the modal route decides, per call,
215
288
  // where the caller is heard — `modal` is non-null only where a provider
216
289
  // rendered, and rendering one loads the route.
217
290
  if (modal != null && modalRoute != null) {
218
- modalRoute.announce(modal, message, politeness);
219
- return;
220
- }
221
- if (!message) {
291
+ written = modalRoute.announce(modal, message, politeness);
292
+ } else if (!message) {
222
293
  // An empty message clears any lingering status from the region,
223
294
  // including messages joined but not yet exposed — useful when the
224
295
  // triggering context ends.
225
296
  clearRegion(politeness);
226
- return;
297
+ written = null;
298
+ } else {
299
+ written = announceMessage(message, politeness);
300
+ }
301
+ if (hasReplace) {
302
+ withdrawPreviousRef.current = written;
227
303
  }
228
- announceMessage(message, politeness);
229
- }, [modal]);
304
+ }, [hasReplace, modal]);
230
305
  }
231
306
 
232
307
  // =============================================================================
@@ -292,33 +367,19 @@ export function enclosingModalDialog(element) {
292
367
  * exposure, covered and hold rules; without it — a native modal an app
293
368
  * renders without Astryx, and no Astryx modal anywhere — the words are
294
369
  * written to the dialog while it is open as a modal, else to the shared
295
- * channel. Internal: used by the busy-announcement hook.
370
+ * channel. Returns how to take the words back while they wait, wherever they
371
+ * move, so a busy start overtaken by its own outcome is never heard ahead of
372
+ * it inside a modal (`spec:AST-086` FR8). Internal: used by the
373
+ * busy-announcement hook.
296
374
  */
297
375
  export function announceInModal(dialog, message, politeness = 'polite') {
298
376
  if (modalRoute != null) {
299
- modalRoute.announceInModal(dialog, message, politeness);
300
- return;
377
+ return modalRoute.announceInModal(dialog, message, politeness);
301
378
  }
302
379
  if (isOpenModal(dialog)) {
303
- writeModalRegion(dialog, message, politeness);
304
- } else {
305
- announceMessage(message, politeness);
306
- }
307
- }
308
-
309
- /**
310
- * Withdraw one announcer's share of `message` from `dialog` before it is
311
- * exposed, written to its region or held by the route for the dialog's
312
- * close, so a busy start overtaken by its own outcome is never heard ahead
313
- * of it inside a modal (`spec:AST-086` FR8). Internal: used by the
314
- * busy-announcement hook's settle function.
315
- */
316
- export function withdrawFromModalPending(dialog, message, politeness = 'polite') {
317
- if (modalRoute != null) {
318
- modalRoute.withdrawFromModalPending(dialog, message, politeness);
319
- return;
380
+ return writeModalRegion(dialog, message, politeness);
320
381
  }
321
- withdrawFromModalRegion(dialog, message, politeness);
382
+ return announceMessage(message, politeness);
322
383
  }
323
384
 
324
385
  /** What the route asks of the writer in the write frame. @internal */
@@ -344,11 +405,25 @@ function cancelPending(pending) {
344
405
 
345
406
  /** Words written to `target` that assistive technology has not had yet. */
346
407
  export function unexposedMessages(target) {
408
+ return unexposedWords(target).map(words => words.text);
409
+ }
410
+ function waitingIn(pending) {
411
+ return pending.messages.map(text => ({
412
+ text,
413
+ receipts: pending.receipts.get(text) ?? []
414
+ }));
415
+ }
416
+
417
+ /**
418
+ * The words written to `target` that assistive technology has not had yet,
419
+ * with their announcers' receipts, for a hand-off that forwards them.
420
+ */
421
+ export function unexposedWords(target) {
347
422
  const pending = pendingByRegion.get(target);
348
423
  if (pending == null) {
349
424
  return [];
350
425
  }
351
- return pending.frame != null || pending.settleFrame != null ? pending.messages : [];
426
+ return pending.frame != null || pending.settleFrame != null ? waitingIn(pending) : [];
352
427
  }
353
428
  export function modalRegion(dialog, politeness) {
354
429
  return dialog.querySelector(`:scope > [${MODAL_REGION_ATTR}="${politeness}"]`);
@@ -376,20 +451,24 @@ function ensureModalRegion(dialog, politeness) {
376
451
  /**
377
452
  * Write `message` to the modal `dialog`'s own live region for `politeness`,
378
453
  * joining it to messages written there that are not yet exposed and saying
379
- * an identical repeat once; a holder count per text lets one announcer take
380
- * its share back (`withdrawFromModalPending`). The region-writing core,
381
- * shared by the full modal route and by the busy-announcement hook's fallback
382
- * for a native modal an app renders without Astryx. `guard`, supplied by the
383
- * route, re-checks exposure in the write frame and redirects the joined words
384
- * when the dialog stopped being exposed meanwhile.
454
+ * an identical repeat once. The region-writing core, shared by the full
455
+ * modal route and by the busy-announcement hook's fallback for a native
456
+ * modal an app renders without Astryx. `guard`, supplied by the route,
457
+ * re-checks exposure in the write frame and redirects the waiting words when
458
+ * the dialog stopped being exposed meanwhile. Returns this announcer's
459
+ * handle: it takes back only its own share, only while the words wait, and
460
+ * follows them when the route moves them.
385
461
  */
386
462
  export function writeModalRegion(dialog, message, politeness, guard) {
387
463
  const target = ensureModalRegion(dialog, politeness);
388
464
  const unexposed = unexposedMessages(target);
389
465
  const messages = unexposed.includes(message) ? unexposed : [...unexposed, message];
390
466
  const previous = pendingByRegion.get(target);
391
- const holders = new Map(unexposed.length > 0 && previous != null ? previous.holders : []);
392
- holders.set(message, (holders.get(message) ?? 0) + 1);
467
+ const receipts = unexposed.length > 0 && previous != null ? previous.receipts : new Map();
468
+ const receipt = {
469
+ withdraw: null
470
+ };
471
+ receipts.set(message, [...(receipts.get(message) ?? []), receipt]);
393
472
  if (previous != null) {
394
473
  cancelPending(previous);
395
474
  }
@@ -398,7 +477,7 @@ export function writeModalRegion(dialog, message, politeness, guard) {
398
477
  target.textContent = '';
399
478
  const pending = {
400
479
  messages,
401
- holders,
480
+ receipts,
402
481
  frame: null,
403
482
  settleFrame: null,
404
483
  timer: null
@@ -407,9 +486,9 @@ export function writeModalRegion(dialog, message, politeness, guard) {
407
486
  pending.frame = null;
408
487
  if (guard != null && !guard.isExposed()) {
409
488
  // Stopped being exposed between the call and this frame: the words go
410
- // where they will be heard.
489
+ // where they will be heard, their receipts with them.
411
490
  pendingByRegion.delete(target);
412
- guard.redirect(pending.messages.join(' '));
491
+ guard.redirect(waitingIn(pending));
413
492
  return;
414
493
  }
415
494
  target.textContent = pending.messages.join(' ');
@@ -422,35 +501,42 @@ export function writeModalRegion(dialog, message, politeness, guard) {
422
501
  }, CLEAR_DELAY_MS);
423
502
  });
424
503
  pendingByRegion.set(target, pending);
504
+ receipt.withdraw = () => withdrawFromRegion(target, message, receipt);
505
+ return handleOf(receipt);
425
506
  }
426
507
 
427
508
  /**
428
- * Withdraw one announcer's share of `message` from `dialog`'s region before
429
- * it is exposed — written but not yet spoken — so a busy start overtaken by
430
- * its own outcome is never heard ahead of it (`spec:AST-086` FR8). The
431
- * message stays while another announcer holds it. The region half of
432
- * `withdrawFromModalPending`; the route also drops words it holds for the
433
- * dialog's close.
509
+ * Withdraw one announcer's share of `message` from `target` while it is not
510
+ * yet exposed — written but not yet spoken — so a busy start overtaken by its
511
+ * own outcome is never heard ahead of it (`spec:AST-086` FR8), and a
512
+ * `hasReplace` instance's next message replaces its previous one (FR9,
513
+ * FR14). The message stays while another announcer holds it; a receipt not
514
+ * among the waiting words (they were exposed, cleared, or moved) takes back
515
+ * nothing.
434
516
  */
435
- export function withdrawFromModalRegion(dialog, message, politeness = 'polite') {
436
- const region = modalRegion(dialog, politeness);
437
- const pending = region == null ? undefined : pendingByRegion.get(region);
438
- if (region != null && pending != null && (pending.frame != null || pending.settleFrame != null)) {
439
- const count = pending.holders.get(message) ?? 0;
440
- if (count > 1) {
441
- pending.holders.set(message, count - 1);
442
- } else if (count === 1) {
443
- pending.holders.delete(message);
444
- pending.messages = pending.messages.filter(text => text !== message);
445
- if (pending.messages.length === 0) {
446
- cancelPending(pending);
447
- pendingByRegion.delete(region);
448
- region.textContent = '';
449
- } else if (pending.frame == null) {
450
- // Already written this frame, not yet taken: show the rest.
451
- region.textContent = pending.messages.join(' ');
452
- }
453
- }
517
+ function withdrawFromRegion(target, message, receipt) {
518
+ const pending = pendingByRegion.get(target);
519
+ if (pending == null || pending.frame == null && pending.settleFrame == null) {
520
+ return;
521
+ }
522
+ const receipts = pending.receipts.get(message);
523
+ const at = receipts?.indexOf(receipt) ?? -1;
524
+ if (receipts == null || at < 0) {
525
+ return;
526
+ }
527
+ receipts.splice(at, 1);
528
+ if (receipts.length > 0) {
529
+ return;
530
+ }
531
+ pending.receipts.delete(message);
532
+ pending.messages = pending.messages.filter(text => text !== message);
533
+ if (pending.messages.length === 0) {
534
+ cancelPending(pending);
535
+ pendingByRegion.delete(target);
536
+ target.textContent = '';
537
+ } else if (pending.frame == null) {
538
+ // Already written this frame, not yet taken: show the rest.
539
+ target.textContent = pending.messages.join(' ');
454
540
  }
455
541
  }
456
542