@astryxdesign/core 0.5.0 → 0.5.1-canary.f64186a

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 (597) 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/index.d.ts +1 -1
  278. package/dist/index.d.ts.map +1 -1
  279. package/dist/theme/Theme.d.ts.map +1 -1
  280. package/dist/theme/Theme.js +46 -10
  281. package/dist/theme/defineTheme.d.ts +9 -3
  282. package/dist/theme/defineTheme.d.ts.map +1 -1
  283. package/dist/theme/defineTheme.js +5 -0
  284. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  285. package/dist/theme/derivedVarRegistry.js +24 -4
  286. package/dist/theme/generateThemeRules.d.ts +21 -0
  287. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  288. package/dist/theme/generateThemeRules.js +26 -0
  289. package/dist/theme/syntax/tokens.d.ts +1 -1
  290. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  291. package/dist/theme/syntax/tokens.js +5 -2
  292. package/dist/theme/useTheme.d.ts.map +1 -1
  293. package/dist/theme/useTheme.js +6 -7
  294. package/dist/utils/dateParser.d.ts +5 -8
  295. package/dist/utils/dateParser.d.ts.map +1 -1
  296. package/dist/utils/dateParser.js +10 -11
  297. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  298. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  299. package/dist/utils/focusOutline.stylex.js +15 -0
  300. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  301. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  302. package/dist/utils/interactionOverlay.stylex.js +42 -0
  303. package/dist/utils/isApplePlatform.d.ts +18 -0
  304. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  305. package/dist/utils/isApplePlatform.js +37 -0
  306. package/dist/utils/plainDate.d.ts +11 -0
  307. package/dist/utils/plainDate.d.ts.map +1 -1
  308. package/dist/utils/plainDate.js +20 -4
  309. package/locales/af-ZA.json +7 -7
  310. package/locales/ar-SA.json +7 -7
  311. package/locales/ca-ES.json +6 -6
  312. package/locales/cs-CZ.json +7 -7
  313. package/locales/da-DK.json +7 -7
  314. package/locales/de-DE.json +7 -7
  315. package/locales/el-GR.json +7 -7
  316. package/locales/en.json +178 -6
  317. package/locales/es-ES.json +6 -6
  318. package/locales/fi-FI.json +7 -7
  319. package/locales/fr-FR.json +7 -7
  320. package/locales/he-IL.json +7 -7
  321. package/locales/hu-HU.json +7 -7
  322. package/locales/it-IT.json +7 -7
  323. package/locales/ja-JP.json +7 -7
  324. package/locales/ko-KR.json +7 -7
  325. package/locales/nl-NL.json +7 -7
  326. package/locales/no-NO.json +7 -7
  327. package/locales/pl-PL.json +7 -7
  328. package/locales/pseudo.json +130 -1
  329. package/locales/pt-BR.json +7 -7
  330. package/locales/pt-PT.json +7 -7
  331. package/locales/ro-RO.json +7 -7
  332. package/locales/ru-RU.json +7 -7
  333. package/locales/sr-SP.json +7 -7
  334. package/locales/sv-SE.json +7 -7
  335. package/locales/tr-TR.json +7 -7
  336. package/locales/uk-UA.json +7 -7
  337. package/locales/vi-VN.json +7 -7
  338. package/locales/zh-CN.json +7 -7
  339. package/locales/zh-TW.json +7 -7
  340. package/package.json +4 -5
  341. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  342. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  343. package/src/AlertDialog/AlertDialog.tsx +62 -20
  344. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  345. package/src/AspectRatio/AspectRatio.tsx +6 -6
  346. package/src/Avatar/Avatar.doc.mjs +12 -2
  347. package/src/Avatar/Avatar.test.tsx +80 -0
  348. package/src/Avatar/Avatar.tsx +64 -14
  349. package/src/Avatar/index.ts +2 -2
  350. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  351. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  352. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  353. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  354. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  355. package/src/Badge/Badge.doc.mjs +3 -2
  356. package/src/Badge/Badge.test.tsx +32 -3
  357. package/src/Badge/Badge.tsx +42 -1
  358. package/src/Banner/Banner.doc.mjs +9 -0
  359. package/src/Banner/Banner.test.tsx +76 -11
  360. package/src/Banner/Banner.tsx +21 -2
  361. package/src/Button/Button.doc.mjs +2 -1
  362. package/src/Button/Button.test.tsx +19 -4
  363. package/src/Button/Button.tsx +9 -29
  364. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  365. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  366. package/src/Calendar/Calendar.doc.mjs +3 -3
  367. package/src/Calendar/Calendar.test.tsx +112 -0
  368. package/src/Calendar/Calendar.tsx +18 -16
  369. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  370. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  371. package/src/Calendar/styles.ts +48 -42
  372. package/src/Card/Card.doc.mjs +10 -7
  373. package/src/Card/Card.test.tsx +113 -19
  374. package/src/Card/Card.tsx +67 -89
  375. package/src/Card/index.ts +36 -1
  376. package/src/Carousel/Carousel.doc.mjs +3 -0
  377. package/src/Carousel/Carousel.test.tsx +360 -0
  378. package/src/Carousel/Carousel.tsx +116 -15
  379. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  380. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  381. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  382. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  383. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  384. package/src/CodeBlock/CodeBlock.tsx +20 -4
  385. package/src/CodeBlock/highlightRanges.ts +1 -1
  386. package/src/CodeBlock/highlightStyles.ts +13 -13
  387. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  388. package/src/ComplexSelector/ComplexSelector.doc.mjs +7 -0
  389. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  390. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  391. package/src/DateInput/DateInput.doc.mjs +16 -0
  392. package/src/DateInput/DateInput.test.tsx +9 -4
  393. package/src/DateInput/DateInput.tsx +54 -3
  394. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  395. package/src/DateInput/MonthScroller.tsx +5 -1
  396. package/src/DateInput/MonthYearWheels.tsx +7 -4
  397. package/src/DateInput/NativeDateField.test.tsx +635 -0
  398. package/src/DateInput/NativeDateField.tsx +641 -0
  399. package/src/DateInput/TouchDateField.tsx +83 -33
  400. package/src/DateInput/Wheel.tsx +1 -0
  401. package/src/DateInput/index.ts +1 -0
  402. package/src/DateInput/nativeDateSegments.ts +127 -0
  403. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  404. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  405. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  406. package/src/DateTimeInput/DateTimeInput.doc.mjs +38 -21
  407. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  408. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  409. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  410. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  411. package/src/Dialog/Dialog.test.tsx +185 -18
  412. package/src/Dialog/Dialog.tsx +35 -11
  413. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  414. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  415. package/src/Field/FieldLabel.test.tsx +29 -0
  416. package/src/Field/FieldLabel.tsx +7 -0
  417. package/src/Field/InputClearButton.test.tsx +15 -1
  418. package/src/Field/InputClearButton.tsx +28 -4
  419. package/src/Heading/Heading.tsx +0 -1
  420. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  421. package/src/HoverCard/HoverCard.test.tsx +154 -4
  422. package/src/HoverCard/HoverCard.tsx +137 -3
  423. package/src/HoverCard/useHoverCard.tsx +23 -3
  424. package/src/Icon/Icon.test.tsx +55 -1
  425. package/src/Icon/Icon.tsx +5 -3
  426. package/src/Icon/defaultIcons.tsx +11 -2
  427. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  428. package/src/Icon/globalIconRegistry.tsx +37 -6
  429. package/src/Icon/index.ts +1 -0
  430. package/src/Icon/useIcon.ts +9 -2
  431. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  432. package/src/Indicator/Indicator.doc.mjs +2 -0
  433. package/src/Item/Item.tsx +2 -7
  434. package/src/Kbd/Kbd.test.tsx +0 -17
  435. package/src/Kbd/Kbd.tsx +2 -26
  436. package/src/Layer/gestureCounter.ts +57 -0
  437. package/src/Layer/useLayer.test.tsx +368 -16
  438. package/src/Layer/useLayer.tsx +208 -35
  439. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  440. package/src/List/List.test.tsx +38 -0
  441. package/src/List/List.tsx +8 -1
  442. package/src/Markdown/Markdown.test.tsx +37 -0
  443. package/src/Markdown/Markdown.tsx +16 -5
  444. package/src/Markdown/parser.test.ts +33 -0
  445. package/src/Markdown/parser.ts +9 -3
  446. package/src/MetadataList/MetadataList.test.tsx +75 -2
  447. package/src/MetadataList/MetadataListItem.tsx +5 -2
  448. package/src/MultiSelector/MultiSelector.doc.mjs +22 -1
  449. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  450. package/src/MultiSelector/MultiSelector.tsx +103 -16
  451. package/src/MultiSelector/hooks.ts +9 -2
  452. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  453. package/src/NavIcon/NavIcon.test.tsx +9 -0
  454. package/src/NavIcon/NavIcon.tsx +5 -1
  455. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  456. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  457. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  458. package/src/NumberInput/NumberInput.doc.mjs +26 -7
  459. package/src/NumberInput/NumberInput.test.tsx +563 -8
  460. package/src/NumberInput/NumberInput.tsx +77 -131
  461. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  462. package/src/NumberInput/numberInputCommit.ts +103 -0
  463. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  464. package/src/NumberInput/numberParser.test.ts +222 -0
  465. package/src/NumberInput/numberParser.ts +403 -0
  466. package/src/Outline/Outline.tsx +2 -4
  467. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  468. package/src/OverflowList/OverflowList.test.tsx +550 -4
  469. package/src/OverflowList/OverflowList.tsx +100 -2
  470. package/src/Pagination/Pagination.test.tsx +3 -2
  471. package/src/Popover/Popover.doc.mjs +2 -2
  472. package/src/Popover/Popover.test.tsx +38 -0
  473. package/src/Popover/Popover.tsx +28 -66
  474. package/src/Popover/usePopover.tsx +44 -5
  475. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  476. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  477. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  478. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  479. package/src/PowerSearch/formatFilterValue.ts +2 -0
  480. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  481. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  482. package/src/ProgressBar/ProgressBar.tsx +28 -8
  483. package/src/Resizable/Resizable.doc.mjs +2 -2
  484. package/src/Resizable/useResizable.doc.mjs +21 -2
  485. package/src/Resizable/useResizable.test.ts +421 -0
  486. package/src/Resizable/useResizable.ts +133 -48
  487. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  488. package/src/SelectableCard/SelectableCard.tsx +16 -0
  489. package/src/Selector/Selector.doc.mjs +14 -0
  490. package/src/Selector/Selector.source-build.test.mjs +65 -0
  491. package/src/Selector/Selector.test.tsx +301 -0
  492. package/src/Selector/Selector.tsx +145 -32
  493. package/src/Selector/hooks.ts +17 -2
  494. package/src/SideNav/SideNav.doc.mjs +2 -2
  495. package/src/SideNav/SideNav.test.tsx +1069 -6
  496. package/src/SideNav/SideNav.tsx +109 -38
  497. package/src/SideNav/SideNavHeading.tsx +5 -2
  498. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  499. package/src/SideNav/SideNavItem.tsx +134 -44
  500. package/src/Slider/Slider.test.tsx +106 -1
  501. package/src/Slider/Slider.tsx +52 -1
  502. package/src/Spinner/Spinner.doc.mjs +17 -5
  503. package/src/Spinner/Spinner.test.tsx +164 -0
  504. package/src/Spinner/Spinner.tsx +252 -22
  505. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  506. package/src/StatusDot/StatusDot.test.tsx +9 -0
  507. package/src/StatusDot/StatusDot.tsx +7 -1
  508. package/src/Stepper/Step.doc.mjs +1 -1
  509. package/src/Stepper/Step.tsx +7 -14
  510. package/src/Switch/Switch.doc.mjs +2 -0
  511. package/src/Switch/Switch.test.tsx +10 -0
  512. package/src/Switch/Switch.tsx +3 -0
  513. package/src/Table/BaseTable.tsx +6 -1
  514. package/src/Table/Table.doc.mjs +5 -3
  515. package/src/Table/Table.tsx +3 -8
  516. package/src/Table/TableBody.doc.mjs +2 -2
  517. package/src/Table/TableFooter.doc.mjs +1 -1
  518. package/src/Table/TableHeader.doc.mjs +1 -1
  519. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  520. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  521. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  522. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  523. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  524. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  525. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  526. package/src/Table/useTablePagination.doc.mjs +1 -1
  527. package/src/Table/useTableSelection.doc.mjs +1 -1
  528. package/src/Text/Text.test.tsx +44 -0
  529. package/src/Text/Text.tsx +0 -1
  530. package/src/TextArea/TextArea.doc.mjs +12 -2
  531. package/src/TextArea/TextArea.test.tsx +11 -0
  532. package/src/TextArea/TextArea.tsx +34 -22
  533. package/src/Timestamp/Timestamp.test.tsx +89 -0
  534. package/src/Timestamp/Timestamp.tsx +8 -8
  535. package/src/Timestamp/formatInstant.ts +5 -0
  536. package/src/Toast/Toast.doc.mjs +213 -44
  537. package/src/Toast/Toast.tsx +118 -23
  538. package/src/Toast/ToastViewport.test.tsx +1434 -8
  539. package/src/Toast/ToastViewport.tsx +85 -14
  540. package/src/Toast/index.ts +2 -0
  541. package/src/Toast/types.ts +43 -5
  542. package/src/Toast/useToastGesture.ts +361 -0
  543. package/src/Token/Token.test.tsx +95 -0
  544. package/src/Token/Token.tsx +19 -17
  545. package/src/Token/TokenLink.tsx +12 -3
  546. package/src/Tokenizer/Tokenizer.doc.mjs +16 -3
  547. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  548. package/src/Tokenizer/Tokenizer.tsx +49 -24
  549. package/src/TopNav/TopNavHeading.tsx +2 -2
  550. package/src/TopNav/TopNavItem.tsx +3 -7
  551. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  552. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  553. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  554. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  555. package/src/TopNav/TopNavMenu.tsx +38 -5
  556. package/src/TreeList/TreeList.test.tsx +49 -0
  557. package/src/TreeList/TreeList.tsx +7 -2
  558. package/src/TreeList/TreeListItem.tsx +2 -7
  559. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  560. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  561. package/src/Typeahead/Typeahead.doc.mjs +6 -0
  562. package/src/Typeahead/Typeahead.test.tsx +154 -0
  563. package/src/Typeahead/Typeahead.tsx +9 -0
  564. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  565. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  566. package/src/hooks/useAnnounce.doc.mjs +96 -0
  567. package/src/hooks/useDevWarning.doc.mjs +96 -0
  568. package/src/hooks/useHotkeys.test.ts +0 -18
  569. package/src/hooks/useHotkeys.ts +3 -25
  570. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  571. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  572. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  573. package/src/hooks/useLongPress.doc.mjs +123 -0
  574. package/src/hooks/useOverflow.doc.mjs +58 -17
  575. package/src/hooks/useOverflow.ts +16 -4
  576. package/src/hooks/useTypeahead.doc.mjs +153 -0
  577. package/src/index.ts +2 -0
  578. package/src/raw-import.d.ts +14 -0
  579. package/src/theme/Theme.test.tsx +104 -2
  580. package/src/theme/Theme.tsx +49 -14
  581. package/src/theme/defineTheme.test.ts +23 -0
  582. package/src/theme/defineTheme.ts +12 -3
  583. package/src/theme/derivedVarRegistry.test.ts +87 -3
  584. package/src/theme/derivedVarRegistry.ts +23 -4
  585. package/src/theme/generateThemeRules.test.ts +99 -1
  586. package/src/theme/generateThemeRules.ts +28 -0
  587. package/src/theme/syntax/tokens.ts +5 -2
  588. package/src/theme/useTheme.test.tsx +10 -0
  589. package/src/theme/useTheme.ts +16 -10
  590. package/src/utils/dateParser.test.ts +34 -2
  591. package/src/utils/dateParser.ts +11 -14
  592. package/src/utils/focusOutline.stylex.ts +50 -0
  593. package/src/utils/interactionOverlay.stylex.ts +74 -0
  594. package/src/utils/isApplePlatform.test.ts +61 -0
  595. package/src/utils/isApplePlatform.ts +37 -0
  596. package/src/utils/plainDate.test.ts +46 -0
  597. package/src/utils/plainDate.ts +18 -3
