@carbon/react 1.85.1 → 1.86.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 (189) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +842 -842
  2. package/es/components/AILabel/index.js +1 -1
  3. package/es/components/Accordion/AccordionItem.d.ts +1 -1
  4. package/es/components/Accordion/AccordionItem.js +1 -1
  5. package/es/components/Checkbox/Checkbox.js +1 -1
  6. package/es/components/CheckboxGroup/CheckboxGroup.js +1 -1
  7. package/es/components/CodeSnippet/CodeSnippet.d.ts +2 -2
  8. package/es/components/CodeSnippet/CodeSnippet.js +1 -1
  9. package/es/components/ComboBox/ComboBox.js +1 -1
  10. package/es/components/ComposedModal/ComposedModal.js +1 -1
  11. package/es/components/ContentSwitcher/ContentSwitcher.d.ts +1 -1
  12. package/es/components/ContentSwitcher/ContentSwitcher.js +1 -1
  13. package/es/components/DataTable/DataTable.d.ts +230 -170
  14. package/es/components/DataTable/DataTable.js +508 -519
  15. package/es/components/DataTable/TableContainer.d.ts +9 -1
  16. package/es/components/DataTable/TableContainer.js +7 -1
  17. package/es/components/DataTable/TableExpandHeader.d.ts +1 -1
  18. package/es/components/DataTable/TableExpandHeader.js +1 -1
  19. package/es/components/DataTable/TableSelectAll.d.ts +2 -2
  20. package/es/components/DataTable/TableSelectAll.js +1 -1
  21. package/es/components/DataTable/TableSelectRow.d.ts +2 -2
  22. package/es/components/DataTable/TableSelectRow.js +1 -1
  23. package/es/components/DataTable/TableToolbar.d.ts +1 -1
  24. package/es/components/DataTable/TableToolbar.js +1 -1
  25. package/es/components/DataTable/TableToolbarMenu.d.ts +2 -18
  26. package/es/components/DataTable/TableToolbarMenu.js +0 -1
  27. package/es/components/DataTable/index.d.ts +1 -1
  28. package/es/components/DataTable/state/getDerivedStateFromProps.js +5 -1
  29. package/es/components/DatePicker/DatePicker.js +1 -1
  30. package/es/components/DatePickerInput/DatePickerInput.js +1 -1
  31. package/es/components/Dropdown/Dropdown.js +1 -1
  32. package/es/components/FeatureFlags/index.d.ts +2 -2
  33. package/es/components/FeatureFlags/index.js +1 -1
  34. package/es/components/FileUploader/FileUploaderButton.d.ts +1 -1
  35. package/es/components/FileUploader/FileUploaderButton.js +1 -1
  36. package/es/components/FileUploader/FileUploaderDropContainer.d.ts +2 -2
  37. package/es/components/FileUploader/FileUploaderDropContainer.js +1 -1
  38. package/es/components/FluidTextArea/FluidTextArea.d.ts +1 -1
  39. package/es/components/FluidTextArea/FluidTextArea.js +1 -1
  40. package/es/components/InlineCheckbox/InlineCheckbox.js +1 -1
  41. package/es/components/ListBox/ListBox.js +1 -1
  42. package/es/components/Loading/Loading.d.ts +1 -1
  43. package/es/components/Loading/Loading.js +1 -1
  44. package/es/components/Menu/Menu.js +1 -1
  45. package/es/components/Modal/Modal.js +1 -1
  46. package/es/components/MultiSelect/FilterableMultiSelect.js +2 -2
  47. package/es/components/MultiSelect/MultiSelect.js +1 -1
  48. package/es/components/Notification/Notification.d.ts +4 -4
  49. package/es/components/Notification/Notification.js +1 -1
  50. package/es/components/NumberInput/NumberInput.d.ts +7 -0
  51. package/es/components/NumberInput/NumberInput.js +80 -25
  52. package/es/components/OverflowMenu/OverflowMenu.d.ts +2 -6
  53. package/es/components/OverflowMenu/OverflowMenu.js +1 -1
  54. package/es/components/Pagination/Pagination.js +22 -5
  55. package/es/components/RadioButton/RadioButton.js +1 -1
  56. package/es/components/RadioButtonGroup/RadioButtonGroup.js +1 -1
  57. package/es/components/RadioTile/RadioTile.js +1 -1
  58. package/es/components/Search/Search.js +1 -1
  59. package/es/components/Select/Select.js +1 -1
  60. package/es/components/Slider/Slider.js +1 -1
  61. package/es/components/StructuredList/StructuredList.d.ts +5 -5
  62. package/es/components/StructuredList/StructuredList.js +1 -1
  63. package/es/components/Tabs/Tabs.d.ts +1 -1
  64. package/es/components/Tabs/Tabs.js +1 -1
  65. package/es/components/Tag/DismissibleTag.js +1 -1
  66. package/es/components/Tag/Tag.js +1 -1
  67. package/es/components/TextArea/TextArea.js +1 -1
  68. package/es/components/TextInput/ControlledPasswordInput.js +1 -1
  69. package/es/components/TextInput/PasswordInput.js +1 -1
  70. package/es/components/TextInput/TextInput.js +1 -1
  71. package/es/components/Tile/Tile.js +1 -1
  72. package/es/components/TileGroup/TileGroup.d.ts +5 -5
  73. package/es/components/TimePicker/TimePicker.d.ts +8 -0
  74. package/es/components/TimePicker/TimePicker.js +6 -4
  75. package/es/components/Tooltip/DefinitionTooltip.d.ts +1 -1
  76. package/es/components/Tooltip/DefinitionTooltip.js +1 -1
  77. package/es/components/TreeView/TreeContext.d.ts +19 -0
  78. package/es/components/TreeView/TreeContext.js +13 -0
  79. package/es/components/TreeView/TreeNode.d.ts +4 -4
  80. package/es/components/TreeView/TreeNode.js +56 -108
  81. package/es/components/TreeView/TreeView.js +42 -79
  82. package/es/components/UIShell/HeaderMenu.js +1 -1
  83. package/es/components/UIShell/HeaderMenuItem.d.ts +1 -1
  84. package/es/components/UIShell/HeaderMenuItem.js +1 -1
  85. package/es/components/UIShell/HeaderName.d.ts +1 -1
  86. package/es/components/UIShell/Link.d.ts +2 -2
  87. package/es/components/UIShell/Link.js +1 -1
  88. package/es/components/UIShell/Switcher.d.ts +1 -1
  89. package/es/components/UIShell/Switcher.js +39 -12
  90. package/es/index.js +1 -1
  91. package/es/internal/useNoInteractiveChildren.d.ts +25 -0
  92. package/es/internal/useNoInteractiveChildren.js +39 -32
  93. package/es/prop-types/deprecate.d.ts +17 -0
  94. package/es/prop-types/deprecate.js +22 -12
  95. package/lib/components/AILabel/index.js +2 -2
  96. package/lib/components/Accordion/AccordionItem.d.ts +1 -1
  97. package/lib/components/Accordion/AccordionItem.js +1 -1
  98. package/lib/components/Checkbox/Checkbox.js +1 -1
  99. package/lib/components/CheckboxGroup/CheckboxGroup.js +1 -1
  100. package/lib/components/CodeSnippet/CodeSnippet.d.ts +2 -2
  101. package/lib/components/CodeSnippet/CodeSnippet.js +2 -2
  102. package/lib/components/ComboBox/ComboBox.js +3 -3
  103. package/lib/components/ComposedModal/ComposedModal.js +1 -1
  104. package/lib/components/ContentSwitcher/ContentSwitcher.d.ts +1 -1
  105. package/lib/components/ContentSwitcher/ContentSwitcher.js +1 -1
  106. package/lib/components/DataTable/DataTable.d.ts +230 -170
  107. package/lib/components/DataTable/DataTable.js +507 -518
  108. package/lib/components/DataTable/TableContainer.d.ts +9 -1
  109. package/lib/components/DataTable/TableContainer.js +7 -1
  110. package/lib/components/DataTable/TableExpandHeader.d.ts +1 -1
  111. package/lib/components/DataTable/TableExpandHeader.js +1 -1
  112. package/lib/components/DataTable/TableSelectAll.d.ts +2 -2
  113. package/lib/components/DataTable/TableSelectAll.js +1 -1
  114. package/lib/components/DataTable/TableSelectRow.d.ts +2 -2
  115. package/lib/components/DataTable/TableSelectRow.js +1 -1
  116. package/lib/components/DataTable/TableToolbar.d.ts +1 -1
  117. package/lib/components/DataTable/TableToolbar.js +1 -1
  118. package/lib/components/DataTable/TableToolbarMenu.d.ts +2 -18
  119. package/lib/components/DataTable/TableToolbarMenu.js +0 -1
  120. package/lib/components/DataTable/index.d.ts +1 -1
  121. package/lib/components/DataTable/state/getDerivedStateFromProps.js +5 -1
  122. package/lib/components/DatePicker/DatePicker.js +1 -1
  123. package/lib/components/DatePickerInput/DatePickerInput.js +1 -1
  124. package/lib/components/Dropdown/Dropdown.js +3 -3
  125. package/lib/components/FeatureFlags/index.d.ts +2 -2
  126. package/lib/components/FeatureFlags/index.js +1 -1
  127. package/lib/components/FileUploader/FileUploaderButton.d.ts +1 -1
  128. package/lib/components/FileUploader/FileUploaderButton.js +1 -1
  129. package/lib/components/FileUploader/FileUploaderDropContainer.d.ts +2 -2
  130. package/lib/components/FileUploader/FileUploaderDropContainer.js +2 -2
  131. package/lib/components/FluidTextArea/FluidTextArea.d.ts +1 -1
  132. package/lib/components/FluidTextArea/FluidTextArea.js +1 -1
  133. package/lib/components/InlineCheckbox/InlineCheckbox.js +1 -1
  134. package/lib/components/ListBox/ListBox.js +1 -1
  135. package/lib/components/Loading/Loading.d.ts +1 -1
  136. package/lib/components/Loading/Loading.js +1 -1
  137. package/lib/components/Menu/Menu.js +1 -1
  138. package/lib/components/Modal/Modal.js +1 -1
  139. package/lib/components/MultiSelect/FilterableMultiSelect.js +5 -5
  140. package/lib/components/MultiSelect/MultiSelect.js +2 -2
  141. package/lib/components/Notification/Notification.d.ts +4 -4
  142. package/lib/components/Notification/Notification.js +4 -4
  143. package/lib/components/NumberInput/NumberInput.d.ts +7 -0
  144. package/lib/components/NumberInput/NumberInput.js +81 -26
  145. package/lib/components/OverflowMenu/OverflowMenu.d.ts +2 -6
  146. package/lib/components/OverflowMenu/OverflowMenu.js +2 -2
  147. package/lib/components/Pagination/Pagination.js +21 -4
  148. package/lib/components/RadioButton/RadioButton.js +1 -1
  149. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +1 -1
  150. package/lib/components/RadioTile/RadioTile.js +2 -2
  151. package/lib/components/Search/Search.js +1 -1
  152. package/lib/components/Select/Select.js +2 -2
  153. package/lib/components/Slider/Slider.js +1 -1
  154. package/lib/components/StructuredList/StructuredList.d.ts +5 -5
  155. package/lib/components/StructuredList/StructuredList.js +4 -4
  156. package/lib/components/Tabs/Tabs.d.ts +1 -1
  157. package/lib/components/Tabs/Tabs.js +1 -1
  158. package/lib/components/Tag/DismissibleTag.js +1 -1
  159. package/lib/components/Tag/Tag.js +4 -4
  160. package/lib/components/TextArea/TextArea.js +2 -2
  161. package/lib/components/TextInput/ControlledPasswordInput.js +1 -1
  162. package/lib/components/TextInput/PasswordInput.js +1 -1
  163. package/lib/components/TextInput/TextInput.js +2 -2
  164. package/lib/components/Tile/Tile.js +9 -9
  165. package/lib/components/TileGroup/TileGroup.d.ts +5 -5
  166. package/lib/components/TimePicker/TimePicker.d.ts +8 -0
  167. package/lib/components/TimePicker/TimePicker.js +6 -4
  168. package/lib/components/Tooltip/DefinitionTooltip.d.ts +1 -1
  169. package/lib/components/Tooltip/DefinitionTooltip.js +1 -1
  170. package/lib/components/TreeView/TreeContext.d.ts +19 -0
  171. package/lib/components/TreeView/TreeContext.js +18 -0
  172. package/lib/components/TreeView/TreeNode.d.ts +4 -4
  173. package/lib/components/TreeView/TreeNode.js +55 -107
  174. package/lib/components/TreeView/TreeView.js +41 -78
  175. package/lib/components/UIShell/HeaderMenu.js +1 -1
  176. package/lib/components/UIShell/HeaderMenuItem.d.ts +1 -1
  177. package/lib/components/UIShell/HeaderMenuItem.js +1 -1
  178. package/lib/components/UIShell/HeaderName.d.ts +1 -1
  179. package/lib/components/UIShell/Link.d.ts +2 -2
  180. package/lib/components/UIShell/Link.js +1 -1
  181. package/lib/components/UIShell/Switcher.d.ts +1 -1
  182. package/lib/components/UIShell/Switcher.js +38 -11
  183. package/lib/index.js +1 -1
  184. package/lib/internal/useNoInteractiveChildren.d.ts +25 -0
  185. package/lib/internal/useNoInteractiveChildren.js +39 -32
  186. package/lib/prop-types/deprecate.d.ts +17 -0
  187. package/lib/prop-types/deprecate.js +22 -12
  188. package/package.json +3 -3
  189. package/telemetry.yml +15 -14
