@astryxdesign/core 0.7.7 → 0.7.8-canary.36cde5e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +4 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +46 -6
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +5 -0
  6. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheet.js +1 -0
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +25 -4
  10. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  12. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
  13. package/dist/BottomSheet/useMobileKeyboard.js +6 -0
  14. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  15. package/dist/BottomSheet/useSheetGestures.js +12 -1
  16. package/dist/Button/Button.d.ts.map +1 -1
  17. package/dist/Button/Button.js +17 -1
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +15 -16
  20. package/dist/Carousel/Carousel.d.ts.map +1 -1
  21. package/dist/Carousel/Carousel.js +2 -0
  22. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  23. package/dist/Chat/ChatComposerInput.js +4 -0
  24. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  25. package/dist/Chat/ChatMessageList.js +2 -1
  26. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  27. package/dist/Chat/useChatDictation.js +2 -0
  28. package/dist/Chat/useChatNewMessages.js +1 -1
  29. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  30. package/dist/Chat/useChatStreamScroll.js +2 -0
  31. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  32. package/dist/Chat/useSpeechRecognition.js +3 -0
  33. package/dist/Chat/useTriggerMenu.js +1 -1
  34. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  35. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  36. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  37. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  38. package/dist/CodeBlock/CodeBlock.js +28 -11
  39. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  40. package/dist/CommandPalette/CommandPalette.js +2 -0
  41. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  42. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  43. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  44. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  45. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  46. package/dist/ContextMenu/ContextMenu.js +2 -2
  47. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  48. package/dist/DateInput/MonthScroller.js +5 -2
  49. package/dist/DateInput/PickerWheel.d.ts +19 -0
  50. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  51. package/dist/DateInput/PickerWheel.js +625 -0
  52. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  53. package/dist/DateInput/TouchDateField.js +1 -0
  54. package/dist/DateInput/Wheel.d.ts +18 -37
  55. package/dist/DateInput/Wheel.d.ts.map +1 -1
  56. package/dist/DateInput/Wheel.js +84 -113
  57. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  58. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  59. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  60. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  61. package/dist/DateInput/usePointerDragScroll.js +2 -0
  62. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  63. package/dist/DateInput/useScrollSettle.js +3 -0
  64. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  65. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  66. package/dist/DateInput/useWheelListbox.js +88 -0
  67. package/dist/DateInput/wheelOptions.d.ts +74 -0
  68. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  69. package/dist/DateInput/wheelOptions.js +98 -0
  70. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  71. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  72. package/dist/DateInput/wheelPhysics.js +341 -0
  73. package/dist/DateInput/wheelStrip.d.ts +92 -0
  74. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  75. package/dist/DateInput/wheelStrip.js +258 -0
  76. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  77. package/dist/DateTimeInput/TouchDateTimeField.js +2 -0
  78. package/dist/Dialog/Dialog.d.ts.map +1 -1
  79. package/dist/Dialog/Dialog.js +9 -32
  80. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  81. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  82. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  83. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  84. package/dist/Field/Field.js +2 -2
  85. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  86. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  87. package/dist/FormLayout/FormLayout.d.ts +5 -1
  88. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  89. package/dist/HoverCard/HoverCard.d.ts +6 -4
  90. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  91. package/dist/HoverCard/HoverCard.js +48 -3
  92. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  93. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/useHoverCard.js +20 -33
  95. package/dist/Icon/Icon.d.ts +5 -1
  96. package/dist/Icon/Icon.d.ts.map +1 -1
  97. package/dist/Icon/Icon.js +5 -2
  98. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  99. package/dist/Item/useSwipeAction.js +3 -0
  100. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  101. package/dist/Layer/modalOutlet.js +2 -0
  102. package/dist/Layer/outsidePress.d.ts.map +1 -1
  103. package/dist/Layer/outsidePress.js +1 -0
  104. package/dist/Layer/useLayer.d.ts.map +1 -1
  105. package/dist/Layer/useLayer.js +3 -0
  106. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  107. package/dist/Layer/useLayerDismissal.js +3 -0
  108. package/dist/Layer/usePressPin.d.ts +17 -5
  109. package/dist/Layer/usePressPin.d.ts.map +1 -1
  110. package/dist/Layer/usePressPin.js +62 -12
  111. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  112. package/dist/Layer/useTouchTrigger.js +3 -0
  113. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  114. package/dist/Lightbox/Lightbox.js +19 -0
  115. package/dist/MobileNav/MobileNav.d.ts +3 -2
  116. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  117. package/dist/MobileNav/MobileNav.js +9 -25
  118. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  119. package/dist/Outline/useOutlineFromDOM.js +3 -0
  120. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  121. package/dist/Outline/useScrollSpy.js +3 -0
  122. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  123. package/dist/OverflowList/OverflowList.js +3 -0
  124. package/dist/Popover/Popover.d.ts.map +1 -1
  125. package/dist/Popover/Popover.js +6 -0
  126. package/dist/PowerSearch/PowerSearch.d.ts +43 -4
  127. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  128. package/dist/PowerSearch/PowerSearch.js +445 -134
  129. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  130. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  131. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  132. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  133. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  134. package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
  135. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  136. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  137. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  138. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  139. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  140. package/dist/PowerSearch/PowerSearchToken.js +7 -2
  141. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  142. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  143. package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
  144. package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
  145. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  146. package/dist/PowerSearch/formatFilterValue.js +33 -12
  147. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  148. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  149. package/dist/PowerSearch/formatTokenValue.js +162 -0
  150. package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
  151. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  152. package/dist/PowerSearch/powerSearchDateZone.js +37 -0
  153. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  154. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  155. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  156. package/dist/PowerSearch/types.d.ts +2 -0
  157. package/dist/PowerSearch/types.d.ts.map +1 -1
  158. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  159. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  160. package/dist/RadioList/RadioList.d.ts.map +1 -1
  161. package/dist/RadioList/RadioList.js +3 -2
  162. package/dist/RadioList/RadioListItem.d.ts +1 -1
  163. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  164. package/dist/RadioList/RadioListItem.js +5 -3
  165. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  166. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  167. package/dist/Resizable/ResizeHandle.js +101 -77
  168. package/dist/Resizable/createResizable.d.ts +145 -0
  169. package/dist/Resizable/createResizable.d.ts.map +1 -0
  170. package/dist/Resizable/createResizable.js +575 -0
  171. package/dist/Resizable/useResizable.d.ts +3 -3
  172. package/dist/Resizable/useResizable.d.ts.map +1 -1
  173. package/dist/Resizable/useResizable.js +252 -459
  174. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  175. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  176. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  177. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  178. package/dist/SelectableCard/SelectableCard.js +36 -11
  179. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  180. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  181. package/dist/SelectableCard/selectableCardInput.js +20 -0
  182. package/dist/Selector/Selector.d.ts.map +1 -1
  183. package/dist/Selector/Selector.js +5 -8
  184. package/dist/Slider/sliderTouchController.js +2 -2
  185. package/dist/Spinner/Spinner.d.ts +1 -1
  186. package/dist/Spinner/Spinner.d.ts.map +1 -1
  187. package/dist/Spinner/Spinner.js +60 -58
  188. package/dist/Switch/Switch.d.ts.map +1 -1
  189. package/dist/Switch/Switch.js +4 -10
  190. package/dist/Switch/useSwitchTouch.js +4 -4
  191. package/dist/Table/BaseTable.d.ts.map +1 -1
  192. package/dist/Table/BaseTable.js +29 -8
  193. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  194. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  195. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  196. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  199. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  200. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  201. package/dist/TextInput/TextInput.d.ts +2 -2
  202. package/dist/TextInput/TextInput.d.ts.map +1 -1
  203. package/dist/TextInput/TextInput.js +10 -7
  204. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  205. package/dist/TimeInput/TimeInput.js +2 -0
  206. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  207. package/dist/TimeInput/TouchTimeField.js +2 -0
  208. package/dist/Timer/Timer.d.ts.map +1 -1
  209. package/dist/Timer/Timer.js +2 -0
  210. package/dist/Timestamp/Timestamp.js +1 -1
  211. package/dist/Toast/Toast.d.ts +11 -1
  212. package/dist/Toast/Toast.d.ts.map +1 -1
  213. package/dist/Toast/Toast.js +25 -15
  214. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  215. package/dist/Toast/ToastViewport.js +97 -34
  216. package/dist/Toast/types.d.ts +9 -3
  217. package/dist/Toast/types.d.ts.map +1 -1
  218. package/dist/Toast/useToast.d.ts.map +1 -1
  219. package/dist/Toast/useToast.js +1 -0
  220. package/dist/Tokenizer/Tokenizer.d.ts +49 -37
  221. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  222. package/dist/Tokenizer/Tokenizer.js +22 -19
  223. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  224. package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
  225. package/dist/Tokenizer/index.d.ts +1 -1
  226. package/dist/Tokenizer/index.d.ts.map +1 -1
  227. package/dist/Tooltip/useTooltip.d.ts +19 -1
  228. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  229. package/dist/Tooltip/useTooltip.js +34 -53
  230. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  231. package/dist/Typeahead/BaseTypeahead.js +27 -18
  232. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  233. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  234. package/dist/animator/createAnimator.d.ts +98 -0
  235. package/dist/animator/createAnimator.d.ts.map +1 -0
  236. package/dist/animator/createAnimator.js +259 -0
  237. package/dist/astryx.css +39 -6
  238. package/dist/gestures/GestureHost.d.ts +16 -1
  239. package/dist/gestures/GestureHost.d.ts.map +1 -1
  240. package/dist/gestures/GestureHost.js +1 -1
  241. package/dist/gestures/PressTracker.d.ts.map +1 -1
  242. package/dist/gestures/PressTracker.js +4 -3
  243. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  244. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  245. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  246. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  247. package/dist/hooks/actionGroupTracker.js +13 -3
  248. package/dist/hooks/index.d.ts +1 -0
  249. package/dist/hooks/index.d.ts.map +1 -1
  250. package/dist/hooks/index.js +1 -0
  251. package/dist/hooks/longPressDetector.d.ts +66 -0
  252. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  253. package/dist/hooks/longPressDetector.js +200 -0
  254. package/dist/hooks/pressGroupContext.d.ts +6 -0
  255. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  256. package/dist/hooks/pressGroupContext.js +20 -0
  257. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  258. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  259. package/dist/hooks/rootScrollStyles.js +207 -0
  260. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  261. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  262. package/dist/hooks/scrollLockTouchGuard.js +134 -0
  263. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  264. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  265. package/dist/hooks/scrollbarGutter.js +36 -23
  266. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  267. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  268. package/dist/hooks/useActionGroupTracking.js +174 -0
  269. package/dist/hooks/useAnimator.d.ts +41 -0
  270. package/dist/hooks/useAnimator.d.ts.map +1 -0
  271. package/dist/hooks/useAnimator.js +70 -0
  272. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  273. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  274. package/dist/hooks/useAttachment.d.ts +1 -1
  275. package/dist/hooks/useAttachment.js +1 -1
  276. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  277. package/dist/hooks/useAutoMediaMode.js +1 -0
  278. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  279. package/dist/hooks/useBusyAnnouncement.js +2 -0
  280. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  281. package/dist/hooks/useDevWarning.js +2 -0
  282. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  283. package/dist/hooks/useFocusTrap.js +2 -0
  284. package/dist/hooks/useGridFocus.d.ts +8 -5
  285. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  286. package/dist/hooks/useGridFocus.js +4 -3
  287. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  288. package/dist/hooks/useHotkeys.js +3 -0
  289. package/dist/hooks/useImageMode.d.ts.map +1 -1
  290. package/dist/hooks/useImageMode.js +3 -0
  291. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  292. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  293. package/dist/hooks/useInputStatusIcon.js +2 -2
  294. package/dist/hooks/useKeyboardHint.js +1 -1
  295. package/dist/hooks/useLongPress.d.ts +8 -9
  296. package/dist/hooks/useLongPress.d.ts.map +1 -1
  297. package/dist/hooks/useLongPress.js +23 -106
  298. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  299. package/dist/hooks/useMenuHover.js +2 -0
  300. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  301. package/dist/hooks/useMenuPress.js +3 -0
  302. package/dist/hooks/useOverflow.d.ts.map +1 -1
  303. package/dist/hooks/useOverflow.js +2 -1
  304. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  305. package/dist/hooks/usePressFeedback.js +1 -0
  306. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  307. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  308. package/dist/hooks/useResolvedRequired.js +3 -0
  309. package/dist/hooks/useScrollLock.d.ts +7 -9
  310. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  311. package/dist/hooks/useScrollLock.js +55 -48
  312. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  313. package/dist/hooks/useScrollableArea.js +5 -0
  314. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  315. package/dist/hooks/useStreamingText.js +3 -0
  316. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  317. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  318. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  319. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  320. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  321. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  322. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  323. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  324. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/en.generated.js +30 -0
  326. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  328. package/dist/index.d.ts +1 -0
  329. package/dist/index.d.ts.map +1 -1
  330. package/dist/index.js +4 -0
  331. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  332. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  333. package/dist/internal/indicatorPress.stylex.js +26 -0
  334. package/dist/internal/selectable-card.d.ts +21 -0
  335. package/dist/internal/selectable-card.d.ts.map +1 -0
  336. package/dist/internal/selectable-card.js +20 -0
  337. package/dist/internal/sheetDraft.d.ts +2 -2
  338. package/dist/internal/sheetDraft.js +2 -2
  339. package/dist/motion/animatedLayout.d.ts.map +1 -1
  340. package/dist/motion/animatedLayout.js +7 -7
  341. package/dist/motion/animator.d.ts +14 -14
  342. package/dist/motion/animator.d.ts.map +1 -1
  343. package/dist/motion/animator.js +45 -20
  344. package/dist/motion/progress.d.ts +88 -0
  345. package/dist/motion/progress.d.ts.map +1 -0
  346. package/dist/motion/progress.js +128 -0
  347. package/dist/motion/reducedMotion.d.ts.map +1 -1
  348. package/dist/motion/reducedMotion.js +3 -1
  349. package/dist/motion/uikit/alert.d.ts +41 -0
  350. package/dist/motion/uikit/alert.d.ts.map +1 -0
  351. package/dist/motion/uikit/alert.js +43 -0
  352. package/dist/motion/uikit/index.d.ts +4 -3
  353. package/dist/motion/uikit/index.d.ts.map +1 -1
  354. package/dist/motion/uikit/index.js +4 -3
  355. package/dist/motion/uikit/picker.d.ts +96 -0
  356. package/dist/motion/uikit/picker.d.ts.map +1 -0
  357. package/dist/motion/uikit/picker.js +117 -0
  358. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  359. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  360. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  361. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  362. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  363. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  364. package/dist/theme/Theme.d.ts.map +1 -1
  365. package/dist/theme/Theme.js +29 -4
  366. package/dist/theme/motionKnobs.d.ts +4 -3
  367. package/dist/theme/motionKnobs.d.ts.map +1 -1
  368. package/dist/theme/motionKnobs.js +3 -2
  369. package/dist/theme/themeMotion.d.ts +6 -0
  370. package/dist/theme/themeMotion.d.ts.map +1 -1
  371. package/dist/theme/themeMotion.js +7 -0
  372. package/dist/utils/dateParser.d.ts.map +1 -1
  373. package/dist/utils/dateParser.js +12 -0
  374. package/dist/utils/focusReturn.d.ts +15 -0
  375. package/dist/utils/focusReturn.d.ts.map +1 -1
  376. package/dist/utils/focusReturn.js +28 -0
  377. package/dist/utils/interactionModality.d.ts.map +1 -1
  378. package/dist/utils/interactionModality.js +4 -0
  379. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  380. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  381. package/dist/utils/interactionOverlay.stylex.js +3 -2
  382. package/dist/utils/plainDate.d.ts +8 -0
  383. package/dist/utils/plainDate.d.ts.map +1 -1
  384. package/dist/utils/plainDate.js +19 -0
  385. package/dist/utils/pressFeedback.d.ts.map +1 -1
  386. package/dist/utils/pressFeedback.js +20 -6
  387. package/dist/utils/triggerFocus.d.ts +36 -0
  388. package/dist/utils/triggerFocus.d.ts.map +1 -0
  389. package/dist/utils/triggerFocus.js +65 -0
  390. package/locales/en.json +120 -0
  391. package/locales/pseudo.json +90 -0
  392. package/package.json +14 -9
  393. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  394. package/src/AlertDialog/AlertDialog.tsx +46 -5
  395. package/src/AppShell/AppShell.tsx +4 -0
  396. package/src/BottomSheet/BottomSheet.tsx +1 -0
  397. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  398. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  399. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  400. package/src/BottomSheet/useSheetGestures.ts +10 -1
  401. package/src/Button/Button.tsx +26 -4
  402. package/src/Calendar/Calendar.tsx +36 -25
  403. package/src/Carousel/Carousel.tsx +1 -0
  404. package/src/Chat/ChatComposerInput.tsx +2 -0
  405. package/src/Chat/ChatMessageList.tsx +2 -1
  406. package/src/Chat/useChatDictation.ts +1 -0
  407. package/src/Chat/useChatNewMessages.ts +1 -1
  408. package/src/Chat/useChatStreamScroll.ts +2 -0
  409. package/src/Chat/useSpeechRecognition.ts +2 -0
  410. package/src/Chat/useTriggerMenu.tsx +1 -1
  411. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  412. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  413. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  414. package/src/CodeBlock/CodeBlock.tsx +41 -4
  415. package/src/CommandPalette/CommandPalette.tsx +1 -0
  416. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  417. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  418. package/src/ContextMenu/ContextMenu.tsx +2 -2
  419. package/src/DateInput/MonthScroller.tsx +8 -2
  420. package/src/DateInput/PickerWheel.tsx +765 -0
  421. package/src/DateInput/TouchDateField.tsx +1 -0
  422. package/src/DateInput/Wheel.tsx +94 -150
  423. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  424. package/src/DateInput/usePointerDragScroll.ts +1 -0
  425. package/src/DateInput/useScrollSettle.ts +2 -0
  426. package/src/DateInput/useWheelListbox.ts +112 -0
  427. package/src/DateInput/wheelOptions.ts +155 -0
  428. package/src/DateInput/wheelPhysics.ts +406 -0
  429. package/src/DateInput/wheelStrip.ts +341 -0
  430. package/src/DateTimeInput/TouchDateTimeField.tsx +2 -0
  431. package/src/Dialog/Dialog.tsx +12 -32
  432. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  433. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  434. package/src/Field/Field.tsx +2 -2
  435. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  436. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  437. package/src/FormLayout/FormLayout.tsx +5 -1
  438. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  439. package/src/HoverCard/HoverCard.tsx +58 -6
  440. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  441. package/src/HoverCard/useHoverCard.tsx +49 -54
  442. package/src/Icon/Icon.doc.mjs +49 -8
  443. package/src/Icon/Icon.tsx +15 -7
  444. package/src/IconButton/IconButton.doc.mjs +141 -21
  445. package/src/Item/useSwipeAction.ts +2 -0
  446. package/src/Layer/modalOutlet.ts +2 -0
  447. package/src/Layer/outsidePress.ts +1 -0
  448. package/src/Layer/useLayer.tsx +2 -0
  449. package/src/Layer/useLayerDismissal.ts +2 -0
  450. package/src/Layer/usePressPin.ts +81 -15
  451. package/src/Layer/useTouchTrigger.ts +2 -0
  452. package/src/Lightbox/Lightbox.tsx +19 -0
  453. package/src/MobileNav/MobileNav.tsx +9 -30
  454. package/src/Outline/useOutlineFromDOM.ts +2 -0
  455. package/src/Outline/useScrollSpy.ts +2 -0
  456. package/src/OverflowList/OverflowList.tsx +2 -0
  457. package/src/Popover/Popover.tsx +4 -0
  458. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  459. package/src/PowerSearch/PowerSearch.tsx +627 -157
  460. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  461. package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
  462. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  463. package/src/PowerSearch/PowerSearchToken.tsx +7 -0
  464. package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
  465. package/src/PowerSearch/formatFilterValue.ts +55 -17
  466. package/src/PowerSearch/formatTokenValue.ts +222 -0
  467. package/src/PowerSearch/powerSearchDateZone.ts +64 -0
  468. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  469. package/src/PowerSearch/types.ts +2 -0
  470. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  471. package/src/RadioList/RadioList.tsx +3 -2
  472. package/src/RadioList/RadioListItem.tsx +5 -3
  473. package/src/Resizable/Resizable.doc.mjs +5 -4
  474. package/src/Resizable/ResizeHandle.tsx +169 -109
  475. package/src/Resizable/createResizable.ts +831 -0
  476. package/src/Resizable/useResizable.ts +292 -623
  477. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  478. package/src/SelectableCard/SelectableCard.tsx +39 -10
  479. package/src/SelectableCard/selectableCardInput.ts +30 -0
  480. package/src/Selector/Selector.tsx +5 -12
  481. package/src/Slider/sliderTouchController.ts +2 -2
  482. package/src/Spinner/Spinner.tsx +77 -63
  483. package/src/Switch/Switch.tsx +2 -6
  484. package/src/Switch/useSwitchTouch.ts +4 -4
  485. package/src/Table/BaseTable.tsx +46 -12
  486. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  487. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  488. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  489. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  490. package/src/TextInput/TextInput.tsx +11 -10
  491. package/src/TimeInput/TimeInput.tsx +2 -0
  492. package/src/TimeInput/TouchTimeField.tsx +2 -0
  493. package/src/Timer/Timer.tsx +1 -0
  494. package/src/Timestamp/Timestamp.tsx +1 -1
  495. package/src/Toast/Toast.doc.mjs +4 -3
  496. package/src/Toast/Toast.tsx +52 -32
  497. package/src/Toast/ToastViewport.tsx +123 -35
  498. package/src/Toast/types.ts +9 -3
  499. package/src/Toast/useToast.tsx +1 -0
  500. package/src/Tokenizer/Tokenizer.doc.mjs +19 -3
  501. package/src/Tokenizer/Tokenizer.tsx +73 -51
  502. package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
  503. package/src/Tokenizer/index.ts +1 -0
  504. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  505. package/src/Tooltip/useTooltip.tsx +61 -56
  506. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  507. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  508. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  509. package/src/animator/createAnimator.doc.mjs +153 -0
  510. package/src/animator/createAnimator.ts +324 -0
  511. package/src/gestures/GestureHost.ts +1 -1
  512. package/src/gestures/PressTracker.ts +4 -3
  513. package/src/gestures/README.md +10 -4
  514. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  515. package/src/hooks/actionGroupTracker.ts +20 -5
  516. package/src/hooks/index.ts +2 -0
  517. package/src/hooks/longPressDetector.ts +273 -0
  518. package/src/hooks/pressGroupContext.ts +21 -0
  519. package/src/hooks/rootScrollStyles.ts +247 -0
  520. package/src/hooks/scrollLockTouchGuard.ts +182 -0
  521. package/src/hooks/scrollbarGutter.ts +41 -26
  522. package/src/hooks/useActionGroupTracking.ts +224 -0
  523. package/src/hooks/useAnimator.doc.mjs +109 -0
  524. package/src/hooks/useAnimator.ts +67 -0
  525. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  526. package/src/hooks/useAttachment.ts +1 -1
  527. package/src/hooks/useAutoMediaMode.ts +1 -0
  528. package/src/hooks/useBusyAnnouncement.ts +2 -0
  529. package/src/hooks/useDevWarning.ts +2 -0
  530. package/src/hooks/useFocusTrap.ts +2 -0
  531. package/src/hooks/useGridFocus.doc.mjs +6 -6
  532. package/src/hooks/useGridFocus.ts +10 -7
  533. package/src/hooks/useHotkeys.ts +2 -0
  534. package/src/hooks/useImageMode.ts +2 -0
  535. package/src/hooks/useInputStatusIcon.tsx +3 -2
  536. package/src/hooks/useKeyboardHint.tsx +1 -1
  537. package/src/hooks/useLongPress.doc.mjs +2 -2
  538. package/src/hooks/useLongPress.ts +32 -122
  539. package/src/hooks/useMenuHover.ts +1 -0
  540. package/src/hooks/useMenuPress.ts +2 -0
  541. package/src/hooks/useOverflow.ts +2 -1
  542. package/src/hooks/usePressFeedback.ts +1 -0
  543. package/src/hooks/useResolvedRequired.ts +3 -0
  544. package/src/hooks/useScrollLock.doc.mjs +51 -12
  545. package/src/hooks/useScrollLock.ts +57 -60
  546. package/src/hooks/useScrollableArea.ts +4 -0
  547. package/src/hooks/useStreamingText.ts +2 -0
  548. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  549. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  550. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  551. package/src/i18n/generated-locales/en.generated.ts +41 -0
  552. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  553. package/src/index.ts +13 -0
  554. package/src/internal/indicatorPress.stylex.ts +24 -0
  555. package/src/internal/selectable-card.ts +21 -0
  556. package/src/internal/sheetDraft.ts +2 -2
  557. package/src/motion/MEASUREMENTS.md +18 -0
  558. package/src/motion/README.md +10 -5
  559. package/src/motion/animatedLayout.ts +10 -5
  560. package/src/motion/animator.ts +66 -31
  561. package/src/motion/progress.ts +155 -0
  562. package/src/motion/reducedMotion.ts +3 -1
  563. package/src/motion/uikit/alert.ts +43 -0
  564. package/src/motion/uikit/index.ts +4 -3
  565. package/src/motion/uikit/picker.ts +116 -0
  566. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  567. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  568. package/src/theme/Theme.tsx +37 -3
  569. package/src/theme/motionKnobs.ts +4 -3
  570. package/src/theme/themeMotion.ts +7 -0
  571. package/src/utils/dateParser.ts +16 -0
  572. package/src/utils/focusReturn.ts +30 -0
  573. package/src/utils/interactionModality.ts +4 -0
  574. package/src/utils/interactionOverlay.stylex.ts +3 -2
  575. package/src/utils/plainDate.ts +21 -0
  576. package/src/utils/pressFeedback.ts +24 -6
  577. package/src/utils/triggerFocus.ts +80 -0
  578. package/dist/internal/touch-sheet.d.ts +0 -21
  579. package/dist/internal/touch-sheet.d.ts.map +0 -1
  580. package/dist/internal/touch-sheet.js +0 -19
  581. package/src/internal/touch-sheet.ts +0 -21
