@astryxdesign/core 0.5.0 → 0.5.1-canary.046f6ea

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
@@ -38,6 +38,10 @@
38
38
  * 3. The title is the escape hatch. Tap it and the same box becomes a month
39
39
  * wheel and a year wheel — a flick each to reach 2019 instead of forty.
40
40
  *
41
+ * Reset is chrome, so it sits in the header beside the arrows rather than in
42
+ * the footer: the footer is where the task ends, and an undo of equal weight
43
+ * beside Save is a mis-tap that throws away the date just chosen.
44
+ *
41
45
  * SYNC: When modified, update these files to stay in sync:
42
46
  * - /packages/core/src/DateInput/DateInput.tsx
43
47
  * - /packages/core/src/DateInput/DateInput.doc.mjs
@@ -71,7 +75,7 @@ import {useInputStatusIcon, useMergedRefs} from '../hooks';
71
75
  import {useResolvedRequired} from '../hooks/useResolvedRequired';
72
76
  import {Icon} from '../Icon';
73
77
  import {IconButton} from '../IconButton';
74
- import {useTranslator} from '../i18n';
78
+ import {useLocale, useTranslator} from '../i18n';
75
79
  import {useInputGroup} from '../InputGroup';
76
80
  import {groupStyles} from '../InputGroup/groupStyles';
77
81
  import {stableClassName} from '../naming';
@@ -106,6 +110,7 @@ import {
106
110
  DATE_FORMAT_WEEKDAY_ONLY,
107
111
  type ISODateString,
108
112
  } from '../utils';
113
+ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
109
114
  import {normalizeDayOfWeek} from '../utils/dateTypes';
110
115
  import {MonthScroller, type MonthScrollerHandle} from './MonthScroller';
111
116
  import {MonthYearWheels} from './MonthYearWheels';
