@astryxdesign/core 0.7.8 → 0.7.9-canary.0200dfe

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 (585) hide show
  1. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -1
  2. package/dist/AppShell/observeMainOverflow.js +9 -6
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +37 -3
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetPanel.js +40 -8
  7. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
  8. package/dist/BottomSheet/bottomSheetStack.js +4 -3
  9. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  10. package/dist/BottomSheet/useSheetGestures.js +61 -21
  11. package/dist/Calendar/Calendar.d.ts +14 -2
  12. package/dist/Calendar/Calendar.d.ts.map +1 -1
  13. package/dist/Calendar/Calendar.js +63 -74
  14. package/dist/Calendar/getInitialFocusDate.d.ts +4 -1
  15. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -1
  16. package/dist/Calendar/getInitialFocusDate.js +7 -5
  17. package/dist/Calendar/hooks/useCalendarDays.d.ts +19 -2
  18. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  19. package/dist/Calendar/hooks/useCalendarDays.js +57 -64
  20. package/dist/Calendar/hooks/useCalendarNavigation.d.ts +28 -3
  21. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  22. package/dist/Calendar/hooks/useCalendarNavigation.js +33 -22
  23. package/dist/Calendar/styles.d.ts +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.d.ts +2 -1
  25. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  26. package/dist/CheckboxInput/CheckboxInput.js +74 -18
  27. package/dist/CheckboxInput/CheckboxRowPressContext.d.ts +2 -0
  28. package/dist/CheckboxInput/CheckboxRowPressContext.d.ts.map +1 -0
  29. package/dist/CheckboxInput/CheckboxRowPressContext.js +20 -0
  30. package/dist/CheckboxList/CheckboxListItem.d.ts +2 -1
  31. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  32. package/dist/CheckboxList/CheckboxListItem.js +40 -14
  33. package/dist/ClickableCard/ClickableCard.d.ts +1 -1
  34. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  35. package/dist/ClickableCard/ClickableCard.js +5 -1
  36. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  37. package/dist/ContextMenu/ContextMenu.js +2 -0
  38. package/dist/DateInput/DateInput.d.ts +37 -6
  39. package/dist/DateInput/DateInput.d.ts.map +1 -1
  40. package/dist/DateInput/DateInput.js +97 -124
  41. package/dist/DateInput/MonthScroller.d.ts +5 -2
  42. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  43. package/dist/DateInput/MonthScroller.js +26 -29
  44. package/dist/DateInput/MonthYearWheels.d.ts +10 -1
  45. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  46. package/dist/DateInput/MonthYearWheels.js +54 -42
  47. package/dist/DateInput/PickerWheel.d.ts.map +1 -1
  48. package/dist/DateInput/PickerWheel.js +7 -1
  49. package/dist/DateInput/TouchDateField.d.ts +1 -1
  50. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  51. package/dist/DateInput/TouchDateField.js +26 -21
  52. package/dist/DateInput/monthGeometry.d.ts +42 -8
  53. package/dist/DateInput/monthGeometry.d.ts.map +1 -1
  54. package/dist/DateInput/monthGeometry.js +81 -7
  55. package/dist/DateInput/useCalendarPresentation.d.ts +10 -0
  56. package/dist/DateInput/useCalendarPresentation.d.ts.map +1 -0
  57. package/dist/DateInput/useCalendarPresentation.js +32 -0
  58. package/dist/DateInput/useTypedDate.d.ts +92 -0
  59. package/dist/DateInput/useTypedDate.d.ts.map +1 -0
  60. package/dist/DateInput/useTypedDate.js +269 -0
  61. package/dist/DateInput/wheelStrip.js +2 -2
  62. package/dist/DateRangeInput/DateRangeInput.d.ts +17 -1
  63. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  64. package/dist/DateRangeInput/DateRangeInput.js +15 -8
  65. package/dist/DateTimeInput/DateTimeInput.d.ts +26 -3
  66. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  67. package/dist/DateTimeInput/DateTimeInput.js +92 -88
  68. package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
  69. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  70. package/dist/DateTimeInput/TouchDateTimeField.js +26 -20
  71. package/dist/Dialog/Dialog.d.ts +2 -1
  72. package/dist/Dialog/Dialog.d.ts.map +1 -1
  73. package/dist/Dialog/Dialog.js +14 -3
  74. package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
  75. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  76. package/dist/Drawer/useDrawerDialogPresence.js +11 -2
  77. package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
  78. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  79. package/dist/DropdownMenu/DropdownMenu.js +11 -8
  80. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  81. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  83. package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
  84. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
  86. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
  88. package/dist/Field/inputDisabledFocus.d.ts +4 -4
  89. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  90. package/dist/FileInput/FileInput.d.ts.map +1 -1
  91. package/dist/FileInput/FileInput.js +16 -2
  92. package/dist/HoverCard/useHoverCard.d.ts +3 -1
  93. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  94. package/dist/Icon/Icon.d.ts +1 -1
  95. package/dist/InfoTip/InfoTip.d.ts +1 -0
  96. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  97. package/dist/InfoTip/InfoTip.js +6 -18
  98. package/dist/InputGroup/InputGroup.d.ts +4 -3
  99. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  100. package/dist/InputGroup/InputGroup.js +2 -2
  101. package/dist/InputGroup/InputGroupText.d.ts +2 -1
  102. package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
  103. package/dist/InputGroup/InputGroupText.js +2 -1
  104. package/dist/InputGroup/groupStyles.d.ts +1 -1
  105. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  106. package/dist/InputGroup/groupStyles.js +1 -1
  107. package/dist/Item/Item.d.ts +20 -1
  108. package/dist/Item/Item.d.ts.map +1 -1
  109. package/dist/Item/Item.js +97 -29
  110. package/dist/Item/ItemListRowContext.d.ts +2 -0
  111. package/dist/Item/ItemListRowContext.d.ts.map +1 -0
  112. package/dist/Item/ItemListRowContext.js +16 -0
  113. package/dist/Layer/holdEntranceInput.d.ts +24 -0
  114. package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
  115. package/dist/Layer/holdEntranceInput.js +65 -0
  116. package/dist/Layer/inputHold.d.ts +49 -0
  117. package/dist/Layer/inputHold.d.ts.map +1 -0
  118. package/dist/Layer/inputHold.js +636 -0
  119. package/dist/Layer/outsidePress.d.ts +4 -0
  120. package/dist/Layer/outsidePress.d.ts.map +1 -1
  121. package/dist/Layer/outsidePress.js +18 -1
  122. package/dist/Layer/preserveAnimations.d.ts +1 -5
  123. package/dist/Layer/preserveAnimations.d.ts.map +1 -1
  124. package/dist/Layer/preserveAnimations.js +12 -214
  125. package/dist/Layer/useBackdropPress.d.ts +8 -0
  126. package/dist/Layer/useBackdropPress.d.ts.map +1 -1
  127. package/dist/Layer/useBackdropPress.js +31 -2
  128. package/dist/Layer/useLayer.d.ts +3 -1
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +64 -4
  131. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  132. package/dist/Layer/useTouchTrigger.js +4 -0
  133. package/dist/Layout/LayoutContent.d.ts +3 -1
  134. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  135. package/dist/Layout/LayoutContent.js +12 -4
  136. package/dist/Layout/LayoutPanel.d.ts +13 -10
  137. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  138. package/dist/Layout/LayoutPanel.js +81 -11
  139. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  140. package/dist/Lightbox/Lightbox.js +4 -0
  141. package/dist/List/List.d.ts.map +1 -1
  142. package/dist/List/List.js +1 -0
  143. package/dist/List/ListItem.d.ts +5 -4
  144. package/dist/List/ListItem.d.ts.map +1 -1
  145. package/dist/List/ListItem.js +45 -9
  146. package/dist/Markdown/parser.d.ts.map +1 -1
  147. package/dist/Markdown/parser.js +56 -39
  148. package/dist/MetadataList/MetadataList.js +1 -1
  149. package/dist/MobileNav/MobileNav.d.ts +11 -1
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +39 -1
  152. package/dist/MoreMenu/MoreMenu.d.ts +5 -3
  153. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  154. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  155. package/dist/MultiSelector/MultiSelector.js +6 -9
  156. package/dist/NumberInput/NumberInput.d.ts +4 -2
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +244 -11
  159. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  160. package/dist/OverflowList/OverflowList.js +7 -2
  161. package/dist/Popover/usePopover.d.ts +1 -0
  162. package/dist/Popover/usePopover.d.ts.map +1 -1
  163. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  164. package/dist/PowerSearch/PowerSearch.js +12 -5
  165. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
  166. package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
  167. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  169. package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
  170. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  171. package/dist/PowerSearch/formatFilterValue.js +14 -11
  172. package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
  173. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
  174. package/dist/PowerSearch/formatTokenValue.js +6 -3
  175. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  176. package/dist/RadioList/RadioListItem.js +16 -3
  177. package/dist/Resizable/ResizeHandle.d.ts +5 -5
  178. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  179. package/dist/Resizable/ResizeHandle.js +44 -5
  180. package/dist/Resizable/resizablePane.d.ts +58 -0
  181. package/dist/Resizable/resizablePane.d.ts.map +1 -0
  182. package/dist/Resizable/resizablePane.js +137 -0
  183. package/dist/Resizable/useResizable.d.ts +7 -0
  184. package/dist/Resizable/useResizable.d.ts.map +1 -1
  185. package/dist/Resizable/useResizable.js +13 -0
  186. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  187. package/dist/SelectableCard/SelectableCard.d.ts +1 -1
  188. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  189. package/dist/SelectableCard/SelectableCard.js +5 -1
  190. package/dist/Selector/Selector.d.ts.map +1 -1
  191. package/dist/Selector/Selector.js +51 -10
  192. package/dist/SideNav/SideNav.d.ts +9 -3
  193. package/dist/SideNav/SideNav.d.ts.map +1 -1
  194. package/dist/SideNav/SideNav.js +45 -10
  195. package/dist/Slider/sliderTouchController.js +2 -2
  196. package/dist/Spinner/Spinner.d.ts.map +1 -1
  197. package/dist/Spinner/Spinner.js +14 -71
  198. package/dist/Spinner/index.d.ts +1 -1
  199. package/dist/Spinner/index.d.ts.map +1 -1
  200. package/dist/Spinner/spinnerRotor.d.ts +28 -0
  201. package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
  202. package/dist/Spinner/spinnerRotor.js +98 -0
  203. package/dist/Stack/StackItem.d.ts +8 -4
  204. package/dist/Stack/StackItem.d.ts.map +1 -1
  205. package/dist/Stack/StackItem.js +17 -4
  206. package/dist/Switch/Switch.d.ts.map +1 -1
  207. package/dist/Switch/Switch.js +13 -10
  208. package/dist/Switch/useSwitchTouch.js +4 -4
  209. package/dist/TabList/Tab.d.ts.map +1 -1
  210. package/dist/TabList/Tab.js +5 -1
  211. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  212. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  213. package/dist/Timestamp/Timestamp.js +14 -8
  214. package/dist/Timestamp/formatInstant.d.ts +10 -1
  215. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  216. package/dist/Timestamp/formatInstant.js +13 -27
  217. package/dist/Timestamp/tooltipEntries.d.ts +5 -3
  218. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  219. package/dist/Timestamp/tooltipEntries.js +6 -4
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +9 -0
  222. package/dist/Token/TokenLink.d.ts +1 -1
  223. package/dist/Token/TokenLink.d.ts.map +1 -1
  224. package/dist/Token/TokenLink.js +4 -1
  225. package/dist/Tokenizer/Tokenizer.d.ts +14 -10
  226. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  227. package/dist/Tokenizer/Tokenizer.js +189 -89
  228. package/dist/Tooltip/useTooltip.d.ts +3 -1
  229. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  230. package/dist/Tooltip/useTooltip.js +164 -59
  231. package/dist/TreeList/TreeListItem.d.ts +2 -1
  232. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  233. package/dist/TreeList/TreeListItem.js +27 -3
  234. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  235. package/dist/Typeahead/BaseTypeahead.js +2 -1
  236. package/dist/animator/createAnimator.js +2 -2
  237. package/dist/astryx.css +362 -325
  238. package/dist/gestures/GestureHost.d.ts +2 -2
  239. package/dist/gestures/GestureHost.d.ts.map +1 -1
  240. package/dist/gestures/GestureHost.js +21 -6
  241. package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
  242. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  243. package/dist/gestures/PanGestureRecognizer.js +15 -1
  244. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
  245. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/nativeScroll.d.ts +3 -6
  247. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  248. package/dist/gestures/nativeScroll.js +7 -52
  249. package/dist/gestures/wheelSegmenter.d.ts +68 -1
  250. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  251. package/dist/gestures/wheelSegmenter.js +199 -10
  252. package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
  253. package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
  254. package/dist/hooks/StackItemScrollRegion.js +40 -0
  255. package/dist/hooks/computeOverflow.d.ts +2 -0
  256. package/dist/hooks/computeOverflow.d.ts.map +1 -1
  257. package/dist/hooks/computeOverflow.js +1 -1
  258. package/dist/hooks/menuPressGesture.d.ts +133 -21
  259. package/dist/hooks/menuPressGesture.d.ts.map +1 -1
  260. package/dist/hooks/menuPressGesture.js +155 -30
  261. package/dist/hooks/menuPressValues.d.ts +16 -0
  262. package/dist/hooks/menuPressValues.d.ts.map +1 -0
  263. package/dist/hooks/menuPressValues.js +18 -0
  264. package/dist/hooks/useClickableContainer.d.ts +36 -7
  265. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  266. package/dist/hooks/useClickableContainer.js +63 -14
  267. package/dist/hooks/useFocusTrap.d.ts +10 -0
  268. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  269. package/dist/hooks/useFocusTrap.js +225 -132
  270. package/dist/hooks/useKeyboardHighlight.d.ts +17 -0
  271. package/dist/hooks/useKeyboardHighlight.d.ts.map +1 -0
  272. package/dist/hooks/useKeyboardHighlight.js +38 -0
  273. package/dist/hooks/useMediaQuery.d.ts +2 -1
  274. package/dist/hooks/useMediaQuery.d.ts.map +1 -1
  275. package/dist/hooks/useMediaQuery.js +37 -12
  276. package/dist/hooks/useMenuPress.d.ts +34 -1
  277. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  278. package/dist/hooks/useMenuPress.js +93 -5
  279. package/dist/hooks/useOverflow.d.ts +10 -0
  280. package/dist/hooks/useOverflow.d.ts.map +1 -1
  281. package/dist/hooks/useOverflow.js +214 -23
  282. package/dist/hooks/usePressFeedback.d.ts +6 -6
  283. package/dist/hooks/usePressFeedback.js +6 -6
  284. package/dist/hooks/useScrollRegionProps.d.ts +35 -0
  285. package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
  286. package/dist/hooks/useScrollRegionProps.js +51 -0
  287. package/dist/i18n/InternationalizationContext.d.ts +6 -0
  288. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  289. package/dist/i18n/InternationalizationProvider.d.ts +23 -3
  290. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  291. package/dist/i18n/InternationalizationProvider.js +8 -3
  292. package/dist/i18n/generated-english/DateInput/DateInput.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-english/DateInput/DateInput.generated.js +0 -1
  294. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts +8 -0
  295. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts.map +1 -0
  296. package/dist/i18n/generated-english/DateInput/useTypedDate.generated.js +16 -0
  297. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.d.ts.map +1 -1
  298. package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.js +0 -1
  299. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
  300. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
  301. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
  302. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/en.generated.js +5 -0
  304. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
  306. package/dist/i18n/index.d.ts +2 -0
  307. package/dist/i18n/index.d.ts.map +1 -1
  308. package/dist/i18n/index.js +1 -0
  309. package/dist/i18n/useCalendarSystem.d.ts +19 -0
  310. package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
  311. package/dist/i18n/useCalendarSystem.js +61 -0
  312. package/dist/internal/calendar-system.d.ts +18 -0
  313. package/dist/internal/calendar-system.d.ts.map +1 -0
  314. package/dist/internal/calendar-system.js +19 -0
  315. package/dist/internal/spinner-rotor.d.ts +16 -0
  316. package/dist/internal/spinner-rotor.d.ts.map +1 -0
  317. package/dist/internal/spinner-rotor.js +16 -0
  318. package/dist/internal/touch.d.ts +20 -2
  319. package/dist/internal/touch.d.ts.map +1 -1
  320. package/dist/internal/touch.js +29 -3
  321. package/dist/motion/animator.d.ts +5 -5
  322. package/dist/motion/animator.d.ts.map +1 -1
  323. package/dist/motion/animator.js +7 -6
  324. package/dist/motion/carryAnimations.d.ts +58 -0
  325. package/dist/motion/carryAnimations.d.ts.map +1 -0
  326. package/dist/motion/carryAnimations.js +305 -0
  327. package/dist/motion/transientCopy.d.ts +4 -2
  328. package/dist/motion/transientCopy.d.ts.map +1 -1
  329. package/dist/motion/transientCopy.js +34 -5
  330. package/dist/motion/uikit/gestures.d.ts +41 -0
  331. package/dist/motion/uikit/gestures.d.ts.map +1 -1
  332. package/dist/motion/uikit/gestures.js +25 -0
  333. package/dist/motion/uikit/index.d.ts +1 -1
  334. package/dist/motion/uikit/index.d.ts.map +1 -1
  335. package/dist/motion/uikit/index.js +1 -1
  336. package/dist/motion/uikit/timing.d.ts +14 -10
  337. package/dist/motion/uikit/timing.d.ts.map +1 -1
  338. package/dist/motion/uikit/timing.js +7 -5
  339. package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
  340. package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
  341. package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
  342. package/dist/privateAttributes/press.stylex.d.ts +142 -0
  343. package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
  344. package/dist/privateAttributes/press.stylex.js +101 -0
  345. package/dist/theme/themeMotion.d.ts +3 -2
  346. package/dist/theme/themeMotion.d.ts.map +1 -1
  347. package/dist/theme/themeMotion.js +3 -2
  348. package/dist/theme/tokens.stylex.d.ts +2 -2
  349. package/dist/theme/tokens.stylex.js +1 -1
  350. package/dist/utils/calendarDateParser.d.ts +110 -0
  351. package/dist/utils/calendarDateParser.d.ts.map +1 -0
  352. package/dist/utils/calendarDateParser.js +1225 -0
  353. package/dist/utils/calendarSystem.d.ts +176 -0
  354. package/dist/utils/calendarSystem.d.ts.map +1 -0
  355. package/dist/utils/calendarSystem.js +569 -0
  356. package/dist/utils/coarsePointer.d.ts +5 -0
  357. package/dist/utils/coarsePointer.d.ts.map +1 -1
  358. package/dist/utils/coarsePointer.js +22 -13
  359. package/dist/utils/flatTree.d.ts +6 -3
  360. package/dist/utils/flatTree.d.ts.map +1 -1
  361. package/dist/utils/flatTree.js +13 -3
  362. package/dist/utils/focusReturn.d.ts +34 -13
  363. package/dist/utils/focusReturn.d.ts.map +1 -1
  364. package/dist/utils/focusReturn.js +64 -17
  365. package/dist/utils/hitArea.d.ts +8 -1
  366. package/dist/utils/hitArea.d.ts.map +1 -1
  367. package/dist/utils/hitArea.js +99 -9
  368. package/dist/utils/inputPresentation.d.ts +9 -1
  369. package/dist/utils/inputPresentation.d.ts.map +1 -1
  370. package/dist/utils/inputPresentation.js +15 -1
  371. package/dist/utils/inputStream.d.ts +14 -1
  372. package/dist/utils/inputStream.d.ts.map +1 -1
  373. package/dist/utils/inputStream.js +40 -9
  374. package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
  375. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  376. package/dist/utils/interactionOverlay.stylex.js +29 -31
  377. package/dist/utils/plainDate.d.ts +38 -7
  378. package/dist/utils/plainDate.d.ts.map +1 -1
  379. package/dist/utils/plainDate.js +92 -18
  380. package/dist/utils/pressFeedback.d.ts +10 -2
  381. package/dist/utils/pressFeedback.d.ts.map +1 -1
  382. package/dist/utils/pressFeedback.js +40 -15
  383. package/dist/utils/pressGesture.d.ts +12 -6
  384. package/dist/utils/pressGesture.d.ts.map +1 -1
  385. package/dist/utils/pressGesture.js +26 -8
  386. package/dist/utils/scrollView.d.ts +25 -0
  387. package/dist/utils/scrollView.d.ts.map +1 -0
  388. package/dist/utils/scrollView.js +108 -0
  389. package/dist/utils/selectionLock.d.ts.map +1 -1
  390. package/dist/utils/selectionLock.js +1 -10
  391. package/dist/utils/touchHitArea.d.ts +30 -0
  392. package/dist/utils/touchHitArea.d.ts.map +1 -0
  393. package/dist/utils/touchHitArea.js +167 -0
  394. package/dist/utils/touchHitArea.stylex.d.ts +38 -0
  395. package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
  396. package/dist/utils/touchHitArea.stylex.js +48 -0
  397. package/dist/utils/triggerFocus.d.ts +5 -0
  398. package/dist/utils/triggerFocus.d.ts.map +1 -1
  399. package/dist/utils/triggerFocus.js +9 -2
  400. package/locales/en.json +21 -1
  401. package/locales/pseudo.json +15 -0
  402. package/package.json +15 -4
  403. package/src/AppShell/observeMainOverflow.ts +9 -6
  404. package/src/BottomSheet/BottomSheet.tsx +45 -3
  405. package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
  406. package/src/BottomSheet/bottomSheetStack.ts +4 -3
  407. package/src/BottomSheet/useSheetGestures.ts +83 -20
  408. package/src/Calendar/Calendar.doc.mjs +76 -6
  409. package/src/Calendar/Calendar.tsx +123 -104
  410. package/src/Calendar/getInitialFocusDate.ts +22 -8
  411. package/src/Calendar/hooks/useCalendarDays.ts +89 -63
  412. package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
  413. package/src/CheckboxInput/CheckboxInput.doc.mjs +5 -4
  414. package/src/CheckboxInput/CheckboxInput.tsx +105 -20
  415. package/src/CheckboxInput/CheckboxRowPressContext.ts +22 -0
  416. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  417. package/src/CheckboxList/CheckboxListItem.doc.mjs +3 -3
  418. package/src/CheckboxList/CheckboxListItem.tsx +35 -14
  419. package/src/ClickableCard/ClickableCard.tsx +8 -1
  420. package/src/ContextMenu/ContextMenu.tsx +2 -0
  421. package/src/DateInput/DateInput.doc.mjs +45 -12
  422. package/src/DateInput/DateInput.tsx +165 -179
  423. package/src/DateInput/MonthScroller.tsx +39 -37
  424. package/src/DateInput/MonthYearWheels.tsx +68 -47
  425. package/src/DateInput/PickerWheel.tsx +7 -2
  426. package/src/DateInput/TouchDateField.tsx +45 -17
  427. package/src/DateInput/monthGeometry.ts +110 -8
  428. package/src/DateInput/useCalendarPresentation.ts +64 -0
  429. package/src/DateInput/useTypedDate.ts +469 -0
  430. package/src/DateInput/wheelStrip.ts +2 -2
  431. package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -0
  432. package/src/DateRangeInput/DateRangeInput.tsx +43 -9
  433. package/src/DateTimeInput/DateTimeInput.doc.mjs +42 -9
  434. package/src/DateTimeInput/DateTimeInput.tsx +138 -148
  435. package/src/DateTimeInput/TouchDateTimeField.tsx +31 -16
  436. package/src/Dialog/Dialog.doc.mjs +1 -1
  437. package/src/Dialog/Dialog.tsx +14 -2
  438. package/src/Drawer/Drawer.doc.mjs +1 -1
  439. package/src/Drawer/useDrawerDialogPresence.ts +9 -2
  440. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
  441. package/src/DropdownMenu/DropdownMenu.tsx +31 -7
  442. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
  443. package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
  444. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
  445. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
  446. package/src/FileInput/FileInput.tsx +16 -2
  447. package/src/HoverCard/useHoverCard.tsx +3 -1
  448. package/src/Icon/useIcon.doc.mjs +94 -0
  449. package/src/InfoTip/InfoTip.doc.mjs +26 -2
  450. package/src/InfoTip/InfoTip.tsx +6 -27
  451. package/src/InputGroup/InputGroup.doc.mjs +4 -3
  452. package/src/InputGroup/InputGroup.tsx +4 -3
  453. package/src/InputGroup/InputGroupText.doc.mjs +45 -3
  454. package/src/InputGroup/InputGroupText.tsx +2 -1
  455. package/src/InputGroup/groupStyles.ts +3 -1
  456. package/src/Item/Item.tsx +139 -35
  457. package/src/Item/ItemListRowContext.tsx +18 -0
  458. package/src/Layer/holdEntranceInput.ts +84 -0
  459. package/src/Layer/inputHold.ts +734 -0
  460. package/src/Layer/outsidePress.ts +18 -1
  461. package/src/Layer/preserveAnimations.ts +12 -275
  462. package/src/Layer/useBackdropPress.ts +41 -1
  463. package/src/Layer/useLayer.tsx +77 -4
  464. package/src/Layer/useTouchTrigger.ts +4 -0
  465. package/src/Layout/LayoutContent.doc.mjs +6 -3
  466. package/src/Layout/LayoutContent.tsx +10 -4
  467. package/src/Layout/LayoutPanel.doc.mjs +14 -11
  468. package/src/Layout/LayoutPanel.tsx +113 -16
  469. package/src/Lightbox/Lightbox.tsx +4 -0
  470. package/src/List/List.doc.mjs +10 -1
  471. package/src/List/List.tsx +5 -0
  472. package/src/List/ListItem.tsx +63 -8
  473. package/src/Markdown/parser.ts +65 -42
  474. package/src/MetadataList/MetadataList.tsx +1 -1
  475. package/src/MobileNav/MobileNav.doc.mjs +3 -3
  476. package/src/MobileNav/MobileNav.tsx +39 -1
  477. package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
  478. package/src/MoreMenu/MoreMenu.tsx +5 -3
  479. package/src/MultiSelector/MultiSelector.tsx +7 -17
  480. package/src/NumberInput/NumberInput.doc.mjs +1 -1
  481. package/src/NumberInput/NumberInput.tsx +259 -11
  482. package/src/OverflowList/OverflowList.tsx +15 -9
  483. package/src/Popover/usePopover.tsx +1 -0
  484. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  485. package/src/PowerSearch/PowerSearch.tsx +20 -3
  486. package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
  487. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  488. package/src/PowerSearch/formatFilterValue.ts +21 -11
  489. package/src/PowerSearch/formatTokenValue.ts +7 -1
  490. package/src/RadioList/RadioListItem.doc.mjs +3 -2
  491. package/src/RadioList/RadioListItem.tsx +16 -6
  492. package/src/Resizable/Resizable.doc.mjs +40 -12
  493. package/src/Resizable/ResizeHandle.tsx +68 -6
  494. package/src/Resizable/resizablePane.ts +179 -0
  495. package/src/Resizable/useResizable.ts +15 -0
  496. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +3 -3
  497. package/src/SelectableCard/SelectableCard.tsx +8 -1
  498. package/src/Selector/Selector.tsx +83 -8
  499. package/src/SideNav/SideNav.doc.mjs +2 -2
  500. package/src/SideNav/SideNav.tsx +87 -12
  501. package/src/Slider/sliderTouchController.ts +2 -2
  502. package/src/Spinner/Spinner.tsx +7 -89
  503. package/src/Spinner/index.ts +1 -5
  504. package/src/Spinner/spinnerRotor.ts +113 -0
  505. package/src/Stack/Stack.doc.mjs +1 -1
  506. package/src/Stack/StackItem.tsx +27 -13
  507. package/src/Switch/Switch.tsx +7 -6
  508. package/src/Switch/useSwitchTouch.ts +4 -4
  509. package/src/TabList/Tab.tsx +5 -1
  510. package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
  511. package/src/Timestamp/Timestamp.doc.mjs +3 -3
  512. package/src/Timestamp/Timestamp.tsx +13 -8
  513. package/src/Timestamp/formatInstant.ts +49 -28
  514. package/src/Timestamp/tooltipEntries.ts +7 -3
  515. package/src/Token/Token.tsx +18 -1
  516. package/src/Token/TokenLink.tsx +7 -1
  517. package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
  518. package/src/Tokenizer/Tokenizer.tsx +252 -115
  519. package/src/Tooltip/useTooltip.tsx +180 -80
  520. package/src/TreeList/TreeListItem.tsx +36 -2
  521. package/src/Typeahead/BaseTypeahead.tsx +2 -0
  522. package/src/animator/createAnimator.ts +3 -3
  523. package/src/gestures/GestureHost.ts +21 -5
  524. package/src/gestures/PanGestureRecognizer.ts +19 -2
  525. package/src/gestures/README.md +14 -5
  526. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
  527. package/src/gestures/nativeScroll.ts +12 -68
  528. package/src/gestures/wheelSegmenter.ts +243 -10
  529. package/src/hooks/StackItemScrollRegion.tsx +57 -0
  530. package/src/hooks/computeOverflow.ts +1 -1
  531. package/src/hooks/menuPressGesture.ts +244 -38
  532. package/src/hooks/menuPressValues.ts +18 -0
  533. package/src/hooks/useClickableContainer.doc.mjs +8 -2
  534. package/src/hooks/useClickableContainer.ts +93 -15
  535. package/src/hooks/useFocusTrap.ts +268 -151
  536. package/src/hooks/useKeyboardHighlight.ts +71 -0
  537. package/src/hooks/useMediaQuery.ts +41 -12
  538. package/src/hooks/useMenuPress.ts +118 -11
  539. package/src/hooks/useOverflow.ts +321 -75
  540. package/src/hooks/usePressFeedback.doc.mjs +3 -3
  541. package/src/hooks/usePressFeedback.ts +6 -6
  542. package/src/hooks/useScrollRegionProps.ts +76 -0
  543. package/src/i18n/InternationalizationContext.ts +6 -0
  544. package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
  545. package/src/i18n/InternationalizationProvider.tsx +35 -3
  546. package/src/i18n/generated-english/DateInput/DateInput.generated.ts +0 -1
  547. package/src/i18n/generated-english/DateInput/useTypedDate.generated.ts +17 -0
  548. package/src/i18n/generated-english/DateTimeInput/DateTimeInput.generated.ts +0 -1
  549. package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
  550. package/src/i18n/generated-locales/en.generated.ts +7 -0
  551. package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
  552. package/src/i18n/index.ts +2 -0
  553. package/src/i18n/useCalendarSystem.ts +95 -0
  554. package/src/internal/calendar-system.ts +26 -0
  555. package/src/internal/spinner-rotor.ts +20 -0
  556. package/src/internal/touch.ts +43 -2
  557. package/src/motion/MEASUREMENTS.md +11 -0
  558. package/src/motion/README.md +3 -3
  559. package/src/motion/animator.ts +7 -7
  560. package/src/motion/carryAnimations.ts +389 -0
  561. package/src/motion/transientCopy.ts +45 -5
  562. package/src/motion/uikit/gestures.ts +22 -0
  563. package/src/motion/uikit/index.ts +1 -0
  564. package/src/motion/uikit/timing.ts +7 -5
  565. package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
  566. package/src/privateAttributes/press.stylex.ts +261 -0
  567. package/src/theme/themeMotion.ts +3 -2
  568. package/src/theme/tokens.stylex.ts +1 -1
  569. package/src/utils/calendarDateParser.ts +1385 -0
  570. package/src/utils/calendarSystem.ts +832 -0
  571. package/src/utils/coarsePointer.ts +27 -14
  572. package/src/utils/flatTree.ts +15 -3
  573. package/src/utils/focusReturn.ts +78 -18
  574. package/src/utils/hitArea.ts +138 -9
  575. package/src/utils/inputPresentation.ts +21 -1
  576. package/src/utils/inputStream.ts +47 -10
  577. package/src/utils/interactionOverlay.stylex.ts +19 -22
  578. package/src/utils/plainDate.ts +130 -19
  579. package/src/utils/pressFeedback.ts +46 -14
  580. package/src/utils/pressGesture.ts +35 -9
  581. package/src/utils/scrollView.ts +135 -0
  582. package/src/utils/selectionLock.ts +5 -10
  583. package/src/utils/touchHitArea.stylex.ts +56 -0
  584. package/src/utils/touchHitArea.ts +177 -0
  585. package/src/utils/triggerFocus.ts +17 -4