@@ -1,48 +1,29 @@
1
- export interface WheelOption {
2
- /** Stable numeric identity of the row (a month 1-12, or a year). */
3
- value: number;
4
- /** Row text. */
5
- label: string;
6
- /**
7
- * Rows outside min/max stay visible but cannot be committed: a wheel that
8
- * stops on one travels on to the nearest enabled row.
9
- */
10
- isDisabled?: boolean;
11
- }
12
- export interface WheelProps {
13
- /** Accessible name for the column, e.g. "Month". */
14
- label: string;
15
- /** Rows, top to bottom. */
16
- options: ReadonlyArray<WheelOption>;
17
- /** Committed value; must match one option's `value`. */
18
- value: number;
19
- /** Fired when the wheel comes to rest on a different, enabled row. */
20
- onChange: (value: number) => void;
21
- /**
22
- * False while the wheel is hidden — scroll offsets of a display:none
23
- * scroller are meaningless, so listeners and the initial scroll wait.
24
- */
25
- isActive?: boolean;
26
- }
1
+ import { type WheelProps } from './wheelOptions.js';
2
+ export { nearestEnabledIndex, type WheelOption, type WheelProps, } from './wheelOptions.js';
27
3
  /**
28
- * The enabled row nearest `index`: `index` itself when it is enabled,
29
- * otherwise the closest enabled row on either side. A tie goes to the side of
30
- * `towardIndex` (the committed row), and a wheel with no enabled row stays on
31
- * `towardIndex`.
4
+ * One picker column: UIPickerView's motion with flat rows under a finger, the
5
+ * snap-scrolling column under a fine pointer.
32
6
  *
33
7
  * @example
34
8
  * ```
35
- * // Hours 0-23 with 09:00-17:00 bounds: stopping on 7 rests on 9.
36
- * nearestEnabledIndex(hourOptions, 7, 10); // 9
9
+ * <Wheel
10
+ * label="Month"
11
+ * options={monthOptions}
12
+ * value={month}
13
+ * onChange={setMonth}
14
+ * />
37
15
  * ```
38
16
  */