@@ -118,9 +123,8 @@ import {
118
123
  import {dateInputTouchSizes, dateInputTouchGeometry} from './tokens.stylex';
119
124
 
120
125
  /**
121
- * The comfortable minimum tap target on both iOS and Android. Applied as a
122
- * FLOOR under the size prop rather than replacing it: `size` still means what
123
- * it means, it just cannot produce a control a thumb misses.
126
+ * The comfortable minimum tap target on both iOS and Android, honoured by
127
+ * every target inside the sheet.
124
128
  */
125
129
  const TOUCH_TARGET = dateInputTouchSizes.daySize;
126
130
 
@@ -147,17 +151,14 @@ const sizeStyles = stylex.create({
147
151
  sm: {
148
152
  height: sizeVars['--size-element-sm'],
149
153
  minWidth: 180,
150
- minBlockSize: {default: null, '@media (pointer: coarse)': TOUCH_TARGET},
151
154
  },
152
155
  md: {
153
156
  height: sizeVars['--size-element-md'],
154
157
  minWidth: 180,
155
- minBlockSize: {default: null, '@media (pointer: coarse)': TOUCH_TARGET},
156
158
  },
157
159
  lg: {
158
160
  height: sizeVars['--size-element-lg'],
159
161
  minWidth: 180,
160
- minBlockSize: {default: null, '@media (pointer: coarse)': TOUCH_TARGET},
161
162
  },
162
163
  });
163
164
 
@@ -282,7 +283,7 @@ const styles = stylex.create({
282
283
  /**
283
284
  * `Button`'s own sizes top out at 36px, which is fine for a mouse and short
284
285
  * of the 44px every other target in this sheet honours. Floor it on a
285
- * coarse pointer, the same way the field and the day cells do.
286
+ * coarse pointer, the same way the day cells do.
286
287
  */
287
288
  monthArrow: {
288
289
  minBlockSize: {default: null, '@media (pointer: coarse)': TOUCH_TARGET},
@@ -297,6 +298,34 @@ const styles = stylex.create({
297
298
  monthArrowIcon: {
298
299
  display: 'inline-flex',
299
300
  },
301
+ /**
302
+ * Reset, past the arrows. It fades on their timing for their reason: the
303
+ * plate starts below the header, so the two of them are what the layer
304
+ * above cannot cover, and they have to leave together.
305
+ */
306
+ headerReset: {
307
+ display: 'flex',
308
+ alignItems: 'center',
309
+ transitionProperty: 'opacity, visibility',
310
+ transitionDuration: SWAP_DURATION,
311
+ transitionTimingFunction: 'linear',
312
+ '@media (prefers-reduced-motion: reduce)': {
313
+ transitionDuration: '0.01s',
314
+ },
315
+ },
316
+ headerResetHidden: {
317
+ visibility: 'hidden',
318
+ opacity: 0,
319
+ pointerEvents: 'none',
320
+ },
321
+ /**
322
+ * The same 44px floor the arrows take. `Button`'s `sm` is 32px, which is
323
+ * fine beside a mouse and short of what every other target in this sheet
324
+ * honours.
325
+ */
326
+ resetButton: {
327
+ minBlockSize: {default: null, '@media (pointer: coarse)': TOUCH_TARGET},
328
+ },
300
329
  /**
301
330
  * The month and year, and the toggle into the wheels. Leading, so it reads
302
331
  * first and sits on the same line as the day grid below it.
@@ -313,15 +342,7 @@ const styles = stylex.create({
313
342
  borderWidth: 0,
314
343
  borderStyle: 'none',
315
344
  borderRadius: radiusVars['--radius-element'],
316
- backgroundColor: {
317
- default: 'transparent',
318
- '@media (hover: hover)': {
319
- default: 'transparent',
320
- ':hover:where(:not(:disabled,[aria-disabled="true"]))':
321
- colorVars['--color-overlay-hover'],
322
- },
323
- ':active': colorVars['--color-overlay-pressed'],
324
- },
345
+ backgroundColor: 'transparent',
325
346
  color: colorVars['--color-text-primary'],
326
347
  fontSize: typeScaleVars['--text-large-size'],
327
348
  fontWeight: fontWeightVars['--font-weight-semibold'],
@@ -330,9 +351,19 @@ const styles = stylex.create({
330
351
  ':is(:disabled,[aria-disabled="true"])': 'default',
331
352
  },
332
353
  whiteSpace: 'nowrap',
354
+ // The header now ends with Reset, so the title is the part that gives:
355
+ // it ellipses rather than pushing the corner off a narrow screen.
356
+ minInlineSize: 0,
357
+ overflow: 'hidden',
358
+ },
359
+ titleText: {
360
+ minInlineSize: 0,
361
+ overflow: 'hidden',
362
+ textOverflow: 'ellipsis',
333
363
  },
334
364
  titleChevron: {
335
365
  display: 'inline-flex',
366
+ flexShrink: 0,
336
367
  // The one part of the swap that keeps `--ease-standard`, because it is
337
368
  // the one part that travels: a rotation has a distance to cover, and
338
369
  // fast-out-slow-in is what that curve is for. Same duration as the
@@ -479,16 +510,14 @@ const styles = stylex.create({
479
510
  },
480
511
  /**
481
512
  * One footer action. Both occupy the same cell, and the wheels' one is a
482
- * layer over the calendar's pair exactly as the panels above are. The row
513
+ * layer over the calendar's, exactly as the panels above are. The row
483
514
  * never changes height either way.
484
515
  */
485
516
  footerAction: {
486
517
  gridArea: '1 / 1',
487
- // Side by side and equal: the calendar's cell holds Reset and Save, the
488
- // wheels' holds one button. `1fr` each rather than content width, so
489
- // neither label's length decides how the row is divided.
518
+ // One button per surface, filling the row: Save on the calendar, Done on
519
+ // the wheels.
490
520
  display: 'flex',
491
- gap: spacingVars['--spacing-2'],
492
521
  },
493
522
  sheetBody: {
494
523
  // One inset on every edge. The block-start is the exception and has to
@@ -545,6 +574,7 @@ export function TouchDateField({
545
574
  ...rest
546
575
  }: DateInputProps) {
547
576
  const t = useTranslator();
577
+ const locale = useLocale();
548
578
  const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
549
579
  const placeholder =
550
580
  placeholderFromProps ?? t('@astryx.dateInput.placeholder');
@@ -670,13 +700,15 @@ export function TouchDateField({
670
700
  plainDateFormat(
671
701
  {year: 1970, month: 1, day: 4 + ((weekStartsOn + offset) % 7)},
672
702
  DATE_FORMAT_WEEKDAY_ONLY,
703
+ locale,
673
704
  ),
674
705
  ),
675
- [weekStartsOn],
706
+ [locale, weekStartsOn],
676
707
  );
677
708
  const monthYearLabel = plainDateFormat(
678
709
  {year, month, day: 1},
679
710
  DATE_FORMAT_MONTH_YEAR,
711
+ locale,
680
712
  );
681
713
 
682
714
  // Formats the committed value only. A function format is called with the ISO
@@ -686,7 +718,7 @@ export function TouchDateField({
686
718
  optimisticValue != null && /^\d{4}-\d{2}-\d{2}$/.test(optimisticValue)
687
719
  ? typeof format === 'function'
688
720
  ? format(optimisticValue)
689
- : formatSharedDate(plainDateFromISO(optimisticValue), format)
721
+ : formatSharedDate(plainDateFromISO(optimisticValue), format, locale)
690
722
  : '';
691
723
 
692
724
  const fireChange = useCallback(
@@ -918,8 +950,12 @@ export function TouchDateField({
918
950
  // restyle the header button. Adding a target later is additive;
919
951
  // withdrawing one is not.
920
952
  data-title="month-year"
921
- {...stylex.props(styles.title, focusOutlineStyles.focusVisible)}>
922
- <span>{monthYearLabel}</span>
953
+ {...stylex.props(
954
+ styles.title,
955
+ interactionOverlayStyles.backgroundColor,
956
+ focusOutlineStyles.focusVisible,
957
+ )}>
958
+ <span {...stylex.props(styles.titleText)}>{monthYearLabel}</span>
923
959
  <Icon
924
960
  icon="chevronDown"
925
961
  size="sm"
@@ -983,6 +1019,27 @@ export function TouchDateField({
983
1019
  }
984
1020
  />
985
1021
  </span>
1022
+ {/* Reset, past the arrows, and gone with them on the wheels: the
1023
+ wheels choose a month, and there is no date there to put back.
1024
+ Hidden rather than unmounted, for the arrows' reason — the corner
1025
+ keeps its size, so the header cannot change height mid-swap. */}
1026
+ <span
1027
+ data-action="reset"
1028
+ inert={isWheelOpen ? true : undefined}
1029
+ {...stylex.props(
1030
+ styles.headerReset,
1031
+ isWheelOpen && styles.headerResetHidden,
1032
+ )}>
1033
+ <Button
1034
+ // ghost: a filled button up here would outrank the Save that
1035
+ // finishes the task.
1036
+ variant="ghost"
1037
+ size="sm"
1038
+ xstyle={styles.resetButton}
1039
+ label={t('@astryx.dateInput.resetPicking')}
1040
+ onClick={handleResetInSheet}
1041
+ />
1042
+ </span>
986
1043
  </div>
987
1044
 
988
1045
  {/* Decorative: each day carries its weekday in its accessible name, so
@@ -1077,13 +1134,6 @@ export function TouchDateField({
1077
1134
  styles.panelBeneath,
1078
1135
  isWheelOpen && styles.panelBeneathHidden,
1079
1136
  )}>
1080
- <Button
1081
- variant="secondary"
1082
- size="md"
1083
- width="100%"
1084
- label={t('@astryx.dateInput.resetPicking')}
1085
- onClick={handleResetInSheet}
1086
- />
1087
1137
  <Button
1088
1138
  variant="primary"
1089
1139
  // md, not sm: it is the action a thumb reaches for, so it gets
@@ -28,6 +28,7 @@
28
28
  *
29
29
  * SYNC: When modified, update:
30
30
  * - /packages/core/src/DateInput/TouchDateField.tsx
31
+ * - /packages/core/src/DateTimeInput/TouchDateTimeField.tsx
31
32
  * - /packages/core/src/DateInput/DateInput.doc.mjs
32
33
  * - /packages/core/src/DateInput/DateInputTouch.test.tsx
33
34
  */
@@ -14,6 +14,7 @@ export type {
14
14
  DateInputProps,
15
15
  DateInputSize,
16
16
  DateInputFormat,
17
+ DateInputNativePicker,
17
18
  DateInputStatus,
18
19
  DateInputStatusType,
19
20
  } from './DateInput';
@@ -0,0 +1,127 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file nativeDateSegments.ts
7
+ * @input Uses the DOM only
8
+ * @output Exports hasEditableDateSegments, resetDateSegmentProbe
9
+ * @position Internal helper for NativeDateField; answers "can the user type
10
+ * into this engine's `<input type="date">`?"
11
+ *
12
+ * `<input type="date">` is two different controls wearing one tag name: a
13
+ * single untypable run the OS picker drives (iOS, Android), or a row of
14
+ * editable `mm`/`dd`/`yyyy` fields (desktop engines). Hiding the first costs
15
+ * nothing; hiding the second hides what the user is editing.
16
+ *
17
+ * Neither obvious test tells them apart. The pointer is wrong on Chrome's
18
+ * touch simulator, a Windows tablet and a ChromeOS convertible, which report
19
+ * a coarse pointer while Blink still renders segments. And measured, iOS and
20
+ * Chromium BOTH accept every `-webkit-datetime-*` selector, so
21
+ * `CSS.supports('selector(...)')` only proves the parser knows the name. What
22
+ * separates them is which pseudo is a real box, so this measures that.
23
+ *
24
+ * SYNC: When modified, update these files to stay in sync:
25
+ * - /packages/core/src/DateInput/NativeDateField.tsx (the caller)
26
+ * - /packages/core/src/DateInput/NativeDateField.test.tsx (tests)
27
+ */
28
+
29
+ /** Marks the throwaway probe element for the probe stylesheet. */
30
+ const PROBE_ATTR = 'data-astryx-date-probe';
31
+
32
+ /** How much padding the probe adds, in px. Large enough to beat rounding. */
33
+ const PROBE_PADDING = 100;
34
+
35
+ type EngineKind = 'segmented' | 'picker-only' | 'unknown';
36
+
37
+ let cachedEngine: EngineKind | null = null;
38
+
39
+ /** Whether padding this pseudo-element moves the control's box. */
40
+ function pseudoIsRealBox(
41
+ input: HTMLInputElement,
42
+ style: HTMLStyleElement,
43
+ pseudo: string,
44
+ baseWidth: number,
45
+ ): boolean {
46
+ style.textContent = `[${PROBE_ATTR}]${pseudo}{padding-inline-start:${PROBE_PADDING}px !important}`;
47
+ // Reading geometry flushes style and layout, so this already reflects it.
48
+ return input.getBoundingClientRect().width > baseWidth + PROBE_PADDING / 2;
49
+ }
50
+
51
+ /**
52
+ * Classifies the engine's date control. Cached: the answer is a build-time
53
+ * property of the browser, not of the field or the pointer in use.
54
+ */
55
+ function probeEngine(): EngineKind {
56
+ if (cachedEngine !== null) {
57
+ return cachedEngine;
58
+ }
59
+ if (typeof document === 'undefined' || !document.body) {
60
+ return 'unknown';
61
+ }
62
+
63
+ const input = document.createElement('input');
64
+ input.setAttribute('type', 'date');
65
+ input.setAttribute(PROBE_ATTR, '');
66
+ // Off-screen, and immune to the page's own `input` rules: the probe reads a
67
+ // width DELTA, so anything pinning the width would swallow the signal.
68
+ input.style.cssText =
69
+ 'position:fixed;top:-9999px;left:0;width:auto;min-width:0;max-width:none;' +
70
+ 'padding:0;border:0;font-size:16px;box-sizing:content-box;';
71
+
72
+ const style = document.createElement('style');
73
+
74
+ let kind: EngineKind = 'unknown';
75
+ try {
76
+ document.body.appendChild(input);
77
+ document.head.appendChild(style);
78
+ const base = input.getBoundingClientRect().width;
79
+ if (pseudoIsRealBox(input, style, '::-webkit-datetime-edit', base)) {
80
+ // Chromium's editable field row, and WebKit's on macOS/GTK. Probe the
81
+ // container: the individual field pseudos overflow it rather than
82
+ // expand it, so they do not move the box even in Chromium.
83
+ kind = 'segmented';
84
+ } else if (
85
+ pseudoIsRealBox(input, style, '::-webkit-date-and-time-value', base)
86
+ ) {
87
+ // The single, untypable run iOS Safari and Chrome on Android paint.
88
+ kind = 'picker-only';
89
+ }
90
+ } catch {
91
+ // A hostile CSSOM leaves the answer unknown, resolved by the pointer.
92
+ } finally {
93
+ input.remove();
94
+ style.remove();
95
+ }
96
+
97
+ cachedEngine = kind;
98
+ return kind;
99
+ }
100
+
101
+ /**
102
+ * Whether the user can type into this engine's `<input type="date">`.
103
+ *
104
+ * Firefox exposes neither pseudo-element, so it — and any future engine —
105
+ * comes back `'unknown'` and the pointer breaks the tie. That is the right
106
+ * fallback precisely where the probe is blind: the pointer is wrong for
107
+ * Chromium because Blink's answer is fixed at build time and contradicts it,
108
+ * and an engine we cannot see is not in that position. It lands Firefox on
109
+ * the desktop (segmented) and on Android (picker-only) correctly.
110
+ *
111
+ * @param isTouchPointer Whether `(pointer: coarse)` matches.
112
+ * @internal Exported for tests.
113
+ */
114
+ export function hasEditableDateSegments(isTouchPointer: boolean): boolean {
115
+ const engine = probeEngine();
116
+ return engine === 'unknown' ? !isTouchPointer : engine === 'segmented';
117
+ }
118
+
119
+ /**
120
+ * Drops the cached classification.
121
+ *
122
+ * @internal Exists for tests, which render against several engines in one
123
+ * document.
124
+ */
125
+ export function resetDateSegmentProbe(): void {
126
+ cachedEngine = null;
127
+ }
@@ -6,7 +6,7 @@ export const docs = {
6
6
  name: 'DateRangeInput',
7
7
  displayName: 'Date Range Input',
8
8
  group: 'DateInput',
9
- category: 'Data Input',
9
+ category: 'Form Controls',
10
10
  keywords: [
11
11
  'daterangepicker',
12
12
  'daterange',
@@ -108,7 +108,7 @@ export const docs = {
108
108
  name: 'minRangeSpan',
109
109
  type: 'number',
110
110
  description:
111
- 'Minimum days a selected range must span, counting both endpoints (`2` forbids a single-day range). Once a start is picked, days closer than this are disabled. Defaults to 1 (same-day start and end allowed).',
111
+ 'Minimum days a selected range must span, counting both endpoints (`2` forbids a single-day range). Once a start is picked, days closer than this are disabled. Clicking the start again commits a one-day range when allowed, or cancels the in-progress selection when the minimum is longer. Defaults to 1 (same-day start and end allowed).',
112
112
  },
113
113
  {
114
114
  name: 'presets',
@@ -328,7 +328,7 @@ export const docsDense = {
328
328
  maxRangeSpan:
329
329
  'max days a range may span, both endpoints counted (7 = a 7-day window); caps the window from the picked start. Selection-only; does not rewrite an over-wide value',
330
330
  minRangeSpan:
331
- 'min days a range must span, both endpoints counted (2 forbids a single-day range); default 1',
331
+ 'min days a range must span, both endpoints counted (2 forbids a single-day range); repeated start click commits one day when allowed, otherwise cancels; default 1',
332
332
  presets: 'preset ranges as quick-select options',
333
333
  hasClear: 'clear button when range is set (default true)',
334
334
  placeholder: 'placeholder when empty',
@@ -27,6 +27,7 @@ import type {DateRange} from './DateRangeInput';
27
27
  import {Icon} from '../Icon';
28
28
  import {defineTheme} from '../theme/defineTheme';
29
29
  import {generateThemeCSS} from '../theme/generateThemeRules';
30
+ import {InternationalizationProvider} from '../i18n';
30
31
 
31
32
  describe('DateRangeInput', () => {
32
33
  it('renders with label', () => {
@@ -72,6 +73,29 @@ describe('DateRangeInput', () => {
72
73
  expect(trigger.textContent).toMatch(/22/);
73
74
  });
74
75
 
76
+ it('updates the committed range display when provider locale changes', () => {
77
+ const range: DateRange = {
78
+ start: '2025-01-02',
79
+ end: '2025-01-05',
80
+ };
81
+ const renderDateRangeInput = (locale: 'en-US' | 'es-ES') => (
82
+ <InternationalizationProvider locale={locale}>
83
+ <DateRangeInput
84
+ label="Range"
85
+ value={range}
86
+ onChange={() => {}}
87
+ hasClear={false}
88
+ />
89
+ </InternationalizationProvider>
90
+ );
91
+ const {rerender} = render(renderDateRangeInput('en-US'));
92
+
93
+ expect(screen.getByText('Jan 2, 2025 – Jan 5, 2025')).toBeInTheDocument();
94
+
95
+ rerender(renderDateRangeInput('es-ES'));
96
+ expect(screen.getByText('2 ene 2025 – 5 ene 2025')).toBeInTheDocument();
97
+ });
98
+
75
99
  it('forwards ref to trigger button', () => {
76
100
  const ref = vi.fn();
77
101
  render(
@@ -730,6 +754,28 @@ describe('DateRangeInput range-span forwarding', () => {
730
754
  const dayButton = (iso: string): HTMLButtonElement | null =>
731
755
  document.querySelector<HTMLButtonElement>(`button[data-date="${iso}"]`);
732
756
 
757
+ it('allows selecting a one-day range when minRangeSpan is 1', () => {
758
+ const handleChange = vi.fn();
759
+ render(
760
+ <DateRangeInput
761
+ label="Reporting period"
762
+ value={null}
763
+ onChange={handleChange}
764
+ minRangeSpan={1}
765
+ numberOfMonths={1}
766
+ />,
767
+ );
768
+
769
+ fireEvent.click(getButton('Open calendar'));
770
+ fireEvent.click(dayButton('2026-01-10') as HTMLButtonElement);
771
+ fireEvent.click(dayButton('2026-01-10') as HTMLButtonElement);
772
+
773
+ expect(handleChange).toHaveBeenCalledWith({
774
+ start: '2026-01-10',
775
+ end: '2026-01-10',
776
+ });
777
+ });
778
+
733
779
  it('forwards maxRangeSpan so the window caps after a start is picked', () => {
734
780
  render(
735
781
  <DateRangeInput
@@ -16,14 +16,7 @@
16
16
  * - /packages/cli/assets/templates/blocks/components/DateRangeInput/ (showcase blocks)
17
17
  */
18
18
 
19
- import {
20
- use,
21
- useId,
22
- useCallback,
23
- useMemo,
24
- useOptimistic,
25
- useTransition,
26
- } from 'react';
19
+ import {useId, useCallback, useMemo, useOptimistic, useTransition} from 'react';
27
20
  import * as stylex from '@stylexjs/stylex';
28
21
  import {
29
22
  plainDateFromISO,
@@ -72,7 +65,7 @@ import {useResolvedRequired} from '../hooks/useResolvedRequired';
72
65
  import {themeProps} from '../utils/themeProps';
73
66
  import {focusOutlineStyles} from '../utils/focusOutline.stylex';
74
67
  import {stableClassName} from '../naming';
75
- import {useTranslator, InternationalizationContext} from '../i18n';
68
+ import {useLocale, useTranslator} from '../i18n';
76
69
  import type {Locale} from '../i18n/types';
77
70
 
78
71
  export type {DateRange} from '../Calendar';
@@ -202,7 +195,7 @@ const sizeStyles = stylex.create({
202
195
  },
203
196
  });
204
197
 
205
- function formatRangeDisplay(range: DateRange | null, locale?: Locale): string {
198
+ function formatRangeDisplay(range: DateRange | null, locale: Locale): string {
206
199
  if (!range) {
207
200
  return '';
208
201
  }
@@ -374,8 +367,10 @@ export interface DateRangeInputProps extends Omit<
374
367
  * Minimum number of days the selected range must span, counting both
375
368
  * endpoints — `minRangeSpan={2}` forbids a single-day range. Once a start
376
369
  * date is picked, days closer than this to it are disabled — except the
377
- * start itself, which stays selectable as the active anchor. Defaults to 1
378
- * (a same-day start and end is allowed).
370
+ * start itself, which stays selectable. Clicking the start again commits a
371
+ * one-day range when the minimum allows it; otherwise it cancels the
372
+ * in-progress selection so the start can be moved. Defaults to 1 (a
373
+ * same-day start and end is allowed).
379
374
  */
380
375
  minRangeSpan?: number;
381
376
 
@@ -491,8 +486,8 @@ export function DateRangeInput({
491
486
  ...rest
492
487
  }: DateRangeInputProps) {
493
488
  const t = useTranslator();
489
+ const locale = useLocale();
494
490
  const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
495
- const {locale} = use(InternationalizationContext);
496
491
  const placeholder =
497
492
  placeholderFromProps ?? t('@astryx.dateRangeInput.placeholder');
498
493
  const size = useSize(sizeProp, 'md');