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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (777) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +950 -950
  2. package/es/_virtual/_rolldown/runtime.js +25 -0
  3. package/es/components/AILabel/index.d.ts +29 -2
  4. package/es/components/AILabel/index.js +114 -169
  5. package/es/components/AISkeleton/AISkeletonIcon.js +23 -27
  6. package/es/components/AISkeleton/AISkeletonPlaceholder.js +19 -27
  7. package/es/components/AISkeleton/AISkeletonText.js +26 -39
  8. package/es/components/Accordion/Accordion.Skeleton.js +55 -79
  9. package/es/components/Accordion/Accordion.js +43 -61
  10. package/es/components/Accordion/AccordionItem.js +102 -156
  11. package/es/components/Accordion/AccordionProvider.js +18 -15
  12. package/es/components/AspectRatio/AspectRatio.js +41 -47
  13. package/es/components/BadgeIndicator/index.js +28 -33
  14. package/es/components/Breadcrumb/Breadcrumb.Skeleton.js +39 -50
  15. package/es/components/Breadcrumb/Breadcrumb.js +39 -51
  16. package/es/components/Breadcrumb/BreadcrumbItem.js +80 -83
  17. package/es/components/Button/Button.Skeleton.js +49 -58
  18. package/es/components/Button/Button.d.ts +1 -1
  19. package/es/components/Button/Button.js +146 -240
  20. package/es/components/Button/ButtonBase.js +82 -104
  21. package/es/components/Button/index.js +13 -6
  22. package/es/components/ButtonSet/ButtonSet.js +74 -98
  23. package/es/components/ButtonSet/index.js +12 -4
  24. package/es/components/ChatButton/ChatButton.Skeleton.js +27 -27
  25. package/es/components/ChatButton/ChatButton.js +64 -79
  26. package/es/components/Checkbox/Checkbox.Skeleton.js +26 -25
  27. package/es/components/Checkbox/Checkbox.js +116 -195
  28. package/es/components/Checkbox/index.js +13 -5
  29. package/es/components/CheckboxGroup/CheckboxGroup.js +100 -148
  30. package/es/components/ClassPrefix/index.js +21 -17
  31. package/es/components/CodeSnippet/CodeSnippet.Skeleton.js +45 -42
  32. package/es/components/CodeSnippet/CodeSnippet.js +210 -299
  33. package/es/components/ComboBox/ComboBox.js +621 -970
  34. package/es/components/ComboBox/index.js +12 -4
  35. package/es/components/ComboButton/index.js +172 -208
  36. package/es/components/ComposedModal/ComposedModal.js +311 -450
  37. package/es/components/ComposedModal/ComposedModalPresence.js +47 -42
  38. package/es/components/ComposedModal/ModalFooter.js +127 -207
  39. package/es/components/ComposedModal/ModalHeader.js +71 -101
  40. package/es/components/ComposedModal/useComposedModalState.js +21 -15
  41. package/es/components/ContainedList/ContainedList.js +67 -102
  42. package/es/components/ContainedList/ContainedListItem/ContainedListItem.js +49 -67
  43. package/es/components/ContainedList/ContainedListItem/index.js +12 -4
  44. package/es/components/ContainedList/index.js +15 -12
  45. package/es/components/ContentSwitcher/ContentSwitcher.js +108 -140
  46. package/es/components/ContextMenu/useContextMenu.js +41 -36
  47. package/es/components/Copy/Copy.js +97 -117
  48. package/es/components/Copy/index.js +12 -4
  49. package/es/components/CopyButton/CopyButton.js +81 -94
  50. package/es/components/CopyButton/index.js +12 -4
  51. package/es/components/DangerButton/DangerButton.js +11 -9
  52. package/es/components/DataTable/DataTable.d.ts +11 -11
  53. package/es/components/DataTable/DataTable.js +448 -630
  54. package/es/components/DataTable/Table.js +111 -156
  55. package/es/components/DataTable/TableActionList.js +14 -6
  56. package/es/components/DataTable/TableBatchAction.js +25 -34
  57. package/es/components/DataTable/TableBatchActions.js +78 -113
  58. package/es/components/DataTable/TableBody.js +26 -19
  59. package/es/components/DataTable/TableCell.js +31 -46
  60. package/es/components/DataTable/TableContainer.js +75 -82
  61. package/es/components/DataTable/TableContext.js +14 -6
  62. package/es/components/DataTable/TableDecoratorRow.js +30 -36
  63. package/es/components/DataTable/TableExpandHeader.js +53 -90
  64. package/es/components/DataTable/TableExpandRow.js +82 -119
  65. package/es/components/DataTable/TableExpandedRow.js +45 -51
  66. package/es/components/DataTable/TableHead.js +7 -5
  67. package/es/components/DataTable/TableHeader.js +138 -181
  68. package/es/components/DataTable/TableRow.d.ts +1 -1
  69. package/es/components/DataTable/TableRow.js +42 -76
  70. package/es/components/DataTable/TableSelectAll.js +42 -70
  71. package/es/components/DataTable/TableSelectRow.js +63 -98
  72. package/es/components/DataTable/TableSlugRow.js +35 -43
  73. package/es/components/DataTable/TableToolbar.js +33 -45
  74. package/es/components/DataTable/TableToolbarAction.js +25 -20
  75. package/es/components/DataTable/TableToolbarContent.js +14 -6
  76. package/es/components/DataTable/TableToolbarMenu.js +35 -46
  77. package/es/components/DataTable/TableToolbarSearch.js +97 -187
  78. package/es/components/DataTable/state/getDerivedStateFromProps.js +38 -43
  79. package/es/components/DataTable/state/sortStates.js +11 -9
  80. package/es/components/DataTable/state/sorting.js +53 -72
  81. package/es/components/DataTable/tools/cells.js +15 -7
  82. package/es/components/DataTable/tools/denormalize.js +27 -19
  83. package/es/components/DataTable/tools/filter.js +21 -22
  84. package/es/components/DataTable/tools/normalize.js +57 -72
  85. package/es/components/DataTable/tools/sorting.js +50 -71
  86. package/es/components/DataTableSkeleton/DataTableSkeleton.js +66 -94
  87. package/es/components/DatePicker/DatePicker.Skeleton.js +44 -51
  88. package/es/components/DatePicker/DatePicker.d.ts +4 -2
  89. package/es/components/DatePicker/DatePicker.js +485 -749
  90. package/es/components/DatePicker/DatePickerLocales.js +75 -126
  91. package/es/components/DatePicker/index.js +13 -5
  92. package/es/components/DatePicker/plugins/appendToPlugin.js +31 -45
  93. package/es/components/DatePicker/plugins/fixEventsPlugin.js +127 -171
  94. package/es/components/DatePicker/plugins/rangePlugin.d.ts +1 -1
  95. package/es/components/DatePicker/plugins/rangePlugin.js +40 -47
  96. package/es/components/DatePicker/utils.d.ts +7 -0
  97. package/es/components/DatePicker/utils.js +18 -0
  98. package/es/components/DatePickerInput/DatePickerInput.js +179 -289
  99. package/es/components/DatePickerInput/index.js +12 -4
  100. package/es/components/Dialog/Dialog.js +303 -574
  101. package/es/components/Dialog/index.js +18 -2
  102. package/es/components/Dropdown/Dropdown.Skeleton.js +26 -38
  103. package/es/components/Dropdown/Dropdown.js +344 -535
  104. package/es/components/Dropdown/index.js +13 -5
  105. package/es/components/ErrorBoundary/ErrorBoundary.js +36 -58
  106. package/es/components/ErrorBoundary/ErrorBoundaryContext.js +14 -9
  107. package/es/components/ExpandableSearch/ExpandableSearch.js +60 -69
  108. package/es/components/ExpandableSearch/index.js +12 -4
  109. package/es/components/FeatureFlags/index.d.ts +11 -2
  110. package/es/components/FeatureFlags/index.js +79 -77
  111. package/es/components/FileUploader/FileUploader.Skeleton.js +35 -30
  112. package/es/components/FileUploader/FileUploader.js +269 -343
  113. package/es/components/FileUploader/FileUploaderButton.js +110 -160
  114. package/es/components/FileUploader/FileUploaderDropContainer.js +144 -221
  115. package/es/components/FileUploader/FileUploaderItem.js +138 -157
  116. package/es/components/FileUploader/Filename.d.ts +1 -1
  117. package/es/components/FileUploader/Filename.js +53 -72
  118. package/es/components/FluidComboBox/FluidComboBox.Skeleton.js +26 -28
  119. package/es/components/FluidComboBox/FluidComboBox.js +54 -105
  120. package/es/components/FluidDatePicker/FluidDatePicker.Skeleton.js +56 -53
  121. package/es/components/FluidDatePicker/FluidDatePicker.js +46 -68
  122. package/es/components/FluidDatePickerInput/FluidDatePickerInput.js +23 -16
  123. package/es/components/FluidDropdown/FluidDropdown.Skeleton.js +26 -28
  124. package/es/components/FluidDropdown/FluidDropdown.js +55 -111
  125. package/es/components/FluidForm/FluidForm.js +29 -31
  126. package/es/components/FluidForm/FormContext.js +12 -6
  127. package/es/components/FluidMultiSelect/FluidMultiSelect.Skeleton.js +26 -28
  128. package/es/components/FluidMultiSelect/FluidMultiSelect.js +67 -197
  129. package/es/components/FluidNumberInput/FluidNumberInput.Skeleton.js +27 -30
  130. package/es/components/FluidNumberInput/FluidNumberInput.js +63 -147
  131. package/es/components/FluidSearch/FluidSearch.Skeleton.js +27 -30
  132. package/es/components/FluidSearch/FluidSearch.js +41 -84
  133. package/es/components/FluidSelect/FluidSelect.Skeleton.js +26 -28
  134. package/es/components/FluidSelect/FluidSelect.js +40 -76
  135. package/es/components/FluidSelect/index.js +13 -5
  136. package/es/components/FluidTextArea/FluidTextArea.Skeleton.js +27 -30
  137. package/es/components/FluidTextArea/FluidTextArea.js +48 -112
  138. package/es/components/FluidTextInput/FluidPasswordInput.js +44 -99
  139. package/es/components/FluidTextInput/FluidTextInput.Skeleton.js +27 -30
  140. package/es/components/FluidTextInput/FluidTextInput.js +49 -104
  141. package/es/components/FluidTextInput/index.js +14 -6
  142. package/es/components/FluidTimePicker/FluidTimePicker.Skeleton.js +30 -33
  143. package/es/components/FluidTimePicker/FluidTimePicker.js +68 -115
  144. package/es/components/FluidTimePickerSelect/FluidTimePickerSelect.js +28 -47
  145. package/es/components/Form/Form.js +23 -25
  146. package/es/components/FormGroup/FormGroup.js +45 -67
  147. package/es/components/FormItem/FormItem.js +23 -25
  148. package/es/components/FormLabel/FormLabel.js +28 -34
  149. package/es/components/Grid/CSSGrid.d.ts +1 -1
  150. package/es/components/Grid/CSSGrid.js +85 -127
  151. package/es/components/Grid/Column.js +192 -324
  152. package/es/components/Grid/ColumnHang.js +28 -36
  153. package/es/components/Grid/FlexGrid.js +40 -60
  154. package/es/components/Grid/Grid.js +29 -42
  155. package/es/components/Grid/GridContext.js +36 -42
  156. package/es/components/Grid/Row.js +31 -49
  157. package/es/components/Heading/index.js +36 -51
  158. package/es/components/Icon/Icon.Skeleton.js +21 -21
  159. package/es/components/IconButton/index.js +117 -178
  160. package/es/components/IconIndicator/index.d.ts +1 -1
  161. package/es/components/IconIndicator/index.js +59 -60
  162. package/es/components/IdPrefix/index.js +21 -17
  163. package/es/components/InlineCheckbox/InlineCheckbox.js +69 -113
  164. package/es/components/InlineCheckbox/index.js +12 -4
  165. package/es/components/InlineLoading/InlineLoading.js +83 -100
  166. package/es/components/InlineLoading/index.js +12 -4
  167. package/es/components/Layer/LayerContext.js +12 -4
  168. package/es/components/Layer/LayerLevel.js +20 -4
  169. package/es/components/Layer/index.js +54 -66
  170. package/es/components/Layout/index.js +77 -109
  171. package/es/components/LayoutDirection/LayoutDirection.d.ts +1 -1
  172. package/es/components/LayoutDirection/LayoutDirection.js +33 -37
  173. package/es/components/LayoutDirection/LayoutDirectionContext.js +12 -6
  174. package/es/components/LayoutDirection/useLayoutDirection.js +15 -7
  175. package/es/components/Link/Link.js +63 -108
  176. package/es/components/Link/index.js +12 -4
  177. package/es/components/ListBox/ListBox.js +78 -126
  178. package/es/components/ListBox/ListBoxField.js +24 -43
  179. package/es/components/ListBox/ListBoxMenu.js +36 -42
  180. package/es/components/ListBox/ListBoxMenuIcon.js +39 -40
  181. package/es/components/ListBox/ListBoxMenuItem.js +67 -88
  182. package/es/components/ListBox/ListBoxPropTypes.js +17 -5
  183. package/es/components/ListBox/ListBoxSelection.js +71 -96
  184. package/es/components/ListBox/index.js +16 -14
  185. package/es/components/ListBox/next/ListBoxSelection.js +79 -117
  186. package/es/components/ListBox/next/ListBoxTrigger.js +44 -48
  187. package/es/components/ListItem/ListItem.js +25 -28
  188. package/es/components/Loading/Loading.js +64 -73
  189. package/es/components/Loading/index.js +12 -4
  190. package/es/components/Menu/Menu.js +220 -363
  191. package/es/components/Menu/MenuContext.d.ts +1 -1
  192. package/es/components/Menu/MenuContext.js +41 -38
  193. package/es/components/Menu/MenuItem.js +282 -413
  194. package/es/components/MenuButton/index.js +134 -195
  195. package/es/components/Modal/Modal.js +500 -660
  196. package/es/components/Modal/ModalPresence.js +39 -37
  197. package/es/components/Modal/index.js +13 -5
  198. package/es/components/ModalWrapper/ModalWrapper.d.ts +2 -2
  199. package/es/components/ModalWrapper/ModalWrapper.js +106 -130
  200. package/es/components/MultiSelect/FilterableMultiSelect.js +605 -918
  201. package/es/components/MultiSelect/MultiSelect.js +454 -716
  202. package/es/components/MultiSelect/MultiSelectPropTypes.js +13 -30
  203. package/es/components/MultiSelect/filter.js +14 -9
  204. package/es/components/MultiSelect/tools/sorting.js +21 -34
  205. package/es/components/Notification/Notification.js +508 -785
  206. package/es/components/NumberInput/NumberFormatPropTypes.js +69 -30
  207. package/es/components/NumberInput/NumberInput.Skeleton.js +29 -33
  208. package/es/components/NumberInput/NumberInput.js +567 -947
  209. package/es/components/OrderedList/OrderedList.js +31 -44
  210. package/es/components/OverflowMenu/OverflowMenu.js +335 -450
  211. package/es/components/OverflowMenu/index.js +25 -16
  212. package/es/components/OverflowMenu/next/index.js +154 -186
  213. package/es/components/OverflowMenuItem/OverflowMenuItem.js +100 -160
  214. package/es/components/OverflowMenuItem/index.js +12 -4
  215. package/es/components/OverflowMenuV2/index.js +15 -13
  216. package/es/components/PageHeader/PageHeader.js +297 -442
  217. package/es/components/PageHeader/index.js +24 -2
  218. package/es/components/Pagination/Pagination.Skeleton.js +34 -35
  219. package/es/components/Pagination/Pagination.d.ts +1 -1
  220. package/es/components/Pagination/Pagination.js +251 -356
  221. package/es/components/Pagination/experimental/PageSelector.js +38 -54
  222. package/es/components/Pagination/experimental/Pagination-story.d.ts +114 -0
  223. package/es/components/Pagination/experimental/Pagination.js +144 -196
  224. package/es/components/PaginationNav/PaginationNav.js +320 -426
  225. package/es/components/Popover/index.js +318 -437
  226. package/es/components/PrimaryButton/PrimaryButton.js +11 -9
  227. package/es/components/ProgressBar/ProgressBar.js +117 -143
  228. package/es/components/ProgressIndicator/ProgressIndicator.Skeleton.js +42 -38
  229. package/es/components/ProgressIndicator/ProgressIndicator.js +146 -243
  230. package/es/components/RadioButton/RadioButton.Skeleton.js +23 -25
  231. package/es/components/RadioButton/RadioButton.js +101 -174
  232. package/es/components/RadioButton/index.js +12 -4
  233. package/es/components/RadioButtonGroup/RadioButtonGroup.js +135 -207
  234. package/es/components/RadioTile/RadioTile.js +104 -168
  235. package/es/components/RadioTile/index.js +12 -4
  236. package/es/components/Search/Search.Skeleton.js +28 -33
  237. package/es/components/Search/Search.js +182 -278
  238. package/es/components/Search/index.js +13 -5
  239. package/es/components/Search/utils.js +11 -3
  240. package/es/components/SecondaryButton/SecondaryButton.js +11 -9
  241. package/es/components/Select/Select.Skeleton.js +27 -30
  242. package/es/components/Select/Select.js +178 -257
  243. package/es/components/Select/index.js +13 -5
  244. package/es/components/SelectItem/SelectItem.js +33 -48
  245. package/es/components/SelectItem/index.js +12 -4
  246. package/es/components/SelectItemGroup/SelectItemGroup.js +27 -37
  247. package/es/components/ShapeIndicator/index.d.ts +1 -1
  248. package/es/components/ShapeIndicator/index.js +74 -80
  249. package/es/components/SkeletonIcon/SkeletonIcon.js +21 -24
  250. package/es/components/SkeletonPlaceholder/SkeletonPlaceholder.js +15 -24
  251. package/es/components/SkeletonText/SkeletonText.js +67 -81
  252. package/es/components/SkeletonText/index.js +12 -4
  253. package/es/components/Slider/Slider.Skeleton.js +68 -91
  254. package/es/components/Slider/Slider.js +864 -1315
  255. package/es/components/Slider/SliderHandles.js +73 -66
  256. package/es/components/Stack/HStack.js +19 -11
  257. package/es/components/Stack/Stack.js +56 -80
  258. package/es/components/Stack/VStack.js +19 -11
  259. package/es/components/StructuredList/StructuredList.Skeleton.js +55 -48
  260. package/es/components/StructuredList/StructuredList.js +178 -317
  261. package/es/components/Switch/IconSwitch.js +99 -145
  262. package/es/components/Switch/Switch.js +66 -99
  263. package/es/components/TabContent/TabContent.js +28 -34
  264. package/es/components/Tabs/Tabs.Skeleton.js +41 -36
  265. package/es/components/Tabs/Tabs.js +732 -1147
  266. package/es/components/Tabs/usePressable.js +97 -112
  267. package/es/components/Tag/DismissibleTag.js +119 -156
  268. package/es/components/Tag/OperationalTag.js +91 -111
  269. package/es/components/Tag/SelectableTag.js +94 -129
  270. package/es/components/Tag/Tag.Skeleton.js +26 -30
  271. package/es/components/Tag/Tag.js +152 -200
  272. package/es/components/Tag/isEllipsisActive.js +13 -8
  273. package/es/components/Text/Text.js +66 -79
  274. package/es/components/Text/TextDirection.js +36 -37
  275. package/es/components/Text/TextDirectionContext.js +14 -8
  276. package/es/components/Text/createTextComponent.js +21 -20
  277. package/es/components/TextArea/TextArea.Skeleton.js +25 -29
  278. package/es/components/TextArea/TextArea.js +315 -422
  279. package/es/components/TextArea/index.js +13 -5
  280. package/es/components/TextInput/ControlledPasswordInput.js +133 -198
  281. package/es/components/TextInput/PasswordInput.js +196 -303
  282. package/es/components/TextInput/TextInput.Skeleton.js +24 -28
  283. package/es/components/TextInput/TextInput.js +219 -317
  284. package/es/components/TextInput/index.js +13 -5
  285. package/es/components/TextInput/util.js +21 -25
  286. package/es/components/Theme/index.js +79 -95
  287. package/es/components/Tile/Tile.d.ts +2 -2
  288. package/es/components/Tile/Tile.js +394 -588
  289. package/es/components/TileGroup/TileGroup.js +70 -111
  290. package/es/components/TimePicker/TimePicker.d.ts +1 -1
  291. package/es/components/TimePicker/TimePicker.js +148 -247
  292. package/es/components/TimePickerSelect/TimePickerSelect.js +43 -58
  293. package/es/components/Toggle/Toggle.Skeleton.js +24 -22
  294. package/es/components/Toggle/Toggle.js +102 -171
  295. package/es/components/ToggleSmall/ToggleSmall.Skeleton.js +46 -51
  296. package/es/components/Toggletip/index.d.ts +2 -2
  297. package/es/components/Toggletip/index.js +170 -256
  298. package/es/components/Tooltip/DefinitionTooltip.js +98 -138
  299. package/es/components/Tooltip/Tooltip.js +188 -263
  300. package/es/components/TreeView/TreeContext.js +13 -5
  301. package/es/components/TreeView/TreeNode.js +361 -500
  302. package/es/components/TreeView/TreeView.js +164 -237
  303. package/es/components/UIShell/Content.js +23 -30
  304. package/es/components/UIShell/Header.js +25 -29
  305. package/es/components/UIShell/HeaderContainer.js +31 -40
  306. package/es/components/UIShell/HeaderGlobalAction.js +65 -90
  307. package/es/components/UIShell/HeaderGlobalBar.js +16 -9
  308. package/es/components/UIShell/HeaderMenu.js +141 -215
  309. package/es/components/UIShell/HeaderMenuButton.js +43 -66
  310. package/es/components/UIShell/HeaderMenuItem.js +49 -76
  311. package/es/components/UIShell/HeaderName.js +32 -44
  312. package/es/components/UIShell/HeaderNavigation.js +32 -37
  313. package/es/components/UIShell/HeaderPanel.js +74 -97
  314. package/es/components/UIShell/HeaderSideNavItems.js +27 -33
  315. package/es/components/UIShell/Link.js +29 -50
  316. package/es/components/UIShell/SideNav.js +132 -241
  317. package/es/components/UIShell/SideNavContext.js +21 -15
  318. package/es/components/UIShell/SideNavDetails.js +29 -34
  319. package/es/components/UIShell/SideNavDivider.js +21 -21
  320. package/es/components/UIShell/SideNavFooter.js +43 -52
  321. package/es/components/UIShell/SideNavHeader.js +26 -35
  322. package/es/components/UIShell/SideNavIcon.js +28 -33
  323. package/es/components/UIShell/SideNavItem.js +28 -33
  324. package/es/components/UIShell/SideNavItems.js +31 -40
  325. package/es/components/UIShell/SideNavLink.js +52 -79
  326. package/es/components/UIShell/SideNavLinkText.js +24 -25
  327. package/es/components/UIShell/SideNavMenu.js +102 -143
  328. package/es/components/UIShell/SideNavMenuItem.js +40 -52
  329. package/es/components/UIShell/SideNavSwitcher.js +59 -68
  330. package/es/components/UIShell/SkipToContent.js +28 -36
  331. package/es/components/UIShell/Switcher.js +69 -99
  332. package/es/components/UIShell/SwitcherDivider.js +16 -24
  333. package/es/components/UIShell/SwitcherItem.js +74 -114
  334. package/es/components/UnorderedList/UnorderedList.js +28 -37
  335. package/es/feature-flags.js +19 -10
  336. package/es/index.js +249 -242
  337. package/es/internal/FloatingMenu.js +246 -292
  338. package/es/internal/OptimizedResize.js +35 -46
  339. package/es/internal/Selection.js +99 -132
  340. package/es/internal/clamp.js +12 -4
  341. package/es/internal/defaultItemToString.js +15 -9
  342. package/es/internal/deprecateFieldOnObject.js +22 -14
  343. package/es/internal/environment.js +15 -7
  344. package/es/internal/getAnnouncement.js +16 -13
  345. package/es/internal/keyboard/keys.js +48 -48
  346. package/es/internal/keyboard/match.js +25 -42
  347. package/es/internal/keyboard/navigation.js +22 -27
  348. package/es/internal/noopFn.js +10 -2
  349. package/es/internal/useAttachedMenu.js +43 -51
  350. package/es/internal/useControllableState.js +43 -48
  351. package/es/internal/useDelayedState.js +30 -35
  352. package/es/internal/useEvent.js +39 -35
  353. package/es/internal/useId.js +51 -87
  354. package/es/internal/useIdPrefix.js +13 -5
  355. package/es/internal/useIsomorphicEffect.js +12 -4
  356. package/es/internal/useMatchMedia.js +29 -21
  357. package/es/internal/useMergedRefs.js +26 -22
  358. package/es/internal/useNoInteractiveChildren.js +70 -99
  359. package/es/internal/useNormalizedInputProps.js +47 -51
  360. package/es/internal/useOutsideClick.js +21 -24
  361. package/es/internal/useOverflowItems.js +89 -90
  362. package/es/internal/usePrefix.js +13 -5
  363. package/es/internal/usePresence.js +51 -54
  364. package/es/internal/usePresenceContext.js +35 -35
  365. package/es/internal/usePreviousValue.js +26 -18
  366. package/es/internal/useResizeObserver.js +57 -66
  367. package/es/internal/useSavedCallback.js +24 -17
  368. package/es/internal/utils.js +17 -9
  369. package/es/internal/warning.js +17 -22
  370. package/es/internal/wrapFocus.js +77 -98
  371. package/es/prop-types/AriaPropTypes.js +14 -6
  372. package/es/prop-types/deprecate.js +30 -27
  373. package/es/prop-types/deprecateComponent.js +17 -8
  374. package/es/prop-types/deprecateValuesWithin.js +18 -21
  375. package/es/prop-types/isRequiredOneOf.js +21 -24
  376. package/es/prop-types/requiredIfGivenPropIsTruthy.js +14 -14
  377. package/es/tools/events.js +17 -21
  378. package/es/tools/mapPopoverAlign.js +19 -18
  379. package/es/tools/mergeRefs.js +14 -17
  380. package/es/tools/setupGetInstanceId.js +16 -8
  381. package/es/tools/toggleClass.js +17 -9
  382. package/es/tools/wrapComponent.js +34 -39
  383. package/icons/index.d.ts +2 -1
  384. package/icons/index.esm.js +2 -2
  385. package/icons/index.js +7 -10
  386. package/lib/_virtual/_rolldown/runtime.js +50 -0
  387. package/lib/components/AILabel/index.d.ts +29 -2
  388. package/lib/components/AILabel/index.js +118 -171
  389. package/lib/components/AISkeleton/AISkeletonIcon.js +27 -31
  390. package/lib/components/AISkeleton/AISkeletonPlaceholder.js +29 -31
  391. package/lib/components/AISkeleton/AISkeletonText.js +30 -43
  392. package/lib/components/Accordion/Accordion.Skeleton.js +59 -84
  393. package/lib/components/Accordion/Accordion.js +47 -65
  394. package/lib/components/Accordion/AccordionItem.js +106 -160
  395. package/lib/components/Accordion/AccordionProvider.js +20 -17
  396. package/lib/components/AspectRatio/AspectRatio.js +45 -51
  397. package/lib/components/BadgeIndicator/index.js +33 -39
  398. package/lib/components/Breadcrumb/Breadcrumb.Skeleton.js +43 -55
  399. package/lib/components/Breadcrumb/Breadcrumb.js +43 -55
  400. package/lib/components/Breadcrumb/BreadcrumbItem.js +84 -87
  401. package/lib/components/Button/Button.Skeleton.js +53 -63
  402. package/lib/components/Button/Button.d.ts +1 -1
  403. package/lib/components/Button/Button.js +149 -244
  404. package/lib/components/Button/ButtonBase.js +85 -108
  405. package/lib/components/Button/index.js +13 -15
  406. package/lib/components/ButtonSet/ButtonSet.js +78 -102
  407. package/lib/components/ButtonSet/index.js +12 -9
  408. package/lib/components/ChatButton/ChatButton.Skeleton.js +31 -31
  409. package/lib/components/ChatButton/ChatButton.js +68 -83
  410. package/lib/components/Checkbox/Checkbox.Skeleton.js +30 -30
  411. package/lib/components/Checkbox/Checkbox.js +119 -198
  412. package/lib/components/Checkbox/index.js +13 -11
  413. package/lib/components/CheckboxGroup/CheckboxGroup.js +104 -152
  414. package/lib/components/ClassPrefix/index.js +24 -19
  415. package/lib/components/CodeSnippet/CodeSnippet.Skeleton.js +49 -47
  416. package/lib/components/CodeSnippet/CodeSnippet.js +215 -303
  417. package/lib/components/ComboBox/ComboBox.js +626 -974
  418. package/lib/components/ComboBox/index.js +12 -9
  419. package/lib/components/ComboButton/index.js +176 -210
  420. package/lib/components/ComposedModal/ComposedModal.js +315 -454
  421. package/lib/components/ComposedModal/ComposedModalPresence.js +49 -44
  422. package/lib/components/ComposedModal/ModalFooter.js +131 -209
  423. package/lib/components/ComposedModal/ModalHeader.js +75 -103
  424. package/lib/components/ComposedModal/useComposedModalState.js +22 -17
  425. package/lib/components/ContainedList/ContainedList.js +77 -106
  426. package/lib/components/ContainedList/ContainedListItem/ContainedListItem.js +59 -71
  427. package/lib/components/ContainedList/ContainedListItem/index.js +12 -9
  428. package/lib/components/ContainedList/index.js +18 -15
  429. package/lib/components/ContentSwitcher/ContentSwitcher.js +112 -142
  430. package/lib/components/ContextMenu/useContextMenu.js +42 -40
  431. package/lib/components/Copy/Copy.js +101 -121
  432. package/lib/components/Copy/index.js +12 -9
  433. package/lib/components/CopyButton/CopyButton.js +85 -98
  434. package/lib/components/CopyButton/index.js +12 -9
  435. package/lib/components/DangerButton/DangerButton.js +19 -13
  436. package/lib/components/DataTable/DataTable.d.ts +11 -11
  437. package/lib/components/DataTable/DataTable.js +474 -655
  438. package/lib/components/DataTable/Table.js +115 -161
  439. package/lib/components/DataTable/TableActionList.js +15 -11
  440. package/lib/components/DataTable/TableBatchAction.js +28 -38
  441. package/lib/components/DataTable/TableBatchActions.js +82 -117
  442. package/lib/components/DataTable/TableBody.js +29 -23
  443. package/lib/components/DataTable/TableCell.js +35 -50
  444. package/lib/components/DataTable/TableContainer.js +79 -86
  445. package/lib/components/DataTable/TableContext.js +15 -8
  446. package/lib/components/DataTable/TableDecoratorRow.js +34 -40
  447. package/lib/components/DataTable/TableExpandHeader.js +57 -94
  448. package/lib/components/DataTable/TableExpandRow.js +86 -123
  449. package/lib/components/DataTable/TableExpandedRow.js +49 -55
  450. package/lib/components/DataTable/TableHead.js +8 -10
  451. package/lib/components/DataTable/TableHeader.js +142 -185
  452. package/lib/components/DataTable/TableRow.d.ts +1 -1
  453. package/lib/components/DataTable/TableRow.js +46 -80
  454. package/lib/components/DataTable/TableSelectAll.js +46 -74
  455. package/lib/components/DataTable/TableSelectRow.js +67 -102
  456. package/lib/components/DataTable/TableSlugRow.js +39 -47
  457. package/lib/components/DataTable/TableToolbar.js +37 -49
  458. package/lib/components/DataTable/TableToolbarAction.js +28 -24
  459. package/lib/components/DataTable/TableToolbarContent.js +15 -11
  460. package/lib/components/DataTable/TableToolbarMenu.js +39 -50
  461. package/lib/components/DataTable/TableToolbarSearch.js +101 -191
  462. package/lib/components/DataTable/state/getDerivedStateFromProps.js +38 -47
  463. package/lib/components/DataTable/state/sortStates.js +11 -10
  464. package/lib/components/DataTable/state/sorting.js +54 -76
  465. package/lib/components/DataTable/tools/cells.js +15 -8
  466. package/lib/components/DataTable/tools/denormalize.js +27 -22
  467. package/lib/components/DataTable/tools/filter.js +21 -23
  468. package/lib/components/DataTable/tools/normalize.js +57 -76
  469. package/lib/components/DataTable/tools/sorting.js +50 -75
  470. package/lib/components/DataTableSkeleton/DataTableSkeleton.js +70 -98
  471. package/lib/components/DatePicker/DatePicker.Skeleton.js +48 -56
  472. package/lib/components/DatePicker/DatePicker.d.ts +4 -2
  473. package/lib/components/DatePicker/DatePicker.js +491 -753
  474. package/lib/components/DatePicker/DatePickerLocales.js +75 -127
  475. package/lib/components/DatePicker/index.js +13 -11
  476. package/lib/components/DatePicker/plugins/appendToPlugin.js +31 -46
  477. package/lib/components/DatePicker/plugins/fixEventsPlugin.js +127 -175
  478. package/lib/components/DatePicker/plugins/rangePlugin.d.ts +1 -1
  479. package/lib/components/DatePicker/plugins/rangePlugin.js +42 -49
  480. package/lib/components/DatePicker/utils.d.ts +7 -0
  481. package/lib/components/DatePicker/utils.js +19 -0
  482. package/lib/components/DatePickerInput/DatePickerInput.js +183 -293
  483. package/lib/components/DatePickerInput/index.js +12 -9
  484. package/lib/components/Dialog/Dialog.js +307 -576
  485. package/lib/components/Dialog/index.js +21 -13
  486. package/lib/components/Dropdown/Dropdown.Skeleton.js +30 -43
  487. package/lib/components/Dropdown/Dropdown.js +348 -539
  488. package/lib/components/Dropdown/index.js +13 -11
  489. package/lib/components/ErrorBoundary/ErrorBoundary.js +39 -62
  490. package/lib/components/ErrorBoundary/ErrorBoundaryContext.js +15 -11
  491. package/lib/components/ExpandableSearch/ExpandableSearch.js +63 -73
  492. package/lib/components/ExpandableSearch/index.js +12 -9
  493. package/lib/components/FeatureFlags/index.d.ts +11 -2
  494. package/lib/components/FeatureFlags/index.js +82 -79
  495. package/lib/components/FileUploader/FileUploader.Skeleton.js +39 -35
  496. package/lib/components/FileUploader/FileUploader.js +273 -347
  497. package/lib/components/FileUploader/FileUploaderButton.js +114 -164
  498. package/lib/components/FileUploader/FileUploaderDropContainer.js +148 -225
  499. package/lib/components/FileUploader/FileUploaderItem.js +142 -161
  500. package/lib/components/FileUploader/Filename.d.ts +1 -1
  501. package/lib/components/FileUploader/Filename.js +56 -76
  502. package/lib/components/FluidComboBox/FluidComboBox.Skeleton.js +30 -32
  503. package/lib/components/FluidComboBox/FluidComboBox.js +58 -109
  504. package/lib/components/FluidDatePicker/FluidDatePicker.Skeleton.js +60 -57
  505. package/lib/components/FluidDatePicker/FluidDatePicker.js +50 -72
  506. package/lib/components/FluidDatePickerInput/FluidDatePickerInput.js +25 -20
  507. package/lib/components/FluidDropdown/FluidDropdown.Skeleton.js +30 -32
  508. package/lib/components/FluidDropdown/FluidDropdown.js +59 -115
  509. package/lib/components/FluidForm/FluidForm.js +33 -35
  510. package/lib/components/FluidForm/FormContext.js +13 -8
  511. package/lib/components/FluidMultiSelect/FluidMultiSelect.Skeleton.js +30 -32
  512. package/lib/components/FluidMultiSelect/FluidMultiSelect.js +71 -201
  513. package/lib/components/FluidNumberInput/FluidNumberInput.Skeleton.js +31 -34
  514. package/lib/components/FluidNumberInput/FluidNumberInput.js +67 -151
  515. package/lib/components/FluidSearch/FluidSearch.Skeleton.js +31 -34
  516. package/lib/components/FluidSearch/FluidSearch.js +45 -88
  517. package/lib/components/FluidSelect/FluidSelect.Skeleton.js +30 -32
  518. package/lib/components/FluidSelect/FluidSelect.js +44 -80
  519. package/lib/components/FluidSelect/index.js +13 -11
  520. package/lib/components/FluidTextArea/FluidTextArea.Skeleton.js +31 -34
  521. package/lib/components/FluidTextArea/FluidTextArea.js +52 -116
  522. package/lib/components/FluidTextInput/FluidPasswordInput.js +48 -103
  523. package/lib/components/FluidTextInput/FluidTextInput.Skeleton.js +31 -34
  524. package/lib/components/FluidTextInput/FluidTextInput.js +53 -108
  525. package/lib/components/FluidTextInput/index.js +14 -13
  526. package/lib/components/FluidTimePicker/FluidTimePicker.Skeleton.js +34 -37
  527. package/lib/components/FluidTimePicker/FluidTimePicker.js +72 -119
  528. package/lib/components/FluidTimePickerSelect/FluidTimePickerSelect.js +31 -51
  529. package/lib/components/Form/Form.js +27 -29
  530. package/lib/components/FormGroup/FormGroup.js +49 -71
  531. package/lib/components/FormItem/FormItem.js +27 -29
  532. package/lib/components/FormLabel/FormLabel.js +32 -38
  533. package/lib/components/Grid/CSSGrid.d.ts +1 -1
  534. package/lib/components/Grid/CSSGrid.js +89 -129
  535. package/lib/components/Grid/Column.js +196 -328
  536. package/lib/components/Grid/ColumnHang.js +32 -38
  537. package/lib/components/Grid/FlexGrid.js +44 -62
  538. package/lib/components/Grid/Grid.js +32 -44
  539. package/lib/components/Grid/GridContext.js +39 -44
  540. package/lib/components/Grid/Row.js +35 -53
  541. package/lib/components/Heading/index.js +39 -53
  542. package/lib/components/Icon/Icon.Skeleton.js +25 -23
  543. package/lib/components/IconButton/index.js +121 -180
  544. package/lib/components/IconIndicator/index.d.ts +1 -1
  545. package/lib/components/IconIndicator/index.js +63 -63
  546. package/lib/components/IdPrefix/index.js +24 -19
  547. package/lib/components/InlineCheckbox/InlineCheckbox.js +72 -117
  548. package/lib/components/InlineCheckbox/index.js +12 -9
  549. package/lib/components/InlineLoading/InlineLoading.js +87 -104
  550. package/lib/components/InlineLoading/index.js +12 -9
  551. package/lib/components/Layer/LayerContext.js +14 -6
  552. package/lib/components/Layer/LayerLevel.js +20 -6
  553. package/lib/components/Layer/index.js +58 -68
  554. package/lib/components/Layout/index.js +81 -111
  555. package/lib/components/LayoutDirection/LayoutDirection.d.ts +1 -1
  556. package/lib/components/LayoutDirection/LayoutDirection.js +36 -40
  557. package/lib/components/LayoutDirection/LayoutDirectionContext.js +14 -8
  558. package/lib/components/LayoutDirection/useLayoutDirection.js +16 -9
  559. package/lib/components/Link/Link.js +67 -112
  560. package/lib/components/Link/index.js +12 -9
  561. package/lib/components/ListBox/ListBox.js +82 -130
  562. package/lib/components/ListBox/ListBoxField.js +33 -47
  563. package/lib/components/ListBox/ListBoxMenu.js +39 -46
  564. package/lib/components/ListBox/ListBoxMenuIcon.js +43 -44
  565. package/lib/components/ListBox/ListBoxMenuItem.js +71 -92
  566. package/lib/components/ListBox/ListBoxPropTypes.js +21 -9
  567. package/lib/components/ListBox/ListBoxSelection.js +75 -100
  568. package/lib/components/ListBox/index.js +17 -21
  569. package/lib/components/ListBox/next/ListBoxSelection.js +83 -121
  570. package/lib/components/ListBox/next/ListBoxTrigger.js +48 -52
  571. package/lib/components/ListItem/ListItem.js +29 -32
  572. package/lib/components/Loading/Loading.js +68 -77
  573. package/lib/components/Loading/index.js +12 -9
  574. package/lib/components/Menu/Menu.js +224 -365
  575. package/lib/components/Menu/MenuContext.d.ts +1 -1
  576. package/lib/components/Menu/MenuContext.js +42 -40
  577. package/lib/components/Menu/MenuItem.js +286 -415
  578. package/lib/components/MenuButton/index.js +138 -197
  579. package/lib/components/Modal/Modal.js +504 -665
  580. package/lib/components/Modal/ModalPresence.js +41 -39
  581. package/lib/components/Modal/index.js +13 -10
  582. package/lib/components/ModalWrapper/ModalWrapper.d.ts +2 -2
  583. package/lib/components/ModalWrapper/ModalWrapper.js +112 -134
  584. package/lib/components/MultiSelect/FilterableMultiSelect.js +611 -920
  585. package/lib/components/MultiSelect/MultiSelect.js +459 -718
  586. package/lib/components/MultiSelect/MultiSelectPropTypes.js +15 -32
  587. package/lib/components/MultiSelect/filter.js +14 -10
  588. package/lib/components/MultiSelect/tools/sorting.js +21 -35
  589. package/lib/components/Notification/Notification.js +514 -787
  590. package/lib/components/NumberInput/NumberFormatPropTypes.js +72 -33
  591. package/lib/components/NumberInput/NumberInput.Skeleton.js +33 -37
  592. package/lib/components/NumberInput/NumberInput.js +571 -950
  593. package/lib/components/OrderedList/OrderedList.js +35 -48
  594. package/lib/components/OverflowMenu/OverflowMenu.js +341 -454
  595. package/lib/components/OverflowMenu/index.js +27 -21
  596. package/lib/components/OverflowMenu/next/index.js +158 -188
  597. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +104 -164
  598. package/lib/components/OverflowMenuItem/index.js +12 -9
  599. package/lib/components/OverflowMenuV2/index.js +25 -15
  600. package/lib/components/PageHeader/PageHeader.js +301 -444
  601. package/lib/components/PageHeader/index.js +27 -19
  602. package/lib/components/Pagination/Pagination.Skeleton.js +38 -37
  603. package/lib/components/Pagination/Pagination.d.ts +1 -1
  604. package/lib/components/Pagination/Pagination.js +256 -360
  605. package/lib/components/Pagination/experimental/PageSelector.js +48 -58
  606. package/lib/components/Pagination/experimental/Pagination-story.d.ts +114 -0
  607. package/lib/components/Pagination/experimental/Pagination.js +148 -200
  608. package/lib/components/PaginationNav/PaginationNav.js +324 -430
  609. package/lib/components/Popover/index.js +323 -440
  610. package/lib/components/PrimaryButton/PrimaryButton.js +19 -13
  611. package/lib/components/ProgressBar/ProgressBar.js +121 -147
  612. package/lib/components/ProgressIndicator/ProgressIndicator.Skeleton.js +46 -43
  613. package/lib/components/ProgressIndicator/ProgressIndicator.js +150 -245
  614. package/lib/components/RadioButton/RadioButton.Skeleton.js +27 -27
  615. package/lib/components/RadioButton/RadioButton.js +105 -178
  616. package/lib/components/RadioButton/index.js +12 -9
  617. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +139 -211
  618. package/lib/components/RadioTile/RadioTile.js +108 -172
  619. package/lib/components/RadioTile/index.js +12 -9
  620. package/lib/components/Search/Search.Skeleton.js +32 -38
  621. package/lib/components/Search/Search.js +185 -281
  622. package/lib/components/Search/index.js +13 -11
  623. package/lib/components/Search/utils.js +11 -4
  624. package/lib/components/SecondaryButton/SecondaryButton.js +19 -13
  625. package/lib/components/Select/Select.Skeleton.js +31 -35
  626. package/lib/components/Select/Select.js +182 -261
  627. package/lib/components/Select/index.js +13 -11
  628. package/lib/components/SelectItem/SelectItem.js +37 -52
  629. package/lib/components/SelectItem/index.js +12 -9
  630. package/lib/components/SelectItemGroup/SelectItemGroup.js +31 -41
  631. package/lib/components/ShapeIndicator/index.d.ts +1 -1
  632. package/lib/components/ShapeIndicator/index.js +78 -83
  633. package/lib/components/SkeletonIcon/SkeletonIcon.js +25 -28
  634. package/lib/components/SkeletonPlaceholder/SkeletonPlaceholder.js +25 -28
  635. package/lib/components/SkeletonText/SkeletonText.js +71 -85
  636. package/lib/components/SkeletonText/index.js +12 -9
  637. package/lib/components/Slider/Slider.Skeleton.js +72 -95
  638. package/lib/components/Slider/Slider.js +868 -1319
  639. package/lib/components/Slider/SliderHandles.js +75 -68
  640. package/lib/components/Stack/HStack.js +22 -14
  641. package/lib/components/Stack/Stack.js +60 -82
  642. package/lib/components/Stack/VStack.js +22 -14
  643. package/lib/components/StructuredList/StructuredList.Skeleton.js +59 -52
  644. package/lib/components/StructuredList/StructuredList.js +182 -319
  645. package/lib/components/Switch/IconSwitch.js +103 -149
  646. package/lib/components/Switch/Switch.js +70 -103
  647. package/lib/components/TabContent/TabContent.js +32 -38
  648. package/lib/components/Tabs/Tabs.Skeleton.js +45 -41
  649. package/lib/components/Tabs/Tabs.js +738 -1151
  650. package/lib/components/Tabs/usePressable.js +98 -114
  651. package/lib/components/Tag/DismissibleTag.js +123 -160
  652. package/lib/components/Tag/OperationalTag.js +95 -115
  653. package/lib/components/Tag/SelectableTag.js +98 -133
  654. package/lib/components/Tag/Tag.Skeleton.js +30 -32
  655. package/lib/components/Tag/Tag.js +156 -204
  656. package/lib/components/Tag/isEllipsisActive.js +13 -9
  657. package/lib/components/Text/Text.js +69 -81
  658. package/lib/components/Text/TextDirection.js +39 -39
  659. package/lib/components/Text/TextDirectionContext.js +15 -10
  660. package/lib/components/Text/createTextComponent.js +29 -22
  661. package/lib/components/TextArea/TextArea.Skeleton.js +29 -34
  662. package/lib/components/TextArea/TextArea.js +319 -426
  663. package/lib/components/TextArea/index.js +13 -11
  664. package/lib/components/TextInput/ControlledPasswordInput.js +137 -202
  665. package/lib/components/TextInput/PasswordInput.js +200 -307
  666. package/lib/components/TextInput/TextInput.Skeleton.js +28 -33
  667. package/lib/components/TextInput/TextInput.js +223 -321
  668. package/lib/components/TextInput/index.js +13 -11
  669. package/lib/components/TextInput/util.js +21 -26
  670. package/lib/components/Theme/index.js +83 -97
  671. package/lib/components/Tile/Tile.d.ts +2 -2
  672. package/lib/components/Tile/Tile.js +398 -590
  673. package/lib/components/TileGroup/TileGroup.js +73 -113
  674. package/lib/components/TimePicker/TimePicker.d.ts +1 -1
  675. package/lib/components/TimePicker/TimePicker.js +152 -251
  676. package/lib/components/TimePickerSelect/TimePickerSelect.js +47 -62
  677. package/lib/components/Toggle/Toggle.Skeleton.js +28 -24
  678. package/lib/components/Toggle/Toggle.js +106 -176
  679. package/lib/components/ToggleSmall/ToggleSmall.Skeleton.js +50 -53
  680. package/lib/components/Toggletip/index.d.ts +2 -2
  681. package/lib/components/Toggletip/index.js +174 -258
  682. package/lib/components/Tooltip/DefinitionTooltip.js +102 -140
  683. package/lib/components/Tooltip/Tooltip.js +192 -265
  684. package/lib/components/TreeView/TreeContext.js +14 -7
  685. package/lib/components/TreeView/TreeNode.js +365 -504
  686. package/lib/components/TreeView/TreeView.js +169 -242
  687. package/lib/components/UIShell/Content.js +27 -34
  688. package/lib/components/UIShell/Header.js +29 -33
  689. package/lib/components/UIShell/HeaderContainer.js +34 -44
  690. package/lib/components/UIShell/HeaderGlobalAction.js +69 -94
  691. package/lib/components/UIShell/HeaderGlobalBar.js +17 -14
  692. package/lib/components/UIShell/HeaderMenu.js +146 -221
  693. package/lib/components/UIShell/HeaderMenuButton.js +47 -70
  694. package/lib/components/UIShell/HeaderMenuItem.js +53 -80
  695. package/lib/components/UIShell/HeaderName.js +36 -48
  696. package/lib/components/UIShell/HeaderNavigation.js +36 -41
  697. package/lib/components/UIShell/HeaderPanel.js +78 -101
  698. package/lib/components/UIShell/HeaderSideNavItems.js +31 -37
  699. package/lib/components/UIShell/Link.js +32 -54
  700. package/lib/components/UIShell/SideNav.js +136 -245
  701. package/lib/components/UIShell/SideNavContext.js +23 -17
  702. package/lib/components/UIShell/SideNavDetails.js +33 -38
  703. package/lib/components/UIShell/SideNavDivider.js +25 -25
  704. package/lib/components/UIShell/SideNavFooter.js +47 -56
  705. package/lib/components/UIShell/SideNavHeader.js +30 -39
  706. package/lib/components/UIShell/SideNavIcon.js +32 -37
  707. package/lib/components/UIShell/SideNavItem.js +32 -37
  708. package/lib/components/UIShell/SideNavItems.js +35 -44
  709. package/lib/components/UIShell/SideNavLink.js +56 -83
  710. package/lib/components/UIShell/SideNavLinkText.js +28 -29
  711. package/lib/components/UIShell/SideNavMenu.js +106 -148
  712. package/lib/components/UIShell/SideNavMenuItem.js +44 -56
  713. package/lib/components/UIShell/SideNavSwitcher.js +63 -72
  714. package/lib/components/UIShell/SkipToContent.js +32 -40
  715. package/lib/components/UIShell/Switcher.js +73 -103
  716. package/lib/components/UIShell/SwitcherDivider.js +26 -28
  717. package/lib/components/UIShell/SwitcherItem.js +78 -118
  718. package/lib/components/UnorderedList/UnorderedList.js +32 -41
  719. package/lib/feature-flags.js +21 -13
  720. package/lib/index.js +622 -602
  721. package/lib/internal/FloatingMenu.js +249 -296
  722. package/lib/internal/OptimizedResize.js +35 -47
  723. package/lib/internal/Selection.js +102 -134
  724. package/lib/internal/clamp.js +12 -5
  725. package/lib/internal/defaultItemToString.js +15 -10
  726. package/lib/internal/deprecateFieldOnObject.js +23 -16
  727. package/lib/internal/environment.js +15 -8
  728. package/lib/internal/getAnnouncement.js +16 -14
  729. package/lib/internal/keyboard/keys.js +48 -49
  730. package/lib/internal/keyboard/match.js +25 -43
  731. package/lib/internal/keyboard/navigation.js +22 -29
  732. package/lib/internal/noopFn.js +10 -3
  733. package/lib/internal/useAttachedMenu.js +44 -53
  734. package/lib/internal/useControllableState.js +44 -50
  735. package/lib/internal/useDelayedState.js +31 -37
  736. package/lib/internal/useEvent.js +40 -37
  737. package/lib/internal/useId.js +54 -91
  738. package/lib/internal/useIdPrefix.js +15 -7
  739. package/lib/internal/useIsomorphicEffect.js +13 -8
  740. package/lib/internal/useMatchMedia.js +30 -23
  741. package/lib/internal/useMergedRefs.js +27 -24
  742. package/lib/internal/useNoInteractiveChildren.js +73 -101
  743. package/lib/internal/useNormalizedInputProps.js +55 -53
  744. package/lib/internal/useOutsideClick.js +22 -26
  745. package/lib/internal/useOverflowItems.js +90 -94
  746. package/lib/internal/usePrefix.js +15 -7
  747. package/lib/internal/usePresence.js +52 -56
  748. package/lib/internal/usePresenceContext.js +36 -37
  749. package/lib/internal/usePreviousValue.js +27 -20
  750. package/lib/internal/useResizeObserver.js +58 -68
  751. package/lib/internal/useSavedCallback.js +25 -19
  752. package/lib/internal/utils.js +18 -11
  753. package/lib/internal/warning.js +24 -23
  754. package/lib/internal/wrapFocus.js +78 -100
  755. package/lib/prop-types/AriaPropTypes.js +17 -9
  756. package/lib/prop-types/deprecate.js +30 -29
  757. package/lib/prop-types/deprecateComponent.js +17 -10
  758. package/lib/prop-types/deprecateValuesWithin.js +18 -23
  759. package/lib/prop-types/isRequiredOneOf.js +21 -25
  760. package/lib/prop-types/requiredIfGivenPropIsTruthy.js +14 -15
  761. package/lib/tools/events.js +17 -22
  762. package/lib/tools/mapPopoverAlign.js +19 -19
  763. package/lib/tools/mergeRefs.js +14 -18
  764. package/lib/tools/setupGetInstanceId.js +16 -9
  765. package/lib/tools/toggleClass.js +17 -10
  766. package/lib/tools/wrapComponent.js +38 -43
  767. package/package.json +10 -16
  768. package/es/_virtual/_rollupPluginBabelHelpers.js +0 -40
  769. package/es/components/DataTable/stories/examples/TableToolbarFilter.d.ts +0 -54
  770. package/es/node_modules/es-toolkit/dist/compat/function/debounce.js +0 -55
  771. package/es/node_modules/es-toolkit/dist/compat/function/throttle.js +0 -23
  772. package/es/node_modules/es-toolkit/dist/function/debounce.js +0 -70
  773. package/lib/_virtual/_rollupPluginBabelHelpers.js +0 -45
  774. package/lib/components/DataTable/stories/examples/TableToolbarFilter.d.ts +0 -54
  775. package/lib/node_modules/es-toolkit/dist/compat/function/debounce.js +0 -57
  776. package/lib/node_modules/es-toolkit/dist/compat/function/throttle.js +0 -25
  777. package/lib/node_modules/es-toolkit/dist/function/debounce.js +0 -72
