@carbon/react 1.78.0-rc.0 → 1.78.1

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 (231) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +851 -816
  2. package/es/components/Accordion/AccordionItem.js +2 -2
  3. package/es/components/Button/Button.d.ts +2 -3
  4. package/es/components/Button/Button.js +1 -2
  5. package/es/components/Button/ButtonBase.js +1 -1
  6. package/es/components/ChatButton/ChatButton.d.ts +2 -3
  7. package/es/components/ChatButton/ChatButton.js +1 -2
  8. package/es/components/ComboBox/ComboBox.js +40 -30
  9. package/es/components/ComboButton/index.js +0 -1
  10. package/es/components/ComposedModal/ComposedModal.js +65 -51
  11. package/es/components/ContainedList/ContainedListItem/ContainedListItem.d.ts +2 -2
  12. package/es/components/ContainedList/ContainedListItem/ContainedListItem.js +1 -1
  13. package/es/components/ContentSwitcher/ContentSwitcher.js +3 -3
  14. package/es/components/ContextMenu/useContextMenu.d.ts +0 -1
  15. package/es/components/ContextMenu/useContextMenu.js +1 -2
  16. package/es/components/DataTable/TableBatchAction.d.ts +3 -3
  17. package/es/components/DataTable/TableBatchAction.js +1 -1
  18. package/es/components/DataTable/TableContainer.d.ts +1 -1
  19. package/es/components/DataTable/TableContainer.js +3 -3
  20. package/es/components/DataTable/TableExpandHeader.d.ts +6 -5
  21. package/es/components/DataTable/TableToolbarMenu.d.ts +2 -2
  22. package/es/components/DataTable/TableToolbarMenu.js +1 -1
  23. package/es/components/DatePicker/DatePicker.js +2 -2
  24. package/es/components/DatePicker/plugins/fixEventsPlugin.js +1 -1
  25. package/es/components/Dialog/index.d.ts +42 -4
  26. package/es/components/Dialog/index.js +177 -0
  27. package/es/components/ExpandableSearch/ExpandableSearch.js +2 -2
  28. package/es/components/FeatureFlags/index.d.ts +3 -1
  29. package/es/components/FeatureFlags/index.js +3 -0
  30. package/es/components/FileUploader/FileUploader.d.ts +1 -1
  31. package/es/components/FileUploader/FileUploader.js +2 -2
  32. package/es/components/FileUploader/FileUploaderButton.js +2 -2
  33. package/es/components/FileUploader/FileUploaderDropContainer.d.ts +1 -1
  34. package/es/components/FileUploader/FileUploaderDropContainer.js +6 -4
  35. package/es/components/FileUploader/FileUploaderItem.d.ts +1 -1
  36. package/es/components/FileUploader/FileUploaderItem.js +2 -2
  37. package/es/components/Grid/CSSGrid.js +18 -14
  38. package/es/components/Grid/FlexGrid.js +7 -6
  39. package/es/components/Grid/GridTypes.d.ts +5 -3
  40. package/es/components/IconButton/index.js +3 -3
  41. package/es/components/Layer/index.d.ts +4 -6
  42. package/es/components/Layer/index.js +5 -6
  43. package/es/components/Link/Link.d.ts +2 -3
  44. package/es/components/Link/Link.js +1 -2
  45. package/es/components/ListBox/ListBoxMenuItem.d.ts +3 -3
  46. package/es/components/ListBox/ListBoxMenuItem.js +37 -15
  47. package/es/components/Menu/Menu.d.ts +1 -0
  48. package/es/components/Menu/Menu.js +7 -9
  49. package/es/components/Menu/MenuContext.d.ts +4 -4
  50. package/es/components/Menu/MenuContext.js +6 -1
  51. package/es/components/Menu/MenuItem.d.ts +2 -2
  52. package/es/components/Menu/MenuItem.js +16 -24
  53. package/es/components/MenuButton/index.js +14 -2
  54. package/es/components/Modal/Modal.js +121 -49
  55. package/es/components/ModalWrapper/ModalWrapper.js +1 -1
  56. package/es/components/MultiSelect/FilterableMultiSelect.js +3 -3
  57. package/es/components/MultiSelect/MultiSelect.js +2 -2
  58. package/es/components/Notification/Notification.d.ts +5 -13
  59. package/es/components/Notification/Notification.js +7 -9
  60. package/es/components/OverflowMenu/OverflowMenu.d.ts +4 -8
  61. package/es/components/OverflowMenu/OverflowMenu.js +3 -3
  62. package/es/components/OverflowMenu/next/index.d.ts +2 -2
  63. package/es/components/OverflowMenu/next/index.js +1 -1
  64. package/es/components/OverflowMenuItem/OverflowMenuItem.js +2 -2
  65. package/es/components/ProgressIndicator/ProgressIndicator.js +2 -2
  66. package/es/components/RadioTile/RadioTile.js +2 -2
  67. package/es/components/Search/Search.d.ts +2 -3
  68. package/es/components/Search/Search.js +4 -6
  69. package/es/components/Slider/Slider.d.ts +16 -15
  70. package/es/components/Slider/Slider.js +22 -22
  71. package/es/components/Tabs/Tabs.d.ts +3 -6
  72. package/es/components/Tabs/Tabs.js +8 -9
  73. package/es/components/Tag/DismissibleTag.d.ts +3 -5
  74. package/es/components/Tag/DismissibleTag.js +1 -2
  75. package/es/components/Tag/OperationalTag.d.ts +2 -3
  76. package/es/components/Tag/OperationalTag.js +1 -2
  77. package/es/components/Tag/SelectableTag.d.ts +3 -5
  78. package/es/components/Tag/SelectableTag.js +1 -2
  79. package/es/components/Tag/Tag.d.ts +2 -3
  80. package/es/components/Tag/Tag.js +1 -2
  81. package/es/components/Tile/Tile.d.ts +3 -5
  82. package/es/components/Tile/Tile.js +8 -6
  83. package/es/components/Toggletip/index.js +2 -2
  84. package/es/components/Tooltip/DefinitionTooltip.js +2 -2
  85. package/es/components/Tooltip/Tooltip.d.ts +1 -1
  86. package/es/components/Tooltip/Tooltip.js +2 -2
  87. package/es/components/TreeView/TreeNode.d.ts +3 -5
  88. package/es/components/TreeView/TreeNode.js +3 -4
  89. package/es/components/TreeView/TreeView.js +2 -2
  90. package/es/components/UIShell/HeaderContainer.js +2 -2
  91. package/es/components/UIShell/HeaderMenu.js +2 -2
  92. package/es/components/UIShell/HeaderPanel.js +2 -2
  93. package/es/components/UIShell/SideNav.d.ts +1 -1
  94. package/es/components/UIShell/SideNav.js +2 -2
  95. package/es/components/UIShell/SideNavHeader.d.ts +2 -3
  96. package/es/components/UIShell/SideNavHeader.js +1 -2
  97. package/es/components/UIShell/SideNavLink.d.ts +2 -2
  98. package/es/components/UIShell/SideNavLink.js +1 -1
  99. package/es/components/UIShell/SideNavMenu.d.ts +2 -2
  100. package/es/components/UIShell/SideNavMenu.js +3 -3
  101. package/es/components/UIShell/SwitcherItem.js +2 -2
  102. package/es/internal/FloatingMenu.js +4 -4
  103. package/es/internal/OptimizedResize.d.ts +18 -0
  104. package/es/internal/OptimizedResize.js +21 -24
  105. package/es/internal/keyboard/index.d.ts +9 -0
  106. package/es/internal/keyboard/keys.d.ts +23 -0
  107. package/es/internal/keyboard/keys.js +2 -2
  108. package/es/internal/keyboard/match.d.ts +26 -0
  109. package/es/internal/keyboard/match.js +17 -41
  110. package/es/internal/keyboard/navigation.d.ts +37 -0
  111. package/es/internal/keyboard/navigation.js +15 -27
  112. package/es/internal/useMergedRefs.js +3 -0
  113. package/lib/components/Accordion/AccordionItem.js +2 -2
  114. package/lib/components/Button/Button.d.ts +2 -3
  115. package/lib/components/Button/Button.js +1 -2
  116. package/lib/components/Button/ButtonBase.js +1 -1
  117. package/lib/components/ChatButton/ChatButton.d.ts +2 -3
  118. package/lib/components/ChatButton/ChatButton.js +1 -2
  119. package/lib/components/ComboBox/ComboBox.js +40 -30
  120. package/lib/components/ComboButton/index.js +0 -1
  121. package/lib/components/ComposedModal/ComposedModal.js +64 -50
  122. package/lib/components/ContainedList/ContainedListItem/ContainedListItem.d.ts +2 -2
  123. package/lib/components/ContainedList/ContainedListItem/ContainedListItem.js +1 -1
  124. package/lib/components/ContentSwitcher/ContentSwitcher.js +3 -3
  125. package/lib/components/ContextMenu/useContextMenu.d.ts +0 -1
  126. package/lib/components/ContextMenu/useContextMenu.js +1 -2
  127. package/lib/components/DataTable/TableBatchAction.d.ts +3 -3
  128. package/lib/components/DataTable/TableBatchAction.js +1 -1
  129. package/lib/components/DataTable/TableContainer.d.ts +1 -1
  130. package/lib/components/DataTable/TableContainer.js +3 -3
  131. package/lib/components/DataTable/TableExpandHeader.d.ts +6 -5
  132. package/lib/components/DataTable/TableToolbarMenu.d.ts +2 -2
  133. package/lib/components/DataTable/TableToolbarMenu.js +1 -1
  134. package/lib/components/DatePicker/DatePicker.js +2 -2
  135. package/lib/components/DatePicker/plugins/fixEventsPlugin.js +1 -1
  136. package/lib/components/Dialog/index.d.ts +42 -4
  137. package/lib/components/Dialog/index.js +190 -0
  138. package/lib/components/ExpandableSearch/ExpandableSearch.js +2 -2
  139. package/lib/components/FeatureFlags/index.d.ts +3 -1
  140. package/lib/components/FeatureFlags/index.js +3 -0
  141. package/lib/components/FileUploader/FileUploader.d.ts +1 -1
  142. package/lib/components/FileUploader/FileUploader.js +2 -2
  143. package/lib/components/FileUploader/FileUploaderButton.js +2 -2
  144. package/lib/components/FileUploader/FileUploaderDropContainer.d.ts +1 -1
  145. package/lib/components/FileUploader/FileUploaderDropContainer.js +6 -4
  146. package/lib/components/FileUploader/FileUploaderItem.d.ts +1 -1
  147. package/lib/components/FileUploader/FileUploaderItem.js +2 -2
  148. package/lib/components/Grid/CSSGrid.js +18 -14
  149. package/lib/components/Grid/FlexGrid.js +7 -6
  150. package/lib/components/Grid/GridTypes.d.ts +5 -3
  151. package/lib/components/IconButton/index.js +3 -3
  152. package/lib/components/Layer/index.d.ts +4 -6
  153. package/lib/components/Layer/index.js +5 -6
  154. package/lib/components/Link/Link.d.ts +2 -3
  155. package/lib/components/Link/Link.js +1 -2
  156. package/lib/components/ListBox/ListBoxMenuItem.d.ts +3 -3
  157. package/lib/components/ListBox/ListBoxMenuItem.js +36 -14
  158. package/lib/components/Menu/Menu.d.ts +1 -0
  159. package/lib/components/Menu/Menu.js +7 -9
  160. package/lib/components/Menu/MenuContext.d.ts +4 -4
  161. package/lib/components/Menu/MenuContext.js +6 -1
  162. package/lib/components/Menu/MenuItem.d.ts +2 -2
  163. package/lib/components/Menu/MenuItem.js +15 -23
  164. package/lib/components/MenuButton/index.js +14 -2
  165. package/lib/components/Modal/Modal.js +123 -51
  166. package/lib/components/ModalWrapper/ModalWrapper.js +1 -1
  167. package/lib/components/MultiSelect/FilterableMultiSelect.js +3 -3
  168. package/lib/components/MultiSelect/MultiSelect.js +2 -2
  169. package/lib/components/Notification/Notification.d.ts +5 -13
  170. package/lib/components/Notification/Notification.js +7 -9
  171. package/lib/components/OverflowMenu/OverflowMenu.d.ts +4 -8
  172. package/lib/components/OverflowMenu/OverflowMenu.js +3 -3
  173. package/lib/components/OverflowMenu/next/index.d.ts +2 -2
  174. package/lib/components/OverflowMenu/next/index.js +1 -1
  175. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +2 -2
  176. package/lib/components/ProgressIndicator/ProgressIndicator.js +2 -2
  177. package/lib/components/RadioTile/RadioTile.js +2 -2
  178. package/lib/components/Search/Search.d.ts +2 -3
  179. package/lib/components/Search/Search.js +4 -6
  180. package/lib/components/Slider/Slider.d.ts +16 -15
  181. package/lib/components/Slider/Slider.js +22 -22
  182. package/lib/components/Tabs/Tabs.d.ts +3 -6
  183. package/lib/components/Tabs/Tabs.js +8 -9
  184. package/lib/components/Tag/DismissibleTag.d.ts +3 -5
  185. package/lib/components/Tag/DismissibleTag.js +1 -2
  186. package/lib/components/Tag/OperationalTag.d.ts +2 -3
  187. package/lib/components/Tag/OperationalTag.js +1 -2
  188. package/lib/components/Tag/SelectableTag.d.ts +3 -5
  189. package/lib/components/Tag/SelectableTag.js +1 -2
  190. package/lib/components/Tag/Tag.d.ts +2 -3
  191. package/lib/components/Tag/Tag.js +1 -2
  192. package/lib/components/Tile/Tile.d.ts +3 -5
  193. package/lib/components/Tile/Tile.js +8 -6
  194. package/lib/components/Toggletip/index.js +2 -2
  195. package/lib/components/Tooltip/DefinitionTooltip.js +2 -2
  196. package/lib/components/Tooltip/Tooltip.d.ts +1 -1
  197. package/lib/components/Tooltip/Tooltip.js +2 -2
  198. package/lib/components/TreeView/TreeNode.d.ts +3 -5
  199. package/lib/components/TreeView/TreeNode.js +3 -4
  200. package/lib/components/TreeView/TreeView.js +2 -2
  201. package/lib/components/UIShell/HeaderContainer.js +2 -2
  202. package/lib/components/UIShell/HeaderMenu.js +2 -2
  203. package/lib/components/UIShell/HeaderPanel.js +2 -2
  204. package/lib/components/UIShell/SideNav.d.ts +1 -1
  205. package/lib/components/UIShell/SideNav.js +2 -2
  206. package/lib/components/UIShell/SideNavHeader.d.ts +2 -3
  207. package/lib/components/UIShell/SideNavHeader.js +1 -2
  208. package/lib/components/UIShell/SideNavLink.d.ts +2 -2
  209. package/lib/components/UIShell/SideNavLink.js +1 -1
  210. package/lib/components/UIShell/SideNavMenu.d.ts +2 -2
  211. package/lib/components/UIShell/SideNavMenu.js +3 -3
  212. package/lib/components/UIShell/SwitcherItem.js +2 -2
  213. package/lib/internal/FloatingMenu.js +5 -5
  214. package/lib/internal/OptimizedResize.d.ts +18 -0
  215. package/lib/internal/OptimizedResize.js +21 -24
  216. package/lib/internal/keyboard/index.d.ts +9 -0
  217. package/lib/internal/keyboard/keys.d.ts +23 -0
  218. package/lib/internal/keyboard/keys.js +2 -2
  219. package/lib/internal/keyboard/match.d.ts +26 -0
  220. package/lib/internal/keyboard/match.js +17 -41
  221. package/lib/internal/keyboard/navigation.d.ts +37 -0
  222. package/lib/internal/keyboard/navigation.js +15 -27
  223. package/lib/internal/useMergedRefs.js +3 -0
  224. package/package.json +7 -7
  225. package/scss/components/dialog/_dialog.scss +9 -0
  226. package/scss/components/dialog/_index.scss +9 -0
  227. package/telemetry.yml +1 -0
  228. package/es/components/Modal/next/index.d.ts +0 -171
  229. package/es/internal/focus/index.js +0 -15
  230. package/lib/components/Modal/next/index.d.ts +0 -171
  231. package/lib/internal/focus/index.js +0 -19
