@carbon/react 1.107.1 → 1.108.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 (75) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +960 -960
  2. package/es/components/Button/Button.d.ts +2 -2
  3. package/es/components/Button/ButtonBase.js +5 -5
  4. package/es/components/ChatButton/ChatButton.d.ts +1 -1
  5. package/es/components/ChatButton/ChatButton.js +1 -1
  6. package/es/components/ComposedModal/ComposedModal.js +10 -5
  7. package/es/components/ComposedModal/ModalFooter.d.ts +5 -0
  8. package/es/components/ComposedModal/ModalFooter.js +3 -1
  9. package/es/components/Dialog/Dialog.d.ts +5 -0
  10. package/es/components/Dialog/Dialog.js +3 -1
  11. package/es/components/ErrorBoundary/ErrorBoundaryContext.d.ts +1 -1
  12. package/es/components/ErrorBoundary/ErrorBoundaryContext.js +1 -1
  13. package/es/components/FileUploader/FileUploader.d.ts +5 -0
  14. package/es/components/FileUploader/FileUploader.js +14 -6
  15. package/es/components/FileUploader/FileUploaderItem.d.ts +5 -1
  16. package/es/components/FileUploader/FileUploaderItem.js +4 -2
  17. package/es/components/FileUploader/Filename.d.ts +5 -1
  18. package/es/components/FileUploader/Filename.js +2 -1
  19. package/es/components/Menu/MenuItem.js +16 -7
  20. package/es/components/Modal/Modal.d.ts +5 -0
  21. package/es/components/Modal/Modal.js +26 -13
  22. package/es/components/Modal/isTopmostVisibleModal.d.ts +7 -0
  23. package/es/components/Modal/isTopmostVisibleModal.js +21 -0
  24. package/es/components/MultiSelect/FilterableMultiSelect.js +9 -8
  25. package/es/components/MultiSelect/MultiSelect.js +9 -8
  26. package/es/components/MultiSelect/tools/isSelectAllItem.d.ts +9 -0
  27. package/es/components/MultiSelect/tools/isSelectAllItem.js +17 -0
  28. package/es/components/MultiSelect/tools/sorting.js +1 -1
  29. package/es/components/OverflowMenuItem/OverflowMenuItem.js +3 -2
  30. package/es/components/PageHeader/PageHeader.d.ts +4 -0
  31. package/es/components/PageHeader/PageHeader.js +18 -0
  32. package/es/components/PageHeader/index.d.ts +4 -0
  33. package/es/components/Tabs/Tabs.d.ts +5 -1
  34. package/es/components/Tabs/Tabs.js +2 -1
  35. package/es/components/UIShell/SwitcherDivider.d.ts +2 -2
  36. package/es/components/UIShell/SwitcherDivider.js +2 -2
  37. package/es/internal/warning.d.ts +1 -1
  38. package/lib/components/Button/Button.d.ts +2 -2
  39. package/lib/components/Button/ButtonBase.js +5 -5
  40. package/lib/components/ChatButton/ChatButton.d.ts +1 -1
  41. package/lib/components/ChatButton/ChatButton.js +1 -1
  42. package/lib/components/ComposedModal/ComposedModal.js +10 -5
  43. package/lib/components/ComposedModal/ModalFooter.d.ts +5 -0
  44. package/lib/components/ComposedModal/ModalFooter.js +3 -1
  45. package/lib/components/Dialog/Dialog.d.ts +5 -0
  46. package/lib/components/Dialog/Dialog.js +3 -1
  47. package/lib/components/ErrorBoundary/ErrorBoundaryContext.d.ts +1 -1
  48. package/lib/components/ErrorBoundary/ErrorBoundaryContext.js +1 -1
  49. package/lib/components/FileUploader/FileUploader.d.ts +5 -0
  50. package/lib/components/FileUploader/FileUploader.js +14 -6
  51. package/lib/components/FileUploader/FileUploaderItem.d.ts +5 -1
  52. package/lib/components/FileUploader/FileUploaderItem.js +4 -2
  53. package/lib/components/FileUploader/Filename.d.ts +5 -1
  54. package/lib/components/FileUploader/Filename.js +2 -1
  55. package/lib/components/Menu/MenuItem.js +15 -6
  56. package/lib/components/Modal/Modal.d.ts +5 -0
  57. package/lib/components/Modal/Modal.js +26 -13
  58. package/lib/components/Modal/isTopmostVisibleModal.d.ts +7 -0
  59. package/lib/components/Modal/isTopmostVisibleModal.js +21 -0
  60. package/lib/components/MultiSelect/FilterableMultiSelect.js +9 -8
  61. package/lib/components/MultiSelect/MultiSelect.js +9 -8
  62. package/lib/components/MultiSelect/tools/isSelectAllItem.d.ts +9 -0
  63. package/lib/components/MultiSelect/tools/isSelectAllItem.js +17 -0
  64. package/lib/components/MultiSelect/tools/sorting.js +3 -3
  65. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +3 -2
  66. package/lib/components/PageHeader/PageHeader.d.ts +4 -0
  67. package/lib/components/PageHeader/PageHeader.js +18 -0
  68. package/lib/components/PageHeader/index.d.ts +4 -0
  69. package/lib/components/Tabs/Tabs.d.ts +5 -1
  70. package/lib/components/Tabs/Tabs.js +2 -1
  71. package/lib/components/UIShell/SwitcherDivider.d.ts +2 -2
  72. package/lib/components/UIShell/SwitcherDivider.js +2 -2
  73. package/lib/internal/warning.d.ts +1 -1
  74. package/lib/internal/warning.js +1 -1
  75. package/package.json +10 -10
