@carbon/react 1.103.0-rc.0 → 1.104.0-rc.0

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 (777) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +950 -950
  2. package/es/_virtual/_rolldown/runtime.js +25 -0
  3. package/es/components/AILabel/index.d.ts +29 -2
  4. package/es/components/AILabel/index.js +114 -169
  5. package/es/components/AISkeleton/AISkeletonIcon.js +23 -27
  6. package/es/components/AISkeleton/AISkeletonPlaceholder.js +19 -27
  7. package/es/components/AISkeleton/AISkeletonText.js +26 -39
  8. package/es/components/Accordion/Accordion.Skeleton.js +55 -79
  9. package/es/components/Accordion/Accordion.js +43 -61
  10. package/es/components/Accordion/AccordionItem.js +102 -156
  11. package/es/components/Accordion/AccordionProvider.js +18 -15
  12. package/es/components/AspectRatio/AspectRatio.js +41 -47
  13. package/es/components/BadgeIndicator/index.js +28 -33
  14. package/es/components/Breadcrumb/Breadcrumb.Skeleton.js +39 -50
  15. package/es/components/Breadcrumb/Breadcrumb.js +39 -51
  16. package/es/components/Breadcrumb/BreadcrumbItem.js +80 -83
  17. package/es/components/Button/Button.Skeleton.js +49 -58
  18. package/es/components/Button/Button.d.ts +1 -1
  19. package/es/components/Button/Button.js +146 -240
  20. package/es/components/Button/ButtonBase.js +82 -104
  21. package/es/components/Button/index.js +13 -6
  22. package/es/components/ButtonSet/ButtonSet.js +74 -98
  23. package/es/components/ButtonSet/index.js +12 -4
  24. package/es/components/ChatButton/ChatButton.Skeleton.js +27 -27
  25. package/es/components/ChatButton/ChatButton.js +64 -79
  26. package/es/components/Checkbox/Checkbox.Skeleton.js +26 -25
  27. package/es/components/Checkbox/Checkbox.js +116 -195
  28. package/es/components/Checkbox/index.js +13 -5
  29. package/es/components/CheckboxGroup/CheckboxGroup.js +100 -148
  30. package/es/components/ClassPrefix/index.js +21 -17
  31. package/es/components/CodeSnippet/CodeSnippet.Skeleton.js +45 -42
  32. package/es/components/CodeSnippet/CodeSnippet.js +210 -299
  33. package/es/components/ComboBox/ComboBox.js +621 -970
  34. package/es/components/ComboBox/index.js +12 -4
  35. package/es/components/ComboButton/index.js +172 -208
  36. package/es/components/ComposedModal/ComposedModal.js +311 -450
  37. package/es/components/ComposedModal/ComposedModalPresence.js +47 -42
  38. package/es/components/ComposedModal/ModalFooter.js +127 -207
  39. package/es/components/ComposedModal/ModalHeader.js +71 -101
  40. package/es/components/ComposedModal/useComposedModalState.js +21 -15
  41. package/es/components/ContainedList/ContainedList.js +67 -102
  42. package/es/components/ContainedList/ContainedListItem/ContainedListItem.js +49 -67
  43. package/es/components/ContainedList/ContainedListItem/index.js +12 -4
  44. package/es/components/ContainedList/index.js +15 -12
  45. package/es/components/ContentSwitcher/ContentSwitcher.js +108 -140
  46. package/es/components/ContextMenu/useContextMenu.js +41 -36
  47. package/es/components/Copy/Copy.js +97 -117
  48. package/es/components/Copy/index.js +12 -4
  49. package/es/components/CopyButton/CopyButton.js +81 -94
  50. package/es/components/CopyButton/index.js +12 -4
  51. package/es/components/DangerButton/DangerButton.js +11 -9
  52. package/es/components/DataTable/DataTable.d.ts +11 -11
  53. package/es/components/DataTable/DataTable.js +448 -630
  54. package/es/components/DataTable/Table.js +111 -156
  55. package/es/components/DataTable/TableActionList.js +14 -6
  56. package/es/components/DataTable/TableBatchAction.js +25 -34
  57. package/es/components/DataTable/TableBatchActions.js +78 -113
  58. package/es/components/DataTable/TableBody.js +26 -19
  59. package/es/components/DataTable/TableCell.js +31 -46
  60. package/es/components/DataTable/TableContainer.js +75 -82
  61. package/es/components/DataTable/TableContext.js +14 -6
  62. package/es/components/DataTable/TableDecoratorRow.js +30 -36
  63. package/es/components/DataTable/TableExpandHeader.js +53 -90
  64. package/es/components/DataTable/TableExpandRow.js +82 -119
  65. package/es/components/DataTable/TableExpandedRow.js +45 -51
  66. package/es/components/DataTable/TableHead.js +7 -5
  67. package/es/components/DataTable/TableHeader.js +138 -181
  68. package/es/components/DataTable/TableRow.d.ts +1 -1
  69. package/es/components/DataTable/TableRow.js +42 -76
  70. package/es/components/DataTable/TableSelectAll.js +42 -70
  71. package/es/components/DataTable/TableSelectRow.js +63 -98
  72. package/es/components/DataTable/TableSlugRow.js +35 -43
  73. package/es/components/DataTable/TableToolbar.js +33 -45
  74. package/es/components/DataTable/TableToolbarAction.js +25 -20
  75. package/es/components/DataTable/TableToolbarContent.js +14 -6
  76. package/es/components/DataTable/TableToolbarMenu.js +35 -46
  77. package/es/components/DataTable/TableToolbarSearch.js +97 -187
  78. package/es/components/DataTable/state/getDerivedStateFromProps.js +38 -43
  79. package/es/components/DataTable/state/sortStates.js +11 -9
  80. package/es/components/DataTable/state/sorting.js +53 -72
  81. package/es/components/DataTable/tools/cells.js +15 -7
  82. package/es/components/DataTable/tools/denormalize.js +27 -19
  83. package/es/components/DataTable/tools/filter.js +21 -22
  84. package/es/components/DataTable/tools/normalize.js +57 -72
  85. package/es/components/DataTable/tools/sorting.js +50 -71
  86. package/es/components/DataTableSkeleton/DataTableSkeleton.js +66 -94
  87. package/es/components/DatePicker/DatePicker.Skeleton.js +44 -51
  88. package/es/components/DatePicker/DatePicker.d.ts +4 -2
  89. package/es/components/DatePicker/DatePicker.js +485 -749
  90. package/es/components/DatePicker/DatePickerLocales.js +75 -126
  91. package/es/components/DatePicker/index.js +13 -5
  92. package/es/components/DatePicker/plugins/appendToPlugin.js +31 -45
  93. package/es/components/DatePicker/plugins/fixEventsPlugin.js +127 -171
  94. package/es/components/DatePicker/plugins/rangePlugin.d.ts +1 -1
  95. package/es/components/DatePicker/plugins/rangePlugin.js +40 -47
  96. package/es/components/DatePicker/utils.d.ts +7 -0
  97. package/es/components/DatePicker/utils.js +18 -0
  98. package/es/components/DatePickerInput/DatePickerInput.js +179 -289
  99. package/es/components/DatePickerInput/index.js +12 -4
  100. package/es/components/Dialog/Dialog.js +303 -574
  101. package/es/components/Dialog/index.js +18 -2
  102. package/es/components/Dropdown/Dropdown.Skeleton.js +26 -38
  103. package/es/components/Dropdown/Dropdown.js +344 -535
  104. package/es/components/Dropdown/index.js +13 -5
  105. package/es/components/ErrorBoundary/ErrorBoundary.js +36 -58
  106. package/es/components/ErrorBoundary/ErrorBoundaryContext.js +14 -9
  107. package/es/components/ExpandableSearch/ExpandableSearch.js +60 -69
  108. package/es/components/ExpandableSearch/index.js +12 -4
  109. package/es/components/FeatureFlags/index.d.ts +11 -2
  110. package/es/components/FeatureFlags/index.js +79 -77
  111. package/es/components/FileUploader/FileUploader.Skeleton.js +35 -30
  112. package/es/components/FileUploader/FileUploader.js +269 -343
  113. package/es/components/FileUploader/FileUploaderButton.js +110 -160
  114. package/es/components/FileUploader/FileUploaderDropContainer.js +144 -221
  115. package/es/components/FileUploader/FileUploaderItem.js +138 -157
  116. package/es/components/FileUploader/Filename.d.ts +1 -1
  117. package/es/components/FileUploader/Filename.js +53 -72
  118. package/es/components/FluidComboBox/FluidComboBox.Skeleton.js +26 -28
  119. package/es/components/FluidComboBox/FluidComboBox.js +54 -105
  120. package/es/components/FluidDatePicker/FluidDatePicker.Skeleton.js +56 -53
  121. package/es/components/FluidDatePicker/FluidDatePicker.js +46 -68
  122. package/es/components/FluidDatePickerInput/FluidDatePickerInput.js +23 -16
  123. package/es/components/FluidDropdown/FluidDropdown.Skeleton.js +26 -28
  124. package/es/components/FluidDropdown/FluidDropdown.js +55 -111
  125. package/es/components/FluidForm/FluidForm.js +29 -31
  126. package/es/components/FluidForm/FormContext.js +12 -6
  127. package/es/components/FluidMultiSelect/FluidMultiSelect.Skeleton.js +26 -28
  128. package/es/components/FluidMultiSelect/FluidMultiSelect.js +67 -197
  129. package/es/components/FluidNumberInput/FluidNumberInput.Skeleton.js +27 -30
  130. package/es/components/FluidNumberInput/FluidNumberInput.js +63 -147
  131. package/es/components/FluidSearch/FluidSearch.Skeleton.js +27 -30
  132. package/es/components/FluidSearch/FluidSearch.js +41 -84
  133. package/es/components/FluidSelect/FluidSelect.Skeleton.js +26 -28
  134. package/es/components/FluidSelect/FluidSelect.js +40 -76
  135. package/es/components/FluidSelect/index.js +13 -5
  136. package/es/components/FluidTextArea/FluidTextArea.Skeleton.js +27 -30
  137. package/es/components/FluidTextArea/FluidTextArea.js +48 -112
  138. package/es/components/FluidTextInput/FluidPasswordInput.js +44 -99
  139. package/es/components/FluidTextInput/FluidTextInput.Skeleton.js +27 -30
  140. package/es/components/FluidTextInput/FluidTextInput.js +49 -104
  141. package/es/components/FluidTextInput/index.js +14 -6
  142. package/es/components/FluidTimePicker/FluidTimePicker.Skeleton.js +30 -33
  143. package/es/components/FluidTimePicker/FluidTimePicker.js +68 -115
  144. package/es/components/FluidTimePickerSelect/FluidTimePickerSelect.js +28 -47
  145. package/es/components/Form/Form.js +23 -25
  146. package/es/components/FormGroup/FormGroup.js +45 -67
  147. package/es/components/FormItem/FormItem.js +23 -25
  148. package/es/components/FormLabel/FormLabel.js +28 -34
  149. package/es/components/Grid/CSSGrid.d.ts +1 -1
  150. package/es/components/Grid/CSSGrid.js +85 -127
  151. package/es/components/Grid/Column.js +192 -324
  152. package/es/components/Grid/ColumnHang.js +28 -36
  153. package/es/components/Grid/FlexGrid.js +40 -60
  154. package/es/components/Grid/Grid.js +29 -42
  155. package/es/components/Grid/GridContext.js +36 -42
  156. package/es/components/Grid/Row.js +31 -49
  157. package/es/components/Heading/index.js +36 -51
  158. package/es/components/Icon/Icon.Skeleton.js +21 -21
  159. package/es/components/IconButton/index.js +117 -178
  160. package/es/components/IconIndicator/index.d.ts +1 -1
  161. package/es/components/IconIndicator/index.js +59 -60
  162. package/es/components/IdPrefix/index.js +21 -17
  163. package/es/components/InlineCheckbox/InlineCheckbox.js +69 -113
  164. package/es/components/InlineCheckbox/index.js +12 -4
  165. package/es/components/InlineLoading/InlineLoading.js +83 -100
  166. package/es/components/InlineLoading/index.js +12 -4
  167. package/es/components/Layer/LayerContext.js +12 -4
  168. package/es/components/Layer/LayerLevel.js +20 -4
  169. package/es/components/Layer/index.js +54 -66
  170. package/es/components/Layout/index.js +77 -109
  171. package/es/components/LayoutDirection/LayoutDirection.d.ts +1 -1
  172. package/es/components/LayoutDirection/LayoutDirection.js +33 -37
  173. package/es/components/LayoutDirection/LayoutDirectionContext.js +12 -6
  174. package/es/components/LayoutDirection/useLayoutDirection.js +15 -7
  175. package/es/components/Link/Link.js +63 -108
  176. package/es/components/Link/index.js +12 -4
  177. package/es/components/ListBox/ListBox.js +78 -126
  178. package/es/components/ListBox/ListBoxField.js +24 -43
  179. package/es/components/ListBox/ListBoxMenu.js +36 -42
  180. package/es/components/ListBox/ListBoxMenuIcon.js +39 -40
  181. package/es/components/ListBox/ListBoxMenuItem.js +67 -88
  182. package/es/components/ListBox/ListBoxPropTypes.js +17 -5
  183. package/es/components/ListBox/ListBoxSelection.js +71 -96
  184. package/es/components/ListBox/index.js +16 -14
  185. package/es/components/ListBox/next/ListBoxSelection.js +79 -117
  186. package/es/components/ListBox/next/ListBoxTrigger.js +44 -48
  187. package/es/components/ListItem/ListItem.js +25 -28
  188. package/es/components/Loading/Loading.js +64 -73
  189. package/es/components/Loading/index.js +12 -4
  190. package/es/components/Menu/Menu.js +220 -363
  191. package/es/components/Menu/MenuContext.d.ts +1 -1
  192. package/es/components/Menu/MenuContext.js +41 -38
  193. package/es/components/Menu/MenuItem.js +282 -413
  194. package/es/components/MenuButton/index.js +134 -195
  195. package/es/components/Modal/Modal.js +500 -660
  196. package/es/components/Modal/ModalPresence.js +39 -37
  197. package/es/components/Modal/index.js +13 -5
  198. package/es/components/ModalWrapper/ModalWrapper.d.ts +2 -2
  199. package/es/components/ModalWrapper/ModalWrapper.js +106 -130
  200. package/es/components/MultiSelect/FilterableMultiSelect.js +605 -918
  201. package/es/components/MultiSelect/MultiSelect.js +454 -716
  202. package/es/components/MultiSelect/MultiSelectPropTypes.js +13 -30
  203. package/es/components/MultiSelect/filter.js +14 -9
  204. package/es/components/MultiSelect/tools/sorting.js +21 -34
  205. package/es/components/Notification/Notification.js +508 -785
  206. package/es/components/NumberInput/NumberFormatPropTypes.js +69 -30
  207. package/es/components/NumberInput/NumberInput.Skeleton.js +29 -33
  208. package/es/components/NumberInput/NumberInput.js +567 -947
  209. package/es/components/OrderedList/OrderedList.js +31 -44
  210. package/es/components/OverflowMenu/OverflowMenu.js +335 -450
  211. package/es/components/OverflowMenu/index.js +25 -16
  212. package/es/components/OverflowMenu/next/index.js +154 -186
  213. package/es/components/OverflowMenuItem/OverflowMenuItem.js +100 -160
  214. package/es/components/OverflowMenuItem/index.js +12 -4
  215. package/es/components/OverflowMenuV2/index.js +15 -13
  216. package/es/components/PageHeader/PageHeader.js +297 -442
  217. package/es/components/PageHeader/index.js +24 -2
  218. package/es/components/Pagination/Pagination.Skeleton.js +34 -35
  219. package/es/components/Pagination/Pagination.d.ts +1 -1
  220. package/es/components/Pagination/Pagination.js +251 -356
  221. package/es/components/Pagination/experimental/PageSelector.js +38 -54
  222. package/es/components/Pagination/experimental/Pagination-story.d.ts +114 -0
  223. package/es/components/Pagination/experimental/Pagination.js +144 -196
  224. package/es/components/PaginationNav/PaginationNav.js +320 -426
  225. package/es/components/Popover/index.js +318 -437
  226. package/es/components/PrimaryButton/PrimaryButton.js +11 -9
  227. package/es/components/ProgressBar/ProgressBar.js +117 -143
  228. package/es/components/ProgressIndicator/ProgressIndicator.Skeleton.js +42 -38
  229. package/es/components/ProgressIndicator/ProgressIndicator.js +146 -243
  230. package/es/components/RadioButton/RadioButton.Skeleton.js +23 -25
  231. package/es/components/RadioButton/RadioButton.js +101 -174
  232. package/es/components/RadioButton/index.js +12 -4
  233. package/es/components/RadioButtonGroup/RadioButtonGroup.js +135 -207
  234. package/es/components/RadioTile/RadioTile.js +104 -168
  235. package/es/components/RadioTile/index.js +12 -4
  236. package/es/components/Search/Search.Skeleton.js +28 -33
  237. package/es/components/Search/Search.js +182 -278
  238. package/es/components/Search/index.js +13 -5
  239. package/es/components/Search/utils.js +11 -3
  240. package/es/components/SecondaryButton/SecondaryButton.js +11 -9
  241. package/es/components/Select/Select.Skeleton.js +27 -30
  242. package/es/components/Select/Select.js +178 -257
  243. package/es/components/Select/index.js +13 -5
  244. package/es/components/SelectItem/SelectItem.js +33 -48
  245. package/es/components/SelectItem/index.js +12 -4
  246. package/es/components/SelectItemGroup/SelectItemGroup.js +27 -37
  247. package/es/components/ShapeIndicator/index.d.ts +1 -1
  248. package/es/components/ShapeIndicator/index.js +74 -80
  249. package/es/components/SkeletonIcon/SkeletonIcon.js +21 -24
  250. package/es/components/SkeletonPlaceholder/SkeletonPlaceholder.js +15 -24
  251. package/es/components/SkeletonText/SkeletonText.js +67 -81
  252. package/es/components/SkeletonText/index.js +12 -4
  253. package/es/components/Slider/Slider.Skeleton.js +68 -91
  254. package/es/components/Slider/Slider.js +864 -1315
  255. package/es/components/Slider/SliderHandles.js +73 -66
  256. package/es/components/Stack/HStack.js +19 -11
  257. package/es/components/Stack/Stack.js +56 -80
  258. package/es/components/Stack/VStack.js +19 -11
  259. package/es/components/StructuredList/StructuredList.Skeleton.js +55 -48
  260. package/es/components/StructuredList/StructuredList.js +178 -317
  261. package/es/components/Switch/IconSwitch.js +99 -145
  262. package/es/components/Switch/Switch.js +66 -99
  263. package/es/components/TabContent/TabContent.js +28 -34
  264. package/es/components/Tabs/Tabs.Skeleton.js +41 -36
  265. package/es/components/Tabs/Tabs.js +732 -1147
  266. package/es/components/Tabs/usePressable.js +97 -112
  267. package/es/components/Tag/DismissibleTag.js +119 -156
  268. package/es/components/Tag/OperationalTag.js +91 -111
  269. package/es/components/Tag/SelectableTag.js +94 -129
  270. package/es/components/Tag/Tag.Skeleton.js +26 -30
  271. package/es/components/Tag/Tag.js +152 -200
  272. package/es/components/Tag/isEllipsisActive.js +13 -8
  273. package/es/components/Text/Text.js +66 -79
  274. package/es/components/Text/TextDirection.js +36 -37
  275. package/es/components/Text/TextDirectionContext.js +14 -8
  276. package/es/components/Text/createTextComponent.js +21 -20
  277. package/es/components/TextArea/TextArea.Skeleton.js +25 -29
  278. package/es/components/TextArea/TextArea.js +315 -422
  279. package/es/components/TextArea/index.js +13 -5
  280. package/es/components/TextInput/ControlledPasswordInput.js +133 -198
  281. package/es/components/TextInput/PasswordInput.js +196 -303
  282. package/es/components/TextInput/TextInput.Skeleton.js +24 -28
  283. package/es/components/TextInput/TextInput.js +219 -317
  284. package/es/components/TextInput/index.js +13 -5
  285. package/es/components/TextInput/util.js +21 -25
  286. package/es/components/Theme/index.js +79 -95
  287. package/es/components/Tile/Tile.d.ts +2 -2
  288. package/es/components/Tile/Tile.js +394 -588
  289. package/es/components/TileGroup/TileGroup.js +70 -111
  290. package/es/components/TimePicker/TimePicker.d.ts +1 -1
  291. package/es/components/TimePicker/TimePicker.js +148 -247
  292. package/es/components/TimePickerSelect/TimePickerSelect.js +43 -58
  293. package/es/components/Toggle/Toggle.Skeleton.js +24 -22
  294. package/es/components/Toggle/Toggle.js +102 -171
  295. package/es/components/ToggleSmall/ToggleSmall.Skeleton.js +46 -51
  296. package/es/components/Toggletip/index.d.ts +2 -2
  297. package/es/components/Toggletip/index.js +170 -256
  298. package/es/components/Tooltip/DefinitionTooltip.js +98 -138
  299. package/es/components/Tooltip/Tooltip.js +188 -263
  300. package/es/components/TreeView/TreeContext.js +13 -5
  301. package/es/components/TreeView/TreeNode.js +361 -500
  302. package/es/components/TreeView/TreeView.js +164 -237
  303. package/es/components/UIShell/Content.js +23 -30
  304. package/es/components/UIShell/Header.js +25 -29
  305. package/es/components/UIShell/HeaderContainer.js +31 -40
  306. package/es/components/UIShell/HeaderGlobalAction.js +65 -90
  307. package/es/components/UIShell/HeaderGlobalBar.js +16 -9
  308. package/es/components/UIShell/HeaderMenu.js +141 -215
  309. package/es/components/UIShell/HeaderMenuButton.js +43 -66
  310. package/es/components/UIShell/HeaderMenuItem.js +49 -76
  311. package/es/components/UIShell/HeaderName.js +32 -44
  312. package/es/components/UIShell/HeaderNavigation.js +32 -37
  313. package/es/components/UIShell/HeaderPanel.js +74 -97
  314. package/es/components/UIShell/HeaderSideNavItems.js +27 -33
  315. package/es/components/UIShell/Link.js +29 -50
  316. package/es/components/UIShell/SideNav.js +132 -241
  317. package/es/components/UIShell/SideNavContext.js +21 -15
  318. package/es/components/UIShell/SideNavDetails.js +29 -34
  319. package/es/components/UIShell/SideNavDivider.js +21 -21
  320. package/es/components/UIShell/SideNavFooter.js +43 -52
  321. package/es/components/UIShell/SideNavHeader.js +26 -35
  322. package/es/components/UIShell/SideNavIcon.js +28 -33
  323. package/es/components/UIShell/SideNavItem.js +28 -33
  324. package/es/components/UIShell/SideNavItems.js +31 -40
  325. package/es/components/UIShell/SideNavLink.js +52 -79
  326. package/es/components/UIShell/SideNavLinkText.js +24 -25
  327. package/es/components/UIShell/SideNavMenu.js +102 -143
  328. package/es/components/UIShell/SideNavMenuItem.js +40 -52
  329. package/es/components/UIShell/SideNavSwitcher.js +59 -68
  330. package/es/components/UIShell/SkipToContent.js +28 -36
  331. package/es/components/UIShell/Switcher.js +69 -99
  332. package/es/components/UIShell/SwitcherDivider.js +16 -24
  333. package/es/components/UIShell/SwitcherItem.js +74 -114
  334. package/es/components/UnorderedList/UnorderedList.js +28 -37
  335. package/es/feature-flags.js +19 -10
  336. package/es/index.js +249 -242
  337. package/es/internal/FloatingMenu.js +246 -292
  338. package/es/internal/OptimizedResize.js +35 -46
  339. package/es/internal/Selection.js +99 -132
  340. package/es/internal/clamp.js +12 -4
  341. package/es/internal/defaultItemToString.js +15 -9
  342. package/es/internal/deprecateFieldOnObject.js +22 -14
  343. package/es/internal/environment.js +15 -7
  344. package/es/internal/getAnnouncement.js +16 -13
  345. package/es/internal/keyboard/keys.js +48 -48
  346. package/es/internal/keyboard/match.js +25 -42
  347. package/es/internal/keyboard/navigation.js +22 -27
  348. package/es/internal/noopFn.js +10 -2
  349. package/es/internal/useAttachedMenu.js +43 -51
  350. package/es/internal/useControllableState.js +43 -48
  351. package/es/internal/useDelayedState.js +30 -35
  352. package/es/internal/useEvent.js +39 -35
  353. package/es/internal/useId.js +51 -87
  354. package/es/internal/useIdPrefix.js +13 -5
  355. package/es/internal/useIsomorphicEffect.js +12 -4
  356. package/es/internal/useMatchMedia.js +29 -21
  357. package/es/internal/useMergedRefs.js +26 -22
  358. package/es/internal/useNoInteractiveChildren.js +70 -99
  359. package/es/internal/useNormalizedInputProps.js +47 -51
  360. package/es/internal/useOutsideClick.js +21 -24
  361. package/es/internal/useOverflowItems.js +89 -90
  362. package/es/internal/usePrefix.js +13 -5
  363. package/es/internal/usePresence.js +51 -54
  364. package/es/internal/usePresenceContext.js +35 -35
  365. package/es/internal/usePreviousValue.js +26 -18
  366. package/es/internal/useResizeObserver.js +57 -66
  367. package/es/internal/useSavedCallback.js +24 -17
  368. package/es/internal/utils.js +17 -9
  369. package/es/internal/warning.js +17 -22
  370. package/es/internal/wrapFocus.js +77 -98
  371. package/es/prop-types/AriaPropTypes.js +14 -6
  372. package/es/prop-types/deprecate.js +30 -27
  373. package/es/prop-types/deprecateComponent.js +17 -8
  374. package/es/prop-types/deprecateValuesWithin.js +18 -21
  375. package/es/prop-types/isRequiredOneOf.js +21 -24
  376. package/es/prop-types/requiredIfGivenPropIsTruthy.js +14 -14
  377. package/es/tools/events.js +17 -21
  378. package/es/tools/mapPopoverAlign.js +19 -18
  379. package/es/tools/mergeRefs.js +14 -17
  380. package/es/tools/setupGetInstanceId.js +16 -8
  381. package/es/tools/toggleClass.js +17 -9
  382. package/es/tools/wrapComponent.js +34 -39
  383. package/icons/index.d.ts +2 -1
  384. package/icons/index.esm.js +2 -2
  385. package/icons/index.js +7 -10
  386. package/lib/_virtual/_rolldown/runtime.js +50 -0
  387. package/lib/components/AILabel/index.d.ts +29 -2
  388. package/lib/components/AILabel/index.js +118 -171
  389. package/lib/components/AISkeleton/AISkeletonIcon.js +27 -31
  390. package/lib/components/AISkeleton/AISkeletonPlaceholder.js +29 -31
  391. package/lib/components/AISkeleton/AISkeletonText.js +30 -43
  392. package/lib/components/Accordion/Accordion.Skeleton.js +59 -84
  393. package/lib/components/Accordion/Accordion.js +47 -65
  394. package/lib/components/Accordion/AccordionItem.js +106 -160
  395. package/lib/components/Accordion/AccordionProvider.js +20 -17
  396. package/lib/components/AspectRatio/AspectRatio.js +45 -51
  397. package/lib/components/BadgeIndicator/index.js +33 -39
  398. package/lib/components/Breadcrumb/Breadcrumb.Skeleton.js +43 -55
  399. package/lib/components/Breadcrumb/Breadcrumb.js +43 -55
  400. package/lib/components/Breadcrumb/BreadcrumbItem.js +84 -87
  401. package/lib/components/Button/Button.Skeleton.js +53 -63
  402. package/lib/components/Button/Button.d.ts +1 -1
  403. package/lib/components/Button/Button.js +149 -244
  404. package/lib/components/Button/ButtonBase.js +85 -108
  405. package/lib/components/Button/index.js +13 -15
  406. package/lib/components/ButtonSet/ButtonSet.js +78 -102
  407. package/lib/components/ButtonSet/index.js +12 -9
  408. package/lib/components/ChatButton/ChatButton.Skeleton.js +31 -31
  409. package/lib/components/ChatButton/ChatButton.js +68 -83
  410. package/lib/components/Checkbox/Checkbox.Skeleton.js +30 -30
  411. package/lib/components/Checkbox/Checkbox.js +119 -198
  412. package/lib/components/Checkbox/index.js +13 -11
  413. package/lib/components/CheckboxGroup/CheckboxGroup.js +104 -152
  414. package/lib/components/ClassPrefix/index.js +24 -19
  415. package/lib/components/CodeSnippet/CodeSnippet.Skeleton.js +49 -47
  416. package/lib/components/CodeSnippet/CodeSnippet.js +215 -303
  417. package/lib/components/ComboBox/ComboBox.js +626 -974
  418. package/lib/components/ComboBox/index.js +12 -9
  419. package/lib/components/ComboButton/index.js +176 -210
  420. package/lib/components/ComposedModal/ComposedModal.js +315 -454
  421. package/lib/components/ComposedModal/ComposedModalPresence.js +49 -44
  422. package/lib/components/ComposedModal/ModalFooter.js +131 -209
  423. package/lib/components/ComposedModal/ModalHeader.js +75 -103
  424. package/lib/components/ComposedModal/useComposedModalState.js +22 -17
  425. package/lib/components/ContainedList/ContainedList.js +77 -106
  426. package/lib/components/ContainedList/ContainedListItem/ContainedListItem.js +59 -71
  427. package/lib/components/ContainedList/ContainedListItem/index.js +12 -9
  428. package/lib/components/ContainedList/index.js +18 -15
  429. package/lib/components/ContentSwitcher/ContentSwitcher.js +112 -142
  430. package/lib/components/ContextMenu/useContextMenu.js +42 -40
  431. package/lib/components/Copy/Copy.js +101 -121
  432. package/lib/components/Copy/index.js +12 -9
  433. package/lib/components/CopyButton/CopyButton.js +85 -98
  434. package/lib/components/CopyButton/index.js +12 -9
  435. package/lib/components/DangerButton/DangerButton.js +19 -13
  436. package/lib/components/DataTable/DataTable.d.ts +11 -11
  437. package/lib/components/DataTable/DataTable.js +474 -655
  438. package/lib/components/DataTable/Table.js +115 -161
  439. package/lib/components/DataTable/TableActionList.js +15 -11
  440. package/lib/components/DataTable/TableBatchAction.js +28 -38
  441. package/lib/components/DataTable/TableBatchActions.js +82 -117
  442. package/lib/components/DataTable/TableBody.js +29 -23
  443. package/lib/components/DataTable/TableCell.js +35 -50
  444. package/lib/components/DataTable/TableContainer.js +79 -86
  445. package/lib/components/DataTable/TableContext.js +15 -8
  446. package/lib/components/DataTable/TableDecoratorRow.js +34 -40
  447. package/lib/components/DataTable/TableExpandHeader.js +57 -94
  448. package/lib/components/DataTable/TableExpandRow.js +86 -123
  449. package/lib/components/DataTable/TableExpandedRow.js +49 -55
  450. package/lib/components/DataTable/TableHead.js +8 -10
  451. package/lib/components/DataTable/TableHeader.js +142 -185
  452. package/lib/components/DataTable/TableRow.d.ts +1 -1
  453. package/lib/components/DataTable/TableRow.js +46 -80
  454. package/lib/components/DataTable/TableSelectAll.js +46 -74
  455. package/lib/components/DataTable/TableSelectRow.js +67 -102
  456. package/lib/components/DataTable/TableSlugRow.js +39 -47
  457. package/lib/components/DataTable/TableToolbar.js +37 -49
  458. package/lib/components/DataTable/TableToolbarAction.js +28 -24
  459. package/lib/components/DataTable/TableToolbarContent.js +15 -11
  460. package/lib/components/DataTable/TableToolbarMenu.js +39 -50
  461. package/lib/components/DataTable/TableToolbarSearch.js +101 -191
  462. package/lib/components/DataTable/state/getDerivedStateFromProps.js +38 -47
  463. package/lib/components/DataTable/state/sortStates.js +11 -10
  464. package/lib/components/DataTable/state/sorting.js +54 -76
  465. package/lib/components/DataTable/tools/cells.js +15 -8
  466. package/lib/components/DataTable/tools/denormalize.js +27 -22
  467. package/lib/components/DataTable/tools/filter.js +21 -23
  468. package/lib/components/DataTable/tools/normalize.js +57 -76
  469. package/lib/components/DataTable/tools/sorting.js +50 -75
  470. package/lib/components/DataTableSkeleton/DataTableSkeleton.js +70 -98
  471. package/lib/components/DatePicker/DatePicker.Skeleton.js +48 -56
  472. package/lib/components/DatePicker/DatePicker.d.ts +4 -2
  473. package/lib/components/DatePicker/DatePicker.js +491 -753
  474. package/lib/components/DatePicker/DatePickerLocales.js +75 -127
  475. package/lib/components/DatePicker/index.js +13 -11
  476. package/lib/components/DatePicker/plugins/appendToPlugin.js +31 -46
  477. package/lib/components/DatePicker/plugins/fixEventsPlugin.js +127 -175
  478. package/lib/components/DatePicker/plugins/rangePlugin.d.ts +1 -1
  479. package/lib/components/DatePicker/plugins/rangePlugin.js +42 -49
  480. package/lib/components/DatePicker/utils.d.ts +7 -0
  481. package/lib/components/DatePicker/utils.js +19 -0
  482. package/lib/components/DatePickerInput/DatePickerInput.js +183 -293
  483. package/lib/components/DatePickerInput/index.js +12 -9
  484. package/lib/components/Dialog/Dialog.js +307 -576
  485. package/lib/components/Dialog/index.js +21 -13
  486. package/lib/components/Dropdown/Dropdown.Skeleton.js +30 -43
  487. package/lib/components/Dropdown/Dropdown.js +348 -539
  488. package/lib/components/Dropdown/index.js +13 -11
  489. package/lib/components/ErrorBoundary/ErrorBoundary.js +39 -62
  490. package/lib/components/ErrorBoundary/ErrorBoundaryContext.js +15 -11
  491. package/lib/components/ExpandableSearch/ExpandableSearch.js +63 -73
  492. package/lib/components/ExpandableSearch/index.js +12 -9
  493. package/lib/components/FeatureFlags/index.d.ts +11 -2
  494. package/lib/components/FeatureFlags/index.js +82 -79
  495. package/lib/components/FileUploader/FileUploader.Skeleton.js +39 -35
  496. package/lib/components/FileUploader/FileUploader.js +273 -347
  497. package/lib/components/FileUploader/FileUploaderButton.js +114 -164
  498. package/lib/components/FileUploader/FileUploaderDropContainer.js +148 -225
  499. package/lib/components/FileUploader/FileUploaderItem.js +142 -161
  500. package/lib/components/FileUploader/Filename.d.ts +1 -1
  501. package/lib/components/FileUploader/Filename.js +56 -76
  502. package/lib/components/FluidComboBox/FluidComboBox.Skeleton.js +30 -32
  503. package/lib/components/FluidComboBox/FluidComboBox.js +58 -109
  504. package/lib/components/FluidDatePicker/FluidDatePicker.Skeleton.js +60 -57
  505. package/lib/components/FluidDatePicker/FluidDatePicker.js +50 -72
  506. package/lib/components/FluidDatePickerInput/FluidDatePickerInput.js +25 -20
  507. package/lib/components/FluidDropdown/FluidDropdown.Skeleton.js +30 -32
  508. package/lib/components/FluidDropdown/FluidDropdown.js +59 -115
  509. package/lib/components/FluidForm/FluidForm.js +33 -35
  510. package/lib/components/FluidForm/FormContext.js +13 -8
  511. package/lib/components/FluidMultiSelect/FluidMultiSelect.Skeleton.js +30 -32
  512. package/lib/components/FluidMultiSelect/FluidMultiSelect.js +71 -201
  513. package/lib/components/FluidNumberInput/FluidNumberInput.Skeleton.js +31 -34
  514. package/lib/components/FluidNumberInput/FluidNumberInput.js +67 -151
  515. package/lib/components/FluidSearch/FluidSearch.Skeleton.js +31 -34
  516. package/lib/components/FluidSearch/FluidSearch.js +45 -88
  517. package/lib/components/FluidSelect/FluidSelect.Skeleton.js +30 -32
  518. package/lib/components/FluidSelect/FluidSelect.js +44 -80
  519. package/lib/components/FluidSelect/index.js +13 -11
  520. package/lib/components/FluidTextArea/FluidTextArea.Skeleton.js +31 -34
  521. package/lib/components/FluidTextArea/FluidTextArea.js +52 -116
  522. package/lib/components/FluidTextInput/FluidPasswordInput.js +48 -103
  523. package/lib/components/FluidTextInput/FluidTextInput.Skeleton.js +31 -34
  524. package/lib/components/FluidTextInput/FluidTextInput.js +53 -108
  525. package/lib/components/FluidTextInput/index.js +14 -13
  526. package/lib/components/FluidTimePicker/FluidTimePicker.Skeleton.js +34 -37
  527. package/lib/components/FluidTimePicker/FluidTimePicker.js +72 -119
  528. package/lib/components/FluidTimePickerSelect/FluidTimePickerSelect.js +31 -51
  529. package/lib/components/Form/Form.js +27 -29
  530. package/lib/components/FormGroup/FormGroup.js +49 -71
  531. package/lib/components/FormItem/FormItem.js +27 -29
  532. package/lib/components/FormLabel/FormLabel.js +32 -38
  533. package/lib/components/Grid/CSSGrid.d.ts +1 -1
  534. package/lib/components/Grid/CSSGrid.js +89 -129
  535. package/lib/components/Grid/Column.js +196 -328
  536. package/lib/components/Grid/ColumnHang.js +32 -38
  537. package/lib/components/Grid/FlexGrid.js +44 -62
  538. package/lib/components/Grid/Grid.js +32 -44
  539. package/lib/components/Grid/GridContext.js +39 -44
  540. package/lib/components/Grid/Row.js +35 -53
  541. package/lib/components/Heading/index.js +39 -53
  542. package/lib/components/Icon/Icon.Skeleton.js +25 -23
  543. package/lib/components/IconButton/index.js +121 -180
  544. package/lib/components/IconIndicator/index.d.ts +1 -1
  545. package/lib/components/IconIndicator/index.js +63 -63
  546. package/lib/components/IdPrefix/index.js +24 -19
  547. package/lib/components/InlineCheckbox/InlineCheckbox.js +72 -117
  548. package/lib/components/InlineCheckbox/index.js +12 -9
  549. package/lib/components/InlineLoading/InlineLoading.js +87 -104
  550. package/lib/components/InlineLoading/index.js +12 -9
  551. package/lib/components/Layer/LayerContext.js +14 -6
  552. package/lib/components/Layer/LayerLevel.js +20 -6
  553. package/lib/components/Layer/index.js +58 -68
  554. package/lib/components/Layout/index.js +81 -111
  555. package/lib/components/LayoutDirection/LayoutDirection.d.ts +1 -1
  556. package/lib/components/LayoutDirection/LayoutDirection.js +36 -40
  557. package/lib/components/LayoutDirection/LayoutDirectionContext.js +14 -8
  558. package/lib/components/LayoutDirection/useLayoutDirection.js +16 -9
  559. package/lib/components/Link/Link.js +67 -112
  560. package/lib/components/Link/index.js +12 -9
  561. package/lib/components/ListBox/ListBox.js +82 -130
  562. package/lib/components/ListBox/ListBoxField.js +33 -47
  563. package/lib/components/ListBox/ListBoxMenu.js +39 -46
  564. package/lib/components/ListBox/ListBoxMenuIcon.js +43 -44
  565. package/lib/components/ListBox/ListBoxMenuItem.js +71 -92
  566. package/lib/components/ListBox/ListBoxPropTypes.js +21 -9
  567. package/lib/components/ListBox/ListBoxSelection.js +75 -100
  568. package/lib/components/ListBox/index.js +17 -21
  569. package/lib/components/ListBox/next/ListBoxSelection.js +83 -121
  570. package/lib/components/ListBox/next/ListBoxTrigger.js +48 -52
  571. package/lib/components/ListItem/ListItem.js +29 -32
  572. package/lib/components/Loading/Loading.js +68 -77
  573. package/lib/components/Loading/index.js +12 -9
  574. package/lib/components/Menu/Menu.js +224 -365
  575. package/lib/components/Menu/MenuContext.d.ts +1 -1
  576. package/lib/components/Menu/MenuContext.js +42 -40
  577. package/lib/components/Menu/MenuItem.js +286 -415
  578. package/lib/components/MenuButton/index.js +138 -197
  579. package/lib/components/Modal/Modal.js +504 -665
  580. package/lib/components/Modal/ModalPresence.js +41 -39
  581. package/lib/components/Modal/index.js +13 -10
  582. package/lib/components/ModalWrapper/ModalWrapper.d.ts +2 -2
  583. package/lib/components/ModalWrapper/ModalWrapper.js +112 -134
  584. package/lib/components/MultiSelect/FilterableMultiSelect.js +611 -920
  585. package/lib/components/MultiSelect/MultiSelect.js +459 -718
  586. package/lib/components/MultiSelect/MultiSelectPropTypes.js +15 -32
  587. package/lib/components/MultiSelect/filter.js +14 -10
  588. package/lib/components/MultiSelect/tools/sorting.js +21 -35
  589. package/lib/components/Notification/Notification.js +514 -787
  590. package/lib/components/NumberInput/NumberFormatPropTypes.js +72 -33
  591. package/lib/components/NumberInput/NumberInput.Skeleton.js +33 -37
  592. package/lib/components/NumberInput/NumberInput.js +571 -950
  593. package/lib/components/OrderedList/OrderedList.js +35 -48
  594. package/lib/components/OverflowMenu/OverflowMenu.js +341 -454
  595. package/lib/components/OverflowMenu/index.js +27 -21
  596. package/lib/components/OverflowMenu/next/index.js +158 -188
  597. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +104 -164
  598. package/lib/components/OverflowMenuItem/index.js +12 -9
  599. package/lib/components/OverflowMenuV2/index.js +25 -15
  600. package/lib/components/PageHeader/PageHeader.js +301 -444
  601. package/lib/components/PageHeader/index.js +27 -19
  602. package/lib/components/Pagination/Pagination.Skeleton.js +38 -37
  603. package/lib/components/Pagination/Pagination.d.ts +1 -1
  604. package/lib/components/Pagination/Pagination.js +256 -360
  605. package/lib/components/Pagination/experimental/PageSelector.js +48 -58
  606. package/lib/components/Pagination/experimental/Pagination-story.d.ts +114 -0
  607. package/lib/components/Pagination/experimental/Pagination.js +148 -200
  608. package/lib/components/PaginationNav/PaginationNav.js +324 -430
  609. package/lib/components/Popover/index.js +323 -440
  610. package/lib/components/PrimaryButton/PrimaryButton.js +19 -13
  611. package/lib/components/ProgressBar/ProgressBar.js +121 -147
  612. package/lib/components/ProgressIndicator/ProgressIndicator.Skeleton.js +46 -43
  613. package/lib/components/ProgressIndicator/ProgressIndicator.js +150 -245
  614. package/lib/components/RadioButton/RadioButton.Skeleton.js +27 -27
  615. package/lib/components/RadioButton/RadioButton.js +105 -178
  616. package/lib/components/RadioButton/index.js +12 -9
  617. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +139 -211
  618. package/lib/components/RadioTile/RadioTile.js +108 -172
  619. package/lib/components/RadioTile/index.js +12 -9
  620. package/lib/components/Search/Search.Skeleton.js +32 -38
  621. package/lib/components/Search/Search.js +185 -281
  622. package/lib/components/Search/index.js +13 -11
  623. package/lib/components/Search/utils.js +11 -4
  624. package/lib/components/SecondaryButton/SecondaryButton.js +19 -13
  625. package/lib/components/Select/Select.Skeleton.js +31 -35
  626. package/lib/components/Select/Select.js +182 -261
  627. package/lib/components/Select/index.js +13 -11
  628. package/lib/components/SelectItem/SelectItem.js +37 -52
  629. package/lib/components/SelectItem/index.js +12 -9
  630. package/lib/components/SelectItemGroup/SelectItemGroup.js +31 -41
  631. package/lib/components/ShapeIndicator/index.d.ts +1 -1
  632. package/lib/components/ShapeIndicator/index.js +78 -83
  633. package/lib/components/SkeletonIcon/SkeletonIcon.js +25 -28
  634. package/lib/components/SkeletonPlaceholder/SkeletonPlaceholder.js +25 -28
  635. package/lib/components/SkeletonText/SkeletonText.js +71 -85
  636. package/lib/components/SkeletonText/index.js +12 -9
  637. package/lib/components/Slider/Slider.Skeleton.js +72 -95
  638. package/lib/components/Slider/Slider.js +868 -1319
  639. package/lib/components/Slider/SliderHandles.js +75 -68
  640. package/lib/components/Stack/HStack.js +22 -14
  641. package/lib/components/Stack/Stack.js +60 -82
  642. package/lib/components/Stack/VStack.js +22 -14
  643. package/lib/components/StructuredList/StructuredList.Skeleton.js +59 -52
  644. package/lib/components/StructuredList/StructuredList.js +182 -319
  645. package/lib/components/Switch/IconSwitch.js +103 -149
  646. package/lib/components/Switch/Switch.js +70 -103
  647. package/lib/components/TabContent/TabContent.js +32 -38
  648. package/lib/components/Tabs/Tabs.Skeleton.js +45 -41
  649. package/lib/components/Tabs/Tabs.js +738 -1151
  650. package/lib/components/Tabs/usePressable.js +98 -114
  651. package/lib/components/Tag/DismissibleTag.js +123 -160
  652. package/lib/components/Tag/OperationalTag.js +95 -115
  653. package/lib/components/Tag/SelectableTag.js +98 -133
  654. package/lib/components/Tag/Tag.Skeleton.js +30 -32
  655. package/lib/components/Tag/Tag.js +156 -204
  656. package/lib/components/Tag/isEllipsisActive.js +13 -9
  657. package/lib/components/Text/Text.js +69 -81
  658. package/lib/components/Text/TextDirection.js +39 -39
  659. package/lib/components/Text/TextDirectionContext.js +15 -10
  660. package/lib/components/Text/createTextComponent.js +29 -22
  661. package/lib/components/TextArea/TextArea.Skeleton.js +29 -34
  662. package/lib/components/TextArea/TextArea.js +319 -426
  663. package/lib/components/TextArea/index.js +13 -11
  664. package/lib/components/TextInput/ControlledPasswordInput.js +137 -202
  665. package/lib/components/TextInput/PasswordInput.js +200 -307
  666. package/lib/components/TextInput/TextInput.Skeleton.js +28 -33
  667. package/lib/components/TextInput/TextInput.js +223 -321
  668. package/lib/components/TextInput/index.js +13 -11
  669. package/lib/components/TextInput/util.js +21 -26
  670. package/lib/components/Theme/index.js +83 -97
  671. package/lib/components/Tile/Tile.d.ts +2 -2
  672. package/lib/components/Tile/Tile.js +398 -590
  673. package/lib/components/TileGroup/TileGroup.js +73 -113
  674. package/lib/components/TimePicker/TimePicker.d.ts +1 -1
  675. package/lib/components/TimePicker/TimePicker.js +152 -251
  676. package/lib/components/TimePickerSelect/TimePickerSelect.js +47 -62
  677. package/lib/components/Toggle/Toggle.Skeleton.js +28 -24
  678. package/lib/components/Toggle/Toggle.js +106 -176
  679. package/lib/components/ToggleSmall/ToggleSmall.Skeleton.js +50 -53
  680. package/lib/components/Toggletip/index.d.ts +2 -2
  681. package/lib/components/Toggletip/index.js +174 -258
  682. package/lib/components/Tooltip/DefinitionTooltip.js +102 -140
  683. package/lib/components/Tooltip/Tooltip.js +192 -265
  684. package/lib/components/TreeView/TreeContext.js +14 -7
  685. package/lib/components/TreeView/TreeNode.js +365 -504
  686. package/lib/components/TreeView/TreeView.js +169 -242
  687. package/lib/components/UIShell/Content.js +27 -34
  688. package/lib/components/UIShell/Header.js +29 -33
  689. package/lib/components/UIShell/HeaderContainer.js +34 -44
  690. package/lib/components/UIShell/HeaderGlobalAction.js +69 -94
  691. package/lib/components/UIShell/HeaderGlobalBar.js +17 -14
  692. package/lib/components/UIShell/HeaderMenu.js +146 -221
  693. package/lib/components/UIShell/HeaderMenuButton.js +47 -70
  694. package/lib/components/UIShell/HeaderMenuItem.js +53 -80
  695. package/lib/components/UIShell/HeaderName.js +36 -48
  696. package/lib/components/UIShell/HeaderNavigation.js +36 -41
  697. package/lib/components/UIShell/HeaderPanel.js +78 -101
  698. package/lib/components/UIShell/HeaderSideNavItems.js +31 -37
  699. package/lib/components/UIShell/Link.js +32 -54
  700. package/lib/components/UIShell/SideNav.js +136 -245
  701. package/lib/components/UIShell/SideNavContext.js +23 -17
  702. package/lib/components/UIShell/SideNavDetails.js +33 -38
  703. package/lib/components/UIShell/SideNavDivider.js +25 -25
  704. package/lib/components/UIShell/SideNavFooter.js +47 -56
  705. package/lib/components/UIShell/SideNavHeader.js +30 -39
  706. package/lib/components/UIShell/SideNavIcon.js +32 -37
  707. package/lib/components/UIShell/SideNavItem.js +32 -37
  708. package/lib/components/UIShell/SideNavItems.js +35 -44
  709. package/lib/components/UIShell/SideNavLink.js +56 -83
  710. package/lib/components/UIShell/SideNavLinkText.js +28 -29
  711. package/lib/components/UIShell/SideNavMenu.js +106 -148
  712. package/lib/components/UIShell/SideNavMenuItem.js +44 -56
  713. package/lib/components/UIShell/SideNavSwitcher.js +63 -72
  714. package/lib/components/UIShell/SkipToContent.js +32 -40
  715. package/lib/components/UIShell/Switcher.js +73 -103
  716. package/lib/components/UIShell/SwitcherDivider.js +26 -28
  717. package/lib/components/UIShell/SwitcherItem.js +78 -118
  718. package/lib/components/UnorderedList/UnorderedList.js +32 -41
  719. package/lib/feature-flags.js +21 -13
  720. package/lib/index.js +622 -602
  721. package/lib/internal/FloatingMenu.js +249 -296
  722. package/lib/internal/OptimizedResize.js +35 -47
  723. package/lib/internal/Selection.js +102 -134
  724. package/lib/internal/clamp.js +12 -5
  725. package/lib/internal/defaultItemToString.js +15 -10
  726. package/lib/internal/deprecateFieldOnObject.js +23 -16
  727. package/lib/internal/environment.js +15 -8
  728. package/lib/internal/getAnnouncement.js +16 -14
  729. package/lib/internal/keyboard/keys.js +48 -49
  730. package/lib/internal/keyboard/match.js +25 -43
  731. package/lib/internal/keyboard/navigation.js +22 -29
  732. package/lib/internal/noopFn.js +10 -3
  733. package/lib/internal/useAttachedMenu.js +44 -53
  734. package/lib/internal/useControllableState.js +44 -50
  735. package/lib/internal/useDelayedState.js +31 -37
  736. package/lib/internal/useEvent.js +40 -37
  737. package/lib/internal/useId.js +54 -91
  738. package/lib/internal/useIdPrefix.js +15 -7
  739. package/lib/internal/useIsomorphicEffect.js +13 -8
  740. package/lib/internal/useMatchMedia.js +30 -23
  741. package/lib/internal/useMergedRefs.js +27 -24
  742. package/lib/internal/useNoInteractiveChildren.js +73 -101
  743. package/lib/internal/useNormalizedInputProps.js +55 -53
  744. package/lib/internal/useOutsideClick.js +22 -26
  745. package/lib/internal/useOverflowItems.js +90 -94
  746. package/lib/internal/usePrefix.js +15 -7
  747. package/lib/internal/usePresence.js +52 -56
  748. package/lib/internal/usePresenceContext.js +36 -37
  749. package/lib/internal/usePreviousValue.js +27 -20
  750. package/lib/internal/useResizeObserver.js +58 -68
  751. package/lib/internal/useSavedCallback.js +25 -19
  752. package/lib/internal/utils.js +18 -11
  753. package/lib/internal/warning.js +24 -23
  754. package/lib/internal/wrapFocus.js +78 -100
  755. package/lib/prop-types/AriaPropTypes.js +17 -9
  756. package/lib/prop-types/deprecate.js +30 -29
  757. package/lib/prop-types/deprecateComponent.js +17 -10
  758. package/lib/prop-types/deprecateValuesWithin.js +18 -23
  759. package/lib/prop-types/isRequiredOneOf.js +21 -25
  760. package/lib/prop-types/requiredIfGivenPropIsTruthy.js +14 -15
  761. package/lib/tools/events.js +17 -22
  762. package/lib/tools/mapPopoverAlign.js +19 -19
  763. package/lib/tools/mergeRefs.js +14 -18
  764. package/lib/tools/setupGetInstanceId.js +16 -9
  765. package/lib/tools/toggleClass.js +17 -10
  766. package/lib/tools/wrapComponent.js +38 -43
  767. package/package.json +10 -16
  768. package/es/_virtual/_rollupPluginBabelHelpers.js +0 -40
  769. package/es/components/DataTable/stories/examples/TableToolbarFilter.d.ts +0 -54
  770. package/es/node_modules/es-toolkit/dist/compat/function/debounce.js +0 -55
  771. package/es/node_modules/es-toolkit/dist/compat/function/throttle.js +0 -23
  772. package/es/node_modules/es-toolkit/dist/function/debounce.js +0 -70
  773. package/lib/_virtual/_rollupPluginBabelHelpers.js +0 -45
  774. package/lib/components/DataTable/stories/examples/TableToolbarFilter.d.ts +0 -54
  775. package/lib/node_modules/es-toolkit/dist/compat/function/debounce.js +0 -57
  776. package/lib/node_modules/es-toolkit/dist/compat/function/throttle.js +0 -25
  777. package/lib/node_modules/es-toolkit/dist/function/debounce.js +0 -72
