@astryxdesign/core 0.5.0 → 0.5.1-canary.70169cd

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 (622) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AspectRatio/AspectRatio.d.ts +6 -6
  6. package/dist/Avatar/Avatar.d.ts +25 -1
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +43 -9
  9. package/dist/Avatar/index.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts.map +1 -1
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +5 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  17. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +26 -2
  21. package/dist/Banner/Banner.d.ts +10 -1
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +11 -2
  24. package/dist/Button/Button.d.ts.map +1 -1
  25. package/dist/Button/Button.js +8 -7
  26. package/dist/Calendar/Calendar.d.ts +4 -2
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +15 -21
  29. package/dist/Calendar/hooks/useCalendarDays.js +4 -6
  30. package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
  31. package/dist/Calendar/styles.d.ts +5 -20
  32. package/dist/Calendar/styles.d.ts.map +1 -1
  33. package/dist/Calendar/styles.js +15 -17
  34. package/dist/Card/Card.d.ts +12 -12
  35. package/dist/Card/Card.d.ts.map +1 -1
  36. package/dist/Card/Card.js +17 -9
  37. package/dist/Card/index.d.ts +35 -1
  38. package/dist/Card/index.d.ts.map +1 -1
  39. package/dist/Card/index.js +21 -1
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +108 -7
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +7 -1
  44. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  45. package/dist/CodeBlock/CodeBlock.js +15 -4
  46. package/dist/CodeBlock/highlightRanges.js +1 -1
  47. package/dist/CodeBlock/highlightStyles.js +13 -13
  48. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteItem.js +2 -7
  50. package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +14 -7
  53. package/dist/DateInput/DateInput.d.ts +43 -0
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +22 -5
  56. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  57. package/dist/DateInput/MonthScroller.js +5 -3
  58. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  59. package/dist/DateInput/MonthYearWheels.js +6 -4
  60. package/dist/DateInput/NativeDateField.d.ts +10 -0
  61. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  62. package/dist/DateInput/NativeDateField.js +494 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +52 -25
  65. package/dist/DateInput/Wheel.d.ts.map +1 -1
  66. package/dist/DateInput/Wheel.js +1 -0
  67. package/dist/DateInput/index.d.ts +1 -1
  68. package/dist/DateInput/index.d.ts.map +1 -1
  69. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  70. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  71. package/dist/DateInput/nativeDateSegments.js +111 -0
  72. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  73. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  74. package/dist/DateRangeInput/DateRangeInput.js +3 -5
  75. package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
  76. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.js +35 -10
  78. package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
  79. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
  80. package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
  81. package/dist/Dialog/Dialog.d.ts +16 -2
  82. package/dist/Dialog/Dialog.d.ts.map +1 -1
  83. package/dist/Dialog/Dialog.js +28 -7
  84. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  86. package/dist/Field/FieldLabel.d.ts.map +1 -1
  87. package/dist/Field/FieldLabel.js +9 -1
  88. package/dist/Field/InputClearButton.d.ts +9 -3
  89. package/dist/Field/InputClearButton.d.ts.map +1 -1
  90. package/dist/Field/InputClearButton.js +14 -3
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +0 -1
  93. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/HoverCard.js +104 -3
  95. package/dist/HoverCard/useHoverCard.d.ts +14 -2
  96. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  97. package/dist/HoverCard/useHoverCard.js +7 -1
  98. package/dist/Icon/Icon.d.ts +4 -2
  99. package/dist/Icon/Icon.d.ts.map +1 -1
  100. package/dist/Icon/defaultIcons.d.ts +3 -2
  101. package/dist/Icon/defaultIcons.d.ts.map +1 -1
  102. package/dist/Icon/defaultIcons.js +7 -0
  103. package/dist/Icon/globalIconRegistry.d.ts +13 -0
  104. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  105. package/dist/Icon/globalIconRegistry.js +34 -6
  106. package/dist/Icon/index.d.ts +1 -1
  107. package/dist/Icon/index.d.ts.map +1 -1
  108. package/dist/Icon/useIcon.d.ts +5 -2
  109. package/dist/Icon/useIcon.d.ts.map +1 -1
  110. package/dist/Icon/useIcon.js +3 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +2 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -26
  117. package/dist/Layer/gestureCounter.d.ts +8 -0
  118. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  119. package/dist/Layer/gestureCounter.js +53 -0
  120. package/dist/Layer/useLayer.d.ts +23 -13
  121. package/dist/Layer/useLayer.d.ts.map +1 -1
  122. package/dist/Layer/useLayer.js +146 -24
  123. package/dist/List/List.d.ts +1 -1
  124. package/dist/List/List.d.ts.map +1 -1
  125. package/dist/List/List.js +15 -4
  126. package/dist/Markdown/Markdown.d.ts +1 -1
  127. package/dist/Markdown/Markdown.d.ts.map +1 -1
  128. package/dist/Markdown/Markdown.js +20 -7
  129. package/dist/Markdown/parser.d.ts.map +1 -1
  130. package/dist/Markdown/parser.js +5 -3
  131. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  132. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  133. package/dist/MetadataList/MetadataListItem.js +4 -1
  134. package/dist/MultiSelector/MultiSelector.d.ts +18 -1
  135. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  136. package/dist/MultiSelector/MultiSelector.js +58 -11
  137. package/dist/MultiSelector/hooks.d.ts +7 -1
  138. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  139. package/dist/MultiSelector/hooks.js +3 -2
  140. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  141. package/dist/NavIcon/NavIcon.js +5 -1
  142. package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
  143. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  144. package/dist/NavItem/navItemStyles.stylex.js +0 -2
  145. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  146. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  147. package/dist/NavMenu/NavHeadingMenu.js +7 -4
  148. package/dist/NumberInput/NumberInput.d.ts +6 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +95 -126
  151. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  152. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  153. package/dist/NumberInput/numberInputCommit.js +71 -0
  154. package/dist/NumberInput/numberParser.d.ts +64 -0
  155. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  156. package/dist/NumberInput/numberParser.js +350 -0
  157. package/dist/Outline/Outline.d.ts.map +1 -1
  158. package/dist/Outline/Outline.js +2 -3
  159. package/dist/OverflowList/OverflowList.d.ts +41 -1
  160. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  161. package/dist/OverflowList/OverflowList.js +43 -2
  162. package/dist/Popover/Popover.d.ts.map +1 -1
  163. package/dist/Popover/Popover.js +8 -14
  164. package/dist/Popover/usePopover.d.ts +15 -41
  165. package/dist/Popover/usePopover.d.ts.map +1 -1
  166. package/dist/Popover/usePopover.js +26 -7
  167. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
  169. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  170. package/dist/PowerSearch/formatFilterValue.js +4 -2
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +18 -5
  173. package/dist/Resizable/useResizable.d.ts +19 -1
  174. package/dist/Resizable/useResizable.d.ts.map +1 -1
  175. package/dist/Resizable/useResizable.js +104 -38
  176. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.js +9 -0
  178. package/dist/Selector/Selector.d.ts +18 -1
  179. package/dist/Selector/Selector.d.ts.map +1 -1
  180. package/dist/Selector/Selector.js +92 -21
  181. package/dist/Selector/hooks.d.ts +7 -1
  182. package/dist/Selector/hooks.d.ts.map +1 -1
  183. package/dist/Selector/hooks.js +3 -2
  184. package/dist/SideNav/SideNav.d.ts +6 -1
  185. package/dist/SideNav/SideNav.d.ts.map +1 -1
  186. package/dist/SideNav/SideNav.js +57 -27
  187. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  188. package/dist/SideNav/SideNavHeading.js +5 -4
  189. package/dist/SideNav/SideNavItem.d.ts +29 -4
  190. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  191. package/dist/SideNav/SideNavItem.js +75 -20
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +34 -2
  194. package/dist/Spinner/Spinner.d.ts +3 -1
  195. package/dist/Spinner/Spinner.d.ts.map +1 -1
  196. package/dist/Spinner/Spinner.js +199 -20
  197. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  198. package/dist/StatusDot/StatusDot.js +6 -1
  199. package/dist/Stepper/Step.d.ts.map +1 -1
  200. package/dist/Stepper/Step.js +7 -6
  201. package/dist/Switch/Switch.d.ts.map +1 -1
  202. package/dist/Switch/Switch.js +5 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +6 -1
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +3 -6
  207. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  208. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +25 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  215. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  216. package/dist/Text/Text.d.ts.map +1 -1
  217. package/dist/Text/Text.js +0 -1
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +13 -8
  220. package/dist/Timestamp/Timestamp.d.ts +1 -1
  221. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  222. package/dist/Timestamp/Timestamp.js +10 -18
  223. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  224. package/dist/Timestamp/formatInstant.js +10 -5
  225. package/dist/Toast/Toast.d.ts +17 -2
  226. package/dist/Toast/Toast.d.ts.map +1 -1
  227. package/dist/Toast/Toast.js +77 -11
  228. package/dist/Toast/ToastViewport.d.ts +1 -0
  229. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  230. package/dist/Toast/ToastViewport.js +76 -21
  231. package/dist/Toast/index.d.ts +1 -1
  232. package/dist/Toast/index.d.ts.map +1 -1
  233. package/dist/Toast/types.d.ts +38 -0
  234. package/dist/Toast/types.d.ts.map +1 -1
  235. package/dist/Toast/useToastGesture.d.ts +26 -0
  236. package/dist/Toast/useToastGesture.d.ts.map +1 -0
  237. package/dist/Toast/useToastGesture.js +223 -0
  238. package/dist/Token/Token.d.ts +1 -1
  239. package/dist/Token/Token.d.ts.map +1 -1
  240. package/dist/Token/Token.js +23 -12
  241. package/dist/Token/TokenLink.d.ts +1 -1
  242. package/dist/Token/TokenLink.d.ts.map +1 -1
  243. package/dist/Token/TokenLink.js +5 -2
  244. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  245. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  246. package/dist/Tokenizer/Tokenizer.js +31 -21
  247. package/dist/TopNav/TopNavHeading.js +2 -2
  248. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  249. package/dist/TopNav/TopNavItem.js +3 -3
  250. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  251. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavMegaMenu.js +30 -9
  253. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
  255. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +21 -6
  258. package/dist/TreeList/TreeList.d.ts +1 -1
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +7 -2
  261. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  262. package/dist/TreeList/TreeListItem.js +2 -2
  263. package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +51 -8
  266. package/dist/Typeahead/Typeahead.d.ts +8 -1
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +2 -0
  269. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  270. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  271. package/dist/Typeahead/TypeaheadItem.js +7 -2
  272. package/dist/astryx.css +87 -22
  273. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  274. package/dist/hooks/useHotkeys.js +3 -25
  275. package/dist/hooks/useOverflow.d.ts.map +1 -1
  276. package/dist/hooks/useOverflow.js +14 -4
  277. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  278. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  279. package/dist/i18n/InternationalizationContext.js +3 -1
  280. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  281. package/dist/i18n/InternationalizationProvider.js +3 -1
  282. package/dist/i18n/resolve.d.ts +1 -1
  283. package/dist/i18n/resolve.d.ts.map +1 -1
  284. package/dist/i18n/resolve.js +37 -38
  285. package/dist/i18n/useTranslator.d.ts.map +1 -1
  286. package/dist/i18n/useTranslator.js +2 -3
  287. package/dist/index.d.ts +1 -1
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/theme/Theme.d.ts.map +1 -1
  290. package/dist/theme/Theme.js +46 -10
  291. package/dist/theme/defineTheme.d.ts +9 -3
  292. package/dist/theme/defineTheme.d.ts.map +1 -1
  293. package/dist/theme/defineTheme.js +5 -0
  294. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  295. package/dist/theme/derivedVarRegistry.js +24 -4
  296. package/dist/theme/generateThemeRules.d.ts +21 -0
  297. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  298. package/dist/theme/generateThemeRules.js +26 -0
  299. package/dist/theme/syntax/tokens.d.ts +1 -1
  300. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  301. package/dist/theme/syntax/tokens.js +5 -2
  302. package/dist/theme/useTheme.d.ts.map +1 -1
  303. package/dist/theme/useTheme.js +6 -7
  304. package/dist/utils/dateParser.d.ts +5 -8
  305. package/dist/utils/dateParser.d.ts.map +1 -1
  306. package/dist/utils/dateParser.js +10 -11
  307. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  308. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  309. package/dist/utils/focusOutline.stylex.js +15 -0
  310. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  311. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  312. package/dist/utils/interactionOverlay.stylex.js +42 -0
  313. package/dist/utils/isApplePlatform.d.ts +18 -0
  314. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  315. package/dist/utils/isApplePlatform.js +37 -0
  316. package/dist/utils/plainDate.d.ts +11 -0
  317. package/dist/utils/plainDate.d.ts.map +1 -1
  318. package/dist/utils/plainDate.js +20 -4
  319. package/locales/af-ZA.json +7 -7
  320. package/locales/ar-SA.json +7 -7
  321. package/locales/ca-ES.json +6 -6
  322. package/locales/cs-CZ.json +7 -7
  323. package/locales/da-DK.json +7 -7
  324. package/locales/de-DE.json +7 -7
  325. package/locales/el-GR.json +7 -7
  326. package/locales/en.json +178 -6
  327. package/locales/es-ES.json +6 -6
  328. package/locales/fi-FI.json +7 -7
  329. package/locales/fr-FR.json +7 -7
  330. package/locales/he-IL.json +7 -7
  331. package/locales/hu-HU.json +7 -7
  332. package/locales/it-IT.json +7 -7
  333. package/locales/ja-JP.json +7 -7
  334. package/locales/ko-KR.json +7 -7
  335. package/locales/nl-NL.json +7 -7
  336. package/locales/no-NO.json +7 -7
  337. package/locales/pl-PL.json +7 -7
  338. package/locales/pseudo.json +130 -1
  339. package/locales/pt-BR.json +7 -7
  340. package/locales/pt-PT.json +7 -7
  341. package/locales/ro-RO.json +7 -7
  342. package/locales/ru-RU.json +7 -7
  343. package/locales/sr-SP.json +7 -7
  344. package/locales/sv-SE.json +7 -7
  345. package/locales/tr-TR.json +7 -7
  346. package/locales/uk-UA.json +7 -7
  347. package/locales/vi-VN.json +7 -7
  348. package/locales/zh-CN.json +7 -7
  349. package/locales/zh-TW.json +7 -7
  350. package/package.json +4 -5
  351. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  352. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  353. package/src/AlertDialog/AlertDialog.tsx +62 -20
  354. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  355. package/src/AspectRatio/AspectRatio.tsx +6 -6
  356. package/src/Avatar/Avatar.doc.mjs +12 -2
  357. package/src/Avatar/Avatar.test.tsx +80 -0
  358. package/src/Avatar/Avatar.tsx +64 -14
  359. package/src/Avatar/index.ts +2 -2
  360. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  361. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  362. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  363. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  364. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  365. package/src/Badge/Badge.doc.mjs +3 -2
  366. package/src/Badge/Badge.test.tsx +32 -3
  367. package/src/Badge/Badge.tsx +42 -1
  368. package/src/Banner/Banner.doc.mjs +9 -0
  369. package/src/Banner/Banner.test.tsx +76 -11
  370. package/src/Banner/Banner.tsx +21 -2
  371. package/src/Button/Button.doc.mjs +2 -1
  372. package/src/Button/Button.test.tsx +19 -4
  373. package/src/Button/Button.tsx +9 -29
  374. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  375. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  376. package/src/Calendar/Calendar.doc.mjs +4 -4
  377. package/src/Calendar/Calendar.test.tsx +112 -0
  378. package/src/Calendar/Calendar.tsx +18 -16
  379. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  380. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  381. package/src/Calendar/styles.ts +48 -42
  382. package/src/Card/Card.doc.mjs +10 -7
  383. package/src/Card/Card.test.tsx +113 -19
  384. package/src/Card/Card.tsx +67 -89
  385. package/src/Card/index.ts +36 -1
  386. package/src/Carousel/Carousel.doc.mjs +3 -0
  387. package/src/Carousel/Carousel.test.tsx +360 -0
  388. package/src/Carousel/Carousel.tsx +116 -15
  389. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
  390. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  391. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  392. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  393. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  394. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  395. package/src/CodeBlock/CodeBlock.tsx +20 -4
  396. package/src/CodeBlock/highlightRanges.ts +1 -1
  397. package/src/CodeBlock/highlightStyles.ts +13 -13
  398. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  399. package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
  400. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  401. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  402. package/src/DateInput/DateInput.doc.mjs +17 -1
  403. package/src/DateInput/DateInput.test.tsx +9 -4
  404. package/src/DateInput/DateInput.tsx +54 -3
  405. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  406. package/src/DateInput/MonthScroller.tsx +5 -1
  407. package/src/DateInput/MonthYearWheels.tsx +7 -4
  408. package/src/DateInput/NativeDateField.test.tsx +635 -0
  409. package/src/DateInput/NativeDateField.tsx +641 -0
  410. package/src/DateInput/TouchDateField.tsx +83 -33
  411. package/src/DateInput/Wheel.tsx +1 -0
  412. package/src/DateInput/index.ts +1 -0
  413. package/src/DateInput/nativeDateSegments.ts +127 -0
  414. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
  415. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  416. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  417. package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
  418. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  419. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  420. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  421. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  422. package/src/Dialog/Dialog.test.tsx +185 -18
  423. package/src/Dialog/Dialog.tsx +35 -11
  424. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  425. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  426. package/src/Field/Field.doc.mjs +1 -1
  427. package/src/Field/FieldLabel.test.tsx +29 -0
  428. package/src/Field/FieldLabel.tsx +7 -0
  429. package/src/Field/InputClearButton.test.tsx +15 -1
  430. package/src/Field/InputClearButton.tsx +28 -4
  431. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  432. package/src/FileInput/FileInput.doc.mjs +1 -1
  433. package/src/Heading/Heading.tsx +0 -1
  434. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  435. package/src/HoverCard/HoverCard.test.tsx +154 -4
  436. package/src/HoverCard/HoverCard.tsx +137 -3
  437. package/src/HoverCard/useHoverCard.tsx +23 -3
  438. package/src/Icon/Icon.test.tsx +55 -1
  439. package/src/Icon/Icon.tsx +5 -3
  440. package/src/Icon/defaultIcons.tsx +11 -2
  441. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  442. package/src/Icon/globalIconRegistry.tsx +37 -6
  443. package/src/Icon/index.ts +1 -0
  444. package/src/Icon/useIcon.ts +9 -2
  445. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  446. package/src/Indicator/Indicator.doc.mjs +3 -1
  447. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  448. package/src/Item/Item.tsx +2 -7
  449. package/src/Kbd/Kbd.test.tsx +0 -17
  450. package/src/Kbd/Kbd.tsx +2 -26
  451. package/src/Layer/gestureCounter.ts +57 -0
  452. package/src/Layer/useLayer.test.tsx +368 -16
  453. package/src/Layer/useLayer.tsx +208 -35
  454. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  455. package/src/List/List.test.tsx +38 -0
  456. package/src/List/List.tsx +8 -1
  457. package/src/Markdown/Markdown.test.tsx +37 -0
  458. package/src/Markdown/Markdown.tsx +16 -5
  459. package/src/Markdown/parser.test.ts +33 -0
  460. package/src/Markdown/parser.ts +9 -3
  461. package/src/MetadataList/MetadataList.test.tsx +75 -2
  462. package/src/MetadataList/MetadataListItem.tsx +5 -2
  463. package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
  464. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  465. package/src/MultiSelector/MultiSelector.tsx +103 -16
  466. package/src/MultiSelector/hooks.ts +9 -2
  467. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  468. package/src/NavIcon/NavIcon.test.tsx +9 -0
  469. package/src/NavIcon/NavIcon.tsx +5 -1
  470. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  471. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  472. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  473. package/src/NumberInput/NumberInput.doc.mjs +27 -8
  474. package/src/NumberInput/NumberInput.test.tsx +563 -8
  475. package/src/NumberInput/NumberInput.tsx +77 -131
  476. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  477. package/src/NumberInput/numberInputCommit.ts +103 -0
  478. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  479. package/src/NumberInput/numberParser.test.ts +222 -0
  480. package/src/NumberInput/numberParser.ts +403 -0
  481. package/src/Outline/Outline.tsx +2 -4
  482. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  483. package/src/OverflowList/OverflowList.test.tsx +550 -4
  484. package/src/OverflowList/OverflowList.tsx +100 -2
  485. package/src/Pagination/Pagination.test.tsx +3 -2
  486. package/src/Popover/Popover.doc.mjs +2 -2
  487. package/src/Popover/Popover.test.tsx +38 -0
  488. package/src/Popover/Popover.tsx +28 -66
  489. package/src/Popover/usePopover.tsx +44 -5
  490. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  491. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  492. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  493. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  494. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  495. package/src/PowerSearch/formatFilterValue.ts +2 -0
  496. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  497. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  498. package/src/ProgressBar/ProgressBar.tsx +28 -8
  499. package/src/RadioList/RadioList.doc.mjs +1 -1
  500. package/src/Resizable/Resizable.doc.mjs +2 -2
  501. package/src/Resizable/useResizable.doc.mjs +21 -2
  502. package/src/Resizable/useResizable.test.ts +421 -0
  503. package/src/Resizable/useResizable.ts +133 -48
  504. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  505. package/src/SelectableCard/SelectableCard.tsx +16 -0
  506. package/src/Selector/Selector.doc.mjs +15 -1
  507. package/src/Selector/Selector.source-build.test.mjs +65 -0
  508. package/src/Selector/Selector.test.tsx +301 -0
  509. package/src/Selector/Selector.tsx +145 -32
  510. package/src/Selector/hooks.ts +17 -2
  511. package/src/SideNav/SideNav.doc.mjs +2 -2
  512. package/src/SideNav/SideNav.test.tsx +1069 -6
  513. package/src/SideNav/SideNav.tsx +109 -38
  514. package/src/SideNav/SideNavHeading.tsx +5 -2
  515. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  516. package/src/SideNav/SideNavItem.tsx +134 -44
  517. package/src/Slider/Slider.doc.mjs +2 -2
  518. package/src/Slider/Slider.test.tsx +106 -1
  519. package/src/Slider/Slider.tsx +52 -1
  520. package/src/Spinner/Spinner.doc.mjs +17 -5
  521. package/src/Spinner/Spinner.test.tsx +164 -0
  522. package/src/Spinner/Spinner.tsx +252 -22
  523. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  524. package/src/StatusDot/StatusDot.test.tsx +9 -0
  525. package/src/StatusDot/StatusDot.tsx +7 -1
  526. package/src/Stepper/Step.doc.mjs +1 -1
  527. package/src/Stepper/Step.tsx +7 -14
  528. package/src/Switch/Switch.doc.mjs +3 -1
  529. package/src/Switch/Switch.test.tsx +10 -0
  530. package/src/Switch/Switch.tsx +3 -0
  531. package/src/Table/BaseTable.tsx +6 -1
  532. package/src/Table/Table.doc.mjs +5 -3
  533. package/src/Table/Table.tsx +3 -8
  534. package/src/Table/TableBody.doc.mjs +2 -2
  535. package/src/Table/TableFooter.doc.mjs +1 -1
  536. package/src/Table/TableHeader.doc.mjs +1 -1
  537. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  538. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  539. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  540. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  541. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  542. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  543. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  544. package/src/Table/useTablePagination.doc.mjs +1 -1
  545. package/src/Table/useTableSelection.doc.mjs +1 -1
  546. package/src/Text/Text.test.tsx +44 -0
  547. package/src/Text/Text.tsx +0 -1
  548. package/src/TextArea/TextArea.doc.mjs +13 -3
  549. package/src/TextArea/TextArea.test.tsx +11 -0
  550. package/src/TextArea/TextArea.tsx +34 -22
  551. package/src/TextInput/TextInput.doc.mjs +1 -1
  552. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  553. package/src/Timestamp/Timestamp.test.tsx +89 -0
  554. package/src/Timestamp/Timestamp.tsx +8 -8
  555. package/src/Timestamp/formatInstant.ts +5 -0
  556. package/src/Toast/Toast.doc.mjs +213 -44
  557. package/src/Toast/Toast.tsx +118 -23
  558. package/src/Toast/ToastViewport.test.tsx +1434 -8
  559. package/src/Toast/ToastViewport.tsx +85 -14
  560. package/src/Toast/index.ts +2 -0
  561. package/src/Toast/types.ts +43 -5
  562. package/src/Toast/useToastGesture.ts +361 -0
  563. package/src/Token/Token.test.tsx +95 -0
  564. package/src/Token/Token.tsx +19 -17
  565. package/src/Token/TokenLink.tsx +12 -3
  566. package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
  567. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  568. package/src/Tokenizer/Tokenizer.tsx +49 -24
  569. package/src/TopNav/TopNavHeading.tsx +2 -2
  570. package/src/TopNav/TopNavItem.tsx +3 -7
  571. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  572. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  573. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  574. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  575. package/src/TopNav/TopNavMenu.tsx +38 -5
  576. package/src/TreeList/TreeList.test.tsx +49 -0
  577. package/src/TreeList/TreeList.tsx +7 -2
  578. package/src/TreeList/TreeListItem.tsx +2 -7
  579. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  580. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  581. package/src/Typeahead/Typeahead.doc.mjs +7 -1
  582. package/src/Typeahead/Typeahead.test.tsx +154 -0
  583. package/src/Typeahead/Typeahead.tsx +9 -0
  584. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  585. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  586. package/src/hooks/useAnnounce.doc.mjs +96 -0
  587. package/src/hooks/useDevWarning.doc.mjs +96 -0
  588. package/src/hooks/useHotkeys.test.ts +0 -18
  589. package/src/hooks/useHotkeys.ts +3 -25
  590. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  591. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  592. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  593. package/src/hooks/useLongPress.doc.mjs +123 -0
  594. package/src/hooks/useOverflow.doc.mjs +58 -17
  595. package/src/hooks/useOverflow.ts +16 -4
  596. package/src/hooks/useTypeahead.doc.mjs +153 -0
  597. package/src/i18n/InternationalizationContext.ts +3 -0
  598. package/src/i18n/InternationalizationProvider.tsx +8 -1
  599. package/src/i18n/__tests__/resolve.test.ts +23 -1
  600. package/src/i18n/resolve.ts +46 -49
  601. package/src/i18n/useTranslator.ts +2 -7
  602. package/src/index.ts +2 -0
  603. package/src/raw-import.d.ts +14 -0
  604. package/src/theme/Theme.test.tsx +104 -2
  605. package/src/theme/Theme.tsx +49 -14
  606. package/src/theme/defineTheme.test.ts +23 -0
  607. package/src/theme/defineTheme.ts +12 -3
  608. package/src/theme/derivedVarRegistry.test.ts +87 -3
  609. package/src/theme/derivedVarRegistry.ts +23 -4
  610. package/src/theme/generateThemeRules.test.ts +99 -1
  611. package/src/theme/generateThemeRules.ts +28 -0
  612. package/src/theme/syntax/tokens.ts +5 -2
  613. package/src/theme/useTheme.test.tsx +10 -0
  614. package/src/theme/useTheme.ts +16 -10
  615. package/src/utils/dateParser.test.ts +34 -2
  616. package/src/utils/dateParser.ts +11 -14
  617. package/src/utils/focusOutline.stylex.ts +50 -0
  618. package/src/utils/interactionOverlay.stylex.ts +74 -0
  619. package/src/utils/isApplePlatform.test.ts +61 -0
  620. package/src/utils/isApplePlatform.ts +37 -0
  621. package/src/utils/plainDate.test.ts +46 -0
  622. package/src/utils/plainDate.ts +18 -3