@@ -14,6 +14,7 @@ var cx = require('classnames');
14
14
  var React = require('react');
15
15
  var PropTypes = require('prop-types');
16
16
  var usePrefix = require('../../internal/usePrefix.js');
17
+ var useMergedRefs = require('../../internal/useMergedRefs.js');
17
18
 
18
19
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
19
20
 
@@ -21,24 +22,42 @@ var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
21
22
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
22
23
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
23
24
 
24
- function useIsTruncated(ref) {
25
+ /**
26
+ * Determines if the content of an element is truncated.
27
+ *
28
+ * Merges a forwarded ref with a local ref to check the element's dimensions.
29
+ *
30
+ * @template T
31
+ * @param forwardedRef - A ref passed from the parent component.
32
+ * @param deps - Dependencies to re-run the truncation check.
33
+ * @returns An object containing the truncation state and the merged ref.
34
+ */
35
+ const useIsTruncated = function (forwardedRef) {
36
+ let deps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
37
+ const localRef = React.useRef(null);
38
+ const mergedRef = useMergedRefs.useMergedRefs([...(forwardedRef ? [forwardedRef] : []), localRef]);
25
39
  const [isTruncated, setIsTruncated] = React.useState(false);
26
40
  React.useEffect(() => {
27
- const element = ref.current;
28
- const {
29
- offsetWidth,
30
- scrollWidth
31
- } = element;
32
- setIsTruncated(offsetWidth < scrollWidth);
33
- }, [ref, setIsTruncated]);
34
- return isTruncated;
35
- }
41
+ const element = localRef.current;
42
+ if (element) {
43
+ const {
44
+ offsetWidth,
45
+ scrollWidth
46
+ } = element;
47
+ setIsTruncated(offsetWidth < scrollWidth);
48
+ }
49
+ }, [localRef, ...deps]);
50
+ return {
51
+ isTruncated,
52
+ ref: mergedRef
53
+ };
54
+ };
36
55
  /**
37
56
  * `ListBoxMenuItem` is a helper component for managing the container class
38
57
  * name, alongside any classes for any corresponding states, for a generic list
39
58
  * box menu item.
40
59
  */
