@astryxdesign/core 0.7.7 → 0.7.8-canary.30b1896

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 (540) 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/TouchDateField.d.ts.map +1 -1
  50. package/dist/DateInput/TouchDateField.js +1 -0
  51. package/dist/DateInput/Wheel.d.ts.map +1 -1
  52. package/dist/DateInput/Wheel.js +4 -0
  53. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  54. package/dist/DateInput/useOwnScrollGesture.js +3 -0
  55. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  56. package/dist/DateInput/usePointerDragScroll.js +2 -0
  57. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  58. package/dist/DateInput/useScrollSettle.js +3 -0
  59. package/dist/Dialog/Dialog.d.ts.map +1 -1
  60. package/dist/Dialog/Dialog.js +9 -32
  61. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  62. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  63. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  64. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  65. package/dist/Field/Field.js +2 -2
  66. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  67. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  68. package/dist/FormLayout/FormLayout.d.ts +5 -1
  69. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  70. package/dist/HoverCard/HoverCard.d.ts +6 -4
  71. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  72. package/dist/HoverCard/HoverCard.js +48 -3
  73. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  74. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  75. package/dist/HoverCard/useHoverCard.js +20 -33
  76. package/dist/Icon/Icon.d.ts +5 -1
  77. package/dist/Icon/Icon.d.ts.map +1 -1
  78. package/dist/Icon/Icon.js +5 -2
  79. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  80. package/dist/Item/useSwipeAction.js +3 -0
  81. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  82. package/dist/Layer/modalOutlet.js +2 -0
  83. package/dist/Layer/outsidePress.d.ts.map +1 -1
  84. package/dist/Layer/outsidePress.js +1 -0
  85. package/dist/Layer/useLayer.d.ts.map +1 -1
  86. package/dist/Layer/useLayer.js +3 -0
  87. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  88. package/dist/Layer/useLayerDismissal.js +3 -0
  89. package/dist/Layer/usePressPin.d.ts +17 -5
  90. package/dist/Layer/usePressPin.d.ts.map +1 -1
  91. package/dist/Layer/usePressPin.js +62 -12
  92. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  93. package/dist/Layer/useTouchTrigger.js +3 -0
  94. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  95. package/dist/Lightbox/Lightbox.js +19 -0
  96. package/dist/MobileNav/MobileNav.d.ts +3 -2
  97. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  98. package/dist/MobileNav/MobileNav.js +9 -25
  99. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  100. package/dist/Outline/useOutlineFromDOM.js +3 -0
  101. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  102. package/dist/Outline/useScrollSpy.js +3 -0
  103. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  104. package/dist/OverflowList/OverflowList.js +3 -0
  105. package/dist/Popover/Popover.d.ts.map +1 -1
  106. package/dist/Popover/Popover.js +6 -0
  107. package/dist/PowerSearch/PowerSearch.d.ts +43 -4
  108. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  109. package/dist/PowerSearch/PowerSearch.js +445 -134
  110. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  111. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  112. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  113. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  114. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  115. package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
  116. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  117. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  118. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  119. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  120. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  121. package/dist/PowerSearch/PowerSearchToken.js +7 -2
  122. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  123. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  124. package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
  125. package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
  126. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  127. package/dist/PowerSearch/formatFilterValue.js +33 -12
  128. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  129. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  130. package/dist/PowerSearch/formatTokenValue.js +162 -0
  131. package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
  132. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  133. package/dist/PowerSearch/powerSearchDateZone.js +37 -0
  134. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  135. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  136. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  137. package/dist/PowerSearch/types.d.ts +2 -0
  138. package/dist/PowerSearch/types.d.ts.map +1 -1
  139. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  140. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  141. package/dist/RadioList/RadioList.d.ts.map +1 -1
  142. package/dist/RadioList/RadioList.js +3 -2
  143. package/dist/RadioList/RadioListItem.d.ts +1 -1
  144. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  145. package/dist/RadioList/RadioListItem.js +5 -3
  146. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  147. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  148. package/dist/Resizable/ResizeHandle.js +101 -77
  149. package/dist/Resizable/createResizable.d.ts +145 -0
  150. package/dist/Resizable/createResizable.d.ts.map +1 -0
  151. package/dist/Resizable/createResizable.js +575 -0
  152. package/dist/Resizable/useResizable.d.ts +3 -3
  153. package/dist/Resizable/useResizable.d.ts.map +1 -1
  154. package/dist/Resizable/useResizable.js +252 -459
  155. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  156. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  157. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  158. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  159. package/dist/SelectableCard/SelectableCard.js +36 -11
  160. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  161. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  162. package/dist/SelectableCard/selectableCardInput.js +20 -0
  163. package/dist/Selector/Selector.d.ts.map +1 -1
  164. package/dist/Selector/Selector.js +5 -8
  165. package/dist/Slider/sliderTouchController.js +2 -2
  166. package/dist/Spinner/Spinner.d.ts +1 -1
  167. package/dist/Spinner/Spinner.d.ts.map +1 -1
  168. package/dist/Spinner/Spinner.js +60 -58
  169. package/dist/Switch/Switch.d.ts.map +1 -1
  170. package/dist/Switch/Switch.js +4 -10
  171. package/dist/Switch/useSwitchTouch.js +4 -4
  172. package/dist/Table/BaseTable.d.ts.map +1 -1
  173. package/dist/Table/BaseTable.js +29 -8
  174. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  175. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  176. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  177. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  178. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  179. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  180. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  181. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  182. package/dist/TextInput/TextInput.d.ts +2 -2
  183. package/dist/TextInput/TextInput.d.ts.map +1 -1
  184. package/dist/TextInput/TextInput.js +10 -7
  185. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  186. package/dist/TimeInput/TimeInput.js +2 -0
  187. package/dist/Timer/Timer.d.ts.map +1 -1
  188. package/dist/Timer/Timer.js +2 -0
  189. package/dist/Timestamp/Timestamp.js +1 -1
  190. package/dist/Toast/Toast.d.ts +11 -1
  191. package/dist/Toast/Toast.d.ts.map +1 -1
  192. package/dist/Toast/Toast.js +25 -15
  193. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  194. package/dist/Toast/ToastViewport.js +97 -34
  195. package/dist/Toast/types.d.ts +9 -3
  196. package/dist/Toast/types.d.ts.map +1 -1
  197. package/dist/Toast/useToast.d.ts.map +1 -1
  198. package/dist/Toast/useToast.js +1 -0
  199. package/dist/Tokenizer/Tokenizer.d.ts +49 -37
  200. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  201. package/dist/Tokenizer/Tokenizer.js +22 -19
  202. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  203. package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
  204. package/dist/Tokenizer/index.d.ts +1 -1
  205. package/dist/Tokenizer/index.d.ts.map +1 -1
  206. package/dist/Tooltip/useTooltip.d.ts +19 -1
  207. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  208. package/dist/Tooltip/useTooltip.js +34 -53
  209. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  210. package/dist/Typeahead/BaseTypeahead.js +27 -18
  211. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  212. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  213. package/dist/animator/createAnimator.d.ts +98 -0
  214. package/dist/animator/createAnimator.d.ts.map +1 -0
  215. package/dist/animator/createAnimator.js +259 -0
  216. package/dist/astryx.css +36 -6
  217. package/dist/gestures/PressTracker.d.ts.map +1 -1
  218. package/dist/gestures/PressTracker.js +4 -3
  219. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  220. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  221. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  222. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  223. package/dist/hooks/actionGroupTracker.js +13 -3
  224. package/dist/hooks/index.d.ts +1 -0
  225. package/dist/hooks/index.d.ts.map +1 -1
  226. package/dist/hooks/index.js +1 -0
  227. package/dist/hooks/longPressDetector.d.ts +66 -0
  228. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  229. package/dist/hooks/longPressDetector.js +200 -0
  230. package/dist/hooks/pressGroupContext.d.ts +6 -0
  231. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  232. package/dist/hooks/pressGroupContext.js +20 -0
  233. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  234. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  235. package/dist/hooks/rootScrollStyles.js +207 -0
  236. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  237. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  238. package/dist/hooks/scrollLockTouchGuard.js +134 -0
  239. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  240. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  241. package/dist/hooks/scrollbarGutter.js +36 -23
  242. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  243. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  244. package/dist/hooks/useActionGroupTracking.js +174 -0
  245. package/dist/hooks/useAnimator.d.ts +41 -0
  246. package/dist/hooks/useAnimator.d.ts.map +1 -0
  247. package/dist/hooks/useAnimator.js +70 -0
  248. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  249. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  250. package/dist/hooks/useAttachment.d.ts +1 -1
  251. package/dist/hooks/useAttachment.js +1 -1
  252. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  253. package/dist/hooks/useAutoMediaMode.js +1 -0
  254. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  255. package/dist/hooks/useBusyAnnouncement.js +2 -0
  256. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  257. package/dist/hooks/useDevWarning.js +2 -0
  258. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  259. package/dist/hooks/useFocusTrap.js +2 -0
  260. package/dist/hooks/useGridFocus.d.ts +8 -5
  261. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  262. package/dist/hooks/useGridFocus.js +4 -3
  263. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  264. package/dist/hooks/useHotkeys.js +3 -0
  265. package/dist/hooks/useImageMode.d.ts.map +1 -1
  266. package/dist/hooks/useImageMode.js +3 -0
  267. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  268. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  269. package/dist/hooks/useInputStatusIcon.js +2 -2
  270. package/dist/hooks/useKeyboardHint.js +1 -1
  271. package/dist/hooks/useLongPress.d.ts +8 -9
  272. package/dist/hooks/useLongPress.d.ts.map +1 -1
  273. package/dist/hooks/useLongPress.js +23 -106
  274. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  275. package/dist/hooks/useMenuHover.js +2 -0
  276. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  277. package/dist/hooks/useMenuPress.js +3 -0
  278. package/dist/hooks/useOverflow.d.ts.map +1 -1
  279. package/dist/hooks/useOverflow.js +2 -1
  280. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  281. package/dist/hooks/usePressFeedback.js +1 -0
  282. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  283. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  284. package/dist/hooks/useResolvedRequired.js +3 -0
  285. package/dist/hooks/useScrollLock.d.ts +7 -9
  286. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  287. package/dist/hooks/useScrollLock.js +55 -48
  288. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  289. package/dist/hooks/useScrollableArea.js +5 -0
  290. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  291. package/dist/hooks/useStreamingText.js +3 -0
  292. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  293. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  294. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  295. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  296. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  297. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  298. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  299. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  300. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  301. package/dist/i18n/generated-locales/en.generated.js +30 -0
  302. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  304. package/dist/index.d.ts +1 -0
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +4 -0
  307. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  308. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  309. package/dist/internal/indicatorPress.stylex.js +26 -0
  310. package/dist/internal/selectable-card.d.ts +21 -0
  311. package/dist/internal/selectable-card.d.ts.map +1 -0
  312. package/dist/internal/selectable-card.js +20 -0
  313. package/dist/internal/sheetDraft.d.ts +2 -2
  314. package/dist/internal/sheetDraft.js +2 -2
  315. package/dist/motion/animatedLayout.d.ts.map +1 -1
  316. package/dist/motion/animatedLayout.js +7 -7
  317. package/dist/motion/animator.d.ts +14 -14
  318. package/dist/motion/animator.d.ts.map +1 -1
  319. package/dist/motion/animator.js +45 -20
  320. package/dist/motion/progress.d.ts +88 -0
  321. package/dist/motion/progress.d.ts.map +1 -0
  322. package/dist/motion/progress.js +128 -0
  323. package/dist/motion/reducedMotion.d.ts.map +1 -1
  324. package/dist/motion/reducedMotion.js +3 -1
  325. package/dist/motion/uikit/alert.d.ts +41 -0
  326. package/dist/motion/uikit/alert.d.ts.map +1 -0
  327. package/dist/motion/uikit/alert.js +43 -0
  328. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  329. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  330. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  331. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  332. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  333. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  334. package/dist/theme/Theme.d.ts.map +1 -1
  335. package/dist/theme/Theme.js +29 -4
  336. package/dist/theme/motionKnobs.d.ts +4 -3
  337. package/dist/theme/motionKnobs.d.ts.map +1 -1
  338. package/dist/theme/motionKnobs.js +3 -2
  339. package/dist/theme/themeMotion.d.ts +6 -0
  340. package/dist/theme/themeMotion.d.ts.map +1 -1
  341. package/dist/theme/themeMotion.js +7 -0
  342. package/dist/utils/dateParser.d.ts.map +1 -1
  343. package/dist/utils/dateParser.js +12 -0
  344. package/dist/utils/focusReturn.d.ts +15 -0
  345. package/dist/utils/focusReturn.d.ts.map +1 -1
  346. package/dist/utils/focusReturn.js +28 -0
  347. package/dist/utils/interactionModality.d.ts.map +1 -1
  348. package/dist/utils/interactionModality.js +4 -0
  349. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  350. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  351. package/dist/utils/interactionOverlay.stylex.js +3 -2
  352. package/dist/utils/plainDate.d.ts +8 -0
  353. package/dist/utils/plainDate.d.ts.map +1 -1
  354. package/dist/utils/plainDate.js +19 -0
  355. package/dist/utils/pressFeedback.d.ts.map +1 -1
  356. package/dist/utils/pressFeedback.js +20 -6
  357. package/dist/utils/triggerFocus.d.ts +36 -0
  358. package/dist/utils/triggerFocus.d.ts.map +1 -0
  359. package/dist/utils/triggerFocus.js +65 -0
  360. package/locales/en.json +120 -0
  361. package/locales/pseudo.json +90 -0
  362. package/package.json +14 -9
  363. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  364. package/src/AlertDialog/AlertDialog.tsx +46 -5
  365. package/src/AppShell/AppShell.tsx +4 -0
  366. package/src/BottomSheet/BottomSheet.tsx +1 -0
  367. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  368. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  369. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  370. package/src/BottomSheet/useSheetGestures.ts +10 -1
  371. package/src/Button/Button.tsx +26 -4
  372. package/src/Calendar/Calendar.tsx +36 -25
  373. package/src/Carousel/Carousel.tsx +1 -0
  374. package/src/Chat/ChatComposerInput.tsx +2 -0
  375. package/src/Chat/ChatMessageList.tsx +2 -1
  376. package/src/Chat/useChatDictation.ts +1 -0
  377. package/src/Chat/useChatNewMessages.ts +1 -1
  378. package/src/Chat/useChatStreamScroll.ts +2 -0
  379. package/src/Chat/useSpeechRecognition.ts +2 -0
  380. package/src/Chat/useTriggerMenu.tsx +1 -1
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  382. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  383. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  384. package/src/CodeBlock/CodeBlock.tsx +41 -4
  385. package/src/CommandPalette/CommandPalette.tsx +1 -0
  386. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  387. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  388. package/src/ContextMenu/ContextMenu.tsx +2 -2
  389. package/src/DateInput/MonthScroller.tsx +8 -2
  390. package/src/DateInput/TouchDateField.tsx +1 -0
  391. package/src/DateInput/Wheel.tsx +4 -0
  392. package/src/DateInput/useOwnScrollGesture.ts +2 -0
  393. package/src/DateInput/usePointerDragScroll.ts +1 -0
  394. package/src/DateInput/useScrollSettle.ts +2 -0
  395. package/src/Dialog/Dialog.tsx +12 -32
  396. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  397. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  398. package/src/Field/Field.tsx +2 -2
  399. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  400. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  401. package/src/FormLayout/FormLayout.tsx +5 -1
  402. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  403. package/src/HoverCard/HoverCard.tsx +58 -6
  404. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  405. package/src/HoverCard/useHoverCard.tsx +49 -54
  406. package/src/Icon/Icon.doc.mjs +49 -8
  407. package/src/Icon/Icon.tsx +15 -7
  408. package/src/IconButton/IconButton.doc.mjs +141 -21
  409. package/src/Item/useSwipeAction.ts +2 -0
  410. package/src/Layer/modalOutlet.ts +2 -0
  411. package/src/Layer/outsidePress.ts +1 -0
  412. package/src/Layer/useLayer.tsx +2 -0
  413. package/src/Layer/useLayerDismissal.ts +2 -0
  414. package/src/Layer/usePressPin.ts +81 -15
  415. package/src/Layer/useTouchTrigger.ts +2 -0
  416. package/src/Lightbox/Lightbox.tsx +19 -0
  417. package/src/MobileNav/MobileNav.tsx +9 -30
  418. package/src/Outline/useOutlineFromDOM.ts +2 -0
  419. package/src/Outline/useScrollSpy.ts +2 -0
  420. package/src/OverflowList/OverflowList.tsx +2 -0
  421. package/src/Popover/Popover.tsx +4 -0
  422. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  423. package/src/PowerSearch/PowerSearch.tsx +627 -157
  424. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  425. package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
  426. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  427. package/src/PowerSearch/PowerSearchToken.tsx +7 -0
  428. package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
  429. package/src/PowerSearch/formatFilterValue.ts +55 -17
  430. package/src/PowerSearch/formatTokenValue.ts +222 -0
  431. package/src/PowerSearch/powerSearchDateZone.ts +64 -0
  432. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  433. package/src/PowerSearch/types.ts +2 -0
  434. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  435. package/src/RadioList/RadioList.tsx +3 -2
  436. package/src/RadioList/RadioListItem.tsx +5 -3
  437. package/src/Resizable/Resizable.doc.mjs +5 -4
  438. package/src/Resizable/ResizeHandle.tsx +169 -109
  439. package/src/Resizable/createResizable.ts +831 -0
  440. package/src/Resizable/useResizable.ts +292 -623
  441. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  442. package/src/SelectableCard/SelectableCard.tsx +39 -10
  443. package/src/SelectableCard/selectableCardInput.ts +30 -0
  444. package/src/Selector/Selector.tsx +5 -12
  445. package/src/Slider/sliderTouchController.ts +2 -2
  446. package/src/Spinner/Spinner.tsx +77 -63
  447. package/src/Switch/Switch.tsx +2 -6
  448. package/src/Switch/useSwitchTouch.ts +4 -4
  449. package/src/Table/BaseTable.tsx +46 -12
  450. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  451. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  452. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  453. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  454. package/src/TextInput/TextInput.tsx +11 -10
  455. package/src/TimeInput/TimeInput.tsx +2 -0
  456. package/src/Timer/Timer.tsx +1 -0
  457. package/src/Timestamp/Timestamp.tsx +1 -1
  458. package/src/Toast/Toast.doc.mjs +4 -3
  459. package/src/Toast/Toast.tsx +52 -32
  460. package/src/Toast/ToastViewport.tsx +123 -35
  461. package/src/Toast/types.ts +9 -3
  462. package/src/Toast/useToast.tsx +1 -0
  463. package/src/Tokenizer/Tokenizer.doc.mjs +19 -3
  464. package/src/Tokenizer/Tokenizer.tsx +73 -51
  465. package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
  466. package/src/Tokenizer/index.ts +1 -0
  467. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  468. package/src/Tooltip/useTooltip.tsx +61 -56
  469. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  470. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  471. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  472. package/src/animator/createAnimator.doc.mjs +153 -0
  473. package/src/animator/createAnimator.ts +324 -0
  474. package/src/gestures/PressTracker.ts +4 -3
  475. package/src/gestures/README.md +10 -4
  476. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  477. package/src/hooks/actionGroupTracker.ts +20 -5
  478. package/src/hooks/index.ts +2 -0
  479. package/src/hooks/longPressDetector.ts +273 -0
  480. package/src/hooks/pressGroupContext.ts +21 -0
  481. package/src/hooks/rootScrollStyles.ts +247 -0
  482. package/src/hooks/scrollLockTouchGuard.ts +182 -0
  483. package/src/hooks/scrollbarGutter.ts +41 -26
  484. package/src/hooks/useActionGroupTracking.ts +224 -0
  485. package/src/hooks/useAnimator.doc.mjs +109 -0
  486. package/src/hooks/useAnimator.ts +67 -0
  487. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  488. package/src/hooks/useAttachment.ts +1 -1
  489. package/src/hooks/useAutoMediaMode.ts +1 -0
  490. package/src/hooks/useBusyAnnouncement.ts +2 -0
  491. package/src/hooks/useDevWarning.ts +2 -0
  492. package/src/hooks/useFocusTrap.ts +2 -0
  493. package/src/hooks/useGridFocus.doc.mjs +6 -6
  494. package/src/hooks/useGridFocus.ts +10 -7
  495. package/src/hooks/useHotkeys.ts +2 -0
  496. package/src/hooks/useImageMode.ts +2 -0
  497. package/src/hooks/useInputStatusIcon.tsx +3 -2
  498. package/src/hooks/useKeyboardHint.tsx +1 -1
  499. package/src/hooks/useLongPress.doc.mjs +2 -2
  500. package/src/hooks/useLongPress.ts +32 -122
  501. package/src/hooks/useMenuHover.ts +1 -0
  502. package/src/hooks/useMenuPress.ts +2 -0
  503. package/src/hooks/useOverflow.ts +2 -1
  504. package/src/hooks/usePressFeedback.ts +1 -0
  505. package/src/hooks/useResolvedRequired.ts +3 -0
  506. package/src/hooks/useScrollLock.doc.mjs +51 -12
  507. package/src/hooks/useScrollLock.ts +57 -60
  508. package/src/hooks/useScrollableArea.ts +4 -0
  509. package/src/hooks/useStreamingText.ts +2 -0
  510. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  511. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  512. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  513. package/src/i18n/generated-locales/en.generated.ts +41 -0
  514. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  515. package/src/index.ts +13 -0
  516. package/src/internal/indicatorPress.stylex.ts +24 -0
  517. package/src/internal/selectable-card.ts +21 -0
  518. package/src/internal/sheetDraft.ts +2 -2
  519. package/src/motion/README.md +9 -5
  520. package/src/motion/animatedLayout.ts +10 -5
  521. package/src/motion/animator.ts +66 -31
  522. package/src/motion/progress.ts +155 -0
  523. package/src/motion/reducedMotion.ts +3 -1
  524. package/src/motion/uikit/alert.ts +43 -0
  525. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  526. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  527. package/src/theme/Theme.tsx +37 -3
  528. package/src/theme/motionKnobs.ts +4 -3
  529. package/src/theme/themeMotion.ts +7 -0
  530. package/src/utils/dateParser.ts +16 -0
  531. package/src/utils/focusReturn.ts +30 -0
  532. package/src/utils/interactionModality.ts +4 -0
  533. package/src/utils/interactionOverlay.stylex.ts +3 -2
  534. package/src/utils/plainDate.ts +21 -0
  535. package/src/utils/pressFeedback.ts +24 -6
  536. package/src/utils/triggerFocus.ts +80 -0
  537. package/dist/internal/touch-sheet.d.ts +0 -21
  538. package/dist/internal/touch-sheet.d.ts.map +0 -1
  539. package/dist/internal/touch-sheet.js +0 -19
  540. package/src/internal/touch-sheet.ts +0 -21
