@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) hide show
  1. package/CHANGELOG.md +161 -1
  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/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -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)
@@ -213,7 +215,9 @@ import {isImeKeyEvent, mergeProps, mergeRefs} from '../utils';
213
215
  import type {BaseProps} from '../BaseProps';
214
216
  import type {SizeValue} from '../utils/types';
215
217
  import {themeProps} from '../utils/themeProps';
216
- import {useTranslator} from '../i18n';
218
+ import {useTranslator, useLocale} from '../i18n';
219
+ import {formatEditableNumber} from './numberParser';
220
+ import {parseNumberInput, resolveNumberInputCommit} from './numberInputCommit';
217
221
 
218
222
  interface NumberInputPropsBase extends Omit<
219
223
  BaseProps,
@@ -348,10 +352,12 @@ interface NumberInputPropsBase extends Omit<
348
352
  autoComplete?: string;
349
353
  /**
350
354
  * The minimum value allowed.
355
+ * A smaller entry commits at this value on blur or Enter.
351
356
  */
352
357
  min?: number | null;
353
358
  /**
354
359
  * The maximum value allowed.
360
+ * A larger entry commits at this value on blur or Enter.
355
361
  */
356
362
  max?: number | null;
357
363
  /**
@@ -425,46 +431,6 @@ type NumberInputPropsClearable = NumberInputPropsBase & {
425
431
  export type NumberInputProps =
426
432
  NumberInputPropsNonClearable | NumberInputPropsClearable;
427
433
 
428
- /**
429
- * Parse and validate a string input as a number.
430
- * Returns null if the input is not a valid number or fails validation.
431
- */
432
- function parseNumberInput(
433
- input: string,
434
- options: {
435
- min?: number | null;
436
- max?: number | null;
437
- isIntegerOnly?: boolean;
438
- },
439
- ): number | null {
440
- const trimmed = input.trim();
441
- if (trimmed === '' || trimmed === '-') {
442
- return null;
443
- }
444
-
445
- const num = Number(trimmed);
446
- if (!Number.isFinite(num)) {
447
- return null;
448
- }
449
-
450
- // Check integer constraint
451
- if (options.isIntegerOnly && !Number.isInteger(num)) {
452
- return null;
453
- }
454
-
455
- // Check min constraint
456
- if (options.min != null && num < options.min) {
457
- return null;
458
- }
459
-
460
- // Check max constraint
461
- if (options.max != null && num > options.max) {
462
- return null;
463
- }
464
-
465
- return num;
466
- }
467
-
468
434
  type StepDirection = -1 | 1;
469
435
 
