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

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
@@ -2,7 +2,8 @@
2
2
 
3
3
  /**
4
4
  * @file scrollbarGutter.ts
5
- * @input The element a scroll lock pins, plus live layout measurements
5
+ * @input The element whose width a scroll lock holds, plus live layout
6
+ * measurements
6
7
  * @output holdScrollbarGutter and the ScrollbarGutterHold it returns
7
8
  * @position Internal hook utility; used by useScrollLock and MobileNav so that
8
9
  * locking background scroll does not resize the layout viewport.
@@ -16,6 +17,8 @@
16
17
  // engines without `scrollbar-gutter`, and it applies only when a measurement
17
18
  // shows that the element moved.
18
19
 
20
+ import {claimRootScrollStyle} from './rootScrollStyles';
21
+
19
22
  const NOOP: ScrollbarGutterHold = {
20
23
  settle() {},
21
24
  release() {},
@@ -23,14 +26,23 @@ const NOOP: ScrollbarGutterHold = {
23
26
 
24
27
  export interface ScrollbarGutterHold {
25
28
  /**
26
- * Call once the lock's own styles are applied: measures whether the element
27
- * grew anyway and, only then, pads the difference away.
29
+ * Call once the lock's own styles apply. It holds the gutter open, or,
30
+ * without `scrollbar-gutter`, pads away only the width the element gained.
28
31
  */
29
32
  settle(): void;
30
33
  /** Call on unlock: restores everything this hold changed. */
31
34
  release(): void;
32
35
  }
33
36
 