39
- export declare function nearestEnabledIndex(options: ReadonlyArray<WheelOption>, index: number, towardIndex: number): number;
17
+ export declare function Wheel(props: WheelProps): import("react").JSX.Element;
18
+ export declare namespace Wheel {
19
+ var displayName: string;
20
+ }
40
21
  /**
41
- * One snap-scrolling picker column.
22
+ * One snap-scrolling picker column, under a fine pointer.
42
23
  *
43
24
  * @example
44
25
  * ```
45
- * <Wheel
26
+ * <ScrollWheel
46
27
  * label="Month"
47
28
  * options={monthOptions}
48
29
  * value={month}
@@ -50,8 +31,8 @@ export declare function nearestEnabledIndex(options: ReadonlyArray<WheelOption>,
50
31
  * />
51
32
  * ```
52
33
  */
53
- export declare function Wheel({ label, options, value, onChange, isActive, }: WheelProps): import("react").JSX.Element;
54
- export declare namespace Wheel {
34
+ export declare function ScrollWheel({ label, options, value, onChange, isActive, }: WheelProps): import("react").JSX.Element;
35
+ export declare namespace ScrollWheel {
55
36
  var displayName: string;
56
37
  }
57
38
  //# sourceMappingURL=Wheel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../src/DateInput/Wheel.tsx"],"names":[],"mappings":"AAwNA,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAsBR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAe,GAChB,EAAE,UAAU,+BA4UZ;yBAlVe,KAAK"}
1
+ {"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../src/DateInput/Wheel.tsx"],"names":[],"mappings":"AAoDA,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AA6JxB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,+BAKtC;yBALe,KAAK;;;AASrB;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAe,GAChB,EAAE,UAAU,+BA6TZ;yBAnUe,WAAW"}
@@ -4,51 +4,45 @@
4
4
 
