@carbon/react 1.103.0 → 1.104.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 +990 -1245
  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 +565 -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 +569 -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,929 +1,616 @@
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 { WarningFilled, WarningAltFilled } from '@carbon/icons-react';
10
- import cx from 'classnames';
11
- import Downshift, { useCombobox, useMultipleSelection } from 'downshift';
12
- import isEqual from 'react-fast-compare';
13
- import PropTypes from 'prop-types';
14
- import React, { forwardRef, useContext, useRef, useState, useMemo, useCallback, useEffect, cloneElement } from 'react';
15
- import { defaultFilterItems } from './filter.js';
16
- import { sortingPropTypes } from './MultiSelectPropTypes.js';
17
- import ListBox from '../ListBox/index.js';
18
- import Checkbox from '../Checkbox/Checkbox.js';
19
- import '../Checkbox/Checkbox.Skeleton.js';
20
- import ListBoxSelection from '../ListBox/next/ListBoxSelection.js';
21
- import ListBoxTrigger from '../ListBox/next/ListBoxTrigger.js';
22
- import { Space, Enter, Delete, Escape, Tab, Home, End } from '../../internal/keyboard/keys.js';
23
- import { match } from '../../internal/keyboard/match.js';
24
- import { mergeRefs } from '../../tools/mergeRefs.js';
25
- import { deprecate } from '../../prop-types/deprecate.js';
26
- import { useId } from '../../internal/useId.js';
27
- import { defaultSortItems, defaultCompareItems } from './tools/sorting.js';
28
- import { usePrefix } from '../../internal/usePrefix.js';
29
- import '../FluidForm/FluidForm.js';
30
- import { FormContext } from '../FluidForm/FormContext.js';
31
- import { useSelection } from '../../internal/Selection.js';
32
- import { useFloating, autoUpdate, flip, size, hide } from '@floating-ui/react';
33
- import { AILabel } from '../AILabel/index.js';
34
- import { defaultItemToString } from '../../internal/defaultItemToString.js';
35
- import { isComponentElement } from '../../internal/utils.js';
36
- import { useNormalizedInputProps } from '../../internal/useNormalizedInputProps.js';
37
- import useIsomorphicEffect from '../../internal/useIsomorphicEffect.js';
38
- import { ListBoxTypePropType, ListBoxSizePropType } from '../ListBox/ListBoxPropTypes.js';
8
+ import { usePrefix } from "../../internal/usePrefix.js";
9
+ import { Delete, End, Enter, Escape, Home, Space, Tab } from "../../internal/keyboard/keys.js";
10
+ import { match } from "../../internal/keyboard/match.js";
11
+ import useIsomorphicEffect from "../../internal/useIsomorphicEffect.js";
12
+ import { useId } from "../../internal/useId.js";
13
+ import { deprecate } from "../../prop-types/deprecate.js";
14
+ import { AILabel } from "../AILabel/index.js";
15
+ import { defaultItemToString } from "../../internal/defaultItemToString.js";
16
+ import { isComponentElement } from "../../internal/utils.js";
17
+ import Checkbox_default from "../Checkbox/index.js";
18
+ import { ListBoxSizePropType, ListBoxTypePropType } from "../ListBox/ListBoxPropTypes.js";
19
+ import { FormContext } from "../FluidForm/FormContext.js";
20
+ import ListBox from "../ListBox/index.js";
21
+ import ListBoxSelection from "../ListBox/next/ListBoxSelection.js";
22
+ import ListBoxTrigger from "../ListBox/next/ListBoxTrigger.js";
23
+ import { mergeRefs } from "../../tools/mergeRefs.js";
24
+ import { useNormalizedInputProps } from "../../internal/useNormalizedInputProps.js";
25
+ import { defaultFilterItems } from "./filter.js";
26
+ import { sortingPropTypes } from "./MultiSelectPropTypes.js";
27
+ import { defaultCompareItems, defaultSortItems } from "./tools/sorting.js";
28
+ import { useSelection } from "../../internal/Selection.js";
29
+ import classNames from "classnames";
30
+ import React, { cloneElement, forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
31
+ import PropTypes from "prop-types";
32
+ import { jsx, jsxs } from "react/jsx-runtime";
33
+ import { WarningAltFilled, WarningFilled } from "@carbon/icons-react";
34
+ import { autoUpdate, flip, hide, size, useFloating } from "@floating-ui/react";
35
+ import Downshift, { useCombobox, useMultipleSelection } from "downshift";
36
+ import isEqual from "react-fast-compare";
39
37
 
40
- const {
41
- InputBlur,
42
- InputKeyDownEnter,
43
- ItemClick,
44
- MenuMouseLeave,
45
- InputKeyDownArrowUp,
46
- InputKeyDownArrowDown,
47
- ItemMouseMove,
48
- InputClick,
49
- ToggleButtonClick,
50
- FunctionToggleMenu,
51
- InputChange,
52
- InputKeyDownEscape,
53
- FunctionSetHighlightedIndex
54
- } = useCombobox.stateChangeTypes;
55
- const {
56
- SelectedItemKeyDownBackspace,
57
- SelectedItemKeyDownDelete,
58
- DropdownKeyDownBackspace,
59
- FunctionRemoveSelectedItem
60
- } = useMultipleSelection.stateChangeTypes;
61
- const FilterableMultiSelect = /*#__PURE__*/forwardRef(function FilterableMultiSelect({
62
- autoAlign = false,
63
- className: containerClassName,
64
- clearSelectionDescription = 'Total items selected: ',
65
- clearSelectionText = 'To clear selection, press Delete or Backspace',
66
- compareItems = defaultCompareItems,
67
- decorator,
68
- direction = 'bottom',
69
- disabled = false,
70
- downshiftProps,
71
- filterItems = defaultFilterItems,
72
- helperText,
73
- hideLabel,
74
- id,
75
- initialSelectedItems = [],
76
- invalid = false,
77
- invalidText,
78
- items,
79
- itemToElement: ItemToElement,
80
- // needs to be capitalized for react to render it correctly
81
- itemToString = defaultItemToString,
82
- light,
83
- locale = 'en',
84
- onInputValueChange,
85
- open = false,
86
- onChange,
87
- onMenuChange,
88
- placeholder,
89
- readOnly,
90
- titleText,
91
- type,
92
- selectionFeedback = 'top-after-reopen',
93
- selectedItems: selected,
94
- size: size$1,
95
- sortItems = defaultSortItems,
96
- translateWithId,
97
- useTitleInItem,
98
- warn = false,
99
- warnText,
100
- slug,
101
- inputProps
102
- }, ref) {
103
- const {
104
- isFluid
105
- } = useContext(FormContext);
106
- const isFirstRender = useRef(true);
107
- // eslint-disable-next-line @typescript-eslint/no-unused-vars -- https://github.com/carbon-design-system/carbon/issues/20452
108
- const [isFocused, setIsFocused] = useState(false);
109
- const [isOpen, setIsOpen] = useState(!!open);
110
- const [prevOpen, setPrevOpen] = useState(!!open);
111
- const [inputValue, setInputValue] = useState('');
112
- const [topItems, setTopItems] = useState(initialSelectedItems ?? []);
113
- const [inputFocused, setInputFocused] = useState(false);
114
- const filteredItems = useMemo(() => filterItems(items, {
115
- itemToString,
116
- inputValue
117
- }), [items, inputValue, itemToString, filterItems]);
118
- const nonSelectAllItems = useMemo(
119
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
120
- () => filteredItems.filter(item => !item.isSelectAll), [filteredItems]);
121
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
122
- const selectAll = filteredItems.some(item => item.isSelectAll);
123
- const {
124
- selectedItems: controlledSelectedItems,
125
- onItemChange,
126
- clearSelection,
127
- toggleAll
128
- } = useSelection({
129
- disabled,
130
- initialSelectedItems,
131
- onChange,
132
- selectedItems: selected,
133
- selectAll,
134
- filteredItems
135
- });
136
- const selectAllStatus = useMemo(() => {
137
- const selectable = nonSelectAllItems.filter(
138
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
139
- item => !item.disabled);
140
- const nonSelectedCount = selectable.filter(item => !controlledSelectedItems.some(sel => isEqual(sel, item))).length;
141
- const totalCount = selectable.length;
142
- return {
143
- checked: totalCount > 0 && nonSelectedCount === 0,
144
- indeterminate: nonSelectedCount > 0 && nonSelectedCount < totalCount
145
- };
146
- }, [controlledSelectedItems, nonSelectAllItems]);
147
- const handleSelectAllClick = useCallback(() => {
148
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
149
- const selectable = nonSelectAllItems.filter(i => !i.disabled);
150
- const {
151
- checked,
152
- indeterminate
153
- } = selectAllStatus;
154
-
155
- // clear all options if select-all state is checked or indeterminate
156
- if (checked || indeterminate) {
157
- const remainingSelectedItems = controlledSelectedItems.filter(sel => !filteredItems.some(e => isEqual(e, sel)));
158
- toggleAll(remainingSelectedItems);
159
-
160
- // select all options if select-all state is empty
161
- } else {
162
- const toSelect = selectable.filter(e => !controlledSelectedItems.some(sel => isEqual(sel, e)));
163
- toggleAll([...controlledSelectedItems, ...toSelect]);
164
- }
165
- // eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20452
166
- }, [nonSelectAllItems, selectAllStatus, controlledSelectedItems, toggleAll]);
167
- const {
168
- refs,
169
- floatingStyles,
170
- middlewareData
171
- } = useFloating(autoAlign ? {
172
- placement: direction,
173
- // The floating element is positioned relative to its nearest
174
- // containing block (usually the viewport). It will in many cases also
175
- // “break” the floating element out of a clipping ancestor.
176
- // https://floating-ui.com/docs/misc#clipping
177
- strategy: 'fixed',
178
- // Middleware order matters, arrow should be last
179
- middleware: [flip({
180
- crossAxis: false
181
- }), size({
182
- apply({
183
- rects,
184
- elements
185
- }) {
186
- Object.assign(elements.floating.style, {
187
- width: `${rects.reference.width}px`
188
- });
189
- }
190
- }), hide()],
191
- whileElementsMounted: autoUpdate
192
- } : {});
193
- useIsomorphicEffect(() => {
194
- if (autoAlign) {
195
- const updatedFloatingStyles = {
196
- ...floatingStyles,
197
- visibility: middlewareData.hide?.referenceHidden ? 'hidden' : 'visible'
198
- };
199
- Object.keys(updatedFloatingStyles).forEach(style => {
200
- if (refs.floating.current) {
201
- refs.floating.current.style[style] = updatedFloatingStyles[style];
202
- }
203
- });
204
- }
205
- }, [autoAlign, floatingStyles, refs.floating, middlewareData, open]);
206
- const textInput = useRef(null);
207
- const filterableMultiSelectInstanceId = useId();
208
- const prefix = usePrefix();
209
- if (prevOpen !== open) {
210
- setIsOpen(open);
211
- setPrevOpen(open);
212
- }
213
-
214
- // memoize sorted items to reduce unnecessary expensive sort on rerender
215
- const sortedItems = useMemo(() => {
216
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
217
- const selectAllItem = items.find(item => item.isSelectAll);
218
- const selectableRealItems = nonSelectAllItems.filter(
219
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
220
- item => !item.disabled);
221
-
222
- // Sort only non-select-all items, select-all item must stay at the top
223
- const sortedReal = sortItems(nonSelectAllItems, {
224
- selectedItems: {
225
- top: controlledSelectedItems,
226
- fixed: [],
227
- 'top-after-reopen': topItems
228
- }[selectionFeedback],
229
- itemToString,
230
- compareItems,
231
- locale
232
- });
233
-
234
- // Only show select-all-item if there exist non-disabled filtered items to select
235
- if (selectAllItem && selectableRealItems.length > 0) {
236
- return [selectAllItem, ...sortedReal];
237
- }
238
- return sortedReal;
239
- // eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20452
240
- }, [items, inputValue, controlledSelectedItems, topItems, selectionFeedback, itemToString, compareItems, locale, sortItems, nonSelectAllItems]);
241
- const normalizedProps = useNormalizedInputProps({
242
- id,
243
- disabled,
244
- readOnly,
245
- invalid,
246
- warn
247
- });
248
- const inline = type === 'inline';
249
- const showWarning = normalizedProps.warn;
250
- const showHelperText = !normalizedProps.warn && !normalizedProps.invalid;
251
- const wrapperClasses = cx(`${prefix}--multi-select__wrapper`, `${prefix}--multi-select--filterable__wrapper`, `${prefix}--list-box__wrapper`, containerClassName, {
252
- [`${prefix}--multi-select__wrapper--inline`]: inline,
253
- [`${prefix}--list-box__wrapper--inline`]: inline,
254
- [`${prefix}--multi-select__wrapper--inline--invalid`]: inline && normalizedProps.invalid,
255
- [`${prefix}--list-box__wrapper--inline--invalid`]: inline && normalizedProps.invalid,
256
- [`${prefix}--list-box--up`]: direction === 'top',
257
- [`${prefix}--list-box__wrapper--fluid--invalid`]: isFluid && normalizedProps.invalid,
258
- [`${prefix}--list-box__wrapper--slug`]: slug,
259
- [`${prefix}--list-box__wrapper--decorator`]: decorator,
260
- [`${prefix}--autoalign`]: autoAlign
261
- });
262
- const hasHelper = typeof helperText !== 'undefined' && helperText !== null;
263
- const helperId = !hasHelper ? undefined : `filterablemultiselect-helper-text-${filterableMultiSelectInstanceId}`;
264
- const labelId = `${id}-label`;
265
- const titleClasses = cx({
266
- [`${prefix}--label`]: true,
267
- [`${prefix}--label--disabled`]: disabled,
268
- [`${prefix}--visually-hidden`]: hideLabel
269
- });
270
- const helperClasses = cx({
271
- [`${prefix}--form__helper-text`]: true,
272
- [`${prefix}--form__helper-text--disabled`]: disabled
273
- });
274
- const inputClasses = cx({
275
- [`${prefix}--text-input`]: true,
276
- [`${prefix}--text-input--empty`]: !inputValue,
277
- [`${prefix}--text-input--light`]: light
278
- });
279
- const helper = hasHelper && /*#__PURE__*/React.createElement("div", {
280
- id: helperId,
281
- className: helperClasses
282
- }, helperText);
283
- const menuId = `${id}__menu`;
284
- const inputId = `${id}-input`;
285
- useEffect(() => {
286
- if (!isOpen) {
287
- setTopItems(controlledSelectedItems);
288
- }
289
- }, [controlledSelectedItems, isOpen, setTopItems]);
290
- const validateHighlightFocus = () => {
291
- if (controlledSelectedItems.length > 0) {
292
- setHighlightedIndex(0);
293
- }
294
- };
295
- function handleMenuChange(forceIsOpen) {
296
- if (!readOnly) {
297
- const nextIsOpen = forceIsOpen ?? !isOpen;
298
- setIsOpen(nextIsOpen);
299
- validateHighlightFocus();
300
- }
301
- }
302
- useEffect(() => {
303
- if (isFirstRender.current) {
304
- isFirstRender.current = false;
305
- if (open) {
306
- onMenuChange?.(isOpen);
307
- }
308
- } else {
309
- onMenuChange?.(isOpen);
310
- }
311
- }, [isOpen, onMenuChange, open]);
312
- useEffect(() => {
313
- const handleClickOutside = event => {
314
- const target = event.target;
315
- if (!(target instanceof Node)) return;
316
- const wrapper = document.getElementById(id)?.closest(`.${prefix}--multi-select__wrapper`);
317
-
318
- // If click is outside our component and menu is open or input is focused
319
- if (wrapper && !wrapper.contains(target)) {
320
- if (isOpen || inputFocused) {
321
- setIsOpen(false);
322
- setInputFocused(false);
323
- setInputValue('');
324
- }
325
- }
326
- };
327
- if (inputFocused || isOpen) {
328
- document.addEventListener('mousedown', handleClickOutside);
329
- }
330
- return () => {
331
- document.removeEventListener('mousedown', handleClickOutside);
332
- };
333
- // eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20452
334
- }, [isOpen, inputFocused]);
335
- const {
336
- getToggleButtonProps,
337
- getLabelProps,
338
- getMenuProps,
339
- getInputProps,
340
- highlightedIndex,
341
- setHighlightedIndex,
342
- getItemProps,
343
- openMenu,
344
- isOpen: isMenuOpen
345
- } = useCombobox({
346
- isOpen,
347
- items: sortedItems,
348
- // defaultHighlightedIndex: 0, // after selection, highlight the first item.
349
- itemToString,
350
- id,
351
- labelId,
352
- menuId,
353
- inputId,
354
- inputValue,
355
- stateReducer,
356
- // eslint-disable-next-line @typescript-eslint/no-unused-vars -- https://github.com/carbon-design-system/carbon/issues/20452
357
- isItemDisabled(item, _index) {
358
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
359
- return item?.disabled;
360
- }
361
- });
362
- function stateReducer(state, actionAndChanges) {
363
- const {
364
- type,
365
- props,
366
- changes
367
- } = actionAndChanges;
368
- const {
369
- highlightedIndex
370
- } = changes;
371
- if (changes.isOpen && !isOpen) {
372
- setTopItems(controlledSelectedItems);
373
- }
374
- switch (type) {
375
- case InputKeyDownEnter:
376
- if (sortedItems.length === 0) {
377
- return changes;
378
- }
379
- if (changes.selectedItem && changes.selectedItem.disabled !== true) {
380
- if (changes.selectedItem.isSelectAll) {
381
- handleSelectAllClick();
382
- } else {
383
- onItemChange(changes.selectedItem);
384
- }
385
- }
386
- setHighlightedIndex(changes.selectedItem);
387
- return {
388
- ...changes,
389
- highlightedIndex: state.highlightedIndex
390
- };
391
- case ItemClick:
392
- if (changes.selectedItem.isSelectAll) {
393
- handleSelectAllClick();
394
- } else {
395
- onItemChange(changes.selectedItem);
396
- }
397
- setHighlightedIndex(changes.selectedItem);
398
- return changes;
399
- case InputBlur:
400
- case InputKeyDownEscape:
401
- setIsOpen(false);
402
- return changes;
403
- case FunctionToggleMenu:
404
- case ToggleButtonClick:
405
- validateHighlightFocus();
406
- if (changes.isOpen && !changes.selectedItem) {
407
- return {
408
- ...changes
409
- };
410
- }
411
- return {
412
- ...changes,
413
- highlightedIndex: controlledSelectedItems.length > 0 ? 0 : -1
414
- };
415
- case InputChange:
416
- if (onInputValueChange) {
417
- onInputValueChange(changes.inputValue);
418
- }
419
- setInputValue(changes.inputValue ?? '');
420
- setIsOpen(true);
421
- return {
422
- ...changes,
423
- highlightedIndex: 0
424
- };
425
- case InputClick:
426
- setIsOpen(changes.isOpen || false);
427
- validateHighlightFocus();
428
- if (changes.isOpen && !changes.selectedItem) {
429
- return {
430
- ...changes
431
- };
432
- }
433
- return {
434
- ...changes,
435
- isOpen: false,
436
- highlightedIndex: controlledSelectedItems.length > 0 ? 0 : -1
437
- };
438
- case MenuMouseLeave:
439
- return {
440
- ...changes,
441
- highlightedIndex: state.highlightedIndex
442
- };
443
- case InputKeyDownArrowUp:
444
- case InputKeyDownArrowDown:
445
- if (InputKeyDownArrowDown === type && !isOpen) {
446
- setIsOpen(true);
447
- return {
448
- ...changes,
449
- highlightedIndex: 0
450
- };
451
- }
452
- if (highlightedIndex > -1) {
453
- const itemArray = document.querySelectorAll(`li.${prefix}--list-box__menu-item[role="option"]`);
454
- props.scrollIntoView(itemArray[highlightedIndex]);
455
- }
456
- if (highlightedIndex === -1) {
457
- return {
458
- ...changes,
459
- highlightedIndex: 0
460
- };
461
- }
462
- return changes;
463
- case ItemMouseMove:
464
- return {
465
- ...changes,
466
- highlightedIndex: state.highlightedIndex
467
- };
468
- case FunctionSetHighlightedIndex:
469
- if (!isOpen) {
470
- return {
471
- ...changes,
472
- highlightedIndex: 0
473
- };
474
- } else {
475
- return {
476
- ...changes,
477
- highlightedIndex: props.items.indexOf(highlightedIndex)
478
- };
479
- }
480
- default:
481
- return changes;
482
- }
483
- }
484
- const {
485
- getDropdownProps
486
- } = useMultipleSelection({
487
- activeIndex: highlightedIndex,
488
- initialSelectedItems,
489
- selectedItems: controlledSelectedItems,
490
- onStateChange(changes) {
491
- switch (changes.type) {
492
- case SelectedItemKeyDownBackspace:
493
- case SelectedItemKeyDownDelete:
494
- case DropdownKeyDownBackspace:
495
- case FunctionRemoveSelectedItem:
496
- {
497
- clearSelection();
498
- break;
499
- }
500
- }
501
- },
502
- ...downshiftProps
503
- });
504
- useEffect(() => {
505
- if (isOpen && !isMenuOpen) {
506
- openMenu();
507
- }
508
- });
509
- function clearInputValue(event) {
510
- const value = textInput.current?.value;
511
- if (value?.length === 1 || event && 'key' in event && match(event, Escape)) {
512
- setInputValue('');
513
- } else {
514
- setInputValue(value ?? '');
515
- }
516
- if (textInput.current) {
517
- textInput.current.focus();
518
- }
519
- }
520
-
521
- // AILabel always size `mini`
522
- const candidate = slug ?? decorator;
523
- const candidateIsAILabel = isComponentElement(candidate, AILabel);
524
- const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/cloneElement(candidate, {
525
- size: 'mini'
526
- }) : candidate;
527
-
528
- // exclude the select-all item from the count
529
- const selectedItemsLength = controlledSelectedItems.filter(
530
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
531
- item => !item.isSelectAll).length;
532
- const className = cx(`${prefix}--multi-select`, `${prefix}--combo-box`, `${prefix}--multi-select--filterable`, {
533
- [`${prefix}--multi-select--invalid`]: normalizedProps.invalid,
534
- [`${prefix}--multi-select--invalid--focused`]: inputFocused && normalizedProps.invalid,
535
- [`${prefix}--multi-select--open`]: isOpen,
536
- [`${prefix}--multi-select--inline`]: inline,
537
- [`${prefix}--multi-select--selected`]: controlledSelectedItems?.length > 0,
538
- [`${prefix}--multi-select--filterable--input-focused`]: inputFocused,
539
- [`${prefix}--multi-select--readonly`]: readOnly,
540
- [`${prefix}--multi-select--selectall`]: selectAll
541
- });
542
- const labelProps = getLabelProps();
543
- const buttonProps = getToggleButtonProps({
544
- disabled,
545
- onClick: () => {
546
- handleMenuChange(!isOpen);
547
- textInput.current?.focus();
548
- },
549
- // When we moved the "root node" of Downshift to the <input> for
550
- // ARIA 1.2 compliance, we unfortunately hit this branch for the
551
- // "mouseup" event that downshift listens to:
552
- // https://github.com/downshift-js/downshift/blob/v5.2.1/src/downshift.js#L1051-L1065
553
- //
554
- // As a result, it will reset the state of the component and so we
555
- // stop the event from propagating to prevent this. This allows the
556
- // toggleMenu behavior for the toggleButton to correctly open and
557
- // close the menu.
558
- onMouseUp(event) {
559
- if (isOpen) {
560
- event.stopPropagation();
561
- }
562
- }
563
- });
564
- const inputProp = getInputProps(getDropdownProps({
565
- 'aria-controls': isOpen ? menuId : undefined,
566
- 'aria-describedby': helperText && showHelperText ? helperId : undefined,
567
- 'aria-haspopup': 'listbox',
568
- // Remove excess aria `aria-labelledby`. HTML <label for>
569
- // provides this aria information.
570
- 'aria-labelledby': undefined,
571
- disabled,
572
- placeholder,
573
- preventKeyAction: isOpen,
574
- ...inputProps,
575
- onClick: () => handleMenuChange(true),
576
- onKeyDown(event) {
577
- const $input = event.target;
578
- const $value = $input.value;
579
- if (match(event, Space)) {
580
- event.stopPropagation();
581
- }
582
- if (match(event, Enter)) {
583
- handleMenuChange(true);
584
- }
585
- if (!disabled) {
586
- if (match(event, Delete) || match(event, Escape)) {
587
- if (isOpen) {
588
- handleMenuChange(true);
589
- clearInputValue(event);
590
- event.stopPropagation();
591
- } else if (!isOpen) {
592
- clearInputValue(event);
593
- clearSelection();
594
- event.stopPropagation();
595
- }
596
- }
597
- }
598
- if (match(event, Tab)) {
599
- handleMenuChange(false);
600
- }
601
- if (match(event, Home)) {
602
- $input.setSelectionRange(0, 0);
603
- }
604
- if (match(event, End)) {
605
- $input.setSelectionRange($value.length, $value.length);
606
- }
607
- },
608
- onFocus: () => setInputFocused(true),
609
- onBlur: () => {
610
- setInputFocused(false);
611
- setInputValue('');
612
- }
613
- }));
614
-
615
- // Memoize the value of getMenuProps to avoid an infinite loop
616
- const menuProps = useMemo(() => getMenuProps({
617
- ref: autoAlign ? refs.setFloating : null,
618
- hidden: !isOpen
619
- }, {
620
- suppressRefError: true
621
- }), [autoAlign, getMenuProps, isOpen, refs.setFloating]);
622
- const handleFocus = evt => {
623
- if (evt?.target.classList.contains(`${prefix}--tag__close-icon`) || evt?.target.classList.contains(`${prefix}--list-box__selection`)) {
624
- setIsFocused(false);
625
- } else {
626
- setIsFocused(evt?.type === 'focus');
627
- }
628
- };
629
- const mergedRef = mergeRefs(textInput, inputProp.ref);
630
- const readOnlyEventHandlers = readOnly ? {
631
- onClick: evt => {
632
- // NOTE: does not prevent click
633
- evt.preventDefault();
634
- // focus on the element as per readonly input behavior
635
- if (textInput.current) {
636
- textInput.current.focus();
637
- }
638
- },
639
- onKeyDown: evt => {
640
- const selectAccessKeys = ['ArrowDown', 'ArrowUp', ' ', 'Enter'];
641
- // This prevents the select from opening for the above keys
642
- if (selectAccessKeys.includes(evt.key)) {
643
- evt.preventDefault();
644
- }
645
- }
646
- } : {};
647
- const clearSelectionContent = controlledSelectedItems.length > 0 ? `${clearSelectionDescription} ${controlledSelectedItems.length}. ${clearSelectionText}.` : `${clearSelectionDescription} 0.`;
648
- return /*#__PURE__*/React.createElement("div", {
649
- className: wrapperClasses
650
- }, titleText ? /*#__PURE__*/React.createElement("label", _extends({
651
- className: titleClasses
652
- }, labelProps), titleText, /*#__PURE__*/React.createElement("span", {
653
- className: `${prefix}--visually-hidden`
654
- }, clearSelectionContent)) : null, /*#__PURE__*/React.createElement(ListBox, {
655
- onFocus: isFluid ? handleFocus : undefined,
656
- onBlur: isFluid ? handleFocus : undefined,
657
- className: className,
658
- disabled: disabled,
659
- light: light,
660
- ref: ref,
661
- id: id,
662
- invalid: normalizedProps.invalid,
663
- invalidText: invalidText,
664
- warn: normalizedProps.warn,
665
- warnText: warnText,
666
- isOpen: !readOnly && isOpen,
667
- size: size$1
668
- }, /*#__PURE__*/React.createElement("div", {
669
- className: `${prefix}--list-box__field`,
670
- ref: autoAlign ? refs.setReference : null
671
- }, controlledSelectedItems.length > 0 && /*#__PURE__*/React.createElement(ListBoxSelection, {
672
- readOnly: readOnly,
673
- clearSelection: () => {
674
- clearSelection();
675
- if (textInput.current) {
676
- textInput.current.focus();
677
- }
678
- },
679
- selectionCount: selectedItemsLength,
680
- translateWithId: translateWithId,
681
- disabled: disabled
682
- }), /*#__PURE__*/React.createElement("input", _extends({
683
- className: inputClasses
684
- }, inputProp, {
685
- ref: mergedRef
686
- }, readOnlyEventHandlers, {
687
- readOnly: readOnly
688
- })), normalizedProps.invalid && /*#__PURE__*/React.createElement(WarningFilled, {
689
- className: `${prefix}--list-box__invalid-icon`
690
- }), showWarning && /*#__PURE__*/React.createElement(WarningAltFilled, {
691
- className: `${prefix}--list-box__invalid-icon ${prefix}--list-box__invalid-icon--warning`
692
- }), inputValue && /*#__PURE__*/React.createElement(ListBoxSelection, {
693
- clearSelection: clearInputValue,
694
- disabled: disabled,
695
- translateWithId: translateWithId,
696
- readOnly: readOnly,
697
- onMouseUp: event => {
698
- // If we do not stop this event from propagating,
699
- // it seems like Downshift takes our event and
700
- // prevents us from getting `onClick` /
701
- // `clearSelection` from the underlying <button> in
702
- // ListBoxSelection
703
- event.stopPropagation();
704
- }
705
- }), /*#__PURE__*/React.createElement(ListBoxTrigger, _extends({}, buttonProps, {
706
- isOpen: isOpen,
707
- translateWithId: translateWithId
708
- }))), slug ? normalizedDecorator : decorator ? /*#__PURE__*/React.createElement("div", {
709
- className: `${prefix}--list-box__inner-wrapper--decorator`
710
- }, candidateIsAILabel ? normalizedDecorator : /*#__PURE__*/React.createElement("span", null, normalizedDecorator)) : '', /*#__PURE__*/React.createElement(ListBox.Menu, menuProps, isOpen ? sortedItems.map((item, index) => {
711
- let isChecked;
712
- let isIndeterminate = false;
713
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
714
- if (item.isSelectAll) {
715
- isChecked = selectAllStatus.checked;
716
- isIndeterminate = selectAllStatus.indeterminate;
717
- } else {
718
- isChecked = controlledSelectedItems.filter(selected => isEqual(selected, item)).length > 0;
719
- }
720
- const itemProps = getItemProps({
721
- item,
722
- ['aria-selected']: isChecked
723
- });
724
- const itemText = itemToString(item);
725
-
726
- // The initial implementation using <Downshift> would place the disabled attribute
727
- // on disabled menu items. Conversely, useCombobox places aria-disabled instead.
728
- // To avoid any potential breaking changes, we avoid placing aria-disabled and
729
- // instead match the old behavior of placing the disabled attribute.
730
- const disabled = itemProps['aria-disabled'];
731
- const {
732
- 'aria-disabled': unusedAriaDisabled,
733
- // eslint-disable-line @typescript-eslint/no-unused-vars
734
- ...modifiedItemProps
735
- } = itemProps;
736
- return /*#__PURE__*/React.createElement(ListBox.MenuItem, _extends({
737
- key: itemProps.id,
738
- "aria-label": itemText,
739
- "aria-checked": isIndeterminate ? 'mixed' : isChecked,
740
- isActive: isChecked && !item['isSelectAll'],
741
- isHighlighted: highlightedIndex === index,
742
- title: itemText,
743
- disabled: disabled
744
- }, modifiedItemProps), /*#__PURE__*/React.createElement("div", {
745
- className: `${prefix}--checkbox-wrapper`
746
- }, /*#__PURE__*/React.createElement(Checkbox, {
747
- id: `${itemProps.id}-item`,
748
- labelText: ItemToElement ? /*#__PURE__*/React.createElement(ItemToElement, _extends({
749
- key: itemProps.id
750
- }, item)) : itemText,
751
- checked: isChecked,
752
- title: useTitleInItem ? itemText : undefined,
753
- indeterminate: isIndeterminate,
754
- disabled: disabled,
755
- tabIndex: -1
756
- })));
757
- }) : null)), !inline && showHelperText ? helper : null);
38
+ //#region src/components/MultiSelect/FilterableMultiSelect.tsx
39
+ /**
40
+ * Copyright IBM Corp. 2016, 2026
41
+ *
42
+ * This source code is licensed under the Apache-2.0 license found in the
43
+ * LICENSE file in the root directory of this source tree.
44
+ */
45
+ const { InputBlur, InputKeyDownEnter, ItemClick, MenuMouseLeave, InputKeyDownArrowUp, InputKeyDownArrowDown, ItemMouseMove, InputClick, ToggleButtonClick, FunctionToggleMenu, InputChange, InputKeyDownEscape, FunctionSetHighlightedIndex } = useCombobox.stateChangeTypes;
46
+ const { SelectedItemKeyDownBackspace, SelectedItemKeyDownDelete, DropdownKeyDownBackspace, FunctionRemoveSelectedItem } = useMultipleSelection.stateChangeTypes;
47
+ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAlign = false, className: containerClassName, clearSelectionDescription = "Total items selected: ", clearSelectionText = "To clear selection, press Delete or Backspace", compareItems = defaultCompareItems, decorator, direction = "bottom", disabled = false, downshiftProps, filterItems = defaultFilterItems, helperText, hideLabel, id, initialSelectedItems = [], invalid = false, invalidText, items, itemToElement: ItemToElement, itemToString = defaultItemToString, light, locale = "en", onInputValueChange, open = false, onChange, onMenuChange, placeholder, readOnly, titleText, type, selectionFeedback = "top-after-reopen", selectedItems: selected, size: size$1, sortItems = defaultSortItems, translateWithId, useTitleInItem, warn = false, warnText, slug, inputProps }, ref) {
48
+ const { isFluid } = useContext(FormContext);
49
+ const isFirstRender = useRef(true);
50
+ const [isOpen, setIsOpen] = useState(!!open);
51
+ const [inputValue, setInputValue] = useState("");
52
+ const [topItems, setTopItems] = useState(initialSelectedItems ?? []);
53
+ const [inputFocused, setInputFocused] = useState(false);
54
+ const filteredItems = useMemo(() => filterItems(items, {
55
+ itemToString,
56
+ inputValue
57
+ }), [
58
+ items,
59
+ inputValue,
60
+ itemToString,
61
+ filterItems
62
+ ]);
63
+ const nonSelectAllItems = useMemo(() => filteredItems.filter((item) => !item.isSelectAll), [filteredItems]);
64
+ const selectAll = filteredItems.some((item) => item.isSelectAll);
65
+ const { selectedItems: controlledSelectedItems, onItemChange, clearSelection, toggleAll } = useSelection({
66
+ disabled,
67
+ initialSelectedItems,
68
+ onChange,
69
+ selectedItems: selected,
70
+ selectAll,
71
+ filteredItems
72
+ });
73
+ const selectAllStatus = useMemo(() => {
74
+ const selectable = nonSelectAllItems.filter((item) => !item.disabled);
75
+ const nonSelectedCount = selectable.filter((item) => !controlledSelectedItems.some((sel) => isEqual(sel, item))).length;
76
+ const totalCount = selectable.length;
77
+ return {
78
+ checked: totalCount > 0 && nonSelectedCount === 0,
79
+ indeterminate: nonSelectedCount > 0 && nonSelectedCount < totalCount
80
+ };
81
+ }, [controlledSelectedItems, nonSelectAllItems]);
82
+ const handleSelectAllClick = useCallback(() => {
83
+ const selectable = nonSelectAllItems.filter((i) => !i.disabled);
84
+ const { checked, indeterminate } = selectAllStatus;
85
+ if (checked || indeterminate) toggleAll(controlledSelectedItems.filter((sel) => !filteredItems.some((e) => isEqual(e, sel))));
86
+ else {
87
+ const toSelect = selectable.filter((e) => !controlledSelectedItems.some((sel) => isEqual(sel, e)));
88
+ toggleAll([...controlledSelectedItems, ...toSelect]);
89
+ }
90
+ }, [
91
+ nonSelectAllItems,
92
+ selectAllStatus,
93
+ controlledSelectedItems,
94
+ toggleAll
95
+ ]);
96
+ const { refs, floatingStyles, middlewareData } = useFloating(autoAlign ? {
97
+ placement: direction,
98
+ strategy: "fixed",
99
+ middleware: [
100
+ flip({ crossAxis: false }),
101
+ size({ apply({ rects, elements }) {
102
+ Object.assign(elements.floating.style, { width: `${rects.reference.width}px` });
103
+ } }),
104
+ hide()
105
+ ],
106
+ whileElementsMounted: autoUpdate
107
+ } : {});
108
+ useIsomorphicEffect(() => {
109
+ if (autoAlign) {
110
+ const updatedFloatingStyles = {
111
+ ...floatingStyles,
112
+ visibility: middlewareData.hide?.referenceHidden ? "hidden" : "visible"
113
+ };
114
+ Object.keys(updatedFloatingStyles).forEach((style) => {
115
+ if (refs.floating.current) refs.floating.current.style[style] = updatedFloatingStyles[style];
116
+ });
117
+ }
118
+ }, [
119
+ autoAlign,
120
+ floatingStyles,
121
+ refs.floating,
122
+ middlewareData,
123
+ open
124
+ ]);
125
+ const textInput = useRef(null);
126
+ const filterableMultiSelectInstanceId = useId();
127
+ const prefix = usePrefix();
128
+ useEffect(() => {
129
+ setIsOpen(open);
130
+ }, [open]);
131
+ const sortedItems = useMemo(() => {
132
+ const selectAllItem = items.find((item) => item.isSelectAll);
133
+ const selectableRealItems = nonSelectAllItems.filter((item) => !item.disabled);
134
+ const sortedReal = sortItems(nonSelectAllItems, {
135
+ selectedItems: {
136
+ top: controlledSelectedItems,
137
+ fixed: [],
138
+ "top-after-reopen": topItems
139
+ }[selectionFeedback],
140
+ itemToString,
141
+ compareItems,
142
+ locale
143
+ });
144
+ if (selectAllItem && selectableRealItems.length > 0) return [selectAllItem, ...sortedReal];
145
+ return sortedReal;
146
+ }, [
147
+ items,
148
+ inputValue,
149
+ controlledSelectedItems,
150
+ topItems,
151
+ selectionFeedback,
152
+ itemToString,
153
+ compareItems,
154
+ locale,
155
+ sortItems,
156
+ nonSelectAllItems
157
+ ]);
158
+ const normalizedProps = useNormalizedInputProps({
159
+ id,
160
+ disabled,
161
+ readOnly,
162
+ invalid,
163
+ warn
164
+ });
165
+ const inline = type === "inline";
166
+ const showWarning = normalizedProps.warn;
167
+ const showHelperText = !normalizedProps.warn && !normalizedProps.invalid;
168
+ const wrapperClasses = classNames(`${prefix}--multi-select__wrapper`, `${prefix}--multi-select--filterable__wrapper`, `${prefix}--list-box__wrapper`, containerClassName, {
169
+ [`${prefix}--multi-select__wrapper--inline`]: inline,
170
+ [`${prefix}--list-box__wrapper--inline`]: inline,
171
+ [`${prefix}--multi-select__wrapper--inline--invalid`]: inline && normalizedProps.invalid,
172
+ [`${prefix}--list-box__wrapper--inline--invalid`]: inline && normalizedProps.invalid,
173
+ [`${prefix}--list-box--up`]: direction === "top",
174
+ [`${prefix}--list-box__wrapper--fluid--invalid`]: isFluid && normalizedProps.invalid,
175
+ [`${prefix}--list-box__wrapper--slug`]: slug,
176
+ [`${prefix}--list-box__wrapper--decorator`]: decorator,
177
+ [`${prefix}--autoalign`]: autoAlign
178
+ });
179
+ const hasHelper = typeof helperText !== "undefined" && helperText !== null;
180
+ const helperId = !hasHelper ? void 0 : `filterablemultiselect-helper-text-${filterableMultiSelectInstanceId}`;
181
+ const labelId = `${id}-label`;
182
+ const titleClasses = classNames({
183
+ [`${prefix}--label`]: true,
184
+ [`${prefix}--label--disabled`]: disabled,
185
+ [`${prefix}--visually-hidden`]: hideLabel
186
+ });
187
+ const helperClasses = classNames({
188
+ [`${prefix}--form__helper-text`]: true,
189
+ [`${prefix}--form__helper-text--disabled`]: disabled
190
+ });
191
+ const inputClasses = classNames({
192
+ [`${prefix}--text-input`]: true,
193
+ [`${prefix}--text-input--empty`]: !inputValue,
194
+ [`${prefix}--text-input--light`]: light
195
+ });
196
+ const helper = hasHelper && /* @__PURE__ */ jsx("div", {
197
+ id: helperId,
198
+ className: helperClasses,
199
+ children: helperText
200
+ });
201
+ const menuId = `${id}__menu`;
202
+ const inputId = `${id}-input`;
203
+ useEffect(() => {
204
+ if (!isOpen) setTopItems(controlledSelectedItems);
205
+ }, [
206
+ controlledSelectedItems,
207
+ isOpen,
208
+ setTopItems
209
+ ]);
210
+ const validateHighlightFocus = () => {
211
+ if (controlledSelectedItems.length > 0) setHighlightedIndex(0);
212
+ };
213
+ function handleMenuChange(forceIsOpen) {
214
+ if (!readOnly) {
215
+ setIsOpen(forceIsOpen ?? !isOpen);
216
+ validateHighlightFocus();
217
+ }
218
+ }
219
+ useEffect(() => {
220
+ if (isFirstRender.current) {
221
+ isFirstRender.current = false;
222
+ if (open) onMenuChange?.(isOpen);
223
+ } else onMenuChange?.(isOpen);
224
+ }, [
225
+ isOpen,
226
+ onMenuChange,
227
+ open
228
+ ]);
229
+ useEffect(() => {
230
+ const handleClickOutside = (event) => {
231
+ const target = event.target;
232
+ if (!(target instanceof Node)) return;
233
+ const wrapper = document.getElementById(id)?.closest(`.${prefix}--multi-select__wrapper`);
234
+ if (wrapper && !wrapper.contains(target)) {
235
+ if (isOpen || inputFocused) {
236
+ setIsOpen(false);
237
+ setInputFocused(false);
238
+ setInputValue("");
239
+ }
240
+ }
241
+ };
242
+ if (inputFocused || isOpen) document.addEventListener("mousedown", handleClickOutside);
243
+ return () => {
244
+ document.removeEventListener("mousedown", handleClickOutside);
245
+ };
246
+ }, [isOpen, inputFocused]);
247
+ const { getToggleButtonProps, getLabelProps, getMenuProps, getInputProps, highlightedIndex, setHighlightedIndex, getItemProps, openMenu, isOpen: isMenuOpen } = useCombobox({
248
+ isOpen,
249
+ items: sortedItems,
250
+ itemToString,
251
+ id,
252
+ labelId,
253
+ menuId,
254
+ inputId,
255
+ inputValue,
256
+ stateReducer,
257
+ isItemDisabled(item) {
258
+ return item?.disabled;
259
+ }
260
+ });
261
+ function stateReducer(state, actionAndChanges) {
262
+ const { type, props, changes } = actionAndChanges;
263
+ const { highlightedIndex } = changes;
264
+ if (changes.isOpen && !isOpen) setTopItems(controlledSelectedItems);
265
+ switch (type) {
266
+ case InputKeyDownEnter:
267
+ if (sortedItems.length === 0) return changes;
268
+ if (changes.selectedItem && changes.selectedItem.disabled !== true) if (changes.selectedItem.isSelectAll) handleSelectAllClick();
269
+ else onItemChange(changes.selectedItem);
270
+ setHighlightedIndex(changes.selectedItem);
271
+ return {
272
+ ...changes,
273
+ highlightedIndex: state.highlightedIndex
274
+ };
275
+ case ItemClick:
276
+ if (changes.selectedItem.isSelectAll) handleSelectAllClick();
277
+ else onItemChange(changes.selectedItem);
278
+ setHighlightedIndex(changes.selectedItem);
279
+ return changes;
280
+ case InputBlur:
281
+ case InputKeyDownEscape:
282
+ setIsOpen(false);
283
+ return changes;
284
+ case FunctionToggleMenu:
285
+ case ToggleButtonClick:
286
+ validateHighlightFocus();
287
+ if (changes.isOpen && !changes.selectedItem) return { ...changes };
288
+ return {
289
+ ...changes,
290
+ highlightedIndex: controlledSelectedItems.length > 0 ? 0 : -1
291
+ };
292
+ case InputChange:
293
+ if (onInputValueChange) onInputValueChange(changes.inputValue);
294
+ setInputValue(changes.inputValue ?? "");
295
+ setIsOpen(true);
296
+ return {
297
+ ...changes,
298
+ highlightedIndex: 0
299
+ };
300
+ case InputClick:
301
+ setIsOpen(changes.isOpen || false);
302
+ validateHighlightFocus();
303
+ if (changes.isOpen && !changes.selectedItem) return { ...changes };
304
+ return {
305
+ ...changes,
306
+ isOpen: false,
307
+ highlightedIndex: controlledSelectedItems.length > 0 ? 0 : -1
308
+ };
309
+ case MenuMouseLeave: return {
310
+ ...changes,
311
+ highlightedIndex: state.highlightedIndex
312
+ };
313
+ case InputKeyDownArrowUp:
314
+ case InputKeyDownArrowDown:
315
+ if (InputKeyDownArrowDown === type && !isOpen) {
316
+ setIsOpen(true);
317
+ return {
318
+ ...changes,
319
+ highlightedIndex: 0
320
+ };
321
+ }
322
+ if (highlightedIndex > -1) {
323
+ const itemArray = document.querySelectorAll(`li.${prefix}--list-box__menu-item[role="option"]`);
324
+ props.scrollIntoView(itemArray[highlightedIndex]);
325
+ }
326
+ if (highlightedIndex === -1) return {
327
+ ...changes,
328
+ highlightedIndex: 0
329
+ };
330
+ return changes;
331
+ case ItemMouseMove: return {
332
+ ...changes,
333
+ highlightedIndex: state.highlightedIndex
334
+ };
335
+ case FunctionSetHighlightedIndex: if (!isOpen) return {
336
+ ...changes,
337
+ highlightedIndex: 0
338
+ };
339
+ else return {
340
+ ...changes,
341
+ highlightedIndex: props.items.indexOf(highlightedIndex)
342
+ };
343
+ default: return changes;
344
+ }
345
+ }
346
+ const { getDropdownProps } = useMultipleSelection({
347
+ activeIndex: highlightedIndex,
348
+ initialSelectedItems,
349
+ selectedItems: controlledSelectedItems,
350
+ onStateChange(changes) {
351
+ switch (changes.type) {
352
+ case SelectedItemKeyDownBackspace:
353
+ case SelectedItemKeyDownDelete:
354
+ case DropdownKeyDownBackspace:
355
+ case FunctionRemoveSelectedItem:
356
+ clearSelection();
357
+ break;
358
+ }
359
+ },
360
+ ...downshiftProps
361
+ });
362
+ useEffect(() => {
363
+ if (isOpen && !isMenuOpen) openMenu();
364
+ });
365
+ function clearInputValue(event) {
366
+ const value = textInput.current?.value;
367
+ if (value?.length === 1 || event && "key" in event && match(event, Escape)) setInputValue("");
368
+ else setInputValue(value ?? "");
369
+ if (textInput.current) textInput.current.focus();
370
+ }
371
+ const candidate = slug ?? decorator;
372
+ const candidateIsAILabel = isComponentElement(candidate, AILabel);
373
+ const normalizedDecorator = candidateIsAILabel ? cloneElement(candidate, { size: "mini" }) : candidate;
374
+ const selectedItemsLength = controlledSelectedItems.filter((item) => !item.isSelectAll).length;
375
+ const className = classNames(`${prefix}--multi-select`, `${prefix}--combo-box`, `${prefix}--multi-select--filterable`, {
376
+ [`${prefix}--multi-select--invalid`]: normalizedProps.invalid,
377
+ [`${prefix}--multi-select--invalid--focused`]: inputFocused && normalizedProps.invalid,
378
+ [`${prefix}--multi-select--open`]: isOpen,
379
+ [`${prefix}--multi-select--inline`]: inline,
380
+ [`${prefix}--multi-select--selected`]: controlledSelectedItems?.length > 0,
381
+ [`${prefix}--multi-select--filterable--input-focused`]: inputFocused,
382
+ [`${prefix}--multi-select--readonly`]: readOnly,
383
+ [`${prefix}--multi-select--selectall`]: selectAll
384
+ });
385
+ const labelProps = getLabelProps();
386
+ const buttonProps = getToggleButtonProps({
387
+ disabled,
388
+ onClick: () => {
389
+ handleMenuChange(!isOpen);
390
+ textInput.current?.focus();
391
+ },
392
+ onMouseUp(event) {
393
+ if (isOpen) event.stopPropagation();
394
+ }
395
+ });
396
+ const inputProp = getInputProps(getDropdownProps({
397
+ "aria-controls": isOpen ? menuId : void 0,
398
+ "aria-describedby": helperText && showHelperText ? helperId : void 0,
399
+ "aria-haspopup": "listbox",
400
+ "aria-labelledby": void 0,
401
+ disabled,
402
+ placeholder,
403
+ preventKeyAction: isOpen,
404
+ ...inputProps,
405
+ onClick: () => handleMenuChange(true),
406
+ onKeyDown(event) {
407
+ const $input = event.target;
408
+ const $value = $input.value;
409
+ if (match(event, Space)) event.stopPropagation();
410
+ if (match(event, Enter)) handleMenuChange(true);
411
+ if (!disabled) {
412
+ if (match(event, Delete) || match(event, Escape)) {
413
+ if (isOpen) {
414
+ handleMenuChange(true);
415
+ clearInputValue(event);
416
+ event.stopPropagation();
417
+ } else if (!isOpen) {
418
+ clearInputValue(event);
419
+ clearSelection();
420
+ event.stopPropagation();
421
+ }
422
+ }
423
+ }
424
+ if (match(event, Tab)) handleMenuChange(false);
425
+ if (match(event, Home)) $input.setSelectionRange(0, 0);
426
+ if (match(event, End)) $input.setSelectionRange($value.length, $value.length);
427
+ },
428
+ onFocus: () => setInputFocused(true),
429
+ onBlur: () => {
430
+ setInputFocused(false);
431
+ setInputValue("");
432
+ }
433
+ }));
434
+ const menuProps = useMemo(() => getMenuProps({
435
+ ref: autoAlign ? refs.setFloating : null,
436
+ hidden: !isOpen
437
+ }, { suppressRefError: true }), [
438
+ autoAlign,
439
+ getMenuProps,
440
+ isOpen,
441
+ refs.setFloating
442
+ ]);
443
+ const mergedRef = mergeRefs(textInput, inputProp.ref);
444
+ const readOnlyEventHandlers = readOnly ? {
445
+ onClick: (evt) => {
446
+ evt.preventDefault();
447
+ if (textInput.current) textInput.current.focus();
448
+ },
449
+ onKeyDown: (evt) => {
450
+ if ([
451
+ "ArrowDown",
452
+ "ArrowUp",
453
+ " ",
454
+ "Enter"
455
+ ].includes(evt.key)) evt.preventDefault();
456
+ }
457
+ } : {};
458
+ const clearSelectionContent = controlledSelectedItems.length > 0 ? `${clearSelectionDescription} ${controlledSelectedItems.length}. ${clearSelectionText}.` : `${clearSelectionDescription} 0.`;
459
+ return /* @__PURE__ */ jsxs("div", {
460
+ className: wrapperClasses,
461
+ children: [
462
+ titleText ? /* @__PURE__ */ jsxs("label", {
463
+ className: titleClasses,
464
+ ...labelProps,
465
+ children: [titleText, /* @__PURE__ */ jsx("span", {
466
+ className: `${prefix}--visually-hidden`,
467
+ children: clearSelectionContent
468
+ })]
469
+ }) : null,
470
+ /* @__PURE__ */ jsxs(ListBox, {
471
+ className,
472
+ disabled,
473
+ light,
474
+ ref,
475
+ id,
476
+ invalid: normalizedProps.invalid,
477
+ invalidText,
478
+ warn: normalizedProps.warn,
479
+ warnText,
480
+ isOpen: !readOnly && isOpen,
481
+ size: size$1,
482
+ children: [
483
+ /* @__PURE__ */ jsxs("div", {
484
+ className: `${prefix}--list-box__field`,
485
+ ref: autoAlign ? refs.setReference : null,
486
+ children: [
487
+ controlledSelectedItems.length > 0 && /* @__PURE__ */ jsx(ListBoxSelection, {
488
+ readOnly,
489
+ clearSelection: () => {
490
+ clearSelection();
491
+ if (textInput.current) textInput.current.focus();
492
+ },
493
+ selectionCount: selectedItemsLength,
494
+ translateWithId,
495
+ disabled
496
+ }),
497
+ /* @__PURE__ */ jsx("input", {
498
+ className: inputClasses,
499
+ ...inputProp,
500
+ ref: mergedRef,
501
+ ...readOnlyEventHandlers,
502
+ readOnly
503
+ }),
504
+ normalizedProps.invalid && /* @__PURE__ */ jsx(WarningFilled, { className: `${prefix}--list-box__invalid-icon` }),
505
+ showWarning && /* @__PURE__ */ jsx(WarningAltFilled, { className: `${prefix}--list-box__invalid-icon ${prefix}--list-box__invalid-icon--warning` }),
506
+ inputValue && /* @__PURE__ */ jsx(ListBoxSelection, {
507
+ clearSelection: clearInputValue,
508
+ disabled,
509
+ translateWithId,
510
+ readOnly,
511
+ onMouseUp: (event) => {
512
+ event.stopPropagation();
513
+ }
514
+ }),
515
+ /* @__PURE__ */ jsx(ListBoxTrigger, {
516
+ ...buttonProps,
517
+ isOpen,
518
+ translateWithId
519
+ })
520
+ ]
521
+ }),
522
+ slug ? normalizedDecorator : decorator ? /* @__PURE__ */ jsx("div", {
523
+ className: `${prefix}--list-box__inner-wrapper--decorator`,
524
+ children: candidateIsAILabel ? normalizedDecorator : /* @__PURE__ */ jsx("span", { children: normalizedDecorator })
525
+ }) : "",
526
+ /* @__PURE__ */ jsx(ListBox.Menu, {
527
+ ...menuProps,
528
+ children: isOpen ? sortedItems.map((item, index) => {
529
+ let isChecked;
530
+ let isIndeterminate = false;
531
+ if (item.isSelectAll) {
532
+ isChecked = selectAllStatus.checked;
533
+ isIndeterminate = selectAllStatus.indeterminate;
534
+ } else isChecked = controlledSelectedItems.filter((selected) => isEqual(selected, item)).length > 0;
535
+ const itemProps = getItemProps({
536
+ item,
537
+ ["aria-selected"]: isChecked
538
+ });
539
+ const itemText = itemToString(item);
540
+ const disabled = itemProps["aria-disabled"];
541
+ const { "aria-disabled": unusedAriaDisabled, ...modifiedItemProps } = itemProps;
542
+ return /* @__PURE__ */ jsx(ListBox.MenuItem, {
543
+ "aria-label": itemText,
544
+ "aria-checked": isIndeterminate ? "mixed" : isChecked,
545
+ isActive: isChecked && !item["isSelectAll"],
546
+ isHighlighted: highlightedIndex === index,
547
+ title: itemText,
548
+ disabled,
549
+ ...modifiedItemProps,
550
+ children: /* @__PURE__ */ jsx("div", {
551
+ className: `${prefix}--checkbox-wrapper`,
552
+ children: /* @__PURE__ */ jsx(Checkbox_default, {
553
+ id: `${itemProps.id}-item`,
554
+ labelText: ItemToElement ? /* @__PURE__ */ jsx(ItemToElement, { ...item }, itemProps.id) : itemText,
555
+ checked: isChecked,
556
+ title: useTitleInItem ? itemText : void 0,
557
+ indeterminate: isIndeterminate,
558
+ disabled,
559
+ tabIndex: -1
560
+ })
561
+ })
562
+ }, itemProps.id);
563
+ }) : null
564
+ })
565
+ ]
566
+ }),
567
+ !inline && showHelperText ? helper : null
568
+ ]
569
+ });
758
570
  });