@@ -1,1195 +1,782 @@
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
- 'use strict';
9
-
10
- var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
11
- var iconsReact = require('@carbon/icons-react');
12
- var layout = require('@carbon/layout');
13
- var cx = require('classnames');
14
- var PropTypes = require('prop-types');
15
- var React = require('react');
16
- require('../Grid/FlexGrid.js');
17
- var Grid = require('../Grid/Grid.js');
18
- require('../Grid/Row.js');
19
- require('../Grid/Column.js');
20
- require('../Grid/ColumnHang.js');
21
- require('../Grid/GridContext.js');
22
- require('../Tooltip/DefinitionTooltip.js');
23
- var Tooltip = require('../Tooltip/Tooltip.js');
24
- var useControllableState = require('../../internal/useControllableState.js');
25
- var useId = require('../../internal/useId.js');
26
- var useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
27
- var useMergedRefs = require('../../internal/useMergedRefs.js');
28
- var usePrefix = require('../../internal/usePrefix.js');
29
- var keys = require('../../internal/keyboard/keys.js');
30
- var match = require('../../internal/keyboard/match.js');
31
- var usePressable = require('./usePressable.js');
32
- var deprecate = require('../../prop-types/deprecate.js');
33
- var useEvent = require('../../internal/useEvent.js');
34
- var useMatchMedia = require('../../internal/useMatchMedia.js');
35
- var Text = require('../Text/Text.js');
36
- require('../Text/TextDirection.js');
37
- var index = require('../BadgeIndicator/index.js');
38
- var utils = require('../../internal/utils.js');
39
- var debounce = require('../../node_modules/es-toolkit/dist/compat/function/debounce.js');
40
-
41
- var _ChevronLeft, _ChevronRight, _BadgeIndicator;
8
+ const require_runtime = require('../../_virtual/_rolldown/runtime.js');
9
+ const require_usePrefix = require('../../internal/usePrefix.js');
10
+ const require_Text = require('../Text/Text.js');
11
+ const require_keys = require('../../internal/keyboard/keys.js');
12
+ const require_match = require('../../internal/keyboard/match.js');
13
+ const require_useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
14
+ const require_useId = require('../../internal/useId.js');
15
+ const require_deprecate = require('../../prop-types/deprecate.js');
16
+ const require_useMergedRefs = require('../../internal/useMergedRefs.js');
17
+ const require_useEvent = require('../../internal/useEvent.js');
18
+ const require_Tooltip = require('../Tooltip/Tooltip.js');
19
+ const require_index = require('../BadgeIndicator/index.js');
20
+ const require_utils = require('../../internal/utils.js');
21
+ const require_useControllableState = require('../../internal/useControllableState.js');
22
+ const require_Grid = require('../Grid/Grid.js');
23
+ const require_useMatchMedia = require('../../internal/useMatchMedia.js');
24
+ const require_usePressable = require('./usePressable.js');
25
+ let classnames = require("classnames");
26
+ classnames = require_runtime.__toESM(classnames);
27
+ let react = require("react");
28
+ react = require_runtime.__toESM(react);
29
+ let prop_types = require("prop-types");
30
+ prop_types = require_runtime.__toESM(prop_types);
31
+ let react_jsx_runtime = require("react/jsx-runtime");
32
+ let _carbon_icons_react = require("@carbon/icons-react");
33
+ let es_toolkit_compat = require("es-toolkit/compat");
34
+ let _carbon_layout = require("@carbon/layout");
35
+
36
+ //#region src/components/Tabs/Tabs.tsx
37
+ /**
38
+ * Copyright IBM Corp. 2016, 2026
39
+ *
40
+ * This source code is licensed under the Apache-2.0 license found in the
41
+ * LICENSE file in the root directory of this source tree.
42
+ */
42
43
  const verticalTabHeight = 64;