5
5
  /**
6
6
  * @file Wheel.tsx
7
- * @input Option list, selected value, change callback
8
- * @output Exports Wheel — a snap-scrolling picker column
9
- * @position Internal component; consumed by MonthYearWheels.tsx
7
+ * @input Option list, selected value and change callback
8
+ * @output Exports Wheel (one picker column), ScrollWheel (the scrolling
9
+ * column) and the shared types of wheelOptions.ts
10
+ * @position Internal component; consumed by MonthYearWheels.tsx,
11
+ * TouchTimeField.tsx and TouchDateTimeField.tsx
10
12
  *
11
- * A wheel is a scroll container, not a custom gesture surface. Momentum,
12
- * rubber-banding, and the settle animation are the platform's; all this adds
13
- * is `scroll-snap-align: center` on each option, half a viewport of padding at
14
- * each end so the first and last option can reach the middle, and a commit
15
- * when the scrolling stops and no finger or mouse drag still holds it.
13
+ * Wheel picks its column by the primary pointer. Under a finger it is
14
+ * PickerWheel.tsx, the touch layer, imported here alone. Under a fine pointer
15
+ * it is the snap-scrolling column below.
16
16
  *
17
- * The falloff (rows fading and tipping away from the centre) is a CSS
18
- * scroll-driven animation on a `view()` timeline — the browser interpolates it
19
- * against each row's own position in the scrollport, so it stays glued to the
20
- * finger with no JS in the frame loop. It is guarded by `@supports`, because a
21
- * browser that does not understand `animation-timeline` would otherwise run
22
- * the same keyframes on the document timeline and simply play them once.
23
- *
24
- * Under Reduce Motion, the wheel's own scrolls (a step from a key or a click,
25
- * the travel to the nearest enabled row) land without travel. They cross-fade
26
- * on a touch screen and land at once otherwise. A finger's scroll and its
27
- * momentum stay the platform's.
28
- *
29
- * Accessibility: this is a listbox, not a novel widget. It is one tab stop
30
- * with arrow/Home/End/PageUp/PageDown keys, `aria-activedescendant` tracking
31
- * the active row, and every row reachable by tap — none of which depends on
32
- * the scroll-driven decoration.
17
+ * The scrolling column is a scroll container: momentum, rubber-banding and the
18
+ * settle are the platform's. Its rows fade and tip on a CSS `view()` timeline,
19
+ * behind `@supports`. Under Reduce Motion its own scrolls land without travel.
33
20
  *
34
21
  * SYNC: When modified, update:
22
+ * - /packages/core/src/DateInput/PickerWheel.tsx (the touch column)
23
+ * - /packages/core/src/DateInput/wheelOptions.ts
35
24
  * - /packages/core/src/DateInput/TouchDateField.tsx
36
25
  * - /packages/core/src/DateTimeInput/TouchDateTimeField.tsx
37
26
  * - /packages/core/src/DateInput/DateInput.doc.mjs
38
27
  * - /packages/core/src/DateInput/DateInputTouch.test.tsx
39
28
  */