@@ -86,11 +86,11 @@ Tile.propTypes = {
86
86
  *
87
87
  * @deprecated
88
88
  */
89
- light: deprecate["default"](PropTypes__default["default"].bool, 'The `light` prop for `Tile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
89
+ light: deprecate.deprecate(PropTypes__default["default"].bool, 'The `light` prop for `Tile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
90
90
  /**
91
91
  * **Experimental**: Provide a `Slug` component to be rendered inside the `Tile` component
92
92
  */
93
- slug: deprecate["default"](PropTypes__default["default"].node, 'The `slug` prop for `Tile` has ' + 'been deprecated in favor of the new `decorator` prop. It will be removed in the next major release.')
93
+ slug: deprecate.deprecate(PropTypes__default["default"].node, 'The `slug` prop for `Tile` has ' + 'been deprecated in favor of the new `decorator` prop. It will be removed in the next major release.')
94
94
  };
95
95
  const ClickableTile = /*#__PURE__*/React__default["default"].forwardRef(function ClickableTile({
96
96
  children,
@@ -197,7 +197,7 @@ ClickableTile.propTypes = {
197
197
  * `true` to use the light version. For use on $ui-01 backgrounds only.
198
198
  * Don't use this to make tile background color same as container background color.
199
199
  */
200
- light: deprecate["default"](PropTypes__default["default"].bool, 'The `light` prop for `ClickableTile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
200
+ light: deprecate.deprecate(PropTypes__default["default"].bool, 'The `light` prop for `ClickableTile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
201
201
  /**
202
202
  * Specify the function to run when the ClickableTile is clicked
203
203
  */
@@ -334,12 +334,12 @@ SelectableTile.propTypes = {
334
334
  * `true` to use the light version. For use on $ui-01 backgrounds only.
335
335
  * Don't use this to make tile background color same as container background color.
336
336
  */
337
- light: deprecate["default"](PropTypes__default["default"].bool, 'The `light` prop for `SelectableTile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
337
+ light: deprecate.deprecate(PropTypes__default["default"].bool, 'The `light` prop for `SelectableTile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
338
338
  /**
339
339
  * The `name` of the `<input>`.
340
340
  * @deprecated
341
341
  */
342
- name: deprecate["default"](PropTypes__default["default"].string, 'The `name` property is no longer used. It will be removed in the next major release.'),
342
+ name: deprecate.deprecate(PropTypes__default["default"].string, 'The `name` property is no longer used. It will be removed in the next major release.'),
343
343
  /**
344
344
  * The empty handler of the `<input>`.
345
345
  */
@@ -359,7 +359,7 @@ SelectableTile.propTypes = {
359
359
  /**
360
360
  * **Experimental**: Provide a `Slug` component to be rendered inside the `SelectableTile` component
361
361
  */
362
- slug: deprecate["default"](PropTypes__default["default"].node, 'The `slug` prop for `SelectableTile` has ' + 'been deprecated in favor of the new `decorator` prop. It will be removed in the next major release.'),
362
+ slug: deprecate.deprecate(PropTypes__default["default"].node, 'The `slug` prop for `SelectableTile` has ' + 'been deprecated in favor of the new `decorator` prop. It will be removed in the next major release.'),
363
363
  /**
364
364
  * Specify the tab index of the wrapper element
365
365
  */
@@ -372,7 +372,7 @@ SelectableTile.propTypes = {
372
372
  * The value of the `<input>`.
373
373
  * @deprecated
374
374
  */
375
- value: deprecate["default"](PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].number]), 'The `value` property is no longer used. It will be removed in the next major release.`')
375
+ value: deprecate.deprecate(PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].number]), 'The `value` property is no longer used. It will be removed in the next major release.`')
376
376
  };
377
377
  const ExpandableTile = /*#__PURE__*/React__default["default"].forwardRef(function ExpandableTile({
378
378
  tabIndex = 0,
@@ -584,7 +584,7 @@ ExpandableTile.propTypes = {
584
584
  * `true` to use the light version. For use on $ui-01 backgrounds only.
585
585
  * Don't use this to make tile background color same as container background color.
586
586
  */
587
- light: deprecate["default"](PropTypes__default["default"].bool, 'The `light` prop for `ExpandableTile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
587
+ light: deprecate.deprecate(PropTypes__default["default"].bool, 'The `light` prop for `ExpandableTile` is no longer needed and has been deprecated. It will be removed in the next major release. Use the Layer component instead.'),
588
588
  /**
589
589
  * Specify the function to run when the ExpandableTile is clicked
590
590
  */
@@ -596,7 +596,7 @@ ExpandableTile.propTypes = {
596
596
  /**
597
597
  * **Experimental**: Provide a `Slug` component to be rendered inside the `ExpandableTile` component
598
598
  */
599
- slug: deprecate["default"](PropTypes__default["default"].node, 'The `slug` prop for `ExpandableTile` has ' + 'been deprecated in favor of the new `decorator` prop. It will be removed in the next major release.'),
599
+ slug: deprecate.deprecate(PropTypes__default["default"].node, 'The `slug` prop for `ExpandableTile` has ' + 'been deprecated in favor of the new `decorator` prop. It will be removed in the next major release.'),
600
600
  /**
601
601
  * The `tabindex` attribute.
602
602
  */
@@ -7,7 +7,7 @@
7
7
  import PropTypes from 'prop-types';
8
8
  import { type HTMLAttributes, type ReactNode } from 'react';
9
9
  type ExcludedAttributes = 'onChange';
10
- export interface TileGroupProps extends Omit<HTMLAttributes<HTMLFieldSetElement>, ExcludedAttributes> {
10
+ export interface TileGroupProps<T = string | number> extends Omit<HTMLAttributes<HTMLFieldSetElement>, ExcludedAttributes> {
11
11
  /**
12
12
  * Provide a collection of <RadioTile> components to render in the group
13
13
  */
@@ -19,7 +19,7 @@ export interface TileGroupProps extends Omit<HTMLAttributes<HTMLFieldSetElement>
19
19
  /**
20
20
  * Specify the the value of <RadioTile> to be selected by default
21
21
  */
22
- defaultSelected?: string | number;
22
+ defaultSelected?: T;
23
23
  /**
24
24
  * Specify whether the group is disabled
25
25
  */
@@ -35,18 +35,18 @@ export interface TileGroupProps extends Omit<HTMLAttributes<HTMLFieldSetElement>
35
35
  /**
36
36
  * Provide an optional `onChange` hook that is called whenever the value of the group changes
37
37
  */
38
- onChange?: (selection: unknown, name: string, evt: unknown) => void;
38
+ onChange?: (selection: T, name: string, evt: unknown) => void;
39
39
  /**
40
40
  * Specify the value that is currently selected in the group
41
41
  */
42
- valueSelected?: string | number;
42
+ valueSelected?: T;
43
43
  /**
44
44
  * `true` to specify if input selection in group is required.
45
45
  */
46
46
  required?: boolean;
47
47
  }
48
48
  export declare const TileGroup: {
49
- ({ children, className, defaultSelected, disabled, legend, name, onChange, valueSelected, required, }: TileGroupProps): import("react/jsx-runtime").JSX.Element;
49
+ <T extends string | number = string>({ children, className, defaultSelected, disabled, legend, name, onChange, valueSelected, required, }: TileGroupProps<T>): import("react/jsx-runtime").JSX.Element;
50
50
  displayName: string;
51
51
  propTypes: {
52
52
  /**
@@ -15,6 +15,14 @@ export interface TimePickerProps extends Omit<HTMLAttributes<HTMLInputElement>,
15
15
  * Specify an optional className to be applied to the container node
16
16
  */
17
17
  className?: string;
18
+ /**
19
+ * Specify an optional className to be applied to the `<input>` node
20
+ */
21
+ inputClassName?: string;
22
+ /**
23
+ * Specify an optional className to be applied to the container that wraps the `<input>` and select option
24
+ */
25
+ pickerClassName?: string;
18
26
  /**
19
27
  * Specify whether the `<input>` should be disabled
20
28
  */
@@ -28,6 +28,8 @@ const TimePicker = frFn((props, ref) => {
28
28
  const {
29
29
  children,
30
30
  className,
31
+ inputClassName,
32
+ pickerClassName,
31
33
  disabled = false,
32
34
  hideLabel,
33
35
  id,
@@ -78,7 +80,7 @@ const TimePicker = frFn((props, ref) => {
78
80
  onBlur(evt);
79
81
  }
80
82
  }
81
- const timePickerInputClasses = cx__default["default"](`${prefix}--time-picker__input-field`, `${prefix}--text-input`, [className], {
83
+ const timePickerInputClasses = cx__default["default"](`${prefix}--time-picker__input-field`, `${prefix}--text-input`, [inputClassName], {
82
84
  [`${prefix}--text-input--light`]: light,
83
85
  [`${prefix}--time-picker__input-field-error`]: invalid || warning
84
86
  });
@@ -89,8 +91,8 @@ const TimePicker = frFn((props, ref) => {
89
91
  [`${prefix}--time-picker--warning`]: warning,
90
92
  [`${prefix}--time-picker--readonly`]: readOnly,
91
93
  [`${prefix}--time-picker--${size}`]: size,
92
- ...(className && {
93
- [className]: true
94
+ ...(pickerClassName && {
95
+ [pickerClassName]: true
94
96
  })
95
97
  });
96
98
  const labelClasses = cx__default["default"](`${prefix}--label`, {
@@ -204,7 +206,7 @@ TimePicker.propTypes = {
204
206
  /**
205
207
  * The `light` prop for `TimePicker` has been deprecated. It will be removed in v12. Use the `Layer` component instead.
206
208
  */
207
- light: deprecate["default"](PropTypes__default["default"].bool, 'The `light` prop for `TimePicker` is no longer needed and has been deprecated. It will be removed in the next major release. Use the `Layer` component instead.'),
209
+ light: deprecate.deprecate(PropTypes__default["default"].bool, 'The `light` prop for `TimePicker` is no longer needed and has been deprecated. It will be removed in the next major release. Use the `Layer` component instead.'),
208
210
  /**
209
211
  * Specify the maximum length of the time string in `<input>`
210
212
  */
@@ -1,5 +1,5 @@
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.
@@ -145,7 +145,7 @@ DefinitionTooltip.propTypes = {
145
145
  *
146
146
  * Provide the text that will be displayed in the tooltip when it is rendered.
147
147
  */
148
- tooltipText: deprecate["default"](PropTypes__default["default"].node, 'The tooltipText prop has been deprecated. Please use the `definition` prop instead.'),
148
+ tooltipText: deprecate.deprecate(PropTypes__default["default"].node, 'The tooltipText prop has been deprecated. Please use the `definition` prop instead.'),
149
149
  /**
150
150
  * The CSS class name of the trigger element
151
151
  */
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright IBM Corp. 2016, 2025
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 MouseEvent } from 'react';
8
+ import type { TreeNodeProps } from './TreeNode';
9
+ interface TreeContextProps {
10
+ active?: string | number;
11
+ multiselect?: boolean;
12
+ onActivate?: (nodeId?: string | number) => void;
13
+ onTreeSelect?: (event: MouseEvent, node?: Partial<TreeNodeProps>) => void;
14
+ selected?: Array<string | number>;
15
+ size?: 'xs' | 'sm';
16
+ }
17
+ export declare const TreeContext: import("react").Context<TreeContextProps | null>;
18
+ export declare const DepthContext: import("react").Context<number>;
19
+ export {};
@@ -0,0 +1,18 @@
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
+ Object.defineProperty(exports, '__esModule', { value: true });
11
+
12
+ var React = require('react');
13
+
14
+ const TreeContext = /*#__PURE__*/React.createContext(null);
15
+ const DepthContext = /*#__PURE__*/React.createContext(-1);
16
+
17
+ exports.DepthContext = DepthContext;
18
+ exports.TreeContext = TreeContext;
@@ -52,11 +52,11 @@ export type TreeNodeProps = {
52
52
  /**
53
53
  * Callback function for when the node is selected
54
54
  */
55
- onSelect?: (event: React.MouseEvent, node?: TreeNodeProps) => void;
55
+ onSelect?: (event: React.MouseEvent, node?: Omit<TreeNodeProps, 'children'>) => void;
56
56
  /**
57
57
  * Callback function for when a parent node is expanded or collapsed
58
58
  */
59
- onToggle?: (event: React.MouseEvent, node?: TreeNodeProps) => void;
59
+ onToggle?: (event: React.MouseEvent | React.KeyboardEvent, node?: Omit<TreeNodeProps, 'children'>) => void;
60
60
  /**
61
61
  * Callback function for when any node in the tree is selected
62
62
  */
@@ -137,11 +137,11 @@ declare const TreeNode: React.ForwardRefExoticComponent<{
137
137
  /**
138
138
  * Callback function for when the node is selected
139
139
  */
140
- onSelect?: (event: React.MouseEvent, node?: TreeNodeProps) => void;
140
+ onSelect?: (event: React.MouseEvent, node?: Omit<TreeNodeProps, "children">) => void;
141
141
  /**
142
142
  * Callback function for when a parent node is expanded or collapsed
143
143
  */
144
- onToggle?: (event: React.MouseEvent, node?: TreeNodeProps) => void;
144
+ onToggle?: (event: React.MouseEvent | React.KeyboardEvent, node?: Omit<TreeNodeProps, "children">) => void;
145
145
  /**
146
146
  * Callback function for when any node in the tree is selected
147
147
  */
@@ -21,6 +21,7 @@ var usePrefix = require('../../internal/usePrefix.js');
21
21
  var useId = require('../../internal/useId.js');
22
22
  var index = require('../FeatureFlags/index.js');
23
23
  var index$1 = require('../IconButton/index.js');
24
+ var TreeContext = require('./TreeContext.js');
24
25
 
25
26
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
26
27
 
@@ -97,29 +98,36 @@ const useEllipsisCheck = (label, detailsWrapperRef) => {
97
98
  };
98
99
  };
99
100
  const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
100
- active,
101
101
  children,
102
102
  className,
103
- depth: propDepth,
104
103
  disabled,
105
104
  id: nodeId,
106
105
  isExpanded,
107
106
  defaultIsExpanded,
108
107
  label,
109
- onNodeFocusEvent,
110
108
  onSelect: onNodeSelect,
111
109
  onToggle,
112
- onTreeSelect,
113
110
  renderIcon: Icon,
114
- selected: propSelected,
115
111
  value,
116
112
  href,
117
113
  align = 'bottom',
118
114
  autoAlign = false,
115
+ // These props are fallback props if the TreeContext is not available or only TreeNode is used as a standalone component
116
+ active: propActive,
117
+ depth: propDepth,
118
+ selected: propSelected,
119
+ onTreeSelect: propOnTreeSelect,
120
+ onNodeFocusEvent,
119
121
  ...rest
120
122
  }, forwardedRef) => {
121
- const depth = propDepth;
122
- const selected = propSelected;
123
+ const treeContext = React.useContext(TreeContext.TreeContext);
124
+ const contextDepth = React.useContext(TreeContext.DepthContext);
125
+
126
+ // Prioritize direct props, and fall back to context values.
127
+ const depth = propDepth ?? (contextDepth !== -1 ? contextDepth : 0);
128
+ const active = propActive ?? treeContext?.active;
129
+ const selected = propSelected ?? treeContext?.selected ?? [];
130
+ const onTreeSelect = propOnTreeSelect ?? treeContext?.onTreeSelect;
123
131
  const detailsWrapperRef = React.useRef(null);
124
132
  const {
125
133
  labelTextRef,
@@ -174,30 +182,8 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
174
182
  forwardedRef.current = element;
175
183
  }
176
184
  };
177
- function enhanceTreeNodes(children) {
178
- return React__default["default"].Children.map(children, node => {
179
- if (! /*#__PURE__*/React__default["default"].isValidElement(node)) return node;
180
- const isTreeNode = node.type === TreeNode;
181
- if (isTreeNode) {
182
- return /*#__PURE__*/React__default["default"].cloneElement(node, {
183
- active,
184
- depth: depth + 1,
185
- disabled: disabled || node.props.disabled,
186
- onTreeSelect,
187
- onNodeFocusEvent,
188
- selected,
189
- tabIndex: node.props.disabled ? null : -1
190
- });
191
- }
192
- const newChildren = enhanceTreeNodes(node.props.children);
193
- return /*#__PURE__*/React__default["default"].cloneElement(node, {
194
- children: newChildren
195
- });
196
- });
197
- }
198
- const nodesWithProps = enhanceTreeNodes(children);
199
185
  const isActive = active === id;
200
- const isSelected = selected.includes(id);
186
+ const isSelected = selected?.includes(id) ?? false;
201
187
  const treeNodeClasses = cx__default["default"](className, `${prefix}--tree-node`, {
202
188
  [`${prefix}--tree-node--active`]: isActive,
203
189
  [`${prefix}--tree-node--disabled`]: disabled,
@@ -299,7 +285,7 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
299
285
  * When focus is on an expanded parent node, move focus to the first
300
286
  * child node
301
287
  */
302
- getFocusableNode(href ? currentNode.current?.parentElement?.lastChild?.firstChild : currentNode.current?.lastChild?.firstChild).focus();
288
+ getFocusableNode(href ? currentNode.current?.parentElement?.lastChild?.firstChild : currentNode.current?.lastChild?.firstChild)?.focus();
303
289
  } else {
304
290
  if (!enableTreeviewControllable) {
305
291
  onToggle?.(event, {
@@ -334,12 +320,12 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
334
320
  rest?.onKeyDown?.(event);
335
321
  }
336
322
  function handleFocusEvent(event) {
337
- if (event.type === 'blur') {
338
- rest?.onBlur?.(event);
339
- }
340
323
  if (event.type === 'focus') {
341
324
  rest?.onFocus?.(event);
342
325
  }
326
+ if (event.type === 'blur') {
327
+ rest?.onBlur?.(event);
328
+ }
343
329
  onNodeFocusEvent?.(event);
344
330
  }
345
331
  React.useEffect(() => {
@@ -379,6 +365,7 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
379
365
  setExpanded(isExpanded ?? false);
380
366
  }
381
367
  }, [children, depth, Icon, isExpanded, enableTreeviewControllable, setExpanded]);
368
+ const tabIndex = disabled ? undefined : rest.tabIndex ?? -1;
382
369
  const treeNodeProps = {
383
370
  ...rest,
384
371
  ['aria-current']: !href ? isActive || undefined : isActive ? 'page' : undefined,
@@ -387,95 +374,56 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
387
374
  ['aria-owns']: children ? `${id}-subtree` : undefined,
388
375
  className: treeNodeClasses,
389
376
  id,
390
- onBlur: handleFocusEvent,
391
377
  onClick: handleClick,
392
- onFocus: handleFocusEvent,
393
378
  onKeyDown: handleKeyDown,
394
- role: 'treeitem'
379
+ role: 'treeitem',
380
+ tabIndex,
381
+ onFocus: handleFocusEvent,
382
+ onBlur: handleFocusEvent
395
383
  };
396
- if (!children) {
397
- if (href) {
398
- return /*#__PURE__*/React__default["default"].createElement("li", {
399
- role: "none"
400
- }, /*#__PURE__*/React__default["default"].createElement("a", _rollupPluginBabelHelpers["extends"]({}, treeNodeProps, {
401
- ref: setRefs,
402
- href: !disabled ? href : undefined
403
- }), /*#__PURE__*/React__default["default"].createElement("div", {
404
- className: `${prefix}--tree-node__label`,
405
- ref: currentNodeLabel
406
- }, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
407
- className: `${prefix}--tree-node__icon`
408
- }), renderLabelText())));
409
- } else {
410
- return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({}, treeNodeProps, {
411
- ref: setRefs
412
- }), /*#__PURE__*/React__default["default"].createElement("div", {
413
- className: `${prefix}--tree-node__label`,
414
- ref: currentNodeLabel
415
- }, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
416
- className: `${prefix}--tree-node__icon`
417
- }), renderLabelText()));
418
- }
419
- }
384
+ const nodeContent = /*#__PURE__*/React__default["default"].createElement("div", {
385
+ className: `${prefix}--tree-node__label`,
386
+ ref: currentNodeLabel
387
+ }, children && /*#__PURE__*/React__default["default"].createElement("span", {
388
+ className: `${prefix}--tree-parent-node__toggle`,
389
+ onClick: handleToggleClick
390
+ }, /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretDown, {
391
+ className: toggleClasses
392
+ })), /*#__PURE__*/React__default["default"].createElement("span", {
393
+ className: `${prefix}--tree-node__label__details`
394
+ }, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
395
+ className: `${prefix}--tree-node__icon`
396
+ }), renderLabelText()));
420
397
  if (href) {
421
398
  return /*#__PURE__*/React__default["default"].createElement("li", {
422
399
  role: "none",
423
- className: `${prefix}--tree-node-link-parent`
400
+ className: children ? `${prefix}--tree-node-link-parent` : ''
424
401
  }, /*#__PURE__*/React__default["default"].createElement("a", _rollupPluginBabelHelpers["extends"]({}, treeNodeProps, {
425
402
  "aria-expanded": !!expanded,
426
403
  ref: setRefs,
427
404
  href: !disabled ? href : undefined
428
- }), /*#__PURE__*/React__default["default"].createElement("div", {
429
- className: `${prefix}--tree-node__label`,
430
- ref: currentNodeLabel
431
- }, /*#__PURE__*/React__default["default"].createElement("span", {
432
- className: `${prefix}--tree-parent-node__toggle`
433
- // @ts-ignore
434
- ,
435
- disabled: disabled,
436
- onClick: handleToggleClick
437
- }, /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretDown, {
438
- className: toggleClasses
439
- })), /*#__PURE__*/React__default["default"].createElement("span", {
440
- className: `${prefix}--tree-node__label__details`,
441
- ref: detailsWrapperRef
442
- }, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
443
- className: `${prefix}--tree-node__icon`
444
- }), renderLabelText()))), /*#__PURE__*/React__default["default"].createElement("ul", {
445
- id: `${id}-subtree`,
446
- role: "group",
447
- className: cx__default["default"](`${prefix}--tree-node__children`, {
448
- [`${prefix}--tree-node--hidden`]: !expanded
449
- })
450
- }, nodesWithProps));
451
- } else {
452
- return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({}, treeNodeProps, {
453
- "aria-expanded": !!expanded,
454
- ref: setRefs
455
- }), /*#__PURE__*/React__default["default"].createElement("div", {
456
- className: `${prefix}--tree-node__label`,
457
- ref: currentNodeLabel
458
- }, /*#__PURE__*/React__default["default"].createElement("span", {
459
- className: `${prefix}--tree-parent-node__toggle`
460
- // @ts-ignore
461
- ,
462
- disabled: disabled,
463
- onClick: handleToggleClick
464
- }, /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretDown, {
465
- className: toggleClasses
466
- })), /*#__PURE__*/React__default["default"].createElement("span", {
467
- className: `${prefix}--tree-node__label__details`,
468
- ref: detailsWrapperRef
469
- }, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
470
- className: `${prefix}--tree-node__icon`
471
- }), renderLabelText())), /*#__PURE__*/React__default["default"].createElement("ul", {
405
+ }), nodeContent), children && /*#__PURE__*/React__default["default"].createElement("ul", {
472
406
  id: `${id}-subtree`,
473
407
  role: "group",
474
408
  className: cx__default["default"](`${prefix}--tree-node__children`, {
475
409
  [`${prefix}--tree-node--hidden`]: !expanded
476
410
  })
477
- }, nodesWithProps));
411
+ }, /*#__PURE__*/React__default["default"].createElement(TreeContext.DepthContext.Provider, {
412
+ value: depth + 1
413
+ }, children)));
478
414
  }
415
+ return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({}, treeNodeProps, {
416
+ "aria-expanded": children ? !!expanded : undefined,
417
+ ref: setRefs
418
+ }), nodeContent, children && /*#__PURE__*/React__default["default"].createElement("ul", {
419
+ id: `${id}-subtree`,
420
+ role: "group",
421
+ className: cx__default["default"](`${prefix}--tree-node__children`, {
422
+ [`${prefix}--tree-node--hidden`]: !expanded
423
+ })
424
+ }, /*#__PURE__*/React__default["default"].createElement(TreeContext.DepthContext.Provider, {
425
+ value: depth + 1
426
+ }, children)));
479
427
  });
480
428
  TreeNode.propTypes = {
481
429
  /**