43
-
44
- // Used to manage the overall state of the Tabs
45
-
46
- const TabsContext = /*#__PURE__*/React.createContext({
47
- baseId: '',
48
- activeIndex: 0,
49
- defaultSelectedIndex: 0,
50
- dismissable: false,
51
- onTabCloseRequest() {},
52
- setActiveIndex() {},
53
- selectedIndex: 0,
54
- setSelectedIndex() {}
44
+ const TabsContext = react.default.createContext({
45
+ baseId: "",
46
+ activeIndex: 0,
47
+ defaultSelectedIndex: 0,
48
+ dismissable: false,
49
+ onTabCloseRequest() {},
50
+ setActiveIndex() {},
51
+ selectedIndex: 0,
52
+ setSelectedIndex() {}
55
53
  });
56
-
57
- // Used to keep track of position in a tablist
58
- const TabContext = /*#__PURE__*/React.createContext({
59
- index: 0,
60
- hasSecondaryLabel: false
54
+ const TabContext = react.default.createContext({
55
+ index: 0,
56
+ hasSecondaryLabel: false
61
57
  });
62
- const lgMediaQuery = `(min-width: ${layout.breakpoints.lg.width})`;
63
- const smMediaQuery = `(max-width: ${layout.breakpoints.md.width})`;
64
-
65
- // Used to keep track of position in a list of tab panels
66
- const TabPanelContext = /*#__PURE__*/React.createContext(0);
67
-
68
- /**
69
- * Tabs
70
- */
71
-
72
- function Tabs({
73
- children,
74
- defaultSelectedIndex = 0,
75
- onChange,
76
- selectedIndex: controlledSelectedIndex,
77
- dismissable,
78
- onTabCloseRequest
79
- }) {
80
- const baseId = useId.useId('ccs');
81
- if (dismissable && !onTabCloseRequest) {
82
- // eslint-disable-next-line no-console -- https://github.com/carbon-design-system/carbon/issues/20452
83
- console.error('dismissable property specified without also providing an onTabCloseRequest property.');
84
- }
85
- // The active index is used to track the element which has focus in our tablist
86
- const [activeIndex, setActiveIndex] = React.useState(defaultSelectedIndex);
87
- // The selected index is used for the tab/panel pairing which is "visible"
88
- const [selectedIndex, setSelectedIndex] = useControllableState.useControllableState({
89
- value: controlledSelectedIndex,
90
- defaultValue: defaultSelectedIndex,
91
- onChange: value => onChange?.({
92
- selectedIndex: value
93
- })
94
- });
95
- const value = {
96
- baseId,
97
- activeIndex,
98
- defaultSelectedIndex,
99
- dismissable,
100
- onTabCloseRequest,
101
- setActiveIndex,
102
- selectedIndex,
103
- setSelectedIndex
104
- };
105
- return /*#__PURE__*/React.createElement(TabsContext.Provider, {
106
- value: value
107
- }, children);
58
+ const lgMediaQuery = `(min-width: ${_carbon_layout.breakpoints.lg.width})`;
59
+ const smMediaQuery = `(max-width: ${_carbon_layout.breakpoints.md.width})`;
60
+ const TabPanelContext = react.default.createContext(0);
61
+ function Tabs({ children, defaultSelectedIndex = 0, onChange, selectedIndex: controlledSelectedIndex, dismissable, onTabCloseRequest }) {
62
+ const baseId = require_useId.useId("ccs");
63
+ if (dismissable && !onTabCloseRequest) console.error("dismissable property specified without also providing an onTabCloseRequest property.");
64
+ const [activeIndex, setActiveIndex] = (0, react.useState)(defaultSelectedIndex);
65
+ const [selectedIndex, setSelectedIndex] = require_useControllableState.useControllableState({
66
+ value: controlledSelectedIndex,
67
+ defaultValue: defaultSelectedIndex,
68
+ onChange: (value) => onChange?.({ selectedIndex: value })
69
+ });
70
+ const value = {
71
+ baseId,
72
+ activeIndex,
73
+ defaultSelectedIndex,
74
+ dismissable,
75
+ onTabCloseRequest,
76
+ setActiveIndex,
77
+ selectedIndex,
78
+ setSelectedIndex
79
+ };
80
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabsContext.Provider, {
81
+ value,
82
+ children
83
+ });
108
84
  }
109
85
  Tabs.propTypes = {
110
- /**
111
- * Provide child elements to be rendered inside the `Tabs`.
112
- * These elements should render either `TabsList` or `TabsPanels`
113
- */
114
- children: PropTypes.node,
115
- /**
116
- * Specify which content tab should be initially selected when the component
117
- * is first rendered
118
- */
119
- defaultSelectedIndex: PropTypes.number,
120
- /**
121
- * Whether the render Tab children should be dismissable.
122
- */
123
- dismissable: PropTypes.bool,
124
- /**
125
- * Provide an optional function which is called whenever the state of the
126
- * `Tabs` changes
127
- */
128
- onChange: PropTypes.func,
129
- /**
130
- * If specifying the `onTabCloseRequest` prop, provide a callback function
131
- * responsible for removing the tab when close button is pressed on one of the Tab elements
132
- */
133
- onTabCloseRequest: props => {
134
- if (props.dismissable && !props.onTabCloseRequest) {
135
- return new Error('dismissable property specified without also providing an onTabCloseRequest property.');
136
- }
137
- return undefined;
138
- },
139
- /**
140
- * Control which content panel is currently selected. This puts the component
141
- * in a controlled mode and should be used along with `onChange`
142
- */
143
- selectedIndex: PropTypes.number
86
+ children: prop_types.default.node,
87
+ defaultSelectedIndex: prop_types.default.number,
88
+ dismissable: prop_types.default.bool,
89
+ onChange: prop_types.default.func,
90
+ onTabCloseRequest: (props) => {
91
+ if (props.dismissable && !props.onTabCloseRequest) return /* @__PURE__ */ new Error("dismissable property specified without also providing an onTabCloseRequest property.");
92
+ },
93
+ selectedIndex: prop_types.default.number
144
94
  };
145
- function TabsVertical({
146
- children,
147
- height,
148
- defaultSelectedIndex = 0,
149
- onChange,
150
- selectedIndex: controlledSelectedIndex,
151
- ...rest
152
- }) {
153
- const [selectedIndex, setSelectedIndex] = useControllableState.useControllableState({
154
- value: controlledSelectedIndex,
155
- defaultValue: defaultSelectedIndex,
156
- onChange: value => onChange?.({
157
- selectedIndex: value
158
- })
159
- });
160
- const props = {
161
- ...rest,
162
- selectedIndex,
163
- onChange: ({
164
- selectedIndex
165
- }) => setSelectedIndex(selectedIndex)
166
- };
167
- const isSm = useMatchMedia.useMatchMedia(smMediaQuery);
168
- if (!isSm) {
169
- return /*#__PURE__*/React.createElement(Grid.Grid, {
170
- style: {
171
- height: height
172
- }
173
- }, /*#__PURE__*/React.createElement(Tabs, props, children));
174
- }
175
- return /*#__PURE__*/React.createElement(Tabs, props, children);
95
+ function TabsVertical({ children, height, defaultSelectedIndex = 0, onChange, selectedIndex: controlledSelectedIndex, ...rest }) {
96
+ const [selectedIndex, setSelectedIndex] = require_useControllableState.useControllableState({
97
+ value: controlledSelectedIndex,
98
+ defaultValue: defaultSelectedIndex,
99
+ onChange: (value) => onChange?.({ selectedIndex: value })
100
+ });
101
+ const props = {
102
+ ...rest,
103
+ selectedIndex,
104
+ onChange: ({ selectedIndex }) => setSelectedIndex(selectedIndex)
105
+ };
106
+ if (!require_useMatchMedia.useMatchMedia(smMediaQuery)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Grid.GridAsGridComponent, {
107
+ style: { height },
108
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tabs, {
109
+ ...props,
110
+ children
111
+ })
112
+ });
113
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tabs, {
114
+ ...props,
115
+ children
116
+ });
176
117
  }
177
118
  TabsVertical.propTypes = {
178
- /**
179
- * Provide child elements to be rendered inside the `TabsVertical`.
180
- * These elements should render either `TabsListVertical` or `TabsPanels`
181
- */
182
- children: PropTypes.node,
183
- /**
184
- * Specify which content tab should be initially selected when the component
185
- * is first rendered
186
- */
187
- defaultSelectedIndex: PropTypes.number,
188
- /**
189
- * Option to set a height style only if using vertical variation
190
- */
191
- height: PropTypes.string,
192
- /**
193
- * Provide an optional function which is called whenever the state of the
194
- * `Tabs` changes
195
- */
196
- onChange: PropTypes.func,
197
- /**
198
- * Control which content panel is currently selected. This puts the component
199
- * in a controlled mode and should be used along with `onChange`
200
- */
201
- selectedIndex: PropTypes.number
119
+ children: prop_types.default.node,
120
+ defaultSelectedIndex: prop_types.default.number,
121
+ height: prop_types.default.string,
122
+ onChange: prop_types.default.func,
123
+ selectedIndex: prop_types.default.number
202
124
  };
203
-
204
125
  /**
205
- * Get the next index for a given keyboard event
206
- * given a count of the total items and the current index
207
- */
126
+ * Get the next index for a given keyboard event
127
+ * given a count of the total items and the current index
128
+ */
208
129
  function getNextIndex(event, total, index) {
209
- switch (true) {
210
- case match.match(event, keys.ArrowRight):
211
- return (index + 1) % total;
212
- case match.match(event, keys.ArrowLeft):
213
- return (total + index - 1) % total;
214
- case match.match(event, keys.Home):
215
- return 0;
216
- case match.match(event, keys.End):
217
- return total - 1;
218
- default:
219
- return index;
220
- }
130
+ switch (true) {
131
+ case require_match.match(event, require_keys.ArrowRight): return (index + 1) % total;
132
+ case require_match.match(event, require_keys.ArrowLeft): return (total + index - 1) % total;
133
+ case require_match.match(event, require_keys.Home): return 0;
134
+ case require_match.match(event, require_keys.End): return total - 1;
135
+ default: return index;
136
+ }
221
137
  }
222
-
223
138
  /**
224
- * Get the next index for a given keyboard event
225
- * given a count of the total items and the current index
226
- */
139
+ * Get the next index for a given keyboard event
140
+ * given a count of the total items and the current index
141
+ */
227
142
  function getNextIndexVertical(event, total, index) {
228
- switch (true) {
229
- case match.match(event, keys.ArrowDown):
230
- return (index + 1) % total;
231
- case match.match(event, keys.ArrowUp):
232
- return (total + index - 1) % total;
233
- case match.match(event, keys.Home):
234
- return 0;
235
- case match.match(event, keys.End):
236
- return total - 1;
237
- default:
238
- return index;
239
- }
143
+ switch (true) {
144
+ case require_match.match(event, require_keys.ArrowDown): return (index + 1) % total;
145
+ case require_match.match(event, require_keys.ArrowUp): return (total + index - 1) % total;
146
+ case require_match.match(event, require_keys.Home): return 0;
147
+ case require_match.match(event, require_keys.End): return total - 1;
148
+ default: return index;
149
+ }
240
150
  }
241
-
242
- /**
243
- * TabList
244
- */
245
-
246
- function TabList({
247
- activation = 'automatic',
248
- 'aria-label': label,
249
- children,
250
- className: customClassName,
251
- contained = false,
252
- fullWidth = false,
253
- iconSize,
254
- leftOverflowButtonProps,
255
- light,
256
- rightOverflowButtonProps,
257
- scrollDebounceWait = 200,
258
- scrollIntoView,
259
- ...rest
260
- }) {
261
- const {
262
- activeIndex,
263
- selectedIndex,
264
- setSelectedIndex,
265
- setActiveIndex,
266
- dismissable
267
- } = React.useContext(TabsContext);
268
- const prefix = usePrefix.usePrefix();
269
- const ref = React.useRef(null);
270
- const previousButton = React.useRef(null);
271
- const nextButton = React.useRef(null);
272
- const [isScrollable, setIsScrollable] = React.useState(false);
273
- const [scrollLeft, setScrollLeft] = React.useState(0);
274
- const hasSecondaryLabelTabs = contained && React.Children.toArray(children).some(child => utils.isComponentElement(child, Tab) && typeof child.props.secondaryLabel !== 'undefined');
275
- const isLg = useMatchMedia.useMatchMedia(lgMediaQuery);
276
- const distributeWidth = fullWidth && contained && isLg && React.Children.toArray(children).length < 9;
277
- const className = cx(`${prefix}--tabs`, {
278
- [`${prefix}--tabs--contained`]: contained,
279
- [`${prefix}--tabs--light`]: light,
280
- [`${prefix}--tabs__icon--default`]: iconSize === 'default',
281
- [`${prefix}--tabs__icon--lg`]: iconSize === 'lg',
282
- // TODO: V12 - Remove this class
283
- [`${prefix}--layout--size-lg`]: iconSize === 'lg',
284
- [`${prefix}--tabs--tall`]: hasSecondaryLabelTabs,
285
- [`${prefix}--tabs--full-width`]: distributeWidth,
286
- [`${prefix}--tabs--dismissable`]: dismissable
287
- }, customClassName);
288
-
289
- // Previous Button
290
- // VISIBLE IF:
291
- // SCROLLABLE
292
- // AND SCROLL_LEFT > 0
293
- const buttonWidth = 44;
294
- // Next Button
295
- // VISIBLE IF:
296
- // SCROLLABLE
297
- // AND SCROLL_LEFT + CLIENT_WIDTH < SCROLL_WIDTH
298
- const [isNextButtonVisible, setIsNextButtonVisible] = React.useState(ref.current ? scrollLeft + buttonWidth + ref.current.clientWidth < ref.current.scrollWidth : false);
299
- const isPreviousButtonVisible = ref.current ? isScrollable && scrollLeft > 0 : false;
300
- const previousButtonClasses = cx(`${prefix}--tab--overflow-nav-button`, `${prefix}--tab--overflow-nav-button--previous`, {
301
- [`${prefix}--tab--overflow-nav-button--hidden`]: !isPreviousButtonVisible
302
- });
303
- const nextButtonClasses = cx(`${prefix}--tab--overflow-nav-button`, `${prefix}--tab--overflow-nav-button--next`, {
304
- [`${prefix}--tab--overflow-nav-button--hidden`]: !isNextButtonVisible
305
- });
306
- const tabs = React.useRef([]);
307
- const debouncedOnScroll = React.useCallback(() => {
308
- const updateScroll = debounce.debounce(() => {
309
- if (ref.current) {
310
- setScrollLeft(ref.current.scrollLeft);
311
- }
312
- }, scrollDebounceWait);
313
- updateScroll();
314
- }, [scrollDebounceWait]);
315
- function onKeyDown(event) {
316
- if (match.matches(event, [keys.ArrowRight, keys.ArrowLeft, keys.Home, keys.End])) {
317
- event.preventDefault();
318
- const filteredTabs = tabs.current.filter(tab => tab !== null);
319
- const activeTabs = filteredTabs.filter(tab => !tab.disabled);
320
- const currentIndex = activeTabs.indexOf(tabs.current[activation === 'automatic' ? selectedIndex : activeIndex]);
321
- const nextIndex = tabs.current.indexOf(activeTabs[getNextIndex(event, activeTabs.length, currentIndex)]);
322
- if (activation === 'automatic') {
323
- setSelectedIndex(nextIndex);
324
- } else if (activation === 'manual') {
325
- setActiveIndex(nextIndex);
326
- }
327
- tabs.current[nextIndex]?.focus();
328
- }
329
- }
330
- function handleBlur({
331
- relatedTarget: currentActiveNode
332
- }) {
333
- if (ref.current?.contains(currentActiveNode)) {
334
- return;
335
- }
336
- // reset active index to selected tab index for manual activation
337
- if (activation === 'manual') {
338
- setActiveIndex(selectedIndex);
339
- }
340
- }
341
-
342
- /**
343
- * Scroll the tab into view if it is not already visible
344
- * @param tab - The tab to scroll into view
345
- * @returns {void}
346
- */
347
- function scrollTabIntoView(tab) {
348
- if (!isScrollable || !ref.current) {
349
- return;
350
- }
351
- if (tab) {
352
- // The width of the "scroll buttons"
353
- const {
354
- width: tabWidth
355
- } = tab.getBoundingClientRect();
356
-
357
- // The start and end position of the selected tab
358
- const start = tab.offsetLeft;
359
- const end = tab.offsetLeft + tabWidth;
360
-
361
- // The start and end of the visible area for the tabs
362
- const visibleStart = ref.current.scrollLeft + buttonWidth;
363
- const visibleEnd = ref.current.scrollLeft + ref.current.clientWidth - buttonWidth;
364
-
365
- // The beginning of the tab is clipped and not visible
366
- if (start < visibleStart) {
367
- setScrollLeft(start - buttonWidth);
368
- }
369
-
370
- // The end of the tab is clipped and not visible
371
- if (end > visibleEnd) {
372
- setScrollLeft(end + buttonWidth - ref.current.clientWidth);
373
- }
374
- }
375
- }
376
- React.useEffect(() => {
377
- const tab = tabs.current[selectedIndex];
378
- if (scrollIntoView && tab) {
379
- tab.scrollIntoView({
380
- block: 'nearest',
381
- inline: 'nearest'
382
- });
383
- }
384
- // eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20452
385
- }, []);
386
- React.useEffect(() => {
387
- //adding 1 in calculation for firefox support
388
- setIsNextButtonVisible(ref.current ? scrollLeft + buttonWidth + ref.current.clientWidth + 1 < ref.current.scrollWidth : false);
389
- if (dismissable) {
390
- if (ref.current) {
391
- setIsScrollable(ref.current.scrollWidth > ref.current.clientWidth);
392
- }
393
- }
394
- }, [scrollLeft, children, dismissable, isScrollable]);
395
- React.useEffect(() => {
396
- if (tabs.current[selectedIndex]?.disabled) {
397
- const activeTabs = tabs.current.filter(tab => {
398
- return !tab.disabled;
399
- });
400
- if (activeTabs.length > 0) {
401
- const tab = activeTabs[0];
402
- setSelectedIndex(tabs.current.indexOf(tab));
403
- }
404
- }
405
- // eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20452
406
- }, []);
407
- useIsomorphicEffect.default(() => {
408
- if (ref.current) {
409
- // adding 1 in calculation for firefox support
410
- setIsScrollable(ref.current.scrollWidth > ref.current.clientWidth + 1);
411
- }
412
- function handler() {
413
- if (ref.current) {
414
- // adding 1 in calculation for firefox support
415
- setIsScrollable(ref.current.scrollWidth > ref.current.clientWidth + 1);
416
- }
417
- }
418
- const debouncedHandler = debounce.debounce(handler, 200);
419
- window.addEventListener('resize', debouncedHandler);
420
- return () => {
421
- debouncedHandler.cancel();
422
- window.removeEventListener('resize', debouncedHandler);
423
- };
424
- }, []);
425
-
426
- // updates scroll location for all scroll behavior.
427
- useIsomorphicEffect.default(() => {
428
- if (scrollLeft !== null && ref.current) {
429
- ref.current.scrollLeft = scrollLeft;
430
- }
431
- }, [scrollLeft]);
432
-
433
- // scroll manual tabs when active index changes (focus outline movement)
434
- useIsomorphicEffect.default(() => {
435
- const tab = activation === 'manual' ? tabs.current[activeIndex] : tabs.current[selectedIndex];
436
- scrollTabIntoView(tab);
437
- }, [activation, activeIndex]);
438
-
439
- // scroll tabs when selected index changes
440
- useIsomorphicEffect.default(() => {
441
- const tab = tabs.current[selectedIndex];
442
- scrollTabIntoView(tab);
443
- }, [selectedIndex, isScrollable, children]);
444
- usePressable.usePressable(previousButton, {
445
- onPress({
446
- longPress
447
- }) {
448
- if (!longPress && ref.current) {
449
- setScrollLeft(Math.max(scrollLeft - ref.current.scrollWidth / tabs.current.length * 1.5, 0));
450
- }
451
- },
452
- onLongPress() {
453
- return createLongPressBehavior(ref, 'backward', setScrollLeft);
454
- }
455
- });
456
- usePressable.usePressable(nextButton, {
457
- onPress({
458
- longPress
459
- }) {
460
- if (!longPress && ref.current) {
461
- setScrollLeft(Math.min(scrollLeft + ref.current.scrollWidth / tabs.current.length * 1.5, ref.current.scrollWidth - ref.current.clientWidth));
462
- }
463
- },
464
- onLongPress() {
465
- return createLongPressBehavior(ref, 'forward', setScrollLeft);
466
- }
467
- });
468
- return /*#__PURE__*/React.createElement("div", {
469
- className: className
470
- }, /*#__PURE__*/React.createElement("button", _rollupPluginBabelHelpers.extends({
471
- "aria-hidden": "true",
472
- tabIndex: -1,
473
- "aria-label": "Scroll left",
474
- ref: previousButton,
475
- className: previousButtonClasses,
476
- type: "button"
477
- }, leftOverflowButtonProps), _ChevronLeft || (_ChevronLeft = /*#__PURE__*/React.createElement(iconsReact.ChevronLeft, null))), /*#__PURE__*/React.createElement("div", _rollupPluginBabelHelpers.extends({}, rest, {
478
- "aria-label": label,
479
- ref: ref,
480
- role: "tablist",
481
- className: `${prefix}--tab--list`,
482
- onScroll: debouncedOnScroll,
483
- onKeyDown: onKeyDown,
484
- onBlur: handleBlur
485
- }), React.Children.map(children, (child, index) => {
486
- return ! /*#__PURE__*/React.isValidElement(child) ? null : /*#__PURE__*/React.createElement(TabContext.Provider, {
487
- value: {
488
- index,
489
- hasSecondaryLabel: hasSecondaryLabelTabs,
490
- contained
491
- }
492
- }, /*#__PURE__*/React.cloneElement(child, {
493
- ref: node => {
494
- if (!node) return;
495
- tabs.current[index] = node;
496
- }
497
- }));
498
- })), /*#__PURE__*/React.createElement("button", _rollupPluginBabelHelpers.extends({
499
- "aria-hidden": "true",
500
- tabIndex: -1,
501
- "aria-label": "Scroll right",
502
- ref: nextButton,
503
- className: nextButtonClasses,
504
- type: "button"
505
- }, rightOverflowButtonProps), _ChevronRight || (_ChevronRight = /*#__PURE__*/React.createElement(iconsReact.ChevronRight, null))));
151
+ function TabList({ activation = "automatic", "aria-label": label, children, className: customClassName, contained = false, fullWidth = false, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait = 200, scrollIntoView, ...rest }) {
152
+ const { activeIndex, selectedIndex, setSelectedIndex, setActiveIndex, dismissable } = react.default.useContext(TabsContext);
153
+ const prefix = require_usePrefix.usePrefix();
154
+ const ref = (0, react.useRef)(null);
155
+ const previousButton = (0, react.useRef)(null);
156
+ const nextButton = (0, react.useRef)(null);
157
+ const [isScrollable, setIsScrollable] = (0, react.useState)(false);
158
+ const [scrollLeft, setScrollLeft] = (0, react.useState)(0);
159
+ const hasSecondaryLabelTabs = contained && react.Children.toArray(children).some((child) => require_utils.isComponentElement(child, Tab) && typeof child.props.secondaryLabel !== "undefined");
160
+ const isLg = require_useMatchMedia.useMatchMedia(lgMediaQuery);
161
+ const distributeWidth = fullWidth && contained && isLg && react.default.Children.toArray(children).length < 9;
162
+ const className = (0, classnames.default)(`${prefix}--tabs`, {
163
+ [`${prefix}--tabs--contained`]: contained,
164
+ [`${prefix}--tabs--light`]: light,
165
+ [`${prefix}--tabs__icon--default`]: iconSize === "default",
166
+ [`${prefix}--tabs__icon--lg`]: iconSize === "lg",
167
+ [`${prefix}--layout--size-lg`]: iconSize === "lg",
168
+ [`${prefix}--tabs--tall`]: hasSecondaryLabelTabs,
169
+ [`${prefix}--tabs--full-width`]: distributeWidth,
170
+ [`${prefix}--tabs--dismissable`]: dismissable
171
+ }, customClassName);
172
+ const buttonWidth = 44;
173
+ const [isNextButtonVisible, setIsNextButtonVisible] = (0, react.useState)(ref.current ? scrollLeft + buttonWidth + ref.current.clientWidth < ref.current.scrollWidth : false);
174
+ const isPreviousButtonVisible = ref.current ? isScrollable && scrollLeft > 0 : false;
175
+ const previousButtonClasses = (0, classnames.default)(`${prefix}--tab--overflow-nav-button`, `${prefix}--tab--overflow-nav-button--previous`, { [`${prefix}--tab--overflow-nav-button--hidden`]: !isPreviousButtonVisible });
176
+ const nextButtonClasses = (0, classnames.default)(`${prefix}--tab--overflow-nav-button`, `${prefix}--tab--overflow-nav-button--next`, { [`${prefix}--tab--overflow-nav-button--hidden`]: !isNextButtonVisible });
177
+ const tabs = (0, react.useRef)([]);
178
+ const debouncedOnScroll = (0, react.useCallback)(() => {
179
+ (0, es_toolkit_compat.debounce)(() => {
180
+ if (ref.current) setScrollLeft(ref.current.scrollLeft);
181
+ }, scrollDebounceWait)();
182
+ }, [scrollDebounceWait]);
183
+ function onKeyDown(event) {
184
+ if (require_match.matches(event, [
185
+ require_keys.ArrowRight,
186
+ require_keys.ArrowLeft,
187
+ require_keys.Home,
188
+ require_keys.End
189
+ ])) {
190
+ event.preventDefault();
191
+ const activeTabs = tabs.current.filter((tab) => tab !== null).filter((tab) => !tab.disabled);
192
+ const currentIndex = activeTabs.indexOf(tabs.current[activation === "automatic" ? selectedIndex : activeIndex]);
193
+ const nextIndex = tabs.current.indexOf(activeTabs[getNextIndex(event, activeTabs.length, currentIndex)]);
194
+ if (activation === "automatic") setSelectedIndex(nextIndex);
195
+ else if (activation === "manual") setActiveIndex(nextIndex);
196
+ tabs.current[nextIndex]?.focus();
197
+ }
198
+ }
199
+ function handleBlur({ relatedTarget: currentActiveNode }) {
200
+ if (ref.current?.contains(currentActiveNode)) return;
201
+ if (activation === "manual") setActiveIndex(selectedIndex);
202
+ }
203
+ /**
204
+ * Scroll the tab into view if it is not already visible
205
+ * @param tab - The tab to scroll into view
206
+ * @returns {void}
207
+ */
208
+ function scrollTabIntoView(tab) {
209
+ if (!isScrollable || !ref.current) return;
210
+ if (tab) {
211
+ const { width: tabWidth } = tab.getBoundingClientRect();
212
+ const start = tab.offsetLeft;
213
+ const end = tab.offsetLeft + tabWidth;
214
+ const visibleStart = ref.current.scrollLeft + buttonWidth;
215
+ const visibleEnd = ref.current.scrollLeft + ref.current.clientWidth - buttonWidth;
216
+ if (start < visibleStart) setScrollLeft(start - buttonWidth);
217
+ if (end > visibleEnd) setScrollLeft(end + buttonWidth - ref.current.clientWidth);
218
+ }
219
+ }
220
+ (0, react.useEffect)(() => {
221
+ const tab = tabs.current[selectedIndex];
222
+ if (scrollIntoView && tab) tab.scrollIntoView({
223
+ block: "nearest",
224
+ inline: "nearest"
225
+ });
226
+ }, []);
227
+ (0, react.useEffect)(() => {
228
+ setIsNextButtonVisible(ref.current ? scrollLeft + buttonWidth + ref.current.clientWidth + 1 < ref.current.scrollWidth : false);
229
+ if (dismissable && ref.current) setIsScrollable(ref.current.scrollWidth > ref.current.clientWidth + 1);
230
+ }, [
231
+ children,
232
+ dismissable,
233
+ scrollLeft
234
+ ]);
235
+ (0, react.useEffect)(() => {
236
+ if (tabs.current[selectedIndex]?.disabled) {
237
+ const activeTabs = tabs.current.filter((tab) => {
238
+ return !tab.disabled;
239
+ });
240
+ if (activeTabs.length > 0) {
241
+ const tab = activeTabs[0];
242
+ setSelectedIndex(tabs.current.indexOf(tab));
243
+ }
244
+ }
245
+ }, []);
246
+ require_useIsomorphicEffect.default(() => {
247
+ if (ref.current) setIsScrollable(ref.current.scrollWidth > ref.current.clientWidth + 1);
248
+ function handler() {
249
+ if (ref.current) setIsScrollable(ref.current.scrollWidth > ref.current.clientWidth + 1);
250
+ }
251
+ const debouncedHandler = (0, es_toolkit_compat.debounce)(handler, 200);
252
+ window.addEventListener("resize", debouncedHandler);
253
+ return () => {
254
+ debouncedHandler.cancel();
255
+ window.removeEventListener("resize", debouncedHandler);
256
+ };
257
+ }, []);
258
+ require_useIsomorphicEffect.default(() => {
259
+ if (scrollLeft !== null && ref.current) ref.current.scrollLeft = scrollLeft;
260
+ }, [scrollLeft]);
261
+ require_useIsomorphicEffect.default(() => {
262
+ scrollTabIntoView(activation === "manual" ? tabs.current[activeIndex] : tabs.current[selectedIndex]);
263
+ }, [activation, activeIndex]);
264
+ require_useIsomorphicEffect.default(() => {
265
+ const tab = tabs.current[selectedIndex];
266
+ scrollTabIntoView(tab);
267
+ }, [
268
+ selectedIndex,
269
+ isScrollable,
270
+ children
271
+ ]);
272
+ require_usePressable.usePressable(previousButton, {
273
+ onPress({ longPress }) {
274
+ if (!longPress && ref.current) setScrollLeft(Math.max(scrollLeft - ref.current.scrollWidth / tabs.current.length * 1.5, 0));
275
+ },
276
+ onLongPress() {
277
+ return createLongPressBehavior(ref, "backward", setScrollLeft);
278
+ }
279
+ });
280
+ require_usePressable.usePressable(nextButton, {
281
+ onPress({ longPress }) {
282
+ if (!longPress && ref.current) setScrollLeft(Math.min(scrollLeft + ref.current.scrollWidth / tabs.current.length * 1.5, ref.current.scrollWidth - ref.current.clientWidth));
283
+ },
284
+ onLongPress() {
285
+ return createLongPressBehavior(ref, "forward", setScrollLeft);
286
+ }
287
+ });
288
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
289
+ className,
290
+ children: [
291
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
292
+ "aria-hidden": "true",
293
+ tabIndex: -1,
294
+ "aria-label": "Scroll left",
295
+ ref: previousButton,
296
+ className: previousButtonClasses,
297
+ type: "button",
298
+ ...leftOverflowButtonProps,
299
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_carbon_icons_react.ChevronLeft, {})
300
+ }),
301
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
302
+ ...rest,
303
+ "aria-label": label,
304
+ ref,
305
+ role: "tablist",
306
+ className: `${prefix}--tab--list`,
307
+ onScroll: debouncedOnScroll,
308
+ onKeyDown,
309
+ onBlur: handleBlur,
310
+ children: react.Children.map(children, (child, index) => {
311
+ return !(0, react.isValidElement)(child) ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabContext.Provider, {
312
+ value: {
313
+ index,
314
+ hasSecondaryLabel: hasSecondaryLabelTabs,
315
+ contained
316
+ },
317
+ children: (0, react.cloneElement)(child, { ref: (node) => {
318
+ if (!node) return;
319
+ tabs.current[index] = node;
320
+ } })
321
+ });
322
+ })
323
+ }),
324
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
325
+ "aria-hidden": "true",
326
+ tabIndex: -1,
327
+ "aria-label": "Scroll right",
328
+ ref: nextButton,
329
+ className: nextButtonClasses,
330
+ type: "button",
331
+ ...rightOverflowButtonProps,
332
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_carbon_icons_react.ChevronRight, {})
333
+ })
334
+ ]
335
+ });
506
336
  }