@@ -4,11 +4,12 @@
4
4
  * @file animator.ts
5
5
  * @input An element, target values, and a spring, momentum curves (coast.ts)
6
6
  * or any closed-form curve
7
- * @output Exports `createAnimator`: a compositor animator for translate,
8
- * rotate, scale and opacity, with presentation values and velocities read
9
- * from the analytic curves, velocity-preserving retargeting, freeze-in-place
10
- * `stop`, completion promises, a shared clock, and UIKit's Reduced Motion
11
- * substitution; plus its option, handle and transition types
7
+ * @output Exports `createMotionAnimator`, a compositor animator for
8
+ * translate, rotate, scale and opacity, and its option, handle and
9
+ * transition types. It reads presentation values and velocities from the
10
+ * analytic curves. It retargets with the velocity kept, freezes in place on
11
+ * `stop`, and gives completion promises, a shared clock, and UIKit's
12
+ * Reduced Motion substitution.
12
13
  * @position Motion foundation (DOM). Internal to core: components use it for
13
14
  * every touch-presentation animation; not exported from the package entry
14
15
  *
@@ -188,6 +189,7 @@ import {
188
189
  registerReducedMotionCrossFade,
189
190
  } from './uikit/timing';
190
191
  import {planReducedMotion, type ReducedMotionView} from './reducedMotionPlan';