759
- FilterableMultiSelect.displayName = 'FilterableMultiSelect';
571
+ FilterableMultiSelect.displayName = "FilterableMultiSelect";
760
572
  FilterableMultiSelect.propTypes = {
761
- /**
762
- * Deprecated, aria-label is no longer needed
763
- * Specify a label to be read by screen readers on the container node
764
- */
765
- ['aria-label']: deprecate(PropTypes.string, 'ariaLabel / aria-label props are no longer required for FilterableMultiSelect'),
766
- /**
767
- * Deprecated, please use `aria-label` instead.
768
- * Specify a label to be read by screen readers on the container note.
769
- */
770
- ariaLabel: deprecate(PropTypes.string, 'ariaLabel / aria-label props are no longer required for FilterableMultiSelect'),
771
- /**
772
- * **Experimental**: Will attempt to automatically align the floating
773
- * element to avoid collisions with the viewport and being clipped by
774
- * ancestor elements. Requires React v17+
775
- * @see https://github.com/carbon-design-system/carbon/issues/18714
776
- */
777
- autoAlign: PropTypes.bool,
778
- /**
779
- * Specify the text that should be read for screen readers that describes total items selected
780
- */
781
- clearSelectionDescription: PropTypes.string,
782
- /**
783
- * Specify the text that should be read for screen readers to clear selection.
784
- */
785
- clearSelectionText: PropTypes.string,
786
- /**
787
- * **Experimental**: Provide a decorator component to be rendered inside the `FilterableMultiSelect` component
788
- */
789
- decorator: PropTypes.node,
790
- /**
791
- * Provide a method that filters the dropdown options based on the current input. Overriding this
792
- * prop means that you have to handle the filtering logic when the user types in the text input.
793
- * Otherwise, a default built-in filtering function will be used.
794
- */
795
- filterItems: PropTypes.func,
796
- /**
797
- * Specify the direction of the multiselect dropdown. Can be either top or bottom.
798
- */
799
- direction: PropTypes.oneOf(['top', 'bottom']),
800
- /**
801
- * Disable the control
802
- */
803
- disabled: PropTypes.bool,
804
- /**
805
- * Additional props passed to Downshift.
806
- *
807
- * **Use with caution:** anything you define here overrides the components'
808
- * internal handling of that prop. Downshift APIs and internals are subject to
809
- * change, and in some cases they can not be shimmed by Carbon to shield you
810
- * from potentially breaking changes.
811
- */
812
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452
813
- // @ts-ignore
814
- downshiftProps: PropTypes.shape(Downshift.propTypes),
815
- /**
816
- * Specify whether the title text should be hidden or not
817
- */
818
- hideLabel: PropTypes.bool,
819
- /**
820
- * Specify a custom `id`
821
- */
822
- id: PropTypes.string.isRequired,
823
- /**
824
- * Allow users to pass in arbitrary items from their collection that are
825
- * pre-selected
826
- */
827
- initialSelectedItems: PropTypes.array,
828
- /**
829
- * Is the current selection invalid?
830
- */
831
- invalid: PropTypes.bool,
832
- /**
833
- * If invalid, what is the error?
834
- */
835
- invalidText: PropTypes.node,
836
- /**
837
- * Function to render items as custom components instead of strings.
838
- * Defaults to null and is overridden by a getter
839
- */
840
- itemToElement: PropTypes.func,
841
- /**
842
- * Helper function passed to downshift that allows the library to render a
843
- * given item to a string label. By default, it extracts the `label` field
844
- * from a given item to serve as the item label in the list.
845
- */
846
- itemToString: PropTypes.func,
847
- /**
848
- * We try to stay as generic as possible here to allow individuals to pass
849
- * in a collection of whatever kind of data structure they prefer
850
- */
851
- items: PropTypes.array.isRequired,
852
- /**
853
- * `true` to use the light version.
854
- */
855
- light: deprecate(PropTypes.bool, 'The `light` prop for `FilterableMultiSelect` has ' + 'been deprecated in favor of the new `Layer` component. It will be removed in the next major release.'),
856
- /**
857
- * Specify the locale of the control. Used for the default `compareItems`
858
- * used for sorting the list of items in the control.
859
- */
860
- locale: PropTypes.string,
861
- /**
862
- * `onChange` is a utility for this controlled component to communicate to a
863
- * consuming component what kind of internal state changes are occurring.
864
- */
865
- onChange: PropTypes.func,
866
- /**
867
- * `onInputValueChange` is a utility for this controlled component to communicate to
868
- * the currently typed input.
869
- */
870
- onInputValueChange: PropTypes.func,
871
- /**
872
- * `onMenuChange` is a utility for this controlled component to communicate to a
873
- * consuming component that the menu was opened(`true`)/closed(`false`).
874
- */
875
- onMenuChange: PropTypes.func,
876
- /**
877
- * Initialize the component with an open(`true`)/closed(`false`) menu.
878
- */
879
- open: PropTypes.bool,
880
- /**
881
- * Generic `placeholder` that will be used as the textual representation of
882
- * what this field is for
883
- */
884
- placeholder: PropTypes.string,
885
- /**
886
- * Specify feedback (mode) of the selection.
887
- * `top`: selected item jumps to top
888
- * `fixed`: selected item stays at it's position
889
- * `top-after-reopen`: selected item jump to top after reopen dropdown
890
- */
891
- selectionFeedback: PropTypes.oneOf(['top', 'fixed', 'top-after-reopen']),
892
- /**
893
- * Specify the size of the ListBox. Currently supports either `sm`, `md` or `lg` as an option.
894
- */
895
- size: ListBoxSizePropType,
896
- slug: deprecate(PropTypes.node, 'The `slug` prop has been deprecated and will be removed in the next major version. Use the decorator prop instead.'),
897
- ...sortingPropTypes,
898
- /**
899
- * Provide text to be used in a `<label>` element that is tied to the
900
- * combobox via ARIA attributes.
901
- */
902
- titleText: PropTypes.node,
903
- /**
904
- * Translates component strings using your i18n tool.
905
- */
906
- translateWithId: PropTypes.func,
907
- type: ListBoxTypePropType,
908
- /**
909
- * Specify title to show title on hover
910
- */
911
- useTitleInItem: PropTypes.bool,
912
- /**
913
- * Specify whether the control is currently in warning state
914
- */
915
- warn: PropTypes.bool,
916
- /**
917
- * Provide the text that is displayed when the control is in warning state
918
- */
919
- warnText: PropTypes.node,
920
- /**
921
- * Specify native input attributes to place on the `<input>`, like maxLength.
922
- * These are passed to downshift's getInputProps() and will override the
923
- * internal input props.
924
- * https://github.com/downshift-js/downshift?tab=readme-ov-file#getinputprops
925
- */
926
- inputProps: PropTypes.object
573
+ ["aria-label"]: deprecate(PropTypes.string, "ariaLabel / aria-label props are no longer required for FilterableMultiSelect"),
574
+ ariaLabel: deprecate(PropTypes.string, "ariaLabel / aria-label props are no longer required for FilterableMultiSelect"),
575
+ autoAlign: PropTypes.bool,
576
+ clearSelectionDescription: PropTypes.string,
577
+ clearSelectionText: PropTypes.string,
578
+ decorator: PropTypes.node,
579
+ filterItems: PropTypes.func,
580
+ direction: PropTypes.oneOf(["top", "bottom"]),
581
+ disabled: PropTypes.bool,
582
+ downshiftProps: PropTypes.shape(Downshift.propTypes),
583
+ hideLabel: PropTypes.bool,
584
+ id: PropTypes.string.isRequired,
585
+ initialSelectedItems: PropTypes.array,
586
+ invalid: PropTypes.bool,
587
+ invalidText: PropTypes.node,
588
+ itemToElement: PropTypes.func,
589
+ itemToString: PropTypes.func,
590
+ items: PropTypes.array.isRequired,
591
+ light: deprecate(PropTypes.bool, "The `light` prop for `FilterableMultiSelect` has been deprecated in favor of the new `Layer` component. It will be removed in the next major release."),
592
+ locale: PropTypes.string,
593
+ onChange: PropTypes.func,
594
+ onInputValueChange: PropTypes.func,
595
+ onMenuChange: PropTypes.func,
596
+ open: PropTypes.bool,
597
+ placeholder: PropTypes.string,
598
+ selectionFeedback: PropTypes.oneOf([
599
+ "top",
600
+ "fixed",
601
+ "top-after-reopen"
602
+ ]),
603
+ size: ListBoxSizePropType,
604
+ slug: deprecate(PropTypes.node, "The `slug` prop has been deprecated and will be removed in the next major version. Use the decorator prop instead."),
605
+ ...sortingPropTypes,
606
+ titleText: PropTypes.node,
607
+ translateWithId: PropTypes.func,
608
+ type: ListBoxTypePropType,
609
+ useTitleInItem: PropTypes.bool,
610
+ warn: PropTypes.bool,
611
+ warnText: PropTypes.node,
612
+ inputProps: PropTypes.object
927
613
  };
928
614
 
929
- export { FilterableMultiSelect };
615
+ //#endregion
616
+ export { FilterableMultiSelect };