@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
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @file wheelOptions.ts
3
+ * @input Nothing; types, the row height and pure functions
4
+ * @output WheelOption, WheelProps, WHEEL_ROW_HEIGHT, nearestEnabledIndex,
5
+ * steppedIndex and endIndex: what both wheels share
6
+ * @position Internal; read by Wheel.tsx (which re-exports all of it) and
7
+ * PickerWheel.tsx
8
+ *
9
+ * SYNC: When modified, update:
10
+ * - /packages/core/src/DateInput/Wheel.tsx
11
+ * - /packages/core/src/DateInput/PickerWheel.tsx
12
+ */
13
+ /**
14
+ * The row height, px (`dateInputTouchSizes.wheelItemSize`): the pitch of both
15
+ * columns' rows, and the unit of the touch wheel's offset.
16
+ */
17
+ export declare const WHEEL_ROW_HEIGHT = 28;
18
+ export interface WheelOption {
19
+ /** Stable numeric identity of the row (a month 1-12, or a year). */
20
+ value: number;
21
+ /** Row text. */
22
+ label: string;
23
+ /**
24
+ * Rows outside min/max stay visible but cannot be committed: a wheel that
25
+ * stops on one travels on to the nearest enabled row.
26
+ */
27
+ isDisabled?: boolean;
28
+ /**
29
+ * Where the row falls when a key steps the wheel; without it, rows step in
30
+ * list order. A 12-hour hour column sets the full hour, so 12 PM comes before
31
+ * 1 PM.
32
+ */
33
+ order?: number;
34
+ }
35
+ export interface WheelProps {
36
+ /** Accessible name for the column, e.g. "Month". */
37
+ label: string;
38
+ /** Rows, top to bottom. */
39
+ options: ReadonlyArray<WheelOption>;
40
+ /** Committed value; must match one option's `value`. */
41
+ value: number;
42
+ /** Fired when the wheel comes to rest on a different, enabled row. */
43
+ onChange: (value: number) => void;
44
+ /**
45
+ * False while the wheel is hidden. The scrolling column then waits to listen
46
+ * and scroll, because a hidden scroller's offsets mean nothing. The touch
47
+ * wheel turns its gestures off, and shows a value set from outside without
48
+ * motion.
49
+ */
50
+ isActive?: boolean;
51
+ }
52
+ /**
53
+ * The enabled row nearest `index`: `index` itself when it is enabled,
54
+ * otherwise the closest enabled row on either side. A tie goes to the side of
55
+ * `towardIndex` (the committed row), and a wheel with no enabled row stays on
56
+ * `towardIndex`.
57
+ *
58
+ * @example
59
+ * ```
60
+ * // Hours 0-23 with 09:00-17:00 bounds: stopping on 7 rests on 9.
61
+ * nearestEnabledIndex(hourOptions, 7, 10); // 9
62
+ * ```
63
+ */
64
+ export declare function nearestEnabledIndex(options: ReadonlyArray<WheelOption>, index: number, towardIndex: number): number;
65
+ /**
66
+ * The row a key moves a wheel to from `from` by `delta` rows, in key order. It
67
+ * is the next enabled row from the target in the key's direction. Past the
68
+ * last enabled row, it is the last enabled row before the target. Null when no
69
+ * enabled row lies in that direction, so the key commits nothing.
70
+ */
71
+ export declare function steppedIndex(options: ReadonlyArray<WheelOption>, from: number, delta: number): number | null;
72
+ /** The first or the last enabled row in key order: where Home or End moves a wheel. */
73
+ export declare function endIndex(options: ReadonlyArray<WheelOption>, end: 'first' | 'last'): number | null;
74
+ //# sourceMappingURL=wheelOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheelOptions.d.ts","sourceRoot":"","sources":["../../src/DateInput/wheelOptions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,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;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;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;;;;;OAKG;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;AAaD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAyBf;AAED,uFAAuF;AACvF,wBAAgB,QAAQ,CACtB,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,GAAG,EAAE,OAAO,GAAG,MAAM,GACpB,MAAM,GAAG,IAAI,CAKf"}
@@ -0,0 +1,98 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file wheelOptions.ts
5
+ * @input Nothing; types, the row height and pure functions
6
+ * @output WheelOption, WheelProps, WHEEL_ROW_HEIGHT, nearestEnabledIndex,
7
+ * steppedIndex and endIndex: what both wheels share
8
+ * @position Internal; read by Wheel.tsx (which re-exports all of it) and
9
+ * PickerWheel.tsx
10
+ *
11
+ * SYNC: When modified, update:
12
+ * - /packages/core/src/DateInput/Wheel.tsx
13
+ * - /packages/core/src/DateInput/PickerWheel.tsx
14
+ */
15
+
16
+ /**
17
+ * The row height, px (`dateInputTouchSizes.wheelItemSize`): the pitch of both
18
+ * columns' rows, and the unit of the touch wheel's offset.
19
+ */
20
+ export const WHEEL_ROW_HEIGHT = 28;
21
+ /**
22
+ * The enabled row nearest `index`: `index` itself when it is enabled,
23
+ * otherwise the closest enabled row on either side. A tie goes to the side of
24
+ * `towardIndex` (the committed row), and a wheel with no enabled row stays on
25
+ * `towardIndex`.
26
+ *
27
+ * @example
28
+ * ```
29
+ * // Hours 0-23 with 09:00-17:00 bounds: stopping on 7 rests on 9.
30
+ * nearestEnabledIndex(hourOptions, 7, 10); // 9
31
+ * ```
32
+ */
33
+ export function nearestEnabledIndex(options, index, towardIndex) {
34
+ const isEnabled = i => i >= 0 && i < options.length && !options[i].isDisabled;
35
+ if (isEnabled(index)) {
36
+ return index;
37
+ }
38
+ for (let distance = 1; distance < options.length; distance++) {
39
+ const below = index - distance;
40
+ const above = index + distance;
41
+ const isBelowEnabled = isEnabled(below);
42
+ const isAboveEnabled = isEnabled(above);
43
+ if (isBelowEnabled && isAboveEnabled) {
44
+ return towardIndex < index ? below : above;
45
+ }
46
+ if (isBelowEnabled) {
47
+ return below;
48
+ }
49
+ if (isAboveEnabled) {
50
+ return above;
51
+ }
52
+ }
53
+ return towardIndex;
54
+ }
55
+
56
+ /** The rows' indices in the order keys step them: by `order`, else list order. */
57
+ function inKeyOrder(options) {
58
+ const indices = options.map((_, index) => index);
59
+ if (options.every(option => option.order == null)) {
60
+ return indices;
61
+ }
62
+ return indices.sort((a, b) => (options[a].order ?? a) - (options[b].order ?? b));
63
+ }
64
+
65
+ /**
66
+ * The row a key moves a wheel to from `from` by `delta` rows, in key order. It
67
+ * is the next enabled row from the target in the key's direction. Past the
68
+ * last enabled row, it is the last enabled row before the target. Null when no
69
+ * enabled row lies in that direction, so the key commits nothing.
70
+ */
71
+ export function steppedIndex(options, from, delta) {
72
+ const count = options.length;
73
+ if (count === 0 || delta === 0) {
74
+ return null;
75
+ }
76
+ const rows = inKeyOrder(options);
77
+ const start = Math.max(0, rows.indexOf(from));
78
+ const isEnabled = position => !options[rows[position]].isDisabled;
79
+ const step = Math.sign(delta);
80
+ const target = Math.min(count - 1, Math.max(0, start + delta));
81
+ for (let position = target; position >= 0 && position < count; position += step) {
82
+ if (isEnabled(position)) {
83
+ return position === start ? null : rows[position];
84
+ }
85
+ }
86
+ for (let position = target; position !== start; position -= step) {
87
+ if (isEnabled(position)) {
88
+ return rows[position];
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+
94
+ /** The first or the last enabled row in key order: where Home or End moves a wheel. */
95
+ export function endIndex(options, end) {
96
+ const enabled = inKeyOrder(options).filter(index => !options[index].isDisabled);
97
+ return (end === 'first' ? enabled[0] : enabled[enabled.length - 1]) ?? null;
98
+ }
@@ -0,0 +1,127 @@
1
+ import { type SpringDescription } from '../motion/spring.js';
2
+ /** A motion of the wheel's offset, from t = 0 to `duration` (seconds). */
3
+ export interface WheelCurve {
4
+ /** Seconds until the wheel is at rest on `to`. */
5
+ readonly duration: number;
6
+ /** Where the motion ends. */
7
+ readonly to: number;
8
+ /** Offset at `t` seconds; `to` from `duration` on. */
9
+ value(t: number): number;
10
+ /** Velocity at `t` seconds, px/s; 0 from `duration` on. */
11
+ velocity(t: number): number;
12
+ }
13
+ /** How a release moves the wheel. */
14
+ export type WheelPlanKind = 'coast' | 'snap' | 'edge' | 'return';
15
+ /** What a release does: the curve, and the row it ends on. */
16
+ export interface WheelPlan {
17
+ readonly kind: WheelPlanKind;
18
+ /** The row the wheel comes to rest on. */
19
+ readonly index: number;
20
+ readonly curve: WheelCurve;
21
+ }
22
+ /** The rows a wheel moves over. */
23
+ export interface WheelLayout {
24
+ /** Row height, px. */
25
+ readonly rowHeight: number;
26
+ readonly rowCount: number;
27
+ }
28
+ /**
29
+ * The longest a plan runs, s: the animator's limit (`MAX_DURATION_MS` in
30
+ * motion/animator.ts). A spring that has not settled by then (an undamped
31
+ * one, which never does) snaps onto its end.
32
+ */
33
+ export declare const MAX_PLAN_SECONDS = 30;
34
+ /** The constants' scale for a wheel whose rows are `rowHeight` px tall. */
35
+ export declare function scaleFor(rowHeight: number): number;
36
+ /** The wheel at rest on `offset`: a curve that does not move. */
37
+ export declare function restCurve(offset: number): WheelCurve;
38
+ /** The offsets of the first and last rows. */
39
+ export declare function offsetBounds({ rowHeight, rowCount }: WheelLayout): {
40
+ min: number;
41
+ max: number;
42
+ };
43
+ /**
44
+ * The offset a drag shows for the finger's `offset`: past the first or last
45
+ * row it is rubber-banded, as a UIPickerView's table is.
46
+ */
47
+ export declare function dragOffset(offset: number, layout: WheelLayout): number;
48
+ /** The nearest row to `offset`, clamped to the rows. */
49
+ export declare function nearestIndex(offset: number, layout: WheelLayout): number;
50
+ /**
51
+ * Ease from `from` onto `to` as UIKit does after a release without velocity.
52
+ * The distance left falls as e^(−k t), and the ease ends within half a device
53
+ * pixel.
54
+ */
55
+ export declare function snapCurve(from: number, to: number, scale?: number): WheelCurve;
56
+ /**
57
+ * A coast from `from` at `velocity` that keeps the velocity and ends on `to` at
58
+ * the stop speed. The rate is re-solved, so the speed falls from |velocity| to
59
+ * the stop speed over exactly `to − from`.
60
+ */
61
+ export declare function coastCurve(from: number, velocity: number, to: number, scale?: number): WheelCurve;
62
+ /**
63
+ * The bounce spring, from `from` with `velocity`, onto `to`. `bounce` is
64
+ * `scroll.bounce`'s spring as its caller resolves it.
65
+ */
66
+ export declare function bounceCurve(from: number, velocity: number, to: number, scale?: number, bounce?: SpringDescription): WheelCurve;
67
+ /**
68
+ * A coast that runs into an end: the normal decay until the offset reaches
69
+ * `edge`, then the bounce spring with the velocity it has there.
70
+ */
71
+ export declare function edgeCurve(from: number, velocity: number, edge: number, scale?: number, bounceSpring?: SpringDescription): WheelCurve;
72
+ /**
73
+ * Where the scroll view projects a release. This is the coast's rest point at
74
+ * the normal rate, short of the stop speed. UIScrollView sums it the same way
75
+ * (`projectDistance`: r ÷ (1 − r) ms of the speed).
76
+ */
77
+ export declare function projectRelease(offset: number, velocity: number, scale?: number): number;
78
+ /**
79
+ * What the wheel does when the finger lifts at `offset` with `velocity`
80
+ * (px/s, positive when the rows move up). `bounce` is `scroll.bounce`'s
81
+ * spring as the wheel resolves it. The velocity is the pan's
82
+ * `scrollVelocity()` at the lift. The plan follows UIKit, as measured:
83
+ *
84
+ * - Inside the rows, a release slower than `release.minimumSpeed` carries no
85
+ * velocity. Past an end, the velocity is kept.
86
+ * - The scroll view projects the coast (`projectRelease`), and the picker
87
+ * snaps that to the nearest row. The coast keeps the release velocity and
88
+ * stops exactly on that row.
89
+ * - A projection past an end is not re-solved. The coast decays at the normal
90
+ * rate into the end, and the bounce takes its velocity there.
91
+ * - A release without velocity eases onto the nearest row at `snapRate`.
92
+ * - A release past an end returns on the bounce spring.
93
+ * - A spring that has not settled by the animator's limit snaps onto its end
94
+ * there, as the animator's own motion does.
95
+ *
96
+ * @example
97
+ * ```
98
+ * const plan = planRelease(963.67, 933.4, {rowHeight: 32, rowCount: 60});
99
+ * plan.index; // 45: the coast stops on row 45 after about 2.3 s
100
+ * ```
101
+ */
102
+ export declare function planRelease(offset: number, velocity: number, layout: WheelLayout, bounce?: SpringDescription): WheelPlan;
103
+ /**
104
+ * The tap spin onto a row: UIKit's animated setContentOffset, over
105
+ * `duration` seconds on `curve`.
106
+ */
107
+ export declare function spinCurve(from: number, to: number, duration: number, curve: readonly [number, number, number, number]): WheelCurve;
108
+ /**
109
+ * The times (seconds, ascending) at which a row's centre reaches the band's
110
+ * centre during `curve`, after `after` and up to `until`. They are thinned so
111
+ * that two are never closer than the selection tick's minimum interval. `last`
112
+ * is the time of the previous tick, if any. Leaving the row the wheel starts on
113
+ * is not a tick; reaching the next one is.
114
+ */
115
+ export declare function tickTimes(curve: WheelCurve, rowHeight: number, { after, until, last, step, }?: {
116
+ after?: number;
117
+ until?: number;
118
+ last?: number;
119
+ step?: number;
120
+ }): number[];
121
+ /**
122
+ * Whether moving from offset `from` to `to` brings a row's centre onto the
123
+ * band's. That is a multiple of `rowHeight` in (from, to] moving up, or in [to,
124
+ * from) moving down.
125
+ */
126
+ export declare function reachesRow(from: number, to: number, rowHeight: number): boolean;
127
+ //# sourceMappingURL=wheelPhysics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheelPhysics.d.ts","sourceRoot":"","sources":["../../src/DateInput/wheelPhysics.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAwB,KAAK,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAI/E,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjE,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAQD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOpD;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAC,EAAE,WAAW,GAAG;IAChE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAEA;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAWtE;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,UAAU,CAmBzE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,SAAI,GACR,UAAU,CAyBZ;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,SAAI,EACT,MAAM,GAAE,iBAAiC,GACxC,UAAU,CAgBZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAI,EACT,YAAY,GAAE,iBAAiC,GAC9C,UAAU,CA0BZ;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,GACR,MAAM,CAOR;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE,iBAAiC,GACxC,SAAS,CA6BX;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC/C,UAAU,CAqBZ;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,EACE,KAAS,EACT,KAAsB,EACtB,IAAgB,EAChB,IAAc,GACf,GAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAM,GACrE,MAAM,EAAE,CAkBV;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAQT"}
@@ -0,0 +1,341 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file wheelPhysics.ts
5
+ * @input A wheel's offset and release velocity, its rows, and the UIKit
6
+ * picker constants (motion/uikit/picker.ts)
7
+ * @output The curves a picker wheel moves on: the release plan, the tap spin,
8
+ * the rubber band, and the row crossings that tick
9
+ * @position Pure math of the touch picker wheel (PickerWheel.tsx)
10
+ *
11
+ * Positions are px, times seconds and velocities px/s. Row k is under the
12
+ * band at an offset of k rows. UIKit's pt values scale by `scale`.
13
+ *
14
+ * SYNC: When modified, update wheelPhysics.test.ts and PickerWheel.tsx.
15
+ */
16
+
17
+ import { cubicBezier } from "../motion/bezier.js";
18
+ import { projectDistance } from "../motion/projection.js";
19
+ import { solveDecay } from "../motion/decay.js";
20
+ import { rubberBand } from "../motion/rubberBand.js";
21
+ import { solveSpring, toSpring } from "../motion/spring.js";
22
+ import { picker } from "../motion/uikit/picker.js";
23
+ import { scroll } from "../motion/uikit/scroll.js";
24
+
25
+ /** A motion of the wheel's offset, from t = 0 to `duration` (seconds). */
26
+
27
+ /** How a release moves the wheel. */
28
+
29
+ /** What a release does: the curve, and the row it ends on. */
30
+
31
+ /** The rows a wheel moves over. */
32
+
33
+ /** UIKit's row height in pt: the unit the picker constants are measured in. */
34
+ const UIKIT_ROW_HEIGHT = picker.geometry.rowHeight;
35
+
36
+ /** Below half a device pixel at 3×, a motion is on its row. */
37
+ const AT_REST_PT = 1 / 6;
38
+
39
+ /**
40
+ * The longest a plan runs, s: the animator's limit (`MAX_DURATION_MS` in
41
+ * motion/animator.ts). A spring that has not settled by then (an undamped
42
+ * one, which never does) snaps onto its end.
43
+ */
44
+ export const MAX_PLAN_SECONDS = 30;
45
+
46
+ /** The constants' scale for a wheel whose rows are `rowHeight` px tall. */
47
+ export function scaleFor(rowHeight) {
48
+ return rowHeight / UIKIT_ROW_HEIGHT;
49
+ }
50
+
51
+ /** The wheel at rest on `offset`: a curve that does not move. */
52
+ export function restCurve(offset) {
53
+ return {
54
+ duration: 0,
55
+ to: offset,
56
+ value: () => offset,
57
+ velocity: () => 0
58
+ };
59
+ }
60
+
61
+ /** The offsets of the first and last rows. */
62
+ export function offsetBounds({
63
+ rowHeight,
64
+ rowCount
65
+ }) {
66
+ return {
67
+ min: 0,
68
+ max: Math.max(0, rowCount - 1) * rowHeight
69
+ };
70
+ }
71
+
72
+ /**
73
+ * The offset a drag shows for the finger's `offset`: past the first or last
74
+ * row it is rubber-banded, as a UIPickerView's table is.
75
+ */
76
+ export function dragOffset(offset, layout) {
77
+ const {
78
+ min,
79
+ max
80
+ } = offsetBounds(layout);
81
+ const dimension = picker.geometry.rubberBandDimension * scaleFor(layout.rowHeight);
82
+ if (offset < min) {
83
+ return min + rubberBand(offset - min, dimension);
84
+ }
85
+ if (offset > max) {
86
+ return max + rubberBand(offset - max, dimension);
87
+ }
88
+ return offset;
89
+ }
90
+
91
+ /** The nearest row to `offset`, clamped to the rows. */
92
+ export function nearestIndex(offset, layout) {
93
+ const index = Math.round(offset / layout.rowHeight);
94
+ return Math.min(Math.max(index, 0), Math.max(0, layout.rowCount - 1));
95
+ }
96
+
97
+ /**
98
+ * Ease from `from` onto `to` as UIKit does after a release without velocity.
99
+ * The distance left falls as e^(−k t), and the ease ends within half a device
100
+ * pixel.
101
+ */
102
+ export function snapCurve(from, to, scale = 1) {
103
+ const distance = from - to;
104
+ const rate = picker.snapRate * 1000;
105
+ const epsilon = AT_REST_PT * scale;
106
+ if (Math.abs(distance) <= epsilon) {
107
+ return {
108
+ duration: 0,
109
+ to,
110
+ value: () => to,
111
+ velocity: () => 0
112
+ };
113
+ }
114
+ const duration = Math.log(Math.abs(distance) / epsilon) / rate;
115
+ return {
116
+ duration,
117
+ to,
118
+ value: t => t >= duration ? to : to + distance * Math.exp(-rate * t),
119
+ velocity: t => t >= duration ? 0 : -rate * distance * Math.exp(-rate * t)
120
+ };
121
+ }
122
+
123
+ /**
124
+ * A coast from `from` at `velocity` that keeps the velocity and ends on `to` at
125
+ * the stop speed. The rate is re-solved, so the speed falls from |velocity| to
126
+ * the stop speed over exactly `to − from`.
127
+ */
128
+ export function coastCurve(from, velocity, to, scale = 1) {
129
+ const stopSpeed = picker.release.stopSpeed * 1000 * scale;
130
+ const distance = to - from;
131
+ const speed = Math.abs(velocity);
132
+ if (distance === 0 || Math.sign(distance) !== Math.sign(velocity) || speed <= stopSpeed) {
133
+ return snapCurve(from, to, scale);
134
+ }
135
+ const direction = Math.sign(distance);
136
+ // Per second: the speed falls by λ × the distance covered.
137
+ const lambda = (speed - stopSpeed) / Math.abs(distance);
138
+ const duration = Math.log(speed / stopSpeed) / lambda;
139
+ return {
140
+ duration,
141
+ to,
142
+ value: t => t >= duration ? to : from + direction * speed * -Math.expm1(-lambda * t) / lambda,
143
+ velocity: t => t >= duration ? 0 : direction * speed * Math.exp(-lambda * t)
144
+ };
145
+ }
146
+
147
+ /**
148
+ * The bounce spring, from `from` with `velocity`, onto `to`. `bounce` is
149
+ * `scroll.bounce`'s spring as its caller resolves it.
150
+ */
151
+ export function bounceCurve(from, velocity, to, scale = 1, bounce = scroll.bounce) {
152
+ const spring = solveSpring(toSpring(bounce), {
153
+ from,
154
+ to,
155
+ velocity
156
+ });
157
+ const duration = Math.min(MAX_PLAN_SECONDS, spring.settleTime(AT_REST_PT * scale));
158
+ return {
159
+ duration,
160
+ to,
161
+ value: t => t >= duration ? to : spring.value(t),
162
+ velocity: t => t >= duration ? 0 : spring.velocity(t)
163
+ };
164
+ }
165
+
166
+ /**
167
+ * A coast that runs into an end: the normal decay until the offset reaches
168
+ * `edge`, then the bounce spring with the velocity it has there.
169
+ */
170
+ export function edgeCurve(from, velocity, edge, scale = 1, bounceSpring = scroll.bounce) {
171
+ const decay = solveDecay({
172
+ from,
173
+ velocity
174
+ });
175
+ const hit = decay.timeToReach(edge);
176
+ if (hit == null) {
177
+ return bounceCurve(from, velocity, edge, scale, bounceSpring);
178
+ }
179
+ const bounce = bounceCurve(edge, decay.velocity(hit), edge, scale, bounceSpring);
180
+ const duration = Math.min(MAX_PLAN_SECONDS, hit + bounce.duration);
181
+ return {
182
+ duration,
183
+ to: edge,
184
+ value: t => t >= duration ? edge : t < hit ? decay.value(t) : bounce.value(t - hit),
185
+ velocity: t => t >= duration ? 0 : t < hit ? decay.velocity(t) : bounce.velocity(t - hit)
186
+ };
187
+ }
188
+
189
+ /**
190
+ * Where the scroll view projects a release. This is the coast's rest point at
191
+ * the normal rate, short of the stop speed. UIScrollView sums it the same way
192
+ * (`projectDistance`: r ÷ (1 − r) ms of the speed).
193
+ */
194
+ export function projectRelease(offset, velocity, scale = 1) {
195
+ const stopSpeed = picker.release.stopSpeed * 1000 * scale;
196
+ const speed = Math.abs(velocity);
197
+ if (speed <= stopSpeed) {
198
+ return offset;
199
+ }
200
+ return offset + Math.sign(velocity) * projectDistance(speed - stopSpeed);
201
+ }
202
+
203
+ /**
204
+ * What the wheel does when the finger lifts at `offset` with `velocity`
205
+ * (px/s, positive when the rows move up). `bounce` is `scroll.bounce`'s
206
+ * spring as the wheel resolves it. The velocity is the pan's
207
+ * `scrollVelocity()` at the lift. The plan follows UIKit, as measured:
208
+ *
209
+ * - Inside the rows, a release slower than `release.minimumSpeed` carries no
210
+ * velocity. Past an end, the velocity is kept.
211
+ * - The scroll view projects the coast (`projectRelease`), and the picker
212
+ * snaps that to the nearest row. The coast keeps the release velocity and
213
+ * stops exactly on that row.
214
+ * - A projection past an end is not re-solved. The coast decays at the normal
215
+ * rate into the end, and the bounce takes its velocity there.
216
+ * - A release without velocity eases onto the nearest row at `snapRate`.
217
+ * - A release past an end returns on the bounce spring.
218
+ * - A spring that has not settled by the animator's limit snaps onto its end
219
+ * there, as the animator's own motion does.
220
+ *
221
+ * @example
222
+ * ```
223
+ * const plan = planRelease(963.67, 933.4, {rowHeight: 32, rowCount: 60});
224
+ * plan.index; // 45: the coast stops on row 45 after about 2.3 s
225
+ * ```
226
+ */
227
+ export function planRelease(offset, velocity, layout, bounce = scroll.bounce) {
228
+ const scale = scaleFor(layout.rowHeight);
229
+ const {
230
+ min,
231
+ max
232
+ } = offsetBounds(layout);
233
+ if (offset < min || offset > max) {
234
+ const edge = offset < min ? min : max;
235
+ return {
236
+ kind: 'return',
237
+ index: nearestIndex(edge, layout),
238
+ curve: bounceCurve(offset, velocity, edge, scale, bounce)
239
+ };
240
+ }
241
+ const minimumSpeed = picker.release.minimumSpeed * 1000 * scale;
242
+ const speed = Math.abs(velocity) < minimumSpeed ? 0 : velocity;
243
+ const projected = projectRelease(offset, speed, scale);
244
+ if (projected < min || projected > max) {
245
+ const edge = projected < min ? min : max;
246
+ return {
247
+ kind: 'edge',
248
+ index: nearestIndex(edge, layout),
249
+ curve: edgeCurve(offset, speed, edge, scale, bounce)
250
+ };
251
+ }
252
+ const index = nearestIndex(projected, layout);
253
+ const target = index * layout.rowHeight;
254
+ if (speed === 0) {
255
+ return {
256
+ kind: 'snap',
257
+ index,
258
+ curve: snapCurve(offset, target, scale)
259
+ };
260
+ }
261
+ const curve = coastCurve(offset, speed, target, scale);
262
+ return {
263
+ kind: curve.duration > 0 ? 'coast' : 'snap',
264
+ index,
265
+ curve
266
+ };
267
+ }
268
+
269
+ /**
270
+ * The tap spin onto a row: UIKit's animated setContentOffset, over
271
+ * `duration` seconds on `curve`.
272
+ */
273
+ export function spinCurve(from, to, duration, curve) {
274
+ if (from === to || !(duration > 0)) {
275
+ return restCurve(to);
276
+ }
277
+ const ease = cubicBezier(curve);
278
+ const distance = to - from;
279
+ // Velocity from the eased progress's slope, by a central difference.
280
+ const step = 1e-4;
281
+ return {
282
+ duration,
283
+ to,
284
+ value: t => t >= duration ? to : from + distance * ease(t / duration),
285
+ velocity: t => {
286
+ if (t >= duration || t < 0) {
287
+ return 0;
288
+ }
289
+ const a = ease(Math.max(0, t / duration - step));
290
+ const b = ease(Math.min(1, t / duration + step));
291
+ return distance * (b - a) / (2 * step * duration);
292
+ }
293
+ };
294
+ }
295
+
296
+ /**
297
+ * The times (seconds, ascending) at which a row's centre reaches the band's
298
+ * centre during `curve`, after `after` and up to `until`. They are thinned so
299
+ * that two are never closer than the selection tick's minimum interval. `last`
300
+ * is the time of the previous tick, if any. Leaving the row the wheel starts on
301
+ * is not a tick; reaching the next one is.
302
+ */
303
+ export function tickTimes(curve, rowHeight, {
304
+ after = 0,
305
+ until = curve.duration,
306
+ last = -Infinity,
307
+ step = 1 / 240
308
+ } = {}) {
309
+ const interval = picker.selectionTick.minimumIntervalMs / 1000;
310
+ const times = [];
311
+ let previous = curve.value(after);
312
+ let lastTick = last;
313
+ for (let t = after + step; t < until + step; t += step) {
314
+ const time = Math.min(t, until);
315
+ const value = curve.value(time);
316
+ if (reachesRow(previous, value, rowHeight) && time - lastTick >= interval) {
317
+ times.push(time);
318
+ lastTick = time;
319
+ }
320
+ previous = value;
321
+ if (time === until) {
322
+ break;
323
+ }
324
+ }
325
+ return times;
326
+ }
327
+
328
+ /**
329
+ * Whether moving from offset `from` to `to` brings a row's centre onto the
330
+ * band's. That is a multiple of `rowHeight` in (from, to] moving up, or in [to,
331
+ * from) moving down.
332
+ */
333
+ export function reachesRow(from, to, rowHeight) {
334
+ if (to > from) {
335
+ return Math.floor(to / rowHeight) > Math.floor(from / rowHeight);
336
+ }
337
+ if (to < from) {
338
+ return Math.ceil(to / rowHeight) < Math.ceil(from / rowHeight);
339
+ }
340
+ return false;
341
+ }