@carbon/react 1.101.0 → 1.102.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 (174) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +987 -952
  2. package/es/components/Accordion/AccordionItem.js +8 -6
  3. package/es/components/CheckboxGroup/CheckboxGroup.d.ts +1 -1
  4. package/es/components/CheckboxGroup/CheckboxGroup.js +2 -2
  5. package/es/components/ComboBox/ComboBox.js +3 -4
  6. package/es/components/ComposedModal/ComposedModal.js +0 -1
  7. package/es/components/ContainedList/ContainedList.d.ts +1 -1
  8. package/es/components/ContainedList/ContainedList.js +9 -34
  9. package/es/components/ContentSwitcher/ContentSwitcher.d.ts +3 -3
  10. package/es/components/ContentSwitcher/ContentSwitcher.js +4 -4
  11. package/es/components/DataTable/DataTable.d.ts +6 -2
  12. package/es/components/DataTable/DataTable.js +3 -1
  13. package/es/components/DataTable/Table.js +1 -1
  14. package/es/components/DataTable/TableExpandRow.js +2 -2
  15. package/es/components/DataTable/TableToolbarSearch.d.ts +11 -2
  16. package/es/components/DataTable/TableToolbarSearch.js +10 -3
  17. package/es/components/DataTable/stories/examples/TableToolbarFilter.d.ts +3 -0
  18. package/es/components/DataTable/tools/normalize.js +2 -1
  19. package/es/components/DataTableSkeleton/DataTableSkeleton.d.ts +2 -12
  20. package/es/components/DataTableSkeleton/DataTableSkeleton.js +1 -8
  21. package/es/components/DatePicker/DatePicker.js +7 -3
  22. package/es/components/DatePickerInput/DatePickerInput.d.ts +2 -5
  23. package/es/components/DatePickerInput/DatePickerInput.js +2 -13
  24. package/es/components/Dropdown/Dropdown.js +2 -3
  25. package/es/components/ExpandableSearch/ExpandableSearch.js +2 -1
  26. package/es/components/ExpandableSearch/index.js +12 -0
  27. package/es/components/FluidSelect/FluidSelect.d.ts +3 -3
  28. package/es/components/FluidTextArea/FluidTextArea.d.ts +2 -4
  29. package/es/components/FluidTextArea/FluidTextArea.js +1 -2
  30. package/es/components/FluidTimePickerSelect/FluidTimePickerSelect.d.ts +3 -3
  31. package/es/components/Grid/Column.d.ts +1 -1
  32. package/es/components/Grid/Column.js +2 -2
  33. package/es/components/Loading/Loading.d.ts +1 -1
  34. package/es/components/Loading/Loading.js +3 -1
  35. package/es/components/Menu/Menu.d.ts +1 -1
  36. package/es/components/Menu/Menu.js +6 -2
  37. package/es/components/Menu/MenuItem.js +2 -2
  38. package/es/components/Modal/Modal.js +0 -1
  39. package/es/components/MultiSelect/FilterableMultiSelect.js +4 -3
  40. package/es/components/MultiSelect/MultiSelect.js +5 -8
  41. package/es/components/MultiSelect/MultiSelectPropTypes.d.ts +6 -8
  42. package/es/components/MultiSelect/tools/sorting.d.ts +16 -9
  43. package/es/components/MultiSelect/tools/sorting.js +10 -14
  44. package/es/components/OverflowMenu/OverflowMenu.js +1 -0
  45. package/es/components/OverflowMenuItem/OverflowMenuItem.d.ts +5 -1
  46. package/es/components/OverflowMenuItem/OverflowMenuItem.js +12 -2
  47. package/es/components/Popover/index.js +3 -3
  48. package/es/components/ProgressIndicator/ProgressIndicator.js +3 -3
  49. package/es/components/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  50. package/es/components/RadioButtonGroup/RadioButtonGroup.js +8 -11
  51. package/es/components/Search/Search.js +3 -2
  52. package/es/components/Search/utils.d.ts +7 -0
  53. package/es/components/Search/utils.js +10 -0
  54. package/es/components/Select/Select.d.ts +2 -2
  55. package/es/components/Select/Select.js +1 -1
  56. package/es/components/SelectItem/SelectItem.d.ts +3 -3
  57. package/es/components/Slider/Slider.d.ts +1 -1
  58. package/es/components/Slider/Slider.js +2 -8
  59. package/es/components/StructuredList/StructuredList.js +2 -2
  60. package/es/components/Tabs/Tabs.js +9 -4
  61. package/es/components/Tag/DismissibleTag.d.ts +1 -1
  62. package/es/components/Tag/DismissibleTag.js +2 -2
  63. package/es/components/Tag/OperationalTag.d.ts +1 -1
  64. package/es/components/Tag/OperationalTag.js +2 -2
  65. package/es/components/Tag/SelectableTag.d.ts +1 -1
  66. package/es/components/Tag/SelectableTag.js +2 -2
  67. package/es/components/Tag/Tag.d.ts +1 -1
  68. package/es/components/Tag/Tag.js +2 -2
  69. package/es/components/TextArea/TextArea.d.ts +1 -2
  70. package/es/components/TextArea/TextArea.js +4 -5
  71. package/es/components/TextInput/ControlledPasswordInput.js +1 -1
  72. package/es/components/TileGroup/TileGroup.d.ts +1 -1
  73. package/es/components/TileGroup/TileGroup.js +2 -1
  74. package/es/components/TimePickerSelect/TimePickerSelect.d.ts +4 -4
  75. package/es/components/Toggletip/index.js +1 -2
  76. package/es/components/TreeView/TreeNode.js +2 -2
  77. package/es/components/TreeView/TreeView.d.ts +1 -1
  78. package/es/components/UIShell/HeaderPanel.d.ts +1 -1
  79. package/es/components/UIShell/HeaderPanel.js +7 -4
  80. package/es/components/UIShell/SideNav.js +3 -3
  81. package/es/components/UIShell/Switcher.d.ts +1 -1
  82. package/es/components/UIShell/Switcher.js +6 -5
  83. package/es/feature-flags.js +2 -2
  84. package/es/internal/FloatingMenu.js +3 -3
  85. package/es/internal/useOverflowItems.d.ts +1 -5
  86. package/es/internal/useOverflowItems.js +6 -27
  87. package/lib/components/Accordion/AccordionItem.js +7 -5
  88. package/lib/components/CheckboxGroup/CheckboxGroup.d.ts +1 -1
  89. package/lib/components/CheckboxGroup/CheckboxGroup.js +1 -1
  90. package/lib/components/ComboBox/ComboBox.js +3 -4
  91. package/lib/components/ComposedModal/ComposedModal.js +0 -1
  92. package/lib/components/ContainedList/ContainedList.d.ts +1 -1
  93. package/lib/components/ContainedList/ContainedList.js +9 -34
  94. package/lib/components/ContentSwitcher/ContentSwitcher.d.ts +3 -3
  95. package/lib/components/ContentSwitcher/ContentSwitcher.js +3 -3
  96. package/lib/components/DataTable/DataTable.d.ts +6 -2
  97. package/lib/components/DataTable/DataTable.js +3 -1
  98. package/lib/components/DataTable/Table.js +1 -1
  99. package/lib/components/DataTable/TableExpandRow.js +1 -1
  100. package/lib/components/DataTable/TableToolbarSearch.d.ts +11 -2
  101. package/lib/components/DataTable/TableToolbarSearch.js +10 -3
  102. package/lib/components/DataTable/stories/examples/TableToolbarFilter.d.ts +3 -0
  103. package/lib/components/DataTable/tools/normalize.js +2 -1
  104. package/lib/components/DataTableSkeleton/DataTableSkeleton.d.ts +2 -12
  105. package/lib/components/DataTableSkeleton/DataTableSkeleton.js +1 -8
  106. package/lib/components/DatePicker/DatePicker.js +7 -3
  107. package/lib/components/DatePickerInput/DatePickerInput.d.ts +2 -5
  108. package/lib/components/DatePickerInput/DatePickerInput.js +2 -13
  109. package/lib/components/Dropdown/Dropdown.js +2 -3
  110. package/lib/components/ExpandableSearch/ExpandableSearch.js +2 -1
  111. package/lib/components/ExpandableSearch/index.js +17 -0
  112. package/lib/components/FeatureFlags/index.js +5 -5
  113. package/lib/components/FluidSelect/FluidSelect.d.ts +3 -3
  114. package/lib/components/FluidTextArea/FluidTextArea.d.ts +2 -4
  115. package/lib/components/FluidTextArea/FluidTextArea.js +1 -2
  116. package/lib/components/FluidTimePickerSelect/FluidTimePickerSelect.d.ts +3 -3
  117. package/lib/components/Grid/Column.d.ts +1 -1
  118. package/lib/components/Grid/Column.js +2 -21
  119. package/lib/components/Loading/Loading.d.ts +1 -1
  120. package/lib/components/Loading/Loading.js +3 -1
  121. package/lib/components/Menu/Menu.d.ts +1 -1
  122. package/lib/components/Menu/Menu.js +6 -2
  123. package/lib/components/Menu/MenuItem.js +2 -2
  124. package/lib/components/Modal/Modal.js +0 -1
  125. package/lib/components/MultiSelect/FilterableMultiSelect.js +4 -3
  126. package/lib/components/MultiSelect/MultiSelect.js +5 -8
  127. package/lib/components/MultiSelect/MultiSelectPropTypes.d.ts +6 -8
  128. package/lib/components/MultiSelect/tools/sorting.d.ts +16 -9
  129. package/lib/components/MultiSelect/tools/sorting.js +10 -14
  130. package/lib/components/OverflowMenu/OverflowMenu.js +1 -0
  131. package/lib/components/OverflowMenuItem/OverflowMenuItem.d.ts +5 -1
  132. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +12 -2
  133. package/lib/components/Popover/index.js +3 -3
  134. package/lib/components/ProgressIndicator/ProgressIndicator.js +3 -3
  135. package/lib/components/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  136. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +7 -10
  137. package/lib/components/Search/Search.js +3 -2
  138. package/lib/components/Search/utils.d.ts +7 -0
  139. package/lib/components/Search/utils.js +12 -0
  140. package/lib/components/Select/Select.d.ts +2 -2
  141. package/lib/components/Select/Select.js +1 -1
  142. package/lib/components/SelectItem/SelectItem.d.ts +3 -3
  143. package/lib/components/Slider/Slider.d.ts +1 -1
  144. package/lib/components/Slider/Slider.js +2 -8
  145. package/lib/components/StructuredList/StructuredList.js +2 -2
  146. package/lib/components/Tabs/Tabs.js +9 -4
  147. package/lib/components/Tag/DismissibleTag.d.ts +1 -1
  148. package/lib/components/Tag/DismissibleTag.js +2 -2
  149. package/lib/components/Tag/OperationalTag.d.ts +1 -1
  150. package/lib/components/Tag/OperationalTag.js +2 -2
  151. package/lib/components/Tag/SelectableTag.d.ts +1 -1
  152. package/lib/components/Tag/SelectableTag.js +2 -2
  153. package/lib/components/Tag/Tag.d.ts +1 -1
  154. package/lib/components/Tag/Tag.js +2 -2
  155. package/lib/components/TextArea/TextArea.d.ts +1 -2
  156. package/lib/components/TextArea/TextArea.js +4 -5
  157. package/lib/components/TextInput/ControlledPasswordInput.js +1 -1
  158. package/lib/components/TileGroup/TileGroup.d.ts +1 -1
  159. package/lib/components/TileGroup/TileGroup.js +2 -1
  160. package/lib/components/TimePickerSelect/TimePickerSelect.d.ts +4 -4
  161. package/lib/components/Toggletip/index.js +1 -2
  162. package/lib/components/TreeView/TreeNode.js +2 -2
  163. package/lib/components/TreeView/TreeView.d.ts +1 -1
  164. package/lib/components/UIShell/HeaderPanel.d.ts +1 -1
  165. package/lib/components/UIShell/HeaderPanel.js +6 -3
  166. package/lib/components/UIShell/SideNav.js +3 -3
  167. package/lib/components/UIShell/Switcher.d.ts +1 -1
  168. package/lib/components/UIShell/Switcher.js +5 -4
  169. package/lib/feature-flags.js +2 -21
  170. package/lib/internal/FloatingMenu.js +3 -22
  171. package/lib/internal/useOverflowItems.d.ts +1 -5
  172. package/lib/internal/useOverflowItems.js +6 -27
  173. package/package.json +8 -8
  174. package/telemetry.yml +0 -1