470
436
  function getDecimalPlaces(value: number): number {
@@ -549,7 +515,8 @@ function getSteppedValue({
549
515
 
550
516
  /**
551
517
  * A number input component for collecting numeric user input.
552
- * Only calls onChange when the entered value passes validation.
518
+ * Commits text edits on blur or Enter and only calls onChange when the whole
519
+ * draft passes validation.
553
520
  *
554
521
  * @example
555
522
  * ```
@@ -599,6 +566,7 @@ export function NumberInput({
599
566
  ...rest
600
567
  }: NumberInputProps) {
601
568
  const t = useTranslator();
569
+ const locale = useLocale();
602
570
  const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
603
571
  const size = useSize(sizeProp, 'md');
604
572
  const id = useId();
@@ -653,6 +621,11 @@ export function NumberInput({
653
621
  inputGroup,
654
622
  );
655
623
 
624
+ const parseInput = useCallback(
625
+ (text: string) => parseNumberInput(text, {min, max, isIntegerOnly, locale}),
626
+ [isIntegerOnly, locale, max, min],
627
+ );
628
+
656
629
  const formattedValue = useMemo(() => {
657
630
  if (value == null) {
658
631
  return '';
@@ -669,36 +642,29 @@ export function NumberInput({
669
642
  if (value == null) {
670
643
  return '';
671
644
  }
672
- return isFocused ? String(value) : formattedValue;
673
- }, [formattedValue, isFocused, pendingInput, value]);
645
+ return isFocused ? formatEditableNumber(value, locale) : formattedValue;
646
+ }, [formattedValue, isFocused, locale, pendingInput, value]);
674
647
 
675
648
  // Check if current pending input is valid (for styling purposes)
676
649
  const isInputValid = useMemo(() => {
677
650
  if (pendingInput === null || !pendingInput.trim()) {
678
651
  return true;
679
652
  }
680
- return parseNumberInput(pendingInput, {min, max, isIntegerOnly}) !== null;
681
- }, [pendingInput, min, max, isIntegerOnly]);
653
+ return parseInput(pendingInput) !== null;
654
+ }, [pendingInput, parseInput]);
682
655
 
683
- // Handle input text change - update immediately if valid
656
+ // Keep the whole text edit as a draft until an explicit commit boundary.
684
657
  const handleInputChange = useCallback(
685
658
  (e: React.ChangeEvent<HTMLInputElement>) => {
686
659
  // Value can't change while showing a disabled message (the field is
687
660
  // read-only and non-native-disabled), but guard the handler too so the
688
- // pending value and onChange never fire.
661
+ // pending value never changes.
689
662
  if (isDisabled || isReadOnly) {
690
663
  return;
691
664
  }
692
- const newValue = e.target.value;
693
- setPendingInput(newValue);
694
-
695
- // If the input is valid, update immediately
696
- const parsed = parseNumberInput(newValue, {min, max, isIntegerOnly});
697
- if (parsed !== null && parsed !== value) {
698
- onChange(parsed);
699
- }
665
+ setPendingInput(e.target.value);
700
666
  },
701
- [value, onChange, min, max, isIntegerOnly, isDisabled, isReadOnly],
667
+ [isDisabled, isReadOnly],
702
668
  );
703
669
 
704
670
  // Handle focus
@@ -710,34 +676,45 @@ export function NumberInput({
710
676
  [onFocus],
711
677
  );
712
678
 
713
- // Handle blur - validate and clear pending input
714
- const handleBlur = useCallback(
715
- (e: FocusEvent<HTMLInputElement>) => {
716
- if (pendingInput !== null) {
717
- if (hasClear && pendingInput.trim() === '') {
718
- // Keyboard clearing honors the clearable contract: an emptied
719
- // input commits null instead of silently reverting on blur.
720
- if (value != null) {
721
- onChange(null);
722
- }
723
- } else {
724
- const parsed = parseNumberInput(pendingInput, {
725
- min,
726
- max,
727
- isIntegerOnly,
728
- });
729
- if (parsed !== null && parsed !== value) {
730
- onChange(parsed);
731
- }
679
+ const commitPendingInput = useCallback(
680
+ (trigger: 'blur' | 'Enter') => {
681
+ if (pendingInput === null) {
682
+ return;
683
+ }
684
+
685
+ const decision = resolveNumberInputCommit(pendingInput, {
686
+ min,
687
+ max,
688
+ isIntegerOnly,
689
+ locale,
690
+ hasClear: !!hasClear,
691
+ });
692
+ if (
693
+ trigger === 'blur' ||
694
+ (decision.type === 'commit' && decision.didClamp)
695
+ ) {
696
+ setPendingInput(null);
697
+ }
698
+
699
+ if (decision.type === 'clear') {
700
+ if (hasClear && value != null) {
701
+ onChange(null);
732
702
  }
703
+ } else if (decision.type === 'commit' && decision.value !== value) {
704
+ onChange(decision.value);
733
705
  }
706
+ },
707
+ [hasClear, isIntegerOnly, locale, max, min, onChange, pendingInput, value],
708
+ );
734
709
 
735
- // Clear pending input - display will revert to formatted value
736
- setPendingInput(null);
710
+ // Blur ends the edit and displays the resulting committed value.
711
+ const handleBlur = useCallback(
712
+ (e: FocusEvent<HTMLInputElement>) => {
713
+ commitPendingInput('blur');
737
714
  setIsFocused(false);
738
715
  onBlur?.(e);
739
716
  },
740
- [pendingInput, value, onChange, min, max, isIntegerOnly, onBlur, hasClear],
717
+ [commitPendingInput, onBlur],
741
718
  );
742
719
 
743
720
  const valueForStepping = useMemo(() => {
@@ -747,10 +724,8 @@ export function NumberInput({
747
724
  if (pendingInput.trim() === '') {
748
725
  return null;
749
726
  }
750
- return (
751
- parseNumberInput(pendingInput, {min, max, isIntegerOnly}) ?? value ?? null
752
- );
753
- }, [isIntegerOnly, max, min, pendingInput, value]);
727
+ return parseInput(pendingInput) ?? value ?? null;
728
+ }, [parseInput, pendingInput, value]);
754
729
 
755
730
  const getNextValue = useCallback(
756
731
  (direction: StepDirection) =>
@@ -806,41 +781,12 @@ export function NumberInput({
806
781
  return;
807
782
  }
808
783
  if (e.key === 'Enter') {
809
- // Validate and commit on Enter
810
- if (pendingInput !== null) {
811
- if (hasClear && pendingInput.trim() === '') {
812
- // Same clearable contract as blur: Enter on an emptied input
813
- // commits null instead of reverting.
814
- if (value != null) {
815
- onChange(null);
816
- }
817
- } else {
818
- const parsed = parseNumberInput(pendingInput, {
819
- min,
820
- max,
821
- isIntegerOnly,
822
- });
823
- if (parsed !== null && parsed !== value) {
824
- onChange(parsed);
825
- }
826
- }
827
- }
784
+ commitPendingInput('Enter');
828
785
  onEnter?.();
829
786
  }
830
787
  onKeyDown?.(e);
831
788
  },
832
- [
833
- pendingInput,
834
- value,
835
- onChange,
836
- min,
837
- max,
838
- isIntegerOnly,
839
- onEnter,
840
- onKeyDown,
841
- hasClear,
842
- stepValue,
843
- ],
789
+ [commitPendingInput, onEnter, onKeyDown, stepValue],
844
790
  );
845
791
 
846
792
  // React's delegated wheel listener can be passive, so use a native,
@@ -963,6 +909,8 @@ export function NumberInput({
963
909
  data-autofocus={hasAutoFocus || undefined}
964
910
  aria-valuemin={min ?? undefined}
965
911
  aria-valuemax={max ?? undefined}
912
+ // The ARIA value and hidden form input expose the committed value;
913
+ // pendingInput is still an uncommitted edit and may be invalid.
966
914
  aria-valuenow={value ?? undefined}
967
915
  aria-valuetext={
968
916
  value == null || !formatValue ? undefined : formattedValue
@@ -0,0 +1,72 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file numberInputCommit.test.ts
5
+ * @input Uses Vitest and the NumberInput draft commit policy
6
+ * @output Focused tests for commit, clear, clamp, and revert decisions
7
+ * @position Testing; validates numberInputCommit.ts independently of React
8
+ */
9
+
10
+ import {describe, expect, it} from 'vitest';
11
+ import {parseNumberInput, resolveNumberInputCommit} from './numberInputCommit';
12
+
13
+ describe('parseNumberInput', () => {
14
+ it('validates the complete localized draft', () => {
15
+ expect(parseNumberInput('1.234.567', {locale: 'de-DE'})).toBe(1234567);
16
+ expect(parseNumberInput('1·234·567', {locale: 'de-DE'})).toBeNull();
17
+ });
18
+ });
19
+
20
+ describe('resolveNumberInputCommit', () => {
21
+ it('commits one valid localized draft', () => {
22
+ expect(
23
+ resolveNumberInputCommit('1.234.567', {
24
+ locale: 'de-DE',
25
+ hasClear: false,
26
+ }),
27
+ ).toEqual({
28
+ type: 'commit',
29
+ value: 1234567,
30
+ didClamp: false,
31
+ });
32
+ });
33
+
34
+ it('reverts the whole draft when parsing fails', () => {
35
+ expect(
36
+ resolveNumberInputCommit('1·234·567', {
37
+ locale: 'en-US',
38
+ hasClear: false,
39
+ }),
40
+ ).toEqual({type: 'revert'});
41
+ });
42
+
43
+ it('clamps an out-of-range draft and requests normalization', () => {
44
+ expect(
45
+ resolveNumberInputCommit('100', {
46
+ min: 1,
47
+ max: 2,
48
+ isIntegerOnly: true,
49
+ hasClear: false,
50
+ }),
51
+ ).toEqual({type: 'commit', value: 2, didClamp: true});
52
+ });
53
+
54
+ it('distinguishes a clearable empty draft from a revert', () => {
55
+ expect(resolveNumberInputCommit('', {hasClear: true})).toEqual({
56
+ type: 'clear',
57
+ });
58
+ expect(resolveNumberInputCommit('', {hasClear: false})).toEqual({
59
+ type: 'revert',
60
+ });
61
+ });
62
+
63
+ it('reverts when no value can satisfy the bounds', () => {
64
+ expect(
65
+ resolveNumberInputCommit('10', {
66
+ min: 5,
67
+ max: 2,
68
+ hasClear: false,
69
+ }),
70
+ ).toEqual({type: 'revert'});
71
+ });
72
+ });
@@ -0,0 +1,103 @@
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 type {Locale} from '../i18n';
17
+ import {parseLocaleNumber} from './numberParser';
18
+
19
+ interface NumberInputValidationOptions {
20
+ min?: number | null;
21
+ max?: number | null;
22
+ isIntegerOnly?: boolean;
23
+ locale?: Locale;
24
+ }
25
+
26
+ export type NumberInputCommitDecision =
27
+ | {type: 'commit'; value: number; didClamp: boolean}
28
+ | {type: 'clear'}
29
+ | {type: 'revert'};
30
+
31
+ function parseNumericInput(
32
+ input: string,
33
+ options: Pick<NumberInputValidationOptions, 'isIntegerOnly' | 'locale'>,
34
+ ): number | null {
35
+ const trimmed = input.trim();
36
+ if (trimmed === '') {
37
+ return null;
38
+ }
39
+
40
+ const value = parseLocaleNumber(trimmed, options.locale);
41
+ if (value == null || !Number.isFinite(value)) {
42
+ return null;
43
+ }
44
+ if (options.isIntegerOnly && !Number.isInteger(value)) {
45
+ return null;
46
+ }
47
+ return value;
48
+ }
49
+
50
+ export function parseNumberInput(
51
+ input: string,
52
+ options: NumberInputValidationOptions,
53
+ ): number | null {
54
+ const value = parseNumericInput(input, options);
55
+ if (value === null) {
56
+ return null;
57
+ }
58
+ if (options.min != null && value < options.min) {
59
+ return null;
60
+ }
61
+ if (options.max != null && value > options.max) {
62
+ return null;
63
+ }
64
+ return value;
65
+ }
66
+
67
+ export function resolveNumberInputCommit(
68
+ input: string,
69
+ options: NumberInputValidationOptions & {hasClear: boolean},
70
+ ): NumberInputCommitDecision {
71
+ if (input.trim() === '') {
72
+ return options.hasClear ? {type: 'clear'} : {type: 'revert'};
73
+ }
74
+
75
+ const value = parseNumericInput(input, options);
76
+ if (value === null) {
77
+ return {type: 'revert'};
78
+ }
79
+
80
+ const min =
81
+ options.min == null
82
+ ? null
83
+ : options.isIntegerOnly
84
+ ? Math.ceil(options.min)
85
+ : options.min;
86
+ const max =
87
+ options.max == null
88
+ ? null
89
+ : options.isIntegerOnly
90
+ ? Math.floor(options.max)
91
+ : options.max;
92
+ if (min != null && max != null && min > max) {
93
+ return {type: 'revert'};
94
+ }
95
+
96
+ const committedValue =
97
+ min != null && value < min ? min : max != null && value > max ? max : value;
98
+ return {
99
+ type: 'commit',
100
+ value: committedValue,
101
+ didClamp: committedValue !== value,
102
+ };
103
+ }
@@ -0,0 +1,234 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file numberParser.docblock.test.ts
5
+ * @input The rule paragraph in numberParser.ts, and the parser itself
6
+ * @output Nothing; fails when the two disagree
7
+ * @position Test-only; grades the prose in numberParser.ts against the code
8
+ *
9
+ * The file docblock of numberParser.ts states the rule the parser follows.
10
+ * A sentence like that rots silently — the code moves and the words stay —
11
+ * and the next person to change this file reads the words. So the paragraph
12
+ * is executable here: `predict` implements it, clause by clause, and every
13
+ * input is graded prose-against-parser.
14
+ *
15
+ * The one discipline that makes the number mean anything: `predict` may use
16
+ * ONLY what the paragraph says. Every branch below quotes the clause it
17
+ * implements, and those quotes are asserted verbatim against the source, so
18
+ * a paragraph that loses a clause fails here instead of drifting. If the
19
+ * parser grows a rule the words do not mention, this test goes red — that is
20
+ * the point, not a defect.
21
+ *
22
+ * SYNC: When modified, update these files to stay in sync:
23
+ * - /packages/core/src/NumberInput/numberParser.ts
24
+ */
25
+
26
+ import {describe, it, expect} from 'vitest';
27
+ import {parseLocaleNumber} from './numberParser';
28
+ import SOURCE from './numberParser.ts?raw';
29
+
30
+ /** The docblock as running prose: comment markers and line breaks removed. */
31
+ const PROSE = SOURCE.replace(/^\s*\*\s?/gm, '').replace(/\s+/g, ' ');
32
+
33
+ /** Every clause `predict` is allowed to know, quoted from the docblock. */
34
+ const CLAUSES = {
35
+ 'defer to the alphabet': 'SEPARATOR_CHARS below is a bounded alphabet',
36
+ 'fold the space family': 'the whole space family folds to it under NFKC',
37
+ 'refuse what no reading fits': 'text that no reading fits returns null',
38
+ 'prefer the locale': 'Where both readings are well formed the locale',
39
+ 'size every group':
40
+ "Grouping is well formed only when every group fits the locale's own " +
41
+ 'sizes: the last exactly the primary size, each inner one exactly the ' +
42
+ 'secondary, the first no longer than that.',
43
+ 'fall back to the decimal point': 'keep the full stop as a decimal point',
44
+ 'read three-digit groups anywhere':
45
+ 'Groups of three fit every locale, so a separator repeated with ' +
46
+ 'three-digit groups is grouping in all of them',
47
+ 'need only one group-only occurrence':
48
+ 'for a space or apostrophe, which no locale writes as a decimal point, ' +
49
+ 'one occurrence is enough',
50
+ } as const;
51
+
52
+ /** The bounded alphabet the docblock defers to, read out of the source. */
53
+ const ALPHABET: ReadonlySet<string> = new Set(
54
+ JSON.parse(
55
+ `"${/const SEPARATOR_CHARS = "([^"]*)"/.exec(SOURCE)?.[1] ?? ''}"`,
56
+ ),
57
+ );
58
+
59
+ const symbolsCache = new Map<string, ReturnType<typeof readSymbols>>();
60
+ function readSymbols(locale: string) {
61
+ const parts = new Intl.NumberFormat(locale).formatToParts(12345.6);
62
+ const sizes = new Intl.NumberFormat(locale)
63
+ .formatToParts(11111111111)
64
+ .filter(p => p.type === 'integer')
65
+ .map(p => p.value.length);
66
+ const grouped = sizes.length > 1;
67
+ return {
68
+ group: (parts.find(p => p.type === 'group')?.value ?? ',').normalize(
69
+ 'NFKC',
70
+ ),
71
+ decimal: parts.find(p => p.type === 'decimal')?.value ?? '.',
72
+ primary: grouped ? sizes[sizes.length - 1] : 3,
73
+ secondary: grouped ? sizes[sizes.length - 2] : 3,
74
+ };
75
+ }
76
+ function symbolsOf(locale: string) {
77
+ let s = symbolsCache.get(locale);
78
+ if (s === undefined) {
79
+ s = readSymbols(locale);
80
+ symbolsCache.set(locale, s);
81
+ }
82
+ return s;
83
+ }
84
+
85
+ /** CLAUSES['size every group'], with the sizes it is handed. */
86
+ function groupsFit(chunks: string[], primary: number, secondary: number) {
87
+ return (
88
+ chunks[chunks.length - 1].length === primary &&
89
+ chunks[0].length <= secondary &&
90
+ chunks.slice(1, -1).every(chunk => chunk.length === secondary)
91
+ );
92
+ }
93
+
94
+ /** CLAUSES['need only one group-only occurrence']: "a space or apostrophe". */
95
+ const isSpaceOrApostrophe = (char: string) => /^[\s'\u2019]$/.test(char);
96
+
97
+ const SKIPPED = Symbol('outside the paragraph');
98
+
99
+ /**
100
+ * The paragraph, as code. Digits with one separator character repeated
101
+ * between them is the shape it describes; anything else is not this
102
+ * paragraph's subject and is skipped rather than guessed at.
103
+ */
104
+ function predict(input: string, locale: string): number | null | symbol {
105
+ // CLAUSES['fold the space family'].
106
+ const text = input.normalize('NFKC');
107
+ if (!/^\d/.test(text) || !/\d$/.test(text)) {
108
+ return SKIPPED;
109
+ }
110
+ const separators = [...new Set(text.replace(/\d/g, ''))];
111
+ if (separators.length !== 1) {
112
+ return SKIPPED;
113
+ }
114
+ const [separator] = separators;
115
+
116
+ // CLAUSES['defer to the alphabet'].
117
+ if (!ALPHABET.has(separator)) {
118
+ return null;
119
+ }
120
+
121
+ const chunks = text.split(separator);
122
+ const {group, decimal, primary, secondary} = symbolsOf(locale);
123
+
124
+ // CLAUSES['prefer the locale'] + CLAUSES['size every group']: of the two
125
+ // locale readings, grouping wins wherever it is well formed.
126
+ if (separator === group && groupsFit(chunks, primary, secondary)) {
127
+ return Number(chunks.join(''));
128
+ }
129
+ // The locale's other reading. A decimal point appears once.
130
+ if (separator === decimal && chunks.length === 2) {
131
+ return Number(`${chunks[0]}.${chunks[1]}`);
132
+ }
133
+ // CLAUSES['fall back to the decimal point'], for a full stop the locale
134
+ // could read neither way.
135
+ if (separator === '.' && chunks.length === 2) {
136
+ return Number(text);
137
+ }
138
+ // CLAUSES['read three-digit groups anywhere'], and CLAUSES['need only one
139
+ // group-only occurrence'] for how many occurrences it takes.
140
+ const enough = isSpaceOrApostrophe(separator) ? 1 : 2;
141
+ if (chunks.length - 1 >= enough && groupsFit(chunks, 3, 3)) {
142
+ return Number(chunks.join(''));
143
+ }
144
+ // CLAUSES['refuse what no reading fits'].
145
+ return null;
146
+ }
147
+
148
+ const LOCALES = ['en-US', 'de-DE', 'fr-FR', 'de-CH', 'en-IN', 'ar-SA'];
149
+
150
+ /** The shapes the paragraph names, plus the seams around each clause. */
151
+ const NAMED: [string, string][] = [
152
+ ['1.234', 'de-DE'],
153
+ ['1.2345', 'de-DE'],
154
+ ['1234.567', 'de-DE'],
155
+ ['12345.678', 'de-DE'],
156
+ ['12.345', 'de-DE'],
157
+ ['1.23', 'de-DE'],
158
+ ['1,234,567', 'en-US'],
159
+ ['1,234,567', 'de-DE'],
160
+ ['1.234.567', 'en-US'],
161
+ ['1234.567.890', 'de-DE'],
162
+ ['1 234', 'en-US'],
163
+ ['1\u00A0234', 'en-US'],
164
+ ['1 234 567', 'en-US'],
165
+ ['1234 567', 'fr-FR'],
166
+ ["1'234", 'de-CH'],
167
+ ["1'234", 'en-US'],
168
+ ['1\u2019234', 'de-CH'],
169
+ ['1,234', 'en-IN'],
170
+ ['12,34,567', 'en-IN'],
171
+ ['123,45,678', 'en-IN'],
172
+ ['1,2,345', 'en-IN'],
173
+ ['1\u066C234', 'ar-SA'],
174
+ ['1\u066B5', 'ar-SA'],
175
+ ['1\u00B7234\u00B7567', 'en-US'],
176
+ ['123-456-789', 'en-US'],
177
+ ];
178
+
179
+ /** Every one-, two- and three-separator shape over short digit runs. */
180
+ function* generated() {
181
+ const runs = ['1', '12', '123', '1234', '12345'];
182
+ for (const locale of LOCALES) {
183
+ for (const separator of ALPHABET) {
184
+ for (const a of runs) {
185
+ for (const b of runs) {
186
+ yield [`${a}${separator}${b}`, locale] as [string, string];
187
+ for (const c of runs) {
188
+ yield [`${a}${separator}${b}${separator}${c}`, locale] as [
189
+ string,
190
+ string,
191
+ ];
192
+ for (const d of runs) {
193
+ yield [
194
+ `${a}${separator}${b}${separator}${c}${separator}${d}`,
195
+ locale,
196
+ ] as [string, string];
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
204
+
205
+ describe('the numberParser docblock', () => {
206
+ it.each(Object.entries(CLAUSES))('still says: %s', (_name, quote) => {
207
+ expect(PROSE).toContain(quote);
208
+ });
209
+
210
+ it.each(NAMED)('reads %j in %s the way the parser does', (input, locale) => {
211
+ expect(predict(input, locale)).toBe(parseLocaleNumber(input, locale));
212
+ });
213
+
214
+ it('reads every generated shape the way the parser does', () => {
215
+ const disagreements: string[] = [];
216
+ let checked = 0;
217
+ for (const [input, locale] of generated()) {
218
+ const said = predict(input, locale);
219
+ if (said === SKIPPED) {
220
+ continue;
221
+ }
222
+ checked++;
223
+ const did = parseLocaleNumber(input, locale);
224
+ if (!Object.is(said, did)) {
225
+ disagreements.push(
226
+ `${JSON.stringify(input)} in ${locale}: docblock ${String(said)}, parser ${String(did)}`,
227
+ );
228
+ }
229
+ }
230
+ // The sweep is the evidence; a shrunken one silently proves nothing.
231
+ expect(checked).toBeGreaterThan(30000);
232
+ expect(disagreements.slice(0, 10)).toEqual([]);
233
+ });
234
+ });