@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
@@ -4,46 +4,49 @@
4
4
 
5
5
  /**
6
6
  * @file useScrollLock.ts
7
- * @input Uses React useEffect
8
- * @output Exports useScrollLock hook for locking body scroll
9
- * @position Core hook; used by Dialog to prevent background scrolling
10
- *
11
- * Locks body scroll when active by pinning the body with position:fixed.
12
- * This is needed because overscroll-behavior:contain doesn't work on iOS Safari.
7
+ * @input React useEffect, rootScrollStyles, gestures/pageHold with the pan
8
+ * decision, and the scrollbar gutter hold
9
+ * @output useScrollLock, which locks page scroll behind a modal
10
+ * @position Core hook; used by Dialog, BottomSheet, Drawer, Lightbox and
11
+ * MobileNav
13
12
  *
14
13
  * SYNC: When modified, update:
15
14
  * - /packages/core/src/hooks/index.ts
16
15
  * - /packages/core/src/hooks/scrollbarGutter.ts
16
+ * - /packages/core/src/hooks/rootScrollStyles.ts
17
+ * - /packages/core/src/gestures/pageHold.ts (holdPageScroll)
18
+ * - /packages/core/src/hooks/useScrollLockImports.test.ts
17
19
  */
18
20
 
19
21
  import {useEffect} from 'react';
22
+ import {claimRootScrollStyle, reportScrollLock} from './rootScrollStyles';
23
+ import {holdPageScroll} from '../gestures/pageHold';
24
+ import {isPageZoomedIn, isPanAbsorbedBeforePage} from './scrollLockTouchGuard';
20
25
  import {holdScrollbarGutter, type ScrollbarGutterHold} from './scrollbarGutter';
21
26
 