37
+ /** Whether the engine reserves a gutter for `scrollbar-gutter: stable`. */
38
+ function supportsScrollbarGutter(): boolean {
39
+ return (
40
+ typeof CSS !== 'undefined' &&
41
+ typeof CSS.supports === 'function' &&
42
+ CSS.supports('scrollbar-gutter', 'stable')
43
+ );
44
+ }
45
+
34
46
  /**
35
47
  * Keeps `element`'s content box the width it is right now, across a scroll
36
48
  * lock that is about to hide the document's scrollbar.
@@ -40,8 +52,8 @@ export interface ScrollbarGutterHold {
40
52
  * ScrollbarGutterHold.release} on unlock:
41
53
  *
42
54
  * ```
43
- * const hold = holdScrollbarGutter(document.body);
44
- * body.style.position = 'fixed';
55
+ * const hold = holdScrollbarGutter(document.documentElement);
56
+ * document.documentElement.style.overflow = 'hidden';
45
57
  * hold.settle();
46
58
  * ```
47
59
  *
@@ -56,28 +68,37 @@ export function holdScrollbarGutter(element: HTMLElement): ScrollbarGutterHold {
56
68
  const root = document.documentElement;
57
69
  const viewportWidth = root.clientWidth;
58
70
 
59
- // 0 means "no layout to measure" (jsdom, and any non-visual environment),
60
- // not "the scrollbar is as wide as the window".
61
- if (viewportWidth === 0) {
71
+ // 0 means that there is no layout to measure, as in jsdom. An overlay
72
+ // scrollbar takes no space, so there is nothing to hold. A gutter held open
73
+ // on such a page would add space that was never there.
74
+ if (viewportWidth === 0 || window.innerWidth <= viewportWidth) {
62
75
  return NOOP;
63
76
  }
64
77
 
65
- const previousGutter = root.style.scrollbarGutter;
78
+ if (supportsScrollbarGutter()) {
79
+ // The gutter holds the width by construction, so the lock forces no second
80
+ // layout. Each hold is a stacked claim, so one release keeps the gutter
81
+ // that another hold still needs.
82
+ let releaseGutter: (() => void) | null = null;
83
+ return {
84
+ settle() {
85
+ releaseGutter ??= claimRootScrollStyle({scrollbarGutter: 'stable'});
86
+ },
87
+ release() {
88
+ releaseGutter?.();
89
+ releaseGutter = null;
90
+ },
91
+ };
92
+ }
93
+
94
+ // An engine without `scrollbar-gutter`: measure the element now, again
95
+ // once the lock's styles apply, and pad away what it grew. This is the one
96
+ // path that reads layout after a write.
66
97
  const previousPadding = element.style.paddingRight;
67
98
  const widthBefore = element.getBoundingClientRect().width;
68
-
69
- let heldGutter = false;
70
99
  let padded = false;
71
100
  let settled = false;
72
101
 
73
- // Only when a space-taking scrollbar is actually there. Holding the gutter
74
- // open on a page that never had one would carve out 15px that was never
75
- // reserved — the same shift, in the other direction.
76
- if (window.innerWidth > viewportWidth) {
77
- root.style.scrollbarGutter = 'stable';
78
- heldGutter = true;
79
- }
80
-
81
102
  return {
82
103
  settle() {
83
104
  if (settled) {
@@ -86,9 +107,7 @@ export function holdScrollbarGutter(element: HTMLElement): ScrollbarGutterHold {
86
107
  settled = true;
87
108
 
88
109
  // What the lock actually did to this element, rather than what we
89
- // assumed it would do. 0 on any engine where the gutter held — and on a
90
- // page that already sets `scrollbar-gutter: stable` itself, where the
91
- // scrollbar was never taking the space back.
110
+ // assumed it would do.
92
111
  const grew = element.getBoundingClientRect().width - widthBefore;
93
112
  if (grew <= 0) {
94
113
  return;
@@ -105,10 +124,6 @@ export function holdScrollbarGutter(element: HTMLElement): ScrollbarGutterHold {
105
124
  element.style.paddingRight = previousPadding;
106
125
  padded = false;
107
126
  }
108
- if (heldGutter) {
109
- root.style.scrollbarGutter = previousGutter;
110
- heldGutter = false;
111
- }
112
127
  },
113
128
  };
114
129
  }
@@ -0,0 +1,224 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useActionGroupTracking.ts
7
+ * @input A ref to a group of sibling actions, the actions' selector, and the
8
+ * component's tracking constants
9
+ * @output Exports useActionGroupTracking and ActionGroupTrackingOptions
10
+ * @position Internal hook, not exported from the hooks entry. A long press
11
+ * drives the shared action-group tracker (hooks/actionGroupTracker.ts) for
12
+ * a group that a held pointer slides across. AlertDialog consumes it.
13
+ *
14
+ * SYNC: When modified, update useActionGroupTracking.test.tsx
15
+ */
16
+
17
+ import {useEffect, useRef, useState, type RefObject} from 'react';
18
+ import {isActive} from '../gestures/GestureRecognizer';
19
+ import {LongPressGestureRecognizer} from '../gestures/LongPressGestureRecognizer';
20
+ import {lockSelection} from '../utils/selectionLock';
21
+ import type {GestureTouch, PointerKind} from '../gestures/types';
22
+ import {useGestureRecognizer} from '../gestures/useGestureRecognizer';
23
+ import {UIKIT_PRESS} from '../motion/uikit/gestures';
24
+ import {isIosWebKit} from '../utils/touchQueries';
25
+ import {createActionGroupTracker} from './actionGroupTracker';
26
+ import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
27
+
28
+ export interface ActionGroupTrackingOptions {
29
+ /** Selects the actions inside the tracked element. */
30
+ itemSelector: string;
31
+ /** How long after touch-down the touched action highlights, ms. */
32
+ highlightOnsetMs: number;
33
+ /**
34
+ * How far outside an action a finger keeps it highlighted, px. A mouse or a
35
+ * pen hit-tests the actions' exact rects.
36
+ */
37
+ highlightExpansion: number;
38
+ /** Pointers that are tracked; others keep the browser's click. @default every pointer */
39
+ pointerTypes?: ReadonlyArray<PointerKind>;
40
+ /** A press whose target this rejects is not tracked. */
41
+ shouldTrack?: (target: unknown) => boolean;
42
+ /** Off, nothing is attached and nothing is tracked. @default true */
43
+ isEnabled?: boolean;
44
+ /**
45
+ * Let the gesture host write the group's `touch-action` and refuse a text
46
+ * selection while a finger or a pen holds it.
47
+ * @default true
48
+ */
49
+ manageStyle?: boolean;
50
+ /** Runs the action under the finger at the lift. @default its own click */
51
+ onActivate?: (item: HTMLElement) => void;
52
+ }
53
+
54
+ const PRESS = UIKIT_PRESS;
55
+
56
+ /** The ref handed to the recognizer while tracking is off: no element. */
57
+ const DETACHED: RefObject<Element | null> = {current: null};
58
+
59
+ const EVERY_POINTER: ReadonlyArray<PointerKind> = ['touch', 'pen', 'mouse'];
60
+
61
+ /**
62
+ * The group's press: a long press that a second finger on the group ends with
63
+ * nothing acting. A plain long press ignores a second finger.
64
+ */
65
+ class ActionGroupPress extends LongPressGestureRecognizer {
66
+ protected override acceptsTouch(touch: GestureTouch): boolean {
67
+ if (isActive(this.state)) {
68
+ this.setState('cancelled');
69
+ return false;
70
+ }
71
+ return super.acceptsTouch(touch);
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Track a held pointer on the group behind `ref` across the actions inside
77
+ * it, through the shared action-group tracker.
78
+ */
79
+ export function useActionGroupTracking(
80
+ ref: RefObject<HTMLElement | null>,
81
+ options: ActionGroupTrackingOptions,
82
+ ): ActionGroupPress {
83
+ const optionsRef = useRef(options);
84
+ // Keeps the recognizer's delegate and the tracker, which run outside
85
+ // render, reading the latest options.
86
+ useIsomorphicLayoutEffect(() => {
87
+ optionsRef.current = options;
88
+ });
89
+ // The pointer that started the current press. Only a finger gets the hit
90
+ // expansion; a mouse or a pen hit-tests the actions' exact rects.
91
+ const pointerRef = useRef<PointerKind>('touch');
92
+ const landedRef = useRef<Node | null>(null);
93
+ const [tracker] = useState(() =>
94
+ createActionGroupTracker(() => ({
95
+ roots: () => [ref.current],
96
+ itemSelector: optionsRef.current.itemSelector,
97
+ highlightExpansion:
98
+ pointerRef.current === 'touch'
99
+ ? optionsRef.current.highlightExpansion
100
+ : 0,
101
+ onActivate: optionsRef.current.onActivate,
102
+ // The browser's own click for a press the group ran is taken, so the
103
+ // action runs once. The gesture host swallows it for a press it claims.
104
+ // This covers one it does not claim, a mouse under a coarse pointer.
105
+ swallowsNativeClick: true,
106
+ })),
107
+ );
108
+ const isEnabled = options.isEnabled ?? true;
109
+ // Synchronizes the tracker with tracking on and mounted. Turning tracking
110
+ // off, or unmounting, drops a tracked press and ends its release fades.
111
+ // The host reports no cancellation to a disabled recognizer, and the lift
112
+ // that runs an action often closes the owner before its fade ends.
113
+ useEffect(
114
+ () => () => {
115
+ tracker.cancel();
116
+ tracker.dispose();
117
+ },
118
+ [tracker, isEnabled],
119
+ );
120
+
121
+ return useGestureRecognizer(
122
+ isEnabled ? ref : DETACHED,
123
+ () =>
124
+ new ActionGroupPress({
125
+ name: 'ActionGroupTracking',
126
+ minimumPressDuration: options.highlightOnsetMs,
127
+ allowableMovement: Number.POSITIVE_INFINITY,
128
+ allowedPointerTypes: options.pointerTypes ?? EVERY_POINTER,
129
+ delaysTouchesBegan: true,
130
+ // The hold picks an action, so a held finger or pen starts no text
131
+ // selection and opens no callout while down. A long press brings this
132
+ // lock by default; this hold has no minimum duration, so it names it.
133
+ selectionLock: lockSelection,
134
+ shouldReceiveTouch: (recognizer, touch) => {
135
+ if (recognizer.numberOfTouches === 0) {
136
+ pointerRef.current = touch.pointerType;
137
+ const target = touch.target as Node | null;
138
+ landedRef.current =
139
+ typeof target?.nodeType === 'number' ? target : null;
140
+ }
141
+ return receiveTouch(recognizer, touch, optionsRef.current);
142
+ },
143
+ }),
144
+ recognizer => {
145
+ switch (recognizer.state) {
146
+ case 'began': {
147
+ const {x, y} = recognizer.location();
148
+ tracker.begin(x, y, {landed: landedRef.current});
149
+ break;
150
+ }
151
+ case 'changed': {
152
+ const {x, y} = recognizer.location();
153
+ tracker.move(x, y);
154
+ break;
155
+ }
156
+ case 'ended': {
157
+ const doc = ref.current?.ownerDocument;
158
+ const focusedBefore = doc?.activeElement ?? null;
159
+ const beganOn = tracker.beganOn;
160
+ // Whether a click on the lifted action would focus it. A mouse's or
161
+ // a pen's pointerdown already gave the engine's answer, on the action
162
+ // it began on. A tap focuses on a later mousedown, which the claimed
163
+ // touch cancels, so the platform answers for a finger.
164
+ // iOS WebKit focuses no tapped button; Chromium and Firefox do.
165
+ const clickFocuses =
166
+ pointerRef.current === 'touch'
167
+ ? !isIosWebKit(doc?.defaultView)
168
+ : beganOn != null && focusedBefore === beganOn;
169
+ const lifted = tracker.end();
170
+ // The lift runs the action's own click(), which moves no focus. So
171
+ // focus moves to the lifted action, unless its click moved focus.
172
+ if (
173
+ clickFocuses &&
174
+ lifted != null &&
175
+ lifted.isConnected &&
176
+ doc?.activeElement === focusedBefore &&
177
+ focusedBefore !== lifted
178
+ ) {
179
+ lifted.focus({preventScroll: true, focusVisible: false});
180
+ }
181
+ break;
182
+ }
183
+ case 'cancelled':
184
+ tracker.cancel();
185
+ break;
186
+ case 'possible':
187
+ case 'failed':
188
+ // Listeners are not called for these.
189
+ break;
190
+ }
191
+ },
192
+ {
193
+ isEnabled,
194
+ manageStyle: options.manageStyle ?? true,
195
+ actionGroup: true,
196
+ },
197
+ );
198
+ }
199
+
200
+ /**
201
+ * The recognizer's should-receive delegate. It also picks the press's clock.
202
+ * Inside a scroller the press waits the content-touch delay and fails past
203
+ * the slop, so the scroller takes a flick. Elsewhere it begins at once, with
204
+ * no movement limit.
205
+ */
206
+ function receiveTouch(
207
+ recognizer: LongPressGestureRecognizer,
208
+ touch: GestureTouch,
209
+ options: ActionGroupTrackingOptions,
210
+ ): boolean {
211
+ if (options.shouldTrack?.(touch.target) === false) {
212
+ return false;
213
+ }
214
+ if (recognizer.numberOfTouches === 0) {
215
+ const isInsideScroller = touch.scroll?.isInsideScroller === true;
216
+ recognizer.minimumPressDuration = isInsideScroller
217
+ ? PRESS.contentTouchDelay.value
218
+ : options.highlightOnsetMs;
219
+ recognizer.allowableMovement = isInsideScroller
220
+ ? PRESS.slop.value
221
+ : Number.POSITIVE_INFINITY;
222
+ }
223
+ return true;
224
+ }
@@ -0,0 +1,109 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** @type {import('@astryxdesign/cli/authoring').HookDoc} */
4
+ export const docs = {
5
+ name: 'useAnimator',
6
+ displayName: 'useAnimator',
7
+ keywords: [
8
+ 'animate',
9
+ 'animation',
10
+ 'animator',
11
+ 'spring',
12
+ 'decay',
13
+ 'momentum',
14
+ 'fling',
15
+ 'motion',
16
+ 'transform',
17
+ 'opacity',
18
+ 'drag',
19
+ 'card',
20
+ ],
21
+ params: [
22
+ {
23
+ name: 'ref',
24
+ type: 'RefObject<HTMLElement | null>',
25
+ description:
26
+ 'The ref of the one element to animate, the same ref you pass to the element: another hook, such as a gesture hook, can take it too, so a drag and an animation share one element. After every render the animator follows the element behind it. When the element unmounts its motion stops and its values return to rest, so a remount starts at rest, and so does a node that replaces it. Before the element mounts, and while it is unmounted, every call does nothing and `animate` and `decay` resolve at once.',
27
+ required: true,
28
+ },
29
+ ],
30
+ returns: [
31
+ {
32
+ name: 'animator',
33
+ type: 'AnimatorHandle',
34
+ description:
35
+ "The element's animator, the same object on every render: `animate(target, {velocity?})` springs channels to a target on the state-change motion Astryx's components use, `decay(velocity)` coasts them from a release velocity, `set(values)` jumps them, `get()` and `getVelocity()` read them, and `stop()` halts them. The channels are `x` and `y` (px), `scale` (1 at the element's size), `rotate` (degrees) and `opacity` (0 to 1). `animate` and `decay` return a promise that resolves when the motion ends. Calling it never re-renders the component. Calls before the ref attaches do nothing and resolve at once.",
36
+ },
37
+ ],
38
+ usage: {
39
+ description:
40
+ "Animates one element with the motion Astryx's own components use. Call `animator.animate` to spring an element to new values on the state-change motion, `animator.decay` to fling it with the momentum of a released scroll view, and `animator.set` to move it directly, so a card can follow a finger, snap back and be thrown away. 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. Outside React, use `createAnimator`.",
41
+ bestPractices: [
42
+ {
43
+ guidance: true,
44
+ description:
45
+ 'Call the animator from event handlers and effects: it lives outside render, so animating never re-renders the component.',
46
+ },
47
+ {
48
+ guidance: true,
49
+ description:
50
+ 'Start every `animate` that follows a drag with the release velocity, so the element carries on as it was thrown.',
51
+ },
52
+ {
53
+ guidance: true,
54
+ description:
55
+ 'Reach every state an animation shows without the animation too: a key, a button or a menu item that calls the same code.',
56
+ },
57
+ {
58
+ guidance: false,
59
+ description:
60
+ 'Keep the animated values in React state: read them with `animator.get()` when you need them.',
61
+ },
62
+ ],
63
+ accessibility: [
64
+ {
65
+ name: 'Keyboard and assistive technology',
66
+ category: 'Keyboard',
67
+ description:
68
+ '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.',
69
+ },
70
+ {
71
+ name: 'Reduce Motion',
72
+ category: 'Content',
73
+ criterion: '2.3.3 Animation from Interactions',
74
+ description:
75
+ '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.',
76
+ },
77
+ ],
78
+ },
79
+ relatedHooks: ['useAnimatedLayout'],
80
+ importPath: '@astryxdesign/core/hooks',
81
+ category: 'interaction',
82
+ };
83
+
84
+ /** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
85
+ export const docsDense = {
86
+ description:
87
+ "Animates the element behind ref (x, y, scale, rotate, opacity) with Astryx's motion; returns the animator.",
88
+ paramDescriptions: {
89
+ ref: 'The element ref; share it with a gesture hook to drag and animate one element.',
90
+ },
91
+ returnDescriptions: {
92
+ animator:
93
+ 'animate(target, {velocity?}), decay(velocity), set, get, getVelocity, stop; stable, never re-renders.',
94
+ },
95
+ usage: {
96
+ description:
97
+ '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.',
98
+ bestPractices: [
99
+ {
100
+ guidance: true,
101
+ description: 'Pass the release velocity to animate after a drag.',
102
+ },
103
+ {
104
+ guidance: false,
105
+ description: 'Keep animated values in state; read animator.get().',
106
+ },
107
+ ],
108
+ },
109
+ };
@@ -0,0 +1,67 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useAnimator.ts
7
+ * @input React (useState), the element ref the caller owns, the public
8
+ * animator factory (animator/createAnimator.ts) and useAttachment
9
+ * @output Exports `useAnimator(ref)`: the public animator for the element
10
+ * behind `ref`
11
+ * @position Public hook, exported from `@astryxdesign/core/hooks`. A thin
12
+ * wrapper over `createAnimator` with no behavior of its own.
13
+ *
14
+ * SYNC: When modified, update:
15
+ * - /packages/core/src/hooks/useAnimator.test.tsx
16
+ * - /packages/core/src/hooks/useAnimator.doc.mjs
17
+ */
18
+
19
+ import {useState, type RefObject} from 'react';
20
+ import {
21
+ createAttachableAnimator,
22
+ type AnimatorHandle,
23
+ } from '../animator/createAnimator';
24
+ import {useAttachment} from './useAttachment';
25
+
26
+ /**
27
+ * Animates the element behind `ref` with the motion Core uses. Call
28
+ * `animate`, `decay`, `set`, `get`, `getVelocity` or `stop` on the returned
29
+ * animator from event handlers and effects. Pass the same `ref` to a gesture
30
+ * hook to drag and animate one element.
31
+ *
32
+ * The hook makes the animator once, and animating never re-renders the
33
+ * component. After each commit, the animator follows the element behind
34
+ * `ref`, also a node that replaces it. An unmount stops running motion and
35
+ * drops the values. A remount, or a node that replaces the element, starts
36
+ * at rest. While no element is attached, every call does nothing, and
37
+ * `animate` and `decay` resolve at once.
38
+ *
39
+ * @example
40
+ * ```
41
+ * const ref = useRef<HTMLDivElement>(null);
42
+ * const animator = useAnimator(ref);
43
+ * return (
44
+ * <div ref={ref} onClick={() => animator.animate({scale: 1.2})}>
45
+ * Card
46
+ * </div>
47
+ * );
48
+ * ```
49
+ */
50
+ export function useAnimator(
51
+ ref: RefObject<HTMLElement | null>,
52
+ ): AnimatorHandle {
53
+ const [{handle, attach}] = useState(() => {
54
+ const {animator, attach: attachElement} = createAttachableAnimator();
55
+ // The handle without `destroy`: the hook owns the element's lifetime.
56
+ const {destroy: _destroy, ...handle} = animator;
57
+ return {
58
+ handle,
59
+ attach: (element: HTMLElement) => {
60
+ attachElement(element);
61
+ return () => attachElement(null);
62
+ },
63
+ };
64
+ });
65
+ useAttachment(ref, attach, null);
66
+ return handle;
67
+ }
@@ -135,6 +135,7 @@ export function useAnnounceRenderedText(
135
135
  );
136
136
  const isFirstRunRef = useRef(true);
137
137
 
138
+ // Syncs the live region with the rendered text.
138
139
  // No dependency array: the text lives in the DOM, and a caller can change it
139
140
  // without a prop that this hook sees. One text read per render is cheap, and
140
141
  // the dedupe below makes later renders no-ops.
@@ -9,7 +9,7 @@
9
9
  * @output Exports useAttachment and useAttachmentPair (two elements): they keep
10
10
  * the attach function bound to the nodes the refs hold across commits
11
11
  * @position Internal React helper, not in hooks/index.ts: the one attach and
12
- * release lifecycle of the gesture hooks and the pager
12
+ * release lifecycle of the gesture hooks, the pager and useAnimator
13
13
  *
14
14
  * SYNC: When modified, update gestures/__tests__/useGestureRecognizer.test.tsx,
15
15
  * gestures/__tests__/useFingerScroll.test.tsx and
@@ -160,6 +160,7 @@ export function useAutoMediaMode(
160
160
  const {tokens} = useTheme();
161
161
  const lastRef = useRef<{background: string; tokens: unknown} | null>(null);
162
162
 
163
+ // Syncs the media mode with the painted color behind the element.
163
164
  // No dependency array. A surface color is a painted value, and it changes
164
165
  // when a prop on some ancestor changes. No dependency that this hook can
165
166
  // name catches that. So the measurement runs on each render, and it skips
@@ -45,6 +45,8 @@ export function useBusyAnnouncement(
45
45
  // Or how to take back its write inside a modal, wherever the modal moves
46
46
  // it, until it settles.
47
47
  const modalMessageRef = useRef<WithdrawAnnouncement | null>(null);
48
+ // Syncs the live region with `isBusy`. When it becomes true, the busy message
49
+ // is announced one frame later.
48
50
  useEffect(() => {
49
51
  if (!isBusy) {
50
52
  hasAnnouncedRef.current = false;
@@ -40,6 +40,8 @@ export function useDevWarning(
40
40
  condition: boolean = true,
41
41
  ): void {
42
42
  const hasWarnedRef = useRef(false);
43
+ // The console is outside React. The ref prints the warning one time, also
44
+ // when StrictMode runs the Effect again.
43
45
  useEffect(() => {
44
46
  if (condition && !hasWarnedRef.current) {
45
47
  hasWarnedRef.current = true;
@@ -50,6 +50,8 @@ export function hasActiveFocusTrapEscape(): boolean {
50
50
  * second dismissal owner.
51
51
  */
52
52
  export function useFocusTrapEscapeCompatibilitySignal(isActive: boolean): void {
53
+ // Syncs the module count of active Escape traps with `isActive`. The
54
+ // compatibility signal reads this count.
53
55
  useEffect(() => {
54
56
  if (!isActive) {
55
57
  return;
@@ -67,16 +67,16 @@ export const docs = {
67
67
  },
68
68
  {
69
69
  name: 'options.onPageUp',
70
- type: '() => void',
70
+ type: '(event: React.KeyboardEvent) => void',
71
71
  description:
72
- 'Callback for Page Up key (e.g., navigate to previous month in calendars).',
72
+ 'Callback for Page Up key (e.g., navigate to previous month in calendars). Receives the key event, so `event.shiftKey` can select a larger step, such as a year.',
73
73
  required: false,
74
74
  },
75
75
  {
76
76
  name: 'options.onPageDown',
77
- type: '() => void',
77
+ type: '(event: React.KeyboardEvent) => void',
78
78
  description:
79
- 'Callback for Page Down key (e.g., navigate to next month in calendars).',
79
+ 'Callback for Page Down key (e.g., navigate to next month in calendars). Receives the key event, so `event.shiftKey` can select a larger step, such as a year.',
80
80
  required: false,
81
81
  },
82
82
  {
@@ -172,9 +172,9 @@ export const docsDense = {
172
172
  'options.onNavigateAfter':
173
173
  'callback when navigation would go after last cell. Receives column index + offset.',
174
174
  'options.onPageUp':
175
- 'callback for Page Up key (e.g. navigate to previous month in calendars).',
175
+ 'callback for Page Up key (e.g. previous month in calendars); receives the key event (shiftKey → e.g. a year).',
176
176
  'options.onPageDown':
177
- 'callback for Page Down key (e.g. navigate to next month in calendars).',
177
+ 'callback for Page Down key (e.g. next month in calendars); receives the key event (shiftKey → e.g. a year).',
178
178
  'options.hasRovingTabIndex':
179
179
  'own a single roving tab stop across the grid (one focus target tabindex=0, rest -1); repaired on render + moved with arrows. Attach handleFocus to onFocus. default false.',
180
180
  },
@@ -80,14 +80,16 @@ export interface UseGridFocusOptions {
80
80
  onNavigateAfter?: (column: number, offset: number) => void;
81
81
 
82
82
  /**
83
- * Callback for Page Up key (e.g., previous month).
83
+ * Callback for Page Up key (e.g., previous month). It receives the key
84
+ * event, so `event.shiftKey` can select a larger step, such as a year.
84
85
  */
85
- onPageUp?: () => void;
86
+ onPageUp?: (event: React.KeyboardEvent) => void;
86
87
 
87
88
  /**
88
- * Callback for Page Down key (e.g., next month).
89
+ * Callback for Page Down key (e.g., next month). It receives the key
90
+ * event, so `event.shiftKey` can select a larger step, such as a year.
89
91
  */
90
- onPageDown?: () => void;
92
+ onPageDown?: (event: React.KeyboardEvent) => void;
91
93
 
92
94
  /**
93
95
  * Roving-tabindex ownership. When true, the hook manages a single tab stop
@@ -157,7 +159,8 @@ export interface UseGridFocusReturn<T extends HTMLElement = HTMLElement> {
157
159
  * - End: Move to last cell in row
158
160
  * - Ctrl+Home: Move to first cell in grid
159
161
  * - Ctrl+End: Move to last cell in grid
160
- * - Page Up/Down: Custom callbacks (e.g., month navigation)
162
+ * - Page Up/Down: Custom callbacks that receive the key event (e.g., month
163
+ * navigation, or a year with Shift)
161
164
  *
162
165
  * The hook enumerates ALL cells matched by `cellSelector` in DOM order and
163
166
  * computes row/column over that full set, preserving the true grid geometry
@@ -571,11 +574,11 @@ export function useGridFocus<T extends HTMLElement = HTMLElement>(
571
574
  break;
572
575
 
573
576
  case 'PageUp':
574
- onPageUp?.();
577
+ onPageUp?.(e);
575
578
  break;
576
579
 
577
580
  case 'PageDown':
578
- onPageDown?.();
581
+ onPageDown?.(e);
579
582
  break;
580
583
 
581
584
  default:
@@ -157,6 +157,8 @@ export function useHotkeys(hotkeys: Hotkey[]): void {
157
157
  hotkeysRef.current = hotkeys;
158
158
  });
159
159
 
160
+ // Syncs a window keydown listener with this mount. The listener runs the
161
+ // first hotkey that matches.
160
162
  useEffect(() => {
161
163
  const isApple = isApplePlatform();
162
164