@@ -1,975 +1,595 @@
1
1
  /**
2
- * Copyright IBM Corp. 2016, 2023
2
+ * Copyright IBM Corp. 2016, 2026
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { extends as _extends } from '../../_virtual/_rollupPluginBabelHelpers.js';
9
- import { Subtract, Add } from '@carbon/icons-react';
10
- import cx from 'classnames';
11
- import PropTypes from 'prop-types';
12
- import React, { useContext, useState, useMemo, useRef, useCallback, useEffect, cloneElement } from 'react';
13
- import { useMergedRefs } from '../../internal/useMergedRefs.js';
14
- import { useNormalizedInputProps } from '../../internal/useNormalizedInputProps.js';
15
- import { usePrefix } from '../../internal/usePrefix.js';
16
- import { deprecate } from '../../prop-types/deprecate.js';
17
- import '../FluidForm/FluidForm.js';
18
- import { FormContext } from '../FluidForm/FormContext.js';
19
- import { Text } from '../Text/Text.js';
20
- import '../Text/TextDirection.js';
21
- import { clamp } from '../../internal/clamp.js';
22
- import { useControllableState } from '../../internal/useControllableState.js';
23
- import { NumberParser, NumberFormatter } from '@carbon/utilities';
24
- import { ArrowUp, ArrowDown } from '../../internal/keyboard/keys.js';
25
- import { match } from '../../internal/keyboard/match.js';
26
- import { NumberFormatOptionsPropType } from './NumberFormatPropTypes.js';
27
- import { AILabel } from '../AILabel/index.js';
28
- import { isComponentElement } from '../../internal/utils.js';
29
-
30
- var _Subtract, _Add;
8
+ import { usePrefix } from "../../internal/usePrefix.js";
9
+ import { Text } from "../Text/Text.js";
10
+ import { ArrowDown, ArrowUp as ArrowUp$1 } from "../../internal/keyboard/keys.js";
11
+ import { match } from "../../internal/keyboard/match.js";
12
+ import { deprecate } from "../../prop-types/deprecate.js";
13
+ import { useMergedRefs } from "../../internal/useMergedRefs.js";
14
+ import { AILabel } from "../AILabel/index.js";
15
+ import { isComponentElement } from "../../internal/utils.js";
16
+ import { FormContext } from "../FluidForm/FormContext.js";
17
+ import { useNormalizedInputProps } from "../../internal/useNormalizedInputProps.js";
18
+ import { useControllableState } from "../../internal/useControllableState.js";
19
+ import { clamp } from "../../internal/clamp.js";
20
+ import { NumberFormatOptionsPropType } from "./NumberFormatPropTypes.js";
21
+ import classNames from "classnames";
22
+ import React, { cloneElement, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
23
+ import PropTypes from "prop-types";
24
+ import { jsx, jsxs } from "react/jsx-runtime";
25
+ import { Add, Subtract } from "@carbon/icons-react";
26
+ import { NumberFormatter, NumberParser } from "@carbon/utilities";
27
+
28
+ //#region src/components/NumberInput/NumberInput.tsx
29
+ /**
30
+ * Copyright IBM Corp. 2016, 2026
31
+ *
32
+ * This source code is licensed under the Apache-2.0 license found in the
33
+ * LICENSE file in the root directory of this source tree.
34
+ */
31
35
  const translationIds = {
32
- 'increment.number': 'increment.number',
33
- 'decrement.number': 'decrement.number'
36
+ "increment.number": "increment.number",
37
+ "decrement.number": "decrement.number"
34
38
  };
