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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (682) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +4 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +46 -6
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +11 -3
  6. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheet.js +1 -0
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +25 -4
  10. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  12. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
  13. package/dist/BottomSheet/useMobileKeyboard.js +6 -0
  14. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  15. package/dist/BottomSheet/useSheetGestures.js +12 -1
  16. package/dist/Button/Button.d.ts.map +1 -1
  17. package/dist/Button/Button.js +17 -1
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +18 -22
  20. package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
  21. package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
  22. package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
  23. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  24. package/dist/Calendar/hooks/useCalendarDays.js +2 -10
  25. package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
  26. package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
  27. package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
  28. package/dist/Carousel/Carousel.d.ts.map +1 -1
  29. package/dist/Carousel/Carousel.js +2 -0
  30. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  31. package/dist/Chat/ChatComposerInput.js +6 -1
  32. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  33. package/dist/Chat/ChatMessageList.js +2 -1
  34. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  35. package/dist/Chat/useChatDictation.js +2 -0
  36. package/dist/Chat/useChatNewMessages.js +1 -1
  37. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  38. package/dist/Chat/useChatStreamScroll.js +2 -0
  39. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  40. package/dist/Chat/useSpeechRecognition.js +3 -0
  41. package/dist/Chat/useTriggerMenu.js +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  44. package/dist/CheckboxList/CheckboxList.d.ts +8 -1
  45. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  46. package/dist/CheckboxList/CheckboxList.js +2 -0
  47. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  48. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  49. package/dist/CodeBlock/CodeBlock.js +28 -11
  50. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPalette.js +2 -0
  52. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  53. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  54. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  55. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  56. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  57. package/dist/ContextMenu/ContextMenu.js +2 -2
  58. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  59. package/dist/DateInput/MonthScroller.js +5 -2
  60. package/dist/DateInput/PickerWheel.d.ts +19 -0
  61. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  62. package/dist/DateInput/PickerWheel.js +625 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +9 -30
  65. package/dist/DateInput/Wheel.d.ts +18 -37
  66. package/dist/DateInput/Wheel.d.ts.map +1 -1
  67. package/dist/DateInput/Wheel.js +84 -113
  68. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  69. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  70. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  71. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  72. package/dist/DateInput/usePointerDragScroll.js +2 -0
  73. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  74. package/dist/DateInput/useScrollSettle.js +3 -0
  75. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  76. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  77. package/dist/DateInput/useWheelListbox.js +88 -0
  78. package/dist/DateInput/wheelOptions.d.ts +74 -0
  79. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  80. package/dist/DateInput/wheelOptions.js +98 -0
  81. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  82. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  83. package/dist/DateInput/wheelPhysics.js +341 -0
  84. package/dist/DateInput/wheelStrip.d.ts +92 -0
  85. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  86. package/dist/DateInput/wheelStrip.js +258 -0
  87. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  88. package/dist/DateTimeInput/TouchDateTimeField.js +10 -10
  89. package/dist/Dialog/Dialog.d.ts.map +1 -1
  90. package/dist/Dialog/Dialog.js +9 -32
  91. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  92. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  93. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  94. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  95. package/dist/Field/Field.js +2 -2
  96. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  97. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  98. package/dist/FormLayout/FormLayout.d.ts +5 -1
  99. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  100. package/dist/HoverCard/HoverCard.d.ts +6 -4
  101. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  102. package/dist/HoverCard/HoverCard.js +48 -3
  103. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  104. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  105. package/dist/HoverCard/useHoverCard.js +20 -33
  106. package/dist/Icon/Icon.d.ts +5 -1
  107. package/dist/Icon/Icon.d.ts.map +1 -1
  108. package/dist/Icon/Icon.js +5 -2
  109. package/dist/InfoTip/InfoTip.d.ts +5 -5
  110. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  111. package/dist/InfoTip/InfoTip.js +58 -19
  112. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  113. package/dist/Item/useSwipeAction.js +3 -0
  114. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  115. package/dist/Layer/modalOutlet.js +2 -0
  116. package/dist/Layer/outsidePress.d.ts.map +1 -1
  117. package/dist/Layer/outsidePress.js +1 -0
  118. package/dist/Layer/useLayer.d.ts.map +1 -1
  119. package/dist/Layer/useLayer.js +4 -1
  120. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  121. package/dist/Layer/useLayerDismissal.js +3 -0
  122. package/dist/Layer/useTouchTrigger.d.ts +13 -7
  123. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  124. package/dist/Layer/useTouchTrigger.js +20 -6
  125. package/dist/Layout/index.d.ts +1 -1
  126. package/dist/Layout/index.d.ts.map +1 -1
  127. package/dist/Layout/index.js +1 -1
  128. package/dist/Layout/layoutReset.js +1 -1
  129. package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
  130. package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
  131. package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
  132. package/dist/Layout/padding.stylex.d.ts +5 -129
  133. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  134. package/dist/Layout/padding.stylex.js +9 -143
  135. package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
  136. package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
  137. package/dist/Layout/paddingStyles.stylex.js +99 -0
  138. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  139. package/dist/Lightbox/Lightbox.js +20 -1
  140. package/dist/MobileNav/MobileNav.d.ts +3 -2
  141. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  142. package/dist/MobileNav/MobileNav.js +10 -26
  143. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  144. package/dist/MultiSelector/MultiSelector.js +2 -1
  145. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  146. package/dist/NumberInput/NumberInput.js +2 -1
  147. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  148. package/dist/Outline/useOutlineFromDOM.js +3 -0
  149. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  150. package/dist/Outline/useScrollSpy.js +3 -0
  151. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  152. package/dist/OverflowList/OverflowList.js +3 -0
  153. package/dist/Popover/Popover.d.ts.map +1 -1
  154. package/dist/Popover/Popover.js +6 -0
  155. package/dist/Popover/usePopover.js +2 -2
  156. package/dist/PowerSearch/PowerSearch.d.ts +39 -4
  157. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  158. package/dist/PowerSearch/PowerSearch.js +441 -134
  159. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  160. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  161. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  162. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  163. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
  165. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  166. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  167. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  168. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  169. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearchToken.js +3 -2
  171. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  172. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
  174. package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
  175. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  176. package/dist/PowerSearch/formatFilterValue.js +31 -23
  177. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  178. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  179. package/dist/PowerSearch/formatTokenValue.js +161 -0
  180. package/dist/PowerSearch/index.d.ts +1 -1
  181. package/dist/PowerSearch/index.d.ts.map +1 -1
  182. package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
  183. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  184. package/dist/PowerSearch/powerSearchDateZone.js +57 -0
  185. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  186. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  187. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  188. package/dist/PowerSearch/types.d.ts +8 -1
  189. package/dist/PowerSearch/types.d.ts.map +1 -1
  190. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  191. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  192. package/dist/RadioList/RadioList.d.ts.map +1 -1
  193. package/dist/RadioList/RadioList.js +3 -2
  194. package/dist/RadioList/RadioListItem.d.ts +1 -1
  195. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  196. package/dist/RadioList/RadioListItem.js +5 -3
  197. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  198. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  199. package/dist/Resizable/ResizeHandle.js +101 -77
  200. package/dist/Resizable/createResizable.d.ts +145 -0
  201. package/dist/Resizable/createResizable.d.ts.map +1 -0
  202. package/dist/Resizable/createResizable.js +575 -0
  203. package/dist/Resizable/useResizable.d.ts +3 -3
  204. package/dist/Resizable/useResizable.d.ts.map +1 -1
  205. package/dist/Resizable/useResizable.js +252 -459
  206. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  207. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  208. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  209. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  210. package/dist/SelectableCard/SelectableCard.js +36 -11
  211. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  212. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  213. package/dist/SelectableCard/selectableCardInput.js +20 -0
  214. package/dist/Selector/Selector.d.ts.map +1 -1
  215. package/dist/Selector/Selector.js +7 -9
  216. package/dist/SideNav/SideNav.d.ts.map +1 -1
  217. package/dist/SideNav/SideNav.js +36 -5
  218. package/dist/Slider/Slider.d.ts.map +1 -1
  219. package/dist/Slider/Slider.js +16 -11
  220. package/dist/Slider/sliderTouchController.js +2 -2
  221. package/dist/Spinner/Spinner.d.ts +1 -1
  222. package/dist/Spinner/Spinner.d.ts.map +1 -1
  223. package/dist/Spinner/Spinner.js +60 -58
  224. package/dist/Stepper/Stepper.d.ts.map +1 -1
  225. package/dist/Stepper/Stepper.js +10 -15
  226. package/dist/Switch/Switch.d.ts.map +1 -1
  227. package/dist/Switch/Switch.js +4 -10
  228. package/dist/Switch/useSwitchTouch.js +4 -4
  229. package/dist/Table/BaseTable.d.ts.map +1 -1
  230. package/dist/Table/BaseTable.js +29 -8
  231. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  232. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  233. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  234. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  235. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  236. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  237. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  238. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  239. package/dist/TextArea/TextArea.d.ts.map +1 -1
  240. package/dist/TextArea/TextArea.js +2 -1
  241. package/dist/TextInput/TextInput.d.ts +2 -2
  242. package/dist/TextInput/TextInput.d.ts.map +1 -1
  243. package/dist/TextInput/TextInput.js +12 -8
  244. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  245. package/dist/TimeInput/TimeInput.js +2 -0
  246. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  247. package/dist/TimeInput/TouchTimeField.js +2 -0
  248. package/dist/Timer/Timer.d.ts.map +1 -1
  249. package/dist/Timer/Timer.js +2 -0
  250. package/dist/Timestamp/Timestamp.js +1 -1
  251. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  252. package/dist/Timestamp/formatInstant.js +1 -23
  253. package/dist/Toast/Toast.d.ts +11 -1
  254. package/dist/Toast/Toast.d.ts.map +1 -1
  255. package/dist/Toast/Toast.js +25 -15
  256. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  257. package/dist/Toast/ToastViewport.js +97 -34
  258. package/dist/Toast/types.d.ts +9 -3
  259. package/dist/Toast/types.d.ts.map +1 -1
  260. package/dist/Toast/useToast.d.ts.map +1 -1
  261. package/dist/Toast/useToast.js +1 -0
  262. package/dist/Tokenizer/Tokenizer.d.ts +44 -46
  263. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  264. package/dist/Tokenizer/Tokenizer.js +20 -21
  265. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  266. package/dist/Tokenizer/TokenizerBottomSheet.js +4 -6
  267. package/dist/Tokenizer/index.d.ts +1 -1
  268. package/dist/Tokenizer/index.d.ts.map +1 -1
  269. package/dist/Tooltip/Tooltip.d.ts +2 -23
  270. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  271. package/dist/Tooltip/Tooltip.js +5 -29
  272. package/dist/Tooltip/useTooltip.d.ts +23 -30
  273. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  274. package/dist/Tooltip/useTooltip.js +194 -108
  275. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  276. package/dist/Typeahead/BaseTypeahead.js +27 -18
  277. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  278. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  279. package/dist/animator/createAnimator.d.ts +98 -0
  280. package/dist/animator/createAnimator.d.ts.map +1 -0
  281. package/dist/animator/createAnimator.js +259 -0
  282. package/dist/astryx.css +41 -7
  283. package/dist/gestures/GestureHost.d.ts +16 -1
  284. package/dist/gestures/GestureHost.d.ts.map +1 -1
  285. package/dist/gestures/GestureHost.js +1 -1
  286. package/dist/gestures/PressTracker.d.ts.map +1 -1
  287. package/dist/gestures/PressTracker.js +4 -3
  288. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  289. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  290. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  291. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  292. package/dist/hooks/actionGroupTracker.js +13 -3
  293. package/dist/hooks/index.d.ts +1 -0
  294. package/dist/hooks/index.d.ts.map +1 -1
  295. package/dist/hooks/index.js +1 -0
  296. package/dist/hooks/longPressDetector.d.ts +66 -0
  297. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  298. package/dist/hooks/longPressDetector.js +200 -0
  299. package/dist/hooks/pressGroupContext.d.ts +6 -0
  300. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  301. package/dist/hooks/pressGroupContext.js +20 -0
  302. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  303. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  304. package/dist/hooks/rootScrollStyles.js +207 -0
  305. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  306. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  307. package/dist/hooks/scrollLockTouchGuard.js +117 -0
  308. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  309. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  310. package/dist/hooks/scrollbarGutter.js +36 -23
  311. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  312. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  313. package/dist/hooks/useActionGroupTracking.js +174 -0
  314. package/dist/hooks/useAnimator.d.ts +41 -0
  315. package/dist/hooks/useAnimator.d.ts.map +1 -0
  316. package/dist/hooks/useAnimator.js +70 -0
  317. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  318. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  319. package/dist/hooks/useAttachment.d.ts +1 -1
  320. package/dist/hooks/useAttachment.js +1 -1
  321. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  322. package/dist/hooks/useAutoMediaMode.js +1 -0
  323. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  324. package/dist/hooks/useBusyAnnouncement.js +2 -0
  325. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  326. package/dist/hooks/useDevWarning.js +2 -0
  327. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  328. package/dist/hooks/useFocusTrap.js +2 -0
  329. package/dist/hooks/useGridFocus.d.ts +8 -5
  330. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  331. package/dist/hooks/useGridFocus.js +4 -3
  332. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  333. package/dist/hooks/useHotkeys.js +3 -0
  334. package/dist/hooks/useImageMode.d.ts.map +1 -1
  335. package/dist/hooks/useImageMode.js +3 -0
  336. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  337. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  338. package/dist/hooks/useInputStatusIcon.js +2 -2
  339. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  340. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
  341. package/dist/hooks/useKeyboardHint.js +1 -1
  342. package/dist/hooks/useLongPress.d.ts +8 -9
  343. package/dist/hooks/useLongPress.d.ts.map +1 -1
  344. package/dist/hooks/useLongPress.js +23 -106
  345. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  346. package/dist/hooks/useMenuHover.js +2 -0
  347. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  348. package/dist/hooks/useMenuPress.js +3 -0
  349. package/dist/hooks/useOverflow.d.ts.map +1 -1
  350. package/dist/hooks/useOverflow.js +2 -1
  351. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  352. package/dist/hooks/usePressFeedback.js +1 -0
  353. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  354. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  355. package/dist/hooks/useResolvedRequired.js +3 -0
  356. package/dist/hooks/useScrollLock.d.ts +8 -9
  357. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  358. package/dist/hooks/useScrollLock.js +50 -48
  359. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  360. package/dist/hooks/useScrollableArea.js +5 -0
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +3 -0
  363. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  364. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  365. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  366. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  367. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  368. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  369. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  370. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  371. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  372. package/dist/i18n/generated-locales/en.generated.js +30 -0
  373. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  374. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  375. package/dist/index.d.ts +1 -0
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +4 -0
  378. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  379. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  380. package/dist/internal/indicatorPress.stylex.js +26 -0
  381. package/dist/internal/selectable-card.d.ts +21 -0
  382. package/dist/internal/selectable-card.d.ts.map +1 -0
  383. package/dist/internal/selectable-card.js +20 -0
  384. package/dist/internal/sheetDraft.d.ts +2 -2
  385. package/dist/internal/sheetDraft.js +2 -2
  386. package/dist/motion/animatedLayout.d.ts +8 -0
  387. package/dist/motion/animatedLayout.d.ts.map +1 -1
  388. package/dist/motion/animatedLayout.js +246 -53
  389. package/dist/motion/animator.d.ts +14 -14
  390. package/dist/motion/animator.d.ts.map +1 -1
  391. package/dist/motion/animator.js +45 -26
  392. package/dist/motion/frameBlock.d.ts +14 -0
  393. package/dist/motion/frameBlock.d.ts.map +1 -0
  394. package/dist/motion/frameBlock.js +16 -0
  395. package/dist/motion/progress.d.ts +88 -0
  396. package/dist/motion/progress.d.ts.map +1 -0
  397. package/dist/motion/progress.js +128 -0
  398. package/dist/motion/reducedMotion.d.ts.map +1 -1
  399. package/dist/motion/reducedMotion.js +3 -1
  400. package/dist/motion/uikit/alert.d.ts +41 -0
  401. package/dist/motion/uikit/alert.d.ts.map +1 -0
  402. package/dist/motion/uikit/alert.js +43 -0
  403. package/dist/motion/uikit/index.d.ts +4 -3
  404. package/dist/motion/uikit/index.d.ts.map +1 -1
  405. package/dist/motion/uikit/index.js +4 -3
  406. package/dist/motion/uikit/picker.d.ts +96 -0
  407. package/dist/motion/uikit/picker.d.ts.map +1 -0
  408. package/dist/motion/uikit/picker.js +117 -0
  409. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  410. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  411. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  412. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  413. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  414. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  415. package/dist/theme/Theme.d.ts.map +1 -1
  416. package/dist/theme/Theme.js +29 -4
  417. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  418. package/dist/theme/generateThemeRules.js +14 -13
  419. package/dist/theme/motionKnobs.d.ts +4 -3
  420. package/dist/theme/motionKnobs.d.ts.map +1 -1
  421. package/dist/theme/motionKnobs.js +3 -2
  422. package/dist/theme/themeMotion.d.ts +6 -0
  423. package/dist/theme/themeMotion.d.ts.map +1 -1
  424. package/dist/theme/themeMotion.js +15 -2
  425. package/dist/theme/tokens.stylex.d.ts +3 -0
  426. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  427. package/dist/theme/tokens.stylex.js +4 -1
  428. package/dist/utils/dateParser.d.ts.map +1 -1
  429. package/dist/utils/dateParser.js +12 -0
  430. package/dist/utils/disabledInteraction.d.ts +10 -2
  431. package/dist/utils/disabledInteraction.d.ts.map +1 -1
  432. package/dist/utils/disabledInteraction.js +16 -2
  433. package/dist/utils/focusReturn.d.ts +22 -25
  434. package/dist/utils/focusReturn.d.ts.map +1 -1
  435. package/dist/utils/focusReturn.js +36 -29
  436. package/dist/utils/index.d.ts +1 -1
  437. package/dist/utils/index.d.ts.map +1 -1
  438. package/dist/utils/index.js +1 -1
  439. package/dist/utils/interactionModality.d.ts.map +1 -1
  440. package/dist/utils/interactionModality.js +4 -0
  441. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  442. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  443. package/dist/utils/interactionOverlay.stylex.js +3 -2
  444. package/dist/utils/isFocusDetached.d.ts +27 -0
  445. package/dist/utils/isFocusDetached.d.ts.map +1 -0
  446. package/dist/utils/isFocusDetached.js +32 -0
  447. package/dist/utils/plainDate.d.ts +31 -0
  448. package/dist/utils/plainDate.d.ts.map +1 -1
  449. package/dist/utils/plainDate.js +68 -4
  450. package/dist/utils/pressFeedback.d.ts.map +1 -1
  451. package/dist/utils/pressFeedback.js +20 -6
  452. package/dist/utils/triggerFocus.d.ts +36 -0
  453. package/dist/utils/triggerFocus.d.ts.map +1 -0
  454. package/dist/utils/triggerFocus.js +65 -0
  455. package/locales/en.json +120 -0
  456. package/locales/pseudo.json +90 -0
  457. package/package.json +14 -9
  458. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  459. package/src/AlertDialog/AlertDialog.tsx +46 -5
  460. package/src/AppShell/AppShell.tsx +13 -4
  461. package/src/BottomSheet/BottomSheet.tsx +1 -0
  462. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  463. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  464. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  465. package/src/BottomSheet/useSheetGestures.ts +10 -1
  466. package/src/Button/Button.tsx +26 -4
  467. package/src/Calendar/Calendar.tsx +40 -32
  468. package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
  469. package/src/Calendar/hooks/useCalendarDays.ts +5 -10
  470. package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
  471. package/src/Carousel/Carousel.tsx +1 -0
  472. package/src/Chat/ChatComposerInput.tsx +4 -7
  473. package/src/Chat/ChatMessageList.tsx +2 -1
  474. package/src/Chat/useChatDictation.ts +1 -0
  475. package/src/Chat/useChatNewMessages.ts +1 -1
  476. package/src/Chat/useChatStreamScroll.ts +2 -0
  477. package/src/Chat/useSpeechRecognition.ts +2 -0
  478. package/src/Chat/useTriggerMenu.tsx +1 -1
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  480. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  481. package/src/CheckboxList/CheckboxList.doc.mjs +7 -0
  482. package/src/CheckboxList/CheckboxList.tsx +9 -0
  483. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  484. package/src/CodeBlock/CodeBlock.tsx +41 -4
  485. package/src/CommandPalette/CommandPalette.tsx +1 -0
  486. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  487. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  488. package/src/ContextMenu/ContextMenu.tsx +2 -2
  489. package/src/DateInput/MonthScroller.tsx +8 -2
  490. package/src/DateInput/PickerWheel.tsx +765 -0
  491. package/src/DateInput/TouchDateField.tsx +6 -32
  492. package/src/DateInput/Wheel.tsx +94 -150
  493. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  494. package/src/DateInput/usePointerDragScroll.ts +1 -0
  495. package/src/DateInput/useScrollSettle.ts +2 -0
  496. package/src/DateInput/useWheelListbox.ts +112 -0
  497. package/src/DateInput/wheelOptions.ts +155 -0
  498. package/src/DateInput/wheelPhysics.ts +406 -0
  499. package/src/DateInput/wheelStrip.ts +341 -0
  500. package/src/DateTimeInput/TouchDateTimeField.tsx +8 -13
  501. package/src/Dialog/Dialog.tsx +12 -32
  502. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  503. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  504. package/src/Field/Field.tsx +2 -2
  505. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  506. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  507. package/src/FormLayout/FormLayout.tsx +5 -1
  508. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  509. package/src/HoverCard/HoverCard.tsx +58 -6
  510. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  511. package/src/HoverCard/useHoverCard.tsx +49 -54
  512. package/src/Icon/Icon.doc.mjs +51 -10
  513. package/src/Icon/Icon.tsx +15 -7
  514. package/src/IconButton/IconButton.doc.mjs +141 -21
  515. package/src/InfoTip/InfoTip.tsx +72 -16
  516. package/src/Item/useSwipeAction.ts +2 -0
  517. package/src/Layer/modalOutlet.ts +2 -0
  518. package/src/Layer/outsidePress.ts +1 -0
  519. package/src/Layer/useLayer.tsx +3 -1
  520. package/src/Layer/useLayerDismissal.ts +2 -0
  521. package/src/Layer/useTouchTrigger.ts +19 -6
  522. package/src/Layout/index.ts +1 -1
  523. package/src/Layout/layoutReset.ts +1 -1
  524. package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
  525. package/src/Layout/padding.stylex.ts +9 -133
  526. package/src/Layout/paddingStyles.stylex.ts +87 -0
  527. package/src/Lightbox/Lightbox.tsx +20 -1
  528. package/src/Lightbox/useLightbox.doc.mjs +167 -0
  529. package/src/MobileNav/MobileNav.tsx +10 -31
  530. package/src/MultiSelector/MultiSelector.tsx +2 -7
  531. package/src/NumberInput/NumberInput.tsx +2 -7
  532. package/src/Outline/useOutlineFromDOM.ts +2 -0
  533. package/src/Outline/useScrollSpy.ts +2 -0
  534. package/src/OverflowList/OverflowList.tsx +2 -0
  535. package/src/Popover/Popover.tsx +4 -0
  536. package/src/Popover/usePopover.tsx +2 -2
  537. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  538. package/src/PowerSearch/PowerSearch.tsx +620 -157
  539. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  540. package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
  541. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  542. package/src/PowerSearch/PowerSearchToken.tsx +2 -0
  543. package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
  544. package/src/PowerSearch/formatFilterValue.ts +49 -27
  545. package/src/PowerSearch/formatTokenValue.ts +220 -0
  546. package/src/PowerSearch/index.ts +5 -1
  547. package/src/PowerSearch/powerSearchDateZone.ts +95 -0
  548. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  549. package/src/PowerSearch/types.ts +8 -1
  550. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  551. package/src/RadioList/RadioList.tsx +3 -2
  552. package/src/RadioList/RadioListItem.tsx +5 -3
  553. package/src/Resizable/Resizable.doc.mjs +5 -4
  554. package/src/Resizable/ResizeHandle.tsx +169 -109
  555. package/src/Resizable/createResizable.ts +831 -0
  556. package/src/Resizable/useResizable.ts +292 -623
  557. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  558. package/src/SelectableCard/SelectableCard.tsx +39 -10
  559. package/src/SelectableCard/selectableCardInput.ts +30 -0
  560. package/src/Selector/Selector.tsx +7 -19
  561. package/src/SideNav/SideNav.tsx +41 -5
  562. package/src/Slider/Slider.tsx +20 -11
  563. package/src/Slider/sliderTouchController.ts +2 -2
  564. package/src/Spinner/Spinner.tsx +77 -63
  565. package/src/Stepper/Stepper.tsx +10 -27
  566. package/src/Switch/Switch.tsx +2 -6
  567. package/src/Switch/useSwitchTouch.ts +4 -4
  568. package/src/Table/BaseTable.tsx +46 -12
  569. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  570. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  571. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  572. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  573. package/src/TextArea/TextArea.tsx +2 -7
  574. package/src/TextInput/TextInput.tsx +13 -17
  575. package/src/TimeInput/TimeInput.tsx +2 -0
  576. package/src/TimeInput/TouchTimeField.tsx +2 -0
  577. package/src/Timer/Timer.tsx +1 -0
  578. package/src/Timestamp/Timestamp.tsx +1 -1
  579. package/src/Timestamp/formatInstant.ts +1 -33
  580. package/src/Toast/Toast.doc.mjs +4 -3
  581. package/src/Toast/Toast.tsx +52 -32
  582. package/src/Toast/ToastViewport.tsx +123 -35
  583. package/src/Toast/types.ts +9 -3
  584. package/src/Toast/useToast.tsx +1 -0
  585. package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
  586. package/src/Tokenizer/Tokenizer.tsx +61 -62
  587. package/src/Tokenizer/TokenizerBottomSheet.tsx +9 -11
  588. package/src/Tokenizer/index.ts +1 -0
  589. package/src/Tooltip/Tooltip.tsx +6 -42
  590. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  591. package/src/Tooltip/useTooltip.tsx +237 -134
  592. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  593. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  594. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  595. package/src/animator/createAnimator.doc.mjs +153 -0
  596. package/src/animator/createAnimator.ts +324 -0
  597. package/src/gestures/GestureHost.ts +1 -1
  598. package/src/gestures/PressTracker.ts +4 -3
  599. package/src/gestures/README.md +10 -4
  600. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  601. package/src/hooks/actionGroupTracker.ts +20 -5
  602. package/src/hooks/index.ts +2 -0
  603. package/src/hooks/longPressDetector.ts +273 -0
  604. package/src/hooks/pressGroupContext.ts +21 -0
  605. package/src/hooks/rootScrollStyles.ts +247 -0
  606. package/src/hooks/scrollLockTouchGuard.ts +149 -0
  607. package/src/hooks/scrollbarGutter.ts +41 -26
  608. package/src/hooks/useActionGroupTracking.ts +224 -0
  609. package/src/hooks/useAnimator.doc.mjs +109 -0
  610. package/src/hooks/useAnimator.ts +67 -0
  611. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  612. package/src/hooks/useAttachment.ts +1 -1
  613. package/src/hooks/useAutoMediaMode.ts +1 -0
  614. package/src/hooks/useBusyAnnouncement.ts +2 -0
  615. package/src/hooks/useDevWarning.ts +2 -0
  616. package/src/hooks/useFocusTrap.ts +2 -0
  617. package/src/hooks/useGridFocus.doc.mjs +6 -6
  618. package/src/hooks/useGridFocus.ts +10 -7
  619. package/src/hooks/useHotkeys.ts +2 -0
  620. package/src/hooks/useImageMode.ts +2 -0
  621. package/src/hooks/useInputStatusIcon.tsx +3 -2
  622. package/src/hooks/useKeyboardHint.tsx +1 -1
  623. package/src/hooks/useLongPress.doc.mjs +2 -2
  624. package/src/hooks/useLongPress.ts +32 -122
  625. package/src/hooks/useMenuHover.ts +1 -0
  626. package/src/hooks/useMenuPress.ts +2 -0
  627. package/src/hooks/useOverflow.ts +2 -1
  628. package/src/hooks/usePressFeedback.ts +1 -0
  629. package/src/hooks/useResolvedRequired.ts +3 -0
  630. package/src/hooks/useScrollLock.doc.mjs +51 -12
  631. package/src/hooks/useScrollLock.ts +53 -60
  632. package/src/hooks/useScrollableArea.ts +4 -0
  633. package/src/hooks/useStreamingText.ts +2 -0
  634. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  635. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  636. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  637. package/src/i18n/generated-locales/en.generated.ts +41 -0
  638. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  639. package/src/index.ts +13 -0
  640. package/src/internal/indicatorPress.stylex.ts +24 -0
  641. package/src/internal/selectable-card.ts +21 -0
  642. package/src/internal/sheetDraft.ts +2 -2
  643. package/src/motion/MEASUREMENTS.md +18 -0
  644. package/src/motion/README.md +10 -5
  645. package/src/motion/animatedLayout.ts +323 -60
  646. package/src/motion/animator.ts +66 -37
  647. package/src/motion/frameBlock.ts +16 -0
  648. package/src/motion/progress.ts +155 -0
  649. package/src/motion/reducedMotion.ts +3 -1
  650. package/src/motion/uikit/alert.ts +43 -0
  651. package/src/motion/uikit/index.ts +4 -3
  652. package/src/motion/uikit/picker.ts +116 -0
  653. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  654. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  655. package/src/theme/Theme.tsx +37 -3
  656. package/src/theme/generateThemeRules.ts +14 -12
  657. package/src/theme/motionKnobs.ts +4 -3
  658. package/src/theme/themeMotion.ts +17 -2
  659. package/src/theme/tokens.stylex.ts +2 -0
  660. package/src/utils/dateParser.ts +16 -0
  661. package/src/utils/disabledInteraction.ts +23 -2
  662. package/src/utils/focusReturn.ts +38 -31
  663. package/src/utils/index.ts +1 -1
  664. package/src/utils/interactionModality.ts +4 -0
  665. package/src/utils/interactionOverlay.stylex.ts +3 -2
  666. package/src/utils/isFocusDetached.ts +34 -0
  667. package/src/utils/plainDate.ts +80 -4
  668. package/src/utils/pressFeedback.ts +24 -6
  669. package/src/utils/triggerFocus.ts +80 -0
  670. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
  671. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
  672. package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
  673. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
  674. package/dist/Layer/usePressPin.d.ts +0 -93
  675. package/dist/Layer/usePressPin.d.ts.map +0 -1
  676. package/dist/Layer/usePressPin.js +0 -363
  677. package/dist/internal/touch-sheet.d.ts +0 -21
  678. package/dist/internal/touch-sheet.d.ts.map +0 -1
  679. package/dist/internal/touch-sheet.js +0 -19
  680. package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
  681. package/src/Layer/usePressPin.ts +0 -510
  682. package/src/internal/touch-sheet.ts +0 -21