@@ -162,7 +162,6 @@ const ModalDialog = /*#__PURE__*/React.forwardRef(function ModalDialog({
162
162
  const {
163
163
  target
164
164
  } = evt;
165
- evt.stopPropagation();
166
165
  const shouldCloseOnOutsideClick =
167
166
  // Passive modals can close on clicks outside the modal when
168
167
  // preventCloseOnClickOutside is undefined or explicitly set to false.
@@ -222,7 +222,6 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
222
222
  item => !item.disabled);
223
223
 
224
224
  // Sort only non-select-all items, select-all item must stay at the top
225
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452
226
225
  const sortedReal = sortItems(nonSelectAllItems, {
227
226
  selectedItems: {
228
227
  top: controlledSelectedItems,
@@ -315,6 +314,7 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
315
314
  React.useEffect(() => {
316
315
  const handleClickOutside = event => {
317
316
  const target = event.target;
317
+ if (!(target instanceof Node)) return;
318
318
  const wrapper = document.getElementById(id)?.closest(`.${prefix}--multi-select__wrapper`);
319
319
 
320
320
  // If click is outside our component and menu is open or input is focused
@@ -616,10 +616,11 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
616
616
 
617
617
  // Memoize the value of getMenuProps to avoid an infinite loop
618
618
  const menuProps = React.useMemo(() => getMenuProps({
619
- ref: autoAlign ? refs.setFloating : null
619
+ ref: autoAlign ? refs.setFloating : null,
620
+ hidden: !isOpen
620
621
  }, {
621
622
  suppressRefError: true
622
- }), [autoAlign, getMenuProps, refs.setFloating]);
623
+ }), [autoAlign, getMenuProps, isOpen, refs.setFloating]);
623
624
  const handleFocus = evt => {
624
625
  if (evt?.target.classList.contains(`${prefix}--tag__close-icon`) || evt?.target.classList.contains(`${prefix}--list-box__selection`)) {
625
626
  setIsFocused(false);
@@ -426,8 +426,9 @@ const MultiSelect = /*#__PURE__*/React.forwardRef(({
426
426
 
427
427
  // Memoize the value of getMenuProps to avoid an infinite loop
428
428
  const menuProps = React.useMemo(() => getMenuProps({
429
- ref: enableFloatingStyles ? refs.setFloating : null
430
- }), [enableFloatingStyles, getMenuProps, refs.setFloating]);
429
+ ref: enableFloatingStyles ? refs.setFloating : null,
430
+ hidden: !isOpen
431
+ }), [enableFloatingStyles, getMenuProps, isOpen, refs.setFloating]);
431
432
  const allLabelProps = getLabelProps();
432
433
  const labelProps = /*#__PURE__*/React.isValidElement(titleText) ? {
433
434
  id: allLabelProps.id
@@ -474,9 +475,7 @@ const MultiSelect = /*#__PURE__*/React.forwardRef(({
474
475
  }, selectedItems.length > 0 && /*#__PURE__*/React.createElement(index$2.default.Selection, {
475
476
  readOnly: readOnly,
476
477
  clearSelection: !disabled && !readOnly ? clearSelection : noopFn.noopFn,
477
- selectionCount: selectedItemsLength
478
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
479
- ,
478
+ selectionCount: selectedItemsLength,
480
479
  translateWithId: translateWithId,
481
480
  disabled: disabled
482
481
  }), /*#__PURE__*/React.createElement("button", _rollupPluginBabelHelpers.extends({
@@ -495,9 +494,7 @@ const MultiSelect = /*#__PURE__*/React.forwardRef(({
495
494
  translateWithId: translateWithId
496
495
  })), slug ? normalizedDecorator : decorator ? /*#__PURE__*/React.createElement("div", {
497
496
  className: `${prefix}--list-box__inner-wrapper--decorator`
498
- }, normalizedDecorator) : ''), /*#__PURE__*/React.createElement(index$2.default.Menu, menuProps, isOpen &&
499
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452
500
- sortItems(filteredItems, sortOptions).map((item, index) => {
497
+ }, normalizedDecorator) : ''), /*#__PURE__*/React.createElement(index$2.default.Menu, menuProps, isOpen && sortItems(filteredItems, sortOptions).map((item, index) => {
501
498
  const {
502
499
  hasIndividualSelections,
503
500
  nonSelectAllSelectedCount,
@@ -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.
@@ -34,17 +34,15 @@ export declare const sortingPropTypes: {
34
34
  */
35
35
  sortItems: PropTypes.Requireable<(...args: any[]) => any>;
36
36
  };
37
- interface DownshiftTypedProps<ItemType> {
38
- itemToString?(item: ItemType): string;
39
- }
40
37
  interface SharedOptions {
41
38
  locale: string;
42
39
  }
43
- interface CompareItems {
44
- (itemA: string, itemB: string, options: SharedOptions): number;
45
- }
46
- export interface SortItemsOptions<ItemType> extends SharedOptions, DownshiftTypedProps<ItemType> {
40
+ export type CompareItems = (itemA: string, itemB: string, options: {
41
+ locale: string;
42
+ }) => number;
43
+ export interface SortItemsOptions<ItemType> extends SharedOptions {
47
44
  compareItems: CompareItems;
45
+ itemToString: (item: ItemType) => string;
48
46
  selectedItems: ItemType[];
49
47
  }
50
48
  export interface MultiSelectSortingProps<ItemType> {
@@ -1,9 +1,16 @@
1
- export function defaultCompareItems(itemA: string, itemB: string, { locale }: {
2
- locale: string;
3
- }): number;
4
- export function defaultSortItems(items: any, { selectedItems, itemToString, compareItems, locale }: {
5
- selectedItems?: never[] | undefined;
6
- itemToString: any;
7
- compareItems: any;
8
- locale?: string | undefined;
9
- }): any;
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
+ import type { CompareItems, SortItemsOptions } from '../MultiSelectPropTypes';
8
+ /**
9
+ * Use `localeCompare` with the `numeric` option enabled to sort two
10
+ * alphanumeric strings.
11
+ */
12
+ export declare const defaultCompareItems: CompareItems;
13
+ /**
14
+ * Default sorting function for options in a selection control.
15
+ */
16
+ export declare const defaultSortItems: <T>(items: T[], { selectedItems, itemToString, compareItems, locale }: SortItemsOptions<T>) => T[];
@@ -7,16 +7,11 @@
7
7
 
8
8
  'use strict';
9
9
 
10
+ const isSelectAllItem = item => typeof item === 'object' && item !== null && 'isSelectAll' in item;
11
+
10
12
  /**
11
- * Use the locale `localeCompare` with the `numeric` option to sort two
12
- * alpha-numeric strings.
13
- *
14
- * @param {string} itemA - The first string to compare.
15
- * @param {string} itemB - The second string to compare.
16
- * @param {object} options - Options for comparing.
17
- * @param {string} options.locale - The locale to use for comparison.
18
- * @returns {number} A negative number if itemA comes before itemB, a positive
19
- * number if itemA comes after itemB, or 0 if they are equal.
13
+ * Use `localeCompare` with the `numeric` option enabled to sort two
14
+ * alphanumeric strings.
20
15
  */
21
16
  const defaultCompareItems = (itemA, itemB, {
22
17
  locale
@@ -25,18 +20,19 @@ const defaultCompareItems = (itemA, itemB, {
25
20
  });
26
21
 
27
22
  /**
28
- * Default sorting algorithm for options in a selection control
23
+ * Default sorting function for options in a selection control.
29
24
  */
30
25
  const defaultSortItems = (items, {
31
- selectedItems = [],
26
+ selectedItems,
32
27
  itemToString,
33
28
  compareItems,
34
- locale = 'en'
29
+ locale
35
30
  }) => {
31
+ // TODO: Should this util mutate items or should that be avoided?
36
32
  return items.sort((itemA, itemB) => {
37
33
  // Always place "select all" option at the beginning
38
- if (itemA.isSelectAll) return -1;
39
- if (itemB.isSelectAll) return 1;
34
+ if (isSelectAllItem(itemA) && itemA.isSelectAll) return -1;
35
+ if (isSelectAllItem(itemB) && itemB.isSelectAll) return 1;
40
36
  const hasItemA = selectedItems.includes(itemA);
41
37
  const hasItemB = selectedItems.includes(itemB);
42
38
  if (hasItemA && !hasItemB) return -1;
@@ -259,6 +259,7 @@ const OverflowMenu = /*#__PURE__*/React.forwardRef(({
259
259
  const focusinEventName = hasFocusin ? 'focusin' : 'focus';
260
260
  hFocusIn.current = on(menuBody.ownerDocument, focusinEventName, event => {
261
261
  const target = event.target;
262
+ if (!(target instanceof Element)) return;
262
263
  const triggerEl = triggerRef.current;
263
264
  if (typeof target.matches === 'function') {
264
265
  if (!menuBody.contains(target) && triggerEl && !target.matches(`.${prefix}--overflow-menu:first-child, .${prefix}--overflow-menu-options:first-child`)) {
@@ -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.
@@ -14,6 +14,10 @@ export interface OverflowMenuItemProps extends React.HTMLAttributes<HTMLElement>
14
14
  * A callback to tell the parent menu component that the menu should be closed.
15
15
  */
16
16
  closeMenu?: () => void;
17
+ /**
18
+ * Specify the message read by screen readers for the danger overflow menu item variant
19
+ */
20
+ dangerDescription?: string;
17
21
  /**
18
22
  * `true` to make this menu item disabled.
19
23
  */
@@ -19,12 +19,14 @@ var usePrefix = require('../../internal/usePrefix.js');
19
19
  var warning = require('../../internal/warning.js');
20
20
  var Text = require('../Text/Text.js');
21
21
  require('../Text/TextDirection.js');
22
+ var useId = require('../../internal/useId.js');
22
23
 
23
24
  const frFn = React.forwardRef;
24
25
  const OverflowMenuItem = frFn((props, ref) => {
25
26
  const {
26
27
  className,
27
28
  closeMenu,
29
+ dangerDescription = 'danger',
28
30
  disabled = false,
29
31
  handleOverflowMenuItemFocus,
30
32
  hasDivider = false,
@@ -68,13 +70,17 @@ const OverflowMenuItem = frFn((props, ref) => {
68
70
  [`${prefix}--overflow-menu-options__option--disabled`]: disabled
69
71
  }, wrapperClassName);
70
72
  const TagToUse = href ? 'a' : 'button';
73
+ const assistiveId = useId.useId('danger-description');
71
74
  const OverflowMenuItemContent = (() => {
72
75
  if (typeof itemText !== 'string') {
73
76
  return itemText;
74
77
  }
75
- return /*#__PURE__*/React.createElement("div", {
78
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
76
79
  className: `${prefix}--overflow-menu-options__option-content`
77
- }, itemText);
80
+ }, itemText), isDelete && /*#__PURE__*/React.createElement("span", {
81
+ id: assistiveId,
82
+ className: `${prefix}--visually-hidden`
83
+ }, dangerDescription));
78
84
  })();
79
85
  return /*#__PURE__*/React.createElement(Text.Text, {
80
86
  as: "li",
@@ -114,6 +120,10 @@ OverflowMenuItem.propTypes = {
114
120
  * A callback to tell the parent menu component that the menu should be closed.
115
121
  */
116
122
  closeMenu: PropTypes.func,
123
+ /**
124
+ * Specify the message read by screen readers for the danger overflow menu item variant
125
+ */
126
+ dangerDescription: PropTypes.string,
117
127
  /**
118
128
  * `true` to make this menu item disabled.
119
129
  */
@@ -162,7 +162,8 @@ forwardRef) {
162
162
  // Middleware order matters, arrow should be last
163
163
  middleware: [react.offset(!isTabTip ? {
164
164
  alignmentAxis: alignmentAxisOffset,
165
- mainAxis: popoverDimensions?.current?.offset
165
+ // Use 4px spacing when no caret, otherwise use the caret offset
166
+ mainAxis: caret ? popoverDimensions?.current?.offset : 4
166
167
  } : 0), autoAlign && react.flip({
167
168
  fallbackPlacements: isTabTip ? align.includes('bottom') ? ['bottom-start', 'bottom-end', 'top-start', 'top-end'] : ['top-start', 'top-end', 'bottom-start', 'bottom-end'] : align.includes('bottom') ? ['bottom', 'bottom-start', 'bottom-end', 'right', 'right-start', 'right-end', 'left', 'left-start', 'left-end', 'top', 'top-start', 'top-end'] : ['top', 'top-start', 'top-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end', 'bottom', 'bottom-start', 'bottom-end'],
168
169
  fallbackStrategy: 'initialPlacement',
@@ -299,10 +300,9 @@ forwardRef) {
299
300
  return item;
300
301
  }
301
302
  });
302
- const BaseComponentAsAny = BaseComponent;
303
303
  return /*#__PURE__*/React.createElement(PopoverContext.Provider, {
304
304
  value: value
305
- }, /*#__PURE__*/React.createElement(BaseComponentAsAny, _rollupPluginBabelHelpers.extends({}, rest, {
305
+ }, /*#__PURE__*/React.createElement(BaseComponent, _rollupPluginBabelHelpers.extends({}, rest, {
306
306
  className: className,
307
307
  ref: ref
308
308
  }), enableFloatingStyles || isTabTip ? mappedChildren : children));
@@ -182,7 +182,7 @@ function ProgressStep({
182
182
  }),
183
183
  disabled: disabled,
184
184
  "aria-disabled": disabled,
185
- tabIndex: !current && onClick && !disabled ? 0 : -1,
185
+ tabIndex: disabled ? -1 : 0,
186
186
  onClick: !current ? onClick : undefined,
187
187
  onKeyDown: handleKeyDown,
188
188
  title: label
@@ -195,10 +195,10 @@ function ProgressStep({
195
195
  }), /*#__PURE__*/React.createElement("div", {
196
196
  className: `${prefix}--progress-text`
197
197
  }, /*#__PURE__*/React.createElement(Text.Text, {
198
- as: "p",
198
+ as: "span",
199
199
  className: `${prefix}--progress-label`
200
200
  }, label), secondaryLabel !== null && secondaryLabel !== undefined ? /*#__PURE__*/React.createElement(Text.Text, {
201
- as: "p",
201
+ as: "span",
202
202
  className: `${prefix}--progress-optional`
203
203
  }, secondaryLabel) : null), /*#__PURE__*/React.createElement("span", {
204
204
  className: `${prefix}--assistive-text`
@@ -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.
@@ -47,17 +47,14 @@ const RadioButtonGroup = /*#__PURE__*/React.forwardRef((props, ref) => {
47
47
  } = props;
48
48
  const prefix = usePrefix.usePrefix();
49
49
  const [selected, setSelected] = React.useState(valueSelected ?? defaultSelected);
50
- const [prevValueSelected, setPrevValueSelected] = React.useState(valueSelected);
50
+ const prevValueSelected = React.useRef(valueSelected);
51
51
  const radioButtonGroupInstanceId = useId.useId();
52
-
53
- /**
54
- * prop + state alignment - getDerivedStateFromProps
55
- * only update if selected prop changes
56
- */
57
- if (valueSelected !== prevValueSelected) {
58
- setSelected(valueSelected);
59
- setPrevValueSelected(valueSelected);
60
- }
52
+ React.useEffect(() => {
53
+ if (valueSelected !== prevValueSelected.current) {
54
+ setSelected(valueSelected);
55
+ prevValueSelected.current = valueSelected;
56
+ }
57
+ }, [valueSelected]);
61
58
  function getRadioButtons() {
62
59
  const mappedChildren = React.Children.map(children, radioButton => {
63
60
  if (!radioButton) {
@@ -26,6 +26,7 @@ var FormContext = require('../FluidForm/FormContext.js');
26
26
  var noopFn = require('../../internal/noopFn.js');
27
27
  require('../Tooltip/DefinitionTooltip.js');
28
28
  var Tooltip = require('../Tooltip/Tooltip.js');
29
+ var utils = require('./utils.js');
29
30
 
30
31
  var _Close;
31
32
  const Search = /*#__PURE__*/React.forwardRef(({
@@ -51,7 +52,7 @@ const Search = /*#__PURE__*/React.forwardRef(({
51
52
  value,
52
53
  ...rest
53
54
  }, forwardRef) => {
54
- const hasPropValue = Boolean(value || defaultValue);
55
+ const hasPropValue = utils.isSearchValuePresent(value) || utils.isSearchValuePresent(defaultValue);
55
56
  const prefix = usePrefix.usePrefix();
56
57
  const {
57
58
  isFluid
@@ -78,7 +79,7 @@ const Search = /*#__PURE__*/React.forwardRef(({
78
79
  [`${prefix}--search-close--hidden`]: !hasContent || !isExpanded
79
80
  });
80
81
  if (value !== prevValue) {
81
- setHasContent(!!value);
82
+ setHasContent(utils.isSearchValuePresent(value));
82
83
  setPrevValue(value);
83
84
  }
84
85
  function clearInput() {
@@ -0,0 +1,7 @@
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 isSearchValuePresent: (value: string | number | undefined) => boolean;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright IBM Corp. 2016, 2023
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
+ 'use strict';
9
+
10
+ const isSearchValuePresent = value => value !== '' && typeof value !== 'undefined';
11
+
12
+ exports.isSearchValuePresent = isSearchValuePresent;
@@ -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 ChangeEventHandler, type ComponentPropsWithRef, type ReactNode } from 'react';
7
+ import React, { type ChangeEventHandler, type ComponentPropsWithRef, type ReactNode, type SelectHTMLAttributes } from 'react';
8
8
  type ExcludedAttributes = 'size';
9
9
  export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, ExcludedAttributes> {
10
10
  /**
@@ -22,7 +22,7 @@ export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, Exclu
22
22
  /**
23
23
  * Optionally provide the default value of the `<select>`
24
24
  */
25
- defaultValue?: any;
25
+ defaultValue?: SelectHTMLAttributes<HTMLSelectElement>['defaultValue'];
26
26
  /**
27
27
  * Specify whether the control is disabled
28
28
  */
@@ -38,7 +38,7 @@ const Select = /*#__PURE__*/React.forwardRef(({
38
38
  hideLabel = false,
39
39
  invalid = false,
40
40
  invalidText = '',
41
- helperText = '',
41
+ helperText,
42
42
  light = false,
43
43
  readOnly,
44
44
  size,
@@ -1,11 +1,11 @@
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
  import PropTypes from 'prop-types';
8
- import { HTMLAttributes } from 'react';
8
+ import { type HTMLAttributes, type OptionHTMLAttributes } from 'react';
9
9
  export interface SelectItemProps extends HTMLAttributes<HTMLOptionElement> {
10
10
  /**
11
11
  * Specify an optional className to be applied to the node
@@ -26,7 +26,7 @@ export interface SelectItemProps extends HTMLAttributes<HTMLOptionElement> {
26
26
  /**
27
27
  * Specify the value of the <SelectItem>
28
28
  */
29
- value: any;
29
+ value: OptionHTMLAttributes<HTMLOptionElement>['value'];
30
30
  }
31
31
  declare const SelectItem: {
32
32
  ({ className, value, disabled, hidden, text, ...other }: SelectItemProps): import("react/jsx-runtime").JSX.Element;
@@ -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.
@@ -998,14 +998,8 @@ const Slider = props => {
998
998
  delete other.onRelease;
999
999
  delete other.invalid;
1000
1000
  delete other.unstable_valueUpper;
1001
- const showWarning = normalizedProps.warn ||
1002
- // TODO: https://github.com/carbon-design-system/carbon/issues/18991#issuecomment-2795709637
1003
- // eslint-disable-next-line valid-typeof , no-constant-binary-expression -- https://github.com/carbon-design-system/carbon/issues/20452
1004
- typeof correctedValue !== null && correctedPosition === HandlePosition.LOWER && isValid;
1005
- const showWarningUpper = normalizedUpperProps.warn ||
1006
- // TODO: https://github.com/carbon-design-system/carbon/issues/18991#issuecomment-2795709637
1007
- // eslint-disable-next-line valid-typeof, no-constant-binary-expression -- https://github.com/carbon-design-system/carbon/issues/20452
1008
- typeof correctedValue !== null && correctedPosition === (twoHandles ? HandlePosition.UPPER : HandlePosition.LOWER) && (twoHandles ? isValidUpper : isValid);
1001
+ const showWarning = normalizedProps.warn || correctedPosition === HandlePosition.LOWER && isValid;
1002
+ const showWarningUpper = normalizedUpperProps.warn || correctedPosition === (twoHandles ? HandlePosition.UPPER : HandlePosition.LOWER) && (twoHandles ? isValidUpper : isValid);
1009
1003
  return /*#__PURE__*/React.createElement(usePrefix.PrefixContext.Consumer, null, prefix => {
1010
1004
  const labelId = `${id}-label`;
1011
1005
  const labelClasses = cx(`${prefix}--label`, {
@@ -152,8 +152,8 @@ function StructuredListRow(props) {
152
152
  ...other
153
153
  } = props;
154
154
  const [hasFocusWithin, setHasFocusWithin] = React.useState(false);
155
- // eslint-disable-next-line react-hooks/rules-of-hooks -- https://github.com/carbon-design-system/carbon/issues/20452
156
- const rowId = id ?? useId.useId('grid-input');
155
+ const generatedRowId = useId.useId('grid-input');
156
+ const rowId = id ?? generatedRowId;
157
157
  const selectedRow = React.useContext(GridSelectedRowStateContext);
158
158
  const setSelectedRow = React.useContext(GridSelectedRowDispatchContext);
159
159
  const prefix = usePrefix.usePrefix();
@@ -850,8 +850,8 @@ const Tab = /*#__PURE__*/React.forwardRef(({
850
850
  if (tabRef.current && tabRef.current.parentElement) {
851
851
  // determine number of tabs, excluding disabled
852
852
  const tabCount = Array.from(tabRef.current.parentElement.childNodes).filter(node => {
853
- const element = node;
854
- return element.classList.contains(`${prefix}--tabs__nav-link`) && !element.classList.contains(`${prefix}--tabs__nav-item--disabled`);
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
855
  }).length;
856
856
 
857
857
  // if not removing last tab focus on next tab
@@ -861,7 +861,10 @@ const Tab = /*#__PURE__*/React.forwardRef(({
861
861
  // if removing last tab focus on previous tab
862
862
  else {
863
863
  const prevTabIndex = (tabCount - 2) * 2;
864
- tabRef.current.parentElement.childNodes[prevTabIndex]?.focus();
864
+ const previousTab = tabRef.current.parentElement.childNodes[prevTabIndex];
865
+ if (previousTab instanceof HTMLElement) {
866
+ previousTab.focus();
867
+ }
865
868
  }
866
869
  }
867
870
  };
@@ -1162,7 +1165,9 @@ function TabPanels({
1162
1165
  // set max height to TabList
1163
1166
  const heights = refs.current.map(ref => ref?.offsetHeight || 0);
1164
1167
  const max = Math.max(...heights);
1165
- tabContainer.style.height = max + 'px';
1168
+ if (tabContainer instanceof HTMLElement) {
1169
+ tabContainer.style.height = max + 'px';
1170
+ }
1166
1171
 
1167
1172
  // re-hide hidden Tab Panels
1168
1173
  refs.current.forEach((ref, index) => {
@@ -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.
@@ -49,8 +49,8 @@ const DismissibleTag = /*#__PURE__*/React.forwardRef(({
49
49
  }, forwardRef) => {
50
50
  const prefix = usePrefix.usePrefix();
51
51
  const tagLabelRef = React.useRef(null);
52
- // eslint-disable-next-line react-hooks/rules-of-hooks -- https://github.com/carbon-design-system/carbon/issues/20452
53
- const tagId = id || `tag-${useId.useId()}`;
52
+ const generatedTagId = useId.useId();
53
+ const tagId = id ?? `tag-${generatedTagId}`;
54
54
  const tagClasses = cx(`${prefix}--tag--filter`, className);
55
55
  const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
56
56
  useIsomorphicEffect.default(() => {
@@ -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.
@@ -49,8 +49,8 @@ const OperationalTag = /*#__PURE__*/React.forwardRef(({
49
49
  }, forwardRef) => {
50
50
  const prefix = usePrefix.usePrefix();
51
51
  const tagRef = React.useRef(null);
52
- // eslint-disable-next-line react-hooks/rules-of-hooks -- https://github.com/carbon-design-system/carbon/issues/20452
53
- const tagId = id || `tag-${useId.useId()}`;
52
+ const generatedTagId = useId.useId();
53
+ const tagId = id ?? `tag-${generatedTagId}`;
54
54
  const tagClasses = cx(`${prefix}--tag--operational`, className);
55
55
  const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
56
56
  useIsomorphicEffect.default(() => {
@@ -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.
@@ -41,8 +41,8 @@ const SelectableTag = /*#__PURE__*/React.forwardRef(({
41
41
  }, forwardRef) => {
42
42
  const prefix = usePrefix.usePrefix();
43
43
  const tagRef = React.useRef(null);
44
- // eslint-disable-next-line react-hooks/rules-of-hooks -- https://github.com/carbon-design-system/carbon/issues/20452
45
- const tagId = id || `tag-${useId.useId()}`;
44
+ const generatedTagId = useId.useId();
45
+ const tagId = id ?? `tag-${generatedTagId}`;
46
46
  const [selectedTag, setSelectedTag] = useControllableState.useControllableState({
47
47
  value: selected,
48
48
  onChange: onChange,
@@ -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.
@@ -78,8 +78,8 @@ const TagBase = /*#__PURE__*/React.forwardRef(({
78
78
  console.warn('The `onClose` prop for Tag has been deprecated and will be removed in the next major version. Use DismissibleTag instead.');
79
79
  }
80
80
  const ref = useMergedRefs.useMergedRefs([forwardRef, tagRef]);
81
- // eslint-disable-next-line react-hooks/rules-of-hooks -- https://github.com/carbon-design-system/carbon/issues/20452
82
- const tagId = id || `tag-${useId.useId()}`;
81
+ const generatedTagId = useId.useId();
82
+ const tagId = id ?? `tag-${generatedTagId}`;
83
83
  const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
84
84
  useIsomorphicEffect.default(() => {
85
85
  const newElement = tagRef.current?.getElementsByClassName(`${prefix}--tag__label`)[0];
@@ -7,8 +7,7 @@
7
7
  import React, { type ReactNode } from 'react';
8
8
  export interface TextAreaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
9
9
  /**
10
- * Provide a custom className that is applied directly to the underlying
11
- * `<textarea>` node
10
+ * Provide a custom className that is applied to the wrapper node
12
11
  */
13
12
  className?: string;
14
13
  /**
@@ -42,7 +42,7 @@ const TextArea = frFn((props, forwardRef) => {
42
42
  onKeyDown = noopFn.noopFn,
43
43
  invalid = false,
44
44
  invalidText = '',
45
- helperText = '',
45
+ helperText,
46
46
  light,
47
47
  placeholder = '',
48
48
  enableCounter = false,
@@ -243,7 +243,7 @@ const TextArea = frFn((props, forwardRef) => {
243
243
  ariaDescribedBy = warnId;
244
244
  } else {
245
245
  const ids = [];
246
- if (!isFluid && helperText && helperId) ids.push(helperId);
246
+ if (!isFluid && hasHelper && helperId) ids.push(helperId);
247
247
  if (counterDescriptionId) ids.push(counterDescriptionId);
248
248
  ariaDescribedBy = ids.length > 0 ? ids.join(' ') : undefined;
249
249
  }
@@ -282,7 +282,7 @@ const TextArea = frFn((props, forwardRef) => {
282
282
  }, [ariaAnnouncement, prevAnnouncement, counterMode]);
283
283
  const input = /*#__PURE__*/React.createElement("textarea", _rollupPluginBabelHelpers.extends({}, other, textareaProps, {
284
284
  placeholder: placeholder,
285
- "aria-readonly": Boolean(other.readOnly),
285
+ "aria-readonly": other.readOnly,
286
286
  className: textareaClasses,
287
287
  "aria-invalid": invalid,
288
288
  "aria-describedby": ariaDescribedBy,
@@ -328,8 +328,7 @@ const TextArea = frFn((props, forwardRef) => {
328
328
  TextArea.displayName = 'TextArea';
329
329
  TextArea.propTypes = {
330
330
  /**
331
- * Provide a custom className that is applied directly to the underlying
332
- * `<textarea>` node
331
+ * Provide a custom className that is applied to the wrapper node
333
332
  */
334
333
  className: PropTypes.string,
335
334
  /**