@carbon/react 1.84.0-rc.0 → 1.85.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 (177) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +943 -943
  2. package/es/components/AILabel/index.js +6 -1
  3. package/es/components/Checkbox/Checkbox.d.ts +2 -2
  4. package/es/components/Checkbox/Checkbox.js +8 -8
  5. package/es/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
  6. package/es/components/CheckboxGroup/CheckboxGroup.js +9 -8
  7. package/es/components/CodeSnippet/CodeSnippet.js +2 -4
  8. package/es/components/ComboBox/ComboBox.d.ts +1 -1
  9. package/es/components/ComboBox/ComboBox.js +8 -7
  10. package/es/components/ComposedModal/ComposedModal.d.ts +1 -1
  11. package/es/components/ComposedModal/ComposedModal.js +34 -12
  12. package/es/components/ContainedList/ContainedList.d.ts +1 -1
  13. package/es/components/ContainedList/ContainedList.js +4 -2
  14. package/es/components/ContentSwitcher/ContentSwitcher.js +6 -5
  15. package/es/components/DataTable/DataTable.js +3 -0
  16. package/es/components/DataTable/TableDecoratorRow.d.ts +2 -2
  17. package/es/components/DataTable/TableDecoratorRow.js +8 -8
  18. package/es/components/DataTable/TableExpandRow.d.ts +1 -1
  19. package/es/components/DataTable/TableExpandRow.js +15 -6
  20. package/es/components/DataTable/TableHeader.js +10 -10
  21. package/es/components/DataTable/TableRow.js +12 -4
  22. package/es/components/DataTable/tools/normalize.js +2 -1
  23. package/es/components/DatePickerInput/DatePickerInput.js +8 -7
  24. package/es/components/Dialog/index.d.ts +5 -1
  25. package/es/components/Dialog/index.js +20 -0
  26. package/es/components/Dropdown/Dropdown.d.ts +1 -1
  27. package/es/components/Dropdown/Dropdown.js +8 -10
  28. package/es/components/FileUploader/FileUploaderButton.js +2 -2
  29. package/es/components/FileUploader/FileUploaderDropContainer.js +2 -2
  30. package/es/components/FileUploader/FileUploaderItem.js +2 -2
  31. package/es/components/Layer/index.d.ts +1 -3
  32. package/es/components/Layer/index.js +9 -8
  33. package/es/components/Menu/Menu.js +0 -6
  34. package/es/components/Modal/Modal.d.ts +2 -2
  35. package/es/components/Modal/Modal.js +39 -11
  36. package/es/components/MultiSelect/FilterableMultiSelect.d.ts +1 -1
  37. package/es/components/MultiSelect/FilterableMultiSelect.js +29 -7
  38. package/es/components/MultiSelect/MultiSelect.d.ts +1 -1
  39. package/es/components/MultiSelect/MultiSelect.js +8 -7
  40. package/es/components/NumberInput/NumberInput.d.ts +1 -1
  41. package/es/components/NumberInput/NumberInput.js +9 -8
  42. package/es/components/OverflowMenu/OverflowMenu.js +4 -5
  43. package/es/components/PageHeader/PageHeader.d.ts +10 -9
  44. package/es/components/PageHeader/PageHeader.js +94 -34
  45. package/es/components/PageHeader/index.d.ts +2 -2
  46. package/es/components/PageHeader/index.js +1 -1
  47. package/es/components/Popover/index.js +2 -1
  48. package/es/components/RadioButton/RadioButton.d.ts +2 -2
  49. package/es/components/RadioButton/RadioButton.js +8 -8
  50. package/es/components/RadioButtonGroup/RadioButtonGroup.d.ts +2 -2
  51. package/es/components/RadioButtonGroup/RadioButtonGroup.js +9 -8
  52. package/es/components/RadioTile/RadioTile.d.ts +1 -1
  53. package/es/components/RadioTile/RadioTile.js +8 -7
  54. package/es/components/Search/Search.js +0 -1
  55. package/es/components/Select/Select.d.ts +2 -2
  56. package/es/components/Select/Select.js +8 -7
  57. package/es/components/Slider/Slider.js +6 -0
  58. package/es/components/Tag/DismissibleTag.d.ts +1 -1
  59. package/es/components/Tag/DismissibleTag.js +9 -8
  60. package/es/components/Tag/Tag.d.ts +1 -1
  61. package/es/components/Tag/Tag.js +9 -8
  62. package/es/components/TextArea/TextArea.js +12 -11
  63. package/es/components/TextInput/TextInput.d.ts +1 -1
  64. package/es/components/TextInput/TextInput.js +20 -9
  65. package/es/components/Tile/Tile.d.ts +2 -2
  66. package/es/components/Tile/Tile.js +30 -36
  67. package/es/components/TileGroup/TileGroup.d.ts +4 -4
  68. package/es/components/TileGroup/TileGroup.js +45 -53
  69. package/es/components/TileGroup/index.d.ts +3 -3
  70. package/es/components/Toggletip/index.js +2 -2
  71. package/es/components/Tooltip/DefinitionTooltip.js +1 -0
  72. package/es/components/TreeView/TreeNode.js +3 -3
  73. package/es/components/TreeView/TreeView.js +3 -3
  74. package/es/components/UIShell/Content.d.ts +5 -3
  75. package/es/components/UIShell/HeaderMenuItem.js +2 -1
  76. package/es/components/UIShell/HeaderPanel.d.ts +2 -2
  77. package/es/components/UIShell/HeaderPanel.js +9 -5
  78. package/es/index.js +1 -1
  79. package/es/internal/Selection.js +8 -3
  80. package/es/internal/environment.js +1 -12
  81. package/es/internal/{__mocks__/mockHTMLElement.d.ts → index.d.ts} +2 -4
  82. package/es/internal/useOverflowItems.d.ts +29 -0
  83. package/es/internal/useOverflowItems.js +122 -0
  84. package/es/internal/useResizeObserver.d.ts +1 -1
  85. package/es/internal/utils.d.ts +14 -0
  86. package/es/internal/utils.js +18 -0
  87. package/es/tools/uniqueId.d.ts +1 -6
  88. package/lib/components/AILabel/index.js +6 -1
  89. package/lib/components/Checkbox/Checkbox.d.ts +2 -2
  90. package/lib/components/Checkbox/Checkbox.js +7 -7
  91. package/lib/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
  92. package/lib/components/CheckboxGroup/CheckboxGroup.js +8 -7
  93. package/lib/components/CodeSnippet/CodeSnippet.js +2 -4
  94. package/lib/components/ComboBox/ComboBox.d.ts +1 -1
  95. package/lib/components/ComboBox/ComboBox.js +11 -10
  96. package/lib/components/ComposedModal/ComposedModal.d.ts +1 -1
  97. package/lib/components/ComposedModal/ComposedModal.js +35 -13
  98. package/lib/components/ContainedList/ContainedList.d.ts +1 -1
  99. package/lib/components/ContainedList/ContainedList.js +4 -2
  100. package/lib/components/ContentSwitcher/ContentSwitcher.js +5 -4
  101. package/lib/components/DataTable/DataTable.js +3 -0
  102. package/lib/components/DataTable/TableDecoratorRow.d.ts +2 -2
  103. package/lib/components/DataTable/TableDecoratorRow.js +8 -8
  104. package/lib/components/DataTable/TableExpandRow.d.ts +1 -1
  105. package/lib/components/DataTable/TableExpandRow.js +14 -5
  106. package/lib/components/DataTable/TableHeader.js +9 -9
  107. package/lib/components/DataTable/TableRow.js +11 -3
  108. package/lib/components/DataTable/tools/normalize.js +2 -1
  109. package/lib/components/DatePickerInput/DatePickerInput.js +7 -6
  110. package/lib/components/Dialog/index.d.ts +5 -1
  111. package/lib/components/Dialog/index.js +20 -0
  112. package/lib/components/Dropdown/Dropdown.d.ts +1 -1
  113. package/lib/components/Dropdown/Dropdown.js +12 -14
  114. package/lib/components/FileUploader/FileUploaderButton.js +2 -2
  115. package/lib/components/FileUploader/FileUploaderDropContainer.js +2 -2
  116. package/lib/components/FileUploader/FileUploaderItem.js +2 -2
  117. package/lib/components/Layer/index.d.ts +1 -3
  118. package/lib/components/Layer/index.js +9 -8
  119. package/lib/components/Menu/Menu.js +0 -6
  120. package/lib/components/Modal/Modal.d.ts +2 -2
  121. package/lib/components/Modal/Modal.js +47 -19
  122. package/lib/components/MultiSelect/FilterableMultiSelect.d.ts +1 -1
  123. package/lib/components/MultiSelect/FilterableMultiSelect.js +33 -11
  124. package/lib/components/MultiSelect/MultiSelect.d.ts +1 -1
  125. package/lib/components/MultiSelect/MultiSelect.js +13 -12
  126. package/lib/components/NumberInput/NumberInput.d.ts +1 -1
  127. package/lib/components/NumberInput/NumberInput.js +8 -7
  128. package/lib/components/OverflowMenu/OverflowMenu.js +4 -5
  129. package/lib/components/PageHeader/PageHeader.d.ts +10 -9
  130. package/lib/components/PageHeader/PageHeader.js +92 -34
  131. package/lib/components/PageHeader/index.d.ts +2 -2
  132. package/lib/components/PageHeader/index.js +0 -2
  133. package/lib/components/Popover/index.js +2 -1
  134. package/lib/components/RadioButton/RadioButton.d.ts +2 -2
  135. package/lib/components/RadioButton/RadioButton.js +7 -7
  136. package/lib/components/RadioButtonGroup/RadioButtonGroup.d.ts +2 -2
  137. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +10 -9
  138. package/lib/components/RadioTile/RadioTile.d.ts +1 -1
  139. package/lib/components/RadioTile/RadioTile.js +7 -6
  140. package/lib/components/Search/Search.js +0 -1
  141. package/lib/components/Select/Select.d.ts +2 -2
  142. package/lib/components/Select/Select.js +7 -6
  143. package/lib/components/Slider/Slider.js +6 -0
  144. package/lib/components/Tag/DismissibleTag.d.ts +1 -1
  145. package/lib/components/Tag/DismissibleTag.js +8 -7
  146. package/lib/components/Tag/Tag.d.ts +1 -1
  147. package/lib/components/Tag/Tag.js +8 -7
  148. package/lib/components/TextArea/TextArea.js +11 -10
  149. package/lib/components/TextInput/TextInput.d.ts +1 -1
  150. package/lib/components/TextInput/TextInput.js +19 -8
  151. package/lib/components/Tile/Tile.d.ts +2 -2
  152. package/lib/components/Tile/Tile.js +29 -35
  153. package/lib/components/TileGroup/TileGroup.d.ts +4 -4
  154. package/lib/components/TileGroup/TileGroup.js +44 -52
  155. package/lib/components/TileGroup/index.d.ts +3 -3
  156. package/lib/components/Toggletip/index.js +2 -2
  157. package/lib/components/Tooltip/DefinitionTooltip.js +1 -0
  158. package/lib/components/TreeView/TreeNode.js +3 -3
  159. package/lib/components/TreeView/TreeView.js +3 -3
  160. package/lib/components/UIShell/Content.d.ts +5 -3
  161. package/lib/components/UIShell/HeaderMenuItem.js +2 -1
  162. package/lib/components/UIShell/HeaderPanel.d.ts +2 -2
  163. package/lib/components/UIShell/HeaderPanel.js +8 -4
  164. package/lib/index.js +1 -1
  165. package/lib/internal/Selection.js +8 -3
  166. package/lib/internal/environment.js +1 -12
  167. package/lib/internal/{__mocks__/mockHTMLElement.d.ts → index.d.ts} +2 -4
  168. package/lib/internal/useOverflowItems.d.ts +29 -0
  169. package/lib/internal/useOverflowItems.js +126 -0
  170. package/lib/internal/useResizeObserver.d.ts +1 -1
  171. package/lib/internal/utils.d.ts +14 -0
  172. package/lib/internal/utils.js +22 -0
  173. package/lib/tools/uniqueId.d.ts +1 -6
  174. package/package.json +14 -23
  175. package/telemetry.yml +3 -0
  176. package/es/tools/uniqueId.js +0 -14
  177. package/lib/tools/uniqueId.js +0 -18
