@astryxdesign/core 0.7.7 → 0.7.8-canary.07ee4b5

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 (682) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +4 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +46 -6
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +11 -3
  6. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheet.js +1 -0
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +25 -4
  10. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  12. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
  13. package/dist/BottomSheet/useMobileKeyboard.js +6 -0
  14. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  15. package/dist/BottomSheet/useSheetGestures.js +12 -1
  16. package/dist/Button/Button.d.ts.map +1 -1
  17. package/dist/Button/Button.js +17 -1
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +18 -22
  20. package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
  21. package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
  22. package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
  23. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  24. package/dist/Calendar/hooks/useCalendarDays.js +2 -10
  25. package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
  26. package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
  27. package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
  28. package/dist/Carousel/Carousel.d.ts.map +1 -1
  29. package/dist/Carousel/Carousel.js +2 -0
  30. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  31. package/dist/Chat/ChatComposerInput.js +6 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +2 -1
  34. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  35. package/dist/Chat/useChatDictation.js +2 -0
  36. package/dist/Chat/useChatNewMessages.js +1 -1
  37. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  38. package/dist/Chat/useChatStreamScroll.js +2 -0
  39. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  40. package/dist/Chat/useSpeechRecognition.js +3 -0
  41. package/dist/Chat/useTriggerMenu.js +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  44. package/dist/CheckboxList/CheckboxList.d.ts +8 -1
  45. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  46. package/dist/CheckboxList/CheckboxList.js +2 -0
  47. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  48. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  49. package/dist/CodeBlock/CodeBlock.js +28 -11
  50. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPalette.js +2 -0
  52. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  53. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  54. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  57. package/dist/ContextMenu/ContextMenu.js +2 -2
  58. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  59. package/dist/DateInput/MonthScroller.js +5 -2
  60. package/dist/DateInput/PickerWheel.d.ts +19 -0
  61. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  62. package/dist/DateInput/PickerWheel.js +625 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +9 -30
  65. package/dist/DateInput/Wheel.d.ts +18 -37
  66. package/dist/DateInput/Wheel.d.ts.map +1 -1
  67. package/dist/DateInput/Wheel.js +84 -113
  68. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  69. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  70. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  71. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  72. package/dist/DateInput/usePointerDragScroll.js +2 -0
  73. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  74. package/dist/DateInput/useScrollSettle.js +3 -0
  75. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  76. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  77. package/dist/DateInput/useWheelListbox.js +88 -0
  78. package/dist/DateInput/wheelOptions.d.ts +74 -0
  79. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  80. package/dist/DateInput/wheelOptions.js +98 -0
  81. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  82. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  83. package/dist/DateInput/wheelPhysics.js +341 -0
  84. package/dist/DateInput/wheelStrip.d.ts +92 -0
  85. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  86. package/dist/DateInput/wheelStrip.js +258 -0
  87. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  88. package/dist/DateTimeInput/TouchDateTimeField.js +10 -10
  89. package/dist/Dialog/Dialog.d.ts.map +1 -1
  90. package/dist/Dialog/Dialog.js +9 -32
  91. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  92. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  93. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  94. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  95. package/dist/Field/Field.js +2 -2
  96. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  97. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  98. package/dist/FormLayout/FormLayout.d.ts +5 -1
  99. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  100. package/dist/HoverCard/HoverCard.d.ts +6 -4
  101. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  102. package/dist/HoverCard/HoverCard.js +48 -3
  103. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  104. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  105. package/dist/HoverCard/useHoverCard.js +20 -33
  106. package/dist/Icon/Icon.d.ts +5 -1
  107. package/dist/Icon/Icon.d.ts.map +1 -1
  108. package/dist/Icon/Icon.js +5 -2
  109. package/dist/InfoTip/InfoTip.d.ts +5 -5
  110. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  111. package/dist/InfoTip/InfoTip.js +58 -19
  112. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  113. package/dist/Item/useSwipeAction.js +3 -0
  114. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  115. package/dist/Layer/modalOutlet.js +2 -0
  116. package/dist/Layer/outsidePress.d.ts.map +1 -1
  117. package/dist/Layer/outsidePress.js +1 -0
  118. package/dist/Layer/useLayer.d.ts.map +1 -1
  119. package/dist/Layer/useLayer.js +4 -1
  120. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  121. package/dist/Layer/useLayerDismissal.js +3 -0
  122. package/dist/Layer/useTouchTrigger.d.ts +13 -7
  123. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  124. package/dist/Layer/useTouchTrigger.js +20 -6
  125. package/dist/Layout/index.d.ts +1 -1
  126. package/dist/Layout/index.d.ts.map +1 -1
  127. package/dist/Layout/index.js +1 -1
  128. package/dist/Layout/layoutReset.js +1 -1
  129. package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
  130. package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
  131. package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
  132. package/dist/Layout/padding.stylex.d.ts +5 -129
  133. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  134. package/dist/Layout/padding.stylex.js +9 -143
  135. package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
  136. package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
  137. package/dist/Layout/paddingStyles.stylex.js +99 -0
  138. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  139. package/dist/Lightbox/Lightbox.js +20 -1
  140. package/dist/MobileNav/MobileNav.d.ts +3 -2
  141. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  142. package/dist/MobileNav/MobileNav.js +10 -26
  143. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  144. package/dist/MultiSelector/MultiSelector.js +2 -1
  145. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  146. package/dist/NumberInput/NumberInput.js +2 -1
  147. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  148. package/dist/Outline/useOutlineFromDOM.js +3 -0
  149. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  150. package/dist/Outline/useScrollSpy.js +3 -0
  151. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  152. package/dist/OverflowList/OverflowList.js +3 -0
  153. package/dist/Popover/Popover.d.ts.map +1 -1
  154. package/dist/Popover/Popover.js +6 -0
  155. package/dist/Popover/usePopover.js +2 -2
  156. package/dist/PowerSearch/PowerSearch.d.ts +39 -4
  157. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  158. package/dist/PowerSearch/PowerSearch.js +441 -134
  159. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  160. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  161. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  162. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  163. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
  165. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  166. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  167. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  168. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  169. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearchToken.js +3 -2
  171. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  172. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
  174. package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
  175. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  176. package/dist/PowerSearch/formatFilterValue.js +31 -23
  177. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  178. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  179. package/dist/PowerSearch/formatTokenValue.js +161 -0
  180. package/dist/PowerSearch/index.d.ts +1 -1
  181. package/dist/PowerSearch/index.d.ts.map +1 -1
  182. package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
  183. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  184. package/dist/PowerSearch/powerSearchDateZone.js +57 -0
  185. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  186. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  187. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  188. package/dist/PowerSearch/types.d.ts +8 -1
  189. package/dist/PowerSearch/types.d.ts.map +1 -1
  190. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  191. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  192. package/dist/RadioList/RadioList.d.ts.map +1 -1
  193. package/dist/RadioList/RadioList.js +3 -2
  194. package/dist/RadioList/RadioListItem.d.ts +1 -1
  195. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  196. package/dist/RadioList/RadioListItem.js +5 -3
  197. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  198. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  199. package/dist/Resizable/ResizeHandle.js +101 -77
  200. package/dist/Resizable/createResizable.d.ts +145 -0
  201. package/dist/Resizable/createResizable.d.ts.map +1 -0
  202. package/dist/Resizable/createResizable.js +575 -0
  203. package/dist/Resizable/useResizable.d.ts +3 -3
  204. package/dist/Resizable/useResizable.d.ts.map +1 -1
  205. package/dist/Resizable/useResizable.js +252 -459
  206. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  207. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  208. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  209. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  210. package/dist/SelectableCard/SelectableCard.js +36 -11
  211. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  212. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  213. package/dist/SelectableCard/selectableCardInput.js +20 -0
  214. package/dist/Selector/Selector.d.ts.map +1 -1
  215. package/dist/Selector/Selector.js +7 -9
  216. package/dist/SideNav/SideNav.d.ts.map +1 -1
  217. package/dist/SideNav/SideNav.js +36 -5
  218. package/dist/Slider/Slider.d.ts.map +1 -1
  219. package/dist/Slider/Slider.js +16 -11
  220. package/dist/Slider/sliderTouchController.js +2 -2
  221. package/dist/Spinner/Spinner.d.ts +1 -1
  222. package/dist/Spinner/Spinner.d.ts.map +1 -1
  223. package/dist/Spinner/Spinner.js +60 -58
  224. package/dist/Stepper/Stepper.d.ts.map +1 -1
  225. package/dist/Stepper/Stepper.js +10 -15
  226. package/dist/Switch/Switch.d.ts.map +1 -1
  227. package/dist/Switch/Switch.js +4 -10
  228. package/dist/Switch/useSwitchTouch.js +4 -4
  229. package/dist/Table/BaseTable.d.ts.map +1 -1
  230. package/dist/Table/BaseTable.js +29 -8
  231. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  232. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  233. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  234. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  235. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  236. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  237. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  238. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  239. package/dist/TextArea/TextArea.d.ts.map +1 -1
  240. package/dist/TextArea/TextArea.js +2 -1
  241. package/dist/TextInput/TextInput.d.ts +2 -2
  242. package/dist/TextInput/TextInput.d.ts.map +1 -1
  243. package/dist/TextInput/TextInput.js +12 -8
  244. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  245. package/dist/TimeInput/TimeInput.js +2 -0
  246. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  247. package/dist/TimeInput/TouchTimeField.js +2 -0
  248. package/dist/Timer/Timer.d.ts.map +1 -1
  249. package/dist/Timer/Timer.js +2 -0
  250. package/dist/Timestamp/Timestamp.js +1 -1
  251. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  252. package/dist/Timestamp/formatInstant.js +1 -23
  253. package/dist/Toast/Toast.d.ts +11 -1
  254. package/dist/Toast/Toast.d.ts.map +1 -1
  255. package/dist/Toast/Toast.js +25 -15
  256. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  257. package/dist/Toast/ToastViewport.js +97 -34
  258. package/dist/Toast/types.d.ts +9 -3
  259. package/dist/Toast/types.d.ts.map +1 -1
  260. package/dist/Toast/useToast.d.ts.map +1 -1
  261. package/dist/Toast/useToast.js +1 -0
  262. package/dist/Tokenizer/Tokenizer.d.ts +44 -46
  263. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  264. package/dist/Tokenizer/Tokenizer.js +20 -21
  265. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  266. package/dist/Tokenizer/TokenizerBottomSheet.js +4 -6
  267. package/dist/Tokenizer/index.d.ts +1 -1
  268. package/dist/Tokenizer/index.d.ts.map +1 -1
  269. package/dist/Tooltip/Tooltip.d.ts +2 -23
  270. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  271. package/dist/Tooltip/Tooltip.js +5 -29
  272. package/dist/Tooltip/useTooltip.d.ts +23 -30
  273. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  274. package/dist/Tooltip/useTooltip.js +194 -108
  275. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  276. package/dist/Typeahead/BaseTypeahead.js +27 -18
  277. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  278. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  279. package/dist/animator/createAnimator.d.ts +98 -0
  280. package/dist/animator/createAnimator.d.ts.map +1 -0
  281. package/dist/animator/createAnimator.js +259 -0
  282. package/dist/astryx.css +41 -7
  283. package/dist/gestures/GestureHost.d.ts +16 -1
  284. package/dist/gestures/GestureHost.d.ts.map +1 -1
  285. package/dist/gestures/GestureHost.js +1 -1
  286. package/dist/gestures/PressTracker.d.ts.map +1 -1
  287. package/dist/gestures/PressTracker.js +4 -3
  288. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  289. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  290. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  291. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  292. package/dist/hooks/actionGroupTracker.js +13 -3
  293. package/dist/hooks/index.d.ts +1 -0
  294. package/dist/hooks/index.d.ts.map +1 -1
  295. package/dist/hooks/index.js +1 -0
  296. package/dist/hooks/longPressDetector.d.ts +66 -0
  297. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  298. package/dist/hooks/longPressDetector.js +200 -0
  299. package/dist/hooks/pressGroupContext.d.ts +6 -0
  300. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  301. package/dist/hooks/pressGroupContext.js +20 -0
  302. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  303. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  304. package/dist/hooks/rootScrollStyles.js +207 -0
  305. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  306. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  307. package/dist/hooks/scrollLockTouchGuard.js +117 -0
  308. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  309. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  310. package/dist/hooks/scrollbarGutter.js +36 -23
  311. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  312. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  313. package/dist/hooks/useActionGroupTracking.js +174 -0
  314. package/dist/hooks/useAnimator.d.ts +41 -0
  315. package/dist/hooks/useAnimator.d.ts.map +1 -0
  316. package/dist/hooks/useAnimator.js +70 -0
  317. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  318. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  319. package/dist/hooks/useAttachment.d.ts +1 -1
  320. package/dist/hooks/useAttachment.js +1 -1
  321. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  322. package/dist/hooks/useAutoMediaMode.js +1 -0
  323. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  324. package/dist/hooks/useBusyAnnouncement.js +2 -0
  325. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  326. package/dist/hooks/useDevWarning.js +2 -0
  327. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  328. package/dist/hooks/useFocusTrap.js +2 -0
  329. package/dist/hooks/useGridFocus.d.ts +8 -5
  330. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  331. package/dist/hooks/useGridFocus.js +4 -3
  332. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  333. package/dist/hooks/useHotkeys.js +3 -0
  334. package/dist/hooks/useImageMode.d.ts.map +1 -1
  335. package/dist/hooks/useImageMode.js +3 -0
  336. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  337. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  338. package/dist/hooks/useInputStatusIcon.js +2 -2
  339. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  340. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
  341. package/dist/hooks/useKeyboardHint.js +1 -1
  342. package/dist/hooks/useLongPress.d.ts +8 -9
  343. package/dist/hooks/useLongPress.d.ts.map +1 -1
  344. package/dist/hooks/useLongPress.js +23 -106
  345. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  346. package/dist/hooks/useMenuHover.js +2 -0
  347. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  348. package/dist/hooks/useMenuPress.js +3 -0
  349. package/dist/hooks/useOverflow.d.ts.map +1 -1
  350. package/dist/hooks/useOverflow.js +2 -1
  351. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  352. package/dist/hooks/usePressFeedback.js +1 -0
  353. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  354. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  355. package/dist/hooks/useResolvedRequired.js +3 -0
  356. package/dist/hooks/useScrollLock.d.ts +8 -9
  357. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  358. package/dist/hooks/useScrollLock.js +50 -48
  359. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  360. package/dist/hooks/useScrollableArea.js +5 -0
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +3 -0
  363. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  364. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  365. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  366. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  367. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  368. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  369. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  370. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  371. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  372. package/dist/i18n/generated-locales/en.generated.js +30 -0
  373. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  374. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  375. package/dist/index.d.ts +1 -0
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +4 -0
  378. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  379. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  380. package/dist/internal/indicatorPress.stylex.js +26 -0
  381. package/dist/internal/selectable-card.d.ts +21 -0
  382. package/dist/internal/selectable-card.d.ts.map +1 -0
  383. package/dist/internal/selectable-card.js +20 -0
  384. package/dist/internal/sheetDraft.d.ts +2 -2
  385. package/dist/internal/sheetDraft.js +2 -2
  386. package/dist/motion/animatedLayout.d.ts +8 -0
  387. package/dist/motion/animatedLayout.d.ts.map +1 -1
  388. package/dist/motion/animatedLayout.js +246 -53
  389. package/dist/motion/animator.d.ts +14 -14
  390. package/dist/motion/animator.d.ts.map +1 -1
  391. package/dist/motion/animator.js +45 -26
  392. package/dist/motion/frameBlock.d.ts +14 -0
  393. package/dist/motion/frameBlock.d.ts.map +1 -0
  394. package/dist/motion/frameBlock.js +16 -0
  395. package/dist/motion/progress.d.ts +88 -0
  396. package/dist/motion/progress.d.ts.map +1 -0
  397. package/dist/motion/progress.js +128 -0
  398. package/dist/motion/reducedMotion.d.ts.map +1 -1
  399. package/dist/motion/reducedMotion.js +3 -1
  400. package/dist/motion/uikit/alert.d.ts +41 -0
  401. package/dist/motion/uikit/alert.d.ts.map +1 -0
  402. package/dist/motion/uikit/alert.js +43 -0
  403. package/dist/motion/uikit/index.d.ts +4 -3
  404. package/dist/motion/uikit/index.d.ts.map +1 -1
  405. package/dist/motion/uikit/index.js +4 -3
  406. package/dist/motion/uikit/picker.d.ts +96 -0
  407. package/dist/motion/uikit/picker.d.ts.map +1 -0
  408. package/dist/motion/uikit/picker.js +117 -0
  409. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  410. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  411. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  412. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  413. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  414. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  415. package/dist/theme/Theme.d.ts.map +1 -1
  416. package/dist/theme/Theme.js +29 -4
  417. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  418. package/dist/theme/generateThemeRules.js +14 -13
  419. package/dist/theme/motionKnobs.d.ts +4 -3
  420. package/dist/theme/motionKnobs.d.ts.map +1 -1
  421. package/dist/theme/motionKnobs.js +3 -2
  422. package/dist/theme/themeMotion.d.ts +6 -0
  423. package/dist/theme/themeMotion.d.ts.map +1 -1
  424. package/dist/theme/themeMotion.js +15 -2
  425. package/dist/theme/tokens.stylex.d.ts +3 -0
  426. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  427. package/dist/theme/tokens.stylex.js +4 -1
  428. package/dist/utils/dateParser.d.ts.map +1 -1
  429. package/dist/utils/dateParser.js +12 -0
  430. package/dist/utils/disabledInteraction.d.ts +10 -2
  431. package/dist/utils/disabledInteraction.d.ts.map +1 -1
  432. package/dist/utils/disabledInteraction.js +16 -2
  433. package/dist/utils/focusReturn.d.ts +22 -25
  434. package/dist/utils/focusReturn.d.ts.map +1 -1
  435. package/dist/utils/focusReturn.js +36 -29
  436. package/dist/utils/index.d.ts +1 -1
  437. package/dist/utils/index.d.ts.map +1 -1
  438. package/dist/utils/index.js +1 -1
  439. package/dist/utils/interactionModality.d.ts.map +1 -1
  440. package/dist/utils/interactionModality.js +4 -0
  441. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  442. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  443. package/dist/utils/interactionOverlay.stylex.js +3 -2
  444. package/dist/utils/isFocusDetached.d.ts +27 -0
  445. package/dist/utils/isFocusDetached.d.ts.map +1 -0
  446. package/dist/utils/isFocusDetached.js +32 -0
  447. package/dist/utils/plainDate.d.ts +31 -0
  448. package/dist/utils/plainDate.d.ts.map +1 -1
  449. package/dist/utils/plainDate.js +68 -4
  450. package/dist/utils/pressFeedback.d.ts.map +1 -1
  451. package/dist/utils/pressFeedback.js +20 -6
  452. package/dist/utils/triggerFocus.d.ts +36 -0
  453. package/dist/utils/triggerFocus.d.ts.map +1 -0
  454. package/dist/utils/triggerFocus.js +65 -0
  455. package/locales/en.json +120 -0
  456. package/locales/pseudo.json +90 -0
  457. package/package.json +14 -9
  458. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  459. package/src/AlertDialog/AlertDialog.tsx +46 -5
  460. package/src/AppShell/AppShell.tsx +13 -4
  461. package/src/BottomSheet/BottomSheet.tsx +1 -0
  462. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  463. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  464. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  465. package/src/BottomSheet/useSheetGestures.ts +10 -1
  466. package/src/Button/Button.tsx +26 -4
  467. package/src/Calendar/Calendar.tsx +40 -32
  468. package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
  469. package/src/Calendar/hooks/useCalendarDays.ts +5 -10
  470. package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
  471. package/src/Carousel/Carousel.tsx +1 -0
  472. package/src/Chat/ChatComposerInput.tsx +4 -7
  473. package/src/Chat/ChatMessageList.tsx +2 -1
  474. package/src/Chat/useChatDictation.ts +1 -0
  475. package/src/Chat/useChatNewMessages.ts +1 -1
  476. package/src/Chat/useChatStreamScroll.ts +2 -0
  477. package/src/Chat/useSpeechRecognition.ts +2 -0
  478. package/src/Chat/useTriggerMenu.tsx +1 -1
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  480. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  481. package/src/CheckboxList/CheckboxList.doc.mjs +7 -0
  482. package/src/CheckboxList/CheckboxList.tsx +9 -0
  483. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  484. package/src/CodeBlock/CodeBlock.tsx +41 -4
  485. package/src/CommandPalette/CommandPalette.tsx +1 -0
  486. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  487. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  488. package/src/ContextMenu/ContextMenu.tsx +2 -2
  489. package/src/DateInput/MonthScroller.tsx +8 -2
  490. package/src/DateInput/PickerWheel.tsx +765 -0
  491. package/src/DateInput/TouchDateField.tsx +6 -32
  492. package/src/DateInput/Wheel.tsx +94 -150
  493. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  494. package/src/DateInput/usePointerDragScroll.ts +1 -0
  495. package/src/DateInput/useScrollSettle.ts +2 -0
  496. package/src/DateInput/useWheelListbox.ts +112 -0
  497. package/src/DateInput/wheelOptions.ts +155 -0
  498. package/src/DateInput/wheelPhysics.ts +406 -0
  499. package/src/DateInput/wheelStrip.ts +341 -0
  500. package/src/DateTimeInput/TouchDateTimeField.tsx +8 -13
  501. package/src/Dialog/Dialog.tsx +12 -32
  502. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  503. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  504. package/src/Field/Field.tsx +2 -2
  505. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  506. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  507. package/src/FormLayout/FormLayout.tsx +5 -1
  508. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  509. package/src/HoverCard/HoverCard.tsx +58 -6
  510. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  511. package/src/HoverCard/useHoverCard.tsx +49 -54
  512. package/src/Icon/Icon.doc.mjs +51 -10
  513. package/src/Icon/Icon.tsx +15 -7
  514. package/src/IconButton/IconButton.doc.mjs +141 -21
  515. package/src/InfoTip/InfoTip.tsx +72 -16
  516. package/src/Item/useSwipeAction.ts +2 -0
  517. package/src/Layer/modalOutlet.ts +2 -0
  518. package/src/Layer/outsidePress.ts +1 -0
  519. package/src/Layer/useLayer.tsx +3 -1
  520. package/src/Layer/useLayerDismissal.ts +2 -0
  521. package/src/Layer/useTouchTrigger.ts +19 -6
  522. package/src/Layout/index.ts +1 -1
  523. package/src/Layout/layoutReset.ts +1 -1
  524. package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
  525. package/src/Layout/padding.stylex.ts +9 -133
  526. package/src/Layout/paddingStyles.stylex.ts +87 -0
  527. package/src/Lightbox/Lightbox.tsx +20 -1
  528. package/src/Lightbox/useLightbox.doc.mjs +167 -0
  529. package/src/MobileNav/MobileNav.tsx +10 -31
  530. package/src/MultiSelector/MultiSelector.tsx +2 -7
  531. package/src/NumberInput/NumberInput.tsx +2 -7
  532. package/src/Outline/useOutlineFromDOM.ts +2 -0
  533. package/src/Outline/useScrollSpy.ts +2 -0
  534. package/src/OverflowList/OverflowList.tsx +2 -0
  535. package/src/Popover/Popover.tsx +4 -0
  536. package/src/Popover/usePopover.tsx +2 -2
  537. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  538. package/src/PowerSearch/PowerSearch.tsx +620 -157
  539. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  540. package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
  541. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  542. package/src/PowerSearch/PowerSearchToken.tsx +2 -0
  543. package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
  544. package/src/PowerSearch/formatFilterValue.ts +49 -27
  545. package/src/PowerSearch/formatTokenValue.ts +220 -0
  546. package/src/PowerSearch/index.ts +5 -1
  547. package/src/PowerSearch/powerSearchDateZone.ts +95 -0
  548. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  549. package/src/PowerSearch/types.ts +8 -1
  550. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  551. package/src/RadioList/RadioList.tsx +3 -2
  552. package/src/RadioList/RadioListItem.tsx +5 -3
  553. package/src/Resizable/Resizable.doc.mjs +5 -4
  554. package/src/Resizable/ResizeHandle.tsx +169 -109
  555. package/src/Resizable/createResizable.ts +831 -0
  556. package/src/Resizable/useResizable.ts +292 -623
  557. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  558. package/src/SelectableCard/SelectableCard.tsx +39 -10
  559. package/src/SelectableCard/selectableCardInput.ts +30 -0
  560. package/src/Selector/Selector.tsx +7 -19
  561. package/src/SideNav/SideNav.tsx +41 -5
  562. package/src/Slider/Slider.tsx +20 -11
  563. package/src/Slider/sliderTouchController.ts +2 -2
  564. package/src/Spinner/Spinner.tsx +77 -63
  565. package/src/Stepper/Stepper.tsx +10 -27
  566. package/src/Switch/Switch.tsx +2 -6
  567. package/src/Switch/useSwitchTouch.ts +4 -4
  568. package/src/Table/BaseTable.tsx +46 -12
  569. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  570. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  571. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  572. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  573. package/src/TextArea/TextArea.tsx +2 -7
  574. package/src/TextInput/TextInput.tsx +13 -17
  575. package/src/TimeInput/TimeInput.tsx +2 -0
  576. package/src/TimeInput/TouchTimeField.tsx +2 -0
  577. package/src/Timer/Timer.tsx +1 -0
  578. package/src/Timestamp/Timestamp.tsx +1 -1
  579. package/src/Timestamp/formatInstant.ts +1 -33
  580. package/src/Toast/Toast.doc.mjs +4 -3
  581. package/src/Toast/Toast.tsx +52 -32
  582. package/src/Toast/ToastViewport.tsx +123 -35
  583. package/src/Toast/types.ts +9 -3
  584. package/src/Toast/useToast.tsx +1 -0
  585. package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
  586. package/src/Tokenizer/Tokenizer.tsx +61 -62
  587. package/src/Tokenizer/TokenizerBottomSheet.tsx +9 -11
  588. package/src/Tokenizer/index.ts +1 -0
  589. package/src/Tooltip/Tooltip.tsx +6 -42
  590. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  591. package/src/Tooltip/useTooltip.tsx +237 -134
  592. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  593. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  594. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  595. package/src/animator/createAnimator.doc.mjs +153 -0
  596. package/src/animator/createAnimator.ts +324 -0
  597. package/src/gestures/GestureHost.ts +1 -1
  598. package/src/gestures/PressTracker.ts +4 -3
  599. package/src/gestures/README.md +10 -4
  600. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  601. package/src/hooks/actionGroupTracker.ts +20 -5
  602. package/src/hooks/index.ts +2 -0
  603. package/src/hooks/longPressDetector.ts +273 -0
  604. package/src/hooks/pressGroupContext.ts +21 -0
  605. package/src/hooks/rootScrollStyles.ts +247 -0
  606. package/src/hooks/scrollLockTouchGuard.ts +149 -0
  607. package/src/hooks/scrollbarGutter.ts +41 -26
  608. package/src/hooks/useActionGroupTracking.ts +224 -0
  609. package/src/hooks/useAnimator.doc.mjs +109 -0
  610. package/src/hooks/useAnimator.ts +67 -0
  611. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  612. package/src/hooks/useAttachment.ts +1 -1
  613. package/src/hooks/useAutoMediaMode.ts +1 -0
  614. package/src/hooks/useBusyAnnouncement.ts +2 -0
  615. package/src/hooks/useDevWarning.ts +2 -0
  616. package/src/hooks/useFocusTrap.ts +2 -0
  617. package/src/hooks/useGridFocus.doc.mjs +6 -6
  618. package/src/hooks/useGridFocus.ts +10 -7
  619. package/src/hooks/useHotkeys.ts +2 -0
  620. package/src/hooks/useImageMode.ts +2 -0
  621. package/src/hooks/useInputStatusIcon.tsx +3 -2
  622. package/src/hooks/useKeyboardHint.tsx +1 -1
  623. package/src/hooks/useLongPress.doc.mjs +2 -2
  624. package/src/hooks/useLongPress.ts +32 -122
  625. package/src/hooks/useMenuHover.ts +1 -0
  626. package/src/hooks/useMenuPress.ts +2 -0
  627. package/src/hooks/useOverflow.ts +2 -1
  628. package/src/hooks/usePressFeedback.ts +1 -0
  629. package/src/hooks/useResolvedRequired.ts +3 -0
  630. package/src/hooks/useScrollLock.doc.mjs +51 -12
  631. package/src/hooks/useScrollLock.ts +53 -60
  632. package/src/hooks/useScrollableArea.ts +4 -0
  633. package/src/hooks/useStreamingText.ts +2 -0
  634. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  635. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  636. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  637. package/src/i18n/generated-locales/en.generated.ts +41 -0
  638. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  639. package/src/index.ts +13 -0
  640. package/src/internal/indicatorPress.stylex.ts +24 -0
  641. package/src/internal/selectable-card.ts +21 -0
  642. package/src/internal/sheetDraft.ts +2 -2
  643. package/src/motion/MEASUREMENTS.md +18 -0
  644. package/src/motion/README.md +10 -5
  645. package/src/motion/animatedLayout.ts +323 -60
  646. package/src/motion/animator.ts +66 -37
  647. package/src/motion/frameBlock.ts +16 -0
  648. package/src/motion/progress.ts +155 -0
  649. package/src/motion/reducedMotion.ts +3 -1
  650. package/src/motion/uikit/alert.ts +43 -0
  651. package/src/motion/uikit/index.ts +4 -3
  652. package/src/motion/uikit/picker.ts +116 -0
  653. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  654. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  655. package/src/theme/Theme.tsx +37 -3
  656. package/src/theme/generateThemeRules.ts +14 -12
  657. package/src/theme/motionKnobs.ts +4 -3
  658. package/src/theme/themeMotion.ts +17 -2
  659. package/src/theme/tokens.stylex.ts +2 -0
  660. package/src/utils/dateParser.ts +16 -0
  661. package/src/utils/disabledInteraction.ts +23 -2
  662. package/src/utils/focusReturn.ts +38 -31
  663. package/src/utils/index.ts +1 -1
  664. package/src/utils/interactionModality.ts +4 -0
  665. package/src/utils/interactionOverlay.stylex.ts +3 -2
  666. package/src/utils/isFocusDetached.ts +34 -0
  667. package/src/utils/plainDate.ts +80 -4
  668. package/src/utils/pressFeedback.ts +24 -6
  669. package/src/utils/triggerFocus.ts +80 -0
  670. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
  671. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
  672. package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
  673. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
  674. package/dist/Layer/usePressPin.d.ts +0 -93
  675. package/dist/Layer/usePressPin.d.ts.map +0 -1
  676. package/dist/Layer/usePressPin.js +0 -363
  677. package/dist/internal/touch-sheet.d.ts +0 -21
  678. package/dist/internal/touch-sheet.d.ts.map +0 -1
  679. package/dist/internal/touch-sheet.js +0 -19
  680. package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
  681. package/src/Layer/usePressPin.ts +0 -510
  682. package/src/internal/touch-sheet.ts +0 -21