40
- import { useCallback, useEffect, useId, useRef, useState } from 'react';
29
+ import { useCallback, useEffect, useRef, useState } from 'react';
41
30
  import * as stylex from '@stylexjs/stylex';
42
31
  import "../theme/tokens.stylex.js";
43
32
  import { colorVars, radiusVars, fontWeightVars, typeScaleVars, spacingVars, durationVars } from "../theme/tokens.stylex.js";
44
33
  import { focusOutlineStyles } from "../utils/index.js";
45
34
  import { playReducedMotionDip, reducedMotionFade } from "../motion/reducedMotion.js";
35
+ import { useTouchPresentation } from "../utils/touchPresentation.js";
36
+ import { PickerWheel } from "./PickerWheel.js";
46
37
  import "./tokens.stylex.js";
47
38
  import { dateInputTouchSizes, dateInputTouchGeometry } from "./tokens.stylex.js";
48
39
  import { useOwnScrollGesture } from "./useOwnScrollGesture.js";
49
40
  import { usePointerDragScroll } from "./usePointerDragScroll.js";
50
41
  import { useScrollSettle } from "./useScrollSettle.js";
42
+ import { useWheelListbox } from "./useWheelListbox.js";
43
+ import { endIndex, nearestEnabledIndex, steppedIndex } from "./wheelOptions.js";
51
44
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
45
+ export { nearestEnabledIndex } from "./wheelOptions.js";
52
46
  const ITEM_BLOCK_SIZE = dateInputTouchSizes.wheelItemSize;
53
47
 
54
48
  /**
@@ -78,47 +72,41 @@ const styles = {
78
72
  $$css: true
79
73
  }
80
74
  };
75
+
81
76
  /**
82
- * The enabled row nearest `index`: `index` itself when it is enabled,
83
- * otherwise the closest enabled row on either side. A tie goes to the side of
84
- * `towardIndex` (the committed row), and a wheel with no enabled row stays on
85
- * `towardIndex`.
77
+ * One picker column: UIPickerView's motion with flat rows under a finger, the
78
+ * snap-scrolling column under a fine pointer.
86
79
  *
87
80
  * @example
88
81
  * ```
89
- * // Hours 0-23 with 09:00-17:00 bounds: stopping on 7 rests on 9.
90
- * nearestEnabledIndex(hourOptions, 7, 10); // 9
82
+ * <Wheel
83
+ * label="Month"
84
+ * options={monthOptions}
85
+ * value={month}
86
+ * onChange={setMonth}
87
+ * />
91
88
  * ```
92
89
  */