192
+ import {themeReducesMotion} from '../privateAttributes/reducedMotion.stylex';
191
193
 
192
194
  /**
193
195
  * A value the animator can drive.
@@ -244,18 +246,18 @@ export interface AnimateOptions {
244
246
  crossfadeAs?: 'entrance' | 'exit';
245
247
  /**
246
248
  * When the call's animations start. By default a call from rest starts
247
- * when the browser commits it, and a call that continues motion on screen
248
- * (a retarget) starts now, from the value on screen. Ignored with `at`.
249
+ * when the browser commits it. A call that continues motion on screen (a
250
+ * retarget) starts now, from the value on screen. A curve whose tail
251
+ * already shows as at rest counts as rest. Ignored with `at`.
249
252
  * - `'commit'`: a call that continues motion also starts when the browser
250
- * commits it, dated by the browser rather than by the main thread, as a
251
- * call from rest is.
252
- * - `'presented'`: a call from rest leaves its element at rest and creates
253
- * its animations two frames later, once the frame that carries the
254
- * element at rest has been presented; they then start at their commit. A
255
- * busy UI process delays the motion instead of skipping into it, for two
256
- * frames more before an idle start. Any other change to the animator
257
- * before then creates the animations first, in call order. A call that
258
- * continues motion on screen (a retarget) starts now, as by default.
253
+ * commits it. The browser dates it, as it dates a call from rest.
254
+ * - `'presented'`: a call from rest leaves its element at rest. Its
255
+ * animations are created two frames later, once the frame with the
256
+ * element at rest has been presented. They then start at their commit,
257
+ * so a busy UI process delays the motion instead of skipping into it.
258
+ * Any other change to the animator before then creates the animations
259
+ * first, in call order. A call that continues motion on screen starts
260
+ * now, as by default.
259
261
  */
