@astryxdesign/core 0.7.7 → 0.7.8-canary.0588a13

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 (798) 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 +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  10. package/dist/BottomSheet/BottomSheetPanel.js +55 -18
  11. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  12. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  13. package/dist/BottomSheet/bottomSheetStack.js +1 -1
  14. package/dist/BottomSheet/useSheetGestures.d.ts +3 -1
  15. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  16. package/dist/BottomSheet/useSheetGestures.js +16 -1
  17. package/dist/Button/Button.d.ts.map +1 -1
  18. package/dist/Button/Button.js +17 -1
  19. package/dist/Calendar/Calendar.d.ts.map +1 -1
  20. package/dist/Calendar/Calendar.js +18 -22
  21. package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
  22. package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
  23. package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
  24. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  25. package/dist/Calendar/hooks/useCalendarDays.js +2 -10
  26. package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
  27. package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
  28. package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +2 -0
  31. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  32. package/dist/Chat/ChatComposerInput.js +6 -1
  33. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  34. package/dist/Chat/ChatMessageList.js +2 -1
  35. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  36. package/dist/Chat/useChatDictation.js +2 -0
  37. package/dist/Chat/useChatNewMessages.js +1 -1
  38. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  39. package/dist/Chat/useChatStreamScroll.js +2 -0
  40. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  41. package/dist/Chat/useSpeechRecognition.js +3 -0
  42. package/dist/Chat/useTriggerMenu.js +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  44. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  45. package/dist/CheckboxList/CheckboxList.d.ts +20 -2
  46. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  47. package/dist/CheckboxList/CheckboxList.js +12 -4
  48. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  49. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  50. package/dist/CheckboxList/CheckboxListContext.js +2 -1
  51. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  52. package/dist/CheckboxList/CheckboxListItem.js +14 -2
  53. package/dist/CheckboxList/requiredGroup.d.ts +22 -0
  54. package/dist/CheckboxList/requiredGroup.d.ts.map +1 -0
  55. package/dist/CheckboxList/requiredGroup.js +52 -0
  56. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  57. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  58. package/dist/CodeBlock/CodeBlock.js +28 -11
  59. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  60. package/dist/CommandPalette/CommandPalette.js +2 -0
  61. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  62. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  63. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  64. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  65. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  66. package/dist/ContextMenu/ContextMenu.js +2 -2
  67. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  68. package/dist/DateInput/MonthScroller.js +5 -2
  69. package/dist/DateInput/PickerWheel.d.ts +19 -0
  70. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  71. package/dist/DateInput/PickerWheel.js +646 -0
  72. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  73. package/dist/DateInput/TouchDateField.js +9 -30
  74. package/dist/DateInput/Wheel.d.ts +18 -37
  75. package/dist/DateInput/Wheel.d.ts.map +1 -1
  76. package/dist/DateInput/Wheel.js +133 -120
  77. package/dist/DateInput/datePickerTouch.d.ts +13 -0
  78. package/dist/DateInput/datePickerTouch.d.ts.map +1 -0
  79. package/dist/DateInput/datePickerTouch.js +14 -0
  80. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  81. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  82. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  83. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  84. package/dist/DateInput/usePointerDragScroll.js +2 -0
  85. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  86. package/dist/DateInput/useScrollSettle.js +3 -0
  87. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  88. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  89. package/dist/DateInput/useWheelListbox.js +88 -0
  90. package/dist/DateInput/wheelOptions.d.ts +94 -0
  91. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  92. package/dist/DateInput/wheelOptions.js +110 -0
  93. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  94. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  95. package/dist/DateInput/wheelPhysics.js +341 -0
  96. package/dist/DateInput/wheelStrip.d.ts +92 -0
  97. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  98. package/dist/DateInput/wheelStrip.js +258 -0
  99. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  100. package/dist/DateTimeInput/TouchDateTimeField.js +70 -127
  101. package/dist/Dialog/Dialog.d.ts.map +1 -1
  102. package/dist/Dialog/Dialog.js +9 -32
  103. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  104. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  105. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  106. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  107. package/dist/Field/Field.js +2 -2
  108. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  109. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  110. package/dist/FormLayout/FormLayout.d.ts +5 -1
  111. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  112. package/dist/HoverCard/HoverCard.d.ts +6 -4
  113. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  114. package/dist/HoverCard/HoverCard.js +48 -3
  115. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  116. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  117. package/dist/HoverCard/useHoverCard.js +26 -34
  118. package/dist/Icon/Icon.d.ts +5 -1
  119. package/dist/Icon/Icon.d.ts.map +1 -1
  120. package/dist/Icon/Icon.js +20 -3
  121. package/dist/InfoTip/InfoTip.d.ts +5 -5
  122. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  123. package/dist/InfoTip/InfoTip.js +58 -19
  124. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  125. package/dist/Item/useSwipeAction.js +3 -0
  126. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  127. package/dist/Layer/modalOutlet.js +2 -0
  128. package/dist/Layer/outsidePress.d.ts.map +1 -1
  129. package/dist/Layer/outsidePress.js +1 -0
  130. package/dist/Layer/useLayer.d.ts.map +1 -1
  131. package/dist/Layer/useLayer.js +4 -1
  132. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  133. package/dist/Layer/useLayerDismissal.js +3 -0
  134. package/dist/Layer/useTouchTrigger.d.ts +13 -7
  135. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  136. package/dist/Layer/useTouchTrigger.js +20 -6
  137. package/dist/Layout/index.d.ts +1 -1
  138. package/dist/Layout/index.d.ts.map +1 -1
  139. package/dist/Layout/index.js +1 -1
  140. package/dist/Layout/layoutReset.js +1 -1
  141. package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
  142. package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
  143. package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
  144. package/dist/Layout/padding.stylex.d.ts +5 -129
  145. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  146. package/dist/Layout/padding.stylex.js +9 -143
  147. package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
  148. package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
  149. package/dist/Layout/paddingStyles.stylex.js +99 -0
  150. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  151. package/dist/Lightbox/Lightbox.js +20 -1
  152. package/dist/MobileNav/MobileNav.d.ts +3 -2
  153. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  154. package/dist/MobileNav/MobileNav.js +10 -26
  155. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  156. package/dist/MultiSelector/MultiSelector.js +2 -1
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +2 -1
  159. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  160. package/dist/Outline/useOutlineFromDOM.js +3 -0
  161. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  162. package/dist/Outline/useScrollSpy.js +3 -0
  163. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  164. package/dist/OverflowList/OverflowList.js +3 -0
  165. package/dist/Overlay/Overlay.d.ts.map +1 -1
  166. package/dist/Overlay/Overlay.js +7 -2
  167. package/dist/Popover/Popover.d.ts.map +1 -1
  168. package/dist/Popover/Popover.js +6 -0
  169. package/dist/Popover/usePopover.js +2 -2
  170. package/dist/PowerSearch/PowerSearch.d.ts +41 -4
  171. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  172. package/dist/PowerSearch/PowerSearch.js +441 -134
  173. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +125 -0
  174. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  175. package/dist/PowerSearch/PowerSearchBottomSheet.js +2041 -0
  176. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  177. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  178. package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
  179. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  180. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  181. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  182. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  183. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  184. package/dist/PowerSearch/PowerSearchToken.js +3 -2
  185. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  186. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  187. package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
  188. package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
  189. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  190. package/dist/PowerSearch/formatFilterValue.js +31 -23
  191. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  192. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  193. package/dist/PowerSearch/formatTokenValue.js +161 -0
  194. package/dist/PowerSearch/index.d.ts +1 -1
  195. package/dist/PowerSearch/index.d.ts.map +1 -1
  196. package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
  197. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  198. package/dist/PowerSearch/powerSearchDateZone.js +57 -0
  199. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  200. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  201. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  202. package/dist/PowerSearch/types.d.ts +8 -1
  203. package/dist/PowerSearch/types.d.ts.map +1 -1
  204. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  205. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  206. package/dist/RadioList/RadioList.d.ts.map +1 -1
  207. package/dist/RadioList/RadioList.js +3 -2
  208. package/dist/RadioList/RadioListItem.d.ts +1 -1
  209. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  210. package/dist/RadioList/RadioListItem.js +5 -3
  211. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  212. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  213. package/dist/Resizable/ResizeHandle.js +116 -92
  214. package/dist/Resizable/createResizable.d.ts +199 -0
  215. package/dist/Resizable/createResizable.d.ts.map +1 -0
  216. package/dist/Resizable/createResizable.js +733 -0
  217. package/dist/Resizable/separatorAttributes.d.ts +45 -0
  218. package/dist/Resizable/separatorAttributes.d.ts.map +1 -0
  219. package/dist/Resizable/separatorAttributes.js +35 -0
  220. package/dist/Resizable/useResizable.d.ts +3 -3
  221. package/dist/Resizable/useResizable.d.ts.map +1 -1
  222. package/dist/Resizable/useResizable.js +252 -459
  223. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  224. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  225. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  226. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  227. package/dist/SelectableCard/SelectableCard.js +36 -11
  228. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  229. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  230. package/dist/SelectableCard/selectableCardInput.js +20 -0
  231. package/dist/Selector/Selector.d.ts.map +1 -1
  232. package/dist/Selector/Selector.js +7 -9
  233. package/dist/SideNav/SideNav.d.ts.map +1 -1
  234. package/dist/SideNav/SideNav.js +36 -5
  235. package/dist/Slider/Slider.d.ts.map +1 -1
  236. package/dist/Slider/Slider.js +16 -11
  237. package/dist/Slider/sliderTouchController.js +2 -2
  238. package/dist/Spinner/Spinner.d.ts +1 -1
  239. package/dist/Spinner/Spinner.d.ts.map +1 -1
  240. package/dist/Spinner/Spinner.js +60 -58
  241. package/dist/Stepper/Stepper.d.ts.map +1 -1
  242. package/dist/Stepper/Stepper.js +10 -15
  243. package/dist/Switch/Switch.d.ts.map +1 -1
  244. package/dist/Switch/Switch.js +4 -10
  245. package/dist/Switch/useSwitchTouch.js +4 -4
  246. package/dist/Table/BaseTable.d.ts.map +1 -1
  247. package/dist/Table/BaseTable.js +29 -8
  248. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  249. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  250. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  251. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  252. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +12 -0
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +17 -3
  255. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  256. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  257. package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
  258. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  259. package/dist/Table/plugins/tree/useTableTreeData.js +27 -14
  260. package/dist/TextArea/TextArea.d.ts.map +1 -1
  261. package/dist/TextArea/TextArea.js +2 -1
  262. package/dist/TextInput/TextInput.d.ts +2 -2
  263. package/dist/TextInput/TextInput.d.ts.map +1 -1
  264. package/dist/TextInput/TextInput.js +12 -8
  265. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  266. package/dist/TimeInput/TimeInput.js +2 -0
  267. package/dist/TimeInput/TimeWheels.d.ts +32 -0
  268. package/dist/TimeInput/TimeWheels.d.ts.map +1 -0
  269. package/dist/TimeInput/TimeWheels.js +144 -0
  270. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  271. package/dist/TimeInput/TouchTimeField.js +63 -116
  272. package/dist/TimeInput/timeWheelRules.d.ts +124 -0
  273. package/dist/TimeInput/timeWheelRules.d.ts.map +1 -0
  274. package/dist/TimeInput/timeWheelRules.js +277 -0
  275. package/dist/Timer/Timer.d.ts.map +1 -1
  276. package/dist/Timer/Timer.js +2 -0
  277. package/dist/Timestamp/Timestamp.js +1 -1
  278. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  279. package/dist/Timestamp/formatInstant.js +1 -23
  280. package/dist/Toast/Toast.d.ts +11 -1
  281. package/dist/Toast/Toast.d.ts.map +1 -1
  282. package/dist/Toast/Toast.js +25 -15
  283. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  284. package/dist/Toast/ToastViewport.js +97 -34
  285. package/dist/Toast/types.d.ts +9 -3
  286. package/dist/Toast/types.d.ts.map +1 -1
  287. package/dist/Toast/useToast.d.ts.map +1 -1
  288. package/dist/Toast/useToast.js +1 -0
  289. package/dist/Tokenizer/Tokenizer.d.ts +44 -46
  290. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  291. package/dist/Tokenizer/Tokenizer.js +20 -21
  292. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  293. package/dist/Tokenizer/TokenizerBottomSheet.js +12 -18
  294. package/dist/Tokenizer/index.d.ts +1 -1
  295. package/dist/Tokenizer/index.d.ts.map +1 -1
  296. package/dist/Tooltip/Tooltip.d.ts +2 -23
  297. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  298. package/dist/Tooltip/Tooltip.js +5 -29
  299. package/dist/Tooltip/useTooltip.d.ts +23 -30
  300. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  301. package/dist/Tooltip/useTooltip.js +200 -108
  302. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  303. package/dist/Typeahead/BaseTypeahead.js +27 -18
  304. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  305. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  306. package/dist/animator/createAnimator.d.ts +98 -0
  307. package/dist/animator/createAnimator.d.ts.map +1 -0
  308. package/dist/animator/createAnimator.js +259 -0
  309. package/dist/astryx.css +53 -8
  310. package/dist/gestures/GestureHost.d.ts +16 -1
  311. package/dist/gestures/GestureHost.d.ts.map +1 -1
  312. package/dist/gestures/GestureHost.js +4 -1
  313. package/dist/gestures/PressTracker.d.ts.map +1 -1
  314. package/dist/gestures/PressTracker.js +4 -3
  315. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  316. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  317. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  318. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  319. package/dist/hooks/actionGroupTracker.js +18 -7
  320. package/dist/hooks/index.d.ts +1 -0
  321. package/dist/hooks/index.d.ts.map +1 -1
  322. package/dist/hooks/index.js +1 -0
  323. package/dist/hooks/longPressDetector.d.ts +66 -0
  324. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  325. package/dist/hooks/longPressDetector.js +200 -0
  326. package/dist/hooks/pressGroupContext.d.ts +6 -0
  327. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  328. package/dist/hooks/pressGroupContext.js +20 -0
  329. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  330. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  331. package/dist/hooks/rootScrollStyles.js +207 -0
  332. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  333. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  334. package/dist/hooks/scrollLockTouchGuard.js +117 -0
  335. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  336. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  337. package/dist/hooks/scrollbarGutter.js +36 -23
  338. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  339. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  340. package/dist/hooks/useActionGroupTracking.js +174 -0
  341. package/dist/hooks/useAnimator.d.ts +41 -0
  342. package/dist/hooks/useAnimator.d.ts.map +1 -0
  343. package/dist/hooks/useAnimator.js +70 -0
  344. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  345. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  346. package/dist/hooks/useAttachment.d.ts +1 -1
  347. package/dist/hooks/useAttachment.js +1 -1
  348. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  349. package/dist/hooks/useAutoMediaMode.js +1 -0
  350. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  351. package/dist/hooks/useBusyAnnouncement.js +2 -0
  352. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  353. package/dist/hooks/useDevWarning.js +2 -0
  354. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  355. package/dist/hooks/useFocusTrap.js +2 -0
  356. package/dist/hooks/useGridFocus.d.ts +8 -5
  357. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  358. package/dist/hooks/useGridFocus.js +4 -3
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -0
  361. package/dist/hooks/useImageMode.d.ts.map +1 -1
  362. package/dist/hooks/useImageMode.js +3 -0
  363. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  364. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  365. package/dist/hooks/useInputStatusIcon.js +2 -2
  366. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  367. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
  368. package/dist/hooks/useKeyboardHint.js +1 -1
  369. package/dist/hooks/useLongPress.d.ts +8 -9
  370. package/dist/hooks/useLongPress.d.ts.map +1 -1
  371. package/dist/hooks/useLongPress.js +23 -106
  372. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  373. package/dist/hooks/useMenuHover.js +2 -0
  374. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  375. package/dist/hooks/useMenuPress.js +3 -0
  376. package/dist/hooks/useOverflow.d.ts.map +1 -1
  377. package/dist/hooks/useOverflow.js +2 -1
  378. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  379. package/dist/hooks/usePressFeedback.js +1 -0
  380. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  381. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  382. package/dist/hooks/useResolvedRequired.js +3 -0
  383. package/dist/hooks/useScrollLock.d.ts +8 -9
  384. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  385. package/dist/hooks/useScrollLock.js +50 -48
  386. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  387. package/dist/hooks/useScrollableArea.js +5 -0
  388. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  389. package/dist/hooks/useStreamingText.js +3 -0
  390. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  391. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  392. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +45 -0
  393. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  394. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  395. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  396. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  397. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  398. package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts +8 -0
  399. package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts.map +1 -0
  400. package/dist/i18n/generated-english/Resizable/createResizable.generated.js +13 -0
  401. package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.d.ts.map +1 -1
  402. package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.js +3 -1
  403. package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.d.ts.map +1 -1
  404. package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.js +3 -1
  405. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts +8 -0
  406. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts.map +1 -0
  407. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.js +17 -0
  408. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  409. package/dist/i18n/generated-locales/en.generated.js +37 -0
  410. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  411. package/dist/i18n/generated-locales/pseudo.generated.js +37 -0
  412. package/dist/index.d.ts +1 -0
  413. package/dist/index.d.ts.map +1 -1
  414. package/dist/index.js +4 -0
  415. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  416. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  417. package/dist/internal/indicatorPress.stylex.js +26 -0
  418. package/dist/internal/selectable-card.d.ts +21 -0
  419. package/dist/internal/selectable-card.d.ts.map +1 -0
  420. package/dist/internal/selectable-card.js +20 -0
  421. package/dist/internal/sheetDraft.d.ts +2 -2
  422. package/dist/internal/sheetDraft.js +2 -2
  423. package/dist/keyboard/index.d.ts +17 -0
  424. package/dist/keyboard/index.d.ts.map +1 -0
  425. package/dist/keyboard/index.js +19 -0
  426. package/dist/keyboard/keyboardHeight.d.ts +149 -0
  427. package/dist/keyboard/keyboardHeight.d.ts.map +1 -0
  428. package/dist/keyboard/keyboardHeight.js +432 -0
  429. package/dist/keyboard/keyboardLayoutGuide.d.ts +59 -0
  430. package/dist/keyboard/keyboardLayoutGuide.d.ts.map +1 -0
  431. package/dist/keyboard/keyboardLayoutGuide.js +207 -0
  432. package/dist/keyboard/keyboardModel.d.ts +93 -0
  433. package/dist/keyboard/keyboardModel.d.ts.map +1 -0
  434. package/dist/keyboard/keyboardModel.js +220 -0
  435. package/dist/keyboard/rideKeyboard.d.ts +42 -0
  436. package/dist/keyboard/rideKeyboard.d.ts.map +1 -0
  437. package/dist/keyboard/rideKeyboard.js +77 -0
  438. package/dist/keyboard/useMobileKeyboard.d.ts +61 -0
  439. package/dist/keyboard/useMobileKeyboard.d.ts.map +1 -0
  440. package/dist/keyboard/useMobileKeyboard.js +699 -0
  441. package/dist/motion/android/index.d.ts +16 -0
  442. package/dist/motion/android/index.d.ts.map +1 -0
  443. package/dist/motion/android/index.js +18 -0
  444. package/dist/motion/android/keyboard.d.ts +83 -0
  445. package/dist/motion/android/keyboard.d.ts.map +1 -0
  446. package/dist/motion/android/keyboard.js +96 -0
  447. package/dist/motion/animatedLayout.d.ts +8 -0
  448. package/dist/motion/animatedLayout.d.ts.map +1 -1
  449. package/dist/motion/animatedLayout.js +246 -53
  450. package/dist/motion/animator.d.ts +14 -14
  451. package/dist/motion/animator.d.ts.map +1 -1
  452. package/dist/motion/animator.js +45 -26
  453. package/dist/motion/frameBlock.d.ts +14 -0
  454. package/dist/motion/frameBlock.d.ts.map +1 -0
  455. package/dist/motion/frameBlock.js +16 -0
  456. package/dist/motion/progress.d.ts +88 -0
  457. package/dist/motion/progress.d.ts.map +1 -0
  458. package/dist/motion/progress.js +128 -0
  459. package/dist/motion/reducedMotion.d.ts.map +1 -1
  460. package/dist/motion/reducedMotion.js +3 -1
  461. package/dist/motion/uikit/alert.d.ts +41 -0
  462. package/dist/motion/uikit/alert.d.ts.map +1 -0
  463. package/dist/motion/uikit/alert.js +43 -0
  464. package/dist/motion/uikit/datePicker.d.ts +58 -0
  465. package/dist/motion/uikit/datePicker.d.ts.map +1 -0
  466. package/dist/motion/uikit/datePicker.js +60 -0
  467. package/dist/motion/uikit/index.d.ts +6 -4
  468. package/dist/motion/uikit/index.d.ts.map +1 -1
  469. package/dist/motion/uikit/index.js +6 -4
  470. package/dist/motion/uikit/picker.d.ts +96 -0
  471. package/dist/motion/uikit/picker.d.ts.map +1 -0
  472. package/dist/motion/uikit/picker.js +117 -0
  473. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  474. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  475. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  476. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  477. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  478. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  479. package/dist/theme/Theme.d.ts.map +1 -1
  480. package/dist/theme/Theme.js +29 -4
  481. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  482. package/dist/theme/generateThemeRules.js +14 -13
  483. package/dist/theme/motionKnobs.d.ts +4 -3
  484. package/dist/theme/motionKnobs.d.ts.map +1 -1
  485. package/dist/theme/motionKnobs.js +3 -2
  486. package/dist/theme/themeMotion.d.ts +6 -0
  487. package/dist/theme/themeMotion.d.ts.map +1 -1
  488. package/dist/theme/themeMotion.js +15 -2
  489. package/dist/theme/tokens.stylex.d.ts +3 -0
  490. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  491. package/dist/theme/tokens.stylex.js +4 -1
  492. package/dist/utils/dateParser.d.ts.map +1 -1
  493. package/dist/utils/dateParser.js +12 -0
  494. package/dist/utils/disabledInteraction.d.ts +10 -2
  495. package/dist/utils/disabledInteraction.d.ts.map +1 -1
  496. package/dist/utils/disabledInteraction.js +16 -2
  497. package/dist/utils/focusReturn.d.ts +22 -25
  498. package/dist/utils/focusReturn.d.ts.map +1 -1
  499. package/dist/utils/focusReturn.js +36 -29
  500. package/dist/utils/index.d.ts +1 -1
  501. package/dist/utils/index.d.ts.map +1 -1
  502. package/dist/utils/index.js +1 -1
  503. package/dist/utils/interactionModality.d.ts.map +1 -1
  504. package/dist/utils/interactionModality.js +4 -0
  505. package/dist/utils/interactionOverlay.stylex.d.ts +6 -4
  506. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  507. package/dist/utils/interactionOverlay.stylex.js +6 -4
  508. package/dist/utils/isFocusDetached.d.ts +27 -0
  509. package/dist/utils/isFocusDetached.d.ts.map +1 -0
  510. package/dist/utils/isFocusDetached.js +32 -0
  511. package/dist/utils/layoutViewport.d.ts +25 -0
  512. package/dist/utils/layoutViewport.d.ts.map +1 -0
  513. package/dist/utils/layoutViewport.js +102 -0
  514. package/dist/utils/plainDate.d.ts +31 -0
  515. package/dist/utils/plainDate.d.ts.map +1 -1
  516. package/dist/utils/plainDate.js +68 -4
  517. package/dist/utils/pressFeedback.d.ts +6 -0
  518. package/dist/utils/pressFeedback.d.ts.map +1 -1
  519. package/dist/utils/pressFeedback.js +97 -18
  520. package/dist/utils/pressGesture.d.ts +4 -2
  521. package/dist/utils/pressGesture.d.ts.map +1 -1
  522. package/dist/utils/pressGesture.js +3 -1
  523. package/dist/utils/selectionLock.d.ts +10 -1
  524. package/dist/utils/selectionLock.d.ts.map +1 -1
  525. package/dist/utils/selectionLock.js +31 -5
  526. package/dist/utils/sharedMutationObserver.d.ts +2 -1
  527. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  528. package/dist/utils/sharedMutationObserver.js +2 -1
  529. package/dist/utils/timeParser.d.ts +2 -1
  530. package/dist/utils/timeParser.d.ts.map +1 -1
  531. package/dist/utils/timeParser.js +29 -3
  532. package/dist/utils/triggerFocus.d.ts +36 -0
  533. package/dist/utils/triggerFocus.d.ts.map +1 -0
  534. package/dist/utils/triggerFocus.js +65 -0
  535. package/locales/en.json +148 -0
  536. package/locales/pseudo.json +111 -0
  537. package/package.json +14 -9
  538. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  539. package/src/AlertDialog/AlertDialog.tsx +46 -5
  540. package/src/AppShell/AppShell.tsx +13 -4
  541. package/src/BottomSheet/BottomSheet.doc.mjs +1 -1
  542. package/src/BottomSheet/BottomSheet.tsx +1 -0
  543. package/src/BottomSheet/BottomSheetPanel.tsx +80 -16
  544. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +5 -0
  545. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  546. package/src/BottomSheet/bottomSheetStack.ts +1 -1
  547. package/src/BottomSheet/useSheetGestures.ts +16 -1
  548. package/src/Button/Button.tsx +26 -4
  549. package/src/Calendar/Calendar.tsx +40 -32
  550. package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
  551. package/src/Calendar/hooks/useCalendarDays.ts +5 -10
  552. package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
  553. package/src/Carousel/Carousel.tsx +1 -0
  554. package/src/Chat/ChatComposerInput.tsx +4 -7
  555. package/src/Chat/ChatMessageList.tsx +2 -1
  556. package/src/Chat/useChatDictation.ts +1 -0
  557. package/src/Chat/useChatNewMessages.ts +1 -1
  558. package/src/Chat/useChatStreamScroll.ts +2 -0
  559. package/src/Chat/useSpeechRecognition.ts +2 -0
  560. package/src/Chat/useTriggerMenu.tsx +1 -1
  561. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  562. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  563. package/src/CheckboxList/CheckboxList.doc.mjs +14 -0
  564. package/src/CheckboxList/CheckboxList.tsx +43 -2
  565. package/src/CheckboxList/CheckboxListContext.tsx +9 -1
  566. package/src/CheckboxList/CheckboxListItem.tsx +23 -2
  567. package/src/CheckboxList/requiredGroup.ts +77 -0
  568. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  569. package/src/CodeBlock/CodeBlock.tsx +41 -4
  570. package/src/CommandPalette/CommandPalette.tsx +1 -0
  571. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  572. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  573. package/src/ContextMenu/ContextMenu.tsx +2 -2
  574. package/src/DateInput/MonthScroller.tsx +8 -2
  575. package/src/DateInput/PickerWheel.tsx +796 -0
  576. package/src/DateInput/TouchDateField.tsx +6 -32
  577. package/src/DateInput/Wheel.tsx +188 -171
  578. package/src/DateInput/datePickerTouch.ts +15 -0
  579. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  580. package/src/DateInput/usePointerDragScroll.ts +1 -0
  581. package/src/DateInput/useScrollSettle.ts +2 -0
  582. package/src/DateInput/useWheelListbox.ts +112 -0
  583. package/src/DateInput/wheelOptions.ts +184 -0
  584. package/src/DateInput/wheelPhysics.ts +406 -0
  585. package/src/DateInput/wheelStrip.ts +341 -0
  586. package/src/DateTimeInput/TouchDateTimeField.tsx +100 -189
  587. package/src/Dialog/Dialog.tsx +12 -32
  588. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  589. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  590. package/src/Field/Field.tsx +2 -2
  591. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  592. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  593. package/src/FormLayout/FormLayout.tsx +5 -1
  594. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  595. package/src/HoverCard/HoverCard.tsx +58 -6
  596. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  597. package/src/HoverCard/useHoverCard.tsx +55 -55
  598. package/src/Icon/Icon.doc.mjs +51 -10
  599. package/src/Icon/Icon.tsx +31 -8
  600. package/src/IconButton/IconButton.doc.mjs +141 -21
  601. package/src/InfoTip/InfoTip.tsx +72 -16
  602. package/src/Item/useSwipeAction.ts +2 -0
  603. package/src/Layer/modalOutlet.ts +2 -0
  604. package/src/Layer/outsidePress.ts +1 -0
  605. package/src/Layer/useLayer.tsx +3 -1
  606. package/src/Layer/useLayerDismissal.ts +2 -0
  607. package/src/Layer/useTouchTrigger.ts +19 -6
  608. package/src/Layout/index.ts +1 -1
  609. package/src/Layout/layoutReset.ts +1 -1
  610. package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
  611. package/src/Layout/padding.stylex.ts +9 -133
  612. package/src/Layout/paddingStyles.stylex.ts +87 -0
  613. package/src/Lightbox/Lightbox.tsx +20 -1
  614. package/src/Lightbox/useLightbox.doc.mjs +167 -0
  615. package/src/MobileNav/MobileNav.tsx +10 -31
  616. package/src/MultiSelector/MultiSelector.tsx +2 -7
  617. package/src/NumberInput/NumberInput.tsx +2 -7
  618. package/src/Outline/useOutlineFromDOM.ts +2 -0
  619. package/src/Outline/useScrollSpy.ts +2 -0
  620. package/src/OverflowList/OverflowList.tsx +2 -0
  621. package/src/Overlay/Overlay.tsx +7 -2
  622. package/src/Popover/Popover.tsx +4 -0
  623. package/src/Popover/usePopover.tsx +2 -2
  624. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  625. package/src/PowerSearch/PowerSearch.tsx +622 -157
  626. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2700 -0
  627. package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
  628. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  629. package/src/PowerSearch/PowerSearchToken.tsx +2 -0
  630. package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
  631. package/src/PowerSearch/formatFilterValue.ts +49 -27
  632. package/src/PowerSearch/formatTokenValue.ts +220 -0
  633. package/src/PowerSearch/index.ts +5 -1
  634. package/src/PowerSearch/powerSearchDateZone.ts +95 -0
  635. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  636. package/src/PowerSearch/types.ts +8 -1
  637. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  638. package/src/RadioList/RadioList.tsx +3 -2
  639. package/src/RadioList/RadioListItem.tsx +5 -3
  640. package/src/Resizable/Resizable.doc.mjs +5 -4
  641. package/src/Resizable/ResizeHandle.tsx +187 -135
  642. package/src/Resizable/createResizable.ts +1046 -0
  643. package/src/Resizable/separatorAttributes.ts +73 -0
  644. package/src/Resizable/useResizable.ts +292 -623
  645. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  646. package/src/SelectableCard/SelectableCard.tsx +39 -10
  647. package/src/SelectableCard/selectableCardInput.ts +30 -0
  648. package/src/Selector/Selector.tsx +7 -19
  649. package/src/SideNav/SideNav.tsx +41 -5
  650. package/src/Slider/Slider.tsx +20 -11
  651. package/src/Slider/sliderTouchController.ts +2 -2
  652. package/src/Spinner/Spinner.tsx +77 -63
  653. package/src/Stepper/Stepper.tsx +10 -27
  654. package/src/Switch/Switch.tsx +2 -6
  655. package/src/Switch/useSwitchTouch.ts +4 -4
  656. package/src/Table/BaseTable.tsx +46 -12
  657. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  658. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  659. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +31 -7
  660. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  661. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -20
  662. package/src/Table/useTableRowExpansion.doc.mjs +9 -0
  663. package/src/Table/useTableTreeData.doc.mjs +15 -3
  664. package/src/TextArea/TextArea.tsx +2 -7
  665. package/src/TextInput/TextInput.tsx +13 -17
  666. package/src/TimeInput/TimeInput.tsx +2 -0
  667. package/src/TimeInput/TimeWheels.tsx +218 -0
  668. package/src/TimeInput/TouchTimeField.tsx +93 -155
  669. package/src/TimeInput/timeWheelRules.ts +352 -0
  670. package/src/Timer/Timer.tsx +1 -0
  671. package/src/Timestamp/Timestamp.tsx +1 -1
  672. package/src/Timestamp/formatInstant.ts +1 -33
  673. package/src/Toast/Toast.doc.mjs +4 -3
  674. package/src/Toast/Toast.tsx +52 -32
  675. package/src/Toast/ToastViewport.tsx +123 -35
  676. package/src/Toast/types.ts +9 -3
  677. package/src/Toast/useToast.tsx +1 -0
  678. package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
  679. package/src/Tokenizer/Tokenizer.tsx +61 -62
  680. package/src/Tokenizer/TokenizerBottomSheet.tsx +17 -23
  681. package/src/Tokenizer/index.ts +1 -0
  682. package/src/Tooltip/Tooltip.tsx +6 -42
  683. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  684. package/src/Tooltip/useTooltip.tsx +243 -134
  685. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  686. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  687. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  688. package/src/animator/createAnimator.doc.mjs +153 -0
  689. package/src/animator/createAnimator.ts +324 -0
  690. package/src/gestures/GestureHost.ts +6 -5
  691. package/src/gestures/PressTracker.ts +4 -3
  692. package/src/gestures/README.md +10 -4
  693. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  694. package/src/hooks/actionGroupTracker.ts +25 -9
  695. package/src/hooks/index.ts +2 -0
  696. package/src/hooks/longPressDetector.ts +273 -0
  697. package/src/hooks/pressGroupContext.ts +21 -0
  698. package/src/hooks/rootScrollStyles.ts +247 -0
  699. package/src/hooks/scrollLockTouchGuard.ts +149 -0
  700. package/src/hooks/scrollbarGutter.ts +41 -26
  701. package/src/hooks/useActionGroupTracking.ts +224 -0
  702. package/src/hooks/useAnimator.doc.mjs +109 -0
  703. package/src/hooks/useAnimator.ts +67 -0
  704. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  705. package/src/hooks/useAttachment.ts +1 -1
  706. package/src/hooks/useAutoMediaMode.ts +1 -0
  707. package/src/hooks/useBusyAnnouncement.ts +2 -0
  708. package/src/hooks/useDevWarning.ts +2 -0
  709. package/src/hooks/useFocusTrap.ts +2 -0
  710. package/src/hooks/useGridFocus.doc.mjs +6 -6
  711. package/src/hooks/useGridFocus.ts +10 -7
  712. package/src/hooks/useHotkeys.ts +2 -0
  713. package/src/hooks/useImageMode.ts +2 -0
  714. package/src/hooks/useInputStatusIcon.tsx +3 -2
  715. package/src/hooks/useKeyboardHint.tsx +1 -1
  716. package/src/hooks/useLongPress.doc.mjs +2 -2
  717. package/src/hooks/useLongPress.ts +32 -122
  718. package/src/hooks/useMenuHover.ts +1 -0
  719. package/src/hooks/useMenuPress.ts +2 -0
  720. package/src/hooks/useOverflow.ts +2 -1
  721. package/src/hooks/usePressFeedback.ts +1 -0
  722. package/src/hooks/useResolvedRequired.ts +3 -0
  723. package/src/hooks/useScrollLock.doc.mjs +51 -12
  724. package/src/hooks/useScrollLock.ts +53 -60
  725. package/src/hooks/useScrollableArea.ts +4 -0
  726. package/src/hooks/useStreamingText.ts +2 -0
  727. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +46 -0
  728. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  729. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  730. package/src/i18n/generated-english/Resizable/createResizable.generated.ts +14 -0
  731. package/src/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.ts +3 -1
  732. package/src/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.ts +3 -1
  733. package/src/i18n/generated-english/TimeInput/TimeWheels.generated.ts +18 -0
  734. package/src/i18n/generated-locales/en.generated.ts +47 -0
  735. package/src/i18n/generated-locales/pseudo.generated.ts +48 -0
  736. package/src/index.ts +13 -0
  737. package/src/internal/indicatorPress.stylex.ts +24 -0
  738. package/src/internal/selectable-card.ts +21 -0
  739. package/src/internal/sheetDraft.ts +2 -2
  740. package/src/keyboard/README.md +197 -0
  741. package/src/keyboard/index.ts +48 -0
  742. package/src/keyboard/keyboardHeight.ts +543 -0
  743. package/src/keyboard/keyboardLayoutGuide.ts +266 -0
  744. package/src/keyboard/keyboardModel.ts +301 -0
  745. package/src/keyboard/rideKeyboard.ts +100 -0
  746. package/src/keyboard/useMobileKeyboard.ts +866 -0
  747. package/src/motion/MEASUREMENTS.md +28 -0
  748. package/src/motion/README.md +12 -5
  749. package/src/motion/android/index.ts +18 -0
  750. package/src/motion/android/keyboard.ts +96 -0
  751. package/src/motion/animatedLayout.ts +323 -60
  752. package/src/motion/animator.ts +66 -37
  753. package/src/motion/frameBlock.ts +16 -0
  754. package/src/motion/progress.ts +155 -0
  755. package/src/motion/reducedMotion.ts +3 -1
  756. package/src/motion/uikit/alert.ts +43 -0
  757. package/src/motion/uikit/datePicker.ts +60 -0
  758. package/src/motion/uikit/index.ts +6 -4
  759. package/src/motion/uikit/picker.ts +116 -0
  760. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  761. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  762. package/src/theme/Theme.tsx +37 -3
  763. package/src/theme/generateThemeRules.ts +14 -12
  764. package/src/theme/motionKnobs.ts +4 -3
  765. package/src/theme/themeMotion.ts +17 -2
  766. package/src/theme/tokens.stylex.ts +2 -0
  767. package/src/utils/dateParser.ts +16 -0
  768. package/src/utils/disabledInteraction.ts +23 -2
  769. package/src/utils/focusReturn.ts +38 -31
  770. package/src/utils/index.ts +1 -1
  771. package/src/utils/interactionModality.ts +4 -0
  772. package/src/utils/interactionOverlay.stylex.ts +6 -4
  773. package/src/utils/isFocusDetached.ts +34 -0
  774. package/src/utils/layoutViewport.ts +104 -0
  775. package/src/utils/plainDate.ts +80 -4
  776. package/src/utils/pressFeedback.ts +126 -30
  777. package/src/utils/pressGesture.ts +4 -2
  778. package/src/utils/selectionLock.ts +40 -6
  779. package/src/utils/sharedMutationObserver.ts +2 -1
  780. package/src/utils/timeParser.ts +40 -3
  781. package/src/utils/triggerFocus.ts +80 -0
  782. package/dist/BottomSheet/useMobileKeyboard.d.ts +0 -21
  783. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +0 -1
  784. package/dist/BottomSheet/useMobileKeyboard.js +0 -407
  785. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
  786. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
  787. package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
  788. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
  789. package/dist/Layer/usePressPin.d.ts +0 -93
  790. package/dist/Layer/usePressPin.d.ts.map +0 -1
  791. package/dist/Layer/usePressPin.js +0 -363
  792. package/dist/internal/touch-sheet.d.ts +0 -21
  793. package/dist/internal/touch-sheet.d.ts.map +0 -1
  794. package/dist/internal/touch-sheet.js +0 -19
  795. package/src/BottomSheet/useMobileKeyboard.ts +0 -538
  796. package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
  797. package/src/Layer/usePressPin.ts +0 -510
  798. package/src/internal/touch-sheet.ts +0 -21