@@ -25,6 +25,7 @@ import ListBoxTrigger from "../ListBox/next/ListBoxTrigger.js";
25
25
  import { mergeRefs } from "../../tools/mergeRefs.js";
26
26
  import { defaultFilterItems } from "./filter.js";
27
27
  import { sortingPropTypes } from "./MultiSelectPropTypes.js";
28
+ import { isSelectAllItem } from "./tools/isSelectAllItem.js";
28
29
  import { defaultCompareItems, defaultSortItems } from "./tools/sorting.js";
29
30
  import { useSelection } from "../../internal/Selection.js";
30
31
  import classNames from "classnames";
@@ -60,8 +61,8 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
60
61
  itemToString,
61
62
  filterItems
62
63
  ]);
63
- const nonSelectAllItems = useMemo(() => filteredItems.filter((item) => !item.isSelectAll), [filteredItems]);
64
- const selectAll = filteredItems.some((item) => item.isSelectAll);
64
+ const nonSelectAllItems = useMemo(() => filteredItems.filter((item) => !isSelectAllItem(item)), [filteredItems]);
65
+ const selectAll = filteredItems.some(isSelectAllItem);
65
66
  const { selectedItems: controlledSelectedItems, onItemChange, clearSelection, toggleAll } = useSelection({
66
67
  disabled,
67
68
  initialSelectedItems,
@@ -129,7 +130,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
129
130
  setIsOpen(open);
130
131
  }, [open]);