41
- const ListBoxMenuItem = /*#__PURE__*/React__default["default"].forwardRef(function ListBoxMenuItem(_ref, forwardedRef) {
60
+ const ListBoxMenuItem = /*#__PURE__*/React.forwardRef((_ref, forwardedRef) => {
42
61
  let {
43
62
  children,
44
63
  isActive = false,
@@ -47,8 +66,11 @@ const ListBoxMenuItem = /*#__PURE__*/React__default["default"].forwardRef(functi
47
66
  ...rest
48
67
  } = _ref;
49
68
  const prefix = usePrefix.usePrefix();
50
- const ref = React.useRef(null);
51
- const isTruncated = useIsTruncated(forwardedRef?.menuItemOptionRef || ref);
69
+ const menuItemOptionRefProp = forwardedRef && typeof forwardedRef !== 'function' ? forwardedRef.menuItemOptionRef : undefined;
70
+ const {
71
+ isTruncated,
72
+ ref: menuItemOptionRef
73
+ } = useIsTruncated(menuItemOptionRefProp, [children]);
52
74
  const className = cx__default["default"](`${prefix}--list-box__menu-item`, {
53
75
  [`${prefix}--list-box__menu-item--active`]: isActive,
54
76
  [`${prefix}--list-box__menu-item--highlighted`]: isHighlighted
@@ -58,7 +80,7 @@ const ListBoxMenuItem = /*#__PURE__*/React__default["default"].forwardRef(functi
58
80
  title: isTruncated ? title : undefined
59
81
  }), /*#__PURE__*/React__default["default"].createElement("div", {
60
82
  className: `${prefix}--list-box__menu-item__option`,
61
- ref: forwardedRef?.menuItemOptionRef || ref
83
+ ref: menuItemOptionRef
62
84
  }, children));
63
85
  });
64
86
  ListBoxMenuItem.displayName = 'ListBoxMenuItem';
@@ -27,6 +27,7 @@ export interface MenuProps extends React.HTMLAttributes<HTMLUListElement> {
27
27
  */
28
28
  menuAlignment?: string;
29
29
  /**
30
+ * @deprecated Menus now always support both icons as well as selectable items and nesting.
30
31
  * The mode of this menu. Defaults to full.
31
32
  * `full` supports nesting and selectable menu items, but no icons.
32
33
  * `basic` supports icons but no nesting or selectable menu items.
@@ -14,14 +14,14 @@ var cx = require('classnames');
14
14
  var PropTypes = require('prop-types');
15
15
  var React = require('react');
16
16
  var ReactDOM = require('react-dom');
17
+ var keys = require('../../internal/keyboard/keys.js');
18
+ var match = require('../../internal/keyboard/match.js');
17
19
  var useMergedRefs = require('../../internal/useMergedRefs.js');
18
20
  var usePrefix = require('../../internal/usePrefix.js');
19
- var warning = require('../../internal/warning.js');
21
+ var deprecate = require('../../prop-types/deprecate.js');
20
22
  var MenuContext = require('./MenuContext.js');
21
23
  var environment = require('../../internal/environment.js');
22
24
  var useLayoutDirection = require('../LayoutDirection/useLayoutDirection.js');
23
- var match = require('../../internal/keyboard/match.js');
24
- var keys = require('../../internal/keyboard/keys.js');
25
25
 
26
26
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
27
27
 
@@ -38,7 +38,7 @@ const Menu = /*#__PURE__*/React.forwardRef(function Menu(_ref, forwardRef) {
38
38
  containerRef,
39
39
  label,
40
40
  menuAlignment,
41
- mode = 'full',
41
+ mode,
42
42
  onClose,
43
43
  onOpen,
44
44
  open,
@@ -54,14 +54,10 @@ const Menu = /*#__PURE__*/React.forwardRef(function Menu(_ref, forwardRef) {
54
54
  const focusReturn = React.useRef(null);
55
55
  const context = React.useContext(MenuContext.MenuContext);
56
56
  const isRoot = context.state.isRoot;
57
- if (context.state.mode === 'basic' && !isRoot) {
58
- process.env.NODE_ENV !== "production" ? warning.warning(false, 'Nested menus are not supported when the menu is in "basic" mode.') : void 0;
59
- }
60
57
  const menuSize = isRoot ? size : context.state.size;
61
58
  const [childState, childDispatch] = React.useReducer(MenuContext.menuReducer, {
62
59
  ...context.state,
63
60
  isRoot: false,
64
- mode,
65
61
  size,
66
62
  requestCloseRoot: isRoot ? handleClose : context.state.requestCloseRoot
67
63
  });
@@ -293,6 +289,7 @@ const Menu = /*#__PURE__*/React.forwardRef(function Menu(_ref, forwardRef) {
293
289
  [`${prefix}--menu--open`]: open,
294
290
  [`${prefix}--menu--shown`]: open && !legacyAutoalign || position[0] >= 0 && position[1] >= 0,
295
291
  [`${prefix}--menu--with-icons`]: childContext.state.hasIcons,
292
+ [`${prefix}--menu--with-selectable-items`]: childContext.state.hasSelectableItems,
296
293
  [`${prefix}--autoalign`]: !legacyAutoalign
297
294
  });
298
295
  const rendered = /*#__PURE__*/React__default["default"].createElement(MenuContext.MenuContext.Provider, {
@@ -330,13 +327,14 @@ Menu.propTypes = {
330
327
  */
331
328
  menuAlignment: PropTypes__default["default"].string,
332
329
  /**
330
+ * **Deprecated**: Menus now always support both icons as well as selectable items and nesting.
333
331
  * The mode of this menu. Defaults to full.
334
332
  * `full` supports nesting and selectable menu items, but no icons.
335
333
  * `basic` supports icons but no nesting or selectable menu items.
336
334
  *
337
335
  * **This prop is not intended for use and will be set by the respective implementation (like useContextMenu, MenuButton, and ComboButton).**
338
336
  */
339
- mode: PropTypes__default["default"].oneOf(['full', 'basic']),
337
+ mode: deprecate["default"](PropTypes__default["default"].oneOf(['full', 'basic']), 'Menus now always support both icons as well as selectable items and nesting.'),
340
338
  /**
341
339
  * Provide an optional function to be called when the Menu should be closed.
342
340
  */
@@ -6,13 +6,13 @@
6
6
  */
7
7
  import { KeyboardEvent, RefObject } from 'react';
8
8
  type ActionType = {
9
- type: 'enableIcons' | 'registerItem';
9
+ type: 'enableIcons' | 'enableSelectableItems' | 'registerItem';
10
10
  payload: any;
11
11
  };
12
12
  type StateType = {
13
13
  isRoot: boolean;
14
- mode: 'full' | 'basic';
15
14
  hasIcons: boolean;
15
+ hasSelectableItems: boolean;
16
16
  size: 'xs' | 'sm' | 'md' | 'lg' | null;
17
17
  items: any[];
18
18
  requestCloseRoot: (e: Pick<KeyboardEvent<HTMLUListElement>, 'type'>) => void;
@@ -20,13 +20,13 @@ type StateType = {
20
20
  declare function menuReducer(state: StateType, action: ActionType): {
21
21
  hasIcons: boolean;
22
22
  isRoot: boolean;
23
- mode: "full" | "basic";
23
+ hasSelectableItems: boolean;
24
24
  size: "xs" | "sm" | "md" | "lg" | null;
25
25
  items: any[];
26
26
  requestCloseRoot: (e: Pick<KeyboardEvent<HTMLUListElement>, "type">) => void;
27
27
  };
28
28
  type DispatchFuncProps = {
29
- type: 'registerItem' | 'enableIcons';
29
+ type: ActionType['type'];
30
30
  payload: {
31
31
  ref: RefObject<HTMLLIElement>;
32
32
  disabled: boolean;
@@ -13,8 +13,8 @@ var React = require('react');
13
13
 
14
14
  const menuDefaultState = {
15
15
  isRoot: true,
16
- mode: 'full',
17
16
  hasIcons: false,
17
+ hasSelectableItems: false,
18
18
  size: null,
19
19
  items: [],
20
20
  requestCloseRoot: () => {}
@@ -26,6 +26,11 @@ function menuReducer(state, action) {
26
26
  ...state,
27
27
  hasIcons: true
28
28
  };
29
+ case 'enableSelectableItems':
30
+ return {
31
+ ...state,
32
+ hasSelectableItems: true
33
+ };
29
34
  case 'registerItem':
30
35
  return {
31
36
  ...state,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2023
2
+ * Copyright IBM Corp. 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.
@@ -31,7 +31,7 @@ export interface MenuItemProps extends LiHTMLAttributes<HTMLLIElement> {
31
31
  */
32
32
  onClick?: (event: KeyboardEvent<HTMLLIElement> | MouseEvent<HTMLLIElement>) => void;
33
33
  /**
34
- * Only applicable if the parent menu is in `basic` mode. Sets the menu item's icon.
34
+ * A component used to render an icon.
35
35
  */
36
36
  renderIcon?: FC;
37
37
  /**
@@ -15,17 +15,16 @@ var PropTypes = require('prop-types');
15
15
  var React = require('react');
16
16
  var react = require('@floating-ui/react');
17
17
  var iconsReact = require('@carbon/icons-react');
18
+ var keys = require('../../internal/keyboard/keys.js');
19
+ var match = require('../../internal/keyboard/match.js');
18
20
  var useControllableState = require('../../internal/useControllableState.js');
19
21
  var useMergedRefs = require('../../internal/useMergedRefs.js');
20
22
  var usePrefix = require('../../internal/usePrefix.js');
21
- var warning = require('../../internal/warning.js');
22
23
  var Menu = require('./Menu.js');
23
24
  var MenuContext = require('./MenuContext.js');
24
25
  require('../Text/index.js');
25
26
  var useLayoutDirection = require('../LayoutDirection/useLayoutDirection.js');
26
- var match = require('../../internal/keyboard/match.js');
27
27
  var Text = require('../Text/Text.js');
28
- var keys = require('../../internal/keyboard/keys.js');
29
28
 
30
29
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
31
30
 
@@ -33,7 +32,7 @@ var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
33
32
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
34
33
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
35
34
 
36
- var _CaretLeft, _CaretRight;
35
+ var _Checkmark, _CaretLeft, _CaretRight;
37
36
  const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRef) {
38
37
  let {
39
38
  children,
@@ -144,15 +143,14 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
144
143
  setRtl(false);
145
144
  }
146
145
  }, [direction]);
147
- const iconsAllowed = context.state.mode === 'basic' || rest.role === 'menuitemcheckbox' || rest.role === 'menuitemradio';
148
146
  React.useEffect(() => {
149
- if (iconsAllowed && IconElement && !context.state.hasIcons) {
147
+ if (IconElement && !context.state.hasIcons) {
150
148
  // @ts-ignore - TODO: Should we be passing payload?
151
149
  context.dispatch({
152
150
  type: 'enableIcons'
153
151
  });
154
152
  }
155
- }, [iconsAllowed, IconElement, context.state.hasIcons, context]);
153
+ }, [IconElement, context.state.hasIcons, context]);
156
154
  React.useEffect(() => {
157
155
  Object.keys(floatingStyles).forEach(style => {
158
156
  if (refs.floating.current && style !== 'position') {
@@ -176,8 +174,10 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
176
174
  onClick: handleClick,
177
175
  onKeyDown: handleKeyDown
178
176
  }, getReferenceProps()), /*#__PURE__*/React__default["default"].createElement("div", {
177
+ className: `${prefix}--menu-item__selection-icon`
178
+ }, rest['aria-checked'] && (_Checkmark || (_Checkmark = /*#__PURE__*/React__default["default"].createElement(iconsReact.Checkmark, null)))), /*#__PURE__*/React__default["default"].createElement("div", {
179
179
  className: `${prefix}--menu-item__icon`
180
- }, iconsAllowed && IconElement && /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
180
+ }, IconElement && /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
181
181
  as: "div",
182
182
  className: `${prefix}--menu-item__label`,
183
183
  title: label
@@ -222,7 +222,7 @@ MenuItem.propTypes = {
222
222
  // @ts-ignore-next-line -- avoid spurious (?) TS2322 error
223
223
  onClick: PropTypes__default["default"].func,
224
224
  /**
225
- * Only applicable if the parent menu is in `basic` mode. Sets the menu item's icon.
225
+ * A component used to render an icon.
226
226
  */
227
227
  // @ts-ignore-next-line -- avoid spurious (?) TS2322 error
228
228
  renderIcon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].object]),
@@ -243,9 +243,6 @@ const MenuItemSelectable = /*#__PURE__*/React.forwardRef(function MenuItemSelect
243
243
  } = _ref2;
244
244
  const prefix = usePrefix.usePrefix();
245
245
  const context = React.useContext(MenuContext.MenuContext);
246
- if (context.state.mode === 'basic') {
247
- process.env.NODE_ENV !== "production" ? warning.warning(false, 'MenuItemSelectable is not supported when the menu is in "basic" mode.') : void 0;
248
- }
249
246
  const [checked, setChecked] = useControllableState.useControllableState({
250
247
  value: selected,
251
248
  onChange,
@@ -255,13 +252,13 @@ const MenuItemSelectable = /*#__PURE__*/React.forwardRef(function MenuItemSelect
255
252
  setChecked(!checked);
256
253
  }
257
254
  React.useEffect(() => {
258
- if (!context.state.hasIcons) {
255
+ if (!context.state.hasSelectableItems) {
259
256
  // @ts-ignore - TODO: Should we be passing payload?
260
257
  context.dispatch({
261
- type: 'enableIcons'
258
+ type: 'enableSelectableItems'
262
259
  });
263
260
  }
264
- }, [context.state.hasIcons, context]);
261
+ }, [context.state.hasSelectableItems, context]);
265
262
  const classNames = cx__default["default"](className, `${prefix}--menu-item-selectable--selected`);
266
263
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, _rollupPluginBabelHelpers["extends"]({}, rest, {
267
264
  ref: forwardRef,
@@ -269,7 +266,6 @@ const MenuItemSelectable = /*#__PURE__*/React.forwardRef(function MenuItemSelect
269
266
  className: classNames,
270
267
  role: "menuitemcheckbox",
271
268
  "aria-checked": checked,
272
- renderIcon: checked ? iconsReact.Checkmark : undefined,
273
269
  onClick: handleClick
274
270
  }));
275
271
  });
@@ -344,9 +340,6 @@ const MenuItemRadioGroup = /*#__PURE__*/React.forwardRef(function MenuItemRadioG
344
340
  } = _ref4;
345
341
  const prefix = usePrefix.usePrefix();
346
342
  const context = React.useContext(MenuContext.MenuContext);
347
- if (context.state.mode === 'basic') {
348
- process.env.NODE_ENV !== "production" ? warning.warning(false, 'MenuItemRadioGroup is not supported when the menu is in "basic" mode.') : void 0;
349
- }
350
343
  const [selection, setSelection] = useControllableState.useControllableState({
351
344
  value: selectedItem,
352
345
  onChange,
@@ -356,13 +349,13 @@ const MenuItemRadioGroup = /*#__PURE__*/React.forwardRef(function MenuItemRadioG
356
349
  setSelection(item);
357
350
  }
358
351
  React.useEffect(() => {
359
- if (!context.state.hasIcons) {
352
+ if (!context.state.hasSelectableItems) {
360
353
  // @ts-ignore - TODO: Should we be passing payload?
361
354
  context.dispatch({
362
- type: 'enableIcons'
355
+ type: 'enableSelectableItems'
363
356
  });
364
357
  }
365
- }, [context.state.hasIcons, context]);
358
+ }, [context.state.hasSelectableItems, context]);
366
359
  const classNames = cx__default["default"](className, `${prefix}--menu-item-radio-group`);
367
360
  return /*#__PURE__*/React__default["default"].createElement("li", {
368
361
  className: classNames,
@@ -376,7 +369,6 @@ const MenuItemRadioGroup = /*#__PURE__*/React.forwardRef(function MenuItemRadioG
376
369
  label: itemToString(item),
377
370
  role: "menuitemradio",
378
371
  "aria-checked": item === selection,
379
- renderIcon: item === selection ? iconsReact.Checkmark : undefined,
380
372
  onClick: e => {
381
373
  handleClick(item);
382
374
  }
@@ -83,6 +83,15 @@ const MenuButton = /*#__PURE__*/React.forwardRef(function MenuButton(_ref, forwa
83
83
  // “break” the floating element out of a clipping ancestor.
84
84
  // https://floating-ui.com/docs/misc#clipping
85
85
  strategy: 'fixed',
86
+ // Submenus are using a fixed position to break out of the parent menu's
87
+ // box avoiding clipping while allowing for vertical scroll. When an
88
+ // element is using transform it establishes a new containing block
89
+ // block for all of its descendants. Therefore, its padding box will be
90
+ // used for fixed-positioned descendants. This would cause the submenu
91
+ // to be clipped by its parent menu.
92
+ // Reference: https://www.w3.org/TR/2019/CR-css-transforms-1-20190214/#current-transformation-matrix-computation
93
+ // Reference: https://github.com/carbon-design-system/carbon/pull/18153#issuecomment-2498548835
94
+ transform: false,
86
95
  // Middleware order matters, arrow should be last
87
96
  middleware: middlewares,
88
97
  whileElementsMounted: react.autoUpdate
@@ -97,7 +106,11 @@ const MenuButton = /*#__PURE__*/React.forwardRef(function MenuButton(_ref, forwa
97
106
  React.useLayoutEffect(() => {
98
107
  Object.keys(floatingStyles).forEach(style => {
99
108
  if (refs.floating.current) {
100
- refs.floating.current.style[style] = floatingStyles[style];
109
+ let value = floatingStyles[style];
110
+ if (['top', 'right', 'bottom', 'left'].includes(style) && Number(value)) {
111
+ value += 'px';
112
+ }
113
+ refs.floating.current.style[style] = value;
101
114
  }
102
115
  });
103
116
  }, [floatingStyles, refs.floating, middlewareData, placement, open]);
@@ -136,7 +149,6 @@ const MenuButton = /*#__PURE__*/React.forwardRef(function MenuButton(_ref, forwa
136
149
  id: id,
137
150
  legacyAutoalign: false,
138
151
  label: label,
139
- mode: "basic",
140
152
  size: size,
141
153
  open: open,
142
154
  onClose: handleClose,