@@ -0,0 +1,796 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file PickerWheel.tsx
7
+ * @input Wheel's props (wheelOptions.ts): options, value and change callback;
8
+ * optionally a ref for programmatic turns
9
+ * @output PickerWheel: one picker column that moves like UIPickerView
10
+ * @position Internal component; the Wheel under a finger (Wheel.tsx picks it)
11
+ *
12
+ * It moves on the gesture system and the shared animator, not on a native
13
+ * scroller. One strip holds the rows and is the only element that moves.
14
+ *
15
+ * SYNC: When modified, update PickerWheel.test.tsx, Wheel.tsx,
16
+ * DateInputTouch.test.tsx, DateInput.doc.mjs and TimeInput.doc.mjs.
17
+ */
18
+
19
+ import {
20
+ useCallback,
21
+ useEffect,
22
+ useImperativeHandle,
23
+ useMemo,
24
+ useRef,
25
+ useState,
26
+ } from 'react';
27
+ import * as stylex from '@stylexjs/stylex';
28
+ import {scrollTypeOf} from '../gestures/GestureHost';
29
+ import {PanGestureRecognizer} from '../gestures/PanGestureRecognizer';
30
+ import {TapGestureRecognizer} from '../gestures/TapGestureRecognizer';
31
+ import {useGestureRecognizer} from '../gestures/useGestureRecognizer';
32
+ import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
33
+ import {rubberBandInverse} from '../motion/rubberBand';
34
+ import {resolveMotion} from '../motion/resolveMotion';
35
+ import {picker, registerPickerTable} from '../motion/uikit/picker';
36
+ import {registerScrollTable, scroll} from '../motion/uikit/scroll';
37
+ import {registerTimingTable, timing} from '../motion/uikit/timing';
38
+ import {
39
+ colorVars,
40
+ fontWeightVars,
41
+ radiusVars,
42
+ spacingVars,
43
+ typeScaleVars,
44
+ } from '../theme/tokens.stylex';
45
+ import {focusOutlineStyles} from '../utils/focusOutline.stylex';
46
+ import {lockSelection} from '../gestures/selectionLock';
47
+ import {dateInputTouchGeometry, dateInputTouchSizes} from './tokens.stylex';
48
+ import {useOwnScrollGesture} from './useOwnScrollGesture';
49
+ import {useWheelListbox} from './useWheelListbox';
50
+ import {createWheelStrip, type PlayOptions} from './wheelStrip';
51
+ import {
52
+ dragOffset,
53
+ nearestIndex,
54
+ offsetBounds,
55
+ planRelease,
56
+ spinCurve,
57
+ type WheelCurve,
58
+ type WheelLayout,
59
+ } from './wheelPhysics';
60
+ import {
61
+ canSpinTo,
62
+ endIndex,
63
+ nearestEnabledIndex,
64
+ steppedIndex,
65
+ WHEEL_ROW_HEIGHT,
66
+ type WheelProps,
67
+ } from './wheelOptions';
68
+
69
+ /** Row pitch, px: the touch column keeps the scrolling column's pitch. */
70
+ const ROW_HEIGHT = WHEEL_ROW_HEIGHT;
71
+ /** UIKit's picker measures scaled to that pitch (UIKit's row is 32 pt). */
72
+ const UIKIT_SCALE = ROW_HEIGHT / picker.geometry.rowHeight;
73
+ /** UIKit's rubber band dimension for the picker's table, at that pitch. */
74
+ const RUBBER_BAND_DIMENSION = picker.geometry.rubberBandDimension * UIKIT_SCALE;
75
+
76
+ const styles = stylex.create({
77
+ // The scrolling column's box, band and rows (Wheel.tsx), moved by the
78
+ // gesture system and the compositor instead of a native scroller.
79
+ column: {
80
+ position: 'relative',
81
+ flex: '1 1 0',
82
+ minInlineSize: 0,
83
+ blockSize: dateInputTouchGeometry.paneBlockSize,
84
+ overflow: 'hidden',
85
+ outline: 'none',
86
+ WebkitTapHighlightColor: 'transparent',
87
+ },
88
+ // The rows fade toward the column's edges. A static mask: nothing paints it
89
+ // again as the strip moves. It sits inside the column, so it never clips the
90
+ // column's focus ring.
91
+ fade: {
92
+ position: 'absolute',
93
+ inset: 0,
94
+ pointerEvents: 'none',
95
+ maskImage:
96
+ 'linear-gradient(to bottom, rgb(0 0 0 / 0.3), rgb(0 0 0) 50%, rgb(0 0 0 / 0.3))',
97
+ },
98
+ /**
99
+ * The selection band: a centred row-height plate behind the rows.
100
+ * Decorative: the committed value is announced by `aria-selected`.
101
+ */
102
+ band: {
103
+ position: 'absolute',
104
+ insetInline: 0,
105
+ insetBlockStart: `calc(50% - (${dateInputTouchSizes.wheelItemSize} / 2))`,
106
+ blockSize: dateInputTouchSizes.wheelItemSize,
107
+ borderRadius: radiusVars['--radius-element'],
108
+ backgroundColor: colorVars['--color-neutral'],
109
+ pointerEvents: 'none',
110
+ },
111
+ /**
112
+ * The strip holds the rows at their places along the wheel, with its top on
113
+ * the band's row. It moves by minus the wheel's offset, and the animator
114
+ * writes its `translate`. Also what a reduced-motion cross-fade fades.
115
+ */
116
+ strip: {
117
+ position: 'absolute',
118
+ insetInline: 0,
119
+ insetBlockStart: `calc(50% - (${dateInputTouchSizes.wheelItemSize} / 2))`,
120
+ pointerEvents: 'none',
121
+ },
122
+ /** One row: an option at its place along the strip, flat. */
123
+ row: {
124
+ position: 'absolute',
125
+ insetInline: 0,
126
+ blockSize: dateInputTouchSizes.wheelItemSize,
127
+ display: 'flex',
128
+ alignItems: 'center',
129
+ justifyContent: 'center',
130
+ paddingInline: spacingVars['--spacing-2'],
131
+ boxSizing: 'border-box',
132
+ fontSize: typeScaleVars['--text-large-size'],
133
+ fontWeight: fontWeightVars['--font-weight-normal'],
134
+ color: colorVars['--color-text-primary'],
135
+ whiteSpace: 'nowrap',
136
+ overflow: 'hidden',
137
+ textOverflow: 'ellipsis',
138
+ userSelect: 'none',
139
+ // The mark has no transition, unlike the scrolling column's. A colour or
140
+ // weight that animates lays out and paints every frame on the main thread.
141
+ // A mark set as a drag lets go would do so through the coast.
142
+ },
143
+ /** The row under the band, as the scrolling column marks it. */
144
+ rowActive: {
145
+ color: colorVars['--color-text-accent'],
146
+ fontWeight: fontWeightVars['--font-weight-semibold'],
147
+ },
148
+ rowDisabled: {
149
+ color: colorVars['--color-text-disabled'],
150
+ },
151
+ /** A row at its place along the strip. */
152
+ rowAt: (top: string) => ({insetBlockStart: top}),
153
+ });
154
+
155
+ /**
156
+ * The motion tables the wheel resolves internal roles from: the timing curve,
157
+ * the scroll bounce and the picker's tap spin. Nothing registers on import
158
+ * (motion/roles.ts) and each register is idempotent, so the wheel calls this
159
+ * right before it resolves a role.
160
+ */
161
+ function registerWheelTables(): void {
162
+ registerTimingTable();
163
+ registerScrollTable();
164
+ registerPickerTable();
165
+ }
166
+
167
+ /**
168
+ * A turn onto `to` on the picker's tap spin: its duration and its curve, as
169
+ * resolved under `column` when the turn starts.
170
+ */
171
+ function turnCurve(
172
+ column: Element | null,
173
+ from: number,
174
+ to: number,
175
+ ): WheelCurve {
176
+ registerWheelTables();
177
+ return spinCurve(
178
+ from,
179
+ to,
180
+ resolveMotion(column, picker.tapSpin, 'durationMs') / 1000,
181
+ resolveMotion(column, timing.curves.move),
182
+ );
183
+ }
184
+
185
+ interface DragState {
186
+ /** The finger's offset at the pan's start, before any rubber band. */
187
+ readonly start: number;
188
+ }
189
+
190
+ /**
191
+ * One UIPickerView column: the Wheel under a finger. It does not scroll
192
+ * natively. WebKit gives every scroll-snapping scroller the fast deceleration
193
+ * rate, and a scroller's momentum cannot be caught or measured. A busy main
194
+ * thread does not stop or jump a motion here. Under Reduce Motion a throw's
195
+ * momentum still plays, as iOS scrolling does. Every other motion
196
+ * cross-fades onto its row.
197
+ *
198
+ * @example
199
+ * ```
200
+ * <PickerWheel label="Month" options={monthOptions} value={month} onChange={setMonth} />
201
+ * ```
202
+ */
203
+ export function PickerWheel({
204
+ label,
205
+ options,
206
+ value,
207
+ onChange,
208
+ isActive = true,
209
+ ref,
210
+ }: WheelProps) {
211
+ const columnRef = useRef<HTMLDivElement | null>(null);
212
+ const rowsRef = useRef<HTMLDivElement | null>(null);
213
+ const rowCount = options.length;
214
+ const layout = useMemo<WheelLayout>(
215
+ () => ({rowHeight: ROW_HEIGHT, rowCount}),
216
+ [rowCount],
217
+ );
218
+ const [motion] = useState(() => createWheelStrip(layout));
219
+ const selectedIndex = Math.max(
220
+ 0,
221
+ options.findIndex(option => option.value === value),
222
+ );
223
+ const dragRef = useRef<DragState | null>(null);
224
+ /** A finger landed on a moving wheel and stopped it. */
225
+ const caughtRef = useRef(false);
226
+
227
+ // The latest props, for the motion's and the gesture listeners' callbacks,
228
+ // which are attached once and outlive a render.
229
+ const latestRef = useRef({options, value, onChange, layout});
230
+ useIsomorphicLayoutEffect(() => {
231
+ latestRef.current = {options, value, onChange, layout};
232
+ });
233
+
234
+ // The row under the band is marked as the scrolling column marks it. At rest
235
+ // that is the committed row, styled in render. While a finger drags the
236
+ // wheel, the row reaching the band is painted directly, so marking it never
237
+ // re-renders. A motion unmarks every row as it starts and marks the row it
238
+ // stops or ends on. The compositor then plays it with no layout or paint per
239
+ // frame, and no mark rides away from the band.
240
+ const paintedRef = useRef<Set<HTMLElement>>(new Set());
241
+ const paintRow = useCallback((position: number | null) => {
242
+ const container = rowsRef.current;
243
+ if (container == null || container.children.length === 0) {
244
+ return;
245
+ }
246
+ const rows = container.children;
247
+ const {options: currentOptions, value: currentValue} = latestRef.current;
248
+ const active =
249
+ position == null
250
+ ? null
251
+ : ((rows[position] as HTMLElement | undefined) ?? null);
252
+ const painted = paintedRef.current;
253
+ for (const row of painted) {
254
+ row.style.removeProperty('color');
255
+ row.style.removeProperty('font-weight');
256
+ }
257
+ painted.clear();
258
+ const selected = currentOptions.findIndex(
259
+ option => option.value === currentValue,
260
+ );
261
+ if (rows[selected] != null && rows[selected] !== active) {
262
+ // The committed row's own mark gives way while another row is under
263
+ // the band.
264
+ const row = rows[selected] as HTMLElement;
265
+ row.style.color = currentOptions[selected]?.isDisabled
266
+ ? colorVars['--color-text-disabled']
267
+ : colorVars['--color-text-primary'];
268
+ row.style.fontWeight = fontWeightVars['--font-weight-normal'];
269
+ painted.add(row);
270
+ }
271
+ if (active == null || position == null) {
272
+ return;
273
+ }
274
+ active.style.color = currentOptions[position]?.isDisabled
275
+ ? colorVars['--color-text-disabled']
276
+ : colorVars['--color-text-accent'];
277
+ active.style.fontWeight = fontWeightVars['--font-weight-semibold'];
278
+ painted.add(active);
279
+ }, []);
280
+
281
+ // Every motion the wheel starts. Under Reduce Motion a transition lands
282
+ // without travel: the animator cross-fades the strip onto its row. The
283
+ // momentum that continues a throw is not a transition, so it plays as is.
284
+ const move = useCallback(
285
+ (curve: WheelCurve, options: PlayOptions = {}) => {
286
+ paintRow(null);
287
+ // The mark comes back from the row the motion reports nearest when it
288
+ // ends, even the row it began on.
289
+ motion.forgetNearest();
290
+ motion.play(curve, options);
291
+ },
292
+ [motion, paintRow],
293
+ );
294
+
295
+ // The wheel came to rest at `offset`: commit, or turn on to the row the
296
+ // rest rule names first.
297
+ const arrive = useCallback(
298
+ (offset: number) => {
299
+ const current = latestRef.current;
300
+ const row = nearestIndex(offset, current.layout);
301
+ const committed = current.options.findIndex(
302
+ option => option.value === current.value,
303
+ );
304
+ // A rest on the committed row is not a stop to correct. A committed value
305
+ // outside the bounds stays until a person moves the wheel off it, as in
306
+ // the scrolling column.
307
+ let step = 0;
308
+ if (row !== committed) {
309
+ step =
310
+ nearestEnabledIndex(current.options, row, Math.max(0, committed)) -
311
+ row;
312
+ }
313
+ if (step !== 0) {
314
+ const target = row + step;
315
+ move(turnCurve(columnRef.current, offset, target * ROW_HEIGHT), {
316
+ onEnd: (outcome, end) => {
317
+ if (outcome === 'arrived') {
318
+ arrive(end);
319
+ }
320
+ },
321
+ });
322
+ return;
323
+ }
324
+ const option = current.options[row];
325
+ if (
326
+ option != null &&
327
+ !option.isDisabled &&
328
+ option.value !== current.value
329
+ ) {
330
+ current.onChange(option.value);
331
+ }
332
+ },
333
+ [move],
334
+ );
335
+
336
+ const onEnd = useCallback(
337
+ (outcome: 'arrived' | 'stopped', offset: number) => {
338
+ if (outcome === 'arrived') {
339
+ arrive(offset);
340
+ }
341
+ },
342
+ [arrive],
343
+ );
344
+
345
+ // The animator holds the strip while it is attached, and lets it go as it
346
+ // detaches or is replaced.
347
+ const attachStrip = useCallback(
348
+ (strip: HTMLDivElement) => {
349
+ rowsRef.current = strip;
350
+ motion.attach(strip);
351
+ return () => {
352
+ rowsRef.current = null;
353
+ motion.attach(null);
354
+ };
355
+ },
356
+ [motion],
357
+ );
358
+
359
+ // The motion's layout follows the rows.
360
+ useIsomorphicLayoutEffect(() => {
361
+ motion.setLayout(layout);
362
+ }, [motion, layout]);
363
+
364
+ // The band's mark follows the row the motion reports nearest the band.
365
+ useIsomorphicLayoutEffect(() => {
366
+ motion.onNearestChange(paintRow);
367
+ return () => motion.onNearestChange(null);
368
+ }, [motion, paintRow]);
369
+ // At rest on the committed row, render's own mark takes over again.
370
+ useIsomorphicLayoutEffect(() => {
371
+ if (
372
+ motion.isMoving() ||
373
+ dragRef.current != null ||
374
+ nearestIndex(motion.offset(), layout) !== selectedIndex
375
+ ) {
376
+ return;
377
+ }
378
+ for (const row of paintedRef.current) {
379
+ row.style.removeProperty('color');
380
+ row.style.removeProperty('font-weight');
381
+ }
382
+ paintedRef.current.clear();
383
+ });
384
+
385
+ // The motion's animations and timers end with the wheel.
386
+ useEffect(() => () => motion.dispose(), [motion]);
387
+
388
+ // Park the committed row under the band when the wheel is shown, at once. A
389
+ // value that changes from outside while the wheel is shown turns the wheel
390
+ // onto its row instead. UIDatePicker turns onto its maximum the same way, and
391
+ // never jumps there. For example, a bound clamps the time after another wheel
392
+ // turned, or the calendar moved to another month. A second change during that
393
+ // turn turns on from where the wheel is drawn. Never while a finger or a
394
+ // motion of its own owns the wheel.
395
+ const parkedRef = useRef(false);
396
+ const parkTurnRef = useRef<object | null>(null);
397
+ useIsomorphicLayoutEffect(() => {
398
+ if (!isActive) {
399
+ parkedRef.current = false;
400
+ return;
401
+ }
402
+ if (
403
+ dragRef.current != null ||
404
+ (motion.isMoving() && parkTurnRef.current == null)
405
+ ) {
406
+ return;
407
+ }
408
+ const target = selectedIndex * ROW_HEIGHT;
409
+ const shown = motion.isMoving() ? motion.stop() : motion.offset();
410
+ const isAway = Math.abs(shown - target) > 0.01;
411
+ if (isAway && parkedRef.current) {
412
+ // The turn's own end paints the band's row.
413
+ const turn = {};
414
+ parkTurnRef.current = turn;
415
+ move(turnCurve(columnRef.current, shown, target), {
416
+ onEnd: () => {
417
+ if (parkTurnRef.current === turn) {
418
+ parkTurnRef.current = null;
419
+ }
420
+ },
421
+ });
422
+ return;
423
+ }
424
+ if (isAway) {
425
+ motion.setOffset(target);
426
+ }
427
+ parkedRef.current = true;
428
+ }, [isActive, selectedIndex, motion, move]);
429
+
430
+ // A hidden wheel keeps no motion running and holds no drag. Hiding it
431
+ // mid-drag ends the pan without calling its listener, because the toggle's
432
+ // owner owns that end. So the drag is dropped here, uncommitted. Shown again,
433
+ // the wheel parks the committed row.
434
+ useEffect(() => {
435
+ if (!isActive) {
436
+ dragRef.current = null;
437
+ motion.stop();
438
+ }
439
+ }, [isActive, motion]);
440
+
441
+ // A finger lands: a moving wheel stops where it is on screen.
442
+ const onTouchDown = useCallback(
443
+ (time: number) => {
444
+ caughtRef.current = motion.isMoving();
445
+ if (caughtRef.current) {
446
+ motion.stop(time);
447
+ }
448
+ },
449
+ [motion],
450
+ );
451
+
452
+ // The latest touch-down handler, for the gesture listener attached once.
453
+ const onTouchDownRef = useRef(onTouchDown);
454
+ useIsomorphicLayoutEffect(() => {
455
+ onTouchDownRef.current = onTouchDown;
456
+ });
457
+
458
+ const release = useCallback(
459
+ (velocity: number) => {
460
+ registerWheelTables();
461
+ const plan = planRelease(
462
+ motion.offset(),
463
+ velocity,
464
+ latestRef.current.layout,
465
+ resolveMotion(columnRef.current, scroll.bounce),
466
+ );
467
+ move(plan.curve, {
468
+ ticks: true,
469
+ onEnd,
470
+ touchRelease: true,
471
+ momentum: plan.kind === 'coast' || plan.kind === 'edge',
472
+ });
473
+ },
474
+ [motion, move, onEnd],
475
+ );
476
+
477
+ const pan = useGestureRecognizer(
478
+ columnRef,
479
+ () =>
480
+ new PanGestureRecognizer({
481
+ name: 'wheel-pan',
482
+ direction: 'vertical',
483
+ // A trackpad's two-finger scroll drives the pan as a finger does. The
484
+ // rows follow, coast on at the lift with the fingers' last speed, and
485
+ // rest by the rest rule. A mouse wheel's notches never reach the pan.
486
+ allowedScrollTypes: ['continuous'],
487
+ // A held finger on the wheel never starts text selection or the
488
+ // callout.
489
+ selectionLock: lockSelection,
490
+ shouldReceiveTouch: (_pan, touch) => {
491
+ onTouchDownRef.current(touch.time);
492
+ return true;
493
+ },
494
+ }),
495
+ recognizer => {
496
+ const {layout: currentLayout} = latestRef.current;
497
+ switch (recognizer.state) {
498
+ case 'began': {
499
+ const shown = motion.isMoving() ? motion.stop() : motion.offset();
500
+ dragRef.current = {start: fingerOffset(shown, currentLayout)};
501
+ motion.resetDrag();
502
+ motion.setOffset(
503
+ dragOffset(
504
+ dragRef.current.start - recognizer.translation().y,
505
+ currentLayout,
506
+ ),
507
+ {ticks: true},
508
+ );
509
+ break;
510
+ }
511
+ case 'changed': {
512
+ const drag = dragRef.current;
513
+ if (drag == null) {
514
+ break;
515
+ }
516
+ motion.setOffset(
517
+ dragOffset(drag.start - recognizer.translation().y, currentLayout),
518
+ {ticks: true},
519
+ );
520
+ break;
521
+ }
522
+ case 'ended': {
523
+ const drag = dragRef.current;
524
+ dragRef.current = null;
525
+ // A scroll view's release velocity (the pan's last two, blended as
526
+ // UIPickerView's); the rows move against the finger.
527
+ release(drag == null ? 0 : -recognizer.scrollVelocity().y);
528
+ break;
529
+ }
530
+ case 'cancelled': {
531
+ dragRef.current = null;
532
+ release(0);
533
+ break;
534
+ }
535
+ case 'possible':
536
+ case 'failed':
537
+ break;
538
+ }
539
+ },
540
+ {isEnabled: isActive},
541
+ );
542
+
543
+ // A touch that stopped a moving wheel and lifted without dragging: the
544
+ // wheel eases onto the nearest row, as a release without velocity does.
545
+ useEffect(
546
+ () =>
547
+ pan.addTransitionListener((_pan, _from, to) => {
548
+ // The flag stays up until the next touch lands. The tap recognizer may
549
+ // hear of this lift after the pan does, and must not read it as a tap
550
+ // on a row.
551
+ if (to === 'failed' && caughtRef.current && !motion.isMoving()) {
552
+ release(0);
553
+ }
554
+ }),
555
+ [pan, motion, release],
556
+ );
557
+
558
+ useGestureRecognizer(
559
+ columnRef,
560
+ () => new TapGestureRecognizer({name: 'wheel-tap'}),
561
+ recognizer => {
562
+ if (recognizer.state !== 'ended' || caughtRef.current) {
563
+ return;
564
+ }
565
+ const column = columnRef.current;
566
+ if (column == null) {
567
+ return;
568
+ }
569
+ const box = column.getBoundingClientRect();
570
+ const {y} = recognizer.location();
571
+ const offset = motion.offset();
572
+ const currentLayout = latestRef.current.layout;
573
+ const target = rowAtPoint(
574
+ y - (box.top + box.height / 2),
575
+ offset,
576
+ currentLayout,
577
+ );
578
+ if (target == null || target === nearestIndex(offset, currentLayout)) {
579
+ return;
580
+ }
581
+ move(turnCurve(columnRef.current, offset, target * ROW_HEIGHT), {
582
+ onEnd,
583
+ });
584
+ },
585
+ {isEnabled: isActive},
586
+ );
587
+
588
+ // Keep the finger, and the pointer it lands with: inside a BottomSheet the
589
+ // sheet would otherwise read a downward drag here as swipe-to-dismiss. This
590
+ // wheel pans through the gesture system, which never cancels the pointer
591
+ // the sheet armed on (see useOwnScrollGesture).
592
+ useOwnScrollGesture(columnRef, 'all', {
593
+ isEnabled: isActive,
594
+ isPointerKept: true,
595
+ });
596
+
597
+ // A spin turns only onto an enabled row (canSpinTo). So its arrival commits
598
+ // that row, and nothing turns on past it. It reports the row it was asked
599
+ // for, as the scrolling column does.
600
+ const spinTo = useCallback(
601
+ async (index: number): Promise<boolean> =>
602
+ new Promise(resolve => {
603
+ if (!canSpinTo(latestRef.current.options, index)) {
604
+ resolve(false);
605
+ return;
606
+ }
607
+ const offset = motion.offset();
608
+ move(turnCurve(columnRef.current, offset, index * ROW_HEIGHT), {
609
+ onEnd: (outcome, end) => {
610
+ if (outcome === 'arrived') {
611
+ arrive(end);
612
+ }
613
+ resolve(outcome === 'arrived');
614
+ },
615
+ });
616
+ }),
617
+ [motion, move, arrive],
618
+ );
619
+
620
+ useImperativeHandle(ref, () => ({spinTo}), [spinTo]);
621
+
622
+ const turnToPosition = useCallback(
623
+ (position: number, offset: number) => {
624
+ const current = latestRef.current;
625
+ const option = current.options[position];
626
+ if (option.value !== current.value) {
627
+ current.onChange(option.value);
628
+ }
629
+ move(turnCurve(columnRef.current, offset, position * ROW_HEIGHT));
630
+ },
631
+ [move],
632
+ );
633
+
634
+ const moveBy = useCallback(
635
+ (delta: number) => {
636
+ const current = latestRef.current;
637
+ if (current.options.length === 0 || delta === 0) {
638
+ return;
639
+ }
640
+ // Keys step from the row the wheel is heading to, not the one it is
641
+ // passing: two quick presses move two rows. A key with nowhere to go
642
+ // leaves a turn in flight to finish on its row.
643
+ const row = steppedIndex(
644
+ current.options,
645
+ nearestIndex(motion.target(), current.layout),
646
+ delta,
647
+ );
648
+ if (row == null) {
649
+ return;
650
+ }
651
+ const offset = motion.isMoving() ? motion.stop() : motion.offset();
652
+ turnToPosition(row, offset);
653
+ },
654
+ [motion, turnToPosition],
655
+ );
656
+
657
+ // A mouse wheel's notch turns the wheel one row, as an arrow key does, with
658
+ // no coast. The gesture host leaves a notch to what is under the pointer,
659
+ // which is this wheel. A wheel the pan took arrives here already prevented.
660
+ // A ctrl-wheel stays the page's zoom, and a sideways scroll stays the
661
+ // page's.
662
+ useEffect(() => {
663
+ const column = columnRef.current;
664
+ if (column == null || !isActive) {
665
+ return undefined;
666
+ }
667
+ const onWheel = (event: WheelEvent) => {
668
+ if (
669
+ event.defaultPrevented ||
670
+ event.ctrlKey ||
671
+ event.shiftKey ||
672
+ event.deltaY === 0 ||
673
+ Math.abs(event.deltaX) > Math.abs(event.deltaY) ||
674
+ scrollTypeOf(event) !== 'discrete'
675
+ ) {
676
+ return;
677
+ }
678
+ event.preventDefault();
679
+ moveBy(Math.sign(event.deltaY));
680
+ };
681
+ column.addEventListener('wheel', onWheel, {passive: false});
682
+ return () => column.removeEventListener('wheel', onWheel);
683
+ }, [isActive, moveBy]);
684
+
685
+ // Home and End: the first and the last enabled row.
686
+ const moveToEnd = useCallback(
687
+ (end: 'first' | 'last') => {
688
+ const row = endIndex(latestRef.current.options, end);
689
+ if (row == null) {
690
+ return;
691
+ }
692
+ const offset = motion.isMoving() ? motion.stop() : motion.offset();
693
+ turnToPosition(row, offset);
694
+ },
695
+ [motion, turnToPosition],
696
+ );
697
+
698
+ // A click on a row commits it at once and turns the wheel there, as the arrow
699
+ // keys do. The click comes from assistive technology, a keyboard, a test, or
700
+ // a mouse the tap recognizer did not take. A finger's tap is the tap
701
+ // recognizer's, and the click it would produce is swallowed by the gesture
702
+ // system.
703
+ const activateRow = useCallback(
704
+ (row: number) => {
705
+ const current = latestRef.current;
706
+ const option = current.options[row];
707
+ if (option == null || option.isDisabled) {
708
+ return;
709
+ }
710
+ const offset = motion.isMoving() ? motion.stop() : motion.offset();
711
+ if (option.value !== current.value) {
712
+ current.onChange(option.value);
713
+ }
714
+ move(turnCurve(columnRef.current, offset, row * ROW_HEIGHT));
715
+ },
716
+ [motion, move],
717
+ );
718
+
719
+ const {listboxProps, optionProps} = useWheelListbox({
720
+ label,
721
+ options,
722
+ value,
723
+ // The committed row: a value set from outside shows in the same render.
724
+ activeIndex: selectedIndex,
725
+ stepBy: moveBy,
726
+ toEnd: moveToEnd,
727
+ activate: activateRow,
728
+ });
729
+
730
+ return (
731
+ <div
732
+ ref={columnRef}
733
+ {...listboxProps}
734
+ data-wheel=""
735
+ {...stylex.props(styles.column, focusOutlineStyles.focusVisible)}>
736
+ <div data-wheel-fade="" {...stylex.props(styles.fade)}>
737
+ <div aria-hidden="true" {...stylex.props(styles.band)} />
738
+ <div
739
+ ref={attachStrip}
740
+ data-wheel-strip=""
741
+ {...stylex.props(styles.strip)}>
742
+ {options.map((option, index) => (
743
+ <div
744
+ key={option.value}
745
+ {...optionProps(option, index)}
746
+ data-wheel-row=""
747
+ data-label={option.label}
748
+ {...stylex.props(
749
+ styles.row,
750
+ styles.rowAt(`${index * ROW_HEIGHT}px`),
751
+ index === selectedIndex && styles.rowActive,
752
+ option.isDisabled && styles.rowDisabled,
753
+ )}>
754
+ {option.label}
755
+ </div>
756
+ ))}
757
+ </div>
758
+ </div>
759
+ </div>
760
+ );
761
+ }
762
+
763
+ PickerWheel.displayName = 'PickerWheel';
764
+
765
+ /**
766
+ * The row under a point `dy` px below the band's centre, or null past either
767
+ * end of the list.
768
+ */
769
+ function rowAtPoint(
770
+ dy: number,
771
+ offset: number,
772
+ layout: WheelLayout,
773
+ ): number | null {
774
+ const position = Math.round((offset + dy) / layout.rowHeight);
775
+ if (position < 0 || position >= layout.rowCount) {
776
+ return null;
777
+ }
778
+ return position;
779
+ }
780
+
781
+ /**
782
+ * The finger's offset for a shown one. Past an end, it is the travel that the
783
+ * rubber band shows as `shown`. So a drag that starts in a bounce continues
784
+ * without a jump.
785
+ */
786
+ function fingerOffset(shown: number, layout: WheelLayout): number {
787
+ const {min, max} = offsetBounds(layout);
788
+ const dimension = RUBBER_BAND_DIMENSION;
789
+ if (shown < min) {
790
+ return min + rubberBandInverse(shown - min, dimension);
791
+ }
792
+ if (shown > max) {
793
+ return max + rubberBandInverse(shown - max, dimension);
794
+ }
795
+ return shown;
796
+ }