260
262
  start?: 'commit' | 'presented';
261
263
  /**
@@ -297,7 +299,7 @@ export interface MotionCurve {
297
299
  }
298
300
 
299
301
  /**
300
- * Options of `createAnimator`.
302
+ * Options of `createMotionAnimator`.
301
303
  */
302
304
  /** How `set` puts values in place. */
303
305
  export interface SetOptions {
@@ -652,6 +654,18 @@ const SAMPLE_TOLERANCE: Record<MotionProperty, number> = {
652
654
  /** Keyframes start on this grid (ms) and are split where the curve needs it. */
653
655
  const SAMPLE_GRID_MS = 1000 / 30;
654
656
 
657
+ /**
658
+ * A curve within this many sample tolerances of its target can show as at
659
+ * rest. A call on it then starts as one from rest does, at the browser's start.
660
+ */
661
+ const REST_DISTANCE_TOLERANCES = 2;
662
+
663
+ /**
664
+ * A curve shows as at rest only while it moves at most one `SAMPLE_TOLERANCE`
665
+ * a frame at this rate.
666
+ */
667
+ const REST_FRAMES_PER_SECOND = 60;
668
+
655
669
  /** A curve that has not settled by then (an undamped spring) snaps. */
656
670
  const MAX_DURATION_MS = 30_000;
657
671
 
@@ -803,7 +817,7 @@ export function animatorFor(
803
817
  const key = options.pseudoElement ?? '';
804
818
  let animator = byPseudo.get(key);
805
819
  if (animator == null) {
806
- animator = createAnimator(element, options);
820
+ animator = createMotionAnimator(element, options);
807
821
  byPseudo.set(key, animator);
808
822
  }
809
823
  return animator;
@@ -920,7 +934,7 @@ const REDUCED_TRANSITION: SpringTransition = {
920
934
  *
921
935
  * @example
922
936
  * ```
923
- * const animator = createAnimator(sheet);
937
+ * const animator = createMotionAnimator(sheet);
924
938
  * // finger lifts at 1200 px/s heading for the detent at 0 (a component
925
939
  * // passes the spring of its motion role):
926
940
  * animator.animate({y: 0}, {spring: {response: 0.45, dampingRatio: 0.9}, velocity: {y: 1200}});
@@ -929,7 +943,7 @@ const REDUCED_TRANSITION: SpringTransition = {
929
943
  * animator.stop(['y']);
930
944
  * ```
931
945
  */
932
- export function createAnimator(
946
+ export function createMotionAnimator(
933
947
  element: HTMLElement | null,
934
948
  options: AnimatorOptions = {},
935
949
  ): Animator {
@@ -958,8 +972,10 @@ export function createAnimator(
958
972
  };
959
973
  const pseudoElement = options.pseudoElement;
960
974
  // Reduced Motion reads the person's settings and nothing else: no option
961
- // overrides them (design:reduced-motion DR4).
962
- const prefersReducedMotion = defaultPrefersReducedMotion;
975
+ // overrides them (design:reduced-motion DR4). A theme that reduces motion
976
+ // for everyone counts as the setting.
977
+ const prefersReducedMotion = () =>
978
+ defaultPrefersReducedMotion() || themeReducesMotion(target);
963
979
  const isCoarsePointer = defaultIsCoarsePointer;
964
980
  const resting: Record<MotionProperty, number> = {
965
981
  ...IDENTITY,
@@ -1165,6 +1181,22 @@ export function createAnimator(
1165
1181
  return curveAt(property, time);
1166
1182
  };
1167
1183
 
1184
+ /**
1185
+ * Whether a curve's tail already shows as at rest at `time`. Under a
1186
+ * starved main thread the browser commits a call late. A call that starts
1187
+ * at its own time then skips that far into its curve. One that starts at
1188
+ * the commit holds an element that hardly moves.
1189
+ */
1190
+ const showsAtRest = (
1191
+ property: MotionProperty,
1192
+ segment: Segment,
1193
+ time: number,
1194
+ ): boolean =>
1195
+ Math.abs(valueAt(property, time) - segment.target) <=
1196
+ REST_DISTANCE_TOLERANCES * SAMPLE_TOLERANCE[property] &&
1197
+ Math.abs(velocityAt(property, time)) <=
1198
+ SAMPLE_TOLERANCE[property] * REST_FRAMES_PER_SECOND;
1199
+
1168
1200
  const velocityAt = (property: MotionProperty, time: number): number => {
1169
1201
  const held = segments.get(property);
1170
1202
  if (held != null && isHeld(held)) {
@@ -2033,10 +2065,10 @@ export function createAnimator(
2033
2065
  // -- starting from rest ---------------------------------------------------
2034
2066
 
2035
2067
  /**
2036
- * A call starts from rest when nothing on the channels it drives is moving
2037
- * (a curve still waiting for its first frame counts as rest) and nothing
2038
- * pins its clock (`at`). Returns its start group, or null for an explicit
2039
- * start.
2068
+ * A call starts from rest when nothing on the channels it drives moves on
2069
+ * screen and nothing pins its clock (`at`). A curve still waiting for its
2070
+ * first frame counts as rest, as does one whose tail already shows as at
2071
+ * rest. Returns its start group, or null for an explicit start.
2040
2072
  */
2041
2073
  const beginGroup = (
2042
2074
  time: number,
@@ -2070,10 +2102,12 @@ export function createAnimator(
2070
2102
  }
2071
2103
  return null;
2072
2104
  }
2073
- // A call that continues motion starts now unless it asks for the
2074
- // browser's start (`commit`). `presented` asks only for a call from rest:
2075
- // an element still moving is not at rest, so a retarget starts now, from
2076
- // the value and velocity on screen (spec:AST-094 FR6).
2105
+ // A call that continues motion starts now, unless it asks for the
2106
+ // browser's start (`commit`). `presented` asks only for a call from rest.
2107
+ // A curve that still moves is not at rest, so a call on it starts now,
2108
+ // from the value and velocity on screen. A tail that shows as at rest
2109
+ // counts as rest, so a call on it waits, under `presented` for its two
2110
+ // frames.
2077
2111
  for (const channel of start === 'commit' ? [] : channels) {
2078
2112
  for (const property of CHANNELS[channel]) {
2079
2113
  const segment = segments.get(property);
@@ -2084,7 +2118,8 @@ export function createAnimator(
2084
2118
  time < endOf(property, segment) &&
2085
2119
  (segment.group == null ||
2086
2120
  segment.group.resolved ||
2087
- shownSince(property, segment) != null)
2121
+ shownSince(property, segment) != null) &&
2122
+ !showsAtRest(property, segment, time)
2088
2123
  ) {
2089
2124
  return null;
2090
2125
  }
@@ -0,0 +1,155 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file progress.ts
5
+ * @input A spring, a normalized progress, an animator's presented velocities
6
+ * @output Exports `progressCurve` (a spring's progress from 0 to 1 as a
7
+ * MotionCurve), `mapProgress` (one curve as a function of another),
8
+ * `mapRange` (the clamped linear map most companions use) and
9
+ * `presentedProgressVelocity` (the progress velocity that continues what
10
+ * an animator shows)
11
+ * @position Shared by the motion building blocks that move several channels
12
+ * along one path and by companion motion (a
13
+ * scrim's dim following a sheet): one velocity unit, one curve mapping and
14
+ * one way to continue an interrupted motion
15
+ *
16
+ * A path is described by a normalized progress: 0 where it starts, 1 where
17
+ * it rests, beyond either end on a spring's overshoot. Its velocity is in
18
+ * progress per second; each channel's own velocity stays in the channel's
19
+ * units per second.
20
+ *
21
+ * An interrupted motion continues from what is on screen: the
22
+ * block reads the presented values and velocities from the animator at one
23
+ * `now` (`get`, `getVelocity`), restarts a path from those values, and starts
24
+ * its progress with the presented velocity projected on the path's tangent
25
+ * at its start, v·t / (t·t), where t = d(values)/dp. Channels are weighted
26
+ * into one unit first (px per unit of scale, say), so a scale and a
27
+ * translation count alike.
28
+ *
29
+ * A companion follows a driving curve through `mapProgress`, most often
30
+ * with `mapRange`: `mapProgress(sheetY, mapRange([closedY, openY], [0, dim]))`
31
+ * dims a scrim as a sheet rises. Played on another animator, it stays in
32
+ * lockstep only when it starts with its driver: pass the driver's start,
33
+ * `scrim.play({opacity}, {at: start})` with `start = await handle.started`
34
+ * (or one shared `at` for both calls); two calls from rest otherwise each
35
+ * start at their own commit.
36
+ *
37
+ * SYNC: When modified, update /packages/core/src/motion/progress.test.ts and
38
+ * /packages/core/src/motion/README.md.
39
+ */
40
+
41
+ import type {Animator, MotionCurve, MotionProperty} from './animator';
42
+ import {
43
+ SETTLING_EPSILON,
44
+ solveSpring,
45
+ toSpring,
46
+ type SpringDescription,
47
+ } from './spring';
48
+
49
+ /** The step of the finite differences taken on a progress. */
50
+ const STEP = 1e-4;
51
+
52
+ /**
53
+ * The progress of `spring` from 0 to 1, starting with `velocity` (progress
54
+ * per second): exactly 1 once it settles within `epsilon`.
55
+ */
56
+ export function progressCurve(
57
+ spring: SpringDescription,
58
+ {
59
+ velocity = 0,
60
+ epsilon = SETTLING_EPSILON,
61
+ }: {velocity?: number; epsilon?: number} = {},
62
+ ): MotionCurve {
63
+ const curve = solveSpring(toSpring(spring), {from: 0, to: 1, velocity});
64
+ const duration = curve.settleTime(epsilon);
65
+ return {
66
+ duration,
67
+ at: t => (t >= duration ? 1 : curve.value(t)),
68
+ velocity: t => (t >= duration ? 0 : curve.velocity(t)),
69
+ };
70
+ }
71
+
72
+ /**
73
+ * The curve of `f(driver(t))`, its velocity by the chain rule: a channel
74
+ * following a path as its progress moves, or a companion following any
75
+ * driving curve (a sheet's `y` mapped onto its scrim's opacity). The driver
76
+ * is any MotionCurve, not only a progress from 0 to 1. A companion played on
77
+ * another animator starts with its driver (`{at: start}`; see the file
78
+ * header).
79
+ */
80
+ export function mapProgress(
81
+ driver: MotionCurve,
82
+ f: (value: number) => number,
83
+ ): MotionCurve {
84
+ return {
85
+ duration: driver.duration,
86
+ at: t => f(driver.at(t)),
87
+ velocity: t => {
88
+ const value = driver.at(t);
89
+ return (
90
+ ((f(value + STEP) - f(value - STEP)) / (2 * STEP)) * driver.velocity(t)
91
+ );
92
+ },
93
+ };
94
+ }
95
+
96
+ /**
97
+ * The linear map from `input` to `output`, held at `output`'s ends outside
98
+ * `input` unless `clamp` is false: what most companions are (a scrim's dim
99
+ * along a sheet's travel, a parallax, a dismissal's fade). Either range may
100
+ * run backward (`[openY, closedY]`).
101
+ */
102
+ export function mapRange(
103
+ input: readonly [number, number],
104
+ output: readonly [number, number],
105
+ {clamp = true}: {clamp?: boolean} = {},
106
+ ): (x: number) => number {
107
+ const [a, b] = input;
108
+ const [c, d] = output;
109
+ return x => {
110
+ let t = a === b ? (x < a ? 0 : 1) : (x - a) / (b - a);
111
+ if (clamp) {
112
+ t = Math.min(1, Math.max(0, t));
113
+ }
114
+ // Exact at both ends.
115
+ return t === 0 ? c : t === 1 ? d : c + (d - c) * t;
116
+ };
117
+ }
118
+
119
+ /**
120
+ * One channel of a path: an animator property and its value at each
121
+ * progress.
122
+ */
123
+ export interface ProgressChannel {
124
+ readonly property: MotionProperty;
125
+ /** The property's value at progress `p`. */
126
+ at(p: number): number;
127
+ /**
128
+ * What one unit of the property weighs in the projection, in a unit the
129
+ * channels share (px per unit of scale for a box `weight` px wide). 1 by
130
+ * default.
131
+ */
132
+ readonly weight?: number;
133
+ }
134
+
135
+ /**
136
+ * The progress velocity, per second, that continues what `animator`
137
+ * presents at `now` along a path that starts there: the presented velocity
138
+ * projected on the path's tangent at progress 0, v·t / (t·t). 0 when the
139
+ * path does not move any of its channels.
140
+ */
141
+ export function presentedProgressVelocity(
142
+ animator: Pick<Animator, 'getVelocity'>,
143
+ channels: ReadonlyArray<ProgressChannel>,
144
+ now?: number,
145
+ ): number {
146
+ let along = 0;
147
+ let squared = 0;
148
+ for (const channel of channels) {
149
+ const weight = channel.weight ?? 1;
150
+ const tangent = ((channel.at(STEP) - channel.at(0)) / STEP) * weight;
151
+ along += animator.getVelocity(channel.property, now) * weight * tangent;
152
+ squared += tangent * tangent;
153
+ }
154
+ return squared > 1e-12 ? along / squared : 0;
155
+ }
@@ -46,6 +46,7 @@
46
46
 
47
47
  import {defaultIsCoarsePointer, defaultPrefersReducedMotion} from './animator';
48
48
  import {resolveMotion} from './resolveMotion';
49
+ import {themeReducesMotion} from '../privateAttributes/reducedMotion.stylex';
49
50
  import {
50
51
  reducedMotionCrossFade,
51
52
  registerReducedMotionCrossFade,
@@ -83,7 +84,8 @@ export function reducedMotionFade(
83
84
  touchRelease?: boolean;
84
85
  } = {},
85
86
  ): ReducedMotionFade | null {
86
- if (!defaultPrefersReducedMotion()) {
87
+ // A theme that reduces motion for everyone counts as the setting.
88
+ if (!defaultPrefersReducedMotion() && !themeReducesMotion(element)) {
87
89
  return null;
88
90
  }
89
91
  const fades = options.touchRelease === true || defaultIsCoarsePointer();
@@ -0,0 +1,43 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file alert.ts
5
+ * @input Nothing; data only
6
+ * @output Exports `alertController`: how UIAlertController (`.alert`) tracks
7
+ * a finger across its actions
8
+ * @position The alert domain of the UIKit constants table (motion/uikit);
9
+ * its springs are `springs.alertPresent` and `springs.alertDismiss`
10
+ *
11
+ * Every value was read from UIKit on the iOS 26.2 simulator. A host app
12
+ * presented `UIAlertController(.alert)` with two and with three actions.
13
+ * Real HID touches drove it, and the action views' highlight was sampled
14
+ * every frame. Lengths are in pt (CSS px), durations in ms.
15
+ *
16
+ * Every leaf carries one or more `@source`; GUESS values also carry the
17
+ * `@measure` task that will confirm or replace them. uikit.test.ts enforces
18
+ * both.
19
+ *
20
+ * SYNC: When modified, update /packages/core/src/motion/MEASUREMENTS.md
21
+ */
22
+
23
+ export const alertController = {
24
+ actions: {
25
+ /**
26
+ * How long after touch-down the touched action highlights: none, it is
27
+ * highlighted in the touch-down frame (a tap and a 300 ms hold alike).
28
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
29
+ * iPhone 17 Pro, per-frame highlight of the action views under real HID
30
+ * touches, Oct 23 2026
31
+ */
32
+ highlightOnsetMs: 0,
33
+ /**
34
+ * How far outside an action the finger may go and keep it highlighted:
35
+ * none. The highlight cleared 1 pt below the action, and a lift there ran
36
+ * nothing. UIButton keeps 70 pt; an alert action does not.
37
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
38
+ * iPhone 17 Pro, per-frame highlight of the action views under real HID
39
+ * touches, Oct 23 2026
40
+ */
41
+ highlightExpansion: 0,
42
+ },
43
+ } as const;
@@ -0,0 +1,44 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /**
3
+ * @file privateAttributes/pressGroupItem.stylex.ts
4
+ * @input Nothing: the private press-group-item attribute
5
+ * @output pressGroupItemProps, which marks an action a group's tracker
6
+ * follows with the pointers it follows, and isTrackedByGroup, which reads
7
+ * the mark
8
+ * @position Owner module of the private press-group-item attribute: the only
9
+ * file that writes its name. AlertDialog marks its actions, and the press
10
+ * controller (utils/pressFeedback.ts) leaves a press of those pointers to
11
+ * the group's tracker. No package entry exports it.
12
+ */
13
+
14
+ const PRESS_GROUP_ITEM = 'data-astryx-press-group-item';
15
+
16
+ /**
17
+ * Spread on each action that a group's tracker follows. It names the pointer
18
+ * types the tracker follows, such as `['touch', 'pen']`.
19
+ */
20
+ export function pressGroupItemProps(
21
+ pointerTypes: ReadonlyArray<string>,
22
+ ): Readonly<Record<string, string>> {
23
+ return {[PRESS_GROUP_ITEM]: pointerTypes.join(' ')};
24
+ }
25
+
26
+ /**
27
+ * Whether a group's tracker paints the press on `element` or an ancestor: a
28
+ * press of `pointerType`, or any press when it is null.
29
+ */
30
+ export function isTrackedByGroup(
31
+ element: Element,
32
+ pointerType: string | null = null,
33
+ ): boolean {
34
+ const marked = element.closest(`[${PRESS_GROUP_ITEM}]`);
35
+ if (marked == null) {
36
+ return false;
37
+ }
38
+ return (
39
+ pointerType == null ||
40
+ (marked.getAttribute(PRESS_GROUP_ITEM) ?? '')
41
+ .split(' ')
42
+ .includes(pointerType)
43
+ );
44
+ }
@@ -0,0 +1,45 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /**
3
+ * @file privateAttributes/reducedMotion.stylex.ts
4
+ * @input Whether a theme reduces motion for everyone
5
+ * @output reducedMotionMarkProps and setRootReducedMotionMark, which write the
6
+ * mark, and themeReducesMotion, which reads it
7
+ * @position Owner module of the private reduced-motion attribute: the only
8
+ * file that writes its name. Theme marks its root, and the root theme marks
9
+ * `<html>`; the animator, reducedMotionFade and the layout glide read it as
10
+ * the person's Reduce Motion setting. No package entry exports it.
11
+ */
12
+
13
+ const REDUCED_MOTION = 'data-astryx-reduced-motion';
14
+
15
+ /** Spread on a theme's root when the theme reduces motion for everyone. */
16
+ export function reducedMotionMarkProps(
17
+ isMarked: boolean,
18
+ ): Readonly<Record<string, string>> {
19
+ return isMarked ? {[REDUCED_MOTION]: ''} : {};
20
+ }
21
+
22
+ /**
23
+ * Marks or unmarks `<html>` for the root theme, so a layer portaled outside
24
+ * the theme's root reads the mark too.
25
+ */
26
+ export function setRootReducedMotionMark(
27
+ root: HTMLElement,
28
+ isMarked: boolean,
29
+ ): void {
30
+ if (isMarked) {
31
+ root.setAttribute(REDUCED_MOTION, '');
32
+ } else {
33
+ root.removeAttribute(REDUCED_MOTION);
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Whether the theme `element` is in reduces motion for everyone: its root,
39
+ * or `<html>` for the root theme, carries the mark.
40
+ */
41
+ export function themeReducesMotion(
42
+ element: Element | null | undefined,
43
+ ): boolean {
44
+ return element?.closest?.(`[${REDUCED_MOTION}]`) != null;
45
+ }
@@ -45,6 +45,11 @@ import {registerTheme} from './themeRegistry';
45
45
  import {dataAttr} from '../naming';
46
46
  import {ThemeContext} from './useTheme';
47
47
  import {warnOnce} from '../utils/devWarning';
48
+ import {REDUCED_MOTION_PROPERTY, resolveMotionKnobs} from './themeMotion';
49
+ import {
50
+ reducedMotionMarkProps,
51
+ setRootReducedMotionMark,
52
+ } from '../privateAttributes/reducedMotion.stylex';
48
53
 
49
54
  /**
50
55
  * Theme provider props
@@ -76,6 +81,11 @@ const wrapperStyles = stylex.create({
76
81
  system: {
77
82
  colorScheme: 'light dark',
78
83
  },
84
+ // The mark's custom property (REDUCED_MOTION_PROPERTY), which every element
85
+ // under the mark inherits.
86
+ reducedMotion: {
87
+ '--_astryx-reduced-motion': '1',
88
+ },
79
89
  });
80
90
 
81
91
  // =============================================================================
@@ -110,6 +120,7 @@ const THEME_LAYER_ORDER = '@layer reset, astryx-base, astryx-theme;';
110
120
  function useThemeStyleInjection(theme: DefinedTheme): void {
111
121
  const id = useId();
112
122
 
123
+ // Syncs the document's stylesheets with the runtime theme CSS.
113
124
  useInsertionEffect(() => {
114
125
  // Built themes have their CSS in a separate file — skip injection
115
126
  if (theme.__built) {
@@ -197,12 +208,18 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
197
208
  *
198
209
  * - 'light' | 'dark' → sets data-theme="light" | "dark"
199
210
  * - 'system' → removes data-theme (reset.css defaults to color-scheme: light dark)
211
+ *
212
+ * A theme that reduces motion for everyone also marks `<html>` with
213
+ * `data-astryx-reduced-motion` and its custom property, so layers portaled
214
+ * outside the wrapper reduce their motion too.
200
215
  */
201
216
  function useRootThemeSync(
202
217
  isNested: boolean,
203
218
  mode: ThemeMode,
204
219
  themeName: string,
220
+ reducesMotion: boolean,
205
221
  ): void {
222
+ // Syncs the theme attributes on the root `<html>` element.
206
223
  useIsomorphicLayoutEffect(() => {
207
224
  if (isNested) {
208
225
  return;
@@ -220,12 +237,20 @@ function useRootThemeSync(
220
237
 
221
238
  // Sync theme name so @scope rules reach portals/fallback viewports.
222
239
  document.documentElement.setAttribute(dataAttr('theme'), themeName);
240
+ setRootReducedMotionMark(document.documentElement, reducesMotion);
241
+ if (reducesMotion) {
242
+ document.documentElement.style.setProperty(REDUCED_MOTION_PROPERTY, '1');
243
+ } else {
244
+ document.documentElement.style.removeProperty(REDUCED_MOTION_PROPERTY);
245
+ }
223
246
 
224
247
  return () => {
225
248
  document.documentElement.removeAttribute('data-theme');
226
249
  document.documentElement.removeAttribute(dataAttr('theme'));
250
+ setRootReducedMotionMark(document.documentElement, false);
251
+ document.documentElement.style.removeProperty(REDUCED_MOTION_PROPERTY);
227
252
  };
228
- }, [isNested, mode, themeName]);
253
+ }, [isNested, mode, themeName, reducesMotion]);
229
254
  }
230
255
 
231
256
  // =============================================================================
@@ -255,7 +280,11 @@ export function Theme({
255
280
  registerTheme(theme);
256
281
 
257
282
  useThemeStyleInjection(theme);
258
- useRootThemeSync(isNested, mode, theme.name);
283
+ // resolveMotionKnobs resolves no public theme to 'always', so no theme
284
+ // marks its root.
285
+ const reducesMotion =
286
+ resolveMotionKnobs(theme.__axes?.motion).reducedMotion === 'always';
287
+ useRootThemeSync(isNested, mode, theme.name, reducesMotion);
259
288
 
260
289
  // Get color-scheme style
261
290
  const colorSchemeStyle =
@@ -272,8 +301,13 @@ export function Theme({
272
301
  <ThemeContext value={ctxValue}>
273
302
  <ThemeNestingContext value={true}>
274
303
  <div
275
- {...stylex.props(wrapperStyles.base, colorSchemeStyle)}
304
+ {...stylex.props(
305
+ wrapperStyles.base,
306
+ colorSchemeStyle,
307
+ reducesMotion && wrapperStyles.reducedMotion,
308
+ )}
276
309
  data-astryx-theme={theme.name}
310
+ {...reducedMotionMarkProps(reducesMotion)}
277
311
  data-theme={mode === 'system' ? undefined : mode}>
278
312
  {children}
279
313
  </div>
@@ -20,10 +20,11 @@
20
20
  export type MotionCharacter = 'crisp' | 'standard' | 'expressive';
21
21
 
22
22
  /**
23
- * Whose Reduce Motion setting a theme follows: `'system'`, each person's own.
24
- * Internal: no theme sets it until `'always'` ships (`spec:AST-108` FR6).
23
+ * Whose Reduce Motion setting a theme follows: `'system'`, each person's own,
24
+ * or `'always'`, reduced for everyone. Internal: `resolveKnobs` resolves
25
+ * every theme to `'system'` until `'always'` ships (`spec:AST-108` FR6).
25
26
  */
26
- export type ThemeReducedMotion = 'system';
27
+ export type ThemeReducedMotion = 'system' | 'always';
27
28
 
28
29
  /** The motion knobs a theme sets (`spec:AST-108` FR1). */
29
30
  export interface ThemeMotionKnobs {
@@ -87,6 +87,13 @@ function msOf(value: string): number {
87
87
  */
88
88
  export const MOTION_TEMPO_PROPERTY = '--_astryx-motion-tempo';
89
89
 
90
+ /**
91
+ * The custom property a theme whose `reducedMotion` resolves to `'always'`
92
+ * sets to `1` on its root, and the root theme on `<html>`: styles that cannot
93
+ * key a selector on the mark read it in a value.
94
+ */
95
+ export const REDUCED_MOTION_PROPERTY = '--_astryx-reduced-motion';
96
+
90
97
  /** The duration tokens at `tempo`: today's values times it, to the ms. */
91
98
  export function durationTokensAt(tempo: number): Record<string, string> {
92
99
  const tokens: Record<string, string> = {};
@@ -32,6 +32,11 @@ export function isLocaleDayFirst(locale: Locale = 'en'): boolean {
32
32
  return dayIndex < monthIndex;
33
33
  }
34
34
 
35
+ // Built at run time: a Unicode property escape in a literal fails a source
36
+ // build whose Babel lacks the Unicode data.
37
+ const LETTER_FREE = new RegExp('^[^\\p{L}]+$', 'u');
38
+ const YEAR_FIRST = new RegExp('^\\d{4}[^\\p{L}\\d]', 'u');
39
+
35
40
  /**
36
41
  * Parses user input into a PlainDate.
37
42
  *
@@ -138,6 +143,17 @@ export function parseDateInput(
138
143
  if (/^\d+$/.test(trimmed)) {
139
144
  return null;
140
145
  }
146
+ // In a day-first locale, letter-free text that no form above matched is not
147
+ // a date. Native `Date` reads `a/b/c` month first. It also takes a year of
148
+ // one to three digits. So "12/01/2" gives a wrong date. A four-digit year
149
+ // written first is not ambiguous.
150
+ if (
151
+ isLocaleDayFirst(locale) &&
152
+ LETTER_FREE.test(trimmed) &&
153
+ !YEAR_FIRST.test(trimmed)
154
+ ) {
155
+ return null;
156
+ }
141
157
 
142
158
  const parsed = new Date(trimmed);
143
159
  if (!isNaN(parsed.getTime())) {