@@ -23,14 +23,7 @@
23
23
  * - /packages/cli/assets/templates/blocks/components/Stepper/ (showcase blocks)
24
24
  */
25
25
 
26
- import {
27
- useCallback,
28
- useEffect,
29
- useMemo,
30
- useRef,
31
- useState,
32
- type ReactNode,
33
- } from 'react';
26
+ import {useCallback, useMemo, useRef, useState, type ReactNode} from 'react';
34
27
  import * as stylex from '@stylexjs/stylex';
35
28
 
36
29
  import {spacingVars} from '../theme/tokens.stylex';
@@ -360,32 +353,22 @@ export function Stepper({
360
353
  // still owns the ref and DOM pass-throughs and fills that frame, so its width
361
354
  // is the effective component width to observe.
362
355
  const [rootWidth, setRootWidth] = useState(0);
363
- const stopObservingRootRef = useRef<(() => void) | null>(null);
364
356
  const attachRoot = useCallback(
365
357
  (el: HTMLOListElement | null) => {
366
- stopObservingRootRef.current?.();
367
- stopObservingRootRef.current = null;
368
- if (el && isHorizontal) {
369
- // observeResize calls back once, synchronously, as it subscribes. That
370
- // is what keeps the collapse off the screen: a ref callback runs during
371
- // commit, so the width lands and the re-render happens before the
372
- // browser has painted the uncollapsed stepper it would otherwise show
373
- // first.
374
- stopObservingRootRef.current = observeResize(el, entry =>
375
- setRootWidth(entry.target.clientWidth),
376
- );
358
+ if (el == null || !isHorizontal) {
359
+ return;
377
360
  }
361
+ // observeResize calls back once, synchronously, as it subscribes. That
362
+ // is what keeps the collapse off the screen: a ref callback runs during
363
+ // commit, so the width lands and the re-render happens before the
364
+ // browser has painted the uncollapsed stepper it would otherwise show
365
+ // first. React calls the returned unsubscribe when the list detaches or
366
+ // when the orientation changes.
367
+ return observeResize(el, entry => setRootWidth(entry.target.clientWidth));
378
368
  },
379
369
  [isHorizontal],
380
370
  );
381
371
  const rootRef = useMergedRefs(ref, attachRoot);
382
- useEffect(
383
- () => () => {
384
- stopObservingRootRef.current?.();
385
- stopObservingRootRef.current = null;
386
- },
387
- [],
388
- );
389
372
 
390
373
  // Width is measured rather than asked of a container query because the
391
374
  // answer changes what is *rendered*, not just how it looks: the labels and
@@ -52,7 +52,6 @@ import type {BaseProps} from '../BaseProps';
52
52
  import type {SizeValue} from '../utils/types';
53
53
  import {themeProps} from '../utils/themeProps';
54
54
  import {useAnnounce} from '../hooks/useAnnounce';
55
- import {useResolvedRequired} from '../hooks/useResolvedRequired';
56
55
 
57
56
  import {useMergedRefs} from '../hooks/useMergedRefs';
58
57
  import {usePressFeedback} from '../hooks/usePressFeedback';
@@ -867,10 +866,6 @@ export function Switch({
867
866
  const pressable = usePressFeedback();
868
867
  const descriptionID = useId();
869
868
  const statusMessageID = useId();
870
- // Announce the effective required state (form default included) while the
871
- // native `required` stays bound to the explicit `isRequired` so a layout
872
- // default never switches on browser validation.
873
- const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
874
869
 
875
870
  const [, startTransition] = useTransition();
876
871
  const [optimisticValue, setOptimisticValue] = useOptimistic(value);
@@ -1003,7 +998,8 @@ export function Switch({
1003
998
  aria-disabled={isDisabled ? 'true' : undefined}
1004
999
  form={isDisabled ? '' : undefined}
1005
1000
  required={isRequired}
1006
- aria-required={isEffectivelyRequired ? 'true' : undefined}
1001
+ // A form's required default sets nothing here: an off switch is an answer.
1002
+ aria-required={isRequired ? 'true' : undefined}
1007
1003
  onChange={e => {
1008
1004
  if (isDisabled || isBusy) {
1009
1005
  return;
@@ -23,7 +23,7 @@ import type {GestureTouch} from '../gestures/types';
23
23
  import {isRtlElement} from '../hooks/isRtlElement';
24
24
  import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
25
25
  import {
26
- createAnimator,
26
+ createMotionAnimator,
27
27
  type Animator,
28
28
  type MotionCurve,
29
29
  } from '../motion/animator';
@@ -282,15 +282,15 @@ export class SwitchTouchController {
282
282
  return;
283
283
  }
284
284
  registerSwitchTable();
285
- this.thumb = createAnimator(elements.thumb);
285
+ this.thumb = createMotionAnimator(elements.thumb);
286
286
  // The layer rests clear (its class's opacity 0) while the visuals show
287
287
  // the value; from here its opacity is the animator's.
288
- this.fade = createAnimator(elements.track, {
288
+ this.fade = createMotionAnimator(elements.track, {
289
289
  pseudoElement: '::after',
290
290
  initial: {opacity: 0},
291
291
  });
292
292
  this.fade.set({opacity: 0});
293
- this.shadow = createAnimator(elements.thumb, {
293
+ this.shadow = createMotionAnimator(elements.thumb, {
294
294
  pseudoElement: '::after',
295
295
  initial: {opacity: 0},
296
296
  });
@@ -14,7 +14,14 @@
14
14
  * - /packages/cli/assets/templates/blocks/components/Table/ (showcase blocks)
15
15
  */
16
16
 
17
- import {memo, useRef, type ReactElement, type ReactNode, type Ref} from 'react';
17
+ import {
18
+ memo,
19
+ useId,
20
+ useRef,
21
+ type ReactElement,
22
+ type ReactNode,
23
+ type Ref,
24
+ } from 'react';
18
25
  import {isRenderable} from '../utils/isRenderable';
19
26
  import * as stylex from '@stylexjs/stylex';
20
27
  import {spacingVars} from '../theme/tokens.stylex';
@@ -423,6 +430,7 @@ function BaseTableInner<T extends Record<string, unknown>>({
423
430
  } satisfies TableRenderProps);
424
431
 
425
432
  // --- Plugin pipeline: header cells ---
433
+ const headerLabelIdBase = useId();
426
434
  const headerCells = resolvedColumns.map((col, columnIndex) => {
427
435
  const headerContent = col.header ?? col.key;
428
436
 
@@ -477,28 +485,54 @@ function BaseTableInner<T extends Record<string, unknown>>({
477
485
  const hasSlots =
478
486
  before != null || after != null || overlay != null || below != null;
479
487
 
480
- const headerInner = hasSlots ? (
488
+ const labelRow = isRenderable(after) ? (
489
+ <div {...stylex.props(styles.headerLabelRow)}>
490
+ {resolvedContent}
491
+ {after}
492
+ </div>
493
+ ) : (
494
+ resolvedContent
495
+ );
496
+
497
+ // The overlay is a control of its own. Keep its name and value out of the
498
+ // header's name.
499
+ const namesOwnHeader =
500
+ isRenderable(overlay) &&
501
+ mergedHtmlProps['aria-label'] == null &&
502
+ mergedHtmlProps['aria-labelledby'] == null;
503
+ const labelId = `${headerLabelIdBase}-label-${columnIndex}`;
504
+ const belowId = `${headerLabelIdBase}-below-${columnIndex}`;
505
+ const hasBelow = isRenderable(below);
506
+
507
+ const headerInner = !hasSlots ? (
508
+ resolvedContent
509
+ ) : namesOwnHeader ? (
510
+ <>
511
+ {/* Inline, so the cell's text-overflow still reaches the label. */}
512
+ <span id={labelId}>
513
+ {before}
514
+ {labelRow}
515
+ </span>
516
+ {overlay}
517
+ {hasBelow && <div id={belowId}>{below}</div>}
518
+ </>
519
+ ) : (
481
520
  <>
482
521
  {before}
483
- {isRenderable(after) ? (
484
- <div {...stylex.props(styles.headerLabelRow)}>
485
- {resolvedContent}
486
- {after}
487
- </div>
488
- ) : (
489
- resolvedContent
490
- )}
522
+ {labelRow}
491
523
  {overlay}
492
524
  {below}
493
525
  </>
494
- ) : (
495
- resolvedContent
496
526
  );
527
+ const headerNameProps = namesOwnHeader
528
+ ? {'aria-labelledby': hasBelow ? `${labelId} ${belowId}` : labelId}
529
+ : {};
497
530
 
498
531
  return (
499
532
  <HeaderCellComponent
500
533
  key={col.key}
501
534
  {...mergedHtmlProps}
535
+ {...headerNameProps}
502
536
  {...headerTitleProp}
503
537
  contextMenuActions={cellRenderProps.contextMenuActions}
504
538
  xstyle={cellRenderProps.xstyle}>
@@ -865,7 +865,7 @@ export function useTableColumnResize<T extends Record<string, unknown>>(
865
865
  }
866
866
  }, []);
867
867
 
868
- // Clean up observer on unmount
868
+ // Releases the table resize observer on unmount.
869
869
  useEffect(() => {
870
870
  return () => {
871
871
  unobserveTableRef.current?.();
@@ -934,6 +934,7 @@ export function useTableColumnResize<T extends Record<string, unknown>>(
934
934
  };
935
935
  }, []);
936
936
 
937
+ // Releases the resize gate on unmount.
937
938
  useEffect(() => {
938
939
  return () => {
939
940
  gateCleanupRef.current?.();
@@ -820,6 +820,7 @@ function StringListFilterControl({
820
820
  }}
821
821
  size={size}
822
822
  hasClear={hasClear}
823
+ presentation="popover"
823
824
  />
824
825
  );
825
826
  }
@@ -439,6 +439,8 @@ function PanelDividerModeWatch({
439
439
  const {mode} = useTheme();
440
440
  const themeName = useThemeName();
441
441
  const lastRef = useRef({mode, themeName});
442
+ // Syncs the panel dividers with the computed theme CSS after a color mode or
443
+ // theme change.
442
444
  useLayoutEffect(() => {
443
445
  const last = lastRef.current;
444
446
  if (last.mode === mode && last.themeName === themeName) {
@@ -703,6 +705,8 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
703
705
  }
704
706
  }
705
707
  }, []);
708
+ // Syncs the chevron transitions with the `animatedLayout` handle. Without a
709
+ // handle, the chevrons use the theme's turn.
706
710
  useLayoutEffect(() => {
707
711
  if (animatedLayout == null) {
708
712
  resetChevrons();
@@ -432,6 +432,8 @@ function PinnedDividerModeWatch({
432
432
  const {mode} = useTheme();
433
433
  const themeName = useThemeName();
434
434
  const lastRef = useRef({mode, themeName});
435
+ // Syncs the pinned divider with the computed theme CSS after a color mode or
436
+ // theme change.
435
437
  useLayoutEffect(() => {
436
438
  const last = lastRef.current;
437
439
  if (last.mode !== mode || last.themeName !== themeName) {
@@ -45,6 +45,7 @@ import {
45
45
  } from '../Field';
46
46
  import {Icon, renderIconSlot, type IconType} from '../Icon';
47
47
  import {isRenderable} from '../utils/isRenderable';
48
+ import {withholdCallerHandlers} from '../utils/disabledInteraction';
48
49
  import {Spinner} from '../Spinner';
49
50
  import {useTooltip} from '../Tooltip';
50
51
  import {mergeProps} from '../utils';
@@ -476,13 +477,7 @@ export function TextArea({
476
477
  const showsDisabledMessage = isDisabled && !!disabledMessage;
477
478
  // A disabled field keeps its tab stop but, like a natively disabled one,
478
479
  // runs no caller event handler other than focus and blur (`spec:AST-085` FR2).
479
- const fieldProps = isDisabled
480
- ? Object.fromEntries(
481
- Object.entries(rest).filter(
482
- ([key]) => !/^on[A-Z]/.test(key) || /^on(Focus|Blur)/.test(key),
483
- ),
484
- )
485
- : rest;
480
+ const fieldProps = withholdCallerHandlers(rest, isDisabled);
486
481
  const disabledMessageTooltip = useTooltip({
487
482
  placement: 'above',
488
483
  // The container div is not naturally focusable; focusin bubbles up from
@@ -35,21 +35,23 @@ import {
35
35
  typographyVars,
36
36
  typeScaleVars,
37
37
  } from '../theme/tokens.stylex';
38
+ import {Field} from '../Field/Field';
39
+ import {InputClearButton} from '../Field/InputClearButton';
38
40
  import {
39
- Field,
40
- InputClearButton,
41
- type InputStatus,
42
41
  inputWrapperStyles,
43
42
  inputStatusBorderStyles,
44
43
  inputStatusHoverShadowStyles,
45
44
  inputStatusFocusWithinStyles,
46
- } from '../Field';
47
- import {renderIconSlot, type IconType} from '../Icon';
45
+ } from '../Field/inputStyles.stylex';
46
+ import type {InputStatus} from '../Field/types';
47
+ import {renderIconSlot, type IconType} from '../Icon/Icon';
48
48
  import {isRenderable} from '../utils/isRenderable';
49
- import {Spinner} from '../Spinner';
50
- import {useTooltip} from '../Tooltip';
51
- import {VisuallyHidden} from '../VisuallyHidden';
52
- import {getInputARIA, isImeKeyEvent} from '../utils';
49
+ import {withholdCallerHandlers} from '../utils/disabledInteraction';
50
+ import {Spinner} from '../Spinner/Spinner';
51
+ import {useTooltip} from '../Tooltip/useTooltip';
52
+ import {VisuallyHidden} from '../VisuallyHidden/VisuallyHidden';
53
+ import {getInputARIA} from '../utils/inputAria';
54
+ import {isImeKeyEvent} from '../utils/ime';
53
55
  import {
54
56
  textEntryTraitAttributes,
55
57
  type TextEntryTraitProps,
@@ -109,7 +111,7 @@ export type {
109
111
  InputStatus as TextInputStatus,
110
112
  InputStatusType as TextInputStatusType,
111
113
  } from '../Field';
112
- import {mergeProps} from '../utils';
114
+ import {mergeProps} from '../utils/mergeProps';
113
115
  import {useSize} from '../SizeContext/SizeContext';
114
116
  import {useInputContainer} from '../hooks/useInputContainer';
115
117
  import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
@@ -373,13 +375,7 @@ export function TextInput({
373
375
  const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
374
376
  // A disabled field keeps its tab stop but, like a natively disabled one,
375
377
  // runs no caller event handler other than focus and blur (`spec:AST-085` FR2).
376
- const fieldProps = isDisabled
377
- ? Object.fromEntries(
378
- Object.entries(rest).filter(
379
- ([key]) => !/^on[A-Z]/.test(key) || /^on(Focus|Blur)/.test(key),
380
- ),
381
- )
382
- : rest;
378
+ const fieldProps = withholdCallerHandlers(rest, isDisabled);
383
379
  const size = useSize(sizeProp, 'md');
384
380
 
385
381
  const generatedID = useId();
@@ -491,6 +491,8 @@ function TimeField({
491
491
  // region mounted together with its content is not reliably announced.
492
492
  // Ungrouped mode delegates to Field -> FieldStatus, which announces itself.
493
493
  const announce = useAnnounce();
494
+ // Syncs the live region with `status.message` when the field is in an
495
+ // InputGroup.
494
496
  useEffect(() => {
495
497
  if (inputGroup && status?.message) {
496
498
  announce(
@@ -378,6 +378,8 @@ export function TouchTimeField({
378
378
  return {
379
379
  value: hour,
380
380
  label: String(hour),
381
+ // Keys step in time order: 12 PM comes before 1 PM.
382
+ order: hour24,
381
383
  isDisabled: !rangeOverlaps(
382
384
  hour24 * 3600,
383
385
  hour24 * 3600 + 3599,
@@ -186,6 +186,7 @@ export function Timer({
186
186
  const resolvedFormat = resolveFormat(format);
187
187
  const initialPresentation = getPresentation(0, resolvedFormat);
188
188
 
189
+ // Syncs the elapsed-time text with a timer.
189
190
  useEffect(() => {
190
191
  const resolvedStartTime =
191
192
  startTime !== undefined && Number.isFinite(startTime)
@@ -378,7 +378,7 @@ export function Timestamp({
378
378
  ? formatInstant(date, 'full', locale, {timeZoneNameStyle: 'long'})
379
379
  : '';
380
380
 
381
- // Live updates
381
+ // Syncs the relative time with an interval timer while the timestamp is live.
382
382
  useEffect(() => {
383
383
  if (!isLive || !isValidDate || !isRelativeFormat(effectiveFormat)) {
384
384
  return;
@@ -29,7 +29,7 @@
29
29
  * - /packages/core/src/Timestamp/Timestamp.test.tsx
30
30
  */
31
31
 
32
- import {SHARED_DATE_FORMAT_OPTIONS, getTimeZoneParts} from '../utils/plainDate';
32
+ import {SHARED_DATE_FORMAT_OPTIONS, getWallClock} from '../utils/plainDate';
33
33
  import type {Locale} from '../i18n/types';
34
34
  import type {TimestampFormat} from './Timestamp';
35
35
 
@@ -125,38 +125,6 @@ function pad(n: number): string {
125
125
  return String(n).padStart(2, '0');
126
126
  }
127
127
 
128
- /** The fields a `system_*` string is assembled from. */
129
- interface WallClock {
130
- year: number;
131
- month: number;
132
- day: number;
133
- hour: number;
134
- minute: number;
135
- second: number;
136
- }
137
-
138
- /**
139
- * Wall-clock fields for an instant: in the named zone, or — with no zone —
140
- * the viewer's own, read straight off the `Date`. The zone-less branch
141
- * deliberately stays on plain getters so the default rendering never gains a
142
- * dependency on `Intl` zone data it did not have before.
143
- *
144
- * The explicit return type is load-bearing: it is what forces the two branches
145
- * to keep producing the same shape.
146
- */
147
- function getWallClock(date: Date, timeZone: string | undefined): WallClock {
148
- return timeZone === undefined
149
- ? {
150
- year: date.getFullYear(),
151
- month: date.getMonth() + 1,
152
- day: date.getDate(),
153
- hour: date.getHours(),
154
- minute: date.getMinutes(),
155
- second: date.getSeconds(),
156
- }
157
- : getTimeZoneParts(date.getTime(), timeZone);
158
- }
159
-
160
128
  /**
161
129
  * Renders one instant in one absolute format.
162
130
  *
@@ -89,7 +89,7 @@ export const docs = {
89
89
  name: 'renderContent',
90
90
  type: '(toast: ToastContentRenderProps) => ReactNode',
91
91
  description:
92
- "Replaces the content of this toast's card with your own layout. Astryx keeps the card, its astryx-toast theme target, the live-region role and auto-hide behavior, then hands the renderer the message, endContent, resolved toast settings and a dismiss callback. The custom renderer owns every control in its layout: compose the control you want and call dismiss from it. Astryx does not inject a fallback close into custom content. Per-toast: an app shares one layout by wrapping useToast and passing it on every call, while a toast raised by library code that never passes it renders as an ordinary Astryx toast. The argument is {body, endContent, type, isAutoHide, autoHideDuration, dismiss}, where type is 'info' | 'error'.",
92
+ "Replaces the content of this toast's card with your own layout. Astryx keeps the card, its astryx-toast theme target and auto-hide behavior (inside a ToastViewport the viewport announces the toast, and while a modal hosts the viewport the card announces itself), then hands the renderer the message, endContent, resolved toast settings and a dismiss callback. The custom renderer owns every control in its layout: compose the control you want and call dismiss from it. Astryx does not inject a fallback close into custom content. Per-toast: an app shares one layout by wrapping useToast and passing it on every call, while a toast raised by library code that never passes it renders as an ordinary Astryx toast. The argument is {body, endContent, type, isAutoHide, autoHideDuration, dismiss}, where type is 'info' | 'error'.",
93
93
  },
94
94
  ],
95
95
  theming: {
@@ -211,7 +211,7 @@ export const docsZh = {
211
211
  collisionBehavior: '当已存在相同 uniqueID 的 toast 时的行为。',
212
212
  onHide: '当 toast 被移除时触发的回调。',
213
213
  renderContent:
214
- "用你自己的布局替换该 toast 卡片内部的内容。Astryx 保留卡片本身、astryx-toast 主题目标、实时区域角色和自动关闭行为,并把消息、endContent、解析后的 toast 设置和 dismiss 回调交给渲染函数。自定义渲染函数完全拥有布局中的控件:请组合所需的控件并通过它调用 dismiss。Astryx 不会向自定义内容注入后备关闭按钮。按 toast 单独设置:应用可通过封装 useToast 并在每次调用时传入来共享同一套布局;而由库代码发起、从不传入该参数的 toast 会渲染为普通的 Astryx toast。传入参数为 {body, endContent, type, isAutoHide, autoHideDuration, dismiss},其中 type 为 'info' | 'error'。",
214
+ "用你自己的布局替换该 toast 卡片内部的内容。Astryx 保留卡片本身、astryx-toast 主题目标和自动关闭行为(在 ToastViewport 中由视口播报该 toast;当模态框承载视口时由卡片自行播报),并把消息、endContent、解析后的 toast 设置和 dismiss 回调交给渲染函数。自定义渲染函数完全拥有布局中的控件:请组合所需的控件并通过它调用 dismiss。Astryx 不会向自定义内容注入后备关闭按钮。按 toast 单独设置:应用可通过封装 useToast 并在每次调用时传入来共享同一套布局;而由库代码发起、从不传入该参数的 toast 会渲染为普通的 Astryx toast。传入参数为 {body, endContent, type, isAutoHide, autoHideDuration, dismiss},其中 type 为 'info' | 'error'。",
215
215
  },
216
216
  usage: {
217
217
  description:
@@ -328,6 +328,7 @@ export const docsDense = {
328
328
  uniqueID: 'unique id for dedup',
329
329
  collisionBehavior: 'behavior when matching uniqueID exists',
330
330
  onHide: 'callback when toast removed',
331
- renderContent: 'custom inner layout; receives content, resolved settings + dismiss callback; no injected fallback control',
331
+ renderContent:
332
+ 'custom inner layout; receives content, resolved settings + dismiss callback; no injected fallback control',
332
333
  },
333
334
  };
@@ -154,6 +154,16 @@ export interface ToastProps {
154
154
 
155
155
  interface ToastSurfaceProps extends ToastProps {
156
156
  gestureDirection: ToastGestureDirection;
157
+ /**
158
+ * Changes when a uniqueID overwrite updates this card in place: the new
159
+ * toast's auto-hide timer starts over.
160
+ */
161
+ timerKey?: string;
162
+ /**
163
+ * False when the viewport announces the toast: the card then carries no
164
+ * live region of its own, so an update in place is announced once.
165
+ */
166
+ isLiveRegion?: boolean;
157
167
  }
158
168
 
159
169
  /**
@@ -193,6 +203,8 @@ export function ToastSurface({
193
203
  onDismiss,
194
204
  renderContent,
195
205
  gestureDirection,
206
+ timerKey,
207
+ isLiveRegion = true,
196
208
  }: ToastSurfaceProps) {
197
209
  const t = useComponentTranslator();
198
210
  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
@@ -226,34 +238,28 @@ export function ToastSurface({
226
238
  }, remainingRef.current);
227
239
  }, [isAutoHide]);
228
240
 
229
- const pauseTimer = useCallback(
230
- (source: PauseSource) => {
231
- if (!isAutoHide) {
232
- return;
233
- }
234
- const sources = pauseSourcesRef.current;
235
- const wasRunning = sources.size === 0;
236
- sources.add(source);
237
- if (!wasRunning) {
238
- return;
239
- }
240
- if (timerRef.current) {
241
- clearTimeout(timerRef.current);
242
- timerRef.current = null;
243
- }
244
- if (startTimeRef.current != null) {
245
- const elapsed = Date.now() - startTimeRef.current;
246
- remainingRef.current = Math.max(remainingRef.current - elapsed, 1000);
247
- }
248
- },
249
- [isAutoHide],
250
- );
241
+ // Pointer, focus and gesture holds are tracked whatever isAutoHide is: an
242
+ // overwrite can turn a toast that does not auto-hide into one that does
243
+ // while a hold is in place. The window hold leaves with its listeners.
244
+ const pauseTimer = useCallback((source: PauseSource) => {
245
+ const sources = pauseSourcesRef.current;
246
+ const wasRunning = sources.size === 0;
247
+ sources.add(source);
248
+ if (!wasRunning) {
249
+ return;
250
+ }
251
+ if (timerRef.current) {
252
+ clearTimeout(timerRef.current);
253
+ timerRef.current = null;
254
+ }
255
+ if (startTimeRef.current != null) {
256
+ const elapsed = Date.now() - startTimeRef.current;
257
+ remainingRef.current = Math.max(remainingRef.current - elapsed, 1000);
258
+ }
259
+ }, []);
251
260
 
252
261
  const resumeTimer = useCallback(
253
262
  (source: PauseSource) => {
254
- if (!isAutoHide) {
255
- return;
256
- }
257
263
  const sources = pauseSourcesRef.current;
258
264
  if (!sources.delete(source)) {
259
265
  return;
@@ -271,20 +277,31 @@ export function ToastSurface({
271
277
  }
272
278
  startTimer();
273
279
  },
274
- [isAutoHide, startTimer],
280
+ [startTimer],
275
281
  );
276
282
 
277
283
  useEffect(() => {
278
284
  remainingRef.current = autoHideDuration;
285
+ // An update in place can remove the focused control, which fires no blur:
286
+ // a focus hold whose focus has left the card is stale.
287
+ const root = cardRootRef.current?.current;
288
+ if (
289
+ pauseSourcesRef.current.has('focus') &&
290
+ root != null &&
291
+ !root.contains(root.ownerDocument.activeElement)
292
+ ) {
293
+ pauseSourcesRef.current.delete('focus');
294
+ }
279
295
  startTimer();
280
296
  return () => {
281
297
  if (timerRef.current) {
282
298
  clearTimeout(timerRef.current);
283
299
  }
284
300
  };
285
- // startTimer's identity is stable per isAutoHide, so this runs on mount
286
- // and on a genuine duration change — not on unrelated viewport renders.
287
- }, [autoHideDuration, startTimer]);
301
+ // startTimer's identity is stable per isAutoHide, so this runs on mount,
302
+ // on a genuine duration change and on an overwrite (timerKey), not on
303
+ // unrelated viewport renders.
304
+ }, [autoHideDuration, startTimer, timerKey]);
288
305
 
289
306
  // Pause the auto-hide timer while the window is not focused, so a toast
290
307
  // doesn't silently expire while the user is in another window or tab.
@@ -292,6 +309,7 @@ export function ToastSurface({
292
309
  if (!isAutoHide) {
293
310
  return;
294
311
  }
312
+ const pauseSources = pauseSourcesRef.current;
295
313
  const pauseForWindow = () => pauseTimer('window');
296
314
  const resumeForWindow = () => resumeTimer('window');
297
315
  window.addEventListener('blur', pauseForWindow);
@@ -304,6 +322,8 @@ export function ToastSurface({
304
322
  return () => {
305
323
  window.removeEventListener('blur', pauseForWindow);
306
324
  window.removeEventListener('focus', resumeForWindow);
325
+ // With the listeners gone, no focus event would clear the window hold.
326
+ pauseSources.delete('window');
307
327
  };
308
328
  }, [isAutoHide, pauseTimer, resumeTimer]);
309
329
 
@@ -368,9 +388,9 @@ export function ToastSurface({
368
388
  return (
369
389
  <div
370
390
  ref={rootRef}
371
- role={isError ? 'alert' : 'status'}
372
- aria-live={isError ? 'assertive' : 'polite'}
373
- aria-atomic="true"
391
+ role={isLiveRegion ? (isError ? 'alert' : 'status') : undefined}
392
+ aria-live={isLiveRegion ? (isError ? 'assertive' : 'polite') : undefined}
393
+ aria-atomic={isLiveRegion ? 'true' : undefined}
374
394
  onMouseEnter={pauseForPointer}
375
395
  onMouseLeave={resumeForPointer}
376
396
  onFocusCapture={pauseForFocus}