131
132
  const sortedItems = useMemo(() => {
132
- const selectAllItem = items.find((item) => item.isSelectAll);
133
+ const selectAllItem = items.find(isSelectAllItem);
133
134
  const selectableRealItems = nonSelectAllItems.filter((item) => !item.disabled);
134
135
  const sortedReal = sortItems(nonSelectAllItems, {
135
136
  selectedItems: {
@@ -265,7 +266,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
265
266
  switch (type) {
266
267
  case InputKeyDownEnter:
267
268
  if (sortedItems.length === 0) return changes;
268
- if (changes.selectedItem && changes.selectedItem.disabled !== true) if (changes.selectedItem.isSelectAll) handleSelectAllClick();
269
+ if (changes.selectedItem && changes.selectedItem.disabled !== true) if (isSelectAllItem(changes.selectedItem)) handleSelectAllClick();
269
270
  else onItemChange(changes.selectedItem);
270
271
  setHighlightedIndex(changes.selectedItem);
271
272
  return {
@@ -273,7 +274,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
273
274
  highlightedIndex: state.highlightedIndex
274
275
  };
275
276
  case ItemClick:
276
- if (changes.selectedItem.isSelectAll) handleSelectAllClick();
277
+ if (isSelectAllItem(changes.selectedItem)) handleSelectAllClick();
277
278
  else onItemChange(changes.selectedItem);
278
279
  setHighlightedIndex(changes.selectedItem);
279
280
  return changes;
@@ -371,7 +372,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
371
372
  const candidate = slug ?? decorator;
372
373
  const candidateIsAILabel = isComponentElement(candidate, AILabel);
373
374
  const normalizedDecorator = candidateIsAILabel ? cloneElement(candidate, { size: "mini" }) : candidate;
374
- const selectedItemsLength = controlledSelectedItems.filter((item) => !item.isSelectAll).length;
375
+ const selectedItemsLength = controlledSelectedItems.filter((item) => !isSelectAllItem(item)).length;
375
376
  const className = classNames(`${prefix}--multi-select`, `${prefix}--combo-box`, `${prefix}--multi-select--filterable`, {
376
377
  [`${prefix}--multi-select--invalid`]: normalizedProps.invalid,
377
378
  [`${prefix}--multi-select--invalid--focused`]: inputFocused && normalizedProps.invalid,
@@ -528,7 +529,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
528
529
  children: isOpen ? sortedItems.map((item, index) => {
529
530
  let isChecked;
530
531
  let isIndeterminate = false;
531
- if (item.isSelectAll) {
532
+ if (isSelectAllItem(item)) {
532
533
  isChecked = selectAllStatus.checked;
533
534
  isIndeterminate = selectAllStatus.indeterminate;
534
535
  } else isChecked = controlledSelectedItems.filter((selected) => isEqual(selected, item)).length > 0;
@@ -542,7 +543,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
542
543
  return /* @__PURE__ */ jsx(ListBox.MenuItem, {
543
544
  "aria-label": itemText,
544
545
  "aria-checked": isIndeterminate ? "mixed" : isChecked,
545
- isActive: isChecked && !item["isSelectAll"],
546
+ isActive: isChecked && !isSelectAllItem(item),
546
547
  isHighlighted: highlightedIndex === index,
547
548
  title: itemText,
548
549
  disabled,
@@ -23,6 +23,7 @@ import { FormContext } from "../FluidForm/FormContext.js";
23
23
  import ListBox from "../ListBox/index.js";
24
24
  import { mergeRefs } from "../../tools/mergeRefs.js";
25
25
  import { sortingPropTypes } from "./MultiSelectPropTypes.js";
26
+ import { isSelectAllItem } from "./tools/isSelectAllItem.js";
26
27
  import { defaultCompareItems, defaultSortItems } from "./tools/sorting.js";
27
28
  import { useSelection } from "../../internal/Selection.js";
28
29
  import classNames from "classnames";
@@ -50,7 +51,7 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
50
51
  return true;
51
52
  });
52
53
  }, [items]);
53
- const selectAll = filteredItems.some((item) => item.isSelectAll);
54
+ const selectAll = filteredItems.some(isSelectAllItem);
54
55
  const prefix = usePrefix();
55
56
  const { isFluid } = useContext(FormContext);
56
57
  const multiSelectInstanceId = useId();
@@ -280,7 +281,7 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
280
281
  const candidate = slug ?? decorator;
281
282
  const normalizedDecorator = isComponentElement(candidate, AILabel) ? cloneElement(candidate, { size: "mini" }) : candidate;
282
283
  const itemsSelectedText = selectedItems.length > 0 && selectedItems.map((item) => item?.text);
283
- const selectedItemsLength = selectAll ? selectedItems.filter((item) => !item.isSelectAll).length : selectedItems.length;
284
+ const selectedItemsLength = selectAll ? selectedItems.filter((item) => !isSelectAllItem(item)).length : selectedItems.length;
284
285
  const menuProps = useMemo(() => getMenuProps({
285
286
  ref: enableFloatingStyles ? refs.setFloating : null,
286
287
  hidden: !isOpen
@@ -294,9 +295,9 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
294
295
  const labelProps = isValidElement(titleText) ? { id: allLabelProps.id } : allLabelProps;
295
296
  const getSelectionStats = useCallback((selectedItems, filteredItems) => {
296
297
  return {
297
- hasIndividualSelections: selectedItems.some((selected) => !selected.isSelectAll),
298
- nonSelectAllSelectedCount: selectedItems.filter((selected) => !selected.isSelectAll).length,
299
- totalSelectableCount: filteredItems.filter((item) => !item.isSelectAll && !item.disabled).length
298
+ hasIndividualSelections: selectedItems.some((selected) => !isSelectAllItem(selected)),
299
+ nonSelectAllSelectedCount: selectedItems.filter((selected) => !isSelectAllItem(selected)).length,
300
+ totalSelectableCount: filteredItems.filter((item) => !isSelectAllItem(item) && !item.disabled).length
300
301
  };
301
302
  }, [selectedItems, filteredItems]);
302
303
  return /* @__PURE__ */ jsxs("div", {
@@ -372,15 +373,15 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
372
373
  ...menuProps,
373
374
  children: isOpen && sortItems(filteredItems, sortOptions).map((item, index) => {
374
375
  const { hasIndividualSelections, nonSelectAllSelectedCount, totalSelectableCount } = getSelectionStats(selectedItems, filteredItems);
375
- const isChecked = item.isSelectAll ? nonSelectAllSelectedCount === totalSelectableCount && totalSelectableCount > 0 : selectedItems.some((selected) => isEqual(selected, item));
376
- const isIndeterminate = item.isSelectAll && hasIndividualSelections && nonSelectAllSelectedCount < totalSelectableCount;
376
+ const isChecked = isSelectAllItem(item) ? nonSelectAllSelectedCount === totalSelectableCount && totalSelectableCount > 0 : selectedItems.some((selected) => isEqual(selected, item));
377
+ const isIndeterminate = isSelectAllItem(item) && hasIndividualSelections && nonSelectAllSelectedCount < totalSelectableCount;
377
378
  const itemProps = getItemProps({
378
379
  item,
379
380
  ["aria-selected"]: isChecked
380
381
  });
381
382
  const itemText = itemToString(item);
382
383
  return /* @__PURE__ */ jsx(ListBox.MenuItem, {
383
- isActive: isChecked && !item["isSelectAll"],
384
+ isActive: isChecked && !isSelectAllItem(item),
384
385
  "aria-label": itemText,
385
386
  "aria-checked": isIndeterminate ? "mixed" : isChecked,
386
387
  isHighlighted: highlightedIndex === index,
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright IBM Corp. 2026
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ export declare const isSelectAllItem: (item: unknown) => item is {
8
+ isSelectAll?: boolean;
9
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright IBM Corp. 2016, 2026
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ //#region src/components/MultiSelect/tools/isSelectAllItem.ts
9
+ /**
10
+ * Copyright IBM Corp. 2026
11
+ *
12
+ * This source code is licensed under the Apache-2.0 license found in the
13
+ * LICENSE file in the root directory of this source tree.
14
+ */
15
+ const isSelectAllItem = (item) => typeof item === "object" && item !== null && "isSelectAll" in item;
16
+ //#endregion
17
+ export { isSelectAllItem };
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
+ import { isSelectAllItem } from "./isSelectAllItem.js";
8
9
  //#region src/components/MultiSelect/tools/sorting.ts
9
- const isSelectAllItem = (item) => typeof item === "object" && item !== null && "isSelectAll" in item;
10
10
  /**
11
11
  * Use `localeCompare` with the `numeric` option enabled to sort two
12
12
  * alphanumeric strings.
@@ -23,7 +23,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
23
23
  * LICENSE file in the root directory of this source tree.
24
24
  */
25
25
  const OverflowMenuItem = forwardRef((props, ref) => {
26
- const { className, closeMenu, dangerDescription = "danger", disabled = false, handleOverflowMenuItemFocus, hasDivider = false, href, isDelete = false, index, itemText = "Provide itemText", onClick = () => {}, onKeyDown = () => {}, requireTitle, title, wrapperClassName, ...rest } = props;
26
+ const { className, closeMenu, dangerDescription = "", disabled = false, handleOverflowMenuItemFocus, hasDivider = false, href, isDelete = false, index, itemText = "Provide itemText", onClick = () => {}, onKeyDown = () => {}, requireTitle, title, wrapperClassName, ...rest } = props;
27
27
  const prefix = usePrefix();
28
28
  function setTabFocus(evt) {
29
29
  if (match(evt, ArrowDown)) handleOverflowMenuItemFocus?.({
@@ -47,13 +47,14 @@ const OverflowMenuItem = forwardRef((props, ref) => {
47
47
  [`${prefix}--overflow-menu-options__option--disabled`]: disabled
48
48
  }, wrapperClassName);
49
49
  const TagToUse = href ? "a" : "button";
50
+ const hasDangerDescription = isDelete && Boolean(dangerDescription);
50
51
  const assistiveId = useId("danger-description");
51
52
  const OverflowMenuItemContent = (() => {
52
53
  if (typeof itemText !== "string") return itemText;
53
54
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
54
55
  className: `${prefix}--overflow-menu-options__option-content`,
55
56
  children: itemText
56
- }), isDelete && /* @__PURE__ */ jsx("span", {
57
+ }), hasDangerDescription && /* @__PURE__ */ jsx("span", {
57
58
  id: assistiveId,
58
59
  className: `${prefix}--visually-hidden`,
59
60
  children: dangerDescription
@@ -4,6 +4,10 @@
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
+ /**
8
+ * @deprecated PageHeader has moved to Carbon for IBM Products.
9
+ * See https://github.com/carbon-design-system/carbon/issues/21926
10
+ */
7
11
  import React, { type ElementType } from 'react';
8
12
  import PropTypes from 'prop-types';
9
13
  import { TYPES } from '../Tag/Tag';
@@ -13,6 +13,7 @@ import AspectRatio from "../AspectRatio/AspectRatio.js";
13
13
  import { Popover, PopoverContent } from "../Popover/index.js";
14
14
  import { DefinitionTooltip } from "../Tooltip/DefinitionTooltip.js";
15
15
  import { MenuItem } from "../Menu/MenuItem.js";
16
+ import { deprecateComponent } from "../../prop-types/deprecateComponent.js";
16
17
  import { GridAsGridComponent } from "../Grid/Grid.js";
17
18
  import Column from "../Grid/Column.js";
18
19
  import { MenuButton } from "../MenuButton/index.js";
@@ -33,7 +34,18 @@ import { breakpoints } from "@carbon/layout";
33
34
  * This source code is licensed under the Apache-2.0 license found in the
34
35
  * LICENSE file in the root directory of this source tree.
35
36
  */
37
+ /**
38
+ * @deprecated PageHeader has moved to Carbon for IBM Products.
39
+ * See https://github.com/carbon-design-system/carbon/issues/21926
40
+ */
41
+ const pageHeaderDeprecationMessage = (componentName) => `The \`${componentName}\` component in \`@carbon/react\` has been deprecated and moved to \`@carbon/ibm-products\`. See https://github.com/carbon-design-system/carbon/issues/21926`;
42
+ const usePageHeaderDeprecation = (componentName) => {
43
+ useEffect(() => {
44
+ deprecateComponent(componentName, pageHeaderDeprecationMessage(componentName));
45
+ }, [componentName]);
46
+ };
36
47
  const PageHeader = React.forwardRef(({ className, children, ...other }, ref) => {
48
+ usePageHeaderDeprecation("PageHeader");
37
49
  return /* @__PURE__ */ jsx("div", {
38
50
  className: classNames({ [`${usePrefix()}--page-header`]: true }, className),
39
51
  ref,
@@ -43,6 +55,7 @@ const PageHeader = React.forwardRef(({ className, children, ...other }, ref) =>
43
55
  });
44
56
  PageHeader.displayName = "PageHeader";
45
57
  const PageHeaderBreadcrumbBar = React.forwardRef(({ border = true, className, children, renderIcon: IconElement, contentActions, contentActionsFlush, pageActions, pageActionsFlush, ...other }, ref) => {
58
+ usePageHeaderDeprecation("PageHeaderBreadcrumbBar");
46
59
  const prefix = usePrefix();
47
60
  const classNames$1 = classNames({
48
61
  [`${prefix}--page-header__breadcrumb-bar`]: true,
@@ -79,6 +92,7 @@ const PageHeaderBreadcrumbBar = React.forwardRef(({ border = true, className, ch
79
92
  });
80
93
  PageHeaderBreadcrumbBar.displayName = "PageHeaderBreadcrumbBar";
81
94
  const PageHeaderContent = React.forwardRef(({ className, children, title, renderIcon: IconElement, contextualActions, pageActions, ...other }, ref) => {
95
+ usePageHeaderDeprecation("PageHeaderContent");
82
96
  const prefix = usePrefix();
83
97
  const classNames$2 = classNames({ [`${prefix}--page-header__content`]: true }, className);
84
98
  const titleRef = useRef(null);
@@ -141,6 +155,7 @@ PageHeaderContent.propTypes = {
141
155
  pageActions: PropTypes.node
142
156
  };
143
157
  const PageHeaderContentPageActions = ({ className, children, menuButtonLabel = "Actions", actions, ...other }) => {
158
+ usePageHeaderDeprecation("PageHeaderContentPageActions");
144
159
  const classNames$3 = classNames({ [`${usePrefix()}--page-header__content__page-actions`]: true }, className);
145
160
  const containerRef = useRef(null);
146
161
  const offsetRef = useRef(null);
@@ -194,6 +209,7 @@ PageHeaderContentPageActions.propTypes = {
194
209
  actions: PropTypes.oneOfType([PropTypes.node, PropTypes.array])
195
210
  };
196
211
  const PageHeaderContentText = ({ className, children, subtitle, ...other }) => {
212
+ usePageHeaderDeprecation("PageHeaderContentText");
197
213
  const prefix = usePrefix();
198
214
  return /* @__PURE__ */ jsxs("div", {
199
215
  className: classNames({ [`${prefix}--page-header__content__body`]: true }, className),
@@ -212,6 +228,7 @@ PageHeaderContentText.propTypes = {
212
228
  subtitle: PropTypes.string
213
229
  };
214
230
  const PageHeaderHeroImage = ({ className, children, ...other }) => {
231
+ usePageHeaderDeprecation("PageHeaderHeroImage");
215
232
  const classNames$4 = classNames({ [`${usePrefix()}--page-header__hero-image`]: true }, className);
216
233
  const isLg = useMatchMedia(`(min-width: ${breakpoints.lg.width})`);
217
234
  return /* @__PURE__ */ jsx(AspectRatio, {
@@ -227,6 +244,7 @@ PageHeaderHeroImage.propTypes = {
227
244
  className: PropTypes.string
228
245
  };
229
246
  const PageHeaderTabBar = React.forwardRef(({ className, children, tags = [], ...other }, ref) => {
247
+ usePageHeaderDeprecation("PageHeaderTabBar");
230
248
  const prefix = usePrefix();
231
249
  const classNames$5 = classNames({ [`${prefix}--page-header__tab-bar`]: true }, className);
232
250
  const [openPopover, setOpenPopover] = useState(false);
@@ -4,5 +4,9 @@
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
+ /**
8
+ * @deprecated PageHeader has moved to Carbon for IBM Products.
9
+ * See https://github.com/carbon-design-system/carbon/issues/21926
10
+ */
7
11
  export { PageHeader, PageHeaderBreadcrumbBar, PageHeaderContent, PageHeaderContentPageActions, PageHeaderContentText, PageHeaderTabBar, PageHeaderHeroImage, Root, BreadcrumbBar, Content, ContentPageActions, ContentText, TabBar, HeroImage, } from './PageHeader';
8
12
  export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderTabBarProps, PageHeaderHeroImageProps, } from './PageHeader';
@@ -192,8 +192,12 @@ export interface TabListProps extends DivAttributes {
192
192
  * on component rerender
193
193
  */
194
194
  scrollIntoView?: boolean;
195
+ /**
196
+ * Specify the size of the tabs.
197
+ */
198
+ size?: 'sm' | 'md' | 'lg';
195
199
  }
196
- declare function TabList({ activation, 'aria-label': label, children, className: customClassName, contained, fullWidth, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait, scrollIntoView, ...rest }: TabListProps): import("react/jsx-runtime").JSX.Element;
200
+ declare function TabList({ activation, 'aria-label': label, children, className: customClassName, contained, fullWidth, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait, scrollIntoView, size, ...rest }: TabListProps): import("react/jsx-runtime").JSX.Element;
197
201
  declare namespace TabList {
198
202
  var propTypes: {
199
203
  /**
@@ -144,7 +144,7 @@ function getNextIndexVertical(event, total, index) {
144
144
  default: return index;
145
145
  }
146
146
  }
147
- function TabList({ activation = "automatic", "aria-label": label, children, className: customClassName, contained = false, fullWidth = false, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait = 200, scrollIntoView, ...rest }) {
147
+ function TabList({ activation = "automatic", "aria-label": label, children, className: customClassName, contained = false, fullWidth = false, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait = 200, scrollIntoView, size, ...rest }) {
148
148
  const { activeIndex, selectedIndex, setSelectedIndex, setActiveIndex, dismissable } = React.useContext(TabsContext);
149
149
  const prefix = usePrefix();
150
150
  const ref = useRef(null);
@@ -161,6 +161,7 @@ function TabList({ activation = "automatic", "aria-label": label, children, clas
161
161
  [`${prefix}--tabs__icon--default`]: iconSize === "default",
162
162
  [`${prefix}--tabs__icon--lg`]: iconSize === "lg",
163
163
  [`${prefix}--layout--size-lg`]: iconSize === "lg",
164
+ [`${prefix}--layout--size-${size}`]: size && contained && !hasSecondaryLabelTabs,
164
165
  [`${prefix}--tabs--tall`]: hasSecondaryLabelTabs,
165
166
  [`${prefix}--tabs--full-width`]: distributeWidth,
166
167
  [`${prefix}--tabs--dismissable`]: dismissable
@@ -7,7 +7,7 @@
7
7
  import PropTypes from 'prop-types';
8
8
  export interface SwitcherDividerProps {
9
9
  /**
10
- * Optionally provide a custom class to apply to the underlying `<li>` node
10
+ * Optionally provide a custom class to apply to the underlying `<hr>` node
11
11
  */
12
12
  className?: string;
13
13
  }
@@ -15,7 +15,7 @@ declare const SwitcherDivider: {
15
15
  ({ className: customClassName, ...other }: SwitcherDividerProps): import("react/jsx-runtime").JSX.Element;
16
16
  propTypes: {
17
17
  /**
18
- * Optionally provide a custom class to apply to the underlying `<li>` node
18
+ * Optionally provide a custom class to apply to the underlying `<hr>` node
19
19
  */
20
20
  className: PropTypes.Requireable<string>;
21
21
  };
@@ -13,10 +13,10 @@ import { jsx } from "react/jsx-runtime";
13
13
  //#region src/components/UIShell/SwitcherDivider.tsx
14
14
  const SwitcherDivider = ({ className: customClassName, ...other }) => {
15
15
  const classNames$1 = classNames(`${usePrefix()}--switcher__item--divider`, { [customClassName || ""]: !!customClassName });
16
- return /* @__PURE__ */ jsx("hr", {
16
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("hr", {
17
17
  ...other,
18
18
  className: classNames$1
19
- });
19
+ }) });
20
20
  };
21
21
  SwitcherDivider.propTypes = { className: PropTypes.string };
22
22
  //#endregion
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2016, 2025
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.
@@ -4,7 +4,7 @@
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
- import React, { type ReactNode } from 'react';
7
+ import React from 'react';
8
8
  import { IconButtonKind } from '../IconButton';
9
9
  import { PolymorphicComponentPropWithRef } from '../../internal/PolymorphicProps';
10
10
  export declare const ButtonKinds: readonly ["primary", "secondary", "danger", "ghost", "danger--primary", "danger--ghost", "danger--tertiary", "tertiary"];
@@ -82,6 +82,6 @@ export interface ButtonBaseProps extends React.ButtonHTMLAttributes<HTMLButtonEl
82
82
  tooltipPosition?: ButtonTooltipPosition;
83
83
  }
84
84
  export type ButtonProps<T extends React.ElementType> = PolymorphicComponentPropWithRef<T, ButtonBaseProps>;
85
- export type ButtonComponent = <T extends React.ElementType = 'button'>(props: ButtonProps<T>) => ReactNode;
85
+ export type ButtonComponent = <T extends React.ElementType = 'button'>(props: ButtonProps<T>, context?: any) => React.ReactElement | any;
86
86
  declare const _default: ButtonComponent;
87
87
  export default _default;
@@ -20,7 +20,7 @@ let react_jsx_runtime = require("react/jsx-runtime");
20
20
  * This source code is licensed under the Apache-2.0 license found in the
21
21
  * LICENSE file in the root directory of this source tree.
22
22
  */
23
- const ButtonBase = react.default.forwardRef(function ButtonBase({ as, children, className, dangerDescription = "danger", disabled = false, hasIconOnly = false, href, iconDescription, isExpressive = false, isSelected, kind = "primary", onBlur, onClick, onFocus, onMouseEnter, onMouseLeave, renderIcon: ButtonImageElement, size, tabIndex, type = "button", ...rest }, ref) {
23
+ const ButtonBase = react.default.forwardRef(function ButtonBase({ as, children, className, dangerDescription = "", disabled = false, hasIconOnly = false, href, iconDescription, isExpressive = false, isSelected, kind = "primary", onBlur, onClick, onFocus, onMouseEnter, onMouseLeave, renderIcon: ButtonImageElement, size, tabIndex, type = "button", ...rest }, ref) {
24
24
  const prefix = require_usePrefix.usePrefix();
25
25
  const commonProps = {
26
26
  tabIndex,
@@ -46,23 +46,23 @@ const ButtonBase = react.default.forwardRef(function ButtonBase({ as, children,
46
46
  className: `${prefix}--btn__icon`,
47
47
  "aria-hidden": "true"
48
48
  });
49
- const dangerButtonVariants = [
49
+ const hasDangerDescription = [
50
50
  "danger",
51
51
  "danger--tertiary",
52
52
  "danger--ghost"
53
- ];
53
+ ].includes(kind) && Boolean(dangerDescription);
54
54
  let component = "button";
55
55
  const assistiveId = require_useId.useId("danger-description");
56
56
  const { "aria-pressed": ariaPressed, "aria-describedby": ariaDescribedBy } = rest;
57
57
  let otherProps = {
58
58
  disabled,
59
59
  type,
60
- "aria-describedby": dangerButtonVariants.includes(kind) ? assistiveId : ariaDescribedBy || void 0,
60
+ "aria-describedby": hasDangerDescription ? assistiveId : ariaDescribedBy || void 0,
61
61
  "aria-pressed": ariaPressed ?? (hasIconOnly && kind === "ghost" ? isSelected : void 0)
62
62
  };
63
63
  const anchorProps = { href };
64
64
  let assistiveText = null;
65
- if (dangerButtonVariants.includes(kind)) assistiveText = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
65
+ if (hasDangerDescription) assistiveText = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
66
66
  id: assistiveId,
67
67
  className: `${prefix}--visually-hidden`,
68
68
  children: dangerDescription
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2024, 2025
2
+ * Copyright IBM Corp. 2024, 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.
@@ -17,7 +17,7 @@ prop_types = require_runtime.__toESM(prop_types);
17
17
  let react_jsx_runtime = require("react/jsx-runtime");
18
18
  //#region src/components/ChatButton/ChatButton.tsx
19
19
  /**
20
- * Copyright IBM Corp. 2024, 2025
20
+ * Copyright IBM Corp. 2024, 2026
21
21
  *
22
22
  * This source code is licensed under the Apache-2.0 license found in the
23
23
  * LICENSE file in the root directory of this source tree.
@@ -27,6 +27,7 @@ const require_wrapFocus = require("../../internal/wrapFocus.js");
27
27
  const require_Dialog = require("../Dialog/Dialog.js");
28
28
  const require_useComposedModalState = require("./useComposedModalState.js");
29
29
  const require_ComposedModalPresence = require("./ComposedModalPresence.js");
30
+ const require_isTopmostVisibleModal = require("../Modal/isTopmostVisibleModal.js");
30
31
  let classnames = require("classnames");
31
32
  classnames = require_runtime.__toESM(classnames);
32
33
  let react = require("react");
@@ -102,9 +103,14 @@ const ComposedModalDialog = react.default.forwardRef(function ComposedModalDialo
102
103
  const button = (0, react.useRef)(null);
103
104
  const startSentinel = (0, react.useRef)(null);
104
105
  const endSentinel = (0, react.useRef)(null);
106
+ const modalRef = (0, react.useRef)(null);
105
107
  const onMouseDownTarget = (0, react.useRef)(null);
106
108
  const presenceContext = (0, react.useContext)(require_ComposedModalPresence.ComposedModalPresenceContext);
107
- const mergedRefs = (0, _floating_ui_react.useMergeRefs)([ref, presenceContext?.presenceRef]);
109
+ const mergedRefs = (0, _floating_ui_react.useMergeRefs)([
110
+ modalRef,
111
+ ref,
112
+ presenceContext?.presenceRef
113
+ ]);
108
114
  const enablePresence = require_index.useFeatureFlag("enable-presence") || presenceContext?.autoEnablePresence;
109
115
  const open = externalOpen || enablePresence;
110
116
  const modalState = require_useComposedModalState.useComposedModalState(open);
@@ -188,15 +194,14 @@ const ComposedModalDialog = react.default.forwardRef(function ComposedModalDialo
188
194
  (0, react.useEffect)(() => {
189
195
  if (!open) return;
190
196
  const handleEscapeKey = (event) => {
191
- if (require_match.match(event, require_keys.Escape)) {
197
+ if (require_match.match(event, require_keys.Escape) && require_isTopmostVisibleModal.isTopmostVisibleModal(modalRef.current, prefix)) {
192
198
  event.preventDefault();
193
- event.stopPropagation();
194
199
  closeModal(event);
195
200
  }
196
201
  };
197
- document.addEventListener("keydown", handleEscapeKey, true);
202
+ document.addEventListener("keydown", handleEscapeKey);
198
203
  return () => {
199
- document.removeEventListener("keydown", handleEscapeKey, true);
204
+ document.removeEventListener("keydown", handleEscapeKey);
200
205
  };
201
206
  }, [open]);
202
207
  (0, react.useEffect)(() => {
@@ -36,6 +36,11 @@ export interface ModalFooterProps {
36
36
  * Note that this prop is not applied if you render primary/danger button by yourself
37
37
  */
38
38
  danger?: boolean;
39
+ /**
40
+ * Specify the message read by screen readers for the danger primary button.
41
+ * Defaults to an empty string; provide localized text to opt in.
42
+ */
43
+ dangerDescription?: string;
39
44
  /**
40
45
  * The `ref` callback for the primary button.
41
46
  */
@@ -65,7 +65,7 @@ SecondaryButtonSet.propTypes = {
65
65
  },
66
66
  secondaryClassName: prop_types.default.string
67
67
  };
68
- const ModalFooter = react.default.forwardRef(function ModalFooter({ children, className: customClassName, closeModal = require_noopFn.noopFn, danger, inputref, onRequestClose = require_noopFn.noopFn, onRequestSubmit = require_noopFn.noopFn, primaryButtonDisabled, primaryButtonText, primaryClassName, secondaryButtonText, secondaryButtons, secondaryClassName, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, ...rest }, ref) {
68
+ const ModalFooter = react.default.forwardRef(function ModalFooter({ children, className: customClassName, closeModal = require_noopFn.noopFn, danger, dangerDescription = "", inputref, onRequestClose = require_noopFn.noopFn, onRequestSubmit = require_noopFn.noopFn, primaryButtonDisabled, primaryButtonText, primaryClassName, secondaryButtonText, secondaryButtons, secondaryClassName, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, ...rest }, ref) {
69
69
  const prefix = require_usePrefix.usePrefix();
70
70
  const footerClass = (0, classnames.default)(`${prefix}--modal-footer`, customClassName, Array.isArray(secondaryButtons) && secondaryButtons.length === 2 ? `${prefix}--modal-footer--three-button` : null);
71
71
  const primaryButtonClass = (0, classnames.default)(primaryClassName, loadingStatus !== "inactive" ? `${prefix}--btn--loading` : null);
@@ -89,6 +89,7 @@ const ModalFooter = react.default.forwardRef(function ModalFooter({ children, cl
89
89
  onClick: onRequestSubmit,
90
90
  className: primaryButtonClass,
91
91
  disabled: loadingActive || primaryButtonDisabled,
92
+ dangerDescription,
92
93
  kind: danger ? "danger" : "primary",
93
94
  ref: inputref,
94
95
  children: loadingStatus === "inactive" ? primaryButtonText : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index$2.default, {
@@ -108,6 +109,7 @@ ModalFooter.propTypes = {
108
109
  className: prop_types.default.string,
109
110
  closeModal: prop_types.default.func,
110
111
  danger: prop_types.default.bool,
112
+ dangerDescription: prop_types.default.string,
111
113
  inputref: prop_types.default.oneOfType([prop_types.default.func, prop_types.default.shape({ current: prop_types.default.any })]),
112
114
  loadingDescription: prop_types.default.string,
113
115
  loadingIconDescription: prop_types.default.string,
@@ -232,6 +232,11 @@ interface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {
232
232
  * Specify whether the Dialog is for dangerous actions
233
233
  */
234
234
  danger?: boolean;
235
+ /**
236
+ * Specify the message read by screen readers for the danger primary button.
237
+ * Defaults to an empty string; provide localized text to opt in.
238
+ */
239
+ dangerDescription?: string;
235
240
  /**
236
241
  * Specify loading status
237
242
  */
@@ -252,7 +252,7 @@ DialogBody.propTypes = {
252
252
  className: prop_types.default.string,
253
253
  hasScrollingContent: prop_types.default.bool
254
254
  };
255
- const DialogFooter = react.default.forwardRef(({ children, className, onRequestClose = require_noopFn.noopFn, onSecondarySubmit, onRequestSubmit = require_noopFn.noopFn, primaryButtonText = "Save", primaryButtonDisabled = false, secondaryButtonText = "Cancel", secondaryButtons, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, danger = false, ...rest }, ref) => {
255
+ const DialogFooter = react.default.forwardRef(({ children, className, onRequestClose = require_noopFn.noopFn, onSecondarySubmit, onRequestSubmit = require_noopFn.noopFn, primaryButtonText = "Save", primaryButtonDisabled = false, secondaryButtonText = "Cancel", secondaryButtons, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, danger = false, dangerDescription = "", ...rest }, ref) => {
256
256
  const prefix = require_usePrefix.usePrefix();
257
257
  const button = (0, react.useRef)(null);
258
258
  const { isOpen } = (0, react.useContext)(DialogContext);
@@ -300,6 +300,7 @@ const DialogFooter = react.default.forwardRef(({ children, className, onRequestC
300
300
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index$1.default, {
301
301
  className: primaryButtonClass,
302
302
  kind: danger ? "danger" : "primary",
303
+ dangerDescription,
303
304
  disabled: loadingActive || primaryButtonDisabled,
304
305
  onClick: onRequestSubmit,
305
306
  ref: button,
@@ -337,6 +338,7 @@ DialogFooter.propTypes = {
337
338
  return null;
338
339
  },
339
340
  danger: prop_types.default.bool,
341
+ dangerDescription: prop_types.default.string,
340
342
  loadingStatus: prop_types.default.oneOf([
341
343
  "inactive",
342
344
  "active",
@@ -1,5 +1,5 @@
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.
@@ -8,7 +8,7 @@
8
8
  require("../../_virtual/_rolldown/runtime.js");
9
9
  //#region src/components/ErrorBoundary/ErrorBoundaryContext.ts
10
10
  /**
11
- * Copyright IBM Corp. 2016, 2023
11
+ * Copyright IBM Corp. 2016, 2026
12
12
  *
13
13
  * This source code is licensed under the Apache-2.0 license found in the
14
14
  * LICENSE file in the root directory of this source tree.
@@ -11,6 +11,7 @@ interface FileItem {
11
11
  file: File & {
12
12
  invalidFileType?: boolean;
13
13
  };
14
+ disabled?: boolean;
14
15
  }
15
16
  export interface FileChangeData {
16
17
  addedFiles: FileItem[];
@@ -113,6 +114,10 @@ export interface FileUploaderHandle {
113
114
  * Get current files (only available when 'enable-enhanced-file-uploader' feature flag is enabled)
114
115
  */
115
116
  getCurrentFiles?: () => FileItem[];
117
+ /**
118
+ * Set current files (only available when 'enable-enhanced-file-uploader' feature flag is enabled)
119
+ */
120
+ setCurrentFiles?: (files: FileItem[]) => void;
116
121
  }
117
122
  declare const FileUploader: {
118
123
  (props: FileUploaderProps): React.ReactElement;