@astryxdesign/core 0.7.7 → 0.7.8-canary.0b39b51

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 (581) 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 +5 -0
  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 +15 -16
  20. package/dist/Carousel/Carousel.d.ts.map +1 -1
  21. package/dist/Carousel/Carousel.js +2 -0
  22. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  23. package/dist/Chat/ChatComposerInput.js +4 -0
  24. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  25. package/dist/Chat/ChatMessageList.js +2 -1
  26. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  27. package/dist/Chat/useChatDictation.js +2 -0
  28. package/dist/Chat/useChatNewMessages.js +1 -1
  29. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  30. package/dist/Chat/useChatStreamScroll.js +2 -0
  31. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  32. package/dist/Chat/useSpeechRecognition.js +3 -0
  33. package/dist/Chat/useTriggerMenu.js +1 -1
  34. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  35. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  36. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  37. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  38. package/dist/CodeBlock/CodeBlock.js +28 -11
  39. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  40. package/dist/CommandPalette/CommandPalette.js +2 -0
  41. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  42. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  43. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  44. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  45. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  46. package/dist/ContextMenu/ContextMenu.js +2 -2
  47. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  48. package/dist/DateInput/MonthScroller.js +5 -2
  49. package/dist/DateInput/PickerWheel.d.ts +19 -0
  50. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  51. package/dist/DateInput/PickerWheel.js +625 -0
  52. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  53. package/dist/DateInput/TouchDateField.js +1 -0
  54. package/dist/DateInput/Wheel.d.ts +18 -37
  55. package/dist/DateInput/Wheel.d.ts.map +1 -1
  56. package/dist/DateInput/Wheel.js +84 -113
  57. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  58. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  59. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  60. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  61. package/dist/DateInput/usePointerDragScroll.js +2 -0
  62. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  63. package/dist/DateInput/useScrollSettle.js +3 -0
  64. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  65. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  66. package/dist/DateInput/useWheelListbox.js +88 -0
  67. package/dist/DateInput/wheelOptions.d.ts +74 -0
  68. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  69. package/dist/DateInput/wheelOptions.js +98 -0
  70. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  71. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  72. package/dist/DateInput/wheelPhysics.js +341 -0
  73. package/dist/DateInput/wheelStrip.d.ts +92 -0
  74. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  75. package/dist/DateInput/wheelStrip.js +258 -0
  76. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  77. package/dist/DateTimeInput/TouchDateTimeField.js +2 -0
  78. package/dist/Dialog/Dialog.d.ts.map +1 -1
  79. package/dist/Dialog/Dialog.js +9 -32
  80. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  81. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  82. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  83. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  84. package/dist/Field/Field.js +2 -2
  85. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  86. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  87. package/dist/FormLayout/FormLayout.d.ts +5 -1
  88. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  89. package/dist/HoverCard/HoverCard.d.ts +6 -4
  90. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  91. package/dist/HoverCard/HoverCard.js +48 -3
  92. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  93. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/useHoverCard.js +20 -33
  95. package/dist/Icon/Icon.d.ts +5 -1
  96. package/dist/Icon/Icon.d.ts.map +1 -1
  97. package/dist/Icon/Icon.js +5 -2
  98. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  99. package/dist/Item/useSwipeAction.js +3 -0
  100. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  101. package/dist/Layer/modalOutlet.js +2 -0
  102. package/dist/Layer/outsidePress.d.ts.map +1 -1
  103. package/dist/Layer/outsidePress.js +1 -0
  104. package/dist/Layer/useLayer.d.ts.map +1 -1
  105. package/dist/Layer/useLayer.js +3 -0
  106. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  107. package/dist/Layer/useLayerDismissal.js +3 -0
  108. package/dist/Layer/usePressPin.d.ts +17 -5
  109. package/dist/Layer/usePressPin.d.ts.map +1 -1
  110. package/dist/Layer/usePressPin.js +62 -12
  111. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  112. package/dist/Layer/useTouchTrigger.js +3 -0
  113. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  114. package/dist/Lightbox/Lightbox.js +19 -0
  115. package/dist/MobileNav/MobileNav.d.ts +3 -2
  116. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  117. package/dist/MobileNav/MobileNav.js +9 -25
  118. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  119. package/dist/Outline/useOutlineFromDOM.js +3 -0
  120. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  121. package/dist/Outline/useScrollSpy.js +3 -0
  122. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  123. package/dist/OverflowList/OverflowList.js +3 -0
  124. package/dist/Popover/Popover.d.ts.map +1 -1
  125. package/dist/Popover/Popover.js +6 -0
  126. package/dist/PowerSearch/PowerSearch.d.ts +43 -4
  127. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  128. package/dist/PowerSearch/PowerSearch.js +445 -134
  129. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  130. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  131. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  132. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  133. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  134. package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
  135. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  136. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  137. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  138. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  139. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  140. package/dist/PowerSearch/PowerSearchToken.js +7 -2
  141. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  142. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  143. package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
  144. package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
  145. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  146. package/dist/PowerSearch/formatFilterValue.js +33 -12
  147. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  148. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  149. package/dist/PowerSearch/formatTokenValue.js +162 -0
  150. package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
  151. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  152. package/dist/PowerSearch/powerSearchDateZone.js +37 -0
  153. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  154. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  155. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  156. package/dist/PowerSearch/types.d.ts +2 -0
  157. package/dist/PowerSearch/types.d.ts.map +1 -1
  158. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  159. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  160. package/dist/RadioList/RadioList.d.ts.map +1 -1
  161. package/dist/RadioList/RadioList.js +3 -2
  162. package/dist/RadioList/RadioListItem.d.ts +1 -1
  163. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  164. package/dist/RadioList/RadioListItem.js +5 -3
  165. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  166. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  167. package/dist/Resizable/ResizeHandle.js +101 -77
  168. package/dist/Resizable/createResizable.d.ts +145 -0
  169. package/dist/Resizable/createResizable.d.ts.map +1 -0
  170. package/dist/Resizable/createResizable.js +575 -0
  171. package/dist/Resizable/useResizable.d.ts +3 -3
  172. package/dist/Resizable/useResizable.d.ts.map +1 -1
  173. package/dist/Resizable/useResizable.js +252 -459
  174. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  175. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  176. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  177. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  178. package/dist/SelectableCard/SelectableCard.js +36 -11
  179. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  180. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  181. package/dist/SelectableCard/selectableCardInput.js +20 -0
  182. package/dist/Selector/Selector.d.ts.map +1 -1
  183. package/dist/Selector/Selector.js +5 -8
  184. package/dist/Slider/sliderTouchController.js +2 -2
  185. package/dist/Spinner/Spinner.d.ts +1 -1
  186. package/dist/Spinner/Spinner.d.ts.map +1 -1
  187. package/dist/Spinner/Spinner.js +60 -58
  188. package/dist/Switch/Switch.d.ts.map +1 -1
  189. package/dist/Switch/Switch.js +4 -10
  190. package/dist/Switch/useSwitchTouch.js +4 -4
  191. package/dist/Table/BaseTable.d.ts.map +1 -1
  192. package/dist/Table/BaseTable.js +29 -8
  193. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  194. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  195. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  196. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  199. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  200. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  201. package/dist/TextInput/TextInput.d.ts +2 -2
  202. package/dist/TextInput/TextInput.d.ts.map +1 -1
  203. package/dist/TextInput/TextInput.js +10 -7
  204. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  205. package/dist/TimeInput/TimeInput.js +2 -0
  206. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  207. package/dist/TimeInput/TouchTimeField.js +2 -0
  208. package/dist/Timer/Timer.d.ts.map +1 -1
  209. package/dist/Timer/Timer.js +2 -0
  210. package/dist/Timestamp/Timestamp.js +1 -1
  211. package/dist/Toast/Toast.d.ts +11 -1
  212. package/dist/Toast/Toast.d.ts.map +1 -1
  213. package/dist/Toast/Toast.js +25 -15
  214. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  215. package/dist/Toast/ToastViewport.js +97 -34
  216. package/dist/Toast/types.d.ts +9 -3
  217. package/dist/Toast/types.d.ts.map +1 -1
  218. package/dist/Toast/useToast.d.ts.map +1 -1
  219. package/dist/Toast/useToast.js +1 -0
  220. package/dist/Tokenizer/Tokenizer.d.ts +49 -37
  221. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  222. package/dist/Tokenizer/Tokenizer.js +22 -19
  223. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  224. package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
  225. package/dist/Tokenizer/index.d.ts +1 -1
  226. package/dist/Tokenizer/index.d.ts.map +1 -1
  227. package/dist/Tooltip/useTooltip.d.ts +19 -1
  228. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  229. package/dist/Tooltip/useTooltip.js +34 -53
  230. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  231. package/dist/Typeahead/BaseTypeahead.js +27 -18
  232. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  233. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  234. package/dist/animator/createAnimator.d.ts +98 -0
  235. package/dist/animator/createAnimator.d.ts.map +1 -0
  236. package/dist/animator/createAnimator.js +259 -0
  237. package/dist/astryx.css +39 -6
  238. package/dist/gestures/GestureHost.d.ts +16 -1
  239. package/dist/gestures/GestureHost.d.ts.map +1 -1
  240. package/dist/gestures/GestureHost.js +1 -1
  241. package/dist/gestures/PressTracker.d.ts.map +1 -1
  242. package/dist/gestures/PressTracker.js +4 -3
  243. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  244. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  245. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  246. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  247. package/dist/hooks/actionGroupTracker.js +13 -3
  248. package/dist/hooks/index.d.ts +1 -0
  249. package/dist/hooks/index.d.ts.map +1 -1
  250. package/dist/hooks/index.js +1 -0
  251. package/dist/hooks/longPressDetector.d.ts +66 -0
  252. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  253. package/dist/hooks/longPressDetector.js +200 -0
  254. package/dist/hooks/pressGroupContext.d.ts +6 -0
  255. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  256. package/dist/hooks/pressGroupContext.js +20 -0
  257. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  258. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  259. package/dist/hooks/rootScrollStyles.js +207 -0
  260. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  261. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  262. package/dist/hooks/scrollLockTouchGuard.js +134 -0
  263. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  264. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  265. package/dist/hooks/scrollbarGutter.js +36 -23
  266. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  267. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  268. package/dist/hooks/useActionGroupTracking.js +174 -0
  269. package/dist/hooks/useAnimator.d.ts +41 -0
  270. package/dist/hooks/useAnimator.d.ts.map +1 -0
  271. package/dist/hooks/useAnimator.js +70 -0
  272. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  273. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  274. package/dist/hooks/useAttachment.d.ts +1 -1
  275. package/dist/hooks/useAttachment.js +1 -1
  276. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  277. package/dist/hooks/useAutoMediaMode.js +1 -0
  278. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  279. package/dist/hooks/useBusyAnnouncement.js +2 -0
  280. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  281. package/dist/hooks/useDevWarning.js +2 -0
  282. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  283. package/dist/hooks/useFocusTrap.js +2 -0
  284. package/dist/hooks/useGridFocus.d.ts +8 -5
  285. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  286. package/dist/hooks/useGridFocus.js +4 -3
  287. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  288. package/dist/hooks/useHotkeys.js +3 -0
  289. package/dist/hooks/useImageMode.d.ts.map +1 -1
  290. package/dist/hooks/useImageMode.js +3 -0
  291. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  292. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  293. package/dist/hooks/useInputStatusIcon.js +2 -2
  294. package/dist/hooks/useKeyboardHint.js +1 -1
  295. package/dist/hooks/useLongPress.d.ts +8 -9
  296. package/dist/hooks/useLongPress.d.ts.map +1 -1
  297. package/dist/hooks/useLongPress.js +23 -106
  298. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  299. package/dist/hooks/useMenuHover.js +2 -0
  300. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  301. package/dist/hooks/useMenuPress.js +3 -0
  302. package/dist/hooks/useOverflow.d.ts.map +1 -1
  303. package/dist/hooks/useOverflow.js +2 -1
  304. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  305. package/dist/hooks/usePressFeedback.js +1 -0
  306. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  307. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  308. package/dist/hooks/useResolvedRequired.js +3 -0
  309. package/dist/hooks/useScrollLock.d.ts +7 -9
  310. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  311. package/dist/hooks/useScrollLock.js +55 -48
  312. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  313. package/dist/hooks/useScrollableArea.js +5 -0
  314. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  315. package/dist/hooks/useStreamingText.js +3 -0
  316. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  317. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  318. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  319. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  320. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  321. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  322. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  323. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  324. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/en.generated.js +30 -0
  326. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  328. package/dist/index.d.ts +1 -0
  329. package/dist/index.d.ts.map +1 -1
  330. package/dist/index.js +4 -0
  331. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  332. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  333. package/dist/internal/indicatorPress.stylex.js +26 -0
  334. package/dist/internal/selectable-card.d.ts +21 -0
  335. package/dist/internal/selectable-card.d.ts.map +1 -0
  336. package/dist/internal/selectable-card.js +20 -0
  337. package/dist/internal/sheetDraft.d.ts +2 -2
  338. package/dist/internal/sheetDraft.js +2 -2
  339. package/dist/motion/animatedLayout.d.ts.map +1 -1
  340. package/dist/motion/animatedLayout.js +7 -7
  341. package/dist/motion/animator.d.ts +14 -14
  342. package/dist/motion/animator.d.ts.map +1 -1
  343. package/dist/motion/animator.js +45 -20
  344. package/dist/motion/progress.d.ts +88 -0
  345. package/dist/motion/progress.d.ts.map +1 -0
  346. package/dist/motion/progress.js +128 -0
  347. package/dist/motion/reducedMotion.d.ts.map +1 -1
  348. package/dist/motion/reducedMotion.js +3 -1
  349. package/dist/motion/uikit/alert.d.ts +41 -0
  350. package/dist/motion/uikit/alert.d.ts.map +1 -0
  351. package/dist/motion/uikit/alert.js +43 -0
  352. package/dist/motion/uikit/index.d.ts +4 -3
  353. package/dist/motion/uikit/index.d.ts.map +1 -1
  354. package/dist/motion/uikit/index.js +4 -3
  355. package/dist/motion/uikit/picker.d.ts +96 -0
  356. package/dist/motion/uikit/picker.d.ts.map +1 -0
  357. package/dist/motion/uikit/picker.js +117 -0
  358. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  359. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  360. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  361. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  362. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  363. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  364. package/dist/theme/Theme.d.ts.map +1 -1
  365. package/dist/theme/Theme.js +29 -4
  366. package/dist/theme/motionKnobs.d.ts +4 -3
  367. package/dist/theme/motionKnobs.d.ts.map +1 -1
  368. package/dist/theme/motionKnobs.js +3 -2
  369. package/dist/theme/themeMotion.d.ts +6 -0
  370. package/dist/theme/themeMotion.d.ts.map +1 -1
  371. package/dist/theme/themeMotion.js +7 -0
  372. package/dist/utils/dateParser.d.ts.map +1 -1
  373. package/dist/utils/dateParser.js +12 -0
  374. package/dist/utils/focusReturn.d.ts +15 -0
  375. package/dist/utils/focusReturn.d.ts.map +1 -1
  376. package/dist/utils/focusReturn.js +28 -0
  377. package/dist/utils/interactionModality.d.ts.map +1 -1
  378. package/dist/utils/interactionModality.js +4 -0
  379. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  380. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  381. package/dist/utils/interactionOverlay.stylex.js +3 -2
  382. package/dist/utils/plainDate.d.ts +8 -0
  383. package/dist/utils/plainDate.d.ts.map +1 -1
  384. package/dist/utils/plainDate.js +19 -0
  385. package/dist/utils/pressFeedback.d.ts.map +1 -1
  386. package/dist/utils/pressFeedback.js +20 -6
  387. package/dist/utils/triggerFocus.d.ts +36 -0
  388. package/dist/utils/triggerFocus.d.ts.map +1 -0
  389. package/dist/utils/triggerFocus.js +65 -0
  390. package/locales/en.json +120 -0
  391. package/locales/pseudo.json +90 -0
  392. package/package.json +14 -9
  393. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  394. package/src/AlertDialog/AlertDialog.tsx +46 -5
  395. package/src/AppShell/AppShell.tsx +4 -0
  396. package/src/BottomSheet/BottomSheet.tsx +1 -0
  397. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  398. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  399. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  400. package/src/BottomSheet/useSheetGestures.ts +10 -1
  401. package/src/Button/Button.tsx +26 -4
  402. package/src/Calendar/Calendar.tsx +36 -25
  403. package/src/Carousel/Carousel.tsx +1 -0
  404. package/src/Chat/ChatComposerInput.tsx +2 -0
  405. package/src/Chat/ChatMessageList.tsx +2 -1
  406. package/src/Chat/useChatDictation.ts +1 -0
  407. package/src/Chat/useChatNewMessages.ts +1 -1
  408. package/src/Chat/useChatStreamScroll.ts +2 -0
  409. package/src/Chat/useSpeechRecognition.ts +2 -0
  410. package/src/Chat/useTriggerMenu.tsx +1 -1
  411. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  412. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  413. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  414. package/src/CodeBlock/CodeBlock.tsx +41 -4
  415. package/src/CommandPalette/CommandPalette.tsx +1 -0
  416. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  417. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  418. package/src/ContextMenu/ContextMenu.tsx +2 -2
  419. package/src/DateInput/MonthScroller.tsx +8 -2
  420. package/src/DateInput/PickerWheel.tsx +765 -0
  421. package/src/DateInput/TouchDateField.tsx +1 -0
  422. package/src/DateInput/Wheel.tsx +94 -150
  423. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  424. package/src/DateInput/usePointerDragScroll.ts +1 -0
  425. package/src/DateInput/useScrollSettle.ts +2 -0
  426. package/src/DateInput/useWheelListbox.ts +112 -0
  427. package/src/DateInput/wheelOptions.ts +155 -0
  428. package/src/DateInput/wheelPhysics.ts +406 -0
  429. package/src/DateInput/wheelStrip.ts +341 -0
  430. package/src/DateTimeInput/TouchDateTimeField.tsx +2 -0
  431. package/src/Dialog/Dialog.tsx +12 -32
  432. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  433. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  434. package/src/Field/Field.tsx +2 -2
  435. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  436. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  437. package/src/FormLayout/FormLayout.tsx +5 -1
  438. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  439. package/src/HoverCard/HoverCard.tsx +58 -6
  440. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  441. package/src/HoverCard/useHoverCard.tsx +49 -54
  442. package/src/Icon/Icon.doc.mjs +49 -8
  443. package/src/Icon/Icon.tsx +15 -7
  444. package/src/IconButton/IconButton.doc.mjs +141 -21
  445. package/src/Item/useSwipeAction.ts +2 -0
  446. package/src/Layer/modalOutlet.ts +2 -0
  447. package/src/Layer/outsidePress.ts +1 -0
  448. package/src/Layer/useLayer.tsx +2 -0
  449. package/src/Layer/useLayerDismissal.ts +2 -0
  450. package/src/Layer/usePressPin.ts +81 -15
  451. package/src/Layer/useTouchTrigger.ts +2 -0
  452. package/src/Lightbox/Lightbox.tsx +19 -0
  453. package/src/MobileNav/MobileNav.tsx +9 -30
  454. package/src/Outline/useOutlineFromDOM.ts +2 -0
  455. package/src/Outline/useScrollSpy.ts +2 -0
  456. package/src/OverflowList/OverflowList.tsx +2 -0
  457. package/src/Popover/Popover.tsx +4 -0
  458. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  459. package/src/PowerSearch/PowerSearch.tsx +627 -157
  460. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  461. package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
  462. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  463. package/src/PowerSearch/PowerSearchToken.tsx +7 -0
  464. package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
  465. package/src/PowerSearch/formatFilterValue.ts +55 -17
  466. package/src/PowerSearch/formatTokenValue.ts +222 -0
  467. package/src/PowerSearch/powerSearchDateZone.ts +64 -0
  468. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  469. package/src/PowerSearch/types.ts +2 -0
  470. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  471. package/src/RadioList/RadioList.tsx +3 -2
  472. package/src/RadioList/RadioListItem.tsx +5 -3
  473. package/src/Resizable/Resizable.doc.mjs +5 -4
  474. package/src/Resizable/ResizeHandle.tsx +169 -109
  475. package/src/Resizable/createResizable.ts +831 -0
  476. package/src/Resizable/useResizable.ts +292 -623
  477. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  478. package/src/SelectableCard/SelectableCard.tsx +39 -10
  479. package/src/SelectableCard/selectableCardInput.ts +30 -0
  480. package/src/Selector/Selector.tsx +5 -12
  481. package/src/Slider/sliderTouchController.ts +2 -2
  482. package/src/Spinner/Spinner.tsx +77 -63
  483. package/src/Switch/Switch.tsx +2 -6
  484. package/src/Switch/useSwitchTouch.ts +4 -4
  485. package/src/Table/BaseTable.tsx +46 -12
  486. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  487. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  488. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  489. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  490. package/src/TextInput/TextInput.tsx +11 -10
  491. package/src/TimeInput/TimeInput.tsx +2 -0
  492. package/src/TimeInput/TouchTimeField.tsx +2 -0
  493. package/src/Timer/Timer.tsx +1 -0
  494. package/src/Timestamp/Timestamp.tsx +1 -1
  495. package/src/Toast/Toast.doc.mjs +4 -3
  496. package/src/Toast/Toast.tsx +52 -32
  497. package/src/Toast/ToastViewport.tsx +123 -35
  498. package/src/Toast/types.ts +9 -3
  499. package/src/Toast/useToast.tsx +1 -0
  500. package/src/Tokenizer/Tokenizer.doc.mjs +19 -3
  501. package/src/Tokenizer/Tokenizer.tsx +73 -51
  502. package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
  503. package/src/Tokenizer/index.ts +1 -0
  504. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  505. package/src/Tooltip/useTooltip.tsx +61 -56
  506. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  507. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  508. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  509. package/src/animator/createAnimator.doc.mjs +153 -0
  510. package/src/animator/createAnimator.ts +324 -0
  511. package/src/gestures/GestureHost.ts +1 -1
  512. package/src/gestures/PressTracker.ts +4 -3
  513. package/src/gestures/README.md +10 -4
  514. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  515. package/src/hooks/actionGroupTracker.ts +20 -5
  516. package/src/hooks/index.ts +2 -0
  517. package/src/hooks/longPressDetector.ts +273 -0
  518. package/src/hooks/pressGroupContext.ts +21 -0
  519. package/src/hooks/rootScrollStyles.ts +247 -0
  520. package/src/hooks/scrollLockTouchGuard.ts +182 -0
  521. package/src/hooks/scrollbarGutter.ts +41 -26
  522. package/src/hooks/useActionGroupTracking.ts +224 -0
  523. package/src/hooks/useAnimator.doc.mjs +109 -0
  524. package/src/hooks/useAnimator.ts +67 -0
  525. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  526. package/src/hooks/useAttachment.ts +1 -1
  527. package/src/hooks/useAutoMediaMode.ts +1 -0
  528. package/src/hooks/useBusyAnnouncement.ts +2 -0
  529. package/src/hooks/useDevWarning.ts +2 -0
  530. package/src/hooks/useFocusTrap.ts +2 -0
  531. package/src/hooks/useGridFocus.doc.mjs +6 -6
  532. package/src/hooks/useGridFocus.ts +10 -7
  533. package/src/hooks/useHotkeys.ts +2 -0
  534. package/src/hooks/useImageMode.ts +2 -0
  535. package/src/hooks/useInputStatusIcon.tsx +3 -2
  536. package/src/hooks/useKeyboardHint.tsx +1 -1
  537. package/src/hooks/useLongPress.doc.mjs +2 -2
  538. package/src/hooks/useLongPress.ts +32 -122
  539. package/src/hooks/useMenuHover.ts +1 -0
  540. package/src/hooks/useMenuPress.ts +2 -0
  541. package/src/hooks/useOverflow.ts +2 -1
  542. package/src/hooks/usePressFeedback.ts +1 -0
  543. package/src/hooks/useResolvedRequired.ts +3 -0
  544. package/src/hooks/useScrollLock.doc.mjs +51 -12
  545. package/src/hooks/useScrollLock.ts +57 -60
  546. package/src/hooks/useScrollableArea.ts +4 -0
  547. package/src/hooks/useStreamingText.ts +2 -0
  548. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  549. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  550. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  551. package/src/i18n/generated-locales/en.generated.ts +41 -0
  552. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  553. package/src/index.ts +13 -0
  554. package/src/internal/indicatorPress.stylex.ts +24 -0
  555. package/src/internal/selectable-card.ts +21 -0
  556. package/src/internal/sheetDraft.ts +2 -2
  557. package/src/motion/MEASUREMENTS.md +18 -0
  558. package/src/motion/README.md +10 -5
  559. package/src/motion/animatedLayout.ts +10 -5
  560. package/src/motion/animator.ts +66 -31
  561. package/src/motion/progress.ts +155 -0
  562. package/src/motion/reducedMotion.ts +3 -1
  563. package/src/motion/uikit/alert.ts +43 -0
  564. package/src/motion/uikit/index.ts +4 -3
  565. package/src/motion/uikit/picker.ts +116 -0
  566. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  567. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  568. package/src/theme/Theme.tsx +37 -3
  569. package/src/theme/motionKnobs.ts +4 -3
  570. package/src/theme/themeMotion.ts +7 -0
  571. package/src/utils/dateParser.ts +16 -0
  572. package/src/utils/focusReturn.ts +30 -0
  573. package/src/utils/interactionModality.ts +4 -0
  574. package/src/utils/interactionOverlay.stylex.ts +3 -2
  575. package/src/utils/plainDate.ts +21 -0
  576. package/src/utils/pressFeedback.ts +24 -6
  577. package/src/utils/triggerFocus.ts +80 -0
  578. package/dist/internal/touch-sheet.d.ts +0 -21
  579. package/dist/internal/touch-sheet.d.ts.map +0 -1
  580. package/dist/internal/touch-sheet.js +0 -19
  581. package/src/internal/touch-sheet.ts +0 -21