35
39
  const defaultTranslations = {
36
- [translationIds['increment.number']]: 'Increment number',
37
- [translationIds['decrement.number']]: 'Decrement number'
40
+ [translationIds["increment.number"]]: "Increment number",
41
+ [translationIds["decrement.number"]]: "Decrement number"
38
42
  };
39
- const defaultTranslateWithId = messageId => {
40
- return defaultTranslations[messageId];
43
+ const defaultTranslateWithId = (messageId) => {
44
+ return defaultTranslations[messageId];
41
45
  };
42
- const getSeparators = locale => {
43
- const numberWithGroupAndDecimal = 1234567.89;
44
- const formatted = new Intl.NumberFormat(locale).format(numberWithGroupAndDecimal);
45
-
46
- // Comprehensive Unicode digit pattern that includes all common numeral systems
47
- // supported by Intl.NumberFormat across different locales
48
- const digitPattern = '[' + '\\u0030-\\u0039' +
49
- // Western
50
- '\\u0660-\\u0669' +
51
- // Eastern Arabic
52
- '\\u0966-\\u096F' +
53
- // Devanagari
54
- '\\u09E6-\\u09EF' +
55
- // Bengali
56
- '\\uFF10-\\uFF19' +
57
- // Fullwidth Japanese 0-9
58
- '一二三四五六七八九〇零' +
59
- // Kanji digits
60
- ']';
61
-
62
- // Non-digit pattern that excludes ALL digit types (not just ASCII 0-9)
63
- const nonDigitPattern = '[^' + '\\u0030-\\u0039' +
64
- // Western
65
- '\\u0660-\\u0669' +
66
- // Eastern Arabic
67
- '\\u0966-\\u096F' +
68
- // Devanagari
69
- '\\u09E6-\\u09EF' +
70
- // Bengali
71
- '\\uFF10-\\uFF19' +
72
- // Fullwidth Japanese 0-9
73
- '一二三四五六七八九〇零' +
74
- // Kanji digits
75
- ']+';
76
-
77
- // Extract separators using regex that handles all numeral systems
78
- // Use nonDigitPattern instead of \D+ to correctly identify separators
79
- const regex = new RegExp(`(${nonDigitPattern})${digitPattern}{3}(${nonDigitPattern})${digitPattern}{2}$`);
80
- const match = formatted.match(regex);
81
- if (match) {
82
- const groupSeparator = match[1];
83
- const decimalSeparator = match[2];
84
- return {
85
- groupSeparator,
86
- decimalSeparator
87
- };
88
- } else {
89
- return {
90
- groupSeparator: null,
91
- decimalSeparator: null
92
- };
93
- }
46
+ const getSeparators = (locale) => {
47
+ const formatted = new Intl.NumberFormat(locale).format(1234567.89);
48
+ const digitPattern = "[\\u0030-\\u0039\\u0660-\\u0669\\u0966-\\u096F\\u09E6-\\u09EF\\uFF10-\\uFF19一二三四五六七八九〇零]";
49
+ const nonDigitPattern = "[^\\u0030-\\u0039\\u0660-\\u0669\\u0966-\\u096F\\u09E6-\\u09EF\\uFF10-\\uFF19一二三四五六七八九〇零]+";
50
+ const regex = new RegExp(`(${nonDigitPattern})${digitPattern}{3}(${nonDigitPattern})${digitPattern}{2}$`);
51
+ const match = formatted.match(regex);
52
+ if (match) return {
53
+ groupSeparator: match[1],
54
+ decimalSeparator: match[2]
55
+ };
56
+ else return {
57
+ groupSeparator: null,
58
+ decimalSeparator: null
59
+ };
94
60
  };
95
-
96
- // Normalizes all Unicode minus variants to ASCII hyphen-minus (-)
97
- const normalizeMinus = value => value.replace(/[\u2212\u2012\u2013\u2014\uFE63\uFF0D]/g, '-');
98
- const normalizeNumericInput = value => value
99
- // Remove bidi / direction control characters (Arabic keyboards)
100
- .replace(/[\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g, '')
101
- // Normalize Unicode minus variants to ASCII "-"
102
- .replace(/[\u2212\u2012\u2013\u2014\uFE63\uFF0D]/g, '-');
61
+ const normalizeMinus = (value) => value.replace(/[\u2212\u2012\u2013\u2014\uFE63\uFF0D]/g, "-");
62
+ const normalizeNumericInput = (value) => value.replace(/[\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g, "").replace(/[\u2212\u2012\u2013\u2014\uFE63\uFF0D]/g, "-");
103
63
  /**
104
- * Converts a string with any Unicode numeral system to a JavaScript number.
105
- * Handles all numeral systems supported by Intl.NumberFormat.
106
- *
107
- * @param {string} input - The input string with numerals in any Unicode system
108
- * @param {string} locale - The locale for parsing separators
109
- * @returns {number} The parsed number, or NaN if invalid
110
- */
64
+ * Converts a string with any Unicode numeral system to a JavaScript number.
65
+ * Handles all numeral systems supported by Intl.NumberFormat.
66
+ *
67
+ * @param {string} input - The input string with numerals in any Unicode system
68
+ * @param {string} locale - The locale for parsing separators
69
+ * @returns {number} The parsed number, or NaN if invalid
70
+ */
111
71
  const parseNumberWithLocale = (input, locale) => {
112
- // Handle empty, null, or undefined inputs
113
- if (input === '' || input === undefined || input === null) {
114
- return NaN;
115
- }
116
- input = normalizeNumericInput(input);
117
- const {
118
- groupSeparator,
119
- decimalSeparator
120
- } = getSeparators(locale);
121
-
122
- // Kanji digit map
123
- const kanjiMap = {
124
- 零: '0',
125
- 〇: '0',
126
- 一: '1',
127
- 二: '2',
128
- 三: '3',
129
- 四: '4',
130
- 五: '5',
131
- 六: '6',
132
- 七: '7',
133
- 八: '8',
134
- 九: '9'
135
- };
136
- const digitRanges = [{
137
- start: 0x0030,
138
- end: 0x0039,
139
- base: 0x0030
140
- }, {
141
- start: 0x0660,
142
- end: 0x0669,
143
- base: 0x0660
144
- }, {
145
- start: 0x0966,
146
- end: 0x096f,
147
- base: 0x0966
148
- }, {
149
- start: 0x09e6,
150
- end: 0x09ef,
151
- base: 0x09e6
152
- }, {
153
- start: 0xff10,
154
- end: 0xff19,
155
- base: 0xff10
156
- }];
157
- let normalized = Array.from(input).map(char => {
158
- // Preserve scientific notation characters
159
- if (char === 'e' || char === 'E' || char === '+' || char === '-') {
160
- return char;
161
- }
162
-
163
- // Check Kanji first
164
- if (kanjiMap[char] !== undefined) {
165
- return kanjiMap[char];
166
- }
167
- const code = char.charCodeAt(0);
168
- for (const range of digitRanges) {
169
- if (code >= range.start && code <= range.end) {
170
- return String(code - range.start);
171
- }
172
- }
173
- return char;
174
- }).join('');
175
-
176
- // Remove grouping separators
177
- if (groupSeparator) {
178
- if (groupSeparator?.trim() === '') {
179
- normalized = normalized?.replace(/[\u00A0\u202F\s]/g, '');
180
- } else {
181
- if (decimalSeparator !== ',' && decimalSeparator !== '٬') {
182
- normalized = normalized?.replace(/[,٬]/g, '');
183
- }
184
- if (groupSeparator !== ',' && groupSeparator !== '٬') {
185
- const escaped = groupSeparator?.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
186
- normalized = normalized?.replace(new RegExp(escaped, 'g'), '');
187
- }
188
- }
189
- }
190
- normalized = normalized.replace(/٫/g, '.');
191
- if (decimalSeparator && decimalSeparator !== '.' && decimalSeparator !== '٫') {
192
- const escaped = decimalSeparator.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
193
- normalized = normalized.replace(new RegExp(escaped, 'g'), '.');
194
- }
195
- normalized = normalizeMinus(normalized);
196
- return Number(normalized);
72
+ if (input === "" || input === void 0 || input === null) return NaN;
73
+ input = normalizeNumericInput(input);
74
+ const { groupSeparator, decimalSeparator } = getSeparators(locale);
75
+ const kanjiMap = {
76
+ 零: "0",
77
+ 〇: "0",
78
+ 一: "1",
79
+ 二: "2",
80
+ 三: "3",
81
+ 四: "4",
82
+ 五: "5",
83
+ 六: "6",
84
+ 七: "7",
85
+ 八: "8",
86
+ 九: "9"
87
+ };
88
+ const digitRanges = [
89
+ {
90
+ start: 48,
91
+ end: 57,
92
+ base: 48
93
+ },
94
+ {
95
+ start: 1632,
96
+ end: 1641,
97
+ base: 1632
98
+ },
99
+ {
100
+ start: 2406,
101
+ end: 2415,
102
+ base: 2406
103
+ },
104
+ {
105
+ start: 2534,
106
+ end: 2543,
107
+ base: 2534
108
+ },
109
+ {
110
+ start: 65296,
111
+ end: 65305,
112
+ base: 65296
113
+ }
114
+ ];
115
+ let normalized = Array.from(input).map((char) => {
116
+ if (char === "e" || char === "E" || char === "+" || char === "-") return char;
117
+ if (kanjiMap[char] !== void 0) return kanjiMap[char];
118
+ const code = char.charCodeAt(0);
119
+ for (const range of digitRanges) if (code >= range.start && code <= range.end) return String(code - range.start);
120
+ return char;
121
+ }).join("");
122
+ if (groupSeparator) if (groupSeparator?.trim() === "") normalized = normalized?.replace(/[\u00A0\u202F\s]/g, "");
123
+ else {
124
+ if (decimalSeparator !== "," && decimalSeparator !== "٬") normalized = normalized?.replace(/[,٬]/g, "");
125
+ if (groupSeparator !== "," && groupSeparator !== "٬") {
126
+ const escaped = groupSeparator?.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
127
+ normalized = normalized?.replace(new RegExp(escaped, "g"), "");
128
+ }
129
+ }
130
+ normalized = normalized.replace(/٫/g, ".");
131
+ if (decimalSeparator && decimalSeparator !== "." && decimalSeparator !== "٫") {
132
+ const escaped = decimalSeparator.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
133
+ normalized = normalized.replace(new RegExp(escaped, "g"), ".");
134
+ }
135
+ normalized = normalizeMinus(normalized);
136
+ return Number(normalized);
197
137
  };
198
138
  const validateNumberSeparators = (input, locale) => {
199
- if (input === '') {
200
- return true;
201
- }
202
-
203
- // Normalize bidi marks + minus signs FIRST
204
- input = normalizeNumericInput(input);
205
- const {
206
- groupSeparator,
207
- decimalSeparator
208
- } = getSeparators(locale);
209
- if (!decimalSeparator) {
210
- return !isNaN(Number(input));
211
- }
212
- const esc = s => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
213
- const digit = '[' + '\\u0030-\\u0039' + '\\u0660-\\u0669' + '\\u0966-\\u096F' + '\\u09E6-\\u09EF' + '\\uFF10-\\uFF19' + '一二三四五六七八九〇零' + ']';
214
-
215
- // Group separator regex
216
- let group = '';
217
- if (groupSeparator) {
218
- if (groupSeparator?.trim() === '') {
219
- group = '[\\u00A0\\u202F\\s]';
220
- } else if (groupSeparator === ',' || groupSeparator === '٬') {
221
- group = '[,٬]';
222
- } else {
223
- group = esc(groupSeparator);
224
- }
225
- }
226
-
227
- // Decimal separator regex
228
- let decimal = esc(decimalSeparator);
229
- if (decimalSeparator === '.' || decimalSeparator === '٫') {
230
- decimal = '[.٫]';
231
- }
232
- const sign = '[\\-\\u2212]?';
233
- const scientific = `([eE][+-]?${digit}+)?`;
234
-
235
- // Detect if grouping is used AT ALL
236
- const usesGrouping = group && (groupSeparator?.trim() === '' ? /[\u00A0\u202F\s]/.test(input) : groupSeparator === ',' || groupSeparator === '٬' ? /[,٬]/.test(input) : groupSeparator ? input.includes(groupSeparator) : false);
237
- const scientificMatch = input?.match(/^([^eE]+)([eE][+-]?.*)?$/);
238
- const baseNumber = scientificMatch ? scientificMatch[1] : input;
239
-
240
- // Split integer part from the base number - handle both decimal separator variants
241
- let integerPart;
242
- if (decimalSeparator === '.' || decimalSeparator === '٫') {
243
- // Split by either . or ٫
244
- integerPart = baseNumber?.split(/[.,]/)[0];
245
- } else {
246
- integerPart = baseNumber?.split(decimalSeparator)[0];
247
- }
248
-
249
- // STEP 1: strict integer validation
250
- // When grouping is used, we need to handle two cases:
251
- // 1. Numbers with 1-3 digits (no separator required): 1, 12, 123
252
- // 2. Numbers with 4+ digits (separator required): 1,234 or 12,345 or 123,456
253
- const integerRegex = usesGrouping ? new RegExp(`^${sign}(${digit}{1,3}|${digit}{1,3}(${group}${digit}{3})+)$`) : new RegExp(`^${sign}${digit}+$`);
254
- if (!integerRegex.test(integerPart)) {
255
- return false;
256
- }
257
-
258
- // STEP 2: full number validation
259
- const fullRegex = new RegExp(`^${sign}${digit}+` + (usesGrouping ? `(${group}${digit}{3})*` : '') + `(${decimal}${digit}+)?${scientific}$`);
260
- return fullRegex.test(input);
139
+ if (input === "") return true;
140
+ input = normalizeNumericInput(input);
141
+ const { groupSeparator, decimalSeparator } = getSeparators(locale);
142
+ if (!decimalSeparator) return !isNaN(Number(input));
143
+ const esc = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
144
+ const digit = "[\\u0030-\\u0039\\u0660-\\u0669\\u0966-\\u096F\\u09E6-\\u09EF\\uFF10-\\uFF19一二三四五六七八九〇零]";
145
+ let group = "";
146
+ if (groupSeparator) if (groupSeparator?.trim() === "") group = "[\\u00A0\\u202F\\s]";
147
+ else if (groupSeparator === "," || groupSeparator === "٬") group = "[,٬]";
148
+ else group = esc(groupSeparator);
149
+ let decimal = esc(decimalSeparator);
150
+ if (decimalSeparator === "." || decimalSeparator === "٫") decimal = "[.٫]";
151
+ const sign = "[\\-\\u2212]?";
152
+ const scientific = `([eE][+-]?${digit}+)?`;
153
+ const usesGrouping = group && (groupSeparator?.trim() === "" ? /[\u00A0\u202F\s]/.test(input) : groupSeparator === "," || groupSeparator === "٬" ? /[,٬]/.test(input) : groupSeparator ? input.includes(groupSeparator) : false);
154
+ const scientificMatch = input?.match(/^([^eE]+)([eE][+-]?.*)?$/);
155
+ const baseNumber = scientificMatch ? scientificMatch[1] : input;
156
+ let integerPart;
157
+ if (decimalSeparator === "." || decimalSeparator === "٫") integerPart = baseNumber?.split(/[.,]/)[0];
158
+ else integerPart = baseNumber?.split(decimalSeparator)[0];
159
+ if (!(usesGrouping ? new RegExp(`^${sign}(${digit}{1,3}|${digit}{1,3}(${group}${digit}{3})+)$`) : new RegExp(`^${sign}${digit}+$`)).test(integerPart)) return false;
160
+ return new RegExp(`^${sign}${digit}+` + (usesGrouping ? `(${group}${digit}{3})*` : "") + `(${decimal}${digit}+)?${scientific}$`).test(input);
261
161
  };
262
-
263
- // eslint-disable-next-line react/display-name -- https://github.com/carbon-design-system/carbon/issues/20452
264
- const NumberInput = /*#__PURE__*/React.forwardRef((props, forwardRef) => {
265
- const {
266
- allowEmpty = false,
267
- className: customClassName,
268
- decorator,
269
- disabled = false,
270
- disableWheel: disableWheelProp = false,
271
- formatOptions,
272
- helperText = '',
273
- hideLabel = false,
274
- hideSteppers,
275
- iconDescription,
276
- id,
277
- inputMode = 'decimal',
278
- invalid = false,
279
- invalidText,
280
- label,
281
- light,
282
- locale = 'en-US',
283
- max,
284
- min,
285
- onBlur,
286
- onStepperBlur,
287
- onChange,
288
- onClick,
289
- onKeyUp,
290
- pattern = '[0-9]*',
291
- readOnly,
292
- size = 'md',
293
- slug,
294
- step = 1,
295
- translateWithId: t = defaultTranslateWithId,
296
- type = 'number',
297
- defaultValue = type === 'number' ? 0 : NaN,
298
- validate,
299
- warn = false,
300
- warnText = '',
301
- stepStartValue = 0,
302
- value: controlledValue,
303
- ...rest
304
- } = props;
305
- const prefix = usePrefix();
306
- const {
307
- isFluid
308
- } = useContext(FormContext);
309
- const [isFocused, setIsFocused] = useState(false);
310
-
311
- /**
312
- * The input value, only used when type=number
313
- */
314
- const [value, setValue] = useState(() => {
315
- if (controlledValue !== undefined) {
316
- return controlledValue;
317
- }
318
- if (defaultValue !== undefined) {
319
- return defaultValue;
320
- }
321
- if (allowEmpty) {
322
- return '';
323
- }
324
- return 0;
325
- });
326
- // eslint-disable-next-line @typescript-eslint/no-unused-vars -- https://github.com/carbon-design-system/carbon/issues/20452
327
- const [prevControlledValue, setPrevControlledValue] = useState(controlledValue);
328
- const numberParser = useMemo(() => new NumberParser(locale, formatOptions), [locale, formatOptions]);
329
- /**
330
- * The currently parsed number value.
331
- * Only used when type=text
332
- * Updated based on the `value` as the user types.
333
- */
334
- const [numberValue, setNumberValue, isControlled] = useControllableState({
335
- name: 'NumberInput',
336
- defaultValue: typeof defaultValue === 'string' ? numberParser.parse(defaultValue) : defaultValue,
337
- value: typeof controlledValue === 'string' ? numberParser.parse(controlledValue) : controlledValue
338
- });
339
-
340
- /**
341
- * The number value that was previously "committed" to the input on blur
342
- * Only used when type="text"
343
- */
344
- const previousNumberValue = useRef(numberValue);
345
- /**
346
- * The current text value of the input.
347
- * Only used when type=text
348
- * Updated as the user types and formatted on blur.
349
- */
350
- const [inputValue, setInputValue] = React.useState(() => isNaN(numberValue) ? '' : new NumberFormatter(locale, formatOptions).format(numberValue));
351
- const numberingSystem = useMemo(() => numberParser.getNumberingSystem(inputValue), [numberParser, inputValue]);
352
- const numberFormatter = useMemo(() => new NumberFormatter(locale, {
353
- ...formatOptions,
354
- numberingSystem
355
- }), [locale, formatOptions, numberingSystem]);
356
- const format = useCallback(value => isNaN(value) || value === null ? '' : numberFormatter.format(value), [numberFormatter]);
357
- useEffect(() => {
358
- if (isControlled && !(isNaN(previousNumberValue.current) && isNaN(numberValue)) && previousNumberValue.current !== numberValue) {
359
- setInputValue(format(numberValue));
360
- previousNumberValue.current = numberValue;
361
- }
362
- }, [isControlled, numberValue, format]);
363
- const inputRef = useRef(null);
364
- const ref = useMergedRefs([forwardRef, inputRef]);
365
- const numberInputClasses = cx({
366
- [`${prefix}--number`]: true,
367
- [`${prefix}--number--helpertext`]: true,
368
- [`${prefix}--number--readonly`]: readOnly,
369
- [`${prefix}--number--light`]: light,
370
- [`${prefix}--number--nolabel`]: hideLabel,
371
- [`${prefix}--number--nosteppers`]: hideSteppers,
372
- [`${prefix}--number--${size}`]: size
373
- });
374
- const isInputValid = getInputValidity({
375
- allowEmpty,
376
- invalid,
377
- value: validate ? inputValue : type === 'number' ? value : numberValue,
378
- max,
379
- min,
380
- validate,
381
- locale
382
- });
383
- const normalizedProps = useNormalizedInputProps({
384
- id,
385
- readOnly,
386
- disabled,
387
- invalid: !isInputValid,
388
- invalidText,
389
- warn,
390
- warnText
391
- });
392
- const [incrementNumLabel, decrementNumLabel] = [t('increment.number'), t('decrement.number')];
393
- const wrapperClasses = cx(`${prefix}--number__input-wrapper`, {
394
- [`${prefix}--number__input-wrapper--warning`]: normalizedProps.warn,
395
- [`${prefix}--number__input-wrapper--slug`]: slug,
396
- [`${prefix}--number__input-wrapper--decorator`]: decorator
397
- });
398
- const iconClasses = cx({
399
- [`${prefix}--number__invalid`]: normalizedProps.invalid || normalizedProps.warn,
400
- [`${prefix}--number__invalid--warning`]: normalizedProps.warn
401
- });
402
- useEffect(() => {
403
- if (type === 'number' && controlledValue !== undefined) {
404
- if (allowEmpty && controlledValue === '') {
405
- setValue('');
406
- } else {
407
- setValue(controlledValue);
408
- }
409
- setPrevControlledValue(controlledValue);
410
- }
411
- }, [controlledValue, type, allowEmpty]);
412
- let ariaDescribedBy = undefined;
413
- if (normalizedProps.invalid) {
414
- ariaDescribedBy = normalizedProps.invalidId;
415
- }
416
- if (normalizedProps.warn) {
417
- ariaDescribedBy = normalizedProps.warnId;
418
- }
419
- if (!normalizedProps.validation) {
420
- ariaDescribedBy = helperText ? normalizedProps.helperId : undefined;
421
- }
422
- function handleOnChange(event) {
423
- if (disabled) {
424
- return;
425
- }
426
- if (type === 'number') {
427
- const state = {
428
- value: allowEmpty && event.target.value === '' ? '' : Number(event.target.value),
429
- direction: value < event.target.value ? 'up' : 'down'
430
- };
431
- setValue(state.value);
432
- if (onChange) {
433
- onChange(event, state);
434
- }
435
- return;
436
- }
437
- if (type === 'text') {
438
- const _value = allowEmpty && event.target.value === '' ? '' : event.target.value;
439
- setNumberValue(numberParser.parse(_value));
440
- setInputValue(_value);
441
- // The onChange prop isn't called here because it will be called on blur
442
- // or on click of a stepper, after the number is parsed and formatted
443
- // according to the locale.
444
- }
445
- }
446
- const handleFocus = evt => {
447
- if ('type' in evt.target && evt.target.type === 'button') {
448
- setIsFocused(false);
449
- } else {
450
- setIsFocused(evt.type === 'focus');
451
- }
452
- };
453
- const outerElementClasses = cx(`${prefix}--form-item`, {
454
- ...(customClassName ? {
455
- [customClassName]: true
456
- } : {}),
457
- [`${prefix}--number-input--fluid--invalid`]: isFluid && normalizedProps.invalid,
458
- [`${prefix}--number-input--fluid--focus`]: isFluid && isFocused,
459
- [`${prefix}--number-input--fluid--disabled`]: isFluid && disabled
460
- });
461
-
462
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
463
- const Icon = normalizedProps.icon;
464
- const getDecimalPlaces = num => {
465
- const parts = num.toString().split('.');
466
- return parts[1] ? parts[1].length : 0;
467
- };
468
- const handleStep = (event, direction) => {
469
- if (inputRef.current) {
470
- const currentValue = type === 'number' ? Number(inputRef.current.value) : numberValue;
471
- let rawValue;
472
- if (Number.isNaN(currentValue) || !currentValue) {
473
- if (typeof stepStartValue === 'number' && stepStartValue) {
474
- rawValue = stepStartValue;
475
- } else if (min && min < 0 && max && max > 0 || !max && !min || max) {
476
- if (direction === `up`) rawValue = 1;
477
- if (direction === `down`) rawValue = -1;
478
- } else if (min && min > 0 && max && max > 0 || min) {
479
- rawValue = min;
480
- } else {
481
- rawValue = 0;
482
- }
483
- } else if (direction === 'up') {
484
- rawValue = currentValue + step;
485
- } else {
486
- rawValue = currentValue - step;
487
- }
488
- const precision = Math.max(getDecimalPlaces(currentValue), getDecimalPlaces(step));
489
- const floatValue = parseFloat(Number(rawValue).toFixed(precision));
490
- const newValue = clamp(floatValue, min ?? -Infinity, max ?? Infinity);
491
- const state = {
492
- value: newValue,
493
- direction
494
- };
495
- if (type === 'number') {
496
- setValue(state.value);
497
- }
498
- if (type === 'text') {
499
- // Calling format() can alter the number (such as rounding it) causing
500
- // the numberValue to mismatch the formatted value in the input.
501
- // To avoid this, the newValue is re-parsed after formatting.
502
- const formattedNewValue = format(newValue);
503
- const parsedFormattedNewValue = numberParser.parse(formattedNewValue);
504
-
505
- // When isControlled, setNumberValue will not actually update
506
- // numberValue in useControllableState.
507
- setNumberValue(parsedFormattedNewValue);
508
- setInputValue(formattedNewValue);
509
- previousNumberValue.current = parsedFormattedNewValue;
510
- }
511
- if (onChange) {
512
- onChange(event, state);
513
- }
514
- return state;
515
- }
516
- };
517
- const handleStepperClick = (event, direction) => {
518
- if (inputRef.current) {
519
- const state = handleStep(event, direction);
520
- if (onClick) {
521
- onClick(event, state);
522
- }
523
- }
524
- };
525
-
526
- // AILabel always size `mini`
527
- const candidate = slug ?? decorator;
528
- const candidateIsAILabel = isComponentElement(candidate, AILabel);
529
- const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/cloneElement(candidate, {
530
- size: 'mini'
531
- }) : candidate;
532
-
533
- // Need to update the internal value when the revert button is clicked
534
- const isRevertActive = isComponentElement(normalizedDecorator, AILabel) ? normalizedDecorator.props.revertActive : undefined;
535
- useEffect(() => {
536
- if (!isRevertActive && slug && defaultValue) {
537
- setValue(defaultValue);
538
- }
539
- }, [defaultValue, isRevertActive, slug]);
540
- return /*#__PURE__*/React.createElement("div", {
541
- className: outerElementClasses,
542
- onFocus: isFluid ? handleFocus : undefined,
543
- onBlur: isFluid ? handleFocus : undefined
544
- }, /*#__PURE__*/React.createElement("div", {
545
- className: numberInputClasses,
546
- "data-invalid": normalizedProps.invalid ? true : undefined
547
- }, /*#__PURE__*/React.createElement(Label, {
548
- disabled: normalizedProps.disabled,
549
- hideLabel: hideLabel,
550
- id: id,
551
- label: label
552
- }), /*#__PURE__*/React.createElement("div", {
553
- className: wrapperClasses
554
- }, /*#__PURE__*/React.createElement("input", _extends({}, rest, {
555
- "data-invalid": normalizedProps.invalid ? true : undefined,
556
- "aria-invalid": normalizedProps.invalid,
557
- "aria-describedby": ariaDescribedBy,
558
- "aria-readonly": readOnly,
559
- disabled: normalizedProps.disabled,
560
- ref: ref,
561
- id: id,
562
- max: max,
563
- min: min,
564
- onClick: onClick,
565
- onChange: handleOnChange,
566
- onKeyUp: onKeyUp,
567
- onKeyDown: e => {
568
- if (type === 'text') {
569
- if (match(e, ArrowUp)) {
570
- handleStep(e, 'up');
571
- } else if (match(e, ArrowDown)) {
572
- handleStep(e, 'down');
573
- }
574
- }
575
- if (rest?.onKeyDown) {
576
- rest?.onKeyDown(e);
577
- }
578
- },
579
- onFocus: e => {
580
- if (disableWheelProp) {
581
- e.target.addEventListener('wheel', disableWheel);
582
- }
583
- if (rest.onFocus) {
584
- rest.onFocus(e);
585
- }
586
- },
587
- onBlur: e => {
588
- if (disableWheelProp) {
589
- e.target.removeEventListener('wheel', disableWheel);
590
- }
591
- let parsedValueForBlur;
592
- if (type === 'text') {
593
- // When isControlled, the current inputValue needs re-parsed
594
- // because the consumer's onChange hasn't been called yet and
595
- // the `numberValue` we have in state is the (stale) value
596
- // they've passed in.
597
- const _numberValue = isControlled ? numberParser.parse(inputValue) : numberValue;
598
- const formattedValue = isNaN(_numberValue) ? '' : format(_numberValue);
599
- const rawValue = e.target.value;
600
- // Validate raw input
601
- const isValid = validate ? validate(rawValue, locale) : true;
602
- setInputValue(isValid ? formattedValue : rawValue);
603
- // Calling format() can alter the number (such as rounding it)
604
- // causing the _numberValue to mismatch the formatted value in
605
- // the input. To avoid this, formattedValue is re-parsed.
606
- const parsedFormattedNewValue = numberParser.parse(formattedValue);
607
- parsedValueForBlur = parsedFormattedNewValue;
608
- if (onChange && isValid) {
609
- const state = {
610
- value: parsedFormattedNewValue,
611
- direction: previousNumberValue.current < parsedFormattedNewValue ? 'up' : 'down'
612
- };
613
-
614
- // If the old and new values are NaN, don't call onChange
615
- // to avoid an unnecessary re-render and potential infinite
616
- // loop when isControlled.
617
- if (!(isNaN(previousNumberValue.current) && isNaN(parsedFormattedNewValue))) {
618
- onChange(e, state);
619
- }
620
- }
621
-
622
- // If the old and new values are NaN, don't set state to avoid
623
- // an unnecessary re-render and potential infinite loop when
624
- // isControlled.
625
- if (!(isNaN(previousNumberValue.current) && isNaN(numberValue))) {
626
- previousNumberValue.current = numberValue;
627
- }
628
- if (!(isNaN(numberValue) && isNaN(parsedFormattedNewValue))) {
629
- setNumberValue(parsedFormattedNewValue);
630
- }
631
- }
632
- if (onBlur) {
633
- if (type === 'number') {
634
- onBlur(e, value);
635
- return;
636
- }
637
- const parsedTextValue = parsedValueForBlur ?? (isControlled ? numberParser.parse(inputValue) : numberValue);
638
- onBlur(e, parsedTextValue);
639
- }
640
- },
641
- pattern: pattern,
642
- inputMode: inputMode,
643
- readOnly: readOnly,
644
- step: step,
645
- type: type,
646
- value: type === 'number' ? value : inputValue
647
- })), slug ? normalizedDecorator : decorator ? /*#__PURE__*/React.createElement("div", {
648
- className: `${prefix}--number__input-inner-wrapper--decorator`
649
- }, normalizedDecorator) : '', Icon ? /*#__PURE__*/React.createElement(Icon, {
650
- className: iconClasses
651
- }) : null, !hideSteppers && /*#__PURE__*/React.createElement("div", {
652
- className: `${prefix}--number__controls`
653
- }, /*#__PURE__*/React.createElement("button", {
654
- "aria-label": decrementNumLabel || iconDescription,
655
- className: `${prefix}--number__control-btn down-icon`,
656
- disabled: disabled || readOnly,
657
- onClick: event => handleStepperClick(event, 'down'),
658
- onBlur: onStepperBlur,
659
- tabIndex: -1,
660
- title: decrementNumLabel || iconDescription,
661
- type: "button"
662
- }, _Subtract || (_Subtract = /*#__PURE__*/React.createElement(Subtract, {
663
- className: "down-icon"
664
- }))), /*#__PURE__*/React.createElement("div", {
665
- className: `${prefix}--number__rule-divider`
666
- }), /*#__PURE__*/React.createElement("button", {
667
- "aria-label": incrementNumLabel || iconDescription,
668
- className: `${prefix}--number__control-btn up-icon`,
669
- disabled: disabled || readOnly,
670
- onClick: event => handleStepperClick(event, 'up'),
671
- onBlur: onStepperBlur,
672
- tabIndex: -1,
673
- title: incrementNumLabel || iconDescription,
674
- type: "button"
675
- }, _Add || (_Add = /*#__PURE__*/React.createElement(Add, {
676
- className: "up-icon"
677
- }))), /*#__PURE__*/React.createElement("div", {
678
- className: `${prefix}--number__rule-divider`
679
- }))), isFluid && /*#__PURE__*/React.createElement("hr", {
680
- className: `${prefix}--number-input__divider`
681
- }), normalizedProps.validation ? normalizedProps.validation : /*#__PURE__*/React.createElement(HelperText, {
682
- id: normalizedProps.helperId,
683
- disabled: disabled,
684
- description: helperText
685
- })));
162
+ const NumberInput = React.forwardRef((props, forwardRef) => {
163
+ const { allowEmpty = false, className: customClassName, decorator, disabled = false, disableWheel: disableWheelProp = false, formatOptions, helperText = "", hideLabel = false, hideSteppers, iconDescription, id, inputMode = "decimal", invalid = false, invalidText, label, light, locale = "en-US", max, min, onBlur, onStepperBlur, onChange, onClick, onKeyUp, pattern = "[0-9]*", readOnly, size = "md", slug, step = 1, translateWithId: t = defaultTranslateWithId, type = "number", defaultValue = type === "number" ? 0 : NaN, validate, warn = false, warnText = "", stepStartValue = 0, value: controlledValue, ...rest } = props;
164
+ const prefix = usePrefix();
165
+ const { isFluid } = useContext(FormContext);
166
+ const [isFocused, setIsFocused] = useState(false);
167
+ /**
168
+ * The input value, only used when type=number
169
+ */
170
+ const [value, setValue] = useState(() => {
171
+ if (controlledValue !== void 0) return controlledValue;
172
+ if (defaultValue !== void 0) return defaultValue;
173
+ if (allowEmpty) return "";
174
+ return 0;
175
+ });
176
+ const numberParser = useMemo(() => new NumberParser(locale, formatOptions), [locale, formatOptions]);
177
+ /**
178
+ * The currently parsed number value.
179
+ * Only used when type=text
180
+ * Updated based on the `value` as the user types.
181
+ */
182
+ const [numberValue, setNumberValue, isControlled] = useControllableState({
183
+ name: "NumberInput",
184
+ defaultValue: typeof defaultValue === "string" ? numberParser.parse(defaultValue) : defaultValue,
185
+ value: typeof controlledValue === "string" ? numberParser.parse(controlledValue) : controlledValue
186
+ });
187
+ /**
188
+ * The number value that was previously "committed" to the input on blur
189
+ * Only used when type="text"
190
+ */
191
+ const previousNumberValue = useRef(numberValue);
192
+ /**
193
+ * The current text value of the input.
194
+ * Only used when type=text
195
+ * Updated as the user types and formatted on blur.
196
+ */
197
+ const [inputValue, setInputValue] = React.useState(() => isNaN(numberValue) ? "" : new NumberFormatter(locale, formatOptions).format(numberValue));
198
+ const numberingSystem = useMemo(() => numberParser.getNumberingSystem(inputValue), [numberParser, inputValue]);
199
+ const numberFormatter = useMemo(() => new NumberFormatter(locale, {
200
+ ...formatOptions,
201
+ numberingSystem
202
+ }), [
203
+ locale,
204
+ formatOptions,
205
+ numberingSystem
206
+ ]);
207
+ const format = useCallback((value) => isNaN(value) || value === null ? "" : numberFormatter.format(value), [numberFormatter]);
208
+ useEffect(() => {
209
+ if (isControlled && !(isNaN(previousNumberValue.current) && isNaN(numberValue)) && previousNumberValue.current !== numberValue) {
210
+ setInputValue(format(numberValue));
211
+ previousNumberValue.current = numberValue;
212
+ }
213
+ }, [
214
+ isControlled,
215
+ numberValue,
216
+ format
217
+ ]);
218
+ const inputRef = useRef(null);
219
+ const ref = useMergedRefs([forwardRef, inputRef]);
220
+ const numberInputClasses = classNames({
221
+ [`${prefix}--number`]: true,
222
+ [`${prefix}--number--helpertext`]: true,
223
+ [`${prefix}--number--readonly`]: readOnly,
224
+ [`${prefix}--number--light`]: light,
225
+ [`${prefix}--number--nolabel`]: hideLabel,
226
+ [`${prefix}--number--nosteppers`]: hideSteppers,
227
+ [`${prefix}--number--${size}`]: size
228
+ });
229
+ const normalizedProps = useNormalizedInputProps({
230
+ id,
231
+ readOnly,
232
+ disabled,
233
+ invalid: !getInputValidity({
234
+ allowEmpty,
235
+ invalid,
236
+ value: validate ? inputValue : type === "number" ? value : numberValue,
237
+ max,
238
+ min,
239
+ validate,
240
+ locale
241
+ }),
242
+ invalidText,
243
+ warn,
244
+ warnText
245
+ });
246
+ const [incrementNumLabel, decrementNumLabel] = [t("increment.number"), t("decrement.number")];
247
+ const wrapperClasses = classNames(`${prefix}--number__input-wrapper`, {
248
+ [`${prefix}--number__input-wrapper--warning`]: normalizedProps.warn,
249
+ [`${prefix}--number__input-wrapper--slug`]: slug,
250
+ [`${prefix}--number__input-wrapper--decorator`]: decorator
251
+ });
252
+ const iconClasses = classNames({
253
+ [`${prefix}--number__invalid`]: normalizedProps.invalid || normalizedProps.warn,
254
+ [`${prefix}--number__invalid--warning`]: normalizedProps.warn
255
+ });
256
+ useEffect(() => {
257
+ if (type === "number" && controlledValue !== void 0) if (allowEmpty && controlledValue === "") setValue("");
258
+ else setValue(controlledValue);
259
+ }, [
260
+ controlledValue,
261
+ type,
262
+ allowEmpty
263
+ ]);
264
+ let ariaDescribedBy = void 0;
265
+ if (normalizedProps.invalid) ariaDescribedBy = normalizedProps.invalidId;
266
+ if (normalizedProps.warn) ariaDescribedBy = normalizedProps.warnId;
267
+ if (!normalizedProps.validation) ariaDescribedBy = helperText ? normalizedProps.helperId : void 0;
268
+ function handleOnChange(event) {
269
+ if (disabled) return;
270
+ if (type === "number") {
271
+ const state = {
272
+ value: allowEmpty && event.target.value === "" ? "" : Number(event.target.value),
273
+ direction: value < event.target.value ? "up" : "down"
274
+ };
275
+ setValue(state.value);
276
+ if (onChange) onChange(event, state);
277
+ return;
278
+ }
279
+ if (type === "text") {
280
+ const _value = allowEmpty && event.target.value === "" ? "" : event.target.value;
281
+ setNumberValue(numberParser.parse(_value));
282
+ setInputValue(_value);
283
+ }
284
+ }
285
+ const handleFocus = (evt) => {
286
+ if ("type" in evt.target && evt.target.type === "button") setIsFocused(false);
287
+ else setIsFocused(evt.type === "focus");
288
+ };
289
+ const outerElementClasses = classNames(`${prefix}--form-item`, {
290
+ ...customClassName ? { [customClassName]: true } : {},
291
+ [`${prefix}--number-input--fluid--invalid`]: isFluid && normalizedProps.invalid,
292
+ [`${prefix}--number-input--fluid--focus`]: isFluid && isFocused,
293
+ [`${prefix}--number-input--fluid--disabled`]: isFluid && disabled
294
+ });
295
+ const Icon = normalizedProps.icon;
296
+ const getDecimalPlaces = (num) => {
297
+ const parts = num.toString().split(".");
298
+ return parts[1] ? parts[1].length : 0;
299
+ };
300
+ const handleStep = (event, direction) => {
301
+ if (inputRef.current) {
302
+ const currentValue = type === "number" ? Number(inputRef.current.value) : numberValue;
303
+ let rawValue;
304
+ if (Number.isNaN(currentValue) || !currentValue) if (typeof stepStartValue === "number" && stepStartValue) rawValue = stepStartValue;
305
+ else if (min && min < 0 && max && max > 0 || !max && !min || max) {
306
+ if (direction === `up`) rawValue = 1;
307
+ if (direction === `down`) rawValue = -1;
308
+ } else if (min && min > 0 && max && max > 0 || min) rawValue = min;
309
+ else rawValue = 0;
310
+ else if (direction === "up") rawValue = currentValue + step;
311
+ else rawValue = currentValue - step;
312
+ const precision = Math.max(getDecimalPlaces(currentValue), getDecimalPlaces(step));
313
+ const newValue = clamp(parseFloat(Number(rawValue).toFixed(precision)), min ?? -Infinity, max ?? Infinity);
314
+ const state = {
315
+ value: newValue,
316
+ direction
317
+ };
318
+ if (type === "number") setValue(state.value);
319
+ if (type === "text") {
320
+ const formattedNewValue = format(newValue);
321
+ const parsedFormattedNewValue = numberParser.parse(formattedNewValue);
322
+ setNumberValue(parsedFormattedNewValue);
323
+ setInputValue(formattedNewValue);
324
+ previousNumberValue.current = parsedFormattedNewValue;
325
+ }
326
+ if (onChange) onChange(event, state);
327
+ return state;
328
+ }
329
+ };
330
+ const handleStepperClick = (event, direction) => {
331
+ if (inputRef.current) {
332
+ const state = handleStep(event, direction);
333
+ if (onClick) onClick(event, state);
334
+ }
335
+ };
336
+ const candidate = slug ?? decorator;
337
+ const normalizedDecorator = isComponentElement(candidate, AILabel) ? cloneElement(candidate, { size: "mini" }) : candidate;
338
+ const isRevertActive = isComponentElement(normalizedDecorator, AILabel) ? normalizedDecorator.props.revertActive : void 0;
339
+ useEffect(() => {
340
+ if (!isRevertActive && slug && defaultValue) setValue(defaultValue);
341
+ }, [
342
+ defaultValue,
343
+ isRevertActive,
344
+ slug
345
+ ]);
346
+ return /* @__PURE__ */ jsx("div", {
347
+ className: outerElementClasses,
348
+ onFocus: isFluid ? handleFocus : void 0,
349
+ onBlur: isFluid ? handleFocus : void 0,
350
+ children: /* @__PURE__ */ jsxs("div", {
351
+ className: numberInputClasses,
352
+ "data-invalid": normalizedProps.invalid ? true : void 0,
353
+ children: [
354
+ /* @__PURE__ */ jsx(Label, {
355
+ disabled: normalizedProps.disabled,
356
+ hideLabel,
357
+ id,
358
+ label
359
+ }),
360
+ /* @__PURE__ */ jsxs("div", {
361
+ className: wrapperClasses,
362
+ children: [
363
+ /* @__PURE__ */ jsx("input", {
364
+ ...rest,
365
+ "data-invalid": normalizedProps.invalid ? true : void 0,
366
+ "aria-invalid": normalizedProps.invalid,
367
+ "aria-describedby": ariaDescribedBy,
368
+ "aria-readonly": readOnly,
369
+ disabled: normalizedProps.disabled,
370
+ ref,
371
+ id,
372
+ max,
373
+ min,
374
+ onClick,
375
+ onChange: handleOnChange,
376
+ onKeyUp,
377
+ onKeyDown: (e) => {
378
+ if (type === "text") {
379
+ if (match(e, ArrowUp$1)) handleStep(e, "up");
380
+ else if (match(e, ArrowDown)) handleStep(e, "down");
381
+ }
382
+ if (rest?.onKeyDown) rest?.onKeyDown(e);
383
+ },
384
+ onFocus: (e) => {
385
+ if (disableWheelProp) e.target.addEventListener("wheel", disableWheel);
386
+ if (rest.onFocus) rest.onFocus(e);
387
+ },
388
+ onBlur: (e) => {
389
+ if (disableWheelProp) e.target.removeEventListener("wheel", disableWheel);
390
+ let parsedValueForBlur;
391
+ if (type === "text") {
392
+ const _numberValue = isControlled ? numberParser.parse(inputValue) : numberValue;
393
+ const formattedValue = isNaN(_numberValue) ? "" : format(_numberValue);
394
+ const rawValue = e.target.value;
395
+ const isValid = validate ? validate(rawValue, locale) : true;
396
+ setInputValue(isValid ? formattedValue : rawValue);
397
+ const parsedFormattedNewValue = numberParser.parse(formattedValue);
398
+ parsedValueForBlur = parsedFormattedNewValue;
399
+ if (onChange && isValid) {
400
+ const state = {
401
+ value: parsedFormattedNewValue,
402
+ direction: previousNumberValue.current < parsedFormattedNewValue ? "up" : "down"
403
+ };
404
+ if (!(isNaN(previousNumberValue.current) && isNaN(parsedFormattedNewValue))) onChange(e, state);
405
+ }
406
+ if (!(isNaN(previousNumberValue.current) && isNaN(numberValue))) previousNumberValue.current = numberValue;
407
+ if (!(isNaN(numberValue) && isNaN(parsedFormattedNewValue))) setNumberValue(parsedFormattedNewValue);
408
+ }
409
+ if (onBlur) {
410
+ if (type === "number") {
411
+ onBlur(e, value);
412
+ return;
413
+ }
414
+ onBlur(e, parsedValueForBlur ?? (isControlled ? numberParser.parse(inputValue) : numberValue));
415
+ }
416
+ },
417
+ pattern,
418
+ inputMode,
419
+ readOnly,
420
+ step,
421
+ type,
422
+ value: type === "number" ? value : inputValue
423
+ }),
424
+ slug ? normalizedDecorator : decorator ? /* @__PURE__ */ jsx("div", {
425
+ className: `${prefix}--number__input-inner-wrapper--decorator`,
426
+ children: normalizedDecorator
427
+ }) : "",
428
+ Icon ? /* @__PURE__ */ jsx(Icon, { className: iconClasses }) : null,
429
+ !hideSteppers && /* @__PURE__ */ jsxs("div", {
430
+ className: `${prefix}--number__controls`,
431
+ children: [
432
+ /* @__PURE__ */ jsx("button", {
433
+ "aria-label": decrementNumLabel || iconDescription,
434
+ className: `${prefix}--number__control-btn down-icon`,
435
+ disabled: disabled || readOnly,
436
+ onClick: (event) => handleStepperClick(event, "down"),
437
+ onBlur: onStepperBlur,
438
+ tabIndex: -1,
439
+ title: decrementNumLabel || iconDescription,
440
+ type: "button",
441
+ children: /* @__PURE__ */ jsx(Subtract, { className: "down-icon" })
442
+ }),
443
+ /* @__PURE__ */ jsx("div", { className: `${prefix}--number__rule-divider` }),
444
+ /* @__PURE__ */ jsx("button", {
445
+ "aria-label": incrementNumLabel || iconDescription,
446
+ className: `${prefix}--number__control-btn up-icon`,
447
+ disabled: disabled || readOnly,
448
+ onClick: (event) => handleStepperClick(event, "up"),
449
+ onBlur: onStepperBlur,
450
+ tabIndex: -1,
451
+ title: incrementNumLabel || iconDescription,
452
+ type: "button",
453
+ children: /* @__PURE__ */ jsx(Add, { className: "up-icon" })
454
+ }),
455
+ /* @__PURE__ */ jsx("div", { className: `${prefix}--number__rule-divider` })
456
+ ]
457
+ })
458
+ ]
459
+ }),
460
+ isFluid && /* @__PURE__ */ jsx("hr", { className: `${prefix}--number-input__divider` }),
461
+ normalizedProps.validation ? normalizedProps.validation : /* @__PURE__ */ jsx(HelperText, {
462
+ id: normalizedProps.helperId,
463
+ disabled,
464
+ description: helperText
465
+ })
466
+ ]
467
+ })
468
+ });
686
469
  });
687
470
  NumberInput.propTypes = {
688
- /**
689
- * `true` to allow empty string.
690
- */
691
- allowEmpty: PropTypes.bool,
692
- /**
693
- * Specify an optional className to be applied to the wrapper node
694
- */
695
- className: PropTypes.string,
696
- /**
697
- * **Experimental**: Provide a `decorator` component to be rendered inside the `NumberInput` component
698
- */
699
- decorator: PropTypes.node,
700
- /**
701
- * Optional starting value for uncontrolled state
702
- */
703
- defaultValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
704
- /**
705
- * Specify if the wheel functionality for the input should be disabled, or no t
706
- */
707
- disableWheel: PropTypes.bool,
708
- /**
709
- * Specify if the control should be disabled, or not
710
- */
711
- disabled: PropTypes.bool,
712
- /**
713
- * **Experimental:** Specify Intl.NumberFormat options applied to internal
714
- * number parsing and formatting. Use with `type="text"`, has no effect when
715
- * `type="number"`.
716
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options
717
- */
718
- formatOptions: NumberFormatOptionsPropType,
719
- /**
720
- * Provide text that is used alongside the control label for additional help
721
- */
722
- helperText: PropTypes.node,
723
- /**
724
- * Specify whether you want the underlying label to be visually hidden
725
- */
726
- hideLabel: PropTypes.bool,
727
- /**
728
- * Specify whether you want the steppers to be hidden
729
- */
730
- hideSteppers: PropTypes.bool,
731
- /**
732
- * Provide a description for up/down icons that can be read by screen readers
733
- */
734
- iconDescription: PropTypes.string,
735
- /**
736
- * Specify a custom `id` for the input
737
- */
738
- id: PropTypes.string.isRequired,
739
- /**
740
- * Instruct the browser which keyboard to display on mobile devices. Defaults
741
- * to `decimal`, but note that standard numeric keyboards vary across devices
742
- * and operating systems.
743
- * @see https://css-tricks.com/everything-you-ever-wanted-to-know-about-inputmode/
744
- */
745
- inputMode: PropTypes.oneOf(['none', 'text', 'tel', 'url', 'email', 'numeric', 'decimal', 'search']),
746
- /**
747
- * Specify if the currently value is invalid.
748
- */
749
- invalid: PropTypes.bool,
750
- /**
751
- * Message which is displayed if the value is invalid.
752
- */
753
- invalidText: PropTypes.node,
754
- /**
755
- * Generic `label` that will be used as the textual representation of what
756
- * this field is for
757
- */
758
- label: PropTypes.node,
759
- /**
760
- * `true` to use the light version.
761
- */
762
- light: deprecate(PropTypes.bool, 'The `light` prop for `NumberInput` is no longer needed and has ' + 'been deprecated in v11 in favor of the new `Layer` component. It will be moved in the next major release.'),
763
- /**
764
- * **Experimental:** Specify a [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt)
765
- * language code for parsing and formatting. Use with `type="text"`, has no
766
- * effect when `type="number"`.
767
- */
768
- locale: PropTypes.string,
769
- /**
770
- * The maximum value.
771
- */
772
- max: PropTypes.number,
773
- /**
774
- * The minimum value.
775
- */
776
- min: PropTypes.number,
777
- /**
778
- * Provide the value stepping should begin at when the input is empty
779
- */
780
- stepStartValue: PropTypes.number,
781
- /**
782
- * Provide an optional handler that is called when the input is blurred.
783
- */
784
- onBlur: PropTypes.func,
785
- /**
786
- * Provide an optional handler that is called when the stepper
787
- * buttons are blurred.
788
- */
789
- onStepperBlur: PropTypes.func,
790
- /**
791
- * Provide an optional handler that is called when the internal state of
792
- * NumberInput changes. This handler is called with event and state info.
793
- * When type="number", this is called on every change of the input.
794
- * When type="text", this is only called on blur after the number has been
795
- * parsed and formatted.
796
- * `(event, { value, direction }) => void`
797
- */
798
- onChange: PropTypes.func,
799
- /**
800
- * Provide an optional function to be called when the up/down button is clicked
801
- */
802
- onClick: PropTypes.func,
803
- /**
804
- * Provide an optional function to be called when a key is pressed in the number input
805
- */
806
- onKeyUp: PropTypes.func,
807
- /**
808
- * When type="text", provide an optional pattern to restrict user input. Has
809
- * no effect when type="number".
810
- */
811
- pattern: PropTypes.string,
812
- /**
813
- * Specify if the component should be read-only
814
- */
815
- readOnly: PropTypes.bool,
816
- /**
817
- * Specify the size of the Number Input.
818
- */
819
- size: PropTypes.oneOf(['sm', 'md', 'lg']),
820
- /**
821
- * **Experimental**: Provide a `Slug` component to be rendered inside the
822
- * `NumberInput` component
823
- */
824
- slug: deprecate(PropTypes.node, 'The `slug` prop for `NumberInput` is no longer needed and has ' + 'been deprecated in v11 in favor of the new `decorator` prop. It will be moved in the next major release.'),
825
- /**
826
- * Specify how much the values should increase/decrease upon clicking on
827
- * up/down button
828
- */
829
- step: PropTypes.number,
830
- /**
831
- * Translates component strings using your i18n tool.
832
- */
833
- translateWithId: PropTypes.func,
834
- /**
835
- * **Experimental**: Specify if the input should be of type text or number.
836
- * Use type="text" with `locale`, `formatOptions`, and guide user input with
837
- * `pattern` and `inputMode`.
838
- */
839
- type: PropTypes.oneOf(['number', 'text']),
840
- /**
841
- * Specify the value of the input
842
- */
843
- value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
844
- /**
845
- * Specify whether the control is currently in warning state
846
- */
847
- warn: PropTypes.bool,
848
- /**
849
- * Provide the text that is displayed when the control is in warning state
850
- */
851
- warnText: PropTypes.node,
852
- /**
853
- * Optional validation function that is called with the input value and locale.
854
- *
855
- * - Return `false` to immediately fail validation.
856
- * - Return `true` to pass this validation, but still run other checks (min, max, required, etc.).
857
- * - Return `undefined` to defer entirely to built-in validation logic.
858
- *
859
- * This is called before other validations, giving consumers the ability
860
- * to short-circuit or extend validation without replacing built-in rules.
861
- */
862
- validate: PropTypes.func
471
+ allowEmpty: PropTypes.bool,
472
+ className: PropTypes.string,
473
+ decorator: PropTypes.node,
474
+ defaultValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
475
+ disableWheel: PropTypes.bool,
476
+ disabled: PropTypes.bool,
477
+ formatOptions: NumberFormatOptionsPropType,
478
+ helperText: PropTypes.node,
479
+ hideLabel: PropTypes.bool,
480
+ hideSteppers: PropTypes.bool,
481
+ iconDescription: PropTypes.string,
482
+ id: PropTypes.string.isRequired,
483
+ inputMode: PropTypes.oneOf([
484
+ "none",
485
+ "text",
486
+ "tel",
487
+ "url",
488
+ "email",
489
+ "numeric",
490
+ "decimal",
491
+ "search"
492
+ ]),
493
+ invalid: PropTypes.bool,
494
+ invalidText: PropTypes.node,
495
+ label: PropTypes.node,
496
+ light: deprecate(PropTypes.bool, "The `light` prop for `NumberInput` is no longer needed and has been deprecated in v11 in favor of the new `Layer` component. It will be moved in the next major release."),
497
+ locale: PropTypes.string,
498
+ max: PropTypes.number,
499
+ min: PropTypes.number,
500
+ stepStartValue: PropTypes.number,
501
+ onBlur: PropTypes.func,
502
+ onStepperBlur: PropTypes.func,
503
+ onChange: PropTypes.func,
504
+ onClick: PropTypes.func,
505
+ onKeyUp: PropTypes.func,
506
+ pattern: PropTypes.string,
507
+ readOnly: PropTypes.bool,
508
+ size: PropTypes.oneOf([
509
+ "sm",
510
+ "md",
511
+ "lg"
512
+ ]),
513
+ slug: deprecate(PropTypes.node, "The `slug` prop for `NumberInput` is no longer needed and has been deprecated in v11 in favor of the new `decorator` prop. It will be moved in the next major release."),
514
+ step: PropTypes.number,
515
+ translateWithId: PropTypes.func,
516
+ type: PropTypes.oneOf(["number", "text"]),
517
+ value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
518
+ warn: PropTypes.bool,
519
+ warnText: PropTypes.node,
520
+ validate: PropTypes.func
863
521
  };
864
- const Label = ({
865
- disabled,
866
- id,
867
- hideLabel,
868
- label
869
- }) => {
870
- const prefix = usePrefix();
871
- const className = cx({
872
- [`${prefix}--label`]: true,
873
- [`${prefix}--label--disabled`]: disabled,
874
- [`${prefix}--visually-hidden`]: hideLabel
875
- });
876
- if (label) {
877
- return /*#__PURE__*/React.createElement(Text, {
878
- as: "label",
879
- htmlFor: id,
880
- className: className
881
- }, label);
882
- }
883
- return null;
522
+ const Label = ({ disabled, id, hideLabel, label }) => {
523
+ const prefix = usePrefix();
524
+ const className = classNames({
525
+ [`${prefix}--label`]: true,
526
+ [`${prefix}--label--disabled`]: disabled,
527
+ [`${prefix}--visually-hidden`]: hideLabel
528
+ });
529
+ if (label) return /* @__PURE__ */ jsx(Text, {
530
+ as: "label",
531
+ htmlFor: id,
532
+ className,
533
+ children: label
534
+ });
535
+ return null;
884
536
  };
885
- const HelperText = ({
886
- disabled,
887
- description,
888
- id
889
- }) => {
890
- const prefix = usePrefix();
891
- const className = cx(`${prefix}--form__helper-text`, {
892
- [`${prefix}--form__helper-text--disabled`]: disabled
893
- });
894
- if (description) {
895
- return /*#__PURE__*/React.createElement(Text, {
896
- as: "div",
897
- id: id,
898
- className: className
899
- }, description);
900
- }
901
- return null;
537
+ const HelperText = ({ disabled, description, id }) => {
538
+ const prefix = usePrefix();
539
+ const className = classNames(`${prefix}--form__helper-text`, { [`${prefix}--form__helper-text--disabled`]: disabled });
540
+ if (description) return /* @__PURE__ */ jsx(Text, {
541
+ as: "div",
542
+ id,
543
+ className,
544
+ children: description
545
+ });
546
+ return null;
902
547
  };
903
-
904
548
  /**
905
- * Determine if the given value is invalid based on the given max, min and
906
- * conditions like `allowEmpty`. If `invalid` is passed through, it will default
907
- * to false.
908
- *
909
- * @param {object} config
910
- * @param {boolean} config.allowEmpty
911
- * @param {boolean} config.invalid
912
- * @param {number} config.value
913
- * @param {number} config.max
914
- * @param {number} config.min
915
- * @param {Function} config.validate
916
- * @param {string} config.locale
917
- * @returns {boolean}
918
- */
919
- function getInputValidity({
920
- allowEmpty,
921
- invalid,
922
- value,
923
- max,
924
- min,
925
- validate,
926
- locale
927
- }) {
928
- if (invalid) {
929
- return false;
930
- }
931
-
932
- // Skip validation if value is empty and allowEmpty
933
- if (value === '') return allowEmpty;
934
-
935
- // Normalize the value
936
- let numericValue;
937
- if (typeof value === 'string') {
938
- numericValue = parseNumberWithLocale(value, locale); // safe: handles Arabic, Kanji, etc.
939
- } else {
940
- numericValue = value;
941
- }
942
-
943
- // Use custom validate ONLY for formatting, not numeric comparison
944
- if (validate && typeof value === 'string') {
945
- const isFormatValid = validate(value, locale);
946
- if (isFormatValid === false) {
947
- return false; // invalid format
948
- }
949
- }
950
-
951
- // Check min/max bounds
952
- if (max !== undefined && numericValue > max) return false;
953
- if (min !== undefined && numericValue < min) return false;
954
- return true; // valid
549
+ * Determine if the given value is invalid based on the given max, min and
550
+ * conditions like `allowEmpty`. If `invalid` is passed through, it will default
551
+ * to false.
552
+ *
553
+ * @param {object} config
554
+ * @param {boolean} config.allowEmpty
555
+ * @param {boolean} config.invalid
556
+ * @param {number} config.value
557
+ * @param {number} config.max
558
+ * @param {number} config.min
559
+ * @param {Function} config.validate
560
+ * @param {string} config.locale
561
+ * @returns {boolean}
562
+ */
563
+ function getInputValidity({ allowEmpty, invalid, value, max, min, validate, locale }) {
564
+ if (invalid) return false;
565
+ if (value === "") return allowEmpty;
566
+ let numericValue;
567
+ if (typeof value === "string") numericValue = parseNumberWithLocale(value, locale);
568
+ else numericValue = value;
569
+ if (validate && typeof value === "string") {
570
+ if (validate(value, locale) === false) return false;
571
+ }
572
+ if (max !== void 0 && numericValue > max) return false;
573
+ if (min !== void 0 && numericValue < min) return false;
574
+ return true;
955
575
  }
956
-
957
576
  /**
958
- * It prevents any wheel event from emitting.
959
- *
960
- * We want to prevent this input field from changing by the user accidentally
961
- * when the user scrolling up or down in a long form. So we prevent the default
962
- * behavior of wheel events when it is focused.
963
- *
964
- * Because React uses passive event handler by default, we can't just call
965
- * `preventDefault` in the `onWheel` event handler. So we have to get the input
966
- * ref and add our event handler manually.
967
- *
968
- * @see https://github.com/facebook/react/pull/19654
969
- * @param {WheelEvent} e A wheel event.
970
- */
577
+ * It prevents any wheel event from emitting.
578
+ *
579
+ * We want to prevent this input field from changing by the user accidentally
580
+ * when the user scrolling up or down in a long form. So we prevent the default
581
+ * behavior of wheel events when it is focused.
582
+ *
583
+ * Because React uses passive event handler by default, we can't just call
584
+ * `preventDefault` in the `onWheel` event handler. So we have to get the input
585
+ * ref and add our event handler manually.
586
+ *
587
+ * @see https://github.com/facebook/react/pull/19654
588
+ * @param {WheelEvent} e A wheel event.
589
+ */
971
590
  function disableWheel(e) {
972
- e.preventDefault();
591
+ e.preventDefault();
973
592
  }
974
593
 
975
- export { NumberInput, parseNumberWithLocale, validateNumberSeparators };
594
+ //#endregion
595
+ export { NumberInput, validateNumberSeparators };