507
337
  TabList.propTypes = {
508
- /**
509
- * Specify whether the content tab should be activated automatically or
510
- * manually
511
- */
512
- activation: PropTypes.oneOf(['automatic', 'manual']),
513
- /**
514
- * Provide an accessible label to be read when a user interacts with this
515
- * component
516
- */
517
- 'aria-label': PropTypes.string,
518
- /**
519
- * Provide child elements to be rendered inside `ContentTabs`.
520
- * These elements should render a `ContentTab`
521
- */
522
- children: PropTypes.node,
523
- /**
524
- * Specify an optional className to be added to the container node
525
- */
526
- className: PropTypes.string,
527
- /**
528
- * Specify whether component is contained type
529
- */
530
- contained: PropTypes.bool,
531
- /**
532
- * Used for tabs within a grid, this makes it so tabs span the full container width and have the same width. Only available on contained tabs with <9 children
533
- */
534
- fullWidth: PropTypes.bool,
535
- /**
536
- * If using `IconTab`, specify the size of the icon being used.
537
- */
538
- iconSize: PropTypes.oneOf(['default', 'lg']),
539
- /**
540
- * Provide the props that describe the left overflow button
541
- */
542
- leftOverflowButtonProps: PropTypes.object,
543
- /**
544
- * Specify whether to use the light component variant
545
- */
546
- light: deprecate.deprecate(PropTypes.bool, 'The `light` prop for `TabList` has ' + 'been deprecated in favor of the new `Layer` component. It will be removed in the next major release.'),
547
- /**
548
- * Provide the props that describe the right overflow button
549
- */
550
- rightOverflowButtonProps: PropTypes.object,
551
- /**
552
- * Optionally provide a delay (in milliseconds) passed to the lodash
553
- * debounce of the onScroll handler. This will impact the responsiveness
554
- * of scroll arrow buttons rendering when scrolling to the first or last tab.
555
- */
556
- scrollDebounceWait: PropTypes.number,
557
- /**
558
- * Choose whether to automatically scroll
559
- * to newly selected tabs on component rerender
560
- */
561
- scrollIntoView: PropTypes.bool
338
+ activation: prop_types.default.oneOf(["automatic", "manual"]),
339
+ "aria-label": prop_types.default.string,
340
+ children: prop_types.default.node,
341
+ className: prop_types.default.string,
342
+ contained: prop_types.default.bool,
343
+ fullWidth: prop_types.default.bool,
344
+ iconSize: prop_types.default.oneOf(["default", "lg"]),
345
+ leftOverflowButtonProps: prop_types.default.object,
346
+ light: require_deprecate.deprecate(prop_types.default.bool, "The `light` prop for `TabList` has been deprecated in favor of the new `Layer` component. It will be removed in the next major release."),
347
+ rightOverflowButtonProps: prop_types.default.object,
348
+ scrollDebounceWait: prop_types.default.number,
349
+ scrollIntoView: prop_types.default.bool
562
350
  };
