@carbon/react 1.103.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 (769) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +956 -956
  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.js +485 -752
  89. package/es/components/DatePicker/DatePickerLocales.js +75 -126
  90. package/es/components/DatePicker/index.js +13 -5
  91. package/es/components/DatePicker/plugins/appendToPlugin.js +31 -45
  92. package/es/components/DatePicker/plugins/fixEventsPlugin.js +127 -171
  93. package/es/components/DatePicker/plugins/rangePlugin.js +40 -48
  94. package/es/components/DatePicker/utils.js +11 -3
  95. package/es/components/DatePickerInput/DatePickerInput.js +179 -289
  96. package/es/components/DatePickerInput/index.js +12 -4
  97. package/es/components/Dialog/Dialog.js +303 -574
  98. package/es/components/Dialog/index.js +18 -2
  99. package/es/components/Dropdown/Dropdown.Skeleton.js +26 -38
  100. package/es/components/Dropdown/Dropdown.js +344 -535
  101. package/es/components/Dropdown/index.js +13 -5
  102. package/es/components/ErrorBoundary/ErrorBoundary.js +36 -58
  103. package/es/components/ErrorBoundary/ErrorBoundaryContext.js +14 -9
  104. package/es/components/ExpandableSearch/ExpandableSearch.js +60 -69
  105. package/es/components/ExpandableSearch/index.js +12 -4
  106. package/es/components/FeatureFlags/index.d.ts +11 -2
  107. package/es/components/FeatureFlags/index.js +79 -77
  108. package/es/components/FileUploader/FileUploader.Skeleton.js +35 -30
  109. package/es/components/FileUploader/FileUploader.js +269 -343
  110. package/es/components/FileUploader/FileUploaderButton.js +110 -160
  111. package/es/components/FileUploader/FileUploaderDropContainer.js +144 -221
  112. package/es/components/FileUploader/FileUploaderItem.js +138 -157
  113. package/es/components/FileUploader/Filename.d.ts +1 -1
  114. package/es/components/FileUploader/Filename.js +53 -72
  115. package/es/components/FluidComboBox/FluidComboBox.Skeleton.js +26 -28
  116. package/es/components/FluidComboBox/FluidComboBox.js +54 -105
  117. package/es/components/FluidDatePicker/FluidDatePicker.Skeleton.js +56 -53
  118. package/es/components/FluidDatePicker/FluidDatePicker.js +46 -68
  119. package/es/components/FluidDatePickerInput/FluidDatePickerInput.js +23 -16
  120. package/es/components/FluidDropdown/FluidDropdown.Skeleton.js +26 -28
  121. package/es/components/FluidDropdown/FluidDropdown.js +55 -111
  122. package/es/components/FluidForm/FluidForm.js +29 -31
  123. package/es/components/FluidForm/FormContext.js +12 -6
  124. package/es/components/FluidMultiSelect/FluidMultiSelect.Skeleton.js +26 -28
  125. package/es/components/FluidMultiSelect/FluidMultiSelect.js +67 -197
  126. package/es/components/FluidNumberInput/FluidNumberInput.Skeleton.js +27 -30
  127. package/es/components/FluidNumberInput/FluidNumberInput.js +63 -147
  128. package/es/components/FluidSearch/FluidSearch.Skeleton.js +27 -30
  129. package/es/components/FluidSearch/FluidSearch.js +41 -84
  130. package/es/components/FluidSelect/FluidSelect.Skeleton.js +26 -28
  131. package/es/components/FluidSelect/FluidSelect.js +40 -76
  132. package/es/components/FluidSelect/index.js +13 -5
  133. package/es/components/FluidTextArea/FluidTextArea.Skeleton.js +27 -30
  134. package/es/components/FluidTextArea/FluidTextArea.js +48 -112
  135. package/es/components/FluidTextInput/FluidPasswordInput.js +44 -99
  136. package/es/components/FluidTextInput/FluidTextInput.Skeleton.js +27 -30
  137. package/es/components/FluidTextInput/FluidTextInput.js +49 -104
  138. package/es/components/FluidTextInput/index.js +14 -6
  139. package/es/components/FluidTimePicker/FluidTimePicker.Skeleton.js +30 -33
  140. package/es/components/FluidTimePicker/FluidTimePicker.js +68 -115
  141. package/es/components/FluidTimePickerSelect/FluidTimePickerSelect.js +28 -47
  142. package/es/components/Form/Form.js +23 -25
  143. package/es/components/FormGroup/FormGroup.js +45 -67
  144. package/es/components/FormItem/FormItem.js +23 -25
  145. package/es/components/FormLabel/FormLabel.js +28 -34
  146. package/es/components/Grid/CSSGrid.d.ts +1 -1
  147. package/es/components/Grid/CSSGrid.js +85 -127
  148. package/es/components/Grid/Column.js +192 -324
  149. package/es/components/Grid/ColumnHang.js +28 -36
  150. package/es/components/Grid/FlexGrid.js +40 -60
  151. package/es/components/Grid/Grid.js +29 -42
  152. package/es/components/Grid/GridContext.js +36 -42
  153. package/es/components/Grid/Row.js +31 -49
  154. package/es/components/Heading/index.js +36 -51
  155. package/es/components/Icon/Icon.Skeleton.js +21 -21
  156. package/es/components/IconButton/index.js +117 -178
  157. package/es/components/IconIndicator/index.d.ts +1 -1
  158. package/es/components/IconIndicator/index.js +59 -60
  159. package/es/components/IdPrefix/index.js +21 -17
  160. package/es/components/InlineCheckbox/InlineCheckbox.js +69 -113
  161. package/es/components/InlineCheckbox/index.js +12 -4
  162. package/es/components/InlineLoading/InlineLoading.js +83 -100
  163. package/es/components/InlineLoading/index.js +12 -4
  164. package/es/components/Layer/LayerContext.js +12 -4
  165. package/es/components/Layer/LayerLevel.js +20 -4
  166. package/es/components/Layer/index.js +54 -66
  167. package/es/components/Layout/index.js +77 -109
  168. package/es/components/LayoutDirection/LayoutDirection.d.ts +1 -1
  169. package/es/components/LayoutDirection/LayoutDirection.js +33 -37
  170. package/es/components/LayoutDirection/LayoutDirectionContext.js +12 -6
  171. package/es/components/LayoutDirection/useLayoutDirection.js +15 -7
  172. package/es/components/Link/Link.js +63 -108
  173. package/es/components/Link/index.js +12 -4
  174. package/es/components/ListBox/ListBox.js +78 -126
  175. package/es/components/ListBox/ListBoxField.js +24 -43
  176. package/es/components/ListBox/ListBoxMenu.js +36 -42
  177. package/es/components/ListBox/ListBoxMenuIcon.js +39 -40
  178. package/es/components/ListBox/ListBoxMenuItem.js +67 -88
  179. package/es/components/ListBox/ListBoxPropTypes.js +17 -5
  180. package/es/components/ListBox/ListBoxSelection.js +71 -96
  181. package/es/components/ListBox/index.js +16 -14
  182. package/es/components/ListBox/next/ListBoxSelection.js +79 -117
  183. package/es/components/ListBox/next/ListBoxTrigger.js +44 -48
  184. package/es/components/ListItem/ListItem.js +25 -28
  185. package/es/components/Loading/Loading.js +64 -73
  186. package/es/components/Loading/index.js +12 -4
  187. package/es/components/Menu/Menu.js +220 -363
  188. package/es/components/Menu/MenuContext.d.ts +1 -1
  189. package/es/components/Menu/MenuContext.js +41 -38
  190. package/es/components/Menu/MenuItem.js +282 -413
  191. package/es/components/MenuButton/index.js +134 -195
  192. package/es/components/Modal/Modal.js +500 -660
  193. package/es/components/Modal/ModalPresence.js +39 -37
  194. package/es/components/Modal/index.js +13 -5
  195. package/es/components/ModalWrapper/ModalWrapper.d.ts +2 -2
  196. package/es/components/ModalWrapper/ModalWrapper.js +106 -130
  197. package/es/components/MultiSelect/FilterableMultiSelect.js +605 -918
  198. package/es/components/MultiSelect/MultiSelect.js +454 -716
  199. package/es/components/MultiSelect/MultiSelectPropTypes.js +13 -30
  200. package/es/components/MultiSelect/filter.js +14 -9
  201. package/es/components/MultiSelect/tools/sorting.js +21 -34
  202. package/es/components/Notification/Notification.js +508 -785
  203. package/es/components/NumberInput/NumberFormatPropTypes.js +69 -30
  204. package/es/components/NumberInput/NumberInput.Skeleton.js +29 -33
  205. package/es/components/NumberInput/NumberInput.js +567 -947
  206. package/es/components/OrderedList/OrderedList.js +31 -44
  207. package/es/components/OverflowMenu/OverflowMenu.js +335 -450
  208. package/es/components/OverflowMenu/index.js +25 -16
  209. package/es/components/OverflowMenu/next/index.js +154 -186
  210. package/es/components/OverflowMenuItem/OverflowMenuItem.js +100 -160
  211. package/es/components/OverflowMenuItem/index.js +12 -4
  212. package/es/components/OverflowMenuV2/index.js +15 -13
  213. package/es/components/PageHeader/PageHeader.js +297 -442
  214. package/es/components/PageHeader/index.js +24 -2
  215. package/es/components/Pagination/Pagination.Skeleton.js +34 -35
  216. package/es/components/Pagination/Pagination.d.ts +1 -1
  217. package/es/components/Pagination/Pagination.js +251 -356
  218. package/es/components/Pagination/experimental/PageSelector.js +38 -54
  219. package/es/components/Pagination/experimental/Pagination-story.d.ts +114 -0
  220. package/es/components/Pagination/experimental/Pagination.js +144 -196
  221. package/es/components/PaginationNav/PaginationNav.js +320 -426
  222. package/es/components/Popover/index.js +318 -437
  223. package/es/components/PrimaryButton/PrimaryButton.js +11 -9
  224. package/es/components/ProgressBar/ProgressBar.js +117 -143
  225. package/es/components/ProgressIndicator/ProgressIndicator.Skeleton.js +42 -38
  226. package/es/components/ProgressIndicator/ProgressIndicator.js +146 -243
  227. package/es/components/RadioButton/RadioButton.Skeleton.js +23 -25
  228. package/es/components/RadioButton/RadioButton.js +101 -174
  229. package/es/components/RadioButton/index.js +12 -4
  230. package/es/components/RadioButtonGroup/RadioButtonGroup.js +135 -207
  231. package/es/components/RadioTile/RadioTile.js +104 -168
  232. package/es/components/RadioTile/index.js +12 -4
  233. package/es/components/Search/Search.Skeleton.js +28 -33
  234. package/es/components/Search/Search.js +182 -278
  235. package/es/components/Search/index.js +13 -5
  236. package/es/components/Search/utils.js +11 -3
  237. package/es/components/SecondaryButton/SecondaryButton.js +11 -9
  238. package/es/components/Select/Select.Skeleton.js +27 -30
  239. package/es/components/Select/Select.js +178 -257
  240. package/es/components/Select/index.js +13 -5
  241. package/es/components/SelectItem/SelectItem.js +33 -48
  242. package/es/components/SelectItem/index.js +12 -4
  243. package/es/components/SelectItemGroup/SelectItemGroup.js +27 -37
  244. package/es/components/ShapeIndicator/index.d.ts +1 -1
  245. package/es/components/ShapeIndicator/index.js +74 -80
  246. package/es/components/SkeletonIcon/SkeletonIcon.js +21 -24
  247. package/es/components/SkeletonPlaceholder/SkeletonPlaceholder.js +15 -24
  248. package/es/components/SkeletonText/SkeletonText.js +67 -81
  249. package/es/components/SkeletonText/index.js +12 -4
  250. package/es/components/Slider/Slider.Skeleton.js +68 -91
  251. package/es/components/Slider/Slider.js +864 -1315
  252. package/es/components/Slider/SliderHandles.js +73 -66
  253. package/es/components/Stack/HStack.js +19 -11
  254. package/es/components/Stack/Stack.js +56 -80
  255. package/es/components/Stack/VStack.js +19 -11
  256. package/es/components/StructuredList/StructuredList.Skeleton.js +55 -48
  257. package/es/components/StructuredList/StructuredList.js +178 -317
  258. package/es/components/Switch/IconSwitch.js +99 -145
  259. package/es/components/Switch/Switch.js +66 -99
  260. package/es/components/TabContent/TabContent.js +28 -34
  261. package/es/components/Tabs/Tabs.Skeleton.js +41 -36
  262. package/es/components/Tabs/Tabs.js +732 -1149
  263. package/es/components/Tabs/usePressable.js +97 -112
  264. package/es/components/Tag/DismissibleTag.js +119 -156
  265. package/es/components/Tag/OperationalTag.js +91 -111
  266. package/es/components/Tag/SelectableTag.js +94 -129
  267. package/es/components/Tag/Tag.Skeleton.js +26 -30
  268. package/es/components/Tag/Tag.js +152 -200
  269. package/es/components/Tag/isEllipsisActive.js +13 -8
  270. package/es/components/Text/Text.js +66 -79
  271. package/es/components/Text/TextDirection.js +36 -37
  272. package/es/components/Text/TextDirectionContext.js +14 -8
  273. package/es/components/Text/createTextComponent.js +21 -20
  274. package/es/components/TextArea/TextArea.Skeleton.js +25 -29
  275. package/es/components/TextArea/TextArea.js +315 -422
  276. package/es/components/TextArea/index.js +13 -5
  277. package/es/components/TextInput/ControlledPasswordInput.js +133 -198
  278. package/es/components/TextInput/PasswordInput.js +196 -303
  279. package/es/components/TextInput/TextInput.Skeleton.js +24 -28
  280. package/es/components/TextInput/TextInput.js +219 -317
  281. package/es/components/TextInput/index.js +13 -5
  282. package/es/components/TextInput/util.js +21 -25
  283. package/es/components/Theme/index.js +79 -95
  284. package/es/components/Tile/Tile.js +394 -593
  285. package/es/components/TileGroup/TileGroup.js +70 -111
  286. package/es/components/TimePicker/TimePicker.d.ts +1 -1
  287. package/es/components/TimePicker/TimePicker.js +148 -247
  288. package/es/components/TimePickerSelect/TimePickerSelect.js +43 -58
  289. package/es/components/Toggle/Toggle.Skeleton.js +24 -22
  290. package/es/components/Toggle/Toggle.js +102 -171
  291. package/es/components/ToggleSmall/ToggleSmall.Skeleton.js +46 -51
  292. package/es/components/Toggletip/index.d.ts +2 -2
  293. package/es/components/Toggletip/index.js +170 -256
  294. package/es/components/Tooltip/DefinitionTooltip.js +98 -138
  295. package/es/components/Tooltip/Tooltip.js +188 -263
  296. package/es/components/TreeView/TreeContext.js +13 -5
  297. package/es/components/TreeView/TreeNode.js +361 -500
  298. package/es/components/TreeView/TreeView.js +164 -237
  299. package/es/components/UIShell/Content.js +23 -30
  300. package/es/components/UIShell/Header.js +25 -29
  301. package/es/components/UIShell/HeaderContainer.js +31 -40
  302. package/es/components/UIShell/HeaderGlobalAction.js +65 -90
  303. package/es/components/UIShell/HeaderGlobalBar.js +16 -9
  304. package/es/components/UIShell/HeaderMenu.js +141 -215
  305. package/es/components/UIShell/HeaderMenuButton.js +43 -66
  306. package/es/components/UIShell/HeaderMenuItem.js +49 -76
  307. package/es/components/UIShell/HeaderName.js +32 -44
  308. package/es/components/UIShell/HeaderNavigation.js +32 -37
  309. package/es/components/UIShell/HeaderPanel.js +74 -97
  310. package/es/components/UIShell/HeaderSideNavItems.js +27 -33
  311. package/es/components/UIShell/Link.js +29 -50
  312. package/es/components/UIShell/SideNav.js +132 -241
  313. package/es/components/UIShell/SideNavContext.js +21 -15
  314. package/es/components/UIShell/SideNavDetails.js +29 -34
  315. package/es/components/UIShell/SideNavDivider.js +21 -21
  316. package/es/components/UIShell/SideNavFooter.js +43 -52
  317. package/es/components/UIShell/SideNavHeader.js +26 -35
  318. package/es/components/UIShell/SideNavIcon.js +28 -33
  319. package/es/components/UIShell/SideNavItem.js +28 -33
  320. package/es/components/UIShell/SideNavItems.js +31 -40
  321. package/es/components/UIShell/SideNavLink.js +52 -79
  322. package/es/components/UIShell/SideNavLinkText.js +24 -25
  323. package/es/components/UIShell/SideNavMenu.js +102 -143
  324. package/es/components/UIShell/SideNavMenuItem.js +40 -52
  325. package/es/components/UIShell/SideNavSwitcher.js +59 -68
  326. package/es/components/UIShell/SkipToContent.js +28 -36
  327. package/es/components/UIShell/Switcher.js +69 -99
  328. package/es/components/UIShell/SwitcherDivider.js +16 -24
  329. package/es/components/UIShell/SwitcherItem.js +74 -114
  330. package/es/components/UnorderedList/UnorderedList.js +28 -37
  331. package/es/feature-flags.js +19 -10
  332. package/es/index.js +249 -242
  333. package/es/internal/FloatingMenu.js +246 -292
  334. package/es/internal/OptimizedResize.js +35 -46
  335. package/es/internal/Selection.js +99 -132
  336. package/es/internal/clamp.js +12 -4
  337. package/es/internal/defaultItemToString.js +15 -9
  338. package/es/internal/deprecateFieldOnObject.js +22 -14
  339. package/es/internal/environment.js +15 -7
  340. package/es/internal/getAnnouncement.js +16 -13
  341. package/es/internal/keyboard/keys.js +48 -48
  342. package/es/internal/keyboard/match.js +25 -42
  343. package/es/internal/keyboard/navigation.js +22 -27
  344. package/es/internal/noopFn.js +10 -2
  345. package/es/internal/useAttachedMenu.js +43 -51
  346. package/es/internal/useControllableState.js +43 -48
  347. package/es/internal/useDelayedState.js +30 -35
  348. package/es/internal/useEvent.js +39 -35
  349. package/es/internal/useId.js +51 -87
  350. package/es/internal/useIdPrefix.js +13 -5
  351. package/es/internal/useIsomorphicEffect.js +12 -4
  352. package/es/internal/useMatchMedia.js +29 -21
  353. package/es/internal/useMergedRefs.js +26 -22
  354. package/es/internal/useNoInteractiveChildren.js +70 -99
  355. package/es/internal/useNormalizedInputProps.js +47 -51
  356. package/es/internal/useOutsideClick.js +21 -24
  357. package/es/internal/useOverflowItems.js +89 -90
  358. package/es/internal/usePrefix.js +13 -5
  359. package/es/internal/usePresence.js +51 -54
  360. package/es/internal/usePresenceContext.js +35 -35
  361. package/es/internal/usePreviousValue.js +26 -18
  362. package/es/internal/useResizeObserver.js +57 -66
  363. package/es/internal/useSavedCallback.js +24 -17
  364. package/es/internal/utils.js +17 -9
  365. package/es/internal/warning.js +17 -22
  366. package/es/internal/wrapFocus.js +77 -98
  367. package/es/prop-types/AriaPropTypes.js +14 -6
  368. package/es/prop-types/deprecate.js +30 -27
  369. package/es/prop-types/deprecateComponent.js +17 -8
  370. package/es/prop-types/deprecateValuesWithin.js +18 -21
  371. package/es/prop-types/isRequiredOneOf.js +21 -24
  372. package/es/prop-types/requiredIfGivenPropIsTruthy.js +14 -14
  373. package/es/tools/events.js +17 -21
  374. package/es/tools/mapPopoverAlign.js +19 -18
  375. package/es/tools/mergeRefs.js +14 -17
  376. package/es/tools/setupGetInstanceId.js +16 -8
  377. package/es/tools/toggleClass.js +17 -9
  378. package/es/tools/wrapComponent.js +34 -39
  379. package/icons/index.d.ts +2 -1
  380. package/icons/index.esm.js +2 -2
  381. package/icons/index.js +7 -10
  382. package/lib/_virtual/_rolldown/runtime.js +50 -0
  383. package/lib/components/AILabel/index.d.ts +29 -2
  384. package/lib/components/AILabel/index.js +118 -171
  385. package/lib/components/AISkeleton/AISkeletonIcon.js +27 -31
  386. package/lib/components/AISkeleton/AISkeletonPlaceholder.js +29 -31
  387. package/lib/components/AISkeleton/AISkeletonText.js +30 -43
  388. package/lib/components/Accordion/Accordion.Skeleton.js +59 -84
  389. package/lib/components/Accordion/Accordion.js +47 -65
  390. package/lib/components/Accordion/AccordionItem.js +106 -160
  391. package/lib/components/Accordion/AccordionProvider.js +20 -17
  392. package/lib/components/AspectRatio/AspectRatio.js +45 -51
  393. package/lib/components/BadgeIndicator/index.js +33 -39
  394. package/lib/components/Breadcrumb/Breadcrumb.Skeleton.js +43 -55
  395. package/lib/components/Breadcrumb/Breadcrumb.js +43 -55
  396. package/lib/components/Breadcrumb/BreadcrumbItem.js +84 -87
  397. package/lib/components/Button/Button.Skeleton.js +53 -63
  398. package/lib/components/Button/Button.d.ts +1 -1
  399. package/lib/components/Button/Button.js +149 -244
  400. package/lib/components/Button/ButtonBase.js +85 -108
  401. package/lib/components/Button/index.js +13 -15
  402. package/lib/components/ButtonSet/ButtonSet.js +78 -102
  403. package/lib/components/ButtonSet/index.js +12 -9
  404. package/lib/components/ChatButton/ChatButton.Skeleton.js +31 -31
  405. package/lib/components/ChatButton/ChatButton.js +68 -83
  406. package/lib/components/Checkbox/Checkbox.Skeleton.js +30 -30
  407. package/lib/components/Checkbox/Checkbox.js +119 -198
  408. package/lib/components/Checkbox/index.js +13 -11
  409. package/lib/components/CheckboxGroup/CheckboxGroup.js +104 -152
  410. package/lib/components/ClassPrefix/index.js +24 -19
  411. package/lib/components/CodeSnippet/CodeSnippet.Skeleton.js +49 -47
  412. package/lib/components/CodeSnippet/CodeSnippet.js +215 -303
  413. package/lib/components/ComboBox/ComboBox.js +626 -974
  414. package/lib/components/ComboBox/index.js +12 -9
  415. package/lib/components/ComboButton/index.js +176 -210
  416. package/lib/components/ComposedModal/ComposedModal.js +315 -454
  417. package/lib/components/ComposedModal/ComposedModalPresence.js +49 -44
  418. package/lib/components/ComposedModal/ModalFooter.js +131 -209
  419. package/lib/components/ComposedModal/ModalHeader.js +75 -103
  420. package/lib/components/ComposedModal/useComposedModalState.js +22 -17
  421. package/lib/components/ContainedList/ContainedList.js +77 -106
  422. package/lib/components/ContainedList/ContainedListItem/ContainedListItem.js +59 -71
  423. package/lib/components/ContainedList/ContainedListItem/index.js +12 -9
  424. package/lib/components/ContainedList/index.js +18 -15
  425. package/lib/components/ContentSwitcher/ContentSwitcher.js +112 -142
  426. package/lib/components/ContextMenu/useContextMenu.js +42 -40
  427. package/lib/components/Copy/Copy.js +101 -121
  428. package/lib/components/Copy/index.js +12 -9
  429. package/lib/components/CopyButton/CopyButton.js +85 -98
  430. package/lib/components/CopyButton/index.js +12 -9
  431. package/lib/components/DangerButton/DangerButton.js +19 -13
  432. package/lib/components/DataTable/DataTable.d.ts +11 -11
  433. package/lib/components/DataTable/DataTable.js +474 -655
  434. package/lib/components/DataTable/Table.js +115 -161
  435. package/lib/components/DataTable/TableActionList.js +15 -11
  436. package/lib/components/DataTable/TableBatchAction.js +28 -38
  437. package/lib/components/DataTable/TableBatchActions.js +82 -117
  438. package/lib/components/DataTable/TableBody.js +29 -23
  439. package/lib/components/DataTable/TableCell.js +35 -50
  440. package/lib/components/DataTable/TableContainer.js +79 -86
  441. package/lib/components/DataTable/TableContext.js +15 -8
  442. package/lib/components/DataTable/TableDecoratorRow.js +34 -40
  443. package/lib/components/DataTable/TableExpandHeader.js +57 -94
  444. package/lib/components/DataTable/TableExpandRow.js +86 -123
  445. package/lib/components/DataTable/TableExpandedRow.js +49 -55
  446. package/lib/components/DataTable/TableHead.js +8 -10
  447. package/lib/components/DataTable/TableHeader.js +142 -185
  448. package/lib/components/DataTable/TableRow.d.ts +1 -1
  449. package/lib/components/DataTable/TableRow.js +46 -80
  450. package/lib/components/DataTable/TableSelectAll.js +46 -74
  451. package/lib/components/DataTable/TableSelectRow.js +67 -102
  452. package/lib/components/DataTable/TableSlugRow.js +39 -47
  453. package/lib/components/DataTable/TableToolbar.js +37 -49
  454. package/lib/components/DataTable/TableToolbarAction.js +28 -24
  455. package/lib/components/DataTable/TableToolbarContent.js +15 -11
  456. package/lib/components/DataTable/TableToolbarMenu.js +39 -50
  457. package/lib/components/DataTable/TableToolbarSearch.js +101 -191
  458. package/lib/components/DataTable/state/getDerivedStateFromProps.js +38 -47
  459. package/lib/components/DataTable/state/sortStates.js +11 -10
  460. package/lib/components/DataTable/state/sorting.js +54 -76
  461. package/lib/components/DataTable/tools/cells.js +15 -8
  462. package/lib/components/DataTable/tools/denormalize.js +27 -22
  463. package/lib/components/DataTable/tools/filter.js +21 -23
  464. package/lib/components/DataTable/tools/normalize.js +57 -76
  465. package/lib/components/DataTable/tools/sorting.js +50 -75
  466. package/lib/components/DataTableSkeleton/DataTableSkeleton.js +70 -98
  467. package/lib/components/DatePicker/DatePicker.Skeleton.js +48 -56
  468. package/lib/components/DatePicker/DatePicker.js +491 -756
  469. package/lib/components/DatePicker/DatePickerLocales.js +75 -127
  470. package/lib/components/DatePicker/index.js +13 -11
  471. package/lib/components/DatePicker/plugins/appendToPlugin.js +31 -46
  472. package/lib/components/DatePicker/plugins/fixEventsPlugin.js +127 -175
  473. package/lib/components/DatePicker/plugins/rangePlugin.js +42 -50
  474. package/lib/components/DatePicker/utils.js +11 -4
  475. package/lib/components/DatePickerInput/DatePickerInput.js +183 -293
  476. package/lib/components/DatePickerInput/index.js +12 -9
  477. package/lib/components/Dialog/Dialog.js +307 -576
  478. package/lib/components/Dialog/index.js +21 -13
  479. package/lib/components/Dropdown/Dropdown.Skeleton.js +30 -43
  480. package/lib/components/Dropdown/Dropdown.js +348 -539
  481. package/lib/components/Dropdown/index.js +13 -11
  482. package/lib/components/ErrorBoundary/ErrorBoundary.js +39 -62
  483. package/lib/components/ErrorBoundary/ErrorBoundaryContext.js +15 -11
  484. package/lib/components/ExpandableSearch/ExpandableSearch.js +63 -73
  485. package/lib/components/ExpandableSearch/index.js +12 -9
  486. package/lib/components/FeatureFlags/index.d.ts +11 -2
  487. package/lib/components/FeatureFlags/index.js +82 -79
  488. package/lib/components/FileUploader/FileUploader.Skeleton.js +39 -35
  489. package/lib/components/FileUploader/FileUploader.js +273 -347
  490. package/lib/components/FileUploader/FileUploaderButton.js +114 -164
  491. package/lib/components/FileUploader/FileUploaderDropContainer.js +148 -225
  492. package/lib/components/FileUploader/FileUploaderItem.js +142 -161
  493. package/lib/components/FileUploader/Filename.d.ts +1 -1
  494. package/lib/components/FileUploader/Filename.js +56 -76
  495. package/lib/components/FluidComboBox/FluidComboBox.Skeleton.js +30 -32
  496. package/lib/components/FluidComboBox/FluidComboBox.js +58 -109
  497. package/lib/components/FluidDatePicker/FluidDatePicker.Skeleton.js +60 -57
  498. package/lib/components/FluidDatePicker/FluidDatePicker.js +50 -72
  499. package/lib/components/FluidDatePickerInput/FluidDatePickerInput.js +25 -20
  500. package/lib/components/FluidDropdown/FluidDropdown.Skeleton.js +30 -32
  501. package/lib/components/FluidDropdown/FluidDropdown.js +59 -115
  502. package/lib/components/FluidForm/FluidForm.js +33 -35
  503. package/lib/components/FluidForm/FormContext.js +13 -8
  504. package/lib/components/FluidMultiSelect/FluidMultiSelect.Skeleton.js +30 -32
  505. package/lib/components/FluidMultiSelect/FluidMultiSelect.js +71 -201
  506. package/lib/components/FluidNumberInput/FluidNumberInput.Skeleton.js +31 -34
  507. package/lib/components/FluidNumberInput/FluidNumberInput.js +67 -151
  508. package/lib/components/FluidSearch/FluidSearch.Skeleton.js +31 -34
  509. package/lib/components/FluidSearch/FluidSearch.js +45 -88
  510. package/lib/components/FluidSelect/FluidSelect.Skeleton.js +30 -32
  511. package/lib/components/FluidSelect/FluidSelect.js +44 -80
  512. package/lib/components/FluidSelect/index.js +13 -11
  513. package/lib/components/FluidTextArea/FluidTextArea.Skeleton.js +31 -34
  514. package/lib/components/FluidTextArea/FluidTextArea.js +52 -116
  515. package/lib/components/FluidTextInput/FluidPasswordInput.js +48 -103
  516. package/lib/components/FluidTextInput/FluidTextInput.Skeleton.js +31 -34
  517. package/lib/components/FluidTextInput/FluidTextInput.js +53 -108
  518. package/lib/components/FluidTextInput/index.js +14 -13
  519. package/lib/components/FluidTimePicker/FluidTimePicker.Skeleton.js +34 -37
  520. package/lib/components/FluidTimePicker/FluidTimePicker.js +72 -119
  521. package/lib/components/FluidTimePickerSelect/FluidTimePickerSelect.js +31 -51
  522. package/lib/components/Form/Form.js +27 -29
  523. package/lib/components/FormGroup/FormGroup.js +49 -71
  524. package/lib/components/FormItem/FormItem.js +27 -29
  525. package/lib/components/FormLabel/FormLabel.js +32 -38
  526. package/lib/components/Grid/CSSGrid.d.ts +1 -1
  527. package/lib/components/Grid/CSSGrid.js +89 -129
  528. package/lib/components/Grid/Column.js +196 -328
  529. package/lib/components/Grid/ColumnHang.js +32 -38
  530. package/lib/components/Grid/FlexGrid.js +44 -62
  531. package/lib/components/Grid/Grid.js +32 -44
  532. package/lib/components/Grid/GridContext.js +39 -44
  533. package/lib/components/Grid/Row.js +35 -53
  534. package/lib/components/Heading/index.js +39 -53
  535. package/lib/components/Icon/Icon.Skeleton.js +25 -23
  536. package/lib/components/IconButton/index.js +121 -180
  537. package/lib/components/IconIndicator/index.d.ts +1 -1
  538. package/lib/components/IconIndicator/index.js +63 -63
  539. package/lib/components/IdPrefix/index.js +24 -19
  540. package/lib/components/InlineCheckbox/InlineCheckbox.js +72 -117
  541. package/lib/components/InlineCheckbox/index.js +12 -9
  542. package/lib/components/InlineLoading/InlineLoading.js +87 -104
  543. package/lib/components/InlineLoading/index.js +12 -9
  544. package/lib/components/Layer/LayerContext.js +14 -6
  545. package/lib/components/Layer/LayerLevel.js +20 -6
  546. package/lib/components/Layer/index.js +58 -68
  547. package/lib/components/Layout/index.js +81 -111
  548. package/lib/components/LayoutDirection/LayoutDirection.d.ts +1 -1
  549. package/lib/components/LayoutDirection/LayoutDirection.js +36 -40
  550. package/lib/components/LayoutDirection/LayoutDirectionContext.js +14 -8
  551. package/lib/components/LayoutDirection/useLayoutDirection.js +16 -9
  552. package/lib/components/Link/Link.js +67 -112
  553. package/lib/components/Link/index.js +12 -9
  554. package/lib/components/ListBox/ListBox.js +82 -130
  555. package/lib/components/ListBox/ListBoxField.js +33 -47
  556. package/lib/components/ListBox/ListBoxMenu.js +39 -46
  557. package/lib/components/ListBox/ListBoxMenuIcon.js +43 -44
  558. package/lib/components/ListBox/ListBoxMenuItem.js +71 -92
  559. package/lib/components/ListBox/ListBoxPropTypes.js +21 -9
  560. package/lib/components/ListBox/ListBoxSelection.js +75 -100
  561. package/lib/components/ListBox/index.js +17 -21
  562. package/lib/components/ListBox/next/ListBoxSelection.js +83 -121
  563. package/lib/components/ListBox/next/ListBoxTrigger.js +48 -52
  564. package/lib/components/ListItem/ListItem.js +29 -32
  565. package/lib/components/Loading/Loading.js +68 -77
  566. package/lib/components/Loading/index.js +12 -9
  567. package/lib/components/Menu/Menu.js +224 -365
  568. package/lib/components/Menu/MenuContext.d.ts +1 -1
  569. package/lib/components/Menu/MenuContext.js +42 -40
  570. package/lib/components/Menu/MenuItem.js +286 -415
  571. package/lib/components/MenuButton/index.js +138 -197
  572. package/lib/components/Modal/Modal.js +504 -665
  573. package/lib/components/Modal/ModalPresence.js +41 -39
  574. package/lib/components/Modal/index.js +13 -10
  575. package/lib/components/ModalWrapper/ModalWrapper.d.ts +2 -2
  576. package/lib/components/ModalWrapper/ModalWrapper.js +112 -134
  577. package/lib/components/MultiSelect/FilterableMultiSelect.js +611 -920
  578. package/lib/components/MultiSelect/MultiSelect.js +459 -718
  579. package/lib/components/MultiSelect/MultiSelectPropTypes.js +15 -32
  580. package/lib/components/MultiSelect/filter.js +14 -10
  581. package/lib/components/MultiSelect/tools/sorting.js +21 -35
  582. package/lib/components/Notification/Notification.js +514 -787
  583. package/lib/components/NumberInput/NumberFormatPropTypes.js +72 -33
  584. package/lib/components/NumberInput/NumberInput.Skeleton.js +33 -37
  585. package/lib/components/NumberInput/NumberInput.js +571 -950
  586. package/lib/components/OrderedList/OrderedList.js +35 -48
  587. package/lib/components/OverflowMenu/OverflowMenu.js +341 -454
  588. package/lib/components/OverflowMenu/index.js +27 -21
  589. package/lib/components/OverflowMenu/next/index.js +158 -188
  590. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +104 -164
  591. package/lib/components/OverflowMenuItem/index.js +12 -9
  592. package/lib/components/OverflowMenuV2/index.js +25 -15
  593. package/lib/components/PageHeader/PageHeader.js +301 -444
  594. package/lib/components/PageHeader/index.js +27 -19
  595. package/lib/components/Pagination/Pagination.Skeleton.js +38 -37
  596. package/lib/components/Pagination/Pagination.d.ts +1 -1
  597. package/lib/components/Pagination/Pagination.js +256 -360
  598. package/lib/components/Pagination/experimental/PageSelector.js +48 -58
  599. package/lib/components/Pagination/experimental/Pagination-story.d.ts +114 -0
  600. package/lib/components/Pagination/experimental/Pagination.js +148 -200
  601. package/lib/components/PaginationNav/PaginationNav.js +324 -430
  602. package/lib/components/Popover/index.js +323 -440
  603. package/lib/components/PrimaryButton/PrimaryButton.js +19 -13
  604. package/lib/components/ProgressBar/ProgressBar.js +121 -147
  605. package/lib/components/ProgressIndicator/ProgressIndicator.Skeleton.js +46 -43
  606. package/lib/components/ProgressIndicator/ProgressIndicator.js +150 -245
  607. package/lib/components/RadioButton/RadioButton.Skeleton.js +27 -27
  608. package/lib/components/RadioButton/RadioButton.js +105 -178
  609. package/lib/components/RadioButton/index.js +12 -9
  610. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +139 -211
  611. package/lib/components/RadioTile/RadioTile.js +108 -172
  612. package/lib/components/RadioTile/index.js +12 -9
  613. package/lib/components/Search/Search.Skeleton.js +32 -38
  614. package/lib/components/Search/Search.js +185 -281
  615. package/lib/components/Search/index.js +13 -11
  616. package/lib/components/Search/utils.js +11 -4
  617. package/lib/components/SecondaryButton/SecondaryButton.js +19 -13
  618. package/lib/components/Select/Select.Skeleton.js +31 -35
  619. package/lib/components/Select/Select.js +182 -261
  620. package/lib/components/Select/index.js +13 -11
  621. package/lib/components/SelectItem/SelectItem.js +37 -52
  622. package/lib/components/SelectItem/index.js +12 -9
  623. package/lib/components/SelectItemGroup/SelectItemGroup.js +31 -41
  624. package/lib/components/ShapeIndicator/index.d.ts +1 -1
  625. package/lib/components/ShapeIndicator/index.js +78 -83
  626. package/lib/components/SkeletonIcon/SkeletonIcon.js +25 -28
  627. package/lib/components/SkeletonPlaceholder/SkeletonPlaceholder.js +25 -28
  628. package/lib/components/SkeletonText/SkeletonText.js +71 -85
  629. package/lib/components/SkeletonText/index.js +12 -9
  630. package/lib/components/Slider/Slider.Skeleton.js +72 -95
  631. package/lib/components/Slider/Slider.js +868 -1319
  632. package/lib/components/Slider/SliderHandles.js +75 -68
  633. package/lib/components/Stack/HStack.js +22 -14
  634. package/lib/components/Stack/Stack.js +60 -82
  635. package/lib/components/Stack/VStack.js +22 -14
  636. package/lib/components/StructuredList/StructuredList.Skeleton.js +59 -52
  637. package/lib/components/StructuredList/StructuredList.js +182 -319
  638. package/lib/components/Switch/IconSwitch.js +103 -149
  639. package/lib/components/Switch/Switch.js +70 -103
  640. package/lib/components/TabContent/TabContent.js +32 -38
  641. package/lib/components/Tabs/Tabs.Skeleton.js +45 -41
  642. package/lib/components/Tabs/Tabs.js +738 -1153
  643. package/lib/components/Tabs/usePressable.js +98 -114
  644. package/lib/components/Tag/DismissibleTag.js +123 -160
  645. package/lib/components/Tag/OperationalTag.js +95 -115
  646. package/lib/components/Tag/SelectableTag.js +98 -133
  647. package/lib/components/Tag/Tag.Skeleton.js +30 -32
  648. package/lib/components/Tag/Tag.js +156 -204
  649. package/lib/components/Tag/isEllipsisActive.js +13 -9
  650. package/lib/components/Text/Text.js +69 -81
  651. package/lib/components/Text/TextDirection.js +39 -39
  652. package/lib/components/Text/TextDirectionContext.js +15 -10
  653. package/lib/components/Text/createTextComponent.js +29 -22
  654. package/lib/components/TextArea/TextArea.Skeleton.js +29 -34
  655. package/lib/components/TextArea/TextArea.js +319 -426
  656. package/lib/components/TextArea/index.js +13 -11
  657. package/lib/components/TextInput/ControlledPasswordInput.js +137 -202
  658. package/lib/components/TextInput/PasswordInput.js +200 -307
  659. package/lib/components/TextInput/TextInput.Skeleton.js +28 -33
  660. package/lib/components/TextInput/TextInput.js +223 -321
  661. package/lib/components/TextInput/index.js +13 -11
  662. package/lib/components/TextInput/util.js +21 -26
  663. package/lib/components/Theme/index.js +83 -97
  664. package/lib/components/Tile/Tile.js +398 -595
  665. package/lib/components/TileGroup/TileGroup.js +73 -113
  666. package/lib/components/TimePicker/TimePicker.d.ts +1 -1
  667. package/lib/components/TimePicker/TimePicker.js +152 -251
  668. package/lib/components/TimePickerSelect/TimePickerSelect.js +47 -62
  669. package/lib/components/Toggle/Toggle.Skeleton.js +28 -24
  670. package/lib/components/Toggle/Toggle.js +106 -176
  671. package/lib/components/ToggleSmall/ToggleSmall.Skeleton.js +50 -53
  672. package/lib/components/Toggletip/index.d.ts +2 -2
  673. package/lib/components/Toggletip/index.js +174 -258
  674. package/lib/components/Tooltip/DefinitionTooltip.js +102 -140
  675. package/lib/components/Tooltip/Tooltip.js +192 -265
  676. package/lib/components/TreeView/TreeContext.js +14 -7
  677. package/lib/components/TreeView/TreeNode.js +365 -504
  678. package/lib/components/TreeView/TreeView.js +169 -242
  679. package/lib/components/UIShell/Content.js +27 -34
  680. package/lib/components/UIShell/Header.js +29 -33
  681. package/lib/components/UIShell/HeaderContainer.js +34 -44
  682. package/lib/components/UIShell/HeaderGlobalAction.js +69 -94
  683. package/lib/components/UIShell/HeaderGlobalBar.js +17 -14
  684. package/lib/components/UIShell/HeaderMenu.js +146 -221
  685. package/lib/components/UIShell/HeaderMenuButton.js +47 -70
  686. package/lib/components/UIShell/HeaderMenuItem.js +53 -80
  687. package/lib/components/UIShell/HeaderName.js +36 -48
  688. package/lib/components/UIShell/HeaderNavigation.js +36 -41
  689. package/lib/components/UIShell/HeaderPanel.js +78 -101
  690. package/lib/components/UIShell/HeaderSideNavItems.js +31 -37
  691. package/lib/components/UIShell/Link.js +32 -54
  692. package/lib/components/UIShell/SideNav.js +136 -245
  693. package/lib/components/UIShell/SideNavContext.js +23 -17
  694. package/lib/components/UIShell/SideNavDetails.js +33 -38
  695. package/lib/components/UIShell/SideNavDivider.js +25 -25
  696. package/lib/components/UIShell/SideNavFooter.js +47 -56
  697. package/lib/components/UIShell/SideNavHeader.js +30 -39
  698. package/lib/components/UIShell/SideNavIcon.js +32 -37
  699. package/lib/components/UIShell/SideNavItem.js +32 -37
  700. package/lib/components/UIShell/SideNavItems.js +35 -44
  701. package/lib/components/UIShell/SideNavLink.js +56 -83
  702. package/lib/components/UIShell/SideNavLinkText.js +28 -29
  703. package/lib/components/UIShell/SideNavMenu.js +106 -148
  704. package/lib/components/UIShell/SideNavMenuItem.js +44 -56
  705. package/lib/components/UIShell/SideNavSwitcher.js +63 -72
  706. package/lib/components/UIShell/SkipToContent.js +32 -40
  707. package/lib/components/UIShell/Switcher.js +73 -103
  708. package/lib/components/UIShell/SwitcherDivider.js +26 -28
  709. package/lib/components/UIShell/SwitcherItem.js +78 -118
  710. package/lib/components/UnorderedList/UnorderedList.js +32 -41
  711. package/lib/feature-flags.js +21 -13
  712. package/lib/index.js +622 -602
  713. package/lib/internal/FloatingMenu.js +249 -296
  714. package/lib/internal/OptimizedResize.js +35 -47
  715. package/lib/internal/Selection.js +102 -134
  716. package/lib/internal/clamp.js +12 -5
  717. package/lib/internal/defaultItemToString.js +15 -10
  718. package/lib/internal/deprecateFieldOnObject.js +23 -16
  719. package/lib/internal/environment.js +15 -8
  720. package/lib/internal/getAnnouncement.js +16 -14
  721. package/lib/internal/keyboard/keys.js +48 -49
  722. package/lib/internal/keyboard/match.js +25 -43
  723. package/lib/internal/keyboard/navigation.js +22 -29
  724. package/lib/internal/noopFn.js +10 -3
  725. package/lib/internal/useAttachedMenu.js +44 -53
  726. package/lib/internal/useControllableState.js +44 -50
  727. package/lib/internal/useDelayedState.js +31 -37
  728. package/lib/internal/useEvent.js +40 -37
  729. package/lib/internal/useId.js +54 -91
  730. package/lib/internal/useIdPrefix.js +15 -7
  731. package/lib/internal/useIsomorphicEffect.js +13 -8
  732. package/lib/internal/useMatchMedia.js +30 -23
  733. package/lib/internal/useMergedRefs.js +27 -24
  734. package/lib/internal/useNoInteractiveChildren.js +73 -101
  735. package/lib/internal/useNormalizedInputProps.js +55 -53
  736. package/lib/internal/useOutsideClick.js +22 -26
  737. package/lib/internal/useOverflowItems.js +90 -94
  738. package/lib/internal/usePrefix.js +15 -7
  739. package/lib/internal/usePresence.js +52 -56
  740. package/lib/internal/usePresenceContext.js +36 -37
  741. package/lib/internal/usePreviousValue.js +27 -20
  742. package/lib/internal/useResizeObserver.js +58 -68
  743. package/lib/internal/useSavedCallback.js +25 -19
  744. package/lib/internal/utils.js +18 -11
  745. package/lib/internal/warning.js +24 -23
  746. package/lib/internal/wrapFocus.js +78 -100
  747. package/lib/prop-types/AriaPropTypes.js +17 -9
  748. package/lib/prop-types/deprecate.js +30 -29
  749. package/lib/prop-types/deprecateComponent.js +17 -10
  750. package/lib/prop-types/deprecateValuesWithin.js +18 -23
  751. package/lib/prop-types/isRequiredOneOf.js +21 -25
  752. package/lib/prop-types/requiredIfGivenPropIsTruthy.js +14 -15
  753. package/lib/tools/events.js +17 -22
  754. package/lib/tools/mapPopoverAlign.js +19 -19
  755. package/lib/tools/mergeRefs.js +14 -18
  756. package/lib/tools/setupGetInstanceId.js +16 -9
  757. package/lib/tools/toggleClass.js +17 -10
  758. package/lib/tools/wrapComponent.js +38 -43
  759. package/package.json +10 -16
  760. package/es/_virtual/_rollupPluginBabelHelpers.js +0 -40
  761. package/es/components/DataTable/stories/examples/TableToolbarFilter.d.ts +0 -54
  762. package/es/node_modules/es-toolkit/dist/compat/function/debounce.js +0 -55
  763. package/es/node_modules/es-toolkit/dist/compat/function/throttle.js +0 -23
  764. package/es/node_modules/es-toolkit/dist/function/debounce.js +0 -70
  765. package/lib/_virtual/_rollupPluginBabelHelpers.js +0 -45
  766. package/lib/components/DataTable/stories/examples/TableToolbarFilter.d.ts +0 -54
  767. package/lib/node_modules/es-toolkit/dist/compat/function/debounce.js +0 -57
  768. package/lib/node_modules/es-toolkit/dist/compat/function/throttle.js +0 -25
  769. 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 };