22
- interface ScrollLockSnapshot {
23
- scrollX: number;
24
- scrollY: number;
25
- overflow: string;
26
- position: string;
27
- top: string;
28
- left: string;
29
- right: string;
27
+ // iOS Safari scrolls an `overflow: hidden` page under a finger.
28
+ // So the lock also cancels each one-finger pan that would reach the page. The
29
+ // scroll offset never changes, so unlock restores nothing, and iOS Safari's
30
+ // toolbar keeps its state.
31
+
32
+ interface ActiveLock {
33
+ releaseRootStyle: () => void;
34
+ releasePageHold: () => void;
30
35
  gutter: ScrollbarGutterHold;
31
36
  }
32
37
 
33
38
  let lockCount = 0;
34
- let originalBodyState: ScrollLockSnapshot | null = null;
39
+ let activeLock: ActiveLock | null = null;
35
40
 
36
41
  /**
37
- * Locks body scroll when `isLocked` is true.
38
- *
39
- * Pins the body with `position: fixed` to prevent background scrolling,
40
- * which is necessary for iOS Safari where `overscroll-behavior: contain`
41
- * does not prevent body scroll behind modals. Restores scroll position
42
- * on unlock.
42
+ * Locks page scroll while `isLocked` is true.
43
43
  *
44
- * Pinning also hides the document's scrollbar, so the gutter that scrollbar
45
- * occupied is held open for the duration of the lock — without it the page
46
- * reflows sideways by ~15px the moment an overlay opens.
44
+ * The page keeps its scroll offset, so nothing jumps on lock or unlock. Where
45
+ * the primary pointer is coarse (phones and tablets), the lock cancels a
46
+ * one-finger pan that would reach the page.
47
+ * Pans that a scroller in the overlay takes, and two-finger zoom, go through.
48
+ * The gutter of a classic scrollbar stays open, so the page does not shift
49
+ * sideways.
47
50
  *
48
51
  * @example
49
52
  * ```
@@ -51,59 +54,53 @@ let originalBodyState: ScrollLockSnapshot | null = null;
51
54
  * ```
52
55
  */
53
56
  export function useScrollLock(isLocked: boolean): void {
57
+ // Syncs the document's scroll lock with `isLocked`. A count of holders keeps
58
+ // the page locked until the last one releases.
54
59
  useEffect(() => {
55
60
  if (!isLocked) {
56
61
  return;
57
62
  }
58
63
 
59
- const {body} = document;
60
-
61
64
  if (lockCount === 0) {
62
- const scrollX = window.scrollX;
63
- const scrollY = window.scrollY;
64
-
65
- // Taken before the pinning styles below hide the scrollbar.
66
- const gutter = holdScrollbarGutter(body);
67
-
68
- originalBodyState = {
69
- scrollX,
70
- scrollY,
71
- overflow: body.style.overflow,
72
- position: body.style.position,
73
- top: body.style.top,
74
- left: body.style.left,
75
- right: body.style.right,
76
- gutter,
77
- };
78
-
79
- body.style.overflow = 'hidden';
80
- body.style.position = 'fixed';
81
- body.style.top = `-${scrollY}px`;
82
- body.style.left = '0';
83
- body.style.right = '0';
84
-
65
+ // The hold measures before the lock writes a style, so the lock forces no
66
+ // layout of its own. `settle` writes the gutter with the styles below.
67
+ const gutter = holdScrollbarGutter(document.documentElement);
68
+ // `overscroll-behavior-y: none` also keeps the browser's own
69
+ // pull-to-refresh (Chrome on Android) from reloading the page behind
70
+ // the overlay.
71
+ const releaseRootStyle = claimRootScrollStyle({
72
+ overflow: 'hidden',
73
+ overscrollBehaviorY: 'none',
74
+ });
75
+ // The hold asks the gesture host only if one exists, so the lock does
76
+ // not bring the host into every overlay's import.
77
+ const releasePageHold = holdPageScroll(
78
+ document,
79
+ // A drag on a pinch-zoomed page pans the zoomed view: it goes
80
+ // through, so a zoomed-in reader can move around the overlay.
81
+ (origin, dx, dy) =>
82
+ !isPageZoomedIn(document) && !isPanAbsorbedBeforePage(origin, dx, dy),
83
+ );
85
84
  gutter.settle();
85
+ activeLock = {releaseRootStyle, releasePageHold, gutter};
86
86
  }
87
87
 
88
88
  lockCount += 1;
89
+ reportScrollLock(1);
89
90
 
90
91
  return () => {
91
92
  lockCount -= 1;
93
+ reportScrollLock(-1);
92
94
 
93
- if (lockCount !== 0 || originalBodyState == null) {
95
+ if (lockCount !== 0 || activeLock == null) {
94
96
  return;
95
97
  }
96
98
 
97
- const state = originalBodyState;
98
- originalBodyState = null;
99
-
100
- body.style.overflow = state.overflow;
101
- body.style.position = state.position;
102
- body.style.top = state.top;
103
- body.style.left = state.left;
104
- body.style.right = state.right;
105
- state.gutter.release();
106
- window.scrollTo(state.scrollX, state.scrollY);
99
+ const lock = activeLock;
100
+ activeLock = null;
101
+ lock.releasePageHold();
102
+ lock.releaseRootStyle();
103
+ lock.gutter.release();
107
104
  };
108
105
  }, [isLocked]);
109
106
  }
@@ -216,6 +216,8 @@ export function useScrollableArea({
216
216
  const getComposedViewportRef = useStableComposedRef(viewportRef);
217
217
  const getComposedContentRef = useStableComposedRef(contentRef);
218
218
 
219
+ // Syncs the scroll geometry with the viewport and content nodes. It measures
220
+ // them, then follows resize, scroll, transition and font events.
219
221
  useIsomorphicLayoutEffect(() => {
220
222
  if (viewport == null || content == null) {
221
223
  return;
@@ -430,6 +432,8 @@ export function useScrollableArea({
430
432
  // commit. A loss waits for the next frame.
431
433
  const previousOverflowRef = useRef<LogicalOverflowGeometry>(INITIAL_OVERFLOW);
432
434
  const previousMappingRef = useRef<LogicalAxisMapping>(INITIAL_MAPPING);
435
+ // Measures the layout again when overflow starts or the writing-mode mapping
436
+ // changes. A new scrollbar gutter changes the geometry.
433
437
  useIsomorphicLayoutEffect(() => {
434
438
  const previous = previousOverflowRef.current;
435
439
  const hasGainedOverflow =
@@ -178,6 +178,8 @@ export function useStreamingText(
178
178
  '(prefers-reduced-motion: reduce)',
179
179
  );
180
180
 
181
+ // Syncs the revealed text with an animation-frame clock while the text
182
+ // streams.
181
183
  useEffect(() => {
182
184
  if (!isStreaming || speed === 'instant' || prefersReducedMotion) {
183
185
  return;
@@ -0,0 +1,43 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @generated by scripts/generate-i18n-runtime.mjs from packages/core/locales/en.json,
5
+ * holding the English for the catalog keys named in packages/core/src/PowerSearch/PowerSearchBottomSheet.tsx.
6
+ * Do not edit by hand. Run `pnpm generate:i18n-runtime` instead.
7
+ */
8
+
9
+ const english: Readonly<Record<string, string>> = {
10
+ "@astryx.powersearch.allFiltersRemoved": "All filters removed",
11
+ "@astryx.powersearch.editableFiltersRemoved": "Editable filters removed",
12
+ "@astryx.powersearch.editor.apply": "Apply",
13
+ "@astryx.powersearch.editor.cancel": "Cancel",
14
+ "@astryx.powersearch.editor.operator": "Operator",
15
+ "@astryx.powersearch.sheet.addFilter": "Add filter",
16
+ "@astryx.powersearch.sheet.clearAll": "Clear all",
17
+ "@astryx.powersearch.sheet.clearAllCancel": "Keep filters",
18
+ "@astryx.powersearch.sheet.clearAllConfirm": "Clear filters",
19
+ "@astryx.powersearch.sheet.clearAllDescription": "This removes all editable filters from this search.",
20
+ "@astryx.powersearch.sheet.clearAllTitle": "Clear all filters?",
21
+ "@astryx.powersearch.sheet.done": "Done",
22
+ "@astryx.powersearch.sheet.editableFiltersClearedWithCount": "Editable filters removed. {resultCount}",
23
+ "@astryx.powersearch.sheet.fieldOperator": "{field} {operator}",
24
+ "@astryx.powersearch.sheet.filterUnavailable": "This filter is no longer available",
25
+ "@astryx.powersearch.sheet.filtersClearedWithCount": "All filters removed. {resultCount}",
26
+ "@astryx.powersearch.sheet.filtersTitle": "Filters",
27
+ "@astryx.powersearch.sheet.labelValue": "{label} {value}",
28
+ "@astryx.powersearch.sheet.noFilters": "No filters applied",
29
+ "@astryx.powersearch.sheet.noFiltersDescription": "Add a filter to narrow your results and find what you need faster.",
30
+ "@astryx.powersearch.sheet.noMatchingFields": "No filters match your search",
31
+ "@astryx.powersearch.sheet.noResults": "No results found",
32
+ "@astryx.powersearch.sheet.removeFilter": "Remove {field} filter",
33
+ "@astryx.powersearch.sheet.search": "Search",
34
+ "@astryx.powersearch.sheet.searchFields": "Search filters",
35
+ "@astryx.powersearch.sheet.searchFieldsPlaceholder": "Search filters…",
36
+ "@astryx.powersearch.sheet.searchResults": "Search results",
37
+ "@astryx.powersearch.sheet.tryDifferentSearch": "Try a different search.",
38
+ "@astryx.powersearch.sheet.ungroupedFields": "General",
39
+ "@astryx.tokenizer.tokenAdded": "Added {label}",
40
+ "@astryx.tokenizer.tokenRemoved": "Removed {label}"
41
+ };
42
+
43
+ export default english;
@@ -7,6 +7,12 @@
7
7
  */
8
8
 
9
9
  const english: Readonly<Record<string, string>> = {
10
+ "@astryx.powersearch.sheet.relativeDaysAgo": "{count, number} {count, plural, one {day} other {days}} ago",
11
+ "@astryx.powersearch.sheet.relativeDaysFromNow": "{count, number} {count, plural, one {day} other {days}} from now",
12
+ "@astryx.powersearch.sheet.relativeMonthsAgo": "{count, number} {count, plural, one {month} other {months}} ago",
13
+ "@astryx.powersearch.sheet.relativeMonthsFromNow": "{count, number} {count, plural, one {month} other {months}} from now",
14
+ "@astryx.powersearch.sheet.relativeWeeksAgo": "{count, number} {count, plural, one {week} other {weeks}} ago",
15
+ "@astryx.powersearch.sheet.relativeWeeksFromNow": "{count, number} {count, plural, one {week} other {weeks}} from now",
10
16
  "@astryx.powersearch.valueEditor.addValuesPlaceholder": "Add values…",
11
17
  "@astryx.powersearch.valueEditor.date": "Date",
12
18
  "@astryx.powersearch.valueEditor.dateRange": "date range",
@@ -0,0 +1,15 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @generated by scripts/generate-i18n-runtime.mjs from packages/core/locales/en.json,
5
+ * holding the English for the catalog keys named in packages/core/src/PowerSearch/formatTokenValue.ts.
6
+ * Do not edit by hand. Run `pnpm generate:i18n-runtime` instead.
7
+ */
8
+
9
+ const english: Readonly<Record<string, string>> = {
10
+ "@astryx.powersearch.valueEditor.dateRange": "date range",
11
+ "@astryx.powersearch.valueEditor.filtersCount": "{count, number} {count, plural, one {filter} other {filters}}",
12
+ "@astryx.powersearch.valueEditor.itemsCount": "{count, number} {count, plural, one {item} other {items}}"
13
+ };
14
+
15
+ export default english;
@@ -78,6 +78,47 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
78
78
  '{count, number} {count, plural, one {filter} other {filters}}',
79
79
  '@astryx.powersearch.resultCount':
80
80
  '{count, number} {count, plural, one {result} other {results}}',
81
+ '@astryx.powersearch.sheet.filtersTitle': 'Filters',
82
+ '@astryx.powersearch.sheet.addFilter': 'Add filter',
83
+ '@astryx.powersearch.sheet.noFilters': 'No filters applied',
84
+ '@astryx.powersearch.sheet.noFiltersDescription':
85
+ 'Add a filter to narrow your results and find what you need faster.',
86
+ '@astryx.powersearch.sheet.clearAll': 'Clear all',
87
+ '@astryx.powersearch.sheet.clearAllTitle': 'Clear all filters?',
88
+ '@astryx.powersearch.sheet.clearAllDescription':
89
+ 'This removes all editable filters from this search.',
90
+ '@astryx.powersearch.sheet.clearAllConfirm': 'Clear filters',
91
+ '@astryx.powersearch.sheet.clearAllCancel': 'Keep filters',
92
+ '@astryx.powersearch.sheet.done': 'Done',
93
+ '@astryx.powersearch.sheet.search': 'Search',
94
+ '@astryx.powersearch.sheet.searchResults': 'Search results',
95
+ '@astryx.powersearch.sheet.searchFields': 'Search filters',
96
+ '@astryx.powersearch.sheet.searchFieldsPlaceholder': 'Search filters…',
97
+ '@astryx.powersearch.sheet.ungroupedFields': 'General',
98
+ '@astryx.powersearch.sheet.noMatchingFields': 'No filters match your search',
99
+ '@astryx.powersearch.sheet.tryDifferentSearch': 'Try a different search.',
100
+ '@astryx.powersearch.sheet.noResults': 'No results found',
101
+ '@astryx.powersearch.sheet.filterUnavailable':
102
+ 'This filter is no longer available',
103
+ '@astryx.powersearch.sheet.removeFilter': 'Remove {field} filter',
104
+ '@astryx.powersearch.sheet.relativeDaysAgo':
105
+ '{count, number} {count, plural, one {day} other {days}} ago',
106
+ '@astryx.powersearch.sheet.relativeDaysFromNow':
107
+ '{count, number} {count, plural, one {day} other {days}} from now',
108
+ '@astryx.powersearch.sheet.relativeWeeksAgo':
109
+ '{count, number} {count, plural, one {week} other {weeks}} ago',
110
+ '@astryx.powersearch.sheet.relativeWeeksFromNow':
111
+ '{count, number} {count, plural, one {week} other {weeks}} from now',
112
+ '@astryx.powersearch.sheet.relativeMonthsAgo':
113
+ '{count, number} {count, plural, one {month} other {months}} ago',
114
+ '@astryx.powersearch.sheet.relativeMonthsFromNow':
115
+ '{count, number} {count, plural, one {month} other {months}} from now',
116
+ '@astryx.powersearch.sheet.fieldOperator': '{field} {operator}',
117
+ '@astryx.powersearch.sheet.labelValue': '{label} {value}',
118
+ '@astryx.powersearch.sheet.filtersClearedWithCount':
119
+ 'All filters removed. {resultCount}',
120
+ '@astryx.powersearch.sheet.editableFiltersClearedWithCount':
121
+ 'Editable filters removed. {resultCount}',
81
122
  '@astryx.alertDialog.cancel': 'Cancel',
82
123
  '@astryx.appShell.mobileNavigation': 'Mobile navigation',
83
124
  '@astryx.appShell.skipToContent': 'Skip to content',
@@ -80,6 +80,48 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
80
80
  '⟦{count, number} {count, plural, one {filter} other {filters}}⟧',
81
81
  '@astryx.powersearch.resultCount':
82
82
  '⟦{count, number} {count, plural, one {result} other {results}}⟧',
83
+ '@astryx.powersearch.sheet.filtersTitle': '⟦Ƒíłţéřš⟧',
84
+ '@astryx.powersearch.sheet.addFilter': '⟦Àðð ƒíłţéř⟧',
85
+ '@astryx.powersearch.sheet.noFilters': '⟦Ñó ƒíłţéřš àþþłíéð⟧',
86
+ '@astryx.powersearch.sheet.noFiltersDescription':
87
+ '⟦Àðð à ƒíłţéř ţó ñàřřóŵ ýóúř řéšúłţš àñð ƒíñð ŵĥàţ ýóú ñééð ƒàšţéř.⟧',
88
+ '@astryx.powersearch.sheet.clearAll': '⟦Çłéàř àłł⟧',
89
+ '@astryx.powersearch.sheet.clearAllTitle': '⟦Çłéàř àłł ƒíłţéřš?⟧',
90
+ '@astryx.powersearch.sheet.clearAllDescription':
91
+ '⟦Ţĥíš řéɱóṽéš àłł éðíţàƀłé ƒíłţéřš ƒřóɱ ţĥíš šéàřçĥ.⟧',
92
+ '@astryx.powersearch.sheet.clearAllConfirm': '⟦Çłéàř ƒíłţéřš⟧',
93
+ '@astryx.powersearch.sheet.clearAllCancel': '⟦Ķééþ ƒíłţéřš⟧',
94
+ '@astryx.powersearch.sheet.done': '⟦Ðóñé⟧',
95
+ '@astryx.powersearch.sheet.search': '⟦Šéàřçĥ⟧',
96
+ '@astryx.powersearch.sheet.searchResults': '⟦Šéàřçĥ řéšúłţš⟧',
97
+ '@astryx.powersearch.sheet.searchFields': '⟦Šéàřçĥ ƒíłţéřš⟧',
98
+ '@astryx.powersearch.sheet.searchFieldsPlaceholder': '⟦Šéàřçĥ ƒíłţéřš…⟧',
99
+ '@astryx.powersearch.sheet.ungroupedFields': '⟦Ĝéñéřàł⟧',
100
+ '@astryx.powersearch.sheet.noMatchingFields':
101
+ '⟦Ñó ƒíłţéřš ɱàţçĥ ýóúř šéàřçĥ⟧',
102
+ '@astryx.powersearch.sheet.tryDifferentSearch': '⟦Ţřý à ð탃éřéñţ šéàřçĥ.⟧',
103
+ '@astryx.powersearch.sheet.noResults': '⟦Ñó řéšúłţš ƒóúñð⟧',
104
+ '@astryx.powersearch.sheet.filterUnavailable':
105
+ '⟦Ţĥíš ƒíłţéř íš ñó łóñĝéř àṽàíłàƀłé⟧',
106
+ '@astryx.powersearch.sheet.removeFilter': '⟦Řéɱóṽé {field} ƒíłţéř⟧',
107
+ '@astryx.powersearch.sheet.relativeDaysAgo':
108
+ '⟦{count, number} {count, plural, one {day} other {days}} àĝó⟧',
109
+ '@astryx.powersearch.sheet.relativeDaysFromNow':
110
+ '⟦{count, number} {count, plural, one {day} other {days}} ƒřóɱ ñóŵ⟧',
111
+ '@astryx.powersearch.sheet.relativeWeeksAgo':
112
+ '⟦{count, number} {count, plural, one {week} other {weeks}} àĝó⟧',
113
+ '@astryx.powersearch.sheet.relativeWeeksFromNow':
114
+ '⟦{count, number} {count, plural, one {week} other {weeks}} ƒřóɱ ñóŵ⟧',
115
+ '@astryx.powersearch.sheet.relativeMonthsAgo':
116
+ '⟦{count, number} {count, plural, one {month} other {months}} àĝó⟧',
117
+ '@astryx.powersearch.sheet.relativeMonthsFromNow':
118
+ '⟦{count, number} {count, plural, one {month} other {months}} ƒřóɱ ñóŵ⟧',
119
+ '@astryx.powersearch.sheet.fieldOperator': '⟦{field} {operator}⟧',
120
+ '@astryx.powersearch.sheet.labelValue': '⟦{label} {value}⟧',
121
+ '@astryx.powersearch.sheet.filtersClearedWithCount':
122
+ '⟦Àłł ƒíłţéřš řéɱóṽéð. {resultCount}⟧',
123
+ '@astryx.powersearch.sheet.editableFiltersClearedWithCount':
124
+ '⟦Éðíţàƀłé ƒíłţéřš řéɱóṽéð. {resultCount}⟧',
83
125
  '@astryx.alertDialog.cancel': '⟦Çàñçéł⟧',
84
126
  '@astryx.appShell.mobileNavigation': '⟦Ṁóƀíłé ñàṽíĝàţíóñ⟧',
85
127
  '@astryx.appShell.skipToContent': '⟦Šķíþ ţó çóñţéñţ⟧',
package/src/index.ts CHANGED
@@ -173,6 +173,19 @@ export * from './Outline';
173
173
  // Overflow list
174
174
  export * from './OverflowList';
175
175
 
176
+ // Animating one element: from the package root only, since one API has one
177
+ // entry. Its hook ships from './hooks'.
178
+ export {
179
+ createAnimator,
180
+ type Animator,
181
+ type AnimatorAnimateOptions,
182
+ type AnimatorChannel,
183
+ type AnimatorDecayVelocity,
184
+ type AnimatorHandle,
185
+ type AnimatorSnapshot,
186
+ type AnimatorValues,
187
+ } from './animator/createAnimator';
188
+
176
189
  // Hooks
177
190
  export * from './hooks';
178
191
 
@@ -0,0 +1,24 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file indicatorPress.stylex.ts
5
+ * @input Uses StyleX
6
+ * @output Exports `indicatorPressScope`, the marker of a first-party
7
+ * indicator that paints its own press
8
+ * @position Internal entry for Astryx's own replacement indicators;
9
+ * CheckboxInput reads it
10
+ */
11
+
12
+ import * as stylex from '@stylexjs/stylex';
13
+
14
+ /**
15
+ * Marks a first-party replacement indicator that paints its own press, for
16
+ * a shape that CheckboxInput's rounded-square press layer would tint past,
17
+ * such as a circle. CheckboxInput leaves that layer off over an indicator
18
+ * with this marker.
19
+ *
20
+ * @internal Not public API: the touch press reaches the indicator through a
21
+ * private property.
22
+ */
23
+ export const indicatorPressScope: ReturnType<typeof stylex.defineMarker> =
24
+ stylex.defineMarker();
@@ -0,0 +1,21 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /**
3
+ * @file selectable-card.ts
4
+ * @input SelectableCard's internal input context, the Field input styling
5
+ * rule and the aria id joiner
6
+ * @output `@astryxdesign/core/internal/selectable-card`:
7
+ * SelectableCardInputContext, useFieldInputStyling and joinAriaIDs,
8
+ * re-exported by name
9
+ * for Lab's SelectableCardGroup
10
+ * @position An internal entry reserved for Astryx's own packages:
11
+ * undocumented, outside the public API and its compatibility promise,
12
+ * versioned in lockstep with Core, and allowed only in Core and Lab by the
13
+ * `@astryx/no-core-internal-import` lint rule. Core components import the
14
+ * same modules by relative path. Named re-exports only.
15
+ *
16
+ * SYNC: When modified, update scripts/sync-exports.js.
17
+ */
18
+ export {SelectableCardInputContext} from '../SelectableCard/selectableCardInput';
19
+ export type {SelectableCardInput} from '../SelectableCard/selectableCardInput';
20
+ export {useFieldInputStyling} from '../Field/fieldParts';
21
+ export {joinAriaIDs} from '../utils/inputAria';
@@ -4,8 +4,8 @@
4
4
  * @input A sheet's selection at open, its draft, and the last edit made
5
5
  * @output SheetDraftChange, hasSameSelection, nameSheetDraftChange — the
6
6
  * rules a touch sheet's Save and dismissal share
7
- * @position Core-internal, shared by the Tokenizer sheet and the Lab sheets
8
- * through `internal/touch-sheet`; not a public export
7
+ * @position Core-internal. The Tokenizer sheet uses it, and PowerSearch's
8
+ * list-value step renders that sheet. Not a public export.
9
9
  *
10
10
  * A touch sheet edits a draft and reports it once, on Save, with one change:
11
11
  * the last edit that still holds, else the nearest net add or remove. A
@@ -286,3 +286,21 @@ fades in, with Prefer Cross-Fade Transitions on or off.
286
286
  | M-CM4 | Reduce Motion press feedback | Probe app with Reduce Motion on: long press, then dismiss | press feedback, lift and dismiss animations under Reduce Motion | A, B |
287
287
  | M-CM5 | Commit haptic stand-in | An Android device: `navigator.vibrate` patterns against the platform's HapticFeedbackConstants for the context-click moment | the pattern that matches; not a UIKit parity value (as M-G18) | H |
288
288
  | M-CM6 | Press thresholds | Probe app: repeated long presses at random vsync phases | from touch receipt and from the HID timestamp, the tick before and the tick at the press observer's began and at the click commit; the intersection pins the 150 ms and 400 ms thresholds | C |
289
+
290
+ ## Picker (UIPickerView)
291
+
292
+ Values the Wheel reads from its own table (`uikit/picker.ts`).
293
+
294
+ The recordings are of a 402 × 216 pt UIPickerView with two columns of 24 and
295
+ 60 rows. It runs in an instrumented host app on the iOS 26.2 simulator
296
+ (iPhone 17 Pro), driven by real HID touches. They hold per-frame offsets, the
297
+ table views' and cells' layers, the delegate calls and the haptics.
298
+
299
+ Done (UIKit lab, iOS 26.2 simulator, Oct 23 2026; in the picker's table): the
300
+ row pitch, the picker's height, the rubber band's dimension, the coast's stop
301
+ speed, the velocity floor, the snap at rest, the tap spin and the selection
302
+ tick. Measured and kept by the gesture system instead: the
303
+ scroll view coasts with 0.25 × the pan's velocity plus 0.75 × its value one
304
+ event earlier (four HID releases; `velocity.scrollReleaseWeight`, which a
305
+ pan's `scrollVelocity()` reads). On UIKit, Reduce Motion with Prefer Cross-Fade changes
306
+ nothing on a picker; the Wheel follows design:reduced-motion instead.
@@ -19,9 +19,11 @@ roles through `resolveMotion`.
19
19
  | `uikit/scroll.ts` | UIScrollView: deceleration rates, rubber band, bounce-back spring, `delaysContentTouches`, scroll to top. |
20
20
  | `uikit/timing.ts` | Non-spring clocks and curves: press highlight, Core Animation's named curves, keyboard, Reduced Motion cross-fade. |
21
21
  | `uikit/paging.ts` | A paging UIScrollView: the integrator that settles a release on its page, the page rule, the catch, `setContentOffset(animated:)`. |
22
+ | `uikit/alert.ts` | UIAlertController: how a finger is tracked across the actions (highlight onset and bounds). |
22
23
  | `uikit/navigation.ts` | UINavigationController: push velocity, parallax, dimming, transition clock, interactive pop finish rule. |
23
24
  | `uikit/progressBar.ts` | UIProgressView's fill: the whole-track duration and curve, its minimum length and empty alpha; the reduced-motion pulse (three roles). |
24
25
  | `uikit/gestures.ts` | Gesture recognizer thresholds, the velocity filter and haptic stand-ins, as `{value, unit}` entries (sources in JSDoc). |
26
+ | `uikit/picker.ts` | UIPickerView: row pitch, height and rubber band, velocity floor, the coast's stop speed, snap at rest, tap spin, tick. |
25
27
  | `uikit/segmented.ts` | UISegmentedControl: the selection indicator's spring; under Reduce Motion the animator's cross-fade replaces it. |
26
28
  | `uikit/switch.ts` | UISwitch on iOS 26.2: geometry, the lift, settle, travel and tracking springs, the flip distance, the track colour. |
27
29
  | `roles.ts` | The internal motion roles: the springs, durations and curves `spec:AST-094` FR4 names, registered by the shared tables, and a role's CSS form read back. |
@@ -37,6 +39,7 @@ roles through `resolveMotion`.
37
39
  | `resolveSnapPoint.ts` | Release policy: the snap point a release lands on (flick, back-out cancel, step limit), on `selectSnapPoint`. Internal. |
38
40
  | `bezier.ts` | Cubic-bézier timing functions (Core Animation's named curves). |
39
41
  | `animator.ts` | Compositor animator: springs, coasts and any closed-form curve compiled to Web Animations, read back analytically. |
42
+ | `progress.ts` | A spring's progress, one curve mapped from another (companions, clamped ranges), the velocity that continues a motion. |
40
43
  | `presentation.ts` | Where each moving element is drawn relative to where the engine hit-tests it, reported by the animator while translate runs; read by the gesture host at touch-down. |
41
44
  | `reducedMotionPlan.ts` | The animator's Reduce Motion planner: what one call becomes, a cross-fade whose travel lands while transparent or at once. |
42
45
  | `__tests__/animator.interaction.browser.spec.ts` | Browser proofs on the interaction harness (Chromium and WebKit): busy main thread, end state through a block, no Layout / Paint, seeked curves, a dialog's backdrop. |
@@ -64,7 +67,7 @@ the timings that decide who gets a touch are not roles.
64
67
  ## Animator
65
68
 
66
69
  ```
67
- import {createAnimator} from '../motion/animator';
70
+ import {createMotionAnimator} from '../motion/animator';
68
71
  import {coast} from '../motion/coast';
69
72
  import {solveSpringTowardRamp, toSpring} from '../motion/spring';
70
73
  import {resolveMotion} from '../motion/resolveMotion';
@@ -73,7 +76,7 @@ import {registerSpringsTable, springs} from '../motion/uikit';
73
76
  // Once, so the springs are registered as their roles:
74
77
  registerSpringsTable();
75
78
 
76
- const animator = createAnimator(sheet);
79
+ const animator = createMotionAnimator(sheet);
77
80
  // The animator plays a motion role (spec:AST-094 FR4), its table value, as the
78
81
  // per-role tables stay internal (DEC-15); math on a spring reads the role with
79
82
  // resolveMotion.
@@ -138,8 +141,10 @@ await handle.finished; // true if it ran to the end, false if interrupted
138
141
  presented call's second frame) runs on over two frames, the start moves to
139
142
  the call's first read after it, with every call of that task. Everything
140
143
  the call starts shares that start
141
- (`handle.started`); a retarget keeps an explicit one, and `{at}` puts
142
- several animators on one clock. `{start: 'commit'}` lets the browser date
144
+ (`handle.started`); a retarget of a curve that still moves keeps an
145
+ explicit one, while one on a tail that already shows as at rest (within two
146
+ sample tolerances of its target, and slower than one a frame) counts as a
147
+ call from rest. `{at}` puts several animators on one clock. `{start: 'commit'}` lets the browser date
143
148
  a retarget too; `{start: 'presented'}` waits two frames, until the
144
149
  element at rest has been presented. `handle.curve(property)` is the curve
145
150
  a call plays, for a companion to follow. `{additive: true}` retargets the
@@ -168,7 +173,7 @@ await handle.finished; // true if it ran to the end, false if interrupted
168
173
  - `animatorFor(element)` returns the one animator for an element, so code
169
174
  that animates it from several places (a swipe on x, a removal on y)
170
175
  composes in one `translate` track.
171
- - `createAnimator(dialog, {pseudoElement: '::backdrop'})` drives a
176
+ - `createMotionAnimator(dialog, {pseudoElement: '::backdrop'})` drives a
172
177
  pseudo-element; with no inline style to hold it, a static filling animation
173
178
  holds its end value until the next animation replaces it, while the
174
179
  pseudo-element exists. A dialog's `::backdrop` is made again each time the
@@ -89,8 +89,10 @@ import {
89
89
  wrapText,
90
90
  } from './transientCopy';
91
91
  import {isSpring} from './roleValue';
92
- import {solveSpring, toSpring, type SpringDescription} from './spring';
92
+ import {progressCurve} from './progress';
93
+ import type {SpringDescription} from './spring';
93
94
  import {registerSpringsTable, SETTLE_SPRING} from './uikit/springs';
95
+ import {themeReducesMotion} from '../privateAttributes/reducedMotion.stylex';
94
96
  import {reducedMotionCrossFade} from './uikit/timing';
95
97
 
96
98
  /** The shared motion role (`spec:AST-105` FR4). */
@@ -142,17 +144,20 @@ function settleSpring(): SpringDescription {
142
144
  }
143
145
 
144
146
  function springProgress(description: SpringDescription): SpringProgress {
145
- const curve = solveSpring(toSpring(description), {from: 1, to: 0});
146
- const durationMs = Math.max(1, curve.settleTime(0.001) * 1000);
147
+ const curve = progressCurve(description, {epsilon: 0.001});
148
+ const durationMs = Math.max(1, curve.duration * 1000);
147
149
  return {
148
150
  durationMs,
149
- remaining: t => (t >= durationMs ? 0 : curve.value(t / 1000)),
151
+ remaining: t => (t >= durationMs ? 0 : 1 - curve.at(t / 1000)),
150
152
  };
151
153
  }
152
154
 
153
155
  /** The motion a change in `area` plays now. */
154
156
  function layoutMotion(area: Element): LayoutMotion {
155
- if (matches(area, '(prefers-reduced-motion: reduce)')) {
157
+ if (
158
+ matches(area, '(prefers-reduced-motion: reduce)') ||
159
+ themeReducesMotion(area)
160
+ ) {
156
161
  if (!matches(area, '(pointer: coarse)')) {
157
162
  return {kind: 'instant'};
158
163
  }