@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
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file DateInput.tsx
7
- * @input Uses React, useId, useState, useCallback, useRef, Field, Icon, Calendar, usePopover, InputGroupContext
7
+ * @input Uses React, useId, useCallback, useRef, useTypedDateField, Field, Icon, Calendar, usePopover, InputGroupContext
8
8
  * @output Exports DateInput component, DateInputProps
9
9
  * @position Core implementation; consumed by index.ts, tested by DateInput.test.tsx
10
10
  *
@@ -19,7 +19,6 @@
19
19
  import {
20
20
  use,
21
21
  useId,
22
- useState,
23
22
  useCallback,
24
23
  useRef,
25
24
  useOptimistic,
@@ -66,24 +65,23 @@ import {usePopover} from '../Popover';
66
65
  import {
67
66
  isFocusInsideOwnedLayer,
68
67
  isPressInsideOwnedLayer,
68
+ noteOutsideDismissal,
69
69
  useOutsidePress,
70
70
  } from '../Layer/outsidePress';
71
71
  import {NativeDateField} from './NativeDateField';
72
72
  import {TouchDateField} from './TouchDateField';
73
73
  import {useTooltip} from '../Tooltip';
74
- import {getInputARIA, isImeKeyEvent, parseDateInput} from '../utils';
74
+ import {getInputARIA, isImeKeyEvent} from '../utils';
75
75
  import {chainEventHandlers} from '../utils/chainEventHandlers';
76
- import {
77
- plainDateFromISO,
78
- plainDateToISO,
79
- formatSharedDate,
80
- } from '../utils/plainDate';
76
+ import type {CalendarSystem} from '../utils/calendarSystem';
77
+ import {isRenderable} from '../utils/isRenderable';
78
+ import {useTypedDateField} from './useTypedDate';
81
79
  import type {TimestampFormat} from '../Timestamp';
82
80
  import {
83
- effectivePickerPresentation,
84
81
  resolvePickerPresentation,
85
82
  type PickerPresentation,
86
83
  } from '../utils/inputPresentation';
84
+ import {useCalendarPresentation} from './useCalendarPresentation';
87
85
  import {useDevWarning} from '../hooks/useDevWarning';
88
86
 
89
87
  const styles = stylex.create({
@@ -204,7 +202,6 @@ import {
204
202
  import type {SizeValue} from '../utils/types';
205
203
  import {themeProps} from '../utils/themeProps';
206
204
  import {focusOutlineStyles} from '../utils/focusOutline.stylex';
207
- import {useLocale} from '../i18n';
208
205
 
209
206
  import {useMergedRefs} from '../hooks/useMergedRefs';
210
207
  import type {FieldStatusPlacement} from '../Field/fieldStatusPlacement';
@@ -318,7 +315,8 @@ export interface DateInputProps extends Omit<
318
315
  dateConstraints?: ReadonlyArray<(date: Date) => boolean>;
319
316
 
320
317
  /**
321
- * Placeholder text shown when no date is selected.
318
+ * Placeholder text shown when no date is selected. A caller placeholder
319
+ * replaces the calendar format hint.
322
320
  * @default "Select a date"
323
321
  */
324
322
  placeholder?: string;
@@ -391,9 +389,10 @@ export interface DateInputProps extends Omit<
391
389
  * - `(value: ISODateString) => string`: fully custom display string
392
390
  *
393
391
  * Formatting applies only to the committed value — never to text the user is
394
- * actively typing. A custom function's output that `parseDateInput` cannot
395
- * read back can't be re-committed after an edit; external `value` changes
396
- * always recompute the display from the ISO value.
392
+ * actively typing. Named formats write the date in the field's `calendar`;
393
+ * `'system_date'` stays the Gregorian ISO date. A custom function's output
394
+ * that the field cannot read back can't be re-committed after an edit;
395
+ * external `value` changes always recompute the display from the ISO value.
397
396
  *
398
397
  * @default 'date_long'
399
398
  * @example
@@ -409,6 +408,29 @@ export interface DateInputProps extends Omit<
409
408
  */
410
409
  format?: DateInputFormat | ((value: ISODateString) => string);
411
410
 
411
+ /**
412
+ * The calendar the field shows dates in, such as `'persian'`, `'hebrew'`, or
413
+ * `'buddhist'`: the text field, its calendar popover, and the bottom sheet's
414
+ * months and wheels. `value`, `onChange`, `min`, and `max` stay Gregorian
415
+ * ISO dates in every calendar. People type a date the way the locale writes
416
+ * it in this calendar, and the committed text uses it.
417
+ * Years are years of this calendar, so a Buddhist field reads `2026` as
418
+ * Buddhist year 2026; set `min` and `max` to catch a year typed in the
419
+ * wrong calendar. Calendars other than `gregory`, `iso8601`, `buddhist`,
420
+ * `roc`, and `japanese` need `Temporal`, native or a polyfill the
421
+ * application loads; without it the field uses the Gregorian calendar.
422
+ * The native date control is Gregorian, so with a calendar other than
423
+ * `gregory` or `iso8601` every presentation that would show it uses the
424
+ * popover on a fine pointer and the bottom sheet on a coarse pointer.
425
+ *
426
+ * @default the InternationalizationProvider's calendar, else `'gregory'`
427
+ * @example
428
+ * ```
429
+ * <DateInput label="Start date" calendar="persian" value={date} onChange={setDate} />
430
+ * ```
431
+ */
432
+ calendar?: CalendarSystem;
433
+
412
434
  /**
413
435
  * When date picking is handed to the browser/OS instead of Astryx's own
414
436
  * surfaces: the field becomes an `<input type="date">` and the platform
@@ -434,6 +456,9 @@ export interface DateInputProps extends Omit<
434
456
  * picker. `dateConstraints` is enforced the same way, on commit, and is
435
457
  * reason enough to prefer `'never'` on a field that uses it.
436
458
  *
459
+ * In a calendar other than `gregory` or `iso8601`, `'touch'` and `'always'`
460
+ * use the calendar popover on a mouse and the touch picker on a finger.
461
+ *
437
462
  * @default 'touch'
438
463
  * @deprecated Use `presentation` (`spec:AST-043` FR3):
439
464
  * `'touch'` → `'adaptive-native'`, `'always'` → `'native'`,
@@ -449,12 +474,15 @@ export interface DateInputProps extends Omit<
449
474
  * - `'popover'`: Astryx's typed field + calendar popover on every pointer
450
475
  * - `'bottom-sheet'`: Astryx's bottom-sheet calendar on every pointer
451
476
  * - `'native'`: the browser/OS picker on every pointer, with no Astryx
452
- * fallback (FR2)
477
+ * fallback (FR2), except in a calendar other than `gregory` or
478
+ * `iso8601`, where it is `'adaptive-bottom-sheet'` and warns in
479
+ * development
453
480
  * - `'adaptive-bottom-sheet'`: popover on a fine pointer, bottom sheet on
454
481
  * a coarse pointer
455
482
  * - `'adaptive-native'` (default): popover on a fine pointer, browser/OS
456
483
  * picker on a coarse pointer, keeping the released Astryx fallbacks
457
- * where a native control cannot express the value (FR2)
484
+ * where a native control cannot express the value (FR2), and the bottom
485
+ * sheet in a calendar other than `gregory` or `iso8601`
458
486
  *
459
487
  * @default 'adaptive-native'
460
488
  */
@@ -523,6 +551,7 @@ function PointerDateField({
523
551
  numberOfMonths = 1,
524
552
  weekStartsOn,
525
553
  format = 'date_long',
554
+ calendar,
526
555
  width,
527
556
  containerXstyle,
528
557
  containerClassName,
@@ -544,11 +573,11 @@ function PointerDateField({
544
573
  'aria-labelledby': ariaLabelledByProp,
545
574
  onBlur: onBlurProp,
546
575
  onClick: onClickProp,
576
+ onFocus: onFocusProp,
547
577
  onKeyDown: onKeyDownProp,
548
578
  ...controlProps
549
579
  } = rest;
550
580
  const t = useComponentTranslator();
551
- const locale = useLocale();
552
581
  const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
553
582
  const placeholder =
554
583
  placeholderFromProps ?? t('@astryx.dateInput.placeholder');
@@ -559,9 +588,9 @@ function PointerDateField({
559
588
  const inputLabelID = useId();
560
589
  const descriptionID = useId();
561
590
  const statusMessageID = useId();
591
+ const calendarDescriptionID = useId();
562
592
  const inputRef = useRef<HTMLInputElement | null>(null);
563
593
  const calendarRef = useRef<CalendarHandle | null>(null);
564
- const lastFiredValueRef = useRef<ISODateString | undefined>(undefined);
565
594
  const inputGroup = useInputGroup();
566
595
 
567
596
  const [, startTransition] = useTransition();
@@ -591,9 +620,70 @@ function PointerDateField({
591
620
  // Constraint checking for text input validation (reuses calendar logic)
592
621
  const {isDateDisabled} = useCalendarConstraints({min, max, dateConstraints});
593
622
 
623
+ const fireChange = useCallback(
624
+ (newValue: ISODateString | undefined) => {
625
+ if (isEffectivelyDisabled) {
626
+ return;
627
+ }
628
+ onChange?.(newValue);
629
+ if (changeAction) {
630
+ startTransition(async () => {
631
+ setOptimisticValue(newValue);
632
+ await changeAction(newValue);
633
+ });
634
+ }
635
+ },
636
+ [
637
+ isEffectivelyDisabled,
638
+ onChange,
639
+ changeAction,
640
+ startTransition,
641
+ setOptimisticValue,
642
+ ],
643
+ );
644
+
645
+ const clearTypedDate = useCallback(() => {
646
+ if (value !== undefined) {
647
+ fireChange(undefined);
648
+ }
649
+ }, [value, fireChange]);
650
+ const navigateToTypedDate = useCallback((date: ISODateString) => {
651
+ calendarRef.current?.navigateTo(date);
652
+ }, []);
653
+ const {
654
+ typedDate,
655
+ displayValue,
656
+ formatHint,
657
+ isPending,
658
+ isInvalid,
659
+ fieldStatus,
660
+ alertMessage,
661
+ handleChange: handleTypedChange,
662
+ commit: commitPendingInput,
663
+ handleFocus,
664
+ handleBlur,
665
+ reset: resetTypedInput,
666
+ } = useTypedDateField({
667
+ source: 'DateInput',
668
+ calendar,
669
+ format,
670
+ min,
671
+ max,
672
+ isDateDisabled,
673
+ value,
674
+ shownValue: optimisticValue,
675
+ onChange: fireChange,
676
+ onClear: clearTypedDate,
677
+ onTypedDate: navigateToTypedDate,
678
+ isDisabled: isEffectivelyDisabled,
679
+ status,
680
+ isStatusAnnounced: !inputGroup,
681
+ hasPlaceholder: placeholderFromProps != null,
682
+ });
683
+
594
684
  const {statusIcon, describedBy: statusTooltipDescribedBy} =
595
685
  useInputStatusIcon({
596
- status,
686
+ status: fieldStatus,
597
687
  statusVariant,
598
688
  isInGroup: !!inputGroup,
599
689
  });
@@ -602,7 +692,10 @@ function PointerDateField({
602
692
  inputLabelID,
603
693
  [
604
694
  description ? descriptionID : null,
605
- statusVariant !== 'tooltip' && status?.message ? statusMessageID : null,
695
+ typedDate.calendarDescription != null ? calendarDescriptionID : null,
696
+ statusVariant !== 'tooltip' && fieldStatus?.message
697
+ ? statusMessageID
698
+ : null,
606
699
  // The tooltip variant renders no message box; describe the input by the
607
700
  // tooltip's content instead so the status is still announced.
608
701
  statusTooltipDescribedBy,
@@ -612,50 +705,6 @@ function PointerDateField({
612
705
  inputGroup,
613
706
  );
614
707
 
615
- // Pending input while user is typing (null = show formatted value)
616
- const [pendingInput, setPendingInput] = useState<string | null>(null);
617
-
618
- // Clear pending input when value changes externally (computed during render
619
- // via prev-value ref instead of useEffect to avoid an extra render cycle)
620
- const prevValueRef = useRef(value);
621
- if (value !== prevValueRef.current) {
622
- prevValueRef.current = value;
623
- if (value !== lastFiredValueRef.current) {
624
- lastFiredValueRef.current = undefined;
625
- if (pendingInput !== null) {
626
- setPendingInput(null);
627
- }
628
- }
629
- }
630
-
631
- // Format a committed ISO value for display. The default `date_long` renders
632
- // the long-month shape (byte-identical to the historical hardcoded
633
- // DATE_FORMAT_LONG rendering, so still non-breaking); a function is called
634
- // with the ISO value; every other named member reuses Timestamp's shared
635
- // date mapping. Applies ONLY to the committed value, never to in-progress
636
- // typed input.
637
- const formatCommittedValue = useCallback(
638
- (iso: ISODateString): string =>
639
- typeof format === 'function'
640
- ? format(iso)
641
- : formatSharedDate(plainDateFromISO(iso), format, locale),
642
- [format, locale],
643
- );
644
-
645
- // Display value: pending input if typing, otherwise formatted value
646
- const displayValue =
647
- pendingInput !== null
648
- ? pendingInput
649
- : optimisticValue && /^\d{4}-\d{2}-\d{2}$/.test(optimisticValue)
650
- ? formatCommittedValue(optimisticValue)
651
- : '';
652
-
653
- // Check if current input is valid (for styling purposes)
654
- const isInputValid =
655
- pendingInput === null || !pendingInput.trim()
656
- ? true
657
- : parseDateInput(pendingInput, locale) !== null;
658
-
659
708
  const fieldElementRef = useRef<HTMLDivElement | null>(null);
660
709
  // Set just before a close that focus already left the field for, so onHide
661
710
  // does not pull focus back to the input.
@@ -717,29 +766,6 @@ function PointerDateField({
717
766
  }
718
767
  }, [isEffectivelyDisabled, popover]);
719
768
 
720
- // Unified change handler that fires both onChange and changeAction
721
- const fireChange = useCallback(
722
- (newValue: ISODateString | undefined) => {
723
- if (isEffectivelyDisabled) {
724
- return;
725
- }
726
- onChange?.(newValue);
727
- if (changeAction) {
728
- startTransition(async () => {
729
- setOptimisticValue(newValue);
730
- await changeAction(newValue);
731
- });
732
- }
733
- },
734
- [
735
- isEffectivelyDisabled,
736
- onChange,
737
- changeAction,
738
- startTransition,
739
- setOptimisticValue,
740
- ],
741
- );
742
-
743
769
  // Handle clear button click
744
770
  const handleClear = useCallback(
745
771
  (e?: React.MouseEvent<HTMLButtonElement>) => {
@@ -766,81 +792,19 @@ function PointerDateField({
766
792
  return;
767
793
  }
768
794
  fireChange(selectedDate);
769
- setPendingInput(null);
795
+ resetTypedInput();
770
796
  popover.hide();
771
797
  },
772
- [isDisabled, fireChange, popover],
798
+ [isDisabled, fireChange, resetTypedInput, popover],
773
799
  );
774
800
 
775
- // Handle input text change - update immediately if valid and allowed
776
801
  const handleInputChange = useCallback(
777
802
  (e: React.ChangeEvent<HTMLInputElement>) => {
778
- // The input is never natively disabled (spec:AST-085 FR1), so guard
779
- // value mutation explicitly (readOnly also blocks typing).
780
- if (isEffectivelyDisabled) {
781
- return;
782
- }
783
- const newValue = e.target.value;
784
- setPendingInput(newValue);
785
-
786
- // If the input is valid and passes constraints, update immediately
787
- const parsed = parseDateInput(newValue, locale);
788
- if (
789
- parsed &&
790
- plainDateToISO(parsed) !== value &&
791
- !isDateDisabled(parsed)
792
- ) {
793
- const parsedISO = plainDateToISO(parsed);
794
- lastFiredValueRef.current = parsedISO;
795
- fireChange(parsedISO);
796
- // Navigate calendar to show the parsed date's month
797
- calendarRef.current?.navigateTo(parsedISO);
798
- }
803
+ handleTypedChange(e.target.value);
799
804
  },
800
- [value, fireChange, isDateDisabled, isEffectivelyDisabled, locale],
805
+ [handleTypedChange],
801
806
  );
802
807
 
803
- // Commit pending input (shared by blur and Enter key)
804
- const commitPendingInput = useCallback(() => {
805
- if (pendingInput === null) {
806
- return;
807
- }
808
- // Disabled or busy: keep the value, drop the draft (spec:AST-085 FR2).
809
- if (isEffectivelyDisabled) {
810
- setPendingInput(null);
811
- return;
812
- }
813
-
814
- if (!pendingInput.trim()) {
815
- if (value !== undefined) {
816
- fireChange(undefined);
817
- }
818
- setPendingInput(null);
819
- return;
820
- }
821
-
822
- const parsed = parseDateInput(pendingInput, locale);
823
- if (parsed && !isDateDisabled(parsed)) {
824
- const parsedISO = plainDateToISO(parsed);
825
- if (parsedISO !== value) {
826
- fireChange(parsedISO);
827
- }
828
- }
829
- setPendingInput(null);
830
- }, [
831
- pendingInput,
832
- isEffectivelyDisabled,
833
- value,
834
- fireChange,
835
- isDateDisabled,
836
- locale,
837
- ]);
838
-
839
- // Handle blur - validate, check constraints, and clear pending input.
840
- const handleBlur = useCallback(() => {
841
- commitPendingInput();
842
- }, [commitPendingInput]);
843
-
844
808
  // A manual popover has no auto-popover exclusivity, so without this close
845
809
  // the next field's calendar would open beside this one. Focus going nowhere
846
810
  // (a window switch) leaves it open.
@@ -855,6 +819,7 @@ function PointerDateField({
855
819
  return;
856
820
  }
857
821
  isFocusMovingAwayRef.current = true;
822
+ noteOutsideDismissal(e.currentTarget.ownerDocument);
858
823
  popover.hide();
859
824
  },
860
825
  [popover],
@@ -884,10 +849,7 @@ function PointerDateField({
884
849
  if (!isEffectivelyDisabled) {
885
850
  popover.show({skipAutoFocus: true});
886
851
  }
887
- } else if (
888
- e.key === 'Enter' &&
889
- (pendingInput !== null || isEffectivelyDisabled)
890
- ) {
852
+ } else if (e.key === 'Enter' && (isPending || isEffectivelyDisabled)) {
891
853
  // Typed text holds Enter back, or a form would submit the value from
892
854
  // before the commit. A disabled or busy field must not submit its
893
855
  // form either. Otherwise Enter keeps its default, as in any text field.
@@ -895,7 +857,7 @@ function PointerDateField({
895
857
  commitPendingInput();
896
858
  }
897
859
  },
898
- [popover, commitPendingInput, isEffectivelyDisabled, pendingInput],
860
+ [popover, commitPendingInput, isEffectivelyDisabled, isPending],
899
861
  );
900
862
 
901
863
  const inputWrapper = (
@@ -913,7 +875,7 @@ function PointerDateField({
913
875
  {...mergeProps(
914
876
  themeProps('date-input', {
915
877
  size,
916
- status: status?.type ?? null,
878
+ status: fieldStatus?.type ?? null,
917
879
  disabled: isDisabled ? 'disabled' : null,
918
880
  }),
919
881
  stylex.props(
@@ -924,11 +886,11 @@ function PointerDateField({
924
886
  // FR6, family:buttons FR4).
925
887
  isDisabled && inputWrapperStyles.disabled,
926
888
  isEffectivelyDisabled && inputDisabledFocusStyles.inputFocusRing,
927
- status && inputStatusBorderStyles[status.type],
928
- status &&
889
+ fieldStatus && inputStatusBorderStyles[fieldStatus.type],
890
+ fieldStatus &&
929
891
  !isEffectivelyDisabled &&
930
- inputStatusHoverShadowStyles[status.type],
931
- status && inputStatusFocusWithinStyles[status.type],
892
+ inputStatusHoverShadowStyles[fieldStatus.type],
893
+ fieldStatus && inputStatusFocusWithinStyles[fieldStatus.type],
932
894
  inputGroup && groupStyles.inGroup,
933
895
  controlXstyle,
934
896
  ),
@@ -978,13 +940,14 @@ function PointerDateField({
978
940
  value={displayValue}
979
941
  onChange={handleInputChange}
980
942
  onBlur={chainEventHandlers(handleBlur, onBlurProp)}
943
+ onFocus={chainEventHandlers(handleFocus, onFocusProp)}
981
944
  onClick={
982
945
  isEffectivelyDisabled
983
946
  ? undefined
984
947
  : chainEventHandlers(handleInputClick, onClickProp)
985
948
  }
986
949
  onKeyDown={chainEventHandlers(handleInputKeyDown, onKeyDownProp)}
987
- placeholder={placeholder}
950
+ placeholder={formatHint ?? placeholder}
988
951
  aria-disabled={isEffectivelyDisabled ? 'true' : undefined}
989
952
  readOnly={isEffectivelyDisabled || undefined}
990
953
  aria-labelledby={
@@ -995,7 +958,7 @@ function PointerDateField({
995
958
  aria-describedby={ariaDescribedBy}
996
959
  aria-required={isEffectivelyRequired ? 'true' : undefined}
997
960
  aria-invalid={
998
- status?.type === 'error' || !isInputValid ? 'true' : undefined
961
+ fieldStatus?.type === 'error' || isInvalid ? 'true' : undefined
999
962
  }
1000
963
  aria-busy={isBusy || undefined}
1001
964
  aria-expanded={popover.isOpen}
@@ -1006,17 +969,21 @@ function PointerDateField({
1006
969
  {...stylex.props(
1007
970
  styles.input,
1008
971
  isEffectivelyDisabled && styles.inputDisabled,
1009
- !isInputValid && styles.inputInvalid,
972
+ isInvalid && styles.inputInvalid,
1010
973
  )}
1011
974
  />
1012
975
  {/*
1013
- Live region announcing invalid typed input to assistive technology.
1014
- The value silently reverts on blur, so without this a screen-reader
1015
- user would get no feedback that their entry was rejected (WCAG 3.3.1).
976
+ Announces a typed rejection that the field status does not announce.
977
+ The field status announces the rest.
1016
978
  */}
1017
979
  <VisuallyHidden as="div" role="alert" aria-live="assertive">
1018
- {!isInputValid ? t('@astryx.dateInput.invalidDate') : ''}
980
+ {alertMessage}
1019
981
  </VisuallyHidden>
982
+ {isRenderable(typedDate.calendarDescription) && (
983
+ <VisuallyHidden id={calendarDescriptionID}>
984
+ {typedDate.calendarDescription}
985
+ </VisuallyHidden>
986
+ )}
1020
987
  {hasClear && value !== undefined && !isEffectivelyDisabled && (
1021
988
  <InputClearButton
1022
989
  label={t('@astryx.dateInput.clear', {label})}
@@ -1031,6 +998,7 @@ function PointerDateField({
1031
998
  !popover.isOpen ? null : (
1032
999
  <Calendar
1033
1000
  handleRef={calendarRef}
1001
+ calendar={typedDate.calendar}
1034
1002
  mode="single"
1035
1003
  value={optimisticValue ?? null}
1036
1004
  onChange={handleDateSelect}
@@ -1065,11 +1033,11 @@ function PointerDateField({
1065
1033
  isRequired={isRequired}
1066
1034
  isDisabled={isDisabled}
1067
1035
  status={
1068
- status
1036
+ fieldStatus
1069
1037
  ? {
1070
- type: status.type,
1071
- message: status.message,
1072
- messageID: status.message ? statusMessageID : undefined,
1038
+ type: fieldStatus.type,
1039
+ message: fieldStatus.message,
1040
+ messageID: fieldStatus.message ? statusMessageID : undefined,
1073
1041
  }
1074
1042
  : undefined
1075
1043
  }
@@ -1138,22 +1106,40 @@ export function DateInput(props: DateInputProps) {
1138
1106
  '`nativePicker` is deprecated; use `presentation` instead (`touch` → `adaptive-native`, `always` → `native`, `never` → `adaptive-bottom-sheet`). `presentation` wins when both are set.',
1139
1107
  props.nativePicker !== undefined,
1140
1108
  );
1141
- const surface = resolvePickerPresentation(
1142
- effectivePickerPresentation(props.presentation, props.nativePicker),
1143
- isTouch,
1109
+ const {calendar, presentation} = useCalendarPresentation(
1110
+ 'DateInput',
1111
+ props.calendar,
1112
+ props.presentation,
1113
+ props.nativePicker,
1144
1114
  );
1115
+ const surface = resolvePickerPresentation(presentation, isTouch);
1145
1116
  const {
1146
1117
  presentation: _presentation,
1147
1118
  nativePicker: _nativePicker,
1119
+ calendar: _calendar,
1148
1120
  ...rest
1149
1121
  } = props;
1150
1122
  switch (surface) {
1151
1123
  case 'native':
1152
1124
  return <NativeDateField {...rest} isDisabled={isDisabled} />;
1153
1125
  case 'sheet':
1154
- return <TouchDateField {...rest} isDisabled={isDisabled} />;
1126
+ return (
1127
+ <TouchDateField
1128
+ // Month indexes depend on the calendar. A new calendar remounts the sheet.
1129
+ key={calendar}
1130
+ {...rest}
1131
+ calendar={calendar}
1132
+ isDisabled={isDisabled}
1133
+ />
1134
+ );
1155
1135
  case 'desktop':
1156
- return <PointerDateField {...rest} isDisabled={isDisabled} />;
1136
+ return (
1137
+ <PointerDateField
1138
+ {...rest}
1139
+ calendar={calendar}
1140
+ isDisabled={isDisabled}
1141
+ />
1142
+ );
1157
1143
  }
1158
1144
  }
1159
1145