@@ -5,6 +5,8 @@
5
5
  * @position Core implementation; consumed by index.ts, tested by NumberInput.test.tsx
6
6
  *
7
7
  * SYNC: When modified, update these files to stay in sync:
8
+ * - /packages/core/src/NumberInput/numberParser.ts (locale-aware parsing)
9
+ * - /packages/core/src/NumberInput/numberInputCommit.ts (draft commit policy)
8
10
  * - /packages/core/src/NumberInput/NumberInput.doc.mjs (props table, features, implementation notes)
9
11
  * - /packages/core/src/NumberInput/NumberInput.test.tsx (tests for new/changed behavior)
10
12
  * - /packages/core/src/NumberInput/index.ts (exports if types change)
@@ -159,10 +161,12 @@ interface NumberInputPropsBase extends Omit<BaseProps, 'onChange' | 'defaultValu
159
161
  autoComplete?: string;
160
162
  /**
161
163
  * The minimum value allowed.
164
+ * A smaller entry commits at this value on blur or Enter.
162
165
  */
163
166
  min?: number | null;
164
167
  /**
165
168
  * The maximum value allowed.
169
+ * A larger entry commits at this value on blur or Enter.
166
170
  */
167
171
  max?: number | null;
168
172
  /**
@@ -233,7 +237,8 @@ type NumberInputPropsClearable = NumberInputPropsBase & {
233
237
  export type NumberInputProps = NumberInputPropsNonClearable | NumberInputPropsClearable;
234
238
  /**
235
239
  * A number input component for collecting numeric user input.
236
- * Only calls onChange when the entered value passes validation.
240
+ * Commits text edits on blur or Enter and only calls onChange when the whole
241
+ * draft passes validation.
237
242
  *
238
243
  * @example
239
244
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/NumberInput/NumberInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/NumberInput/NumberInput.tsx"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@
9
9
  * @position Core implementation; consumed by index.ts, tested by NumberInput.test.tsx
10
10
  *
11
11
  * SYNC: When modified, update these files to stay in sync:
12
+ * - /packages/core/src/NumberInput/numberParser.ts (locale-aware parsing)
13
+ * - /packages/core/src/NumberInput/numberInputCommit.ts (draft commit policy)
12
14
  * - /packages/core/src/NumberInput/NumberInput.doc.mjs (props table, features, implementation notes)
13
15
  * - /packages/core/src/NumberInput/NumberInput.test.tsx (tests for new/changed behavior)
14
16
  * - /packages/core/src/NumberInput/index.ts (exports if types change)
@@ -24,6 +26,7 @@ import { Icon, renderIconSlot } from "../Icon/index.js";
24
26
  import { VisuallyHidden } from "../VisuallyHidden/index.js";
25
27
  import { useTooltip } from "../Tooltip/index.js";
26
28
  import { getInputARIA } from "../utils/index.js";
29
+ import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
27
30
  import { useSize } from "../SizeContext/SizeContext.js";
28
31
  import { useInputContainer } from "../hooks/useInputContainer.js";
29
32
  import { useInputStatusIcon } from "../hooks/useInputStatusIcon.js";
@@ -66,6 +69,35 @@ const styles = {
66
69
  kwRFfy: "xyri2b",
67
70
  $$css: true
68
71
  },
72
+ numberStepperButton: {
73
+ kB7OPa: "x9f619",
74
+ k1xSpc: "x78zum5",
75
+ kGNEyG: "x6s0dn4",
76
+ kjj79g: "xl56j7k",
77
+ kUk6DE: "x98rzlu",
78
+ kAzted: "x2lwn1j",
79
+ kmVPX3: "x1717udv",
80
+ kogj98: "x1ghz6dp",
81
+ kMzoRj: "xc342km",
82
+ ksu8eU: "xng3xce",
83
+ kMwMTN: "xv9yike",
84
+ kWkggS: "x10xzikg",
85
+ kkrTdU: "x1ypdohk x16khyan",
86
+ kI3sdo: "x1a2a7pz",
87
+ $$css: true
88
+ },
89
+ numberStepperButtonDisabled: {
90
+ kMwMTN: "xqa6c3m",
91
+ kkrTdU: "xt0e3qv",
92
+ kKwaWg: "x18o3ruo",
93
+ $$css: true
94
+ },
95
+ decrementButton: {
96
+ kEafiO: "x11xkdxz",
97
+ kPef9Z: "x13fuv20",
98
+ kLZC3w: "x1mly77v",
99
+ $$css: true
100
+ },
69
101
  incrementIcon: {
70
102
  k3aq6I: "x19jd1h0",
71
103
  $$css: true
@@ -91,43 +123,15 @@ import { groupStyles } from "../InputGroup/groupStyles.js";
91
123
 
92
124
  import { isImeKeyEvent, mergeProps, mergeRefs } from "../utils/index.js";
93
125
  import { themeProps } from "../utils/themeProps.js";
94
- import { useTranslator } from "../i18n/index.js";
126
+ import { useTranslator, useLocale } from "../i18n/index.js";
127
+ import { formatEditableNumber } from "./numberParser.js";
128
+ import { parseNumberInput, resolveNumberInputCommit } from "./numberInputCommit.js";
95
129
 
96
130
  /**
97
131
  * Without `hasClear`, onChange only receives valid numbers.
98
132
  * With `hasClear`, onChange also receives `null` when the user clears the input.
99
133
  */