@@ -144,7 +144,6 @@ const Search = /*#__PURE__*/React__default["default"].forwardRef(function Search
144
144
  "aria-label": placeholder,
145
145
  className: searchClasses
146
146
  }, /*#__PURE__*/React__default["default"].createElement("div", {
147
- "aria-label": onExpand ? 'button' : undefined,
148
147
  "aria-labelledby": onExpand ? searchId : undefined,
149
148
  role: onExpand ? 'button' : undefined,
150
149
  className: `${prefix}--search-magnifier`,
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Copyright IBM Corp. 2016, 2023
2
+ * Copyright IBM Corp. 2016, 2025
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
- import React, { ChangeEventHandler, ComponentPropsWithRef, ReactNode } from 'react';
7
+ import React, { type ChangeEventHandler, type ComponentPropsWithRef, type ReactNode } from 'react';
8
8
  type ExcludedAttributes = 'size';
9
9
  export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, ExcludedAttributes> {
10
10
  /**
@@ -21,6 +21,8 @@ var FormContext = require('../FluidForm/FormContext.js');
21
21
  var useId = require('../../internal/useId.js');
22
22
  var events = require('../../tools/events.js');
23
23
  require('../Text/index.js');
24
+ var index = require('../AILabel/index.js');
25
+ var utils = require('../../internal/utils.js');
24
26
  var Text = require('../Text/Text.js');
25
27
 
26
28
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -144,12 +146,11 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
144
146
  };
145
147
 
146
148
  // AILabel always size `mini`
147
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
148
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel') {
149
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
150
- size: 'mini'
151
- });
152
- }
149
+ const candidate = slug ?? decorator;
150
+ const candidateIsAILabel = utils.isComponentElement(candidate, index.AILabel);
151
+ const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/React.cloneElement(candidate, {
152
+ size: 'mini'
153
+ }) : null;
153
154
  const input = (() => {
154
155
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("select", _rollupPluginBabelHelpers["extends"]({}, other, ariaProps, {
155
156
  id: id,
@@ -768,6 +768,9 @@ class Slider extends React.PureComponent {
768
768
  valueUpper,
769
769
  leftUpper
770
770
  });
771
+ if (this.filledTrackRef.current) {
772
+ this.filledTrackRef.current.style.transform = this.state.isRtl ? `translate(${100 - this.state.leftUpper}%, -50%) scaleX(${(this.state.leftUpper - this.state.left) / 100})` : `translate(${this.state.left}%, -50%) scaleX(${(this.state.leftUpper - this.state.left) / 100})`;
773
+ }
771
774
  } else {
772
775
  const {
773
776
  value,
@@ -781,6 +784,9 @@ class Slider extends React.PureComponent {
781
784
  value,
782
785
  left
783
786
  });
787
+ if (this.filledTrackRef.current) {
788
+ this.filledTrackRef.current.style.transform = this.state.isRtl ? `translate(100%, -50%) scaleX(-${this.state.left / 100})` : `translate(0%, -50%) scaleX(${this.state.left / 100})`;
789
+ }
784
790
  }
785
791
  }
786
792
  }
@@ -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, { ReactNode } from 'react';
7
+ import React, { type ReactNode } from 'react';
8
8
  import { PolymorphicProps } from '../../types/common';
9
9
  import { SIZES, TYPES } from './Tag';
10
10
  export interface DismissibleTagBaseProps {
@@ -23,6 +23,8 @@ var Tooltip = require('../Tooltip/Tooltip.js');
23
23
  require('../Text/index.js');
24
24
  var isEllipsisActive = require('./isEllipsisActive.js');
25
25
  var mergeRefs = require('../../tools/mergeRefs.js');
26
+ var index = require('../AILabel/index.js');
27
+ var utils = require('../../internal/utils.js');
26
28
  var Text = require('../Text/Text.js');
27
29
 
28
30
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -64,13 +66,12 @@ const DismissibleTag = /*#__PURE__*/React.forwardRef(({
64
66
  onClose(event);
65
67
  }
66
68
  };
67
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
68
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel') {
69
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
70
- size: 'sm',
71
- kind: 'inline'
72
- });
73
- }
69
+ const candidate = slug ?? decorator;
70
+ const candidateIsAILabel = utils.isComponentElement(candidate, index.AILabel);
71
+ const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/React.cloneElement(candidate, {
72
+ size: 'sm',
73
+ kind: 'inline'
74
+ }) : null;
74
75
  const tooltipClasses = cx__default["default"](`${prefix}--icon-tooltip`, `${prefix}--tag-label-tooltip`);
75
76
 
76
77
  // Removing onClick from the spread operator
@@ -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, { ReactNode } from 'react';
7
+ import React, { type ReactNode } from 'react';
8
8
  import { PolymorphicComponentPropWithRef } from '../../internal/PolymorphicProps';
9
9
  import { SelectableTagBaseProps } from './SelectableTag';
10
10
  import { OperationalTagBaseProps } from './OperationalTag';
@@ -22,6 +22,8 @@ var DefinitionTooltip = require('../Tooltip/DefinitionTooltip.js');
22
22
  require('../Tooltip/Tooltip.js');
23
23
  var isEllipsisActive = require('./isEllipsisActive.js');
24
24
  var useMergedRefs = require('../../internal/useMergedRefs.js');
25
+ var index = require('../AILabel/index.js');
26
+ var utils = require('../../internal/utils.js');
25
27
  var Text = require('../Text/Text.js');
26
28
 
27
29
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -104,13 +106,12 @@ const TagBase = /*#__PURE__*/React__default["default"].forwardRef(({
104
106
  };
105
107
 
106
108
  // AILabel is always size `sm` and `inline`
107
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
108
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel' && !isInteractiveTag) {
109
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
110
- size: 'sm',
111
- kind: 'inline'
112
- });
113
- }
109
+ const candidate = slug ?? decorator;
110
+ const candidateIsAILabel = utils.isComponentElement(candidate, index.AILabel);
111
+ const normalizedDecorator = candidateIsAILabel && !isInteractiveTag ? /*#__PURE__*/React.cloneElement(candidate, {
112
+ size: 'sm',
113
+ kind: 'inline'
114
+ }) : null;
114
115
  if (filter) {
115
116
  const ComponentTag = BaseComponent ?? 'div';
116
117
  return /*#__PURE__*/React__default["default"].createElement(ComponentTag, _rollupPluginBabelHelpers["extends"]({
@@ -24,6 +24,8 @@ var useMergedRefs = require('../../internal/useMergedRefs.js');
24
24
  var useId = require('../../internal/useId.js');
25
25
  var noopFn = require('../../internal/noopFn.js');
26
26
  require('../Text/index.js');
27
+ var index = require('../AILabel/index.js');
28
+ var utils = require('../../internal/utils.js');
27
29
  var Text = require('../Text/Text.js');
28
30
 
29
31
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -75,7 +77,7 @@ const TextArea = frFn((props, forwardRef) => {
75
77
  if (counterMode === 'character') {
76
78
  return strValue.length;
77
79
  } else {
78
- return strValue.match(/\w+/g)?.length || 0;
80
+ return strValue.match(/\p{L}+/gu)?.length || 0;
79
81
  }
80
82
  }
81
83
  const [textCount, setTextCount] = React.useState(getInitialTextCount());
@@ -107,8 +109,8 @@ const TextArea = frFn((props, forwardRef) => {
107
109
  onPaste: evt => {
108
110
  if (!disabled) {
109
111
  if (counterMode === 'word' && enableCounter && typeof maxCount !== 'undefined' && textareaRef.current !== null) {
110
- const existingWords = textareaRef.current.value.match(/\w+/g) || [];
111
- const pastedWords = evt.clipboardData.getData('Text').match(/\w+/g) || [];
112
+ const existingWords = textareaRef.current.value.match(/\p{L}+/gu) || [];
113
+ const pastedWords = evt.clipboardData.getData('Text').match(/\p{L}+/gu) || [];
112
114
  const totalWords = existingWords.length + pastedWords.length;
113
115
  if (totalWords > maxCount) {
114
116
  evt.preventDefault();
@@ -137,7 +139,7 @@ const TextArea = frFn((props, forwardRef) => {
137
139
  return;
138
140
  }
139
141
  if (enableCounter && typeof maxCount !== 'undefined' && textareaRef.current !== null) {
140
- const matchedWords = evt.target?.value?.match(/\w+/g);
142
+ const matchedWords = evt.target?.value?.match(/\p{L}+/gu);
141
143
  if (matchedWords && matchedWords.length <= maxCount) {
142
144
  textareaRef.current.removeAttribute('maxLength');
143
145
  setTimeout(() => {
@@ -268,12 +270,11 @@ const TextArea = frFn((props, forwardRef) => {
268
270
  }));
269
271
 
270
272
  // AILabel is always size `mini`
271
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
272
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel') {
273
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
274
- size: 'mini'
275
- });
276
- }
273
+ const candidate = slug ?? decorator;
274
+ const candidateIsAILabel = utils.isComponentElement(candidate, index.AILabel);
275
+ const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/React.cloneElement(candidate, {
276
+ size: 'mini'
277
+ }) : null;
277
278
  return /*#__PURE__*/React__default["default"].createElement("div", {
278
279
  className: formItemClasses
279
280
  }, /*#__PURE__*/React__default["default"].createElement("div", {
@@ -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, { ReactNode } from 'react';
7
+ import React, { type ReactNode } from 'react';
8
8
  type ExcludedAttributes = 'defaultValue' | 'id' | 'size' | 'value';
9
9
  export interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, ExcludedAttributes> {
10
10
  /**
@@ -17,9 +17,12 @@ var deprecate = require('../../prop-types/deprecate.js');
17
17
  var util = require('./util.js');
18
18
  require('../FluidForm/FluidForm.js');
19
19
  var FormContext = require('../FluidForm/FormContext.js');
20
+ var useMergedRefs = require('../../internal/useMergedRefs.js');
20
21
  var usePrefix = require('../../internal/usePrefix.js');
21
22
  var getAnnouncement = require('../../internal/getAnnouncement.js');
22
23
  require('../Text/index.js');
24
+ var index = require('../AILabel/index.js');
25
+ var utils = require('../../internal/utils.js');
23
26
  var Text = require('../Text/Text.js');
24
27
 
25
28
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -58,7 +61,16 @@ const TextInput = /*#__PURE__*/React__default["default"].forwardRef(function Tex
58
61
  defaultValue,
59
62
  value
60
63
  } = rest;
61
- const [textCount, setTextCount] = React.useState(defaultValue?.toString().length || value?.toString().length || 0);
64
+ const inputRef = React.useRef(null);
65
+ const mergedRef = useMergedRefs.useMergedRefs([ref, inputRef]);
66
+ function getInitialTextCount() {
67
+ const targetValue = defaultValue || value || inputRef.current?.value || '';
68
+ return targetValue.toString().length;
69
+ }
70
+ const [textCount, setTextCount] = React.useState(getInitialTextCount());
71
+ React.useEffect(() => {
72
+ setTextCount(getInitialTextCount());
73
+ }, [value, defaultValue, enableCounter]);
62
74
  const normalizedProps = useNormalizedInputProps.useNormalizedInputProps({
63
75
  id,
64
76
  readOnly,
@@ -91,7 +103,7 @@ const TextInput = /*#__PURE__*/React__default["default"].forwardRef(function Tex
91
103
  },
92
104
  placeholder,
93
105
  type,
94
- ref,
106
+ ref: mergedRef,
95
107
  className: textInputClasses,
96
108
  title: placeholder,
97
109
  disabled: normalizedProps.disabled,
@@ -189,12 +201,11 @@ const TextInput = /*#__PURE__*/React__default["default"].forwardRef(function Tex
189
201
  const Icon = normalizedProps.icon;
190
202
 
191
203
  // AILabel is always size `mini`
192
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
193
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel') {
194
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
195
- size: 'mini'
196
- });
197
- }
204
+ const candidate = slug ?? decorator;
205
+ const candidateIsAILabel = utils.isComponentElement(candidate, index.AILabel);
206
+ const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/React.cloneElement(candidate, {
207
+ size: 'mini'
208
+ }) : null;
198
209
  return /*#__PURE__*/React__default["default"].createElement("div", {
199
210
  className: inputWrapperClasses
200
211
  }, !inline ? labelWrapper : /*#__PURE__*/React__default["default"].createElement("div", {
@@ -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 ChangeEvent, type HTMLAttributes, type KeyboardEvent, type MouseEvent, type ReactNode } from 'react';
7
+ import React, { type HTMLAttributes, type KeyboardEvent, type MouseEvent, type ReactNode } from 'react';
8
8
  export interface TileProps extends HTMLAttributes<HTMLDivElement> {
9
9
  children?: ReactNode;
10
10
  className?: string;
@@ -105,7 +105,7 @@ export interface SelectableTileProps extends HTMLAttributes<HTMLDivElement> {
105
105
  /**
106
106
  * The empty handler of the `<input>`.
107
107
  */
108
- onChange?(event: ChangeEvent<HTMLDivElement>, selected?: boolean, id?: string): void;
108
+ onChange?(event: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>, selected?: boolean, id?: string): void;
109
109
  /**
110
110
  * Specify the function to run when the SelectableTile is clicked
111
111
  */
@@ -26,6 +26,8 @@ var useMergedRefs = require('../../internal/useMergedRefs.js');
26
26
  var index = require('../FeatureFlags/index.js');
27
27
  var useId = require('../../internal/useId.js');
28
28
  require('../Text/index.js');
29
+ var index$1 = require('../AILabel/index.js');
30
+ var utils = require('../../internal/utils.js');
29
31
  var Text = require('../Text/Text.js');
30
32
 
31
33
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -234,7 +236,11 @@ const SelectableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
234
236
  const clickHandler = onClick;
235
237
  const keyDownHandler = onKeyDown;
236
238
  const [isSelected, setIsSelected] = React.useState(selected);
237
- const [prevSelected, setPrevSelected] = React.useState(selected);
239
+
240
+ // Use useEffect to sync with prop changes instead of render-time logic
241
+ React.useEffect(() => {
242
+ setIsSelected(selected);
243
+ }, [selected]);
238
244
  const classes = cx__default["default"](`${prefix}--tile`, `${prefix}--tile--selectable`, {
239
245
  [`${prefix}--tile--is-selected`]: isSelected,
240
246
  [`${prefix}--tile--light`]: light,
@@ -244,50 +250,40 @@ const SelectableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
244
250
  [`${prefix}--tile--decorator`]: decorator,
245
251
  [`${prefix}--tile--decorator-rounded`]: decorator && hasRoundedCorners
246
252
  }, className);
253
+
254
+ // Single function to handle selection changes
255
+ const handleSelectionChange = React.useCallback((evt, newSelected) => {
256
+ setIsSelected(newSelected);
257
+ onChange(evt, newSelected, id);
258
+ }, [onChange, id]);
247
259
  function handleClick(evt) {
248
260
  evt.preventDefault();
249
261
  evt?.persist?.();
250
- if (normalizedDecorator && decoratorRef.current && decoratorRef.current.contains(evt.target)) {
262
+ if (normalizedDecorator && decoratorRef.current && evt.target instanceof Node && decoratorRef.current.contains(evt.target)) {
251
263
  return;
252
264
  }
253
- setIsSelected(prevSelected => {
254
- const newSelected = !prevSelected;
255
- onChange(evt, newSelected, id);
256
- return newSelected;
257
- });
265
+ const newSelected = !isSelected;
266
+ handleSelectionChange(evt, newSelected);
258
267
  clickHandler(evt);
259
268
  }
260
269
  function handleKeyDown(evt) {
261
270
  evt?.persist?.();
262
271
  if (match.matches(evt, [keys.Enter, keys.Space])) {
263
272
  evt.preventDefault();
264
- setIsSelected(prevSelected => {
265
- const newSelected = !prevSelected;
266
- onChange(evt, newSelected, id);
267
- return newSelected;
268
- });
273
+ const newSelected = !isSelected;
274
+ handleSelectionChange(evt, newSelected);
269
275
  }
270
276
  keyDownHandler(evt);
271
277
  }
272
- function handleChange(event) {
273
- const newSelected = event.target.checked;
274
- setIsSelected(newSelected);
275
- onChange(event, newSelected, id);
276
- }
277
- if (selected !== prevSelected) {
278
- setIsSelected(selected);
279
- setPrevSelected(selected);
280
- }
281
278
 
282
279
  // AILabel is always size `xs`
283
280
  const decoratorRef = React.useRef(null);
284
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
285
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel') {
286
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
287
- size: 'xs',
288
- ref: decoratorRef
289
- });
290
- }
281
+ const candidate = slug ?? decorator;
282
+ const candidateIsAILabel = utils.isComponentElement(candidate, index$1.AILabel);
283
+ const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/React.cloneElement(candidate, {
284
+ size: 'xs',
285
+ ref: decoratorRef
286
+ }) : null;
291
287
  return (
292
288
  /*#__PURE__*/
293
289
  // eslint-disable-next-line jsx-a11y/interactive-supports-focus
@@ -302,7 +298,6 @@ const SelectableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
302
298
  tabIndex: !disabled ? tabIndex : undefined,
303
299
  ref: ref,
304
300
  id: id,
305
- onChange: !disabled ? handleChange : undefined,
306
301
  title: title
307
302
  }, rest), /*#__PURE__*/React__default["default"].createElement("span", {
308
303
  className: `${prefix}--tile__checkmark ${prefix}--tile__checkmark--persistent`
@@ -515,12 +510,11 @@ const ExpandableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
515
510
  const belowTheFoldId = useId.useId('expandable-tile-interactive');
516
511
 
517
512
  // AILabel is always size `xs`
518
- let normalizedDecorator = /*#__PURE__*/React__default["default"].isValidElement(slug ?? decorator) ? slug ?? decorator : null;
519
- if (normalizedDecorator && normalizedDecorator['type']?.displayName === 'AILabel') {
520
- normalizedDecorator = /*#__PURE__*/React__default["default"].cloneElement(normalizedDecorator, {
521
- size: 'xs'
522
- });
523
- }
513
+ const candidate = slug ?? decorator;
514
+ const candidateIsAILabel = utils.isComponentElement(candidate, index$1.AILabel);
515
+ const normalizedDecorator = candidateIsAILabel ? /*#__PURE__*/React.cloneElement(candidate, {
516
+ size: 'xs'
517
+ }) : null;
524
518
  return interactive ? /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
525
519
  ref: ref,
526
520
  className: interactiveClassNames
@@ -45,8 +45,9 @@ export interface TileGroupProps extends Omit<HTMLAttributes<HTMLFieldSetElement>
45
45
  */
46
46
  required?: boolean;
47
47
  }
48
- declare const TileGroup: {
49
- (props: any): import("react/jsx-runtime").JSX.Element;
48
+ export declare const TileGroup: {
49
+ ({ children, className, defaultSelected, disabled, legend, name, onChange, valueSelected, required, }: TileGroupProps): import("react/jsx-runtime").JSX.Element;
50
+ displayName: string;
50
51
  propTypes: {
51
52
  /**
52
53
  * Provide a collection of <RadioTile> components to render in the group
@@ -86,6 +87,5 @@ declare const TileGroup: {
86
87
  */
87
88
  valueSelected: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
88
89
  };
89
- displayName: string;
90
90
  };
91
- export default TileGroup;
91
+ export {};
@@ -21,35 +21,37 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
21
21
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
22
22
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
23
23
 
24
- const TileGroup = props => {
25
- const {
26
- children,
27
- className,
28
- defaultSelected,
29
- disabled,
30
- legend,
31
- name,
32
- onChange = noopFn.noopFn,
33
- valueSelected,
34
- required
35
- } = props;
24
+ const TileGroup = ({
25
+ children,
26
+ className,
27
+ defaultSelected,
28
+ disabled,
29
+ legend,
30
+ name,
31
+ onChange = noopFn.noopFn,
32
+ valueSelected,
33
+ required
34
+ }) => {
36
35
  const prefix = usePrefix.usePrefix();
37
36
  const [selected, setSelected] = React.useState(valueSelected ?? defaultSelected);
38
- const [prevValueSelected, setPrevValueSelected] = React.useState(valueSelected);
37
+ React.useEffect(() => {
38
+ if (typeof valueSelected !== 'undefined' && valueSelected !== selected) {
39
+ setSelected(valueSelected);
40
+ }
41
+ }, [valueSelected, selected]);
42
+ const handleChange = (value, name, evt) => {
43
+ if (value !== selected) {
44
+ setSelected(value);
45
+ onChange(value, name ?? '', evt);
46
+ }
47
+ };
48
+ const getRadioTilesWithWrappers = elements => {
49
+ const traverseAndModifyChildren = elements => {
50
+ return React.Children.map(elements, child => {
51
+ if (! /*#__PURE__*/React.isValidElement(child)) return child;
39
52
 
40
- /**
41
- * prop + state alignment - getDerivedStateFromProps
42
- * only update if selected prop changes
43
- */
44
- if (valueSelected !== prevValueSelected) {
45
- setSelected(valueSelected);
46
- setPrevValueSelected(valueSelected);
47
- }
48
- const getRadioTilesWithWrappers = children => {
49
- const traverseAndModifyChildren = children => {
50
- return React__default["default"].Children.map(children, child => {
51
- // If RadioTile found, return it with necessary props
52
- if (child?.type === RadioTile["default"]) {
53
+ // If a `RadioTile` is found, return it with necessary props,
54
+ if (/*#__PURE__*/React.isValidElement(child) && child.type === RadioTile["default"]) {
53
55
  const {
54
56
  value,
55
57
  ...otherProps
@@ -62,38 +64,29 @@ const TileGroup = props => {
62
64
  onChange: handleChange,
63
65
  checked: value === selected
64
66
  }));
65
- } else if (child?.props?.children) {
66
- // If the child is not RadioTile and has children, recheck the children
67
- return /*#__PURE__*/React__default["default"].cloneElement(child, {
68
- ...child.props,
69
- children: traverseAndModifyChildren(child.props.children)
70
- });
71
- } else {
72
- // If the child is neither a RadioTile nor has children, return it as is
73
- return child;
74
67
  }
68
+
69
+ // If the child is not RadioTile and has children, recheck the children
70
+ const children = child.props.children;
71
+ const hasChildren = React.Children.count(children) > 0;
72
+ if (hasChildren) {
73
+ return /*#__PURE__*/React.cloneElement(child, undefined, traverseAndModifyChildren(children));
74
+ }
75
+
76
+ // If the child is neither a RadioTile nor has children, return it as is
77
+ return child;
75
78
  });
76
79
  };
77
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, traverseAndModifyChildren(children));
78
- };
79
- const handleChange = (newSelection, value, evt) => {
80
- if (newSelection !== selected) {
81
- setSelected(newSelection);
82
- onChange(newSelection, name, evt);
83
- }
84
- };
85
- const renderLegend = legend => {
86
- if (legend) {
87
- return /*#__PURE__*/React__default["default"].createElement("legend", {
88
- className: `${prefix}--label`
89
- }, legend);
90
- }
80
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, traverseAndModifyChildren(elements));
91
81
  };
92
82
  return /*#__PURE__*/React__default["default"].createElement("fieldset", {
93
83
  className: className ?? `${prefix}--tile-group`,
94
84
  disabled: disabled
95
- }, renderLegend(legend), /*#__PURE__*/React__default["default"].createElement("div", null, getRadioTilesWithWrappers(children)));
85
+ }, legend && /*#__PURE__*/React__default["default"].createElement("legend", {
86
+ className: `${prefix}--label`
87
+ }, legend), /*#__PURE__*/React__default["default"].createElement("div", null, getRadioTilesWithWrappers(children)));
96
88
  };
89
+ TileGroup.displayName = 'TileGroup';
97
90
  TileGroup.propTypes = {
98
91
  /**
99
92
  * Provide a collection of <RadioTile> components to render in the group
@@ -133,6 +126,5 @@ TileGroup.propTypes = {
133
126
  */
134
127
  valueSelected: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].number])
135
128
  };
136
- TileGroup.displayName = 'TileGroup';
137
129
 
138
- exports["default"] = TileGroup;
130
+ exports.TileGroup = TileGroup;
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Copyright IBM Corp. 2016, 2023
2
+ * Copyright IBM Corp. 2016, 2025
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
- import TileGroup, { type TileGroupProps } from './TileGroup';
7
+ import { TileGroup } from './TileGroup';
8
8
  export default TileGroup;
9
- export { TileGroup, type TileGroupProps };
9
+ export * from './TileGroup';
@@ -98,6 +98,7 @@ function Toggletip({
98
98
  buttonProps: {
99
99
  'aria-expanded': open,
100
100
  'aria-controls': id,
101
+ 'aria-describedby': open ? id : undefined,
101
102
  onClick: actions.toggle
102
103
  },
103
104
  contentProps: {
@@ -269,8 +270,7 @@ const ToggletipContent = /*#__PURE__*/React__default["default"].forwardRef(funct
269
270
  return /*#__PURE__*/React__default["default"].createElement(index.PopoverContent, _rollupPluginBabelHelpers["extends"]({
270
271
  className: customClassName
271
272
  }, toggletip?.contentProps, {
272
- ref: ref,
273
- "aria-live": "polite"
273
+ ref: ref
274
274
  }), /*#__PURE__*/React__default["default"].createElement("div", {
275
275
  className: `${prefix}--toggletip-content`
276
276
  }, children));
@@ -67,6 +67,7 @@ const DefinitionTooltip = ({
67
67
  }, /*#__PURE__*/React__default["default"].createElement("button", _rollupPluginBabelHelpers["extends"]({}, rest, {
68
68
  className: cx__default["default"](`${prefix}--definition-term`, triggerClassName),
69
69
  "aria-controls": tooltipId,
70
+ "aria-describedby": tooltipId,
70
71
  "aria-expanded": isOpen,
71
72
  onBlur: () => {
72
73
  setOpen(false);
@@ -18,7 +18,7 @@ var keys = require('../../internal/keyboard/keys.js');
18
18
  var match = require('../../internal/keyboard/match.js');
19
19
  var useControllableState = require('../../internal/useControllableState.js');
20
20
  var usePrefix = require('../../internal/usePrefix.js');
21
- var uniqueId = require('../../tools/uniqueId.js');
21
+ var useId = require('../../internal/useId.js');
22
22
  var index = require('../FeatureFlags/index.js');
23
23
 
24
24
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -53,7 +53,7 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
53
53
  const enableTreeviewControllable = index.useFeatureFlag('enable-treeview-controllable');
54
54
  const {
55
55
  current: id
56
- } = React.useRef(nodeId || uniqueId.uniqueId());
56
+ } = React.useRef(nodeId || useId.useId());
57
57
  const controllableExpandedState = useControllableState.useControllableState({
58
58
  value: isExpanded,
59
59
  onChange: newValue => {
@@ -82,7 +82,7 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
82
82
  function enhanceTreeNodes(children) {
83
83
  return React__default["default"].Children.map(children, node => {
84
84
  if (! /*#__PURE__*/React__default["default"].isValidElement(node)) return node;
85
- const isTreeNode = node.type.displayName === 'TreeNode';
85
+ const isTreeNode = node.type === TreeNode;
86
86
  if (isTreeNode) {
87
87
  return /*#__PURE__*/React__default["default"].cloneElement(node, {
88
88
  active,