package/locales/en.json CHANGED
@@ -255,6 +255,126 @@
255
255
  "defaultMessage": "{count, number} {count, plural, one {result} other {results}}",
256
256
  "description": "Live result-count text next to the PowerSearch input, announced to screen readers on change. Example: `12 results`, `1 result`; keep compact."
257
257
  },
258
+ "@astryx.powersearch.sheet.filtersTitle": {
259
+ "defaultMessage": "Filters",
260
+ "description": "Heading and accessible name of the PowerSearch touch sheet that lists the active filters (experimental bottom-sheet presentation). Plural noun."
261
+ },
262
+ "@astryx.powersearch.sheet.addFilter": {
263
+ "defaultMessage": "Add filter",
264
+ "description": "Button label in the PowerSearch touch flow: in the Filters sheet header it opens the field list; in the value step it confirms a new filter. Imperative verb; no leading plus sign."
265
+ },
266
+ "@astryx.powersearch.sheet.noFilters": {
267
+ "defaultMessage": "No filters applied",
268
+ "description": "Heading of the PowerSearch Filters sheet empty state when no filter is active (experimental bottom-sheet presentation). Neutral tone."
269
+ },
270
+ "@astryx.powersearch.sheet.noFiltersDescription": {
271
+ "defaultMessage": "Add a filter to narrow your results and find what you need faster.",
272
+ "description": "Guidance line under the PowerSearch Filters sheet empty state, above its Add filter action. One short sentence."
273
+ },
274
+ "@astryx.powersearch.sheet.clearAll": {
275
+ "defaultMessage": "Clear all",
276
+ "description": "Button label in the PowerSearch Filters sheet footer that asks to remove every editable filter. Imperative verb + determiner."
277
+ },
278
+ "@astryx.powersearch.sheet.clearAllTitle": {
279
+ "defaultMessage": "Clear all filters?",
280
+ "description": "Title and accessible name of the confirmation dialog that Clear all opens in the PowerSearch touch flow. A short question."
281
+ },
282
+ "@astryx.powersearch.sheet.clearAllDescription": {
283
+ "defaultMessage": "This removes all editable filters from this search.",
284
+ "description": "Body text of the PowerSearch Clear all confirmation dialog. Read-only filters stay, so it names editable filters."
285
+ },
286
+ "@astryx.powersearch.sheet.clearAllConfirm": {
287
+ "defaultMessage": "Clear filters",
288
+ "description": "Destructive action of the PowerSearch Clear all confirmation dialog: removes the editable filters. Imperative verb + plural noun."
289
+ },
290
+ "@astryx.powersearch.sheet.clearAllCancel": {
291
+ "defaultMessage": "Keep filters",
292
+ "description": "Safe action of the PowerSearch Clear all confirmation dialog: closes it and changes nothing. Imperative verb + plural noun."
293
+ },
294
+ "@astryx.powersearch.sheet.done": {
295
+ "defaultMessage": "Done",
296
+ "description": "Primary button label in the PowerSearch Filters sheet footer that closes the sheet. Short; marks the end of the filtering task."
297
+ },
298
+ "@astryx.powersearch.sheet.search": {
299
+ "defaultMessage": "Search",
300
+ "description": "Screen-reader-only label of the content-search box at the top of the PowerSearch Add filter sheet; its suggestions list inline below it. Noun or verb as reads best."
301
+ },
302
+ "@astryx.powersearch.sheet.searchResults": {
303
+ "defaultMessage": "Search results",
304
+ "description": "Screen-reader-only name of the inline suggestion list under the PowerSearch Add filter sheet's content search. Plural noun."
305
+ },
306
+ "@astryx.powersearch.sheet.searchFields": {
307
+ "defaultMessage": "Search filters",
308
+ "description": "Screen-reader-only label of the field-list filter box in the PowerSearch Add filter sheet, shown once the config has eight or more fields. Imperative verb + plural noun."
309
+ },
310
+ "@astryx.powersearch.sheet.searchFieldsPlaceholder": {
311
+ "defaultMessage": "Search filters…",
312
+ "description": "Placeholder inside the field-list filter box in the PowerSearch Add filter sheet. Imperative verb; trailing `…` is one character."
313
+ },
314
+ "@astryx.powersearch.sheet.ungroupedFields": {
315
+ "defaultMessage": "General",
316
+ "description": "Heading of the PowerSearch Add filter sheet's list of fields that belong to no group, shown before the named groups. A short noun."
317
+ },
318
+ "@astryx.powersearch.sheet.noMatchingFields": {
319
+ "defaultMessage": "No filters match your search",
320
+ "description": "Empty-state text in the PowerSearch Add filter sheet when the field-list filter matches no field. Neutral tone."
321
+ },
322
+ "@astryx.powersearch.sheet.tryDifferentSearch": {
323
+ "defaultMessage": "Try a different search.",
324
+ "description": "Guidance line under the PowerSearch Add filter sheet's empty search result (\"No results found\", \"No filters match your search\"). One short sentence."
325
+ },
326
+ "@astryx.powersearch.sheet.noResults": {
327
+ "defaultMessage": "No results found",
328
+ "description": "Empty-state text in the PowerSearch Add filter sheet when the content search has no suggestion for the typed query. Neutral tone (not error-y)."
329
+ },
330
+ "@astryx.powersearch.sheet.filterUnavailable": {
331
+ "defaultMessage": "This filter is no longer available",
332
+ "description": "Message in the PowerSearch value step when a config update removed the field or operator being edited; Cancel remains as the way out, and the Filters row keeps its remove action."
333
+ },
334
+ "@astryx.powersearch.sheet.removeFilter": {
335
+ "defaultMessage": "Remove {field} filter",
336
+ "description": "Accessible name and tooltip of the trailing remove button on a PowerSearch Filters sheet row; field is the filter's field label (for example \"Remove Status filter\")."
337
+ },
338
+ "@astryx.powersearch.sheet.relativeDaysAgo": {
339
+ "defaultMessage": "{count, number} {count, plural, one {day} other {days}} ago",
340
+ "description": "A relative-date choice row in the PowerSearch touch sheet, in the past (for example \"3 days ago\"). The popover editor lists the same choices."
341
+ },
342
+ "@astryx.powersearch.sheet.relativeDaysFromNow": {
343
+ "defaultMessage": "{count, number} {count, plural, one {day} other {days}} from now",
344
+ "description": "A relative-date choice row in the PowerSearch touch sheet, in the future (for example \"3 days from now\"). The popover editor lists the same choices."
345
+ },
346
+ "@astryx.powersearch.sheet.relativeWeeksAgo": {
347
+ "defaultMessage": "{count, number} {count, plural, one {week} other {weeks}} ago",
348
+ "description": "A relative-date choice row in the PowerSearch touch sheet, in the past (for example \"3 weeks ago\"). The popover editor lists the same choices."
349
+ },
350
+ "@astryx.powersearch.sheet.relativeWeeksFromNow": {
351
+ "defaultMessage": "{count, number} {count, plural, one {week} other {weeks}} from now",
352
+ "description": "A relative-date choice row in the PowerSearch touch sheet, in the future (for example \"3 weeks from now\"). The popover editor lists the same choices."
353
+ },
354
+ "@astryx.powersearch.sheet.relativeMonthsAgo": {
355
+ "defaultMessage": "{count, number} {count, plural, one {month} other {months}} ago",
356
+ "description": "A relative-date choice row in the PowerSearch touch sheet, in the past (for example \"3 months ago\"). The popover editor lists the same choices."
357
+ },
358
+ "@astryx.powersearch.sheet.relativeMonthsFromNow": {
359
+ "defaultMessage": "{count, number} {count, plural, one {month} other {months}} from now",
360
+ "description": "A relative-date choice row in the PowerSearch touch sheet, in the future (for example \"3 months from now\"). The popover editor lists the same choices."
361
+ },
362
+ "@astryx.powersearch.sheet.fieldOperator": {
363
+ "defaultMessage": "{field} {operator}",
364
+ "description": "A field label joined with an operator label in the PowerSearch touch sheet: the value step's title, an operator radio's name, and the first part of a Filters row (for example \"Status is\"). Translators may reorder the two parts."
365
+ },
366
+ "@astryx.powersearch.sheet.labelValue": {
367
+ "defaultMessage": "{label} {value}",
368
+ "description": "A Filters row's \"field operator\" text joined with its value, as the removal announcement reads it (for example \"Status is Open\"). Translators may reorder the two parts."
369
+ },
370
+ "@astryx.powersearch.sheet.filtersClearedWithCount": {
371
+ "defaultMessage": "All filters removed. {resultCount}",
372
+ "description": "Polite screen-reader announcement after Clear all in the PowerSearch touch sheet when the result count changed with it; resultCount is the field's already formatted result count (for example \"240 results\"). Live-region text, never shown on screen."
373
+ },
374
+ "@astryx.powersearch.sheet.editableFiltersClearedWithCount": {
375
+ "defaultMessage": "Editable filters removed. {resultCount}",
376
+ "description": "Polite screen-reader announcement after Clear all in the PowerSearch touch sheet removes the editable filters, keeps read-only ones, and the result count changed with it; resultCount is the field's already formatted result count (for example \"240 results\"). Live-region text, never shown on screen."
377
+ },
258
378
  "@astryx.alertDialog.cancel": {
259
379
  "defaultMessage": "Cancel",
260
380
  "description": "Button label on the secondary/dismiss button of an AlertDialog (modal confirmation). Imperative verb; consumers usually override with task-specific text."
@@ -191,6 +191,96 @@
191
191
  "@astryx.powersearch.resultCount": {
192
192
  "defaultMessage": "⟦{count, number} {count, plural, one {result} other {results}}⟧"
193
193
  },
194
+ "@astryx.powersearch.sheet.filtersTitle": {
195
+ "defaultMessage": "⟦Ƒíłţéřš⟧"
196
+ },
197
+ "@astryx.powersearch.sheet.addFilter": {
198
+ "defaultMessage": "⟦Àðð ƒíłţéř⟧"
199
+ },
200
+ "@astryx.powersearch.sheet.noFilters": {
201
+ "defaultMessage": "⟦Ñó ƒíłţéřš àþþłíéð⟧"
202
+ },
203
+ "@astryx.powersearch.sheet.noFiltersDescription": {
204
+ "defaultMessage": "⟦Àðð à ƒíłţéř ţó ñàřřóŵ ýóúř řéšúłţš àñð ƒíñð ŵĥàţ ýóú ñééð ƒàšţéř.⟧"
205
+ },
206
+ "@astryx.powersearch.sheet.clearAll": {
207
+ "defaultMessage": "⟦Çłéàř àłł⟧"
208
+ },
209
+ "@astryx.powersearch.sheet.clearAllTitle": {
210
+ "defaultMessage": "⟦Çłéàř àłł ƒíłţéřš?⟧"
211
+ },
212
+ "@astryx.powersearch.sheet.clearAllDescription": {
213
+ "defaultMessage": "⟦Ţĥíš řéɱóṽéš àłł éðíţàƀłé ƒíłţéřš ƒřóɱ ţĥíš šéàřçĥ.⟧"
214
+ },
215
+ "@astryx.powersearch.sheet.clearAllConfirm": {
216
+ "defaultMessage": "⟦Çłéàř ƒíłţéřš⟧"
217
+ },
218
+ "@astryx.powersearch.sheet.clearAllCancel": {
219
+ "defaultMessage": "⟦Ķééþ ƒíłţéřš⟧"
220
+ },
221
+ "@astryx.powersearch.sheet.done": {
222
+ "defaultMessage": "⟦Ðóñé⟧"
223
+ },
224
+ "@astryx.powersearch.sheet.search": {
225
+ "defaultMessage": "⟦Šéàřçĥ⟧"
226
+ },
227
+ "@astryx.powersearch.sheet.searchResults": {
228
+ "defaultMessage": "⟦Šéàřçĥ řéšúłţš⟧"
229
+ },
230
+ "@astryx.powersearch.sheet.searchFields": {
231
+ "defaultMessage": "⟦Šéàřçĥ ƒíłţéřš⟧"
232
+ },
233
+ "@astryx.powersearch.sheet.searchFieldsPlaceholder": {
234
+ "defaultMessage": "⟦Šéàřçĥ ƒíłţéřš…⟧"
235
+ },
236
+ "@astryx.powersearch.sheet.ungroupedFields": {
237
+ "defaultMessage": "⟦Ĝéñéřàł⟧"
238
+ },
239
+ "@astryx.powersearch.sheet.noMatchingFields": {
240
+ "defaultMessage": "⟦Ñó ƒíłţéřš ɱàţçĥ ýóúř šéàřçĥ⟧"
241
+ },
242
+ "@astryx.powersearch.sheet.tryDifferentSearch": {
243
+ "defaultMessage": "⟦Ţřý à ð탃éřéñţ šéàřçĥ.⟧"
244
+ },
245
+ "@astryx.powersearch.sheet.noResults": {
246
+ "defaultMessage": "⟦Ñó řéšúłţš ƒóúñð⟧"
247
+ },
248
+ "@astryx.powersearch.sheet.filterUnavailable": {
249
+ "defaultMessage": "⟦Ţĥíš ƒíłţéř íš ñó łóñĝéř àṽàíłàƀłé⟧"
250
+ },
251
+ "@astryx.powersearch.sheet.removeFilter": {
252
+ "defaultMessage": "⟦Řéɱóṽé {field} ƒíłţéř⟧"
253
+ },
254
+ "@astryx.powersearch.sheet.relativeDaysAgo": {
255
+ "defaultMessage": "⟦{count, number} {count, plural, one {day} other {days}} àĝó⟧"
256
+ },
257
+ "@astryx.powersearch.sheet.relativeDaysFromNow": {
258
+ "defaultMessage": "⟦{count, number} {count, plural, one {day} other {days}} ƒřóɱ ñóŵ⟧"
259
+ },
260
+ "@astryx.powersearch.sheet.relativeWeeksAgo": {
261
+ "defaultMessage": "⟦{count, number} {count, plural, one {week} other {weeks}} àĝó⟧"
262
+ },
263
+ "@astryx.powersearch.sheet.relativeWeeksFromNow": {
264
+ "defaultMessage": "⟦{count, number} {count, plural, one {week} other {weeks}} ƒřóɱ ñóŵ⟧"
265
+ },
266
+ "@astryx.powersearch.sheet.relativeMonthsAgo": {
267
+ "defaultMessage": "⟦{count, number} {count, plural, one {month} other {months}} àĝó⟧"
268
+ },
269
+ "@astryx.powersearch.sheet.relativeMonthsFromNow": {
270
+ "defaultMessage": "⟦{count, number} {count, plural, one {month} other {months}} ƒřóɱ ñóŵ⟧"
271
+ },
272
+ "@astryx.powersearch.sheet.fieldOperator": {
273
+ "defaultMessage": "⟦{field} {operator}⟧"
274
+ },
275
+ "@astryx.powersearch.sheet.labelValue": {
276
+ "defaultMessage": "⟦{label} {value}⟧"
277
+ },
278
+ "@astryx.powersearch.sheet.filtersClearedWithCount": {
279
+ "defaultMessage": "⟦Àłł ƒíłţéřš řéɱóṽéð. {resultCount}⟧"
280
+ },
281
+ "@astryx.powersearch.sheet.editableFiltersClearedWithCount": {
282
+ "defaultMessage": "⟦Éðíţàƀłé ƒíłţéřš řéɱóṽéð. {resultCount}⟧"
283
+ },
194
284
  "@astryx.alertDialog.cancel": {
195
285
  "defaultMessage": "⟦Çàñçéł⟧"
196
286
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/core",
3
- "version": "0.7.7",
3
+ "version": "0.7.8-canary.0b39b51",
4
4
  "displayName": "Astryx Core",
5
5
  "description": "The component library. Accessible, themeable React components with built-in spacing, dark mode, and StyleX styling.",
6
6
  "author": "Meta Open Source",
@@ -824,15 +824,20 @@
824
824
  "types": "./dist/Markdown/remark.d.ts",
825
825
  "default": "./dist/Markdown/remark.js"
826
826
  },
827
+ "./internal/indicatorPress.stylex": {
828
+ "source": "./src/internal/indicatorPress.stylex.ts",
829
+ "types": "./dist/internal/indicatorPress.stylex.d.ts",
830
+ "default": "./dist/internal/indicatorPress.stylex.js"
831
+ },
827
832
  "./internal/touch": {
828
833
  "source": "./src/internal/touch.ts",
829
834
  "types": "./dist/internal/touch.d.ts",
830
835
  "default": "./dist/internal/touch.js"
831
836
  },
832
- "./internal/touch-sheet": {
833
- "source": "./src/internal/touch-sheet.ts",
834
- "types": "./dist/internal/touch-sheet.d.ts",
835
- "default": "./dist/internal/touch-sheet.js"
837
+ "./internal/selectable-card": {
838
+ "source": "./src/internal/selectable-card.ts",
839
+ "types": "./dist/internal/selectable-card.d.ts",
840
+ "default": "./dist/internal/selectable-card.js"
836
841
  }
837
842
  },
838
843
  "files": [
@@ -865,6 +870,9 @@
865
870
  "react-dom": ">=19.0.0"
866
871
  },
867
872
  "devDependencies": {
873
+ "@astryxdesign/a11y-spec": "0.7.8-canary.0b39b51",
874
+ "@astryxdesign/cli": "0.7.8-canary.0b39b51",
875
+ "@astryxdesign/interaction-harness": "0.7.8-canary.0b39b51",
868
876
  "@babel/cli": "^7.29.7",
869
877
  "@babel/core": "^7.29.7",
870
878
  "@babel/preset-react": "^7.29.7",
@@ -875,10 +883,7 @@
875
883
  "@testing-library/jest-dom": "^6.6.0",
876
884
  "@testing-library/react": "^16.3.2",
877
885
  "@types/babel__core": "^7.20.5",
878
- "tailwindcss": "^4.3.2",
879
- "@astryxdesign/a11y-spec": "0.0.0",
880
- "@astryxdesign/interaction-harness": "0.0.0",
881
- "@astryxdesign/cli": "0.7.7"
886
+ "tailwindcss": "^4.3.2"
882
887
  },
883
888
  "dependencies": {
884
889
  "intl-messageformat": "^11.2.9"
@@ -21,7 +21,7 @@ export const docs = {
21
21
  ],
22
22
  usage: {
23
23
  description:
24
- 'AlertDialog asks the user to confirm a destructive or irreversible action before it happens. Use it for things like deleting content, revoking access, or discarding unsaved changes.\n\nIt implements the WAI-ARIA APG [Alert Dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/): `role="alertdialog"`, a title linked by `aria-labelledby`, a consequence description linked by `aria-describedby`, focus moved into the dialog on open and returned to the trigger on close, and no dismissal by clicking outside. Escape cancels.\n\nAlertDialog passes its requested width through to Dialog, which clamps the surface to the container and dynamic viewport with token gutters. Generic Dialog footers should wrap, but Dialog does not own action semantics or order; consumer composition controls that. AlertDialog owns its confirmation semantics: above 640px, actions render horizontally and may move onto another row; at 640px and below, the destructive action appears above Cancel and both buttons fill the footer width. Button labels retain their standard single-line behavior. The breakpoint follows available width, not pointer or hover capability. The body scrolls when block space is constrained.\n\nFor cases where you want to show an alert without managing open state, use the `useImperativeAlertDialog` hook: call `alert.show(options)` and render `alert.element` in your tree.',
24
+ 'AlertDialog asks the user to confirm a destructive or irreversible action before it happens. Use it for things like deleting content, revoking access, or discarding unsaved changes.\n\nIt implements the WAI-ARIA APG [Alert Dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/): `role="alertdialog"`, a title linked by `aria-labelledby`, a consequence description linked by `aria-describedby`, focus moved into the dialog on open and returned to the trigger on close, and no dismissal by clicking outside. Escape cancels.\n\nAlertDialog passes its requested width through to Dialog, which clamps the surface to the container and dynamic viewport with token gutters. Generic Dialog footers should wrap, but Dialog does not own action semantics or order; consumer composition controls that. AlertDialog owns its confirmation semantics: above 640px, actions render horizontally and may move onto another row; at 640px and below, the destructive action appears above Cancel and both buttons fill the footer width. Button labels retain their standard single-line behavior. The breakpoint follows available width, not pointer or hover capability. The body scrolls when block space is constrained.\n\nThe two actions are tracked as one group under every pointer, the way iOS tracks the actions of an alert: the action under the pointer highlights as soon as it is pressed, the highlight follows the pointer from one action to the other, and the release runs the action under it. Releasing off both actions runs nothing. The keyboard and assistive technology keep the click of each button.\n\nFor cases where you want to show an alert without managing open state, use the `useImperativeAlertDialog` hook: call `alert.show(options)` and render `alert.element` in your tree.',
25
25
  bestPractices: [
26
26
  {
27
27
  guidance: true,
@@ -196,7 +196,7 @@ export const docsDense = {
196
196
  'Confirms destructive/irreversible action before it happens (delete, revoke access, discard unsaved changes).',
197
197
  usage: {
198
198
  description:
199
- 'AlertDialog confirms destructive/irreversible action (delete, revoke access, discard changes). Implements WAI-ARIA APG Alert Dialog pattern (https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/): role="alertdialog", aria-labelledby title, aria-describedby description, focus into dialog on open + back to trigger on close, no outside-click dismissal, Escape cancels. Dialog preserves requested width + clamps it to container/dynamic viewport gutters. Generic Dialog footers wrap while consumers own action order. AlertDialog owns confirmation action layout: >640px horizontal buttons may move to another row; <=640px puts the destructive action above Cancel and makes both buttons full width regardless of pointer/hover capability. Button labels remain single-line. Body scrolls when height constrained. To show w/o managing open state, use useImperativeAlertDialog hook: call alert.show(options) + render alert.element in tree.',
199
+ 'AlertDialog confirms destructive/irreversible action (delete, revoke access, discard changes). Implements WAI-ARIA APG Alert Dialog pattern (https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/): role="alertdialog", aria-labelledby title, aria-describedby description, focus into dialog on open + back to trigger on close, no outside-click dismissal, Escape cancels. Dialog preserves requested width + clamps it to container/dynamic viewport gutters. Generic Dialog footers wrap while consumers own action order. AlertDialog owns confirmation action layout: >640px horizontal buttons may move to another row; <=640px puts the destructive action above Cancel and makes both buttons full width regardless of pointer/hover capability. Button labels remain single-line. Body scrolls when height constrained. Every pointer: both actions tracked as one group like iOS alerts (action under pointer highlights at once, highlight follows pointer between actions, release runs action under pointer, release off both runs nothing); keyboard/AT keep each button click. To show w/o managing open state, use useImperativeAlertDialog hook: call alert.show(options) + render alert.element in tree.',
200
200
  bestPractices: [
201
201
  {
202
202
  guidance: true,
@@ -4,7 +4,9 @@
4
4
 
5
5
  /**
6
6
  * @file AlertDialog.tsx
7
- * @input Uses React, StyleX, Dialog, Layout, Heading, Text, Button
7
+ * @input Uses React, StyleX, Dialog, Layout, Heading, Text, Button, the
8
+ * action-group tracking (hooks/useActionGroupTracking) and the press-group
9
+ * marker (privateAttributes/pressGroupItem.stylex)
8
10
  * @output Exports AlertDialog component, AlertDialogProps type
9
11
  * @position Core implementation; consumed by index.ts, tested by AlertDialog.test.tsx
10
12
  *
@@ -12,11 +14,12 @@
12
14
  * - /packages/core/src/AlertDialog/AlertDialog.doc.mjs (props table, features, examples)
13
15
  * - /packages/core/src/AlertDialog/AlertDialog.test.tsx (tests for new/changed behavior)
14
16
  * - /packages/core/src/AlertDialog/index.ts (exports if types change)
17
+ * - /packages/core/src/AlertDialog/__tests__/AlertDialog.interaction.browser.spec.ts (touch tracking)
15
18
  * - /apps/storybook/stories/AlertDialog.stories.tsx (storybook stories)
16
19
  * - /packages/cli/assets/templates/blocks/components/AlertDialog/ (showcase blocks)
17
20
  */
18
21
 
19
- import React, {useId, useCallback} from 'react';
22
+ import React, {useId, useCallback, useRef} from 'react';
20
23
  import * as stylex from '@stylexjs/stylex';
21
24
  import {Dialog} from '../Dialog/Dialog';
22
25
  import {Layout} from '../Layout/Layout';
@@ -31,17 +34,31 @@ import type {BaseProps} from '../BaseProps';
31
34
  import {mergeProps} from '../utils/mergeProps';
32
35
  import {themeProps} from '../utils/themeProps';
33
36
  import {useMediaQuery} from '../hooks/useMediaQuery';
37
+ import {useTouchPresentation} from '../utils/touchPresentation';
34
38
  import {
35
39
  registerEnglishFallback,
36
40
  useComponentTranslator,
37
41
  } from '../i18n/useComponentTranslator';
38
42
  import english from '../i18n/generated-english/AlertDialog/AlertDialog.generated';
43
+ import {useActionGroupTracking} from '../hooks/useActionGroupTracking';
44
+ import {PressGroupContext} from '../hooks/pressGroupContext';
45
+ import {alertController} from '../motion/uikit/alert';
46
+ import {pressGroupItemProps} from '../privateAttributes/pressGroupItem.stylex';
39
47
 
40
48
  registerEnglishFallback(english);
41
49
 
50
+ const SLIDING_POINTERS = ['touch', 'pen'] as const;
51
+ const ACTION_TRACKING_PROPS = pressGroupItemProps(SLIDING_POINTERS);
52
+
42
53
  const SMALL_SCREEN_QUERY = '(max-width: 640px)';
43
54
 
44
55
  const styles = stylex.create({
56
+ // The browser may pinch-zoom on the actions but never pans there. Chrome on
57
+ // Android cancels a pointer it pans, which would cancel the group's press.
58
+ // The gesture host keeps an author's narrower touch-action.
59
+ trackingRow: {
60
+ touchAction: 'pinch-zoom',
61
+ },
45
62
  action: {
46
63
  maxWidth: '100%',
47
64
  minWidth: 0,
@@ -177,6 +194,24 @@ export function AlertDialog({
177
194
  onOpenChange(false);
178
195
  }, [onOpenChange]);
179
196
 
197
+ // Each action carries the press-group marker from its first render, so the
198
+ // tracker is its only painter.
199
+ const actionsRef = useRef<HTMLElement>(null);
200
+ // Only under the touch presentation does a press slide across the
201
+ // actions. A desktop press stays the native button's.
202
+ const {isTouch} = useTouchPresentation();
203
+ const isTracking = isOpen && isInline !== true && isTouch;
204
+ useActionGroupTracking(actionsRef, {
205
+ // The actions row holds only the two buttons.
206
+ itemSelector: 'button',
207
+ highlightOnsetMs: alertController.actions.highlightOnsetMs,
208
+ highlightExpansion: alertController.actions.highlightExpansion,
209
+ // A mouse press acts as a native button's under any presentation.
210
+ pointerTypes: SLIDING_POINTERS,
211
+ isEnabled: isTracking,
212
+ });
213
+ const actionTrackingProps = isTracking ? ACTION_TRACKING_PROPS : undefined;
214
+
180
215
  const buttonActionStyle = [
181
216
  styles.action,
182
217
  isSmallScreen && styles.stackedAction,
@@ -188,6 +223,7 @@ export function AlertDialog({
188
223
  label={cancelLabel}
189
224
  onClick={handleCancel}
190
225
  xstyle={buttonActionStyle}
226
+ {...actionTrackingProps}
191
227
  // Dialog focuses [data-autofocus] itself after showModal(), because
192
228
  // React's autoFocus runs during commit while the dialog is invisible.
193
229
  // Cancel is least destructive, so it remains the autofocus target even
@@ -203,6 +239,7 @@ export function AlertDialog({
203
239
  onClick={onAction}
204
240
  isLoading={isActionLoading}
205
241
  xstyle={buttonActionStyle}
242
+ {...actionTrackingProps}
206
243
  />
207
244
  );
208
245
 
@@ -244,13 +281,17 @@ export function AlertDialog({
244
281
  destructive-above-Cancel narrow order because confirmation
245
282
  actions have component-specific meaning here. */}
246
283
  <Stack
284
+ ref={actionsRef}
285
+ xstyle={isTracking && styles.trackingRow}
247
286
  direction={isSmallScreen ? 'vertical' : 'horizontal'}
248
287
  gap={2}
249
288
  hAlign={isSmallScreen ? 'stretch' : 'end'}
250
289
  wrap={isSmallScreen ? 'nowrap' : 'wrap'}>
251
- {isSmallScreen
252
- ? [actionButton, cancelButton]
253
- : [cancelButton, actionButton]}
290
+ <PressGroupContext value={isTracking}>
291
+ {isSmallScreen
292
+ ? [actionButton, cancelButton]
293
+ : [cancelButton, actionButton]}
294
+ </PressGroupContext>
254
295
  </Stack>
255
296
  </LayoutFooter>
256
297
  }
@@ -647,6 +647,8 @@ export function AppShell({
647
647
  if (isMobileNavOpen && !isMobileNavCloseHeld) {
648
648
  setIsMobileNavCloseHeld(true);
649
649
  }
650
+ // Syncs the mobile-nav close hold with a timer. The hold ends after the
651
+ // slide-out delay.
650
652
  useEffect(() => {
651
653
  if (!HasActivity || isMobileNavOpen) {
652
654
  return;
@@ -814,6 +816,8 @@ export function AppShell({
814
816
  const headerRef = useRef<HTMLDivElement>(null);
815
817
  const shellRef = useRef<HTMLDivElement>(null);
816
818
 
819
+ // Syncs the header-height CSS variable with a ResizeObserver while the height
820
+ // is automatic.
817
821
  useEffect(() => {
818
822
  if (!isAuto || !headerRef.current || !shellRef.current) {
819
823
  return;
@@ -517,6 +517,7 @@ function StandaloneBottomSheet({
517
517
  const stackViewRef = useRef(stackView);
518
518
  stackViewRef.current = stackView;
519
519
  const scrimWriteRef = useRef<BottomSheetScrimWrite>({frame: null});
520
+ // Releases the pending scrim write frame on unmount.
520
521
  useEffect(() => () => cancelScrimWrite(scrimWriteRef.current), []);
521
522
  const writeScrim = useCallback(
522
523
  (opacity: '0' | '1') =>
@@ -255,6 +255,10 @@ const styles = stylex.create({
255
255
  // surface behind the pill itself, fading out across the lower half so the
256
256
  // content emerging below has no visible cut line.
257
257
  backgroundImage: `linear-gradient(to bottom, ${colorVars['--color-background-surface']} 60%, transparent)`,
258
+ // WebKit can draw this bar under the scrolling body's own layer while the
259
+ // sheet's transform animates, so the pill vanishes until the sheet rests.
260
+ // A layer of its own keeps it above the body.
261
+ willChange: 'transform',
258
262
  // Drags are the handle's; a pinch still zooms the page (WCAG 1.4.4).
259
263
  touchAction: 'pinch-zoom',
260
264
  cursor: {
@@ -418,6 +422,7 @@ function waitForTransition(
418
422
 
419
423
  let done = false;
420
424
  let timer: ReturnType<typeof setTimeout> | null = null;
425
+ let backstopMs = 0;
421
426
  const finish = () => {
422
427
  if (done) {
423
428
  return;
@@ -431,9 +436,24 @@ function waitForTransition(
431
436
  complete();
432
437
  };
433
438
  const handleTransitionEnd = (event: TransitionEvent) => {
434
- if (event.target === element && event.propertyName === propertyName) {
435
- finish();
439
+ if (event.target !== element || event.propertyName !== propertyName) {
440
+ return;
441
+ }
442
+ // The engine cancels a transition whose end value changes mid-flight. A
443
+ // percentage transform does when the closing frame moves the height by a
444
+ // fraction of a pixel. A replacement runs on from where it was. That one
445
+ // ends the motion, not the cancel.
446
+ if (
447
+ event.type === 'transitioncancel' &&
448
+ hasRunningTransition(element, propertyName)
449
+ ) {
450
+ if (timer != null) {
451
+ clearTimeout(timer);
452
+ timer = setTimeout(finish, backstopMs);
453
+ }
454
+ return;
436
455
  }
456
+ finish();
437
457
  };
438
458
  element.addEventListener('transitionend', handleTransitionEnd);
439
459
  element.addEventListener('transitioncancel', handleTransitionEnd);
@@ -484,7 +504,8 @@ function waitForTransition(
484
504
  return () => {};
485
505
  }
486
506
 
487
- timer = setTimeout(finish, transitionMs + TRANSITION_BACKSTOP_BUFFER_MS);
507
+ backstopMs = transitionMs + TRANSITION_BACKSTOP_BUFFER_MS;
508
+ timer = setTimeout(finish, backstopMs);
488
509
  return () => {
489
510
  if (timer != null) {
490
511
  clearTimeout(timer);
@@ -494,6 +515,19 @@ function waitForTransition(
494
515
  };
495
516
  }
496
517
 
518
+ // Whether a CSS transition of `propertyName` still runs on `element`.
519
+ function hasRunningTransition(
520
+ element: HTMLElement,
521
+ propertyName: string,
522
+ ): boolean {
523
+ return (element.getAnimations?.() ?? []).some(
524
+ animation =>
525
+ (animation as Animation & {transitionProperty?: string})
526
+ .transitionProperty === propertyName &&
527
+ (animation.playState === 'running' || animation.playState === 'paused'),
528
+ );
529
+ }
530
+
497
531
  function parseTransitionTime(value: string): number | null {
498
532
  const normalizedValue = value.trim();
499
533
  if (!/^-?(?:\d+|\d*\.\d+)(?:ms|s)$/.test(normalizedValue)) {
@@ -676,6 +710,8 @@ export function BottomSheetPanel({
676
710
  const isCoarseCrossFade = useMediaQuery(REDUCED_MOTION_COARSE_QUERY);
677
711
  const isCrossFade =
678
712
  isCoarseCrossFade || (isReducedMotion && isDismissedByTouchDrag);
713
+ // Syncs the motion with the panel's CSS transition. The motion completes when
714
+ // that transition ends.
679
715
  useLayoutEffect(() => {
680
716
  if (motion == null) {
681
717
  return;
@@ -358,6 +358,7 @@ export function BottomSheetSwitcher({
358
358
  const stackViewRef = useRef(stackView);
359
359
  stackViewRef.current = stackView;
360
360
  const scrimWriteRef = useRef<BottomSheetScrimWrite>({frame: null});
361
+ // Releases the pending scrim write frame on unmount.
361
362
  useEffect(() => () => cancelScrimWrite(scrimWriteRef.current), []);
362
363
  // What the flow's place in the stack was when it left the registry: its
363
364
  // depth and the open sheet beneath it. React runs the registration
@@ -564,6 +565,9 @@ export function BottomSheetSwitcher({
564
565
  presentationCounterRef.current += 1;
565
566
  presentationOrderRef.current.set(sheetId, presentationCounterRef.current);
566
567
  }, []);
568
+ // Syncs document focus with the flow's visibility. When the flow hides, focus
569
+ // goes to the opener, to the sheet now on top, or to the target of the
570
+ // registry.
567
571
  useLayoutEffect(() => {
568
572
  if (isFlowVisible) {
569
573
  if (!hasScrim) {
@@ -694,6 +698,7 @@ export function BottomSheetSwitcher({
694
698
  unregister();
695
699
  };
696
700
  }, [hasScrim, isFlowVisible, onBeforeSheetPresent]);
701
+ // Syncs the open state of this flow in the sheet stack registry.
697
702
  useLayoutEffect(() => {
698
703
  if (isFlowVisible && hasScrim) {
699
704
  setBottomSheetOpen(stackKeyRef.current, isFlowOpen);
@@ -148,6 +148,8 @@ export function useMobileKeyboard({
148
148
  }
149
149
  }, [isEnabled, isSheetTraveling, sheetRef]);
150
150
 
151
+ // Syncs the on-screen keyboard with the sheet. When a presented sheet closes,
152
+ // the focused field blurs, so the keyboard closes.
151
153
  useEffect(() => {
152
154
  if (!isEnabled || !isPresented || isOpen) {
153
155
  return;
@@ -165,6 +167,8 @@ export function useMobileKeyboard({
165
167
  }
166
168
  }, [isEnabled, isOpen, isPresented, sheetRef]);
167
169
 
170
+ // Syncs the body's end inset with the visual viewport, so the on-screen
171
+ // keyboard does not cover the body.
168
172
  useEffect(() => {
169
173
  const body = bodyRef.current;
170
174
  const sheet = sheetRef.current;
@@ -699,6 +699,8 @@ export function useSheetGestures({
699
699
  const sheetElRef = useRef<HTMLElement | null>(null);
700
700
  const bodyNodeRef = useRef<HTMLElement | null>(null);
701
701
  const observerRef = useRef<ResizeObserver | null>(null);
702
+ // Syncs the browser layout with the transform reset, then ends the
703
+ // scroll-area reconcile one frame later.
702
704
  useLayoutEffect(() => {
703
705
  if (!isScrollAreaReconciling) {
704
706
  return;
@@ -738,7 +740,9 @@ export function useSheetGestures({
738
740
  }
739
741
  return;
740
742
  }
741
- recordSheetHeight(node.getBoundingClientRect().height);
743
+ // No measure here: reading the height while the sheet mounts forces a
744
+ // layout in the middle of the open. The observer's first report comes
745
+ // after the browser's own layout, before the first paint.
742
746
  const ro = new ResizeObserver(entries => {
743
747
  const entry = entries[0];
744
748
  if (entry) {
@@ -756,6 +760,7 @@ export function useSheetGestures({
756
760
  },
757
761
  [recordSheetHeight],
758
762
  );
763
+ // Releases the height observer on unmount.
759
764
  useEffect(() => () => observerRef.current?.disconnect(), []);
760
765
 
761
766
  // Reset to the tallest detent each time the sheet re-opens.
@@ -907,6 +912,8 @@ export function useSheetGestures({
907
912
  resolveDetents,
908
913
  ]);
909
914
 
915
+ // Syncs window resize and orientation listeners with `isOpen`. Each event
916
+ // anchors the sheet to its settled detent again.
910
917
  useEffect(() => {
911
918
  if (!isOpen || typeof window === 'undefined') {
912
919
  return;
@@ -1024,6 +1031,8 @@ export function useSheetGestures({
1024
1031
  [prepareScrollAreaSettle, resolveDetents],
1025
1032
  );
1026
1033
 
1034
+ // Syncs window blur and document visibilitychange listeners with `isOpen`. A
1035
+ // blur or a hidden page cancels a drag.
1027
1036
  useEffect(() => {
1028
1037
  // Only an open sheet can be dragged; a closed one listens to nothing.
1029
1038
  if (!isOpen) {