@@ -2,14 +2,16 @@
2
2
 
3
3
  /**
4
4
  * @file monthGeometry.ts
5
- * @input PlainDate values, scroll offsets, pane heights
6
- * @output Pure month-index arithmetic and the virtualized pane window
7
- * @position Internal helper; consumed by MonthScroller.tsx and DateInput.tsx
5
+ * @input PlainDate values, a calendar system, scroll offsets, pane heights
6
+ * @output Month-index arithmetic for a calendar and the virtualized pane window
7
+ * @position Internal helper; consumed by the touch date surfaces
8
8
  *
9
- * A "month index" is a single integer that totally orders calendar months:
10
- * `year * 12 + (month - 1)`. The scroller is a list of equal-width panes, so
11
- * one integer converts freely between a month, a row in that list, and a
12
- * scroll offset — which is the whole trick behind continuous scrolling.
9
+ * A "month index" is a single integer that totally orders calendar months. In
10
+ * the Gregorian-aligned calendars it is `year * 12 + (month - 1)`; in the
11
+ * others it counts calendar months from a fixed month, because their years
12
+ * have 12 or 13 months. The scroller is a list of equal-width panes, so one
13
+ * integer converts freely between a month, a row in that list, and a scroll
14
+ * offset — which is the whole trick behind continuous scrolling.
13
15
  *
14
16
  * These are pure functions on purpose: the scroll math is the part most likely
15
17
  * to be wrong, and it is testable without a layout engine.
@@ -17,7 +19,19 @@
17
19
  * SYNC: When modified, update DateInputTouch.test.tsx.
18
20
  */