93
- export function nearestEnabledIndex(options, index, towardIndex) {
94
- const isEnabled = i => i >= 0 && i < options.length && !options[i].isDisabled;
95
- if (isEnabled(index)) {
96
- return index;
97
- }
98
- for (let distance = 1; distance < options.length; distance++) {
99
- const below = index - distance;
100
- const above = index + distance;
101
- const isBelowEnabled = isEnabled(below);
102
- const isAboveEnabled = isEnabled(above);
103
- if (isBelowEnabled && isAboveEnabled) {
104
- return towardIndex < index ? below : above;
105
- }
106
- if (isBelowEnabled) {
107
- return below;
108
- }
109
- if (isAboveEnabled) {
110
- return above;
111
- }
112
- }
113
- return towardIndex;
90
+ export function Wheel(props) {
91
+ // One touch model on every touch device: a finger gets UIPickerView's motion
92
+ // with flat rows, a fine pointer the scrolling column.
93
+ const {
94
+ isTouch
95
+ } = useTouchPresentation();
96
+ return isTouch ? /*#__PURE__*/_jsx(PickerWheel, {
97
+ ...props
98
+ }) : /*#__PURE__*/_jsx(ScrollWheel, {
99
+ ...props
100
+ });
114
101
  }
102
+ Wheel.displayName = 'Wheel';
115
103
 
116
104
  /**
117
- * One snap-scrolling picker column.
105
+ * One snap-scrolling picker column, under a fine pointer.
118
106
  *
119
107
  * @example
120
108
  * ```
121
- * <Wheel
109
+ * <ScrollWheel
122
110
  * label="Month"
123
111
  * options={monthOptions}
124
112
  * value={month}
@@ -126,14 +114,13 @@ export function nearestEnabledIndex(options, index, towardIndex) {
126
114
  * />
127
115
  * ```
128
116
  */
129
- export function Wheel({
117
+ export function ScrollWheel({
130
118
  label,
131
119
  options,
132
120
  value,
133
121
  onChange,
134
122
  isActive = true
135
123
  }) {
136
- const id = useId();
137
124
  const scrollerRef = useRef(null);
138
125
  const selectedIndex = Math.max(0, options.findIndex(option => option.value === value));
139
126
  // Which row is under the band right now. Tracks the finger during a scroll;
@@ -277,6 +264,8 @@ export function Wheel({
277
264
  // useScrollSettle. The settle handler re-checks the position afterwards, so
278
265
  // a correction that is genuinely needed still happens, just at rest.
279
266
  const parkedRef = useRef(false);
267
+ // Syncs the wheel's scroll position with the selected index while the wheel
268
+ // is active.
280
269
  useEffect(() => {
281
270
  if (!isActive) {
282
271
  parkedRef.current = false;
@@ -310,6 +299,8 @@ export function Wheel({
310
299
  // Highlight follows the finger. rAF-throttled: a scroll can fire far more
311
300
  // often than the display refreshes, and this only feeds a repaint.
312
301
  const frameRef = useRef(undefined);
302
+ // Syncs a scroll listener with the active wheel. It updates the highlighted
303
+ // row.
313
304
  useEffect(() => {
314
305
  const scroller = scrollerRef.current;
315
306
  if (scroller == null || !isActive) {
@@ -349,48 +340,46 @@ export function Wheel({
349
340
  useOwnScrollGesture(scrollerRef, 'all', {
350
341
  isEnabled: isActive
351
342
  });
352
- const moveBy = useCallback(delta => {
353
- const next = Math.min(options.length - 1, Math.max(0, activeIndex + delta));
354
- const option = options[next];
355
- if (option == null || option.isDisabled) {
343
+
344
+ // A key commits the row it moves to and scrolls the column there.
345
+ const moveTo = useCallback(row => {
346
+ const option = row == null ? undefined : options[row];
347
+ if (row == null || option == null || option.isDisabled) {
356
348
  return;
357
349
  }
358
- setActiveIndex(next);
359
- scrollToIndex(next, 'smooth');
350
+ setActiveIndex(row);
351
+ scrollToIndex(row, 'smooth');
360
352
  if (option.value !== value) {
361
353
  onChange(option.value);
362
354
  }
363
- }, [activeIndex, options, scrollToIndex, value, onChange]);
364
- const handleKeyDown = useCallback(event => {
365
- switch (event.key) {
366
- case 'ArrowDown':
367
- event.preventDefault();
368
- moveBy(1);
369
- break;
370
- case 'ArrowUp':
371
- event.preventDefault();
372
- moveBy(-1);
373
- break;
374
- case 'PageDown':
375
- event.preventDefault();
376
- moveBy(10);
377
- break;
378
- case 'PageUp':
379
- event.preventDefault();
380
- moveBy(-10);
381
- break;
382
- case 'Home':
383
- event.preventDefault();
384
- moveBy(-activeIndex);
385
- break;
386
- case 'End':
387
- event.preventDefault();
388
- moveBy(options.length - 1 - activeIndex);
389
- break;
390
- default:
391
- break;
355
+ }, [options, scrollToIndex, value, onChange]);
356
+ const moveBy = useCallback(delta => moveTo(steppedIndex(options, activeIndex, delta)), [moveTo, options, activeIndex]);
357
+
358
+ // Home and End: the first and the last enabled row.
359
+ const toEnd = useCallback(end => moveTo(endIndex(options, end)), [moveTo, options]);
360
+ const activate = useCallback(index => {
361
+ const option = options[index];
362
+ if (option == null || option.isDisabled) {
363
+ return;
392
364
  }
393
- }, [moveBy, activeIndex, options.length]);
365
+ setActiveIndex(index);
366
+ scrollToIndex(index, 'smooth');
367
+ if (option.value !== value) {
368
+ onChange(option.value);
369
+ }
370
+ }, [options, scrollToIndex, value, onChange]);
371
+ const {
372
+ listboxProps,
373
+ optionProps
374
+ } = useWheelListbox({
375
+ label,
376
+ options,
377
+ value,
378
+ activeIndex,
379
+ stepBy: moveBy,
380
+ toEnd,
381
+ activate
382
+ });
394
383
  return /*#__PURE__*/_jsxs("div", {
395
384
  ...{
396
385
  className: "x1n2onr6 x1cqoux5 xeuugli"
@@ -402,16 +391,11 @@ export function Wheel({
402
391
  }
403
392
  }), /*#__PURE__*/_jsx("div", {
404
393
  ref: scrollerRef,
405
- role: "listbox",
406
- "aria-label": label,
407
- "aria-activedescendant": `${id}-${options[activeIndex]?.value}`,
408
- tabIndex: 0,
409
- onKeyDown: handleKeyDown
394
+ ...listboxProps,
410
395
  // Read in the capture phase. usePointerDragScroll stops a primary
411
396
  // mouse press from bubbling, so that it does not reach BottomSheet's
412
397
  // drag. A bubbling handler would never see a mouse, and would keep the
413
398
  // last touch.
414
- ,
415
399
  onPointerDownCapture: event => {
416
400
  lastPointerRef.current = event.pointerType;
417
401
  },
@@ -420,20 +404,7 @@ export function Wheel({
420
404
  },
421
405
  ...stylex.props(styles.scroller, focusOutlineStyles.focusVisible),
422
406
  children: options.map((option, index) => /*#__PURE__*/_jsx("div", {
423
- id: `${id}-${option.value}`,
424
- role: "option",
425
- "aria-selected": option.value === value,
426
- "aria-disabled": option.isDisabled || undefined,
427
- onClick: () => {
428
- if (option.isDisabled) {
429
- return;
430
- }
431
- setActiveIndex(index);
432
- scrollToIndex(index, 'smooth');
433
- if (option.value !== value) {
434
- onChange(option.value);
435
- }
436
- },
407
+ ...optionProps(option, index),
437
408
  ...{
438
409
  0: {
439
410
  className: "x78zum5 x6s0dn4 xl56j7k x6hpsvf xf314gf x1hdbdi8 xc342km xng3xce xjbqb8w x18juvz8 x1sodnla x1tgivj0 xuxw1ft x1ypdohk x16khyan x87ps6o x1jbe559 xuedmi6"
@@ -458,4 +429,4 @@ export function Wheel({
458
429
  })]
459
430
  });
460
431
  }
461
- Wheel.displayName = 'Wheel';
432
+ ScrollWheel.displayName = 'ScrollWheel';
@@ -27,6 +27,16 @@ export type OwnScrollGestureOptions = {
27
27
  * so momentum and snapping are never second-guessed.
28
28
  */
29
29
  onSwipe?: (direction: 1 | -1) => void;
30
+ /**
31
+ * Also keep the pointer a touch lands with, for an `'all'` scroller that pans
32
+ * through the gesture system rather than natively. A sheet arms its pull-down
33
+ * on its body's `pointerdown`, and counts on a native pan to cancel a touch
34
+ * pointer. A pan of the gesture system never cancels it. Without this, the
35
+ * sheet follows the first 8 px of a downward drag before the scroller's own
36
+ * pan takes over. The gesture host and the shared modality tracker listen in
37
+ * the capture phase, before this.
38
+ */
39
+ isPointerKept?: boolean;
30
40
  };
31
41
  /**
32
42
  * Claim touch gestures that start on `ref`'s element, so an ancestor cannot
@@ -1 +1 @@
1
- {"version":3,"file":"useOwnScrollGesture.d.ts","sourceRoot":"","sources":["../../src/DateInput/useOwnScrollGesture.ts"],"names":[],"mappings":"AAiFA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAKpC;;;GAGG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEzC,MAAM,MAAM,uBAAuB,GAAG;IACpC;yDACqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,IAAI,GAAE,SAAiB,EACvB,OAAO,GAAE,uBAA4B,GACpC,IAAI,CA+FN"}
1
+ {"version":3,"file":"useOwnScrollGesture.d.ts","sourceRoot":"","sources":["../../src/DateInput/useOwnScrollGesture.ts"],"names":[],"mappings":"AAkFA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAKpC;;;GAGG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEzC,MAAM,MAAM,uBAAuB,GAAG;IACpC;yDACqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;IACtC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,IAAI,GAAE,SAAiB,EACvB,OAAO,GAAE,uBAA4B,GACpC,IAAI,CA0GN"}
@@ -6,7 +6,8 @@
6
6
  * @file useOwnScrollGesture.ts
7
7
  * @input A scroll container ref and which axis it owns
8
8
  * @output Stops touch gestures on that container from reaching an ancestor
9
- * @position Internal behavior hook; consumed by Wheel.tsx and MonthScroller.tsx
9
+ * @position Internal behavior hook; consumed by Wheel.tsx, PickerWheel.tsx and
10
+ * MonthScroller.tsx
10
11
  *
11
12
  * Lets a nested scroller keep the finger that lands on it.
12
13
  *
@@ -106,13 +107,17 @@ export const SWIPE_DISTANCE = 32;
106
107
  export function useOwnScrollGesture(ref, axis = 'all', options = {}) {
107
108
  const {
108
109
  isEnabled = true,
109
- onSwipe
110
+ onSwipe,
111
+ isPointerKept = false
110
112
  } = options;
111
113
 
112
114
  // Read through a ref so a caller need not memoize the callback: re-running
113
115
  // this effect would tear the listeners off mid-gesture.
114
116
  const onSwipeRef = useRef(onSwipe);
115
117
  onSwipeRef.current = onSwipe;
118
+
119
+ // Syncs touch listeners on the element with `isEnabled`. They decide which
120
+ // gesture owns a horizontal scroll.
116
121
  useEffect(() => {
117
122
  const element = ref.current;
118
123
  if (element == null || !isEnabled) {
@@ -180,6 +185,8 @@ export function useOwnScrollGesture(ref, axis = 'all', options = {}) {
180
185
  // bookkeeping.
181
186
  claimed = null;
182
187
  };
188
+ const keepPointer = event => event.stopPropagation();
189
+ const isKeepingPointer = axis === 'all' && isPointerKept;
183
190
  element.addEventListener('touchstart', onStart, {
184
191
  passive: true
185
192
  });
@@ -192,11 +199,17 @@ export function useOwnScrollGesture(ref, axis = 'all', options = {}) {
192
199
  element.addEventListener('touchcancel', onEnd, {
193
200
  passive: true
194
201
  });
202
+ if (isKeepingPointer) {
203
+ element.addEventListener('pointerdown', keepPointer);
204
+ }
195
205
  return () => {
196
206
  element.removeEventListener('touchstart', onStart);
197
207
  element.removeEventListener('touchmove', onMove);
198
208
  element.removeEventListener('touchend', onEnd);
199
209
  element.removeEventListener('touchcancel', onEnd);
210
+ if (isKeepingPointer) {
211
+ element.removeEventListener('pointerdown', keepPointer);
212
+ }
200
213
  };
201
- }, [ref, axis, isEnabled]);
214
+ }, [ref, axis, isEnabled, isPointerKept]);
202
215
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePointerDragScroll.d.ts","sourceRoot":"","sources":["../../src/DateInput/usePointerDragScroll.ts"],"names":[],"mappings":"AAwDA;;;GAGG;AACH,eAAO,MAAM,SAAS,IAAI,CAAC;AAK3B,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,SAAS,GAAE,OAAc,GACxB,sBAAsB,CAmJxB"}
1
+ {"version":3,"file":"usePointerDragScroll.d.ts","sourceRoot":"","sources":["../../src/DateInput/usePointerDragScroll.ts"],"names":[],"mappings":"AAwDA;;;GAGG;AACH,eAAO,MAAM,SAAS,IAAI,CAAC;AAK3B,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,SAAS,GAAE,OAAc,GACxB,sBAAsB,CAoJxB"}
@@ -74,6 +74,8 @@ const SETTLE_FALLBACK_MS = 260;
74
74
  */
75
75
  export function usePointerDragScroll(ref, isEnabled = true) {
76
76
  const isDraggingRef = useRef(false);
77
+
78
+ // Syncs pointer listeners with `isEnabled`. A mouse drag scrolls the element.
77
79
  useEffect(() => {
78
80
  const element = ref.current;
79
81
  if (element == null || !isEnabled) {
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollSettle.d.ts","sourceRoot":"","sources":["../../src/DateInput/useScrollSettle.ts"],"names":[],"mappings":"AA0DA;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,4EAA4E;AAC5E,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;OAKG;IACH,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,EACxC,SAAS,GAAE,OAAc,EACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,GACnC,iBAAiB,CAuGnB"}
1
+ {"version":3,"file":"useScrollSettle.d.ts","sourceRoot":"","sources":["../../src/DateInput/useScrollSettle.ts"],"names":[],"mappings":"AA0DA;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,4EAA4E;AAC5E,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;OAKG;IACH,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,EACxC,SAAS,GAAE,OAAc,EACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,GACnC,iBAAiB,CAyGnB"}
@@ -81,6 +81,9 @@ export function useScrollSettle(ref, onSettle, isEnabled = true, isHeldRef) {
81
81
  const onSettleRef = useRef(onSettle);
82
82
  onSettleRef.current = onSettle;
83
83
  const isAtRestRef = useRef(true);
84
+
85
+ // Syncs scroll, touch and pointer listeners with `isEnabled`. They find when
86
+ // scrolling stops.
84
87
  useEffect(() => {
85
88
  const element = ref.current;
86
89
  if (element == null || !isEnabled) {
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @file useWheelListbox.ts
3
+ * @input A wheel's label, options, committed value and active row, and its
4
+ * presentation's three moves: a step, an end, a row
5
+ * @output useWheelListbox: the listbox and option props both wheels share
6
+ * @position Internal hook of ScrollWheel (Wheel.tsx) and PickerWheel.tsx
7
+ *
8
+ * A wheel is a listbox: one tab stop, with Arrow, Page, Home and End keys.
9
+ * Each presentation decides what its keys and clicks do to its own column.
10
+ *
11
+ * SYNC: When modified, update Wheel.tsx and PickerWheel.tsx.
12
+ */
13
+ import { type KeyboardEvent } from 'react';
14
+ import type { WheelOption } from './wheelOptions.js';
15
+ export interface WheelListboxProps {
16
+ /** Accessible name for the column. */
17
+ label: string;
18
+ /** Rows, top to bottom. */
19
+ options: ReadonlyArray<WheelOption>;
20
+ /** Committed value. */
21
+ value: number;
22
+ /** The row `aria-activedescendant` names. */
23
+ activeIndex: number;
24
+ /** An Arrow or Page key: a step of `delta` rows. */
25
+ stepBy: (delta: number) => void;
26
+ /** Home or End. */
27
+ toEnd: (end: 'first' | 'last') => void;
28
+ /** A click on row `index`. */
29
+ activate: (index: number) => void;
30
+ }
31
+ /**
32
+ * The listbox and option props of one wheel column: ids, ARIA, the keys and
33
+ * a click on a row. `aria-activedescendant` marks the active row, and a click
34
+ * reaches every row. The scrolling column steps from the row under its band. The
35
+ * touch column steps from the row it is heading to.
36
+ *
37
+ * @example
38
+ * ```
39
+ * const {listboxProps, optionProps} = useWheelListbox({label, options, value, activeIndex, stepBy, toEnd, activate});
40
+ * <div {...listboxProps}>{options.map((option, index) => <div key={option.value} {...optionProps(option, index)} />)}</div>
41
+ * ```
42
+ */
43
+ export declare function useWheelListbox({ label, options, value, activeIndex, stepBy, toEnd, activate, }: WheelListboxProps): {
44
+ listboxProps: {
45
+ role: "listbox";
46
+ 'aria-label': string;
47
+ 'aria-activedescendant': string;
48
+ tabIndex: number;
49
+ onKeyDown: (event: KeyboardEvent) => void;
50
+ };
51
+ optionProps: (option: WheelOption, index: number) => {
52
+ id: string;
53
+ role: "option";
54
+ 'aria-selected': boolean;
55
+ 'aria-disabled': true | undefined;
56
+ onClick: () => void;
57
+ };
58
+ };
59
+ //# sourceMappingURL=useWheelListbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWheelListbox.d.ts","sourceRoot":"","sources":["../../src/DateInput/useWheelListbox.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,KAAK,aAAa,EAAC,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAKhD,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,mBAAmB;IACnB,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IACvC,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,KAAK,EACL,WAAW,EACX,MAAM,EACN,KAAK,EACL,QAAQ,GACT,EAAE,iBAAiB;;;;;;2BAGR,aAAa;;0BAwCC,WAAW,SAAS,MAAM;;;;;;;EAQnD"}
@@ -0,0 +1,88 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useWheelListbox.ts
7
+ * @input A wheel's label, options, committed value and active row, and its
8
+ * presentation's three moves: a step, an end, a row
9
+ * @output useWheelListbox: the listbox and option props both wheels share
10
+ * @position Internal hook of ScrollWheel (Wheel.tsx) and PickerWheel.tsx
11
+ *
12
+ * A wheel is a listbox: one tab stop, with Arrow, Page, Home and End keys.
13
+ * Each presentation decides what its keys and clicks do to its own column.
14
+ *
15
+ * SYNC: When modified, update Wheel.tsx and PickerWheel.tsx.
16
+ */
17
+ import { useCallback, useId } from 'react';
18
+ /** Rows a Page Up or Page Down key moves. */
19
+ const PAGE_ROWS = 10;
20
+ /**
21
+ * The listbox and option props of one wheel column: ids, ARIA, the keys and
22
+ * a click on a row. `aria-activedescendant` marks the active row, and a click
23
+ * reaches every row. The scrolling column steps from the row under its band. The
24
+ * touch column steps from the row it is heading to.
25
+ *
26
+ * @example
27
+ * ```
28
+ * const {listboxProps, optionProps} = useWheelListbox({label, options, value, activeIndex, stepBy, toEnd, activate});
29
+ * <div {...listboxProps}>{options.map((option, index) => <div key={option.value} {...optionProps(option, index)} />)}</div>
30
+ * ```
31
+ */
32
+ export function useWheelListbox({
33
+ label,
34
+ options,
35
+ value,
36
+ activeIndex,
37
+ stepBy,
38
+ toEnd,
39
+ activate
40
+ }) {
41
+ const id = useId();
42
+ const onKeyDown = useCallback(event => {
43
+ switch (event.key) {
44
+ case 'ArrowDown':
45
+ event.preventDefault();
46
+ stepBy(1);
47
+ break;
48
+ case 'ArrowUp':
49
+ event.preventDefault();
50
+ stepBy(-1);
51
+ break;
52
+ case 'PageDown':
53
+ event.preventDefault();
54
+ stepBy(PAGE_ROWS);
55
+ break;
56
+ case 'PageUp':
57
+ event.preventDefault();
58
+ stepBy(-PAGE_ROWS);
59
+ break;
60
+ case 'Home':
61
+ event.preventDefault();
62
+ toEnd('first');
63
+ break;
64
+ case 'End':
65
+ event.preventDefault();
66
+ toEnd('last');
67
+ break;
68
+ default:
69
+ break;
70
+ }
71
+ }, [stepBy, toEnd]);
72
+ return {
73
+ listboxProps: {
74
+ role: 'listbox',
75
+ 'aria-label': label,
76
+ 'aria-activedescendant': `${id}-${options[activeIndex]?.value}`,
77
+ tabIndex: 0,
78
+ onKeyDown
79
+ },
80
+ optionProps: (option, index) => ({
81
+ id: `${id}-${option.value}`,
82
+ role: 'option',
83
+ 'aria-selected': option.value === value,
84
+ 'aria-disabled': option.isDisabled || undefined,
85
+ onClick: () => activate(index)
86
+ })
87
+ };
88
+ }