@@ -0,0 +1,153 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** @type {import('@astryxdesign/cli/authoring').HookDoc} */
4
+ export const docs = {
5
+ name: 'createAnimator',
6
+ displayName: 'createAnimator',
7
+ // A factory documented as a hook: listed with the utilities, beside its
8
+ // hook, not as a tile in the components gallery.
9
+ group: 'Utilities',
10
+ keywords: [
11
+ 'animate',
12
+ 'animation',
13
+ 'animator',
14
+ 'spring',
15
+ 'decay',
16
+ 'momentum',
17
+ 'fling',
18
+ 'motion',
19
+ 'transform',
20
+ 'opacity',
21
+ 'vanilla',
22
+ 'factory',
23
+ ],
24
+ params: [
25
+ {
26
+ name: 'element',
27
+ type: 'HTMLElement',
28
+ description:
29
+ 'The element to animate. The animator writes its `translate`, `scale`, `rotate` and `opacity`, and while it moves an inline `will-change` for them, merged with any it already has and restored 500 ms after its last motion; nothing else, so lay it out and style it as usual. Use one animator per element: two on one element overwrite each other.',
30
+ required: true,
31
+ },
32
+ ],
33
+ returns: [
34
+ {
35
+ name: 'animate',
36
+ type: '(target: {x?, y?, scale?, rotate?, opacity?}, options?: {velocity?}) => Promise<void>',
37
+ description:
38
+ "Springs the given channels to `target` from wherever they are on screen, on the state-change motion Astryx's components use, and resolves when they arrive (or as soon as a later call takes them over). `x` and `y` are px, `scale` is 1 at the element's size, `rotate` is degrees and `opacity` runs from 0 to 1. Pass `velocity` (units per second, such as a drag's release velocity) to start with it; without it a channel keeps the velocity it has on screen, so interrupting a motion never jumps.",
39
+ },
40
+ {
41
+ name: 'decay',
42
+ type: '(velocity: {x?, y?, scale?, rotate?, opacity?}) => Promise<void>',
43
+ description:
44
+ "Coasts the given channels from a release velocity in their units per second, slowing as a scroll view's momentum does, and resolves when they stop (or as soon as a later call takes any of them over); opacity stops at 0 or 1. The distance follows from the velocity: use it to fling something away, then remove or reset it.",
45
+ },
46
+ {
47
+ name: 'set',
48
+ type: '(values: {x?, y?, scale?, rotate?, opacity?}) => void',
49
+ description:
50
+ 'Puts the given channels at these values at once, ending their motion: follow a finger with it, frame by frame.',
51
+ },
52
+ {
53
+ name: 'get',
54
+ type: '() => {x, y, scale, rotate, opacity}',
55
+ description: "Every channel's value on screen now.",
56
+ },
57
+ {
58
+ name: 'getVelocity',
59
+ type: '() => {x, y, scale, rotate, opacity}',
60
+ description:
61
+ "Every channel's velocity on screen now, in units per second.",
62
+ },
63
+ {
64
+ name: 'stop',
65
+ type: '() => void',
66
+ description: 'Halts every channel where it is on screen.',
67
+ },
68
+ {
69
+ name: 'destroy',
70
+ type: '() => void',
71
+ description:
72
+ 'Stops every motion and lets the element go; the element keeps the values it shows. Call it when you remove the element or no longer animate it.',
73
+ },
74
+ ],
75
+ usage: {
76
+ description:
77
+ "Animates one element with the motion Astryx's own components use, without React. `animate` springs an element to new values on the state-change motion, `decay` flings it with the momentum of a released scroll view, and `set` moves it directly, so a card can follow a finger, snap back and be thrown away. Use the `useAnimator` hook in React. To animate an area's layout as its items change, use `useAnimatedLayout`; for what a component already animates, such as a sheet's detents or a carousel's snapping, use the component's own props.",
78
+ bestPractices: [
79
+ {
80
+ guidance: true,
81
+ description:
82
+ 'Start every `animate` that follows a drag with the release velocity, so the element carries on as it was thrown.',
83
+ },
84
+ {
85
+ guidance: true,
86
+ description:
87
+ 'Reach every state an animation shows without the animation too: a key, a button or a menu item that calls the same code.',
88
+ },
89
+ {
90
+ guidance: true,
91
+ description:
92
+ '`await` the promise before removing an element you animate out, and call `destroy` once it is gone.',
93
+ },
94
+ {
95
+ guidance: false,
96
+ description:
97
+ 'Read the element\u2019s position from layout while it moves: `get` gives the value on screen, wherever the motion runs.',
98
+ },
99
+ ],
100
+ accessibility: [
101
+ {
102
+ name: 'Keyboard and assistive technology',
103
+ category: 'Keyboard',
104
+ description:
105
+ 'An animator moves an element; it adds no way to act. Give every action an animation stands for a control a keyboard and a screen reader can reach, such as a button that discards a card, and have it call `animate`, which Reduce Motion turns into a fade in place. Keep `decay` for a throw the person made: Reduce Motion keeps the momentum of a coast, as it continues that throw. Keep focus on an element that stays on screen: move it before you fling its element away.',
106
+ },
107
+ {
108
+ name: 'Reduce Motion',
109
+ category: 'Content',
110
+ criterion: '2.3.3 Animation from Interactions',
111
+ description:
112
+ 'When the person asks for reduced motion, every call is planned for them. On a touch screen a move or a scale becomes a short opacity cross-fade: the element fades out where it was and fades back in where it lands. With a mouse it lands at once. A decay of `x` and `y` keeps its momentum, as it continues the throw the person made; a decay of `scale`, `rotate` or `opacity` is planned like a move. No option turns this off.',
113
+ },
114
+ ],
115
+ },
116
+ relatedHooks: ['useAnimator', 'useAnimatedLayout'],
117
+ importPath: '@astryxdesign/core',
118
+ category: 'interaction',
119
+ };
120
+
121
+ /** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
122
+ export const docsDense = {
123
+ description:
124
+ "Animates one element (x, y, scale, rotate, opacity) with Astryx's motion, without React.",
125
+ paramDescriptions: {
126
+ element: 'The element to animate; one animator per element.',
127
+ },
128
+ returnDescriptions: {
129
+ animate:
130
+ '(target, {velocity?}) => Promise<void>; springs on the state-change motion.',
131
+ decay:
132
+ '({x?, y?, scale?, rotate?, opacity?}) => Promise<void>; coasts from a release velocity.',
133
+ set: '(values) => void; jumps, ending motion.',
134
+ get: '() => every value on screen.',
135
+ getVelocity: '() => every velocity on screen.',
136
+ stop: '() => void; halts where it is.',
137
+ destroy: '() => void; lets the element go.',
138
+ },
139
+ usage: {
140
+ description:
141
+ 'Spring with animate, fling with decay, follow a finger with set. Reduce Motion: a cross-fade on touch, at once with a mouse; decay keeps its momentum.',
142
+ bestPractices: [
143
+ {
144
+ guidance: true,
145
+ description: 'Pass the release velocity to animate after a drag.',
146
+ },
147
+ {
148
+ guidance: false,
149
+ description: 'Read layout for the position mid-motion; use get.',
150
+ },
151
+ ],
152
+ },
153
+ };
@@ -0,0 +1,324 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file createAnimator.ts
7
+ * @input An element; the internal motion animator (motion/animator.ts), the
8
+ * `springs.stateChange` motion role and the momentum coast (motion/coast.ts)
9
+ * @output The public animator: `createAnimator`, the `AnimatorHandle` it
10
+ * returns, and their value types
11
+ * @position Public entry point, re-exported from the package root. The
12
+ * `useAnimator` hook wraps it. Importing it does no DOM work.
13
+ *
14
+ * SYNC: When modified, update:
15
+ * - /packages/core/src/animator/createAnimator.test.ts
16
+ * - /packages/core/src/animator/createAnimator.doc.mjs
17
+ * - /packages/core/src/hooks/useAnimator.ts
18
+ */
19
+
20
+ import {
21
+ createMotionAnimator,
22
+ SETTLE_THRESHOLD,
23
+ type Animator as MotionAnimator,
24
+ type MotionCurve,
25
+ type MotionProperty,
26
+ type MotionValues,
27
+ } from '../motion/animator';
28
+ import {coast} from '../motion/coast';
29
+ import {solveDecay} from '../motion/decay';
30
+ import {registerSpringsTable, springs} from '../motion/uikit/springs';
31
+
32
+ /**
33
+ * A channel the animator drives. `x` and `y` translate the element (px).
34
+ * `scale` scales it about its transform origin (1 is its size). `rotate`
35
+ * turns it (degrees, clockwise), and `opacity` fades it (0 to 1).
36
+ */
37
+ export type AnimatorChannel = 'x' | 'y' | 'scale' | 'rotate' | 'opacity';
38
+
39
+ /**
40
+ * Values by channel. A velocity uses the same keys, in units per second:
41
+ * px/s, scale per second, deg/s, opacity per second.
42
+ */
43
+ export type AnimatorValues = Partial<Record<AnimatorChannel, number>>;
44
+
45
+ /** Every channel's value (or velocity), as `get` and `getVelocity` read it. */
46
+ export type AnimatorSnapshot = Readonly<Record<AnimatorChannel, number>>;
47
+
48
+ /** Options of `AnimatorHandle.animate`. */
49
+ export interface AnimatorAnimateOptions {
50
+ /**
51
+ * Each channel's velocity at the start, such as a drag's release velocity.
52
+ * A channel without one keeps the
53
+ * velocity it has on screen, so an `animate` that interrupts another
54
+ * carries on smoothly.
55
+ */
56
+ velocity?: AnimatorValues;
57
+ }
58
+
59
+ /**
60
+ * A release velocity for `AnimatorHandle.decay`, per channel, in its units
61
+ * per second. That is px/s for `x` and `y`, and degrees per second for
62
+ * `rotate`. `scale` and `opacity` take their units per second.
63
+ */
64
+ export type AnimatorDecayVelocity = AnimatorValues;
65
+
66
+ /**
67
+ * Animates one element. Each method acts on the channels it is given and
68
+ * leaves the others where they are.
69
+ */
70
+ export interface AnimatorHandle {
71
+ /**
72
+ * Springs the given channels to `target` on the `springs.stateChange`
73
+ * motion role, from wherever they are on screen. The promise resolves when
74
+ * they arrive, or as soon as a later `animate`, `decay`, `set` or `stop`
75
+ * takes any of them over.
76
+ */
77
+ animate(
78
+ target: AnimatorValues,
79
+ options?: AnimatorAnimateOptions,
80
+ ): Promise<void>;
81
+ /**
82
+ * Coasts the given channels from a release velocity, slowing as a scroll
83
+ * view's momentum does. It resolves when they stop, or when another call
84
+ * takes them over. The distance follows from the velocity alone: there are
85
+ * no bounds, except that opacity stops at 0 or 1.
86
+ */
87
+ decay(velocity: AnimatorDecayVelocity): Promise<void>;
88
+ /**
89
+ * Puts the given channels at these values at once, ending their motion:
90
+ * the per-frame write of a drag.
91
+ */
92
+ set(values: AnimatorValues): void;
93
+ /** Every channel's value on screen now. */
94
+ get(): AnimatorSnapshot;
95
+ /** Every channel's velocity on screen now, in units per second. */
96
+ getVelocity(): AnimatorSnapshot;
97
+ /** Halts every channel where it is on screen. */
98
+ stop(): void;
99
+ }
100
+
101
+ /** What `createAnimator` returns: the handle, and `destroy`. */
102
+ export interface Animator extends AnimatorHandle {
103
+ /**
104
+ * Stops every motion and lets go of the element; the element keeps the
105
+ * values it shows. The animator does nothing after this.
106
+ */
107
+ destroy(): void;
108
+ }
109
+
110
+ const CHANNELS: ReadonlyArray<AnimatorChannel> = [
111
+ 'x',
112
+ 'y',
113
+ 'scale',
114
+ 'rotate',
115
+ 'opacity',
116
+ ];
117
+
118
+ /** The values of the channels the public API names, and nothing else. */
119
+ function motionValues(values: AnimatorValues | undefined): MotionValues {
120
+ const out: MotionValues = {};
121
+ if (values == null) {
122
+ return out;
123
+ }
124
+ for (const channel of CHANNELS) {
125
+ const value = values[channel];
126
+ if (typeof value === 'number' && Number.isFinite(value)) {
127
+ out[channel] = value;
128
+ }
129
+ }
130
+ return out;
131
+ }
132
+
133
+ /**
134
+ * A coast from `from` at `velocity` on the momentum decay a scroll view
135
+ * uses, ending at rest. The theme does not change this decay. An opacity
136
+ * coast stops at 0 or 1.
137
+ */
138
+ function momentum(
139
+ from: number,
140
+ velocity: number,
141
+ threshold: number,
142
+ isUnit: boolean,
143
+ ): MotionCurve {
144
+ const glide = solveDecay({from, velocity});
145
+ const edge = !isUnit ? null : glide.rest < 0 ? 0 : glide.rest > 1 ? 1 : null;
146
+ const hit = edge == null ? null : glide.timeToReach(edge);
147
+ const duration = hit ?? glide.settleTime(threshold);
148
+ const end = edge ?? glide.rest;
149
+ return {
150
+ duration,
151
+ at: t => (t >= duration ? end : glide.value(t)),
152
+ velocity: t => (t >= duration ? 0 : glide.velocity(t)),
153
+ };
154
+ }
155
+
156
+ function snapshot(
157
+ read: (channel: AnimatorChannel) => number,
158
+ ): AnimatorSnapshot {
159
+ return {
160
+ x: read('x'),
161
+ y: read('y'),
162
+ scale: read('scale'),
163
+ rotate: read('rotate'),
164
+ opacity: read('opacity'),
165
+ };
166
+ }
167
+
168
+ /**
169
+ * Resolves once every motion of one call has finished, or as soon as any of
170
+ * them is interrupted (`finished` resolves `false`). A later call that takes
171
+ * over one channel ends the whole call where it stopped, as one `animate`
172
+ * does. The other channels move on.
173
+ */
174
+ async function settledOrTakenOver(
175
+ moving: ReadonlyArray<Promise<boolean>>,
176
+ ): Promise<void> {
177
+ if (moving.length === 0) {
178
+ return;
179
+ }
180
+ await new Promise<void>(resolve => {
181
+ let left = moving.length;
182
+ for (const finished of moving) {
183
+ void finished.then(completed => {
184
+ left -= 1;
185
+ if (!completed || left === 0) {
186
+ resolve();
187
+ }
188
+ });
189
+ }
190
+ });
191
+ }
192
+
193
+ /**
194
+ * An animator whose element is attached later, through `attach`. It is the
195
+ * one construction `createAnimator` and `useAnimator` share, so the hook has
196
+ * no behavior of its own. Not exported from the package.
197
+ */
198
+ export function createAttachableAnimator(): {
199
+ readonly animator: Animator;
200
+ readonly attach: (element: HTMLElement | null) => void;
201
+ } {
202
+ const motion: MotionAnimator = createMotionAnimator(null);
203
+ // Calls do nothing while no element is attached, before the ref attaches
204
+ // or after it lets go. They also do nothing after destroy, and animate and
205
+ // decay then resolve at once.
206
+ let element: HTMLElement | null = null;
207
+ let destroyed = false;
208
+ const inactive = () => destroyed || element == null;
209
+ const animator: Animator = {
210
+ async animate(target, options) {
211
+ const to = motionValues(target);
212
+ if (inactive() || Object.keys(to).length === 0) {
213
+ return;
214
+ }
215
+ // The role registry is written on first use, never on import.
216
+ registerSpringsTable();
217
+ const velocity = motionValues(options?.velocity);
218
+ await motion.animate(to, {
219
+ spring: springs.stateChange,
220
+ ...(Object.keys(velocity).length > 0 ? {velocity} : {}),
221
+ }).finished;
222
+ },
223
+ async decay(velocity) {
224
+ if (inactive()) {
225
+ return;
226
+ }
227
+ const given = motionValues(velocity);
228
+ // The translate axes coast as a throw, which Reduce Motion lets
229
+ // continue. The others coast as a transition, which it replaces.
230
+ const translate = coast(motion, {x: given.x, y: given.y});
231
+ const others: Partial<Record<MotionProperty | 'scale', MotionCurve>> = {};
232
+ for (const channel of ['scale', 'rotate', 'opacity'] as const) {
233
+ const v0 = given[channel];
234
+ if (v0 != null) {
235
+ const property = channel === 'scale' ? 'scaleX' : channel;
236
+ others[channel] = momentum(
237
+ motion.get(property),
238
+ v0,
239
+ SETTLE_THRESHOLD[property],
240
+ channel === 'opacity',
241
+ );
242
+ }
243
+ }
244
+ const moving: Promise<boolean>[] = [];
245
+ if (Object.keys(translate).length > 0) {
246
+ moving.push(motion.decay(translate).finished);
247
+ }
248
+ if (Object.keys(others).length > 0) {
249
+ moving.push(motion.play(others).finished);
250
+ }
251
+ await settledOrTakenOver(moving);
252
+ },
253
+ set(values) {
254
+ if (!inactive()) {
255
+ motion.set(motionValues(values));
256
+ }
257
+ },
258
+ get() {
259
+ return snapshot(channel => motion.get(channel));
260
+ },
261
+ getVelocity() {
262
+ return snapshot(channel => motion.getVelocity(channel));
263
+ },
264
+ stop() {
265
+ if (!inactive()) {
266
+ motion.stop();
267
+ }
268
+ },
269
+ destroy() {
270
+ if (!destroyed) {
271
+ destroyed = true;
272
+ // Halts every channel where it shows, so the element keeps those
273
+ // values and nothing reads as moving, then lets go of it.
274
+ motion.stop();
275
+ motion.dispose();
276
+ }
277
+ },
278
+ };
279
+ return {
280
+ animator,
281
+ attach: next => {
282
+ if (destroyed || next === element) {
283
+ return;
284
+ }
285
+ if (element != null) {
286
+ // The old node takes its values with it, so the next node, or a
287
+ // remount, starts at rest.
288
+ motion.attach(null);
289
+ motion.stop();
290
+ motion.set(motionValues(REST));
291
+ }
292
+ element = next;
293
+ motion.attach(next);
294
+ },
295
+ };
296
+ }
297
+
298
+ /** A new or remounted element starts from these values. */
299
+ const REST = {x: 0, y: 0, scale: 1, rotate: 0, opacity: 1} as const;
300
+
301
+ /**
302
+ * Animates `element` with the motion Core uses. `animate` springs channels to
303
+ * a target on the state-change motion, and `decay` coasts them from a release
304
+ * velocity. `set` jumps them, `get` and `getVelocity` read them, `stop` halts
305
+ * them, and `destroy` lets the element go. Under Reduce Motion every call is
306
+ * planned. A move becomes a short cross-fade on a touch screen, and it lands
307
+ * at once with a mouse.
308
+ *
309
+ * Use one animator per element: two on one element overwrite each other.
310
+ *
311
+ * @example
312
+ * ```
313
+ * const card = document.querySelector('.card');
314
+ * const animator = createAnimator(card);
315
+ * await animator.animate({x: 0, rotate: 0}, {velocity: {x: -900}});
316
+ * animator.decay({x: 2400});
317
+ * animator.destroy();
318
+ * ```
319
+ */
320
+ export function createAnimator(element: HTMLElement): Animator {
321
+ const {animator, attach} = createAttachableAnimator();
322
+ attach(element);
323
+ return animator;
324
+ }
@@ -590,7 +590,7 @@ function wheelPixels(
590
590
  * A trackpad's precise deltas, a third of their legacy `wheelDelta` in
591
591
  * Chromium and WebKit, read as a trackpad's.
592
592
  */
593
- function scrollTypeOf(wheel: WheelEvent): ScrollType {
593
+ export function scrollTypeOf(wheel: WheelEvent): ScrollType {
594
594
  if (wheel.deltaMode !== 0 || wheel.shiftKey) {
595
595
  return 'discrete';
596
596
  }
@@ -47,7 +47,8 @@
47
47
  */
48
48
 
49
49
  import {UIKIT_CONTROL, UIKIT_PAN, UIKIT_PRESS} from '../motion/uikit/gestures';
50
- import {timing} from '../motion/uikit/timing';
50
+ // Importing the whole table bundles its curves into each press-tracking control.
51
+ import {press as pressClocks} from '../motion/uikit/timing';
51
52
  import {travel} from './geometry';
52
53
  import type {GestureRecognizer, SelectionLock} from './GestureRecognizer';
53
54
  import type {TapGestureRecognizer} from './TapGestureRecognizer';
@@ -154,7 +155,7 @@ export const PRESS_PROFILES = {
154
155
  // The shared press styles release every surface on the deselect clock
155
156
  // until a control runs its own release (UIButton's 250 ms), so a
156
157
  // painter's `fading` never outlasts the fade it shows.
157
- releaseMs: timing.press.highlightOutMs,
158
+ releaseMs: pressClocks.highlightOutMs,
158
159
  },
159
160
  /**
160
161
  * A table or collection cell: inside a scroll view it highlights after the
@@ -165,7 +166,7 @@ export const PRESS_PROFILES = {
165
166
  highlightDelay: 'inScrollers',
166
167
  cancelTravel: UIKIT_PAN.hysteresis.value,
167
168
  quickTapFlash: 0,
168
- releaseMs: timing.press.highlightOutMs,
169
+ releaseMs: pressClocks.highlightOutMs,
169
170
  },
170
171
  } as const satisfies Record<string, PressProfile>;
171
172
 
@@ -96,6 +96,10 @@ Once a drag has claimed its finger, a second finger never breaks it.
96
96
  | `PinchGestureRecognizer` | `UIPinchGestureRecognizer` | continuous | `scale` (settable, to re-base it), `velocity` in scale per second, `focalPoint()` |
97
97
  | `ScreenEdgePanGestureRecognizer` | `UIScreenEdgePanGestureRecognizer` | continuous | `edges`: `leading` / `trailing`, resolved against the view's writing direction; attached to an edge zone the view lies within; fails as soon as the touch lands outside every requested edge band; a finger's only |
98
98
 
99
+ Each recognizer reports what it is in `kind` (`'tap'`, `'longPress'`,
100
+ `'pan'`, `'screenEdgePan'`, `'swipe'`, `'pinch'`): code tells the family apart by it, never by `instanceof`
101
+ (`architecture:react-component-runtime` INV13).
102
+
99
103
  A recognizer created with `claimsTouches: false` is a watcher (a tab bar
100
104
  that minimizes while the page scrolls): it never claims, so its element gets
101
105
  only passive listeners and a scroll never waits for it; it prevents no other
@@ -174,7 +178,9 @@ innerPan.requireToFail(edgePan);
174
178
  ## Touches in the view: `createPressTracker`
175
179
 
176
180
  A pressable control's view-level touch handling, with `UIControl`
177
- semantics:
181
+ semantics, built by `createPressTracker(options)`: a factory, as
182
+ `architecture:react-component-runtime` INV13 asks of the touch modules outside
183
+ the recognizer family (`VelocityTracker` is still a class, its one listed gap):
178
184
 
179
185
  - `touchDown`, `touchDragInside` / `touchDragOutside`, `touchDragEnter` /
180
186
  `touchDragExit`, `touchUpInside` / `touchUpOutside`, `touchCancel`.
@@ -436,9 +442,9 @@ no scroll.
436
442
 
437
443
  ### Holding the page still
438
444
 
439
- A scroll lock may hold the page with `holdPageScroll(document, decide)` from
440
- `pageHold.ts`, which returns the release (none does yet: `useScrollLock`
441
- does not call it). It lives in its own module, so a page without a scroll
445
+ A scroll lock (`useScrollLock`) holds the page with
446
+ `holdPageScroll(document, decide)` from `pageHold.ts`, which returns the
447
+ release. It lives in its own module, so a page without a scroll
442
448
  lock never ships it, and it imports nothing of the gesture host: it asks the
443
449
  document's host whether a recognizer owns a touch only if a host exists, and
444
450
  a document without one has no recognizer to own it. A hold reads the
@@ -133,6 +133,7 @@ export function ModalAnnounceProvider({
133
133
  );
134
134
  sessionRef.current = {dialog, stop};
135
135
  }, [dialogRef, isOpen]);
136
+ // Releases the presentation watch and the held announcements on unmount.
136
137
  useEffect(
137
138
  () => () => {
138
139
  const session = sessionRef.current;
@@ -57,7 +57,8 @@ export interface ActionGroupTrackerOptions {
57
57
  * target past the group's ends commits the lift there wherever the finger
58
58
  * lifts.
59
59
  * @default the target whose rect, grown by `highlightExpansion`, holds the
60
- * point; none between or outside them
60
+ * point, the one the press landed on where several do; none between or
61
+ * outside them
61
62
  */
62
63
  resolveTarget?: (
63
64
  x: number,
@@ -83,8 +84,13 @@ export interface ActionGroupTracker {
83
84
  /**
84
85
  * A press began at viewport (x, y): read the actions' rects once and
85
86
  * highlight the one under it. An inert press is taken but tracks nothing.
87
+ * `landed` is the node the press landed on.
86
88
  */
87
- begin(x: number, y: number, options?: {inert?: boolean}): void;
89
+ begin(
90
+ x: number,
91
+ y: number,
92
+ options?: {inert?: boolean; landed?: Node | null},
93
+ ): void;
88
94
  /** The finger moved to viewport (x, y). */
89
95
  move(x: number, y: number): void;
90
96
  /**
@@ -150,6 +156,7 @@ export function createActionGroupTracker(
150
156
  let actions: TrackedAction[] = [];
151
157
  let highlighted: HTMLElement | null = null;
152
158
  let beganOn: HTMLElement | null = null;
159
+ let landedOn: Node | null = null;
153
160
  let isTracking = false;
154
161
  let isInert = false;
155
162
  // The finger's last position: `remeasure` resolves it again.
@@ -241,6 +248,9 @@ export function createActionGroupTracker(
241
248
  if (resolveTarget != null) {
242
249
  return actions.length === 0 ? null : resolveTarget(x, y, actions);
243
250
  }
251
+ // Rects that share an edge, or that have no layout (a test renderer), can
252
+ // both hold the point: the one the press landed on wins.
253
+ let first: HTMLElement | null = null;
244
254
  for (const action of actions) {
245
255
  if (
246
256
  x >= action.left - margin &&
@@ -248,22 +258,26 @@ export function createActionGroupTracker(
248
258
  y >= action.top - margin &&
249
259
  y <= action.bottom + margin
250
260
  ) {
251
- return action.element;
261
+ if (landedOn != null && action.element.contains(landedOn)) {
262
+ return action.element;
263
+ }
264
+ first ??= action.element;
252
265
  }
253
266
  }
254
- return null;
267
+ return first;
255
268
  };
256
269
 
257
270
  const reset = () => {
258
271
  actions = [];
259
272
  highlighted = null;
260
273
  beganOn = null;
274
+ landedOn = null;
261
275
  isTracking = false;
262
276
  isInert = false;
263
277
  };
264
278
 
265
279
  return {
266
- begin(x, y, {inert = false} = {}) {
280
+ begin(x, y, {inert = false, landed = null} = {}) {
267
281
  // A press can begin while another is tracked, when a second recognizer
268
282
  // takes over the finger (a trigger's held press, then the menu's): the
269
283
  // action the first one lit loses its paint.
@@ -276,6 +290,7 @@ export function createActionGroupTracker(
276
290
  highlighted = null;
277
291
  isTracking = true;
278
292
  isInert = inert;
293
+ landedOn = landed;
279
294
  lastX = x;
280
295
  lastY = y;
281
296
  getOptions().onMove?.(x, y);
@@ -133,6 +133,8 @@ export type {
133
133
  UseInteractiveRoleOptions,
134
134
  } from './useInteractiveRole';
135
135
 
136
+ export {useAnimator} from './useAnimator';
137
+
136
138
  export {useLongPress} from './useLongPress';
137
139
  export type {UseLongPressOptions, UseLongPressHandlers} from './useLongPress';
138
140