19
21
 
20
- import type {PlainDate} from '../utils';
22
+ import type {PlainDate} from '../utils/dateTypes';
23
+ import {
24
+ type CalendarMonth,
25
+ type CalendarSystem,
26
+ calendarAddMonths,
27
+ calendarMonthOf,
28
+ calendarMonthOfYear,
29
+ calendarMonthsBetween,
30
+ calendarMonthsInCalendarYear,
31
+ calendarShiftYears,
32
+ calendarYearMonthOf,
33
+ isGregorianAligned,
34
+ } from '../utils/calendarSystem';
21
35
 
22
36
  /** How many months are reachable in either direction when unbounded. */
23
37
  export const DEFAULT_MONTH_REACH = 600;
@@ -116,3 +130,91 @@ export function rowsIn({start, end}: PaneWindow): number[] {
116
130
  }
117
131
  return rows;
118
132
  }
133
+
134
+ /**
135
+ * Month indexes for one calendar. Years and month positions are the ones
136
+ * `calendarMonthOfYear` counts.
137
+ */
138
+ export interface MonthModel {
139
+ readonly calendar: CalendarSystem;
140
+ /** The index of the calendar month that contains a date. */
141
+ indexOf: (date: PlainDate) => number;
142
+ /** The calendar month at an index. */
143
+ monthAt: (index: number) => CalendarMonth;
144
+ /** The calendar year of an index and the month's position in it. */
145
+ yearMonthAt: (index: number) => {year: number; month: number};
146
+ /** The index of a month position in a calendar year. */
147
+ indexOfYearMonth: (year: number, month: number) => number;
148
+ /** The number of months in a calendar year. */
149
+ monthsInYear: (year: number) => number;
150
+ /**
151
+ * The index `years` calendar years from `index`, in the same month. A leap
152
+ * month that the target year does not have becomes its common counterpart.
153
+ */
154
+ shiftYears: (index: number, years: number) => number;
155
+ }
156
+
157
+ const GREGORIAN_MONTH_MODELS = new Map<CalendarSystem, MonthModel>();
158
+
159
+ function gregorianMonthModel(calendar: CalendarSystem): MonthModel {
160
+ let model = GREGORIAN_MONTH_MODELS.get(calendar);
161
+ if (model == null) {
162
+ model = {
163
+ calendar,
164
+ indexOf: monthIndexOf,
165
+ monthAt: index => {
166
+ const {year, month} = fromMonthIndex(index);
167
+ return calendarMonthOfYear(calendar, year, month);
168
+ },
169
+ yearMonthAt: fromMonthIndex,
170
+ indexOfYearMonth: toMonthIndex,
171
+ monthsInYear: () => 12,
172
+ shiftYears: (index, years) => index + years * 12,
173
+ };
174
+ GREGORIAN_MONTH_MODELS.set(calendar, model);
175
+ }
176
+ return model;
177
+ }
178
+
179
+ // The month that holds EPOCH is index 0. Any fixed month works; a recent one
180
+ // keeps the indexes of nearby months small.
181
+ const EPOCH: PlainDate = {year: 2000, month: 1, day: 1};
182
+
183
+ function temporalMonthModel(calendar: CalendarSystem): MonthModel {
184
+ const epoch = calendarMonthOf(calendar, EPOCH);
185
+ // Temporal arithmetic is slow next to a render. The panes and the wheels ask
186
+ // for the same months on every render.
187
+ const months = new Map<number, CalendarMonth>();
188
+ const monthAt = (index: number) => {
189
+ let month = months.get(index);
190
+ if (month == null) {
191
+ month = calendarAddMonths(calendar, epoch, index);
192
+ months.set(index, month);
193
+ }
194
+ return month;
195
+ };
196
+ const indexOf = (date: PlainDate) =>
197
+ calendarMonthsBetween(calendar, epoch, calendarMonthOf(calendar, date));
198
+ return {
199
+ calendar,
200
+ indexOf,
201
+ monthAt,
202
+ yearMonthAt: index => calendarYearMonthOf(calendar, monthAt(index)),
203
+ indexOfYearMonth: (year, month) =>
204
+ indexOf(calendarMonthOfYear(calendar, year, month).start),
205
+ monthsInYear: year => calendarMonthsInCalendarYear(calendar, year),
206
+ shiftYears: (index, years) =>
207
+ indexOf(calendarShiftYears(calendar, monthAt(index).start, years)),
208
+ };
209
+ }
210
+
211
+ /**
212
+ * The month model of a calendar. A calendar that needs Temporal must be
213
+ * available in this runtime; `useCalendarSystem` resolves one that is not to
214
+ * `gregory`.
215
+ */
216
+ export function createMonthModel(calendar: CalendarSystem): MonthModel {
217
+ return isGregorianAligned(calendar)
218
+ ? gregorianMonthModel(calendar)
219
+ : temporalMonthModel(calendar);
220
+ }
@@ -0,0 +1,64 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useCalendarPresentation.ts
7
+ * @input A date component's `calendar`, `presentation`, and `nativePicker`
8
+ * @output The resolved calendar and the presentation policy it allows
9
+ * @position DateInput helper hook; used by DateInput and DateTimeInput to
10
+ * choose a surface. Warns once when an explicit `native` cannot apply.
11
+ */
12
+
13
+ import {useEffect} from 'react';
14
+ import {useCalendarSystem} from '../i18n/useCalendarSystem';
15
+ import {
16
+ type CalendarSystem,
17
+ isGregorianCalendar,
18
+ } from '../utils/calendarSystem';
19
+ import {warnOnce} from '../utils/devWarning';
20
+ import {
21
+ type LegacyNativePicker,
22
+ type PickerPresentation,
23
+ calendarPickerPresentation,
24
+ effectivePickerPresentation,
25
+ } from '../utils/inputPresentation';
26
+
27
+ export interface CalendarPresentation {
28
+ /** The calendar the component shows. */
29
+ calendar: CalendarSystem;
30
+ /** The presentation policy, with native surfaces replaced in a calendar the native control cannot show. */
31
+ presentation: PickerPresentation;
32
+ }
33
+
34
+ export function useCalendarPresentation(
35
+ source: string,
36
+ calendarProp: CalendarSystem | undefined,
37
+ presentation: PickerPresentation | undefined,
38
+ nativePicker: LegacyNativePicker | undefined,
39
+ ): CalendarPresentation {
40
+ const calendar = useCalendarSystem(calendarProp, source);
41
+ const isNativeCalendar = isGregorianCalendar(calendar);
42
+ const isNativeOverridden = presentation === 'native' && !isNativeCalendar;
43
+ // Synchronizes the development console. The key is the component and
44
+ // calendar, so a replay or a second field does not warn again.
45
+ useEffect(() => {
46
+ if (isNativeOverridden) {
47
+ warnOnce(
48
+ `presentation-native-calendar:${source}:${calendar}`,
49
+ source,
50
+ `presentation="native" shows the Astryx picker in the "${calendar}" ` +
51
+ 'calendar, because the native date control shows only Gregorian ' +
52
+ 'dates: the popover on a fine pointer and the bottom sheet on a ' +
53
+ 'coarse pointer.',
54
+ );
55
+ }
56
+ }, [isNativeOverridden, source, calendar]);
57
+ return {
58
+ calendar,
59
+ presentation: calendarPickerPresentation(
60
+ effectivePickerPresentation(presentation, nativePicker),
61
+ isNativeCalendar,
62
+ ),
63
+ };
64
+ }
@@ -0,0 +1,469 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useTypedDate.ts
7
+ * @input Provider locale and calendar, a field's format, bounds and constraints;
8
+ * calendarDateParser, and parseDateInput for other Gregorian text
9
+ * @output Typed-date reading, committed text, the format hint, the calendar
10
+ * description and rejection messages for a date text field, and the typed
11
+ * entry state that DateInput and DateTimeInput share
12
+ * @position DateInput helper hook; used by DateInput and DateTimeInput
13
+ */
14
+
15
+ import {useCallback, useMemo, useRef, useState} from 'react';
16
+ import type {InputStatus} from '../Field/types';
17
+ import {useLocale} from '../i18n/useLocale';
18
+ import {useCalendarSystem} from '../i18n/useCalendarSystem';
19
+ import {
20
+ registerEnglishFallback,
21
+ useComponentTranslator,
22
+ } from '../i18n/useComponentTranslator';
23
+ import english from '../i18n/generated-english/DateInput/useTypedDate.generated';
24
+ import {
25
+ type CalendarSystem,
26
+ isGregorianCalendar,
27
+ } from '../utils/calendarSystem';
28
+ import {
29
+ type CalendarDateParseResult,
30
+ calendarDisplayName,
31
+ formatCalendarDateText,
32
+ formatCalendarDateHint,
33
+ getCalendarDateLexicon,
34
+ parseCalendarDate,
35
+ } from '../utils/calendarDateParser';
36
+ import type {ISODateString, PlainDate} from '../utils/dateTypes';
37
+ import {parseDateInput} from '../utils/dateParser';
38
+ import {
39
+ type SharedDateFormat,
40
+ nearestAcceptedDate,
41
+ plainDateFromISO,
42
+ plainDateIsAfter,
43
+ plainDateIsBefore,
44
+ plainDateToISO,
45
+ plainDateToday,
46
+ } from '../utils/plainDate';
47
+
48
+ registerEnglishFallback(english);
49
+
50
+ /** A rejected typed date, by the message it announces. */
51
+ export type TypedDateError = 'unreadable' | 'nonexistent' | 'outOfRange';
52
+
53
+ export interface UseTypedDateOptions {
54
+ /** The component that names itself in development warnings. */
55
+ source: string;
56
+ /** The field's own calendar; the provider's calendar applies otherwise. */
57
+ calendar?: CalendarSystem;
58
+ /** The committed display format. */
59
+ format: SharedDateFormat | ((value: ISODateString) => string);
60
+ min?: ISODateString;
61
+ max?: ISODateString;
62
+ isDateDisabled: (date: PlainDate) => boolean;
63
+ }
64
+
65
+ export interface TypedDate {
66
+ /** The resolved calendar, for the field's Calendar. */
67
+ calendar: CalendarSystem;
68
+ /** Builds the lexicon ahead of the first keystroke. */
69
+ prepare: () => void;
70
+ parse: (text: string) => CalendarDateParseResult;
71
+ formatCommitted: (value: ISODateString) => string;
72
+ /**
73
+ * An example date for an empty focused field, or null for Gregorian. The
74
+ * example is today when the field accepts it, else the nearest date it
75
+ * accepts.
76
+ */
77
+ getFormatHint: () => string | null;
78
+ /** Names the calendar, or null when it is the provider's calendar. */
79
+ calendarDescription: string | null;
80
+ /** The message for a rejected result. */
81
+ errorMessage: (result: CalendarDateParseResult) => string;
82
+ }
83
+
84
+ /** The rejection a result shows: errors of complete text, or of committed text. */
85
+ export function typedDateError(
86
+ result: CalendarDateParseResult | null,
87
+ isCommitted: boolean,
88
+ ): TypedDateError | null {
89
+ if (result == null) {
90
+ return null;
91
+ }
92
+ if (
93
+ result.kind === 'unreadable' ||
94
+ (result.kind === 'incomplete' && isCommitted)
95
+ ) {
96
+ return 'unreadable';
97
+ }
98
+ if (
99
+ (result.kind === 'nonexistent' || result.kind === 'outOfRange') &&
100
+ (result.isComplete || isCommitted)
101
+ ) {
102
+ return result.kind;
103
+ }
104
+ return null;
105
+ }
106
+
107
+ /**
108
+ * Typed entry for a date text field in the active calendar. Values stay
109
+ * Gregorian; the calendar changes only what people type and read.
110
+ */
111
+ export function useTypedDate({
112
+ source,
113
+ calendar: calendarProp,
114
+ format,
115
+ min,
116
+ max,
117
+ isDateDisabled,
118
+ }: UseTypedDateOptions): TypedDate {
119
+ const t = useComponentTranslator();
120
+ const locale = useLocale();
121
+ const calendar = useCalendarSystem(calendarProp, source);
122
+ const providerCalendar = useCalendarSystem(undefined, source);
123
+ const isGregorian = isGregorianCalendar(calendar);
124
+
125
+ const prepare = useCallback(() => {
126
+ getCalendarDateLexicon(locale, calendar);
127
+ }, [locale, calendar]);
128
+
129
+ const parse = useCallback(
130
+ (text: string): CalendarDateParseResult => {
131
+ const result = parseCalendarDate(
132
+ text,
133
+ getCalendarDateLexicon(locale, calendar),
134
+ {isoIsGregorian: format === 'system_date', isDateDisabled},
135
+ );
136
+ if (
137
+ !isGregorian ||
138
+ (result.kind !== 'unreadable' && result.kind !== 'nonexistent')
139
+ ) {
140
+ return result;
141
+ }
142
+ // Gregorian text that only parseDateInput reads still commits, on Enter
143
+ // or blur only: it is never complete while the person types. This
144
+ // includes a day-first date in a month-first locale, which
145
+ // parseDateInput reads by swapping the order.
146
+ const date = parseDateInput(text, locale);
147
+ if (date == null) {
148
+ return result;
149
+ }
150
+ return isDateDisabled(date)
151
+ ? {kind: 'outOfRange', date, isComplete: false}
152
+ : {kind: 'value', date, isComplete: false};
153
+ },
154
+ [locale, calendar, format, isDateDisabled, isGregorian],
155
+ );
156
+
157
+ const formatCommitted = useCallback(
158
+ (value: ISODateString) =>
159
+ typeof format === 'function'
160
+ ? format(value)
161
+ : formatCalendarDateText(
162
+ plainDateFromISO(value),
163
+ format,
164
+ locale,
165
+ calendar,
166
+ ),
167
+ [format, locale, calendar],
168
+ );
169
+
170
+ const getFormatHint = useCallback(() => {
171
+ if (isGregorian) {
172
+ return null;
173
+ }
174
+ const example = nearestAcceptedDate(plainDateToday(), {
175
+ min: min != null ? plainDateFromISO(min) : null,
176
+ max: max != null ? plainDateFromISO(max) : null,
177
+ isDateDisabled,
178
+ });
179
+ return t('@astryx.dateInput.formatHint', {
180
+ example: formatCalendarDateHint(example, locale, calendar),
181
+ });
182
+ }, [isGregorian, t, locale, calendar, min, max, isDateDisabled]);
183
+
184
+ const calendarName = useMemo(
185
+ () => calendarDisplayName(calendar, locale),
186
+ [calendar, locale],
187
+ );
188
+
189
+ const errorMessage = useCallback(
190
+ (result: CalendarDateParseResult) => {
191
+ if (result.kind === 'nonexistent') {
192
+ return t('@astryx.dateInput.nonexistentDate', {calendar: calendarName});
193
+ }
194
+ if (result.kind === 'outOfRange') {
195
+ const boundFormat = typeof format === 'function' ? 'date_long' : format;
196
+ const writeBound = (bound: ISODateString) =>
197
+ formatCalendarDateText(
198
+ plainDateFromISO(bound),
199
+ boundFormat,
200
+ locale,
201
+ calendar,
202
+ );
203
+ const isBeforeMin =
204
+ min != null && plainDateIsBefore(result.date, plainDateFromISO(min));
205
+ const isAfterMax =
206
+ max != null && plainDateIsAfter(result.date, plainDateFromISO(max));
207
+ const bounds =
208
+ !isBeforeMin && !isAfterMax
209
+ ? 'none'
210
+ : min != null && max != null
211
+ ? 'both'
212
+ : min != null
213
+ ? 'min'
214
+ : 'max';
215
+ return t('@astryx.dateInput.outOfRangeDate', {
216
+ bounds,
217
+ min: min != null ? writeBound(min) : '',
218
+ max: max != null ? writeBound(max) : '',
219
+ });
220
+ }
221
+ return t('@astryx.dateInput.invalidDate');
222
+ },
223
+ [t, calendarName, format, locale, calendar, min, max],
224
+ );
225
+
226
+ const isProviderCalendar = isGregorian
227
+ ? isGregorianCalendar(providerCalendar)
228
+ : calendar === providerCalendar;
229
+
230
+ return {
231
+ calendar,
232
+ prepare,
233
+ parse,
234
+ formatCommitted,
235
+ getFormatHint,
236
+ calendarDescription: isProviderCalendar
237
+ ? null
238
+ : t('@astryx.dateInput.calendarDescription', {calendar: calendarName}),
239
+ errorMessage,
240
+ };
241
+ }
242
+
243
+ export interface UseTypedDateFieldOptions extends UseTypedDateOptions {
244
+ /** The committed date. */
245
+ value: ISODateString | undefined;
246
+ /** The date the field shows, which leads `value` while a commit is in flight. */
247
+ shownValue: ISODateString | undefined;
248
+ /** Reports a typed date. */
249
+ onChange: (value: ISODateString) => void;
250
+ /** Runs when Enter or blur commits emptied text. */
251
+ onClear: () => void;
252
+ /** Runs when typing completes a new date, such as to show its month. */
253
+ onTypedDate?: (value: ISODateString) => void;
254
+ /**
255
+ * A disabled or busy field ignores typing, Enter and blur, and hides a typed
256
+ * rejection. Typed text stays until the next Enter or blur once the field is
257
+ * editable, or until `value` changes. Once the field is editable, text whose
258
+ * date typing already reported gives way to the field's value.
259
+ */
260
+ isDisabled: boolean;
261
+ /** The caller's status. Rejected text that stays shows its own error instead. */
262
+ status?: InputStatus;
263
+ /** Whether the shown status announces itself, as Field's status does. */
264
+ isStatusAnnounced: boolean;
265
+ /** Whether the caller gave a placeholder, which replaces the format hint. */
266
+ hasPlaceholder: boolean;
267
+ }
268
+
269
+ export interface TypedDateField {
270
+ typedDate: TypedDate;
271
+ /** The text the input shows. */
272
+ displayValue: string;
273
+ /** The format hint for an empty focused field. */
274
+ formatHint: string | null;
275
+ /** Whether typed text waits to commit. */
276
+ isPending: boolean;
277
+ isInvalid: boolean;
278
+ /** The status the field shows. */
279
+ fieldStatus: InputStatus | undefined;
280
+ /** A typed rejection that the field status does not announce. */
281
+ alertMessage: string;
282
+ handleChange: (text: string) => void;
283
+ /** Commits typed text, on Enter or blur. */
284
+ commit: () => void;
285
+ handleFocus: () => void;
286
+ handleBlur: () => void;
287
+ /** Drops typed text after a date is picked another way. */
288
+ reset: () => void;
289
+ }
290
+
291
+ /** The typed entry of a date text field: its text, rejections, and commits. */
292
+ export function useTypedDateField({
293
+ value,
294
+ shownValue,
295
+ onChange,
296
+ onClear,
297
+ onTypedDate,
298
+ isDisabled,
299
+ status,
300
+ isStatusAnnounced,
301
+ hasPlaceholder,
302
+ ...options
303
+ }: UseTypedDateFieldOptions): TypedDateField {
304
+ const typedDate = useTypedDate(options);
305
+ // Typed text, or null when the field shows the committed value.
306
+ const [pendingInput, setPendingInput] = useState<string | null>(null);
307
+ // Set when Enter or blur keeps rejected text so the person can correct it.
308
+ const [isRejectionCommitted, setIsRejectionCommitted] = useState(false);
309
+ const [isFocused, setIsFocused] = useState(false);
310
+ // The date that typing last reported, so one typing session reports each
311
+ // date once.
312
+ const lastFiredRef = useRef<ISODateString | undefined>(undefined);
313
+
314
+ const typedResult =
315
+ pendingInput !== null && pendingInput.trim()
316
+ ? typedDate.parse(pendingInput)
317
+ : null;
318
+ // A locked field hides the rejection but keeps its state, so the rejection
319
+ // shows again once the field is editable.
320
+ const typedError = isDisabled
321
+ ? null
322
+ : typedDateError(typedResult, isRejectionCommitted);
323
+ const errorMessage =
324
+ typedError != null && typedResult != null
325
+ ? typedDate.errorMessage(typedResult)
326
+ : null;
327
+ // Text that stays in the field shows its reason as well as announcing it.
328
+ const isErrorShown =
329
+ typedError === 'nonexistent' ||
330
+ typedError === 'outOfRange' ||
331
+ (typedError === 'unreadable' && isRejectionCommitted);
332
+ const typedStatus: InputStatus | undefined =
333
+ isErrorShown && errorMessage != null
334
+ ? {type: 'error', message: errorMessage}
335
+ : undefined;
336
+ const fieldStatus = typedStatus ?? status;
337
+
338
+ const reset = useCallback(() => {
339
+ setPendingInput(null);
340
+ setIsRejectionCommitted(false);
341
+ }, []);
342
+
343
+ // A value from outside drops typed text. Computed during render, so it
344
+ // takes no extra render.
345
+ const prevValueRef = useRef(value);
346
+ if (value !== prevValueRef.current) {
347
+ prevValueRef.current = value;
348
+ if (value !== lastFiredRef.current) {
349
+ lastFiredRef.current = undefined;
350
+ if (pendingInput !== null) {
351
+ setPendingInput(null);
352
+ setIsRejectionCommitted(false);
353
+ }
354
+ }
355
+ }
356
+
357
+ // Typing already reported this date through `onChange`. Once the field is
358
+ // editable, it shows its value. A retyped date then reports again. A focused
359
+ // field keeps the text until Enter or blur, which end the typing session.
360
+ const wasDisabledRef = useRef(isDisabled);
361
+ if (isDisabled !== wasDisabledRef.current) {
362
+ wasDisabledRef.current = isDisabled;
363
+ if (
364
+ !isDisabled &&
365
+ !isFocused &&
366
+ typedResult?.kind === 'value' &&
367
+ plainDateToISO(typedResult.date) === lastFiredRef.current
368
+ ) {
369
+ lastFiredRef.current = undefined;
370
+ setPendingInput(null);
371
+ setIsRejectionCommitted(false);
372
+ }
373
+ }
374
+
375
+ const report = useCallback(
376
+ (date: ISODateString) => {
377
+ if (date === value || date === lastFiredRef.current) {
378
+ return false;
379
+ }
380
+ lastFiredRef.current = date;
381
+ onChange(date);
382
+ return true;
383
+ },
384
+ [value, onChange],
385
+ );
386
+
387
+ const handleChange = useCallback(
388
+ (text: string) => {
389
+ if (isDisabled) {
390
+ return;
391
+ }
392
+ setPendingInput(text);
393
+ setIsRejectionCommitted(false);
394
+ // Report a date only once more typing cannot change it.
395
+ const result = typedDate.parse(text);
396
+ if (result.kind === 'value' && result.isComplete) {
397
+ const date = plainDateToISO(result.date);
398
+ if (report(date)) {
399
+ onTypedDate?.(date);
400
+ }
401
+ }
402
+ },
403
+ [isDisabled, typedDate, report, onTypedDate],
404
+ );
405
+
406
+ const commit = useCallback(() => {
407
+ if (pendingInput === null || isDisabled) {
408
+ return;
409
+ }
410
+ if (!pendingInput.trim()) {
411
+ onClear();
412
+ reset();
413
+ return;
414
+ }
415
+ const result = typedDate.parse(pendingInput);
416
+ if (
417
+ result.kind === 'incomplete' ||
418
+ result.kind === 'nonexistent' ||
419
+ result.kind === 'outOfRange'
420
+ ) {
421
+ // Keep the text and show why it cannot commit; never finish or adjust
422
+ // the date.
423
+ setIsRejectionCommitted(true);
424
+ return;
425
+ }
426
+ if (result.kind === 'value') {
427
+ report(plainDateToISO(result.date));
428
+ }
429
+ // A new typing session reports a retyped date again.
430
+ lastFiredRef.current = undefined;
431
+ reset();
432
+ }, [pendingInput, isDisabled, onClear, typedDate, report, reset]);
433
+
434
+ const handleFocus = useCallback(() => {
435
+ setIsFocused(true);
436
+ typedDate.prepare();
437
+ }, [typedDate]);
438
+
439
+ const handleBlur = useCallback(() => {
440
+ setIsFocused(false);
441
+ commit();
442
+ }, [commit]);
443
+
444
+ const displayValue =
445
+ pendingInput !== null
446
+ ? pendingInput
447
+ : shownValue != null && /^\d{4}-\d{2}-\d{2}$/.test(shownValue)
448
+ ? typedDate.formatCommitted(shownValue)
449
+ : '';
450
+
451
+ return {
452
+ typedDate,
453
+ displayValue,
454
+ formatHint:
455
+ !hasPlaceholder && isFocused && !displayValue
456
+ ? typedDate.getFormatHint()
457
+ : null,
458
+ isPending: pendingInput !== null,
459
+ isInvalid: typedError != null,
460
+ fieldStatus,
461
+ alertMessage:
462
+ isStatusAnnounced && typedStatus != null ? '' : (errorMessage ?? ''),
463
+ handleChange,
464
+ commit,
465
+ handleFocus,
466
+ handleBlur,
467
+ reset,
468
+ };
469
+ }
@@ -16,7 +16,7 @@
16
16
  */
17
17
 
18
18
  import {canVibrate, playHaptic} from '../gestures/haptics';
19
- import {createMotionAnimator, type MotionCurve} from '../motion/animator';
19
+ import {createMotionEngine, type MotionCurve} from '../motion/animator';
20
20
  import {reducedMotionFade} from '../motion/reducedMotion';
21
21
  import {picker} from '../motion/uikit/picker';
22
22
  import {
@@ -132,7 +132,7 @@ function now(): number {
132
132
  * ```
133
133
  */
134
134
  export function createWheelStrip(initialLayout: WheelLayout): WheelStrip {
135
- const animator = createMotionAnimator(null);
135
+ const animator = createMotionEngine(null);
136
136
  let layout = initialLayout;
137
137
  let running: Running | null = null;
138
138
  let nearestListener: ((position: number) => void) | null = null;