100
134
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
101
- /**
102
- * Parse and validate a string input as a number.
103
- * Returns null if the input is not a valid number or fails validation.
104
- */
105
- function parseNumberInput(input, options) {
106
- const trimmed = input.trim();
107
- if (trimmed === '' || trimmed === '-') {
108
- return null;
109
- }
110
- const num = Number(trimmed);
111
- if (!Number.isFinite(num)) {
112
- return null;
113
- }
114
-
115
- // Check integer constraint
116
- if (options.isIntegerOnly && !Number.isInteger(num)) {
117
- return null;
118
- }
119
-
120
- // Check min constraint
121
- if (options.min != null && num < options.min) {
122
- return null;
123
- }
124
-
125
- // Check max constraint
126
- if (options.max != null && num > options.max) {
127
- return null;
128
- }
129
- return num;
130
- }
131
135
  function getDecimalPlaces(value) {
132
136
  const [coefficient, exponentText] = String(value).toLowerCase().split('e');
133
137
  const fractionLength = coefficient.split('.')[1]?.length ?? 0;
@@ -162,6 +166,11 @@ function getSteppedValue({
162
166
  const nextStepPosition = direction === 1 ? Math.floor(stepPosition + tolerance) + 1 : Math.ceil(stepPosition - tolerance) - 1;
163
167
  nextValue = stepBase + nextStepPosition * effectiveStep;
164
168
  }
169
+ const precision = Math.min(12, Math.max(getDecimalPlaces(effectiveStep), getDecimalPlaces(stepBase)));
170
+ nextValue = Number(nextValue.toFixed(precision));
171
+
172
+ // Clamp after rounding so a bound with finer precision than the step cannot
173
+ // be rounded back out of its own range.
165
174
  if (min != null) {
166
175
  nextValue = Math.max(min, nextValue);
167
176
  }
@@ -171,17 +180,16 @@ function getSteppedValue({
171
180
  if (!Number.isFinite(nextValue)) {
172
181
  return currentValue;
173
182
  }
174
- const precision = Math.min(12, Math.max(getDecimalPlaces(effectiveStep), getDecimalPlaces(stepBase)));
175
- const roundedValue = Number(nextValue.toFixed(precision));
176
- if (isIntegerOnly && !Number.isInteger(roundedValue)) {
183
+ if (isIntegerOnly && !Number.isInteger(nextValue)) {
177
184
  return currentValue;
178
185
  }
179
- return Object.is(roundedValue, -0) ? 0 : roundedValue;
186
+ return Object.is(nextValue, -0) ? 0 : nextValue;
180
187
  }
181
188
 
182
189
  /**
183
190
  * A number input component for collecting numeric user input.
184
- * Only calls onChange when the entered value passes validation.
191
+ * Commits text edits on blur or Enter and only calls onChange when the whole
192
+ * draft passes validation.
185
193
  *
186
194
  * @example
187
195
  * ```
@@ -231,6 +239,7 @@ export function NumberInput({
231
239
  ...rest
232
240
  }) {
233
241
  const t = useTranslator();
242
+ const locale = useLocale();
234
243
  const isEffectivelyRequired = useResolvedRequired({
235
244
  isRequired,
236
245
  isOptional
@@ -280,6 +289,12 @@ export function NumberInput({
280
289
  // The tooltip variant renders no message box; describe the input by the
281
290
  // tooltip's content instead so the status is still announced.
282
291
  statusTooltipDescribedBy, units ? unitsID : null, showsDisabledMessage ? disabledMessageTooltip.describedBy : null], inputGroup);
292
+ const parseInput = useCallback(text => parseNumberInput(text, {
293
+ min,
294
+ max,
295
+ isIntegerOnly,
296
+ locale
297
+ }), [isIntegerOnly, locale, max, min]);
283
298
  const formattedValue = useMemo(() => {
284
299
  if (value == null) {
285
300
  return '';
@@ -296,75 +311,62 @@ export function NumberInput({
296
311
  if (value == null) {
297
312
  return '';
298
313
  }
299
- return isFocused ? String(value) : formattedValue;
300
- }, [formattedValue, isFocused, pendingInput, value]);
314
+ return isFocused ? formatEditableNumber(value, locale) : formattedValue;
315
+ }, [formattedValue, isFocused, locale, pendingInput, value]);
301
316
 
302
317
  // Check if current pending input is valid (for styling purposes)
303
318
  const isInputValid = useMemo(() => {
304
319
  if (pendingInput === null || !pendingInput.trim()) {
305
320
  return true;
306
321
  }
307
- return parseNumberInput(pendingInput, {
308
- min,
309
- max,
310
- isIntegerOnly
311
- }) !== null;
312
- }, [pendingInput, min, max, isIntegerOnly]);
322
+ return parseInput(pendingInput) !== null;
323
+ }, [pendingInput, parseInput]);
313
324
 
314
- // Handle input text change - update immediately if valid
325
+ // Keep the whole text edit as a draft until an explicit commit boundary.
315
326
  const handleInputChange = useCallback(e => {
316
327
  // Value can't change while showing a disabled message (the field is
317
328
  // read-only and non-native-disabled), but guard the handler too so the
318
- // pending value and onChange never fire.
329
+ // pending value never changes.
319
330
  if (isDisabled || isReadOnly) {
320
331
  return;
321
332
  }
322
- const newValue = e.target.value;
323
- setPendingInput(newValue);
324
-
325
- // If the input is valid, update immediately
326
- const parsed = parseNumberInput(newValue, {
327
- min,
328
- max,
329
- isIntegerOnly
330
- });
331
- if (parsed !== null && parsed !== value) {
332
- onChange(parsed);
333
- }
334
- }, [value, onChange, min, max, isIntegerOnly, isDisabled, isReadOnly]);
333
+ setPendingInput(e.target.value);
334
+ }, [isDisabled, isReadOnly]);
335
335
 
336
336
  // Handle focus
337
337
  const handleFocus = useCallback(e => {
338
338
  setIsFocused(true);
339
339
  onFocus?.(e);
340
340
  }, [onFocus]);
341
-
342
- // Handle blur - validate and clear pending input
343
- const handleBlur = useCallback(e => {
344
- if (pendingInput !== null) {
345
- if (hasClear && pendingInput.trim() === '') {
346
- // Keyboard clearing honors the clearable contract: an emptied
347
- // input commits null instead of silently reverting on blur.
348
- if (value != null) {
349
- onChange(null);
350
- }
351
- } else {
352
- const parsed = parseNumberInput(pendingInput, {
353
- min,
354
- max,
355
- isIntegerOnly
356
- });
357
- if (parsed !== null && parsed !== value) {
358
- onChange(parsed);
359
- }
341
+ const commitPendingInput = useCallback(trigger => {
342
+ if (pendingInput === null) {
343
+ return;
344
+ }
345
+ const decision = resolveNumberInputCommit(pendingInput, {
346
+ min,
347
+ max,
348
+ isIntegerOnly,
349
+ locale,
350
+ hasClear: !!hasClear
351
+ });
352
+ if (trigger === 'blur' || decision.type === 'commit' && decision.didClamp) {
353
+ setPendingInput(null);
354
+ }
355
+ if (decision.type === 'clear') {
356
+ if (hasClear && value != null) {
357
+ onChange(null);
360
358
  }
359
+ } else if (decision.type === 'commit' && decision.value !== value) {
360
+ onChange(decision.value);
361
361
  }
362
+ }, [hasClear, isIntegerOnly, locale, max, min, onChange, pendingInput, value]);
362
363
 
363
- // Clear pending input - display will revert to formatted value
364
- setPendingInput(null);
364
+ // Blur ends the edit and displays the resulting committed value.
365
+ const handleBlur = useCallback(e => {
366
+ commitPendingInput('blur');
365
367
  setIsFocused(false);
366
368
  onBlur?.(e);
367
- }, [pendingInput, value, onChange, min, max, isIntegerOnly, onBlur, hasClear]);
369
+ }, [commitPendingInput, onBlur]);
368
370
  const valueForStepping = useMemo(() => {
369
371
  if (pendingInput === null) {
370
372
  return value ?? null;
@@ -372,12 +374,8 @@ export function NumberInput({
372
374
  if (pendingInput.trim() === '') {
373
375
  return null;
374
376
  }
375
- return parseNumberInput(pendingInput, {
376
- min,
377
- max,
378
- isIntegerOnly
379
- }) ?? value ?? null;
380
- }, [isIntegerOnly, max, min, pendingInput, value]);
377
+ return parseInput(pendingInput) ?? value ?? null;
378
+ }, [parseInput, pendingInput, value]);
381
379
  const getNextValue = useCallback(direction => getSteppedValue({
382
380
  currentValue: valueForStepping,
383
381
  direction,
@@ -423,29 +421,11 @@ export function NumberInput({
423
421
  return;
424
422
  }
425
423
  if (e.key === 'Enter') {
426
- // Validate and commit on Enter
427
- if (pendingInput !== null) {
428
- if (hasClear && pendingInput.trim() === '') {
429
- // Same clearable contract as blur: Enter on an emptied input
430
- // commits null instead of reverting.
431
- if (value != null) {
432
- onChange(null);
433
- }
434
- } else {
435
- const parsed = parseNumberInput(pendingInput, {
436
- min,
437
- max,
438
- isIntegerOnly
439
- });
440
- if (parsed !== null && parsed !== value) {
441
- onChange(parsed);
442
- }
443
- }
444
- }
424
+ commitPendingInput('Enter');
445
425
  onEnter?.();
446
426
  }
447
427
  onKeyDown?.(e);
448
- }, [pendingInput, value, onChange, min, max, isIntegerOnly, onEnter, onKeyDown, hasClear, stepValue]);
428
+ }, [commitPendingInput, onEnter, onKeyDown, stepValue]);
449
429
 
450
430
  // React's delegated wheel listener can be passive, so use a native,
451
431
  // explicitly non-passive listener to prevent page scrolling only when this
@@ -538,7 +518,10 @@ export function NumberInput({
538
518
  autoFocus: hasAutoFocus,
539
519
  "data-autofocus": hasAutoFocus || undefined,
540
520
  "aria-valuemin": min ?? undefined,
541
- "aria-valuemax": max ?? undefined,
521
+ "aria-valuemax": max ?? undefined
522
+ // The ARIA value and hidden form input expose the committed value;
523
+ // pendingInput is still an uncommitted edit and may be invalid.
524
+ ,
542
525
  "aria-valuenow": value ?? undefined,
543
526
  "aria-valuetext": value == null || !formatValue ? undefined : formattedValue,
544
527
  "aria-describedby": ariaDescribedBy,
@@ -595,16 +578,9 @@ export function NumberInput({
595
578
  inputRef.current?.focus();
596
579
  stepValue(1);
597
580
  },
598
- ...{
599
- 0: {
600
- className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce xv9yike x10xzikg xmvprkv xq8i9tn x1ypdohk x16khyan x1a2a7pz"
601
- },
602
- 1: {
603
- className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce x10xzikg x1a2a7pz xqa6c3m xt0e3qv x18o3ruo"
604
- }
605
- }[!!(isDisabled || isReadOnly || !canIncrement) << 0],
581
+ ...stylex.props(styles.numberStepperButton, interactionOverlayStyles.backgroundImage, (isDisabled || isReadOnly || !canIncrement) && styles.numberStepperButtonDisabled),
606
582
  children: /*#__PURE__*/_jsx(Icon, {
607
- icon: "chevronDown",
583
+ icon: "numberInput:stepperDown",
608
584
  size: "xsm",
609
585
  color: "inherit",
610
586
  xstyle: styles.incrementIcon
@@ -621,16 +597,9 @@ export function NumberInput({
621
597
  inputRef.current?.focus();
622
598
  stepValue(-1);
623
599
  },
624
- ...{
625
- 0: {
626
- className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce xv9yike x10xzikg xmvprkv xq8i9tn x1ypdohk x16khyan x1a2a7pz x11xkdxz x13fuv20 x1mly77v"
627
- },
628
- 1: {
629
- className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce x10xzikg x1a2a7pz x11xkdxz x13fuv20 x1mly77v xqa6c3m xt0e3qv x18o3ruo"
630
- }
631
- }[!!(isDisabled || isReadOnly || !canDecrement) << 0],
600
+ ...stylex.props(styles.numberStepperButton, interactionOverlayStyles.backgroundImage, styles.decrementButton, (isDisabled || isReadOnly || !canDecrement) && styles.numberStepperButtonDisabled),
632
601
  children: /*#__PURE__*/_jsx(Icon, {
633
- icon: "chevronDown",
602
+ icon: "numberInput:stepperDown",
634
603
  size: "xsm",
635
604
  color: "inherit"
636
605
  })
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @file numberInputCommit.ts
3
+ * @input A NumberInput draft and the field's validation constraints
4
+ * @output A single commit, clear, or revert decision for the whole draft
5
+ * @position Shared internal draft validation and commit policy for NumberInput and its live consumers
6
+ *
7
+ * SYNC: When modified, update these files to stay in sync:
8
+ * - /packages/core/src/NumberInput/NumberInput.tsx
9
+ * - /packages/core/src/NumberInput/numberInputCommit.test.ts
10
+ * - /packages/core/src/Table/plugins/filtering/useTableFiltering.tsx
11
+ * - /packages/core/src/PowerSearch/PowerSearchValueEditor.tsx
12
+ */
13
+ import type { Locale } from '../i18n';
14
+ interface NumberInputValidationOptions {
15
+ min?: number | null;
16
+ max?: number | null;
17
+ isIntegerOnly?: boolean;
18
+ locale?: Locale;
19
+ }
20
+ export type NumberInputCommitDecision = {
21
+ type: 'commit';
22
+ value: number;
23
+ didClamp: boolean;
24
+ } | {
25
+ type: 'clear';
26
+ } | {
27
+ type: 'revert';
28
+ };
29
+ export declare function parseNumberInput(input: string, options: NumberInputValidationOptions): number | null;
30
+ export declare function resolveNumberInputCommit(input: string, options: NumberInputValidationOptions & {
31
+ hasClear: boolean;
32
+ }): NumberInputCommitDecision;
33
+ export {};
34
+ //# sourceMappingURL=numberInputCommit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numberInputCommit.d.ts","sourceRoot":"","sources":["../../src/NumberInput/numberInputCommit.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAGpC,UAAU,4BAA4B;IACpC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GAClD;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,CAAC;AAqBrB,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,4BAA4B,GACpC,MAAM,GAAG,IAAI,CAYf;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,4BAA4B,GAAG;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GAC1D,yBAAyB,CAiC3B"}
@@ -0,0 +1,71 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file numberInputCommit.ts
5
+ * @input A NumberInput draft and the field's validation constraints
6
+ * @output A single commit, clear, or revert decision for the whole draft
7
+ * @position Shared internal draft validation and commit policy for NumberInput and its live consumers
8
+ *
9
+ * SYNC: When modified, update these files to stay in sync:
10
+ * - /packages/core/src/NumberInput/NumberInput.tsx
11
+ * - /packages/core/src/NumberInput/numberInputCommit.test.ts
12
+ * - /packages/core/src/Table/plugins/filtering/useTableFiltering.tsx
13
+ * - /packages/core/src/PowerSearch/PowerSearchValueEditor.tsx
14
+ */
15
+
16
+ import { parseLocaleNumber } from "./numberParser.js";
17
+ function parseNumericInput(input, options) {
18
+ const trimmed = input.trim();
19
+ if (trimmed === '') {
20
+ return null;
21
+ }
22
+ const value = parseLocaleNumber(trimmed, options.locale);
23
+ if (value == null || !Number.isFinite(value)) {
24
+ return null;
25
+ }
26
+ if (options.isIntegerOnly && !Number.isInteger(value)) {
27
+ return null;
28
+ }
29
+ return value;
30
+ }
31
+ export function parseNumberInput(input, options) {
32
+ const value = parseNumericInput(input, options);
33
+ if (value === null) {
34
+ return null;
35
+ }
36
+ if (options.min != null && value < options.min) {
37
+ return null;
38
+ }
39
+ if (options.max != null && value > options.max) {
40
+ return null;
41
+ }
42
+ return value;
43
+ }
44
+ export function resolveNumberInputCommit(input, options) {
45
+ if (input.trim() === '') {
46
+ return options.hasClear ? {
47
+ type: 'clear'
48
+ } : {
49
+ type: 'revert'
50
+ };
51
+ }
52
+ const value = parseNumericInput(input, options);
53
+ if (value === null) {
54
+ return {
55
+ type: 'revert'
56
+ };
57
+ }
58
+ const min = options.min == null ? null : options.isIntegerOnly ? Math.ceil(options.min) : options.min;
59
+ const max = options.max == null ? null : options.isIntegerOnly ? Math.floor(options.max) : options.max;
60
+ if (min != null && max != null && min > max) {
61
+ return {
62
+ type: 'revert'
63
+ };
64
+ }
65
+ const committedValue = min != null && value < min ? min : max != null && value > max ? max : value;
66
+ return {
67
+ type: 'commit',
68
+ value: committedValue,
69
+ didClamp: committedValue !== value
70
+ };
71
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @file numberParser.ts
3
+ * @input Text a person typed or pasted, plus the resolved BCP 47 locale
4
+ * @output Exports parseLocaleNumber and formatEditableNumber
5
+ * @position Internal to NumberInput; not part of the public surface
6
+ *
7
+ * People paste numbers out of spreadsheets, and a spreadsheet writes them
8
+ * grouped, signed, and decorated. This reads those back. Everything locale
9
+ * specific — the grouping and decimal separators, the group sizes, the digit
10
+ * script — is derived from Intl and Unicode rather than a table, and text that
11
+ * no reading fits returns null so the field stays visibly invalid instead of
12
+ * committing a guess. Where both readings are well formed the locale's wins,
13
+ * the way utils/dateParser.ts settles an ambiguous date by locale preference.
14
+ * Grouping is well formed only when every group fits the locale's own sizes:
15
+ * the last exactly the primary size, each inner one exactly the secondary, the
16
+ * first no longer than that. So de-DE `1.234` is 1234, while `1.2345` (last
17
+ * group too long) and `1234.567` (too much ahead of it) keep the full stop as
18
+ * a decimal point. Groups of three fit every locale, so a separator repeated
19
+ * with three-digit groups is grouping in all of them and `1,234,567` reads the
20
+ * same everywhere; for a space or apostrophe, which no locale writes as a
21
+ * decimal point, one occurrence is enough, so en-US `1 234` is 1234.
22
+ *
23
+ * That paragraph is executable: numberParser.docblock.test.ts implements it as
24
+ * code, quote by quote, and fails when the parser and the words disagree.
25
+ *
26
+ * Which characters may separate digits at all is the one thing that is NOT
27
+ * read off the input: SEPARATOR_CHARS below is a bounded alphabet, the same
28
+ * shape utils/dateParser.ts uses for its `[-/.]` date separators.
29
+ *
30
+ * SYNC: When modified, update these files to stay in sync:
31
+ * - /packages/core/src/NumberInput/NumberInput.tsx
32
+ * - /packages/core/src/NumberInput/numberParser.test.ts
33
+ * - /packages/core/src/NumberInput/numberParser.docblock.test.ts
34
+ */
35
+ import type { Locale } from '../i18n';
36
+ /**
37
+ * Read a number out of text the way a person in `locale` writes one: their
38
+ * grouping and decimal separators, their group sizes, their digit script, an
39
+ * optional currency symbol, and the shapes a spreadsheet pastes.
40
+ *
41
+ * Returns null rather than a guess. Grouping is validated, so en-US `1,23` —
42
+ * a comma that is neither a decimal point nor a well-formed group — is not
43
+ * silently read as 123, and neither is a number written for another locale.
44
+ * Only the characters some locale writes between digits count as separators,
45
+ * so `123-456-789` is not a number at all.
46
+ *
47
+ * @example
48
+ * ```
49
+ * parseLocaleNumber('1,234,234,234', 'en-US') // 1234234234
50
+ * parseLocaleNumber('1,234,234,234', 'de-DE') // 1234234234
51
+ * parseLocaleNumber('1,5', 'de-DE') // 1.5
52
+ * parseLocaleNumber('1.5', 'de-DE') // 1.5
53
+ * parseLocaleNumber('1,5', 'en-US') // null
54
+ * parseLocaleNumber('123-456-789', 'en-US') // null
55
+ * ```
56
+ */
57
+ export declare function parseLocaleNumber(text: string, locale?: Locale): number | null;
58
+ /**
59
+ * The text shown while the field is focused: the plain machine number in the
60
+ * locale's decimal separator, so what a person sees mid-edit is what the
61
+ * parser reads back on blur.
62
+ */
63
+ export declare function formatEditableNumber(value: number, locale?: Locale): string;
64
+ //# sourceMappingURL=numberParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numberParser.d.ts","sourceRoot":"","sources":["../../src/NumberInput/numberParser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAiPpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CA8Ef;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3E"}