563
-
564
- /**
565
- * TabListVertical
566
- */
567
-
568
- // type TabElement = HTMLElement & { disabled?: boolean };
569
-
570
- function TabListVertical({
571
- activation = 'automatic',
572
- 'aria-label': label,
573
- children,
574
- className: customClassName,
575
- scrollIntoView,
576
- ...rest
577
- }) {
578
- const {
579
- activeIndex,
580
- selectedIndex,
581
- setSelectedIndex,
582
- setActiveIndex
583
- } = React.useContext(TabsContext);
584
- const prefix = usePrefix.usePrefix();
585
- const ref = React.useRef(null);
586
- const [isOverflowingBottom, setIsOverflowingBottom] = React.useState(false);
587
- const [isOverflowingTop, setIsOverflowingTop] = React.useState(false);
588
- const isSm = useMatchMedia.useMatchMedia(smMediaQuery);
589
- const className = cx(`${prefix}--tabs`, `${prefix}--tabs--vertical`, `${prefix}--tabs--contained`, customClassName);
590
- const tabs = React.useRef([]);
591
- function onKeyDown(event) {
592
- if (match.matches(event, [keys.ArrowDown, keys.ArrowUp, keys.Home, keys.End])) {
593
- event.preventDefault();
594
- const filteredTabs = tabs.current.filter(tab => tab !== null);
595
- const activeTabs = filteredTabs.filter(tab => !tab.disabled);
596
- const currentIndex = activeTabs.indexOf(tabs.current[activation === 'automatic' ? selectedIndex : activeIndex]);
597
- const nextIndex = tabs.current.indexOf(activeTabs[getNextIndexVertical(event, activeTabs.length, currentIndex)]);
598
- if (activation === 'automatic') {
599
- setSelectedIndex(nextIndex);
600
- } else if (activation === 'manual') {
601
- setActiveIndex(nextIndex);
602
- }
603
- tabs.current[nextIndex]?.focus();
604
- }
605
- }
606
- function handleBlur({
607
- relatedTarget: currentActiveNode
608
- }) {
609
- if (ref.current?.contains(currentActiveNode)) {
610
- return;
611
- }
612
- // reset active index to selected tab index for manual activation
613
- if (activation === 'manual') {
614
- setActiveIndex(selectedIndex);
615
- }
616
- }
617
- React.useEffect(() => {
618
- if (tabs.current[selectedIndex]?.disabled) {
619
- const activeTabs = tabs.current.filter(tab => {
620
- return !tab.disabled;
621
- });
622
- if (activeTabs.length > 0) {
623
- const tab = activeTabs[0];
624
- setSelectedIndex(tabs.current.indexOf(tab));
625
- }
626
- }
627
- // eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20452
628
- }, []);
629
- React.useEffect(() => {
630
- function handler() {
631
- const containerHeight = ref.current?.offsetHeight;
632
- const containerTop = ref.current?.getBoundingClientRect().top;
633
- const selectedPositionTop = tabs.current[selectedIndex]?.getBoundingClientRect().top;
634
- const halfTabHeight = verticalTabHeight / 2;
635
- if (containerTop && containerHeight) {
636
- // scrolls so selected tab is in view
637
- if (selectedPositionTop - halfTabHeight < containerTop || selectedPositionTop - containerTop + verticalTabHeight + halfTabHeight > containerHeight) {
638
- ref.current?.scrollTo({
639
- top: (selectedIndex - 1) * verticalTabHeight,
640
- behavior: 'smooth'
641
- });
642
- }
643
- }
644
- }
645
- window.addEventListener('resize', handler);
646
- handler();
647
- return () => {
648
- window.removeEventListener('resize', handler);
649
- };
650
- }, [selectedIndex, scrollIntoView]);
651
- React.useEffect(() => {
652
- const element = ref.current;
653
- if (!element) {
654
- return;
655
- }
656
- const handler = () => {
657
- const halfTabHeight = verticalTabHeight / 2;
658
- setIsOverflowingBottom(element.scrollTop + element.clientHeight + halfTabHeight <= element.scrollHeight);
659
- setIsOverflowingTop(element.scrollTop > halfTabHeight);
660
- };
661
- const resizeObserver = new ResizeObserver(() => handler());
662
- resizeObserver.observe(element);
663
- element.addEventListener('scroll', handler);
664
- return () => {
665
- resizeObserver.disconnect();
666
- element.removeEventListener('scroll', handler);
667
- };
668
- });
669
- if (isSm) {
670
- return /*#__PURE__*/React.createElement(TabList, _rollupPluginBabelHelpers.extends({}, rest, {
671
- "aria-label": label,
672
- contained: true
673
- }), children);
674
- }
675
- return /*#__PURE__*/React.createElement("div", {
676
- className: className
677
- }, isOverflowingTop && /*#__PURE__*/React.createElement("div", {
678
- className: `${prefix}--tab--list-gradient_top`
679
- }), /*#__PURE__*/React.createElement("div", _rollupPluginBabelHelpers.extends({}, rest, {
680
- "aria-label": label,
681
- ref: ref,
682
- role: "tablist",
683
- className: `${prefix}--tab--list`,
684
- onKeyDown: onKeyDown,
685
- onBlur: handleBlur
686
- }), React.Children.map(children, (child, index) => {
687
- return ! /*#__PURE__*/React.isValidElement(child) ? null : /*#__PURE__*/React.createElement(TabContext.Provider, {
688
- value: {
689
- index,
690
- hasSecondaryLabel: false
691
- }
692
- }, /*#__PURE__*/React.cloneElement(child, {
693
- ref: node => {
694
- if (!node) return;
695
- tabs.current[index] = node;
696
- }
697
- }));
698
- })), isOverflowingBottom && /*#__PURE__*/React.createElement("div", {
699
- className: `${prefix}--tab--list-gradient_bottom`
700
- }));
351
+ function TabListVertical({ activation = "automatic", "aria-label": label, children, className: customClassName, scrollIntoView, ...rest }) {
352
+ const { activeIndex, selectedIndex, setSelectedIndex, setActiveIndex } = react.default.useContext(TabsContext);
353
+ const prefix = require_usePrefix.usePrefix();
354
+ const ref = (0, react.useRef)(null);
355
+ const [isOverflowingBottom, setIsOverflowingBottom] = (0, react.useState)(false);
356
+ const [isOverflowingTop, setIsOverflowingTop] = (0, react.useState)(false);
357
+ const isSm = require_useMatchMedia.useMatchMedia(smMediaQuery);
358
+ const className = (0, classnames.default)(`${prefix}--tabs`, `${prefix}--tabs--vertical`, `${prefix}--tabs--contained`, customClassName);
359
+ const tabs = (0, react.useRef)([]);
360
+ function onKeyDown(event) {
361
+ if (require_match.matches(event, [
362
+ require_keys.ArrowDown,
363
+ require_keys.ArrowUp,
364
+ require_keys.Home,
365
+ require_keys.End
366
+ ])) {
367
+ event.preventDefault();
368
+ const activeTabs = tabs.current.filter((tab) => tab !== null).filter((tab) => !tab.disabled);
369
+ const currentIndex = activeTabs.indexOf(tabs.current[activation === "automatic" ? selectedIndex : activeIndex]);
370
+ const nextIndex = tabs.current.indexOf(activeTabs[getNextIndexVertical(event, activeTabs.length, currentIndex)]);
371
+ if (activation === "automatic") setSelectedIndex(nextIndex);
372
+ else if (activation === "manual") setActiveIndex(nextIndex);
373
+ tabs.current[nextIndex]?.focus();
374
+ }
375
+ }
376
+ function handleBlur({ relatedTarget: currentActiveNode }) {
377
+ if (ref.current?.contains(currentActiveNode)) return;
378
+ if (activation === "manual") setActiveIndex(selectedIndex);
379
+ }
380
+ (0, react.useEffect)(() => {
381
+ if (tabs.current[selectedIndex]?.disabled) {
382
+ const activeTabs = tabs.current.filter((tab) => {
383
+ return !tab.disabled;
384
+ });
385
+ if (activeTabs.length > 0) {
386
+ const tab = activeTabs[0];
387
+ setSelectedIndex(tabs.current.indexOf(tab));
388
+ }
389
+ }
390
+ }, []);
391
+ (0, react.useEffect)(() => {
392
+ function handler() {
393
+ const containerHeight = ref.current?.offsetHeight;
394
+ const containerTop = ref.current?.getBoundingClientRect().top;
395
+ const selectedPositionTop = tabs.current[selectedIndex]?.getBoundingClientRect().top;
396
+ const halfTabHeight = verticalTabHeight / 2;
397
+ if (containerTop && containerHeight) {
398
+ if (selectedPositionTop - halfTabHeight < containerTop || selectedPositionTop - containerTop + verticalTabHeight + halfTabHeight > containerHeight) ref.current?.scrollTo({
399
+ top: (selectedIndex - 1) * verticalTabHeight,
400
+ behavior: "smooth"
401
+ });
402
+ }
403
+ }
404
+ window.addEventListener("resize", handler);
405
+ handler();
406
+ return () => {
407
+ window.removeEventListener("resize", handler);
408
+ };
409
+ }, [selectedIndex, scrollIntoView]);
410
+ (0, react.useEffect)(() => {
411
+ const element = ref.current;
412
+ if (!element) return;
413
+ const handler = () => {
414
+ const halfTabHeight = verticalTabHeight / 2;
415
+ setIsOverflowingBottom(element.scrollTop + element.clientHeight + halfTabHeight <= element.scrollHeight);
416
+ setIsOverflowingTop(element.scrollTop > halfTabHeight);
417
+ };
418
+ const resizeObserver = new ResizeObserver(() => handler());
419
+ resizeObserver.observe(element);
420
+ element.addEventListener("scroll", handler);
421
+ return () => {
422
+ resizeObserver.disconnect();
423
+ element.removeEventListener("scroll", handler);
424
+ };
425
+ });
426
+ if (isSm) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabList, {
427
+ ...rest,
428
+ "aria-label": label,
429
+ contained: true,
430
+ children
431
+ });
432
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
433
+ className,
434
+ children: [
435
+ isOverflowingTop && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: `${prefix}--tab--list-gradient_top` }),
436
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
437
+ ...rest,
438
+ "aria-label": label,
439
+ ref,
440
+ role: "tablist",
441
+ className: `${prefix}--tab--list`,
442
+ onKeyDown,
443
+ onBlur: handleBlur,
444
+ children: react.Children.map(children, (child, index) => {
445
+ return !(0, react.isValidElement)(child) ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabContext.Provider, {
446
+ value: {
447
+ index,
448
+ hasSecondaryLabel: false
449
+ },
450
+ children: (0, react.cloneElement)(child, { ref: (node) => {
451
+ if (!node) return;
452
+ tabs.current[index] = node;
453
+ } })
454
+ });
455
+ })
456
+ }),
457
+ isOverflowingBottom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: `${prefix}--tab--list-gradient_bottom` })
458
+ ]
459
+ });
701
460
  }