@@ -41,6 +41,7 @@ import {fileURLToPath} from 'node:url';
41
41
  import {useState} from 'react';
42
42
  import type {ISODateString} from '../utils';
43
43
  import {InputGroup} from '../InputGroup';
44
+ import {InternationalizationProvider} from '../i18n';
44
45
  import {stableClassName} from '../naming';
45
46
  import {DateInput} from './DateInput';
46
47
  import {
@@ -219,6 +220,11 @@ function Controlled({
219
220
  return (
220
221
  <DateInput
221
222
  label="Event date"
223
+ // This suite is about Astryx's own touch surface, which is now opt-out:
224
+ // `nativePicker` defaults to 'touch', so a coarse pointer gets the
225
+ // platform's picker unless a field says otherwise. Tests that assert on
226
+ // the surface selection itself pass their own value over this.
227
+ nativePicker="never"
222
228
  {...DEFAULT_RANGE}
223
229
  {...props}
224
230
  value={value}
@@ -276,6 +282,16 @@ function weekdayRow(): HTMLElement {
276
282
  // ---------------------------------------------------------------------------
277
283
 
278
284
  describe('DateInput — surface selection', () => {
285
+ it('hands a touch device to the platform picker by default', () => {
286
+ // `nativePicker` defaults to 'touch': the OS draws the picker unless a
287
+ // field opts out. Everything else in this file passes 'never', so this is
288
+ // the one place the default itself is asserted.
289
+ stubMedia({pointer: 'coarse', width: 393});
290
+ render(<DateInput label="Event date" onChange={() => {}} />);
291
+ const input = document.querySelector('input');
292
+ expect(input).toHaveAttribute('type', 'date');
293
+ });
294
+
279
295
  it('switches on the pointer alone, so a tablet gets the picker too', () => {
280
296
  // `pointer` is the PRIMARY device, which is what makes it the whole test:
281
297
  // a touchscreen laptop reports `fine` (its trackpad) and keeps the
@@ -320,7 +336,12 @@ describe('DateInput — surface selection', () => {
320
336
  setViewport('desktop');
321
337
  const onChange = vi.fn();
322
338
  render(
323
- <DateInput label="Event date" onChange={onChange} min={undefined} />,
339
+ <DateInput
340
+ nativePicker="never"
341
+ label="Event date"
342
+ onChange={onChange}
343
+ min={undefined}
344
+ />,
324
345
  );
325
346
  fireEvent.change(field(), {target: {value: '2026-03-25'}});
326
347
  expect(onChange).toHaveBeenCalledWith('2026-03-25');
@@ -337,6 +358,41 @@ describe('DateInput — surface selection', () => {
337
358
  expect(input).toHaveAttribute('inputmode', 'none');
338
359
  });
339
360
 
361
+ it('updates the field and open picker when the provider locale changes', () => {
362
+ const renderDateInput = (locale: 'en-US' | 'es-ES') => (
363
+ <InternationalizationProvider locale={locale}>
364
+ <Controlled initial="2026-03-21" />
365
+ </InternationalizationProvider>
366
+ );
367
+
368
+ withLayout(() => {
369
+ const {rerender} = render(renderDateInput('en-US'));
370
+ expect(field()).toHaveValue('March 21, 2026');
371
+
372
+ fireEvent.click(field());
373
+ expect(
374
+ document.querySelector('[data-title="month-year"]'),
375
+ ).toHaveTextContent('March 2026');
376
+ expect(pane('March 2026')).toBeInTheDocument();
377
+
378
+ rerender(renderDateInput('es-ES'));
379
+ expect(field()).toHaveValue('21 de marzo de 2026');
380
+ expect(
381
+ document.querySelector('[data-title="month-year"]'),
382
+ ).toHaveTextContent('marzo de 2026');
383
+ expect(pane('marzo de 2026')).toBeInTheDocument();
384
+
385
+ const nextButton = document.querySelector<HTMLButtonElement>(
386
+ '[data-arrows="months"] button:last-child',
387
+ );
388
+ expect(nextButton).not.toBeNull();
389
+ fireEvent.click(nextButton!);
390
+ expect(
391
+ document.querySelector('[data-title="month-year"]'),
392
+ ).toHaveTextContent('abril de 2026');
393
+ });
394
+ });
395
+
340
396
  it('forwards ref to the input on both surfaces', () => {
341
397
  const desktopRef = {current: null as HTMLInputElement | null};
342
398
  setViewport('desktop');
@@ -360,12 +416,17 @@ describe('DateInput — surface selection', () => {
360
416
  describe('DateInput — field parity', () => {
361
417
  it('shows a placeholder until a date is chosen, then the formatted value', () => {
362
418
  const {rerender} = render(
363
- <DateInput label="Ship date" onChange={() => {}} />,
419
+ <DateInput nativePicker="never" label="Ship date" onChange={() => {}} />,
364
420
  );
365
421
  expect(field()).toHaveValue('');
366
422
  expect(field()).toHaveAttribute('placeholder', 'Select a date');
367
423
  rerender(
368
- <DateInput label="Ship date" value="2026-03-21" onChange={() => {}} />,
424
+ <DateInput
425
+ nativePicker="never"
426
+ label="Ship date"
427
+ value="2026-03-21"
428
+ onChange={() => {}}
429
+ />,
369
430
  );
370
431
  expect(field()).toHaveValue('March 21, 2026');
371
432
  });
@@ -373,6 +434,7 @@ describe('DateInput — field parity', () => {
373
434
  it('honors a named format', () => {
374
435
  render(
375
436
  <DateInput
437
+ nativePicker="never"
376
438
  label="Ship date"
377
439
  value="2026-03-21"
378
440
  format="system_date"
@@ -385,6 +447,7 @@ describe('DateInput — field parity', () => {
385
447
  it('honors a function format', () => {
386
448
  render(
387
449
  <DateInput
450
+ nativePicker="never"
388
451
  label="Ship date"
389
452
  value="2026-03-21"
390
453
  format={iso => `ISO:${iso}`}
@@ -397,6 +460,7 @@ describe('DateInput — field parity', () => {
397
460
  it('honors a custom placeholder', () => {
398
461
  render(
399
462
  <DateInput
463
+ nativePicker="never"
400
464
  label="Ship date"
401
465
  placeholder="Pick a day"
402
466
  onChange={() => {}}
@@ -409,6 +473,7 @@ describe('DateInput — field parity', () => {
409
473
  const onChange = vi.fn();
410
474
  render(
411
475
  <DateInput
476
+ nativePicker="never"
412
477
  label="Ship date"
413
478
  value="2026-03-21"
414
479
  hasClear
@@ -432,6 +497,7 @@ describe('DateInput — field parity', () => {
432
497
  try {
433
498
  render(
434
499
  <DateInput
500
+ nativePicker="never"
435
501
  label="Ship date"
436
502
  value="2026-03-21"
437
503
  hasClear
@@ -457,7 +523,13 @@ describe('DateInput — field parity', () => {
457
523
 
458
524
  it('does not open the picker until the field is tapped', () => {
459
525
  withLayout(() => {
460
- render(<DateInput label="Ship date" onChange={() => {}} />);
526
+ render(
527
+ <DateInput
528
+ nativePicker="never"
529
+ label="Ship date"
530
+ onChange={() => {}}
531
+ />,
532
+ );
461
533
  expect(field()).toHaveAttribute('aria-expanded', 'false');
462
534
  expect(screen.queryByRole('grid')).not.toBeInTheDocument();
463
535
  fireEvent.click(field());
@@ -475,7 +547,14 @@ describe('DateInput — field parity', () => {
475
547
  });
476
548
 
477
549
  it('is not openable while disabled', () => {
478
- render(<DateInput label="Ship date" isDisabled onChange={() => {}} />);
550
+ render(
551
+ <DateInput
552
+ nativePicker="never"
553
+ label="Ship date"
554
+ isDisabled
555
+ onChange={() => {}}
556
+ />,
557
+ );
479
558
  expect(field()).toBeDisabled();
480
559
  fireEvent.click(field());
481
560
  expect(screen.queryByRole('grid')).not.toBeInTheDocument();
@@ -484,6 +563,7 @@ describe('DateInput — field parity', () => {
484
563
  it('stays focusable and explains itself when disabled with a reason', () => {
485
564
  render(
486
565
  <DateInput
566
+ nativePicker="never"
487
567
  label="Ship date"
488
568
  isDisabled
489
569
  disabledMessage="You need the Editor role"
@@ -500,6 +580,7 @@ describe('DateInput — field parity', () => {
500
580
  it('renders label, description and status through Field', () => {
501
581
  render(
502
582
  <DateInput
583
+ nativePicker="never"
503
584
  label="Ship date"
504
585
  description="When it leaves the warehouse"
505
586
  status={{type: 'error', message: 'Pick a date'}}
@@ -516,12 +597,21 @@ describe('DateInput — field parity', () => {
516
597
  });
517
598
 
518
599
  it('marks required for assistive technology', () => {
519
- render(<DateInput label="Ship date" isRequired onChange={() => {}} />);
600
+ render(
601
+ <DateInput
602
+ nativePicker="never"
603
+ label="Ship date"
604
+ isRequired
605
+ onChange={() => {}}
606
+ />,
607
+ );
520
608
  expect(field()).toHaveAttribute('aria-required', 'true');
521
609
  });
522
610
 
523
611
  it('associates the label natively, so the field is named without ARIA', () => {
524
- render(<DateInput label="Ship date" onChange={() => {}} />);
612
+ render(
613
+ <DateInput nativePicker="never" label="Ship date" onChange={() => {}} />,
614
+ );
525
615
  expect(screen.getByLabelText('Ship date')).toBe(field());
526
616
  });
527
617
 
@@ -536,6 +626,7 @@ describe('DateInput — field parity', () => {
536
626
  withLayout(() => {
537
627
  render(
538
628
  <DateInput
629
+ nativePicker="never"
539
630
  label="Ship date"
540
631
  value="2026-03-10"
541
632
  min="2026-03-01"
@@ -558,7 +649,7 @@ describe('DateInput — field parity', () => {
558
649
  it('drops the Field wrapper inside an InputGroup', () => {
559
650
  render(
560
651
  <InputGroup label="Range">
561
- <DateInput label="Start" onChange={() => {}} />
652
+ <DateInput nativePicker="never" label="Start" onChange={() => {}} />
562
653
  </InputGroup>,
563
654
  );
564
655
  // Named by the group label plus its own, the way core's inputs are.
@@ -643,7 +734,13 @@ describe('DateInput — calendar surface', () => {
643
734
  it('Save closes even with no date chosen, committing nothing', () => {
644
735
  const onChange = vi.fn();
645
736
  withLayout(() => {
646
- render(<DateInput label="Ship date" onChange={onChange} />);
737
+ render(
738
+ <DateInput
739
+ nativePicker="never"
740
+ label="Ship date"
741
+ onChange={onChange}
742
+ />,
743
+ );
647
744
  fireEvent.click(field());
648
745
  fireEvent.click(screen.getByRole('button', {name: 'Save'}));
649
746
  });
@@ -1519,12 +1616,22 @@ describe('DateInput — month/year wheels', () => {
1519
1616
  expect(title()).toHaveTextContent('May 2027');
1520
1617
  });
1521
1618
 
1522
- it('offers Reset only on the calendar, beside Save', () => {
1619
+ it('offers Reset only on the calendar, in the header corner', () => {
1523
1620
  renderAndOpen();
1524
- expect(screen.getByRole('button', {name: 'Reset'})).toBeInTheDocument();
1621
+ const reset = screen.getByRole('button', {name: 'Reset'});
1622
+ // The trailing-most thing in the header, past the arrows — not the
1623
+ // footer, which is Save's alone.
1624
+ const header = reset.closest('[data-action="reset"]')!.parentElement!;
1625
+ expect(header.querySelector('[data-title="month-year"]')).not.toBeNull();
1626
+ expect(header.lastElementChild).toHaveAttribute('data-action', 'reset');
1627
+
1525
1628
  openWheels();
1526
1629
  // The wheels choose a month; there is no date there to clear.
1527
1630
  expect(screen.queryByRole('button', {name: 'Reset'})).toBeNull();
1631
+ // Hidden, not unmounted, so the header cannot change height mid-swap.
1632
+ expect(
1633
+ document.querySelector('dialog[open] [data-action="reset"]'),
1634
+ ).toHaveAttribute('inert');
1528
1635
  });
1529
1636
 
1530
1637
  it('Save closes the whole picker; Done only leaves the wheels', () => {
@@ -2390,18 +2497,27 @@ describe('DateInput — scroll CSS (definition-level)', () => {
2390
2497
  expect(footer).not.toContain('paddingInline');
2391
2498
  });
2392
2499
 
2393
- it('floors the touch target without discarding the size prop', () => {
2394
- const source = read('TouchDateField.tsx');
2395
- // Each size keeps its own height AND cannot render below a thumb's reach.
2396
- const sizeMap = source.slice(
2397
- source.indexOf('const sizeStyles = stylex.create('),
2398
- source.indexOf('const styles = stylex.create('),
2500
+ it('sizes the closed field the same on both surfaces', () => {
2501
+ // `DateInput` picks a surface from the pointer and `nativePicker`, so a
2502
+ // field that sizes itself differently on one of them changes height for
2503
+ // a reason the call site never asked about.
2504
+ //
2505
+ // Compared with formatting normalized away: the two files write the same
2506
+ // declarations differently, one entry per line against one per size.
2507
+ const sizeMap = (file: string) => {
2508
+ const source = read(file);
2509
+ const start = source.indexOf('const sizeStyles = stylex.create(');
2510
+ expect(start).toBeGreaterThan(-1);
2511
+ return source
2512
+ .slice(start, source.indexOf('});', start))
2513
+ .replace(/\/\/.*$/gm, '')
2514
+ .replace(/\/\*[\s\S]*?\*\//g, '')
2515
+ .replace(/\s+/g, '')
2516
+ .replace(/,(?=[}\]])/g, '');
2517
+ };
2518
+ expect(sizeMap('TouchDateField.tsx')).toEqual(
2519
+ sizeMap('NativeDateField.tsx'),
2399
2520
  );
2400
- expect(
2401
- sizeMap.match(
2402
- /minBlockSize: \{default: null, '@media \(pointer: coarse\)': TOUCH_TARGET\}/g,
2403
- ),
2404
- ).toHaveLength(3);
2405
2521
  });
2406
2522
 
2407
2523
  it('floors the month arrows too — Button tops out at 36px', () => {
@@ -2523,16 +2639,14 @@ describe('DateInput — scroll CSS (definition-level)', () => {
2523
2639
  });
2524
2640
 
2525
2641
  /**
2526
- * Both footer actions span the sheet. A full-width primary is the shape a
2642
+ * The footer action spans the sheet. A full-width primary is the shape a
2527
2643
  * phone form ends with, and it puts the target under the thumb wherever
2528
2644
  * the hand is.
2529
2645
  */
2530
- it('spans the footer with its actions', () => {
2646
+ it('spans the footer with its action', () => {
2531
2647
  const source = read('TouchDateField.tsx');
2532
- // Reset + Save share the calendar's cell; Done is the wheels'. Each
2533
- // fills the space it is given, so the row divides evenly rather than by
2534
- // label length.
2535
- expect(source.match(/width="100%"/g)).toHaveLength(3);
2648
+ // One per surface: Save on the calendar, Done on the wheels.
2649
+ expect(source.match(/width="100%"/g)).toHaveLength(2);
2536
2650
  });
2537
2651
 
2538
2652
  /**
@@ -2581,7 +2695,7 @@ describe('DateInput — scroll CSS (definition-level)', () => {
2581
2695
  expect(
2582
2696
  styles.match(/transitionTimingFunction: easeVars\['--ease-standard'\]/g),
2583
2697
  ).toHaveLength(1);
2584
- expect(styles.match(/transitionTimingFunction: 'linear'/g)).toHaveLength(3);
2698
+ expect(styles.match(/transitionTimingFunction: 'linear'/g)).toHaveLength(4);
2585
2699
  });
2586
2700
 
2587
2701
  /**
@@ -2599,9 +2713,9 @@ describe('DateInput — scroll CSS (definition-level)', () => {
2599
2713
  const styles = source.slice(
2600
2714
  source.indexOf('const styles = stylex.create('),
2601
2715
  );
2602
- // The arrows, the weekday row, the layer beneath, the layer above, and
2603
- // the chevron.
2604
- expect(styles.match(/transitionDuration: SWAP_DURATION/g)).toHaveLength(5);
2716
+ // The arrows, Reset, the weekday row, the layer beneath, the layer
2717
+ // above, and the chevron.
2718
+ expect(styles.match(/transitionDuration: SWAP_DURATION/g)).toHaveLength(6);
2605
2719
  // And no leftover hand-rolled timing beside them.
2606
2720
  expect(styles).not.toContain('PANEL_FADE_MS');
2607
2721
  expect(source).toContain(
@@ -25,6 +25,7 @@
25
25
  *
26
26
  * SYNC: When modified, update:
27
27
  * - /packages/core/src/DateInput/TouchDateField.tsx
28
+ * - /packages/core/src/DateTimeInput/TouchDateTimeField.tsx
28
29
  * - /packages/core/src/DateInput/DateInput.doc.mjs
29
30
  * - /packages/core/src/DateInput/DateInputTouch.test.tsx
30
31
  */
@@ -39,7 +40,7 @@ import {
39
40
  } from 'react';
40
41
  import * as stylex from '@stylexjs/stylex';
41
42
  import {useCalendarDays} from '../Calendar';
42
- import {useDirection} from '../i18n';
43
+ import {useDirection, useLocale} from '../i18n';
43
44
  import {
44
45
  colorVars,
45
46
  radiusVars,
@@ -763,6 +764,7 @@ function MonthPane({
763
764
  onDayKeyDown,
764
765
  onDayFocus,
765
766
  }: MonthPaneProps) {
767
+ const locale = useLocale();
766
768
  const {year, month} = fromMonthIndex(monthIndex);
767
769
  const {weeks} = useCalendarDays({
768
770
  year,
@@ -776,6 +778,7 @@ function MonthPane({
776
778
  const monthLabel = plainDateFormat(
777
779
  {year, month, day: 1},
778
780
  DATE_FORMAT_MONTH_YEAR,
781
+ locale,
779
782
  );
780
783
 
781
784
  // Exactly one day per pane is tab-reachable, so Tab moves through the
@@ -836,6 +839,7 @@ function MonthPane({
836
839
  aria-label={plainDateFormat(
837
840
  day.date,
838
841
  DATE_FORMAT_WITH_WEEKDAY,
842
+ locale,
839
843
  )}
840
844
  aria-disabled={isDisabled || undefined}
841
845
  aria-current={isToday ? 'date' : undefined}
@@ -17,12 +17,14 @@
17
17
  *
18
18
  * SYNC: When modified, update:
19
19
  * - /packages/core/src/DateInput/TouchDateField.tsx
20
+ * - /packages/core/src/DateTimeInput/TouchDateTimeField.tsx
20
21
  * - /packages/core/src/DateInput/DateInput.doc.mjs
21
22
  * - /packages/core/src/DateInput/DateInputTouch.test.tsx
22
23
  */
23
24
 
24
25
  import {useMemo} from 'react';
25
26
  import * as stylex from '@stylexjs/stylex';
27
+ import {useLocale} from '../i18n';
26
28
  import {DATE_FORMAT_MONTH_ONLY, plainDateFormat} from '../utils';
27
29
  import {spacingVars} from '../theme/tokens.stylex';
28
30
  import {dateInputTouchGeometry} from './tokens.stylex';
@@ -66,6 +68,7 @@ export function MonthYearWheels({
66
68
  yearLabel,
67
69
  isActive = true,
68
70
  }: MonthYearWheelsProps) {
71
+ const locale = useLocale();
69
72
  const {year, month} = fromMonthIndex(monthIndex);
70
73
 
71
74
  // Day 15 of a fixed year: no timezone can push it into an adjacent month
@@ -73,18 +76,18 @@ export function MonthYearWheels({
73
76
  //
74
77
  // `plainDateFormat` rather than a raw `Intl.DateTimeFormat`, which the
75
78
  // shared lint rule forbids and which would duplicate the format vocabulary
76
- // besides. It resolves the locale itself, so there is nothing here for the
77
- // memo to depend on — the same is true of Calendar's own month labels, and
78
- // is why this list is constant for the life of the component.
79
+ // besides. Recompute when the provider locale changes so the wheel labels
80
+ // stay in sync with the field and calendar.
79
81
  const monthNames = useMemo(
80
82
  () =>
81
83
  Array.from({length: 12}, (_, index) =>
82
84
  plainDateFormat(
83
85
  {year: 2021, month: index + 1, day: 15},
84
86
  DATE_FORMAT_MONTH_ONLY,
87
+ locale,
85
88
  ),
86
89
  ),
87
- [],
90
+ [locale],
88
91
  );
89
92
 
90
93
  // Months outside the range stay on the wheel rather than vanishing: a list