702
461
  TabListVertical.propTypes = {
703
- /**
704
- * Specify whether the content tab should be activated automatically or
705
- * manually
706
- */
707
- activation: PropTypes.oneOf(['automatic', 'manual']),
708
- /**
709
- * Provide an accessible label to be read when a user interacts with this
710
- * component
711
- */
712
- 'aria-label': PropTypes.string,
713
- /**
714
- * Provide child elements to be rendered inside `ContentTabs`.
715
- * These elements should render a `ContentTab`
716
- */
717
- children: PropTypes.node,
718
- /**
719
- * Specify an optional className to be added to the container node
720
- */
721
- className: PropTypes.string
462
+ activation: prop_types.default.oneOf(["automatic", "manual"]),
463
+ "aria-label": prop_types.default.string,
464
+ children: prop_types.default.node,
465
+ className: prop_types.default.string
722
466
  };
723
-
724
467
  /**
725
- * Helper function to set up the behavior when a button is "long pressed".
726
- * This function will take a ref to the tablist, a direction, and a setter
727
- * for scrollLeft and will update the scroll position within a requestAnimationFrame.
728
- *
729
- * It returns a cleanup function to be run
730
- * when the long press is deactivated
731
- */
468
+ * Helper function to set up the behavior when a button is "long pressed".
469
+ * This function will take a ref to the tablist, a direction, and a setter
470
+ * for scrollLeft and will update the scroll position within a requestAnimationFrame.
471
+ *
472
+ * It returns a cleanup function to be run
473
+ * when the long press is deactivated
474
+ */
732
475
  function createLongPressBehavior(ref, direction, setScrollLeft) {
733
- const node = ref.current;
734
- if (!node) {
735
- return () => {};
736
- }
737
-
738
- // We manually override the scroll behavior to be "auto".
739
- // If it is set as smooth, this animation does not update correctly
740
- const defaultScrollBehavior = node?.style['scroll-behavior'];
741
- node.style['scroll-behavior'] = 'auto';
742
- const scrollDelta = direction === 'forward' ? 5 : -5;
743
- let frameId = null;
744
- function tick() {
745
- if (!node) {
746
- return;
747
- }
748
- node.scrollLeft = node.scrollLeft + scrollDelta;
749
- frameId = requestAnimationFrame(tick);
750
- }
751
- frameId = requestAnimationFrame(tick);
752
- return () => {
753
- // Restore the previous scroll behavior
754
- node.style['scroll-behavior'] = defaultScrollBehavior;
755
-
756
- // Make sure that our `scrollLeft` value is in sync with the existing
757
- // `ref` after our requestAnimationFrame loop above
758
- setScrollLeft(node.scrollLeft);
759
- if (frameId) {
760
- cancelAnimationFrame(frameId);
761
- }
762
- };
476
+ const node = ref.current;
477
+ if (!node) return () => {};
478
+ const defaultScrollBehavior = node?.style["scroll-behavior"];
479
+ node.style["scroll-behavior"] = "auto";
480
+ const scrollDelta = direction === "forward" ? 5 : -5;
481
+ let frameId = null;
482
+ function tick() {
483
+ if (!node) return;
484
+ node.scrollLeft = node.scrollLeft + scrollDelta;
485
+ frameId = requestAnimationFrame(tick);
486
+ }
487
+ frameId = requestAnimationFrame(tick);
488
+ return () => {
489
+ node.style["scroll-behavior"] = defaultScrollBehavior;
490
+ setScrollLeft(node.scrollLeft);
491
+ if (frameId) cancelAnimationFrame(frameId);
492
+ };
763
493
  }
764
-
765
- /**
766
- * Tab
767
- */
768
-
769
- // eslint-disable-next-line react/display-name -- https://github.com/carbon-design-system/carbon/issues/20452
770
- const Tab = /*#__PURE__*/React.forwardRef(({
771
- as = 'button',
772
- children,
773
- className: customClassName,
774
- disabled,
775
- onClick,
776
- onKeyDown,
777
- secondaryLabel,
778
- renderIcon: Icon,
779
- ...rest
780
- }, forwardRef) => {
781
- const prefix = usePrefix.usePrefix();
782
- const {
783
- selectedIndex,
784
- setSelectedIndex,
785
- baseId,
786
- dismissable,
787
- onTabCloseRequest
788
- } = React.useContext(TabsContext);
789
- const {
790
- index: index$1,
791
- hasSecondaryLabel,
792
- contained
793
- } = React.useContext(TabContext);
794
- const {
795
- badgeIndicator
796
- } = React.useContext(IconTabContext) || {};
797
- const dismissIconRef = React.useRef(null);
798
- const tabRef = React.useRef(null);
799
- const ref = useMergedRefs.useMergedRefs([forwardRef, tabRef]);
800
- const [ignoreHover, setIgnoreHover] = React.useState(false);
801
- const id = `${baseId}-tab-${index$1}`;
802
- const panelId = `${baseId}-tabpanel-${index$1}`;
803
- const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
804
-
805
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
806
- const isEllipsisActive = element => {
807
- setIsEllipsisApplied(element.offsetHeight < element.scrollHeight);
808
- return element.offsetHeight < element.scrollHeight;
809
- };
810
- const className = cx(`${prefix}--tabs__nav-item`, `${prefix}--tabs__nav-link`, {
811
- [`${prefix}--tabs__nav-item--selected`]: selectedIndex === index$1,
812
- [`${prefix}--tabs__nav-item--disabled`]: disabled,
813
- [`${prefix}--tabs__nav-item--hover-off`]: ignoreHover
814
- }, customClassName);
815
- const BaseComponent = as;
816
- const onDismissIconMouseEnter = evt => {
817
- if (contained && tabRef.current) {
818
- evt.stopPropagation();
819
- setIgnoreHover(true);
820
- tabRef.current.classList.add(`${prefix}--tabs__nav-item--hover-off`);
821
- }
822
- };
823
- const onDismissIconMouseLeave = () => {
824
- if (contained && tabRef.current) {
825
- tabRef.current.classList.remove(`${prefix}--tabs__nav-item--hover-off`);
826
- setIgnoreHover(false);
827
- }
828
- };
829
- useEvent.useEvent(dismissIconRef, 'mouseover', onDismissIconMouseEnter);
830
- useEvent.useEvent(dismissIconRef, 'mouseleave', onDismissIconMouseLeave);
831
- useIsomorphicEffect.default(() => {
832
- function handler() {
833
- const elementTabId = document.getElementById(`${id}`) || tabRef.current;
834
- if (elementTabId?.closest(`.${prefix}--tabs--vertical`)) {
835
- const newElement = elementTabId?.getElementsByClassName(`${prefix}--tabs__nav-item-label`)[0];
836
- isEllipsisActive(newElement);
837
- }
838
- }
839
- handler();
840
- window.addEventListener('resize', handler);
841
- return () => {
842
- window.removeEventListener('resize', handler);
843
- };
844
- }, [prefix, id]);
845
- const handleClose = evt => {
846
- evt.stopPropagation();
847
- onTabCloseRequest?.(index$1);
848
-
849
- // set focus after removing tab
850
- if (tabRef.current && tabRef.current.parentElement) {
851
- // determine number of tabs, excluding disabled
852
- const tabCount = Array.from(tabRef.current.parentElement.childNodes).filter(node => {
853
- if (!(node instanceof HTMLElement)) return false;
854
- return node.classList.contains(`${prefix}--tabs__nav-link`) && !node.classList.contains(`${prefix}--tabs__nav-item--disabled`);
855
- }).length;
856
-
857
- // if not removing last tab focus on next tab
858
- if (tabRef.current && index$1 + 1 !== tabCount) {
859
- tabRef.current.focus();
860
- }
861
- // if removing last tab focus on previous tab
862
- else {
863
- const prevTabIndex = (tabCount - 2) * 2;
864
- const previousTab = tabRef.current.parentElement.childNodes[prevTabIndex];
865
- if (previousTab instanceof HTMLElement) {
866
- previousTab.focus();
867
- }
868
- }
869
- }
870
- };
871
- const handleKeyDown = event => {
872
- if (dismissable && match.match(event, keys.Delete)) {
873
- handleClose(event);
874
- }
875
- onKeyDown?.(event);
876
- };
877
- const DismissIcon = /*#__PURE__*/React.createElement("div", {
878
- className: cx({
879
- [`${prefix}--tabs__nav-item--close`]: dismissable,
880
- [`${prefix}--tabs__nav-item--close--hidden`]: !dismissable
881
- })
882
- }, /*#__PURE__*/React.createElement("button", {
883
- type: "button",
884
- tabIndex: -1,
885
- "aria-disabled": disabled,
886
- "aria-hidden": selectedIndex === index$1 && dismissable ? 'false' : 'true',
887
- disabled: disabled,
888
- className: cx({
889
- [`${prefix}--tabs__nav-item--close-icon`]: dismissable,
890
- [`${prefix}--visually-hidden`]: !dismissable,
891
- [`${prefix}--tabs__nav-item--close-icon--selected`]: selectedIndex === index$1,
892
- [`${prefix}--tabs__nav-item--close-icon--disabled`]: disabled
893
- }),
894
- onClick: handleClose,
895
- title: `Remove ${typeof children === 'string' ? children : ''} tab`,
896
- ref: dismissIconRef
897
- }, /*#__PURE__*/React.createElement(iconsReact.Close, {
898
- "aria-hidden": selectedIndex === index$1 && dismissable ? 'false' : 'true',
899
- "aria-label": `Press delete to remove ${typeof children === 'string' ? children : ''} tab`
900
- })));
901
- const hasIcon = Icon ?? dismissable;
902
-
903
- // should only happen for vertical variation, so no dismissable icon is needed here
904
- if (isEllipsisApplied) {
905
- return /*#__PURE__*/React.createElement(Tooltip.Tooltip, {
906
- label: children,
907
- align: "top",
908
- leaveDelayMs: 0,
909
- autoAlign: true,
910
- onMouseEnter: () => false,
911
- closeOnActivation: true
912
- }, /*#__PURE__*/React.createElement(BaseComponent, _rollupPluginBabelHelpers.extends({}, rest, {
913
- "aria-controls": panelId,
914
- "aria-disabled": disabled,
915
- "aria-selected": selectedIndex === index$1,
916
- ref: ref,
917
- id: id,
918
- role: "tab",
919
- className: className,
920
- disabled: disabled,
921
- title: children,
922
- onClick: evt => {
923
- if (disabled) {
924
- return;
925
- }
926
- setSelectedIndex(index$1);
927
- onClick?.(evt);
928
- },
929
- onKeyDown: handleKeyDown,
930
- tabIndex: selectedIndex === index$1 ? '0' : '-1',
931
- type: "button"
932
- }), /*#__PURE__*/React.createElement("div", {
933
- className: `${prefix}--tabs__nav-item-label-wrapper`
934
- }, /*#__PURE__*/React.createElement(Text.Text, {
935
- className: `${prefix}--tabs__nav-item-label`
936
- }, children)), hasSecondaryLabel && secondaryLabel && /*#__PURE__*/React.createElement(Text.Text, {
937
- as: "div",
938
- className: `${prefix}--tabs__nav-item-secondary-label`,
939
- title: secondaryLabel
940
- }, secondaryLabel)));
941
- }
942
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(BaseComponent, _rollupPluginBabelHelpers.extends({}, rest, {
943
- "aria-controls": panelId,
944
- "aria-disabled": disabled,
945
- "aria-selected": selectedIndex === index$1,
946
- ref: ref,
947
- id: id,
948
- role: "tab",
949
- className: className,
950
- disabled: disabled,
951
- onClick: evt => {
952
- if (disabled) {
953
- return;
954
- }
955
- setSelectedIndex(index$1);
956
- onClick?.(evt);
957
- },
958
- onKeyDown: handleKeyDown,
959
- tabIndex: selectedIndex === index$1 ? '0' : '-1',
960
- type: "button"
961
- }), /*#__PURE__*/React.createElement("div", {
962
- className: `${prefix}--tabs__nav-item-label-wrapper`
963
- }, dismissable && Icon && /*#__PURE__*/React.createElement("div", {
964
- className: `${prefix}--tabs__nav-item--icon-left`
965
- }, /*#__PURE__*/React.createElement(Icon, {
966
- size: 16
967
- })), /*#__PURE__*/React.createElement(Text.Text, {
968
- className: `${prefix}--tabs__nav-item-label`
969
- }, children), !dismissable && Icon && /*#__PURE__*/React.createElement("div", {
970
- className: cx(`${prefix}--tabs__nav-item--icon`, {
971
- [`${prefix}--visually-hidden`]: !hasIcon
972
- })
973
- }, !dismissable && Icon && /*#__PURE__*/React.createElement(Icon, {
974
- size: 16
975
- }))), hasSecondaryLabel && secondaryLabel && /*#__PURE__*/React.createElement(Text.Text, {
976
- as: "div",
977
- className: `${prefix}--tabs__nav-item-secondary-label`,
978
- title: secondaryLabel
979
- }, secondaryLabel), !disabled && badgeIndicator && (_BadgeIndicator || (_BadgeIndicator = /*#__PURE__*/React.createElement(index.BadgeIndicator, null)))), DismissIcon);
494
+ const Tab = (0, react.forwardRef)(({ as = "button", children, className: customClassName, disabled, onClick, onKeyDown, secondaryLabel, renderIcon: Icon, ...rest }, forwardRef) => {
495
+ const prefix = require_usePrefix.usePrefix();
496
+ const { selectedIndex, setSelectedIndex, baseId, dismissable, onTabCloseRequest } = react.default.useContext(TabsContext);
497
+ const { index, hasSecondaryLabel, contained } = react.default.useContext(TabContext);
498
+ const { badgeIndicator } = react.default.useContext(IconTabContext) || {};
499
+ const dismissIconRef = (0, react.useRef)(null);
500
+ const tabRef = (0, react.useRef)(null);
501
+ const ref = require_useMergedRefs.useMergedRefs([forwardRef, tabRef]);
502
+ const [ignoreHover, setIgnoreHover] = (0, react.useState)(false);
503
+ const id = `${baseId}-tab-${index}`;
504
+ const panelId = `${baseId}-tabpanel-${index}`;
505
+ const [isEllipsisApplied, setIsEllipsisApplied] = (0, react.useState)(false);
506
+ const isEllipsisActive = (element) => {
507
+ setIsEllipsisApplied(element.offsetHeight < element.scrollHeight);
508
+ return element.offsetHeight < element.scrollHeight;
509
+ };
510
+ const className = (0, classnames.default)(`${prefix}--tabs__nav-item`, `${prefix}--tabs__nav-link`, {
511
+ [`${prefix}--tabs__nav-item--selected`]: selectedIndex === index,
512
+ [`${prefix}--tabs__nav-item--disabled`]: disabled,
513
+ [`${prefix}--tabs__nav-item--hover-off`]: ignoreHover
514
+ }, customClassName);
515
+ const BaseComponent = as;
516
+ const onDismissIconMouseEnter = (evt) => {
517
+ if (contained && tabRef.current) {
518
+ evt.stopPropagation();
519
+ setIgnoreHover(true);
520
+ tabRef.current.classList.add(`${prefix}--tabs__nav-item--hover-off`);
521
+ }
522
+ };
523
+ const onDismissIconMouseLeave = () => {
524
+ if (contained && tabRef.current) {
525
+ tabRef.current.classList.remove(`${prefix}--tabs__nav-item--hover-off`);
526
+ setIgnoreHover(false);
527
+ }
528
+ };
529
+ require_useEvent.useEvent(dismissIconRef, "mouseover", onDismissIconMouseEnter);
530
+ require_useEvent.useEvent(dismissIconRef, "mouseleave", onDismissIconMouseLeave);
531
+ require_useIsomorphicEffect.default(() => {
532
+ function handler() {
533
+ const elementTabId = document.getElementById(`${id}`) || tabRef.current;
534
+ if (elementTabId?.closest(`.${prefix}--tabs--vertical`)) {
535
+ const newElement = elementTabId?.getElementsByClassName(`${prefix}--tabs__nav-item-label`)[0];
536
+ isEllipsisActive(newElement);
537
+ }
538
+ }
539
+ handler();
540
+ window.addEventListener("resize", handler);
541
+ return () => {
542
+ window.removeEventListener("resize", handler);
543
+ };
544
+ }, [prefix, id]);
545
+ const handleClose = (evt) => {
546
+ evt.stopPropagation();
547
+ onTabCloseRequest?.(index);
548
+ if (tabRef.current && tabRef.current.parentElement) {
549
+ const tabCount = Array.from(tabRef.current.parentElement.childNodes).filter((node) => {
550
+ if (!(node instanceof HTMLElement)) return false;
551
+ return node.classList.contains(`${prefix}--tabs__nav-link`) && !node.classList.contains(`${prefix}--tabs__nav-item--disabled`);
552
+ }).length;
553
+ if (tabRef.current && index + 1 !== tabCount) tabRef.current.focus();
554
+ else {
555
+ const prevTabIndex = (tabCount - 2) * 2;
556
+ const previousTab = tabRef.current.parentElement.childNodes[prevTabIndex];
557
+ if (previousTab instanceof HTMLElement) previousTab.focus();
558
+ }
559
+ }
560
+ };
561
+ const handleKeyDown = (event) => {
562
+ if (dismissable && require_match.match(event, require_keys.Delete)) handleClose(event);
563
+ onKeyDown?.(event);
564
+ };
565
+ const DismissIcon = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
566
+ className: (0, classnames.default)({
567
+ [`${prefix}--tabs__nav-item--close`]: dismissable,
568
+ [`${prefix}--tabs__nav-item--close--hidden`]: !dismissable
569
+ }),
570
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
571
+ type: "button",
572
+ tabIndex: -1,
573
+ "aria-disabled": disabled,
574
+ "aria-hidden": selectedIndex === index && dismissable ? "false" : "true",
575
+ disabled,
576
+ className: (0, classnames.default)({
577
+ [`${prefix}--tabs__nav-item--close-icon`]: dismissable,
578
+ [`${prefix}--visually-hidden`]: !dismissable,
579
+ [`${prefix}--tabs__nav-item--close-icon--selected`]: selectedIndex === index,
580
+ [`${prefix}--tabs__nav-item--close-icon--disabled`]: disabled
581
+ }),
582
+ onClick: handleClose,
583
+ title: `Remove ${typeof children === "string" ? children : ""} tab`,
584
+ ref: dismissIconRef,
585
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_carbon_icons_react.Close, {
586
+ "aria-hidden": selectedIndex === index && dismissable ? "false" : "true",
587
+ "aria-label": `Press delete to remove ${typeof children === "string" ? children : ""} tab`
588
+ })
589
+ })
590
+ });
591
+ const hasIcon = Icon ?? dismissable;
592
+ if (isEllipsisApplied) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Tooltip.Tooltip, {
593
+ label: children,
594
+ align: "top",
595
+ leaveDelayMs: 0,
596
+ autoAlign: true,
597
+ onMouseEnter: () => false,
598
+ closeOnActivation: true,
599
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(BaseComponent, {
600
+ ...rest,
601
+ "aria-controls": panelId,
602
+ "aria-disabled": disabled,
603
+ "aria-selected": selectedIndex === index,
604
+ ref,
605
+ id,
606
+ role: "tab",
607
+ className,
608
+ disabled,
609
+ title: children,
610
+ onClick: (evt) => {
611
+ if (disabled) return;
612
+ setSelectedIndex(index);
613
+ onClick?.(evt);
614
+ },
615
+ onKeyDown: handleKeyDown,
616
+ tabIndex: selectedIndex === index ? "0" : "-1",
617
+ type: "button",
618
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
619
+ className: `${prefix}--tabs__nav-item-label-wrapper`,
620
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Text.Text, {
621
+ className: `${prefix}--tabs__nav-item-label`,
622
+ children
623
+ })
624
+ }), hasSecondaryLabel && secondaryLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Text.Text, {
625
+ as: "div",
626
+ className: `${prefix}--tabs__nav-item-secondary-label`,
627
+ title: secondaryLabel,
628
+ children: secondaryLabel
629
+ })]
630
+ })
631
+ });
632
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(BaseComponent, {
633
+ ...rest,
634
+ "aria-controls": panelId,
635
+ "aria-disabled": disabled,
636
+ "aria-selected": selectedIndex === index,
637
+ ref,
638
+ id,
639
+ role: "tab",
640
+ className,
641
+ disabled,
642
+ onClick: (evt) => {
643
+ if (disabled) return;
644
+ setSelectedIndex(index);
645
+ onClick?.(evt);
646
+ },
647
+ onKeyDown: handleKeyDown,
648
+ tabIndex: selectedIndex === index ? "0" : "-1",
649
+ type: "button",
650
+ children: [
651
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
652
+ className: `${prefix}--tabs__nav-item-label-wrapper`,
653
+ children: [
654
+ dismissable && Icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
655
+ className: `${prefix}--tabs__nav-item--icon-left`,
656
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { size: 16 })
657
+ }),
658
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Text.Text, {
659
+ className: `${prefix}--tabs__nav-item-label`,
660
+ children
661
+ }),
662
+ !dismissable && Icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
663
+ className: (0, classnames.default)(`${prefix}--tabs__nav-item--icon`, { [`${prefix}--visually-hidden`]: !hasIcon }),
664
+ children: !dismissable && Icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { size: 16 })
665
+ })
666
+ ]
667
+ }),
668
+ hasSecondaryLabel && secondaryLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Text.Text, {
669
+ as: "div",
670
+ className: `${prefix}--tabs__nav-item-secondary-label`,
671
+ title: secondaryLabel,
672
+ children: secondaryLabel
673
+ }),
674
+ !disabled && badgeIndicator && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.default, {})
675
+ ]
676
+ }), DismissIcon] });
980
677
  });
981
678
  Tab.propTypes = {
982
- /**
983
- * Provide a custom element to render instead of the default button
984
- */
985
- as: PropTypes.oneOfType([PropTypes.string, PropTypes.elementType]),
986
- /**
987
- * Provide child elements to be rendered inside `Tab`.
988
- */
989
- children: PropTypes.node,
990
- /**
991
- * Specify an optional className to be added to your Tab
992
- */
993
- className: PropTypes.string,
994
- /**
995
- * Whether your Tab is disabled.
996
- */
997
- disabled: PropTypes.bool,
998
- /**
999
- * Provide a handler that is invoked when a user clicks on the control
1000
- */
1001
- onClick: PropTypes.func,
1002
- /**
1003
- * Provide a handler that is invoked on the key down event for the control
1004
- */
1005
- onKeyDown: PropTypes.func,
1006
- /**
1007
- * An optional parameter to allow overriding the anchor rendering.
1008
- * Useful for using Tab along with react-router or other client
1009
- * side router libraries.
1010
- */
1011
- renderButton: PropTypes.func,
1012
- /**
1013
- * A component used to render an icon.
1014
- */
1015
- renderIcon: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
1016
- /**
1017
- * An optional label to render under the primary tab label.
1018
- * Only useful for contained tabs.
1019
- */
1020
- secondaryLabel: PropTypes.string
679
+ as: prop_types.default.oneOfType([prop_types.default.string, prop_types.default.elementType]),
680
+ children: prop_types.default.node,
681
+ className: prop_types.default.string,
682
+ disabled: prop_types.default.bool,
683
+ onClick: prop_types.default.func,
684
+ onKeyDown: prop_types.default.func,
685
+ renderButton: prop_types.default.func,
686
+ renderIcon: prop_types.default.oneOfType([prop_types.default.func, prop_types.default.object]),
687
+ secondaryLabel: prop_types.default.string
1021
688
  };
1022
-
1023
689
  /**
1024
- * IconTab
1025
- */
1026
-
1027
- const IconTabContext = /*#__PURE__*/React.createContext(false);
1028
- // eslint-disable-next-line react/display-name -- https://github.com/carbon-design-system/carbon/issues/20452
1029
- const IconTab = /*#__PURE__*/React.forwardRef(({
1030
- badgeIndicator,
1031
- children,
1032
- className: customClassName,
1033
- defaultOpen = false,
1034
- enterDelayMs,
1035
- leaveDelayMs,
1036
- label,
1037
- ...rest
1038
- }, ref) => {
1039
- const prefix = usePrefix.usePrefix();
1040
- const value = React.useMemo(() => ({
1041
- badgeIndicator
1042
- }), [badgeIndicator]);
1043
- const hasSize20 = /*#__PURE__*/React.isValidElement(children) && (children.props.size === 20 || children.props.size === '20');
1044
- const classNames = cx(`${prefix}--tabs__nav-item--icon-only`, customClassName, {
1045
- [`${prefix}--tabs__nav-item--icon-only__20`]: hasSize20
1046
- });
1047
- return /*#__PURE__*/React.createElement(IconTabContext.Provider, {
1048
- value: value
1049
- }, /*#__PURE__*/React.createElement(Tooltip.Tooltip, {
1050
- align: "bottom",
1051
- defaultOpen: defaultOpen,
1052
- className: `${prefix}--icon-tooltip`,
1053
- enterDelayMs: enterDelayMs,
1054
- label: label,
1055
- leaveDelayMs: leaveDelayMs
1056
- }, /*#__PURE__*/React.createElement(Tab, _rollupPluginBabelHelpers.extends({
1057
- className: classNames,
1058
- ref: ref
1059
- }, rest), children)));
690
+ * IconTab
691
+ */
692
+ const IconTabContext = (0, react.createContext)(false);
693
+ const IconTab = react.default.forwardRef(({ badgeIndicator, children, className: customClassName, defaultOpen = false, enterDelayMs, leaveDelayMs, label, ...rest }, ref) => {
694
+ const prefix = require_usePrefix.usePrefix();
695
+ const value = (0, react.useMemo)(() => ({ badgeIndicator }), [badgeIndicator]);
696
+ const hasSize20 = (0, react.isValidElement)(children) && (children.props.size === 20 || children.props.size === "20");
697
+ const classNames = (0, classnames.default)(`${prefix}--tabs__nav-item--icon-only`, customClassName, { [`${prefix}--tabs__nav-item--icon-only__20`]: hasSize20 });
698
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconTabContext.Provider, {
699
+ value,
700
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Tooltip.Tooltip, {
701
+ align: "bottom",
702
+ defaultOpen,
703
+ className: `${prefix}--icon-tooltip`,
704
+ enterDelayMs,
705
+ label,
706
+ leaveDelayMs,
707
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tab, {
708
+ className: classNames,
709
+ ref,
710
+ ...rest,
711
+ children
712
+ })
713
+ })
714
+ });
1060
715
  });
1061
716
  IconTab.propTypes = {
1062
- /**
1063
- * **Experimental**: Display an empty dot badge on the Tab.
1064
- */
1065
- badgeIndicator: PropTypes.bool,
1066
- /**
1067
- * Provide an icon to be rendered inside `IconTab` as the visual label for Tab.
1068
- */
1069
- children: PropTypes.node,
1070
- /**
1071
- * Specify an optional className to be added to your Tab
1072
- */
1073
- className: PropTypes.string,
1074
- /**
1075
- * Specify whether the tooltip for the icon should be open when it first renders
1076
- */
1077
- defaultOpen: PropTypes.bool,
1078
- /**
1079
- * Specify the duration in milliseconds to delay before displaying the tooltip for the icon.
1080
- */
1081
- enterDelayMs: PropTypes.number,
1082
- /**
1083
- * Provide the label to be rendered inside the Tooltip. The label will use
1084
- * `aria-labelledby` and will fully describe the child node that is provided.
1085
- * This means that if you have text in the child node it will not be
1086
- * announced to the screen reader. If using the badgeIndicator then provide a
1087
- * label with describing that there is a new notification.
1088
- */
1089
- label: PropTypes.node.isRequired,
1090
- /**
1091
- * Specify the duration in milliseconds to delay before hiding the tooltip
1092
- */
1093
- leaveDelayMs: PropTypes.number
717
+ badgeIndicator: prop_types.default.bool,
718
+ children: prop_types.default.node,
719
+ className: prop_types.default.string,
720
+ defaultOpen: prop_types.default.bool,
721
+ enterDelayMs: prop_types.default.number,
722
+ label: prop_types.default.node.isRequired,
723
+ leaveDelayMs: prop_types.default.number
1094
724
  };
1095
-
1096
- /**
1097
- * TabPanel
1098
- */
1099
-
1100
- // eslint-disable-next-line react/display-name -- https://github.com/carbon-design-system/carbon/issues/20452
1101
- const TabPanel = /*#__PURE__*/React.forwardRef(({
1102
- children,
1103
- className: customClassName,
1104
- ...rest
1105
- }, forwardRef) => {
1106
- const prefix = usePrefix.usePrefix();
1107
- const {
1108
- selectedIndex,
1109
- baseId
1110
- } = React.useContext(TabsContext);
1111
- const index = React.useContext(TabPanelContext);
1112
- const id = `${baseId}-tabpanel-${index}`;
1113
- const tabId = `${baseId}-tab-${index}`;
1114
- const className = cx(`${prefix}--tab-content`, customClassName);
1115
- return /*#__PURE__*/React.createElement("div", _rollupPluginBabelHelpers.extends({}, rest, {
1116
- "aria-labelledby": tabId,
1117
- id: id,
1118
- className: className,
1119
- ref: forwardRef,
1120
- role: "tabpanel",
1121
- hidden: selectedIndex !== index
1122
- }), children);
725
+ const TabPanel = react.default.forwardRef(({ children, className: customClassName, ...rest }, forwardRef) => {
726
+ const prefix = require_usePrefix.usePrefix();
727
+ const { selectedIndex, baseId } = react.default.useContext(TabsContext);
728
+ const index = react.default.useContext(TabPanelContext);
729
+ const id = `${baseId}-tabpanel-${index}`;
730
+ const tabId = `${baseId}-tab-${index}`;
731
+ const className = (0, classnames.default)(`${prefix}--tab-content`, customClassName);
732
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
733
+ ...rest,
734
+ "aria-labelledby": tabId,
735
+ id,
736
+ className,
737
+ ref: forwardRef,
738
+ role: "tabpanel",
739
+ hidden: selectedIndex !== index,
740
+ children
741
+ });
1123
742
  });
1124
743
  TabPanel.propTypes = {
1125
- /**
1126
- * Provide child elements to be rendered inside `TabPanel`.
1127
- */
1128
- children: PropTypes.node,
1129
- /**
1130
- * Specify an optional className to be added to TabPanel.
1131
- */
1132
- className: PropTypes.string
744
+ children: prop_types.default.node,
745
+ className: prop_types.default.string
1133
746
  };
1134
-
1135
- /**
1136
- * TabPanels
1137
- */
1138
-
1139
- function TabPanels({
1140
- children
1141
- }) {
1142
- const prefix = usePrefix.usePrefix();
1143
- const refs = React.useRef([]);
1144
- const hiddenStates = React.useRef([]);
1145
- useIsomorphicEffect.default(() => {
1146
- const tabContainer = refs.current[0]?.previousElementSibling;
1147
- const isVertical = tabContainer?.classList.contains(`${prefix}--tabs--vertical`);
1148
- const parentHasHeight = tabContainer?.parentElement?.style.height;
1149
-
1150
- // Should only apply same height to vertical Tab Panels without a given height
1151
- if (isVertical && !parentHasHeight) {
1152
- hiddenStates.current = refs.current.map(ref => ref?.hidden || false);
1153
-
1154
- // un-hide hidden Tab Panels to get heights
1155
- refs.current.forEach(ref => {
1156
- if (ref) {
1157
- ref.hidden = false;
1158
- }
1159
- });
1160
-
1161
- // set max height to TabList
1162
- const heights = refs.current.map(ref => ref?.offsetHeight || 0);
1163
- const max = Math.max(...heights);
1164
- if (tabContainer instanceof HTMLElement) {
1165
- tabContainer.style.height = max + 'px';
1166
- }
1167
-
1168
- // re-hide hidden Tab Panels
1169
- refs.current.forEach((ref, index) => {
1170
- if (ref) {
1171
- ref.hidden = hiddenStates.current[index];
1172
- }
1173
- });
1174
- }
1175
- });
1176
- return /*#__PURE__*/React.createElement(React.Fragment, null, React.Children.map(children, (child, index) => {
1177
- return ! /*#__PURE__*/React.isValidElement(child) ? null : /*#__PURE__*/React.createElement(TabPanelContext.Provider, {
1178
- value: index
1179
- }, /*#__PURE__*/React.cloneElement(child, {
1180
- ref: element => {
1181
- refs.current[index] = element;
1182
- }
1183
- }));
1184
- }));
747
+ function TabPanels({ children }) {
748
+ const prefix = require_usePrefix.usePrefix();
749
+ const refs = (0, react.useRef)([]);
750
+ const hiddenStates = (0, react.useRef)([]);
751
+ require_useIsomorphicEffect.default(() => {
752
+ const tabContainer = refs.current[0]?.previousElementSibling;
753
+ const isVertical = tabContainer?.classList.contains(`${prefix}--tabs--vertical`);
754
+ const parentHasHeight = tabContainer?.parentElement?.style.height;
755
+ if (isVertical && !parentHasHeight) {
756
+ hiddenStates.current = refs.current.map((ref) => ref?.hidden || false);
757
+ refs.current.forEach((ref) => {
758
+ if (ref) ref.hidden = false;
759
+ });
760
+ const heights = refs.current.map((ref) => ref?.offsetHeight || 0);
761
+ const max = Math.max(...heights);
762
+ if (tabContainer instanceof HTMLElement) tabContainer.style.height = max + "px";
763
+ refs.current.forEach((ref, index) => {
764
+ if (ref) ref.hidden = hiddenStates.current[index];
765
+ });
766
+ }
767
+ });
768
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: react.Children.map(children, (child, index) => {
769
+ return !(0, react.isValidElement)(child) ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabPanelContext.Provider, {
770
+ value: index,
771
+ children: (0, react.cloneElement)(child, { ref: (element) => {
772
+ refs.current[index] = element;
773
+ } })
774
+ });
775
+ }) });
1185
776
  }
1186
- TabPanels.propTypes = {
1187
- /**
1188
- * Provide child elements to be rendered inside `TabPanels`.
1189
- */
1190
- children: PropTypes.node
1191
- };
777
+ TabPanels.propTypes = { children: prop_types.default.node };
1192
778
 
779
+ //#endregion
1193
780
  exports.IconTab = IconTab;
1194
781
  exports.Tab = Tab;
1195
782
  exports.TabList = TabList;
@@ -1197,4 +784,4 @@ exports.TabListVertical = TabListVertical;
1197
784
  exports.TabPanel = TabPanel;
1198
785
  exports.TabPanels = TabPanels;
1199
786
  exports.Tabs = Tabs;
1200
- exports.TabsVertical = TabsVertical;
787
+ exports.TabsVertical = TabsVertical;