@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.
- package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +851 -816
- package/es/components/Accordion/AccordionItem.js +2 -2
- package/es/components/Button/Button.d.ts +2 -3
- package/es/components/Button/Button.js +1 -2
- package/es/components/Button/ButtonBase.js +1 -1
- package/es/components/ChatButton/ChatButton.d.ts +2 -3
- package/es/components/ChatButton/ChatButton.js +1 -2
- package/es/components/ComboBox/ComboBox.js +40 -30
- package/es/components/ComboButton/index.js +0 -1
- package/es/components/ComposedModal/ComposedModal.js +65 -51
- package/es/components/ContainedList/ContainedListItem/ContainedListItem.d.ts +2 -2
- package/es/components/ContainedList/ContainedListItem/ContainedListItem.js +1 -1
- package/es/components/ContentSwitcher/ContentSwitcher.js +3 -3
- package/es/components/ContextMenu/useContextMenu.d.ts +0 -1
- package/es/components/ContextMenu/useContextMenu.js +1 -2
- package/es/components/DataTable/TableBatchAction.d.ts +3 -3
- package/es/components/DataTable/TableBatchAction.js +1 -1
- package/es/components/DataTable/TableContainer.d.ts +1 -1
- package/es/components/DataTable/TableContainer.js +3 -3
- package/es/components/DataTable/TableExpandHeader.d.ts +6 -5
- package/es/components/DataTable/TableToolbarMenu.d.ts +2 -2
- package/es/components/DataTable/TableToolbarMenu.js +1 -1
- package/es/components/DatePicker/DatePicker.js +2 -2
- package/es/components/DatePicker/plugins/fixEventsPlugin.js +1 -1
- package/es/components/Dialog/index.d.ts +42 -4
- package/es/components/Dialog/index.js +177 -0
- package/es/components/ExpandableSearch/ExpandableSearch.js +2 -2
- package/es/components/FeatureFlags/index.d.ts +3 -1
- package/es/components/FeatureFlags/index.js +3 -0
- package/es/components/FileUploader/FileUploader.d.ts +1 -1
- package/es/components/FileUploader/FileUploader.js +2 -2
- package/es/components/FileUploader/FileUploaderButton.js +2 -2
- package/es/components/FileUploader/FileUploaderDropContainer.d.ts +1 -1
- package/es/components/FileUploader/FileUploaderDropContainer.js +6 -4
- package/es/components/FileUploader/FileUploaderItem.d.ts +1 -1
- package/es/components/FileUploader/FileUploaderItem.js +2 -2
- package/es/components/Grid/CSSGrid.js +18 -14
- package/es/components/Grid/FlexGrid.js +7 -6
- package/es/components/Grid/GridTypes.d.ts +5 -3
- package/es/components/IconButton/index.js +3 -3
- package/es/components/Layer/index.d.ts +4 -6
- package/es/components/Layer/index.js +5 -6
- package/es/components/Link/Link.d.ts +2 -3
- package/es/components/Link/Link.js +1 -2
- package/es/components/ListBox/ListBoxMenuItem.d.ts +3 -3
- package/es/components/ListBox/ListBoxMenuItem.js +37 -15
- package/es/components/Menu/Menu.d.ts +1 -0
- package/es/components/Menu/Menu.js +7 -9
- package/es/components/Menu/MenuContext.d.ts +4 -4
- package/es/components/Menu/MenuContext.js +6 -1
- package/es/components/Menu/MenuItem.d.ts +2 -2
- package/es/components/Menu/MenuItem.js +16 -24
- package/es/components/MenuButton/index.js +14 -2
- package/es/components/Modal/Modal.js +121 -49
- package/es/components/ModalWrapper/ModalWrapper.js +1 -1
- package/es/components/MultiSelect/FilterableMultiSelect.js +3 -3
- package/es/components/MultiSelect/MultiSelect.js +2 -2
- package/es/components/Notification/Notification.d.ts +5 -13
- package/es/components/Notification/Notification.js +7 -9
- package/es/components/OverflowMenu/OverflowMenu.d.ts +4 -8
- package/es/components/OverflowMenu/OverflowMenu.js +3 -3
- package/es/components/OverflowMenu/next/index.d.ts +2 -2
- package/es/components/OverflowMenu/next/index.js +1 -1
- package/es/components/OverflowMenuItem/OverflowMenuItem.js +2 -2
- package/es/components/ProgressIndicator/ProgressIndicator.js +2 -2
- package/es/components/RadioTile/RadioTile.js +2 -2
- package/es/components/Search/Search.d.ts +2 -3
- package/es/components/Search/Search.js +4 -6
- package/es/components/Slider/Slider.d.ts +16 -15
- package/es/components/Slider/Slider.js +22 -22
- package/es/components/Tabs/Tabs.d.ts +3 -6
- package/es/components/Tabs/Tabs.js +8 -9
- package/es/components/Tag/DismissibleTag.d.ts +3 -5
- package/es/components/Tag/DismissibleTag.js +1 -2
- package/es/components/Tag/OperationalTag.d.ts +2 -3
- package/es/components/Tag/OperationalTag.js +1 -2
- package/es/components/Tag/SelectableTag.d.ts +3 -5
- package/es/components/Tag/SelectableTag.js +1 -2
- package/es/components/Tag/Tag.d.ts +2 -3
- package/es/components/Tag/Tag.js +1 -2
- package/es/components/Tile/Tile.d.ts +3 -5
- package/es/components/Tile/Tile.js +8 -6
- package/es/components/Toggletip/index.js +2 -2
- package/es/components/Tooltip/DefinitionTooltip.js +2 -2
- package/es/components/Tooltip/Tooltip.d.ts +1 -1
- package/es/components/Tooltip/Tooltip.js +2 -2
- package/es/components/TreeView/TreeNode.d.ts +3 -5
- package/es/components/TreeView/TreeNode.js +3 -4
- package/es/components/TreeView/TreeView.js +2 -2
- package/es/components/UIShell/HeaderContainer.js +2 -2
- package/es/components/UIShell/HeaderMenu.js +2 -2
- package/es/components/UIShell/HeaderPanel.js +2 -2
- package/es/components/UIShell/SideNav.d.ts +1 -1
- package/es/components/UIShell/SideNav.js +2 -2
- package/es/components/UIShell/SideNavHeader.d.ts +2 -3
- package/es/components/UIShell/SideNavHeader.js +1 -2
- package/es/components/UIShell/SideNavLink.d.ts +2 -2
- package/es/components/UIShell/SideNavLink.js +1 -1
- package/es/components/UIShell/SideNavMenu.d.ts +2 -2
- package/es/components/UIShell/SideNavMenu.js +3 -3
- package/es/components/UIShell/SwitcherItem.js +2 -2
- package/es/internal/FloatingMenu.js +4 -4
- package/es/internal/OptimizedResize.d.ts +18 -0
- package/es/internal/OptimizedResize.js +21 -24
- package/es/internal/keyboard/index.d.ts +9 -0
- package/es/internal/keyboard/keys.d.ts +23 -0
- package/es/internal/keyboard/keys.js +2 -2
- package/es/internal/keyboard/match.d.ts +26 -0
- package/es/internal/keyboard/match.js +17 -41
- package/es/internal/keyboard/navigation.d.ts +37 -0
- package/es/internal/keyboard/navigation.js +15 -27
- package/es/internal/useMergedRefs.js +3 -0
- package/lib/components/Accordion/AccordionItem.js +2 -2
- package/lib/components/Button/Button.d.ts +2 -3
- package/lib/components/Button/Button.js +1 -2
- package/lib/components/Button/ButtonBase.js +1 -1
- package/lib/components/ChatButton/ChatButton.d.ts +2 -3
- package/lib/components/ChatButton/ChatButton.js +1 -2
- package/lib/components/ComboBox/ComboBox.js +40 -30
- package/lib/components/ComboButton/index.js +0 -1
- package/lib/components/ComposedModal/ComposedModal.js +64 -50
- package/lib/components/ContainedList/ContainedListItem/ContainedListItem.d.ts +2 -2
- package/lib/components/ContainedList/ContainedListItem/ContainedListItem.js +1 -1
- package/lib/components/ContentSwitcher/ContentSwitcher.js +3 -3
- package/lib/components/ContextMenu/useContextMenu.d.ts +0 -1
- package/lib/components/ContextMenu/useContextMenu.js +1 -2
- package/lib/components/DataTable/TableBatchAction.d.ts +3 -3
- package/lib/components/DataTable/TableBatchAction.js +1 -1
- package/lib/components/DataTable/TableContainer.d.ts +1 -1
- package/lib/components/DataTable/TableContainer.js +3 -3
- package/lib/components/DataTable/TableExpandHeader.d.ts +6 -5
- package/lib/components/DataTable/TableToolbarMenu.d.ts +2 -2
- package/lib/components/DataTable/TableToolbarMenu.js +1 -1
- package/lib/components/DatePicker/DatePicker.js +2 -2
- package/lib/components/DatePicker/plugins/fixEventsPlugin.js +1 -1
- package/lib/components/Dialog/index.d.ts +42 -4
- package/lib/components/Dialog/index.js +190 -0
- package/lib/components/ExpandableSearch/ExpandableSearch.js +2 -2
- package/lib/components/FeatureFlags/index.d.ts +3 -1
- package/lib/components/FeatureFlags/index.js +3 -0
- package/lib/components/FileUploader/FileUploader.d.ts +1 -1
- package/lib/components/FileUploader/FileUploader.js +2 -2
- package/lib/components/FileUploader/FileUploaderButton.js +2 -2
- package/lib/components/FileUploader/FileUploaderDropContainer.d.ts +1 -1
- package/lib/components/FileUploader/FileUploaderDropContainer.js +6 -4
- package/lib/components/FileUploader/FileUploaderItem.d.ts +1 -1
- package/lib/components/FileUploader/FileUploaderItem.js +2 -2
- package/lib/components/Grid/CSSGrid.js +18 -14
- package/lib/components/Grid/FlexGrid.js +7 -6
- package/lib/components/Grid/GridTypes.d.ts +5 -3
- package/lib/components/IconButton/index.js +3 -3
- package/lib/components/Layer/index.d.ts +4 -6
- package/lib/components/Layer/index.js +5 -6
- package/lib/components/Link/Link.d.ts +2 -3
- package/lib/components/Link/Link.js +1 -2
- package/lib/components/ListBox/ListBoxMenuItem.d.ts +3 -3
- package/lib/components/ListBox/ListBoxMenuItem.js +36 -14
- package/lib/components/Menu/Menu.d.ts +1 -0
- package/lib/components/Menu/Menu.js +7 -9
- package/lib/components/Menu/MenuContext.d.ts +4 -4
- package/lib/components/Menu/MenuContext.js +6 -1
- package/lib/components/Menu/MenuItem.d.ts +2 -2
- package/lib/components/Menu/MenuItem.js +15 -23
- package/lib/components/MenuButton/index.js +14 -2
- package/lib/components/Modal/Modal.js +123 -51
- package/lib/components/ModalWrapper/ModalWrapper.js +1 -1
- package/lib/components/MultiSelect/FilterableMultiSelect.js +3 -3
- package/lib/components/MultiSelect/MultiSelect.js +2 -2
- package/lib/components/Notification/Notification.d.ts +5 -13
- package/lib/components/Notification/Notification.js +7 -9
- package/lib/components/OverflowMenu/OverflowMenu.d.ts +4 -8
- package/lib/components/OverflowMenu/OverflowMenu.js +3 -3
- package/lib/components/OverflowMenu/next/index.d.ts +2 -2
- package/lib/components/OverflowMenu/next/index.js +1 -1
- package/lib/components/OverflowMenuItem/OverflowMenuItem.js +2 -2
- package/lib/components/ProgressIndicator/ProgressIndicator.js +2 -2
- package/lib/components/RadioTile/RadioTile.js +2 -2
- package/lib/components/Search/Search.d.ts +2 -3
- package/lib/components/Search/Search.js +4 -6
- package/lib/components/Slider/Slider.d.ts +16 -15
- package/lib/components/Slider/Slider.js +22 -22
- package/lib/components/Tabs/Tabs.d.ts +3 -6
- package/lib/components/Tabs/Tabs.js +8 -9
- package/lib/components/Tag/DismissibleTag.d.ts +3 -5
- package/lib/components/Tag/DismissibleTag.js +1 -2
- package/lib/components/Tag/OperationalTag.d.ts +2 -3
- package/lib/components/Tag/OperationalTag.js +1 -2
- package/lib/components/Tag/SelectableTag.d.ts +3 -5
- package/lib/components/Tag/SelectableTag.js +1 -2
- package/lib/components/Tag/Tag.d.ts +2 -3
- package/lib/components/Tag/Tag.js +1 -2
- package/lib/components/Tile/Tile.d.ts +3 -5
- package/lib/components/Tile/Tile.js +8 -6
- package/lib/components/Toggletip/index.js +2 -2
- package/lib/components/Tooltip/DefinitionTooltip.js +2 -2
- package/lib/components/Tooltip/Tooltip.d.ts +1 -1
- package/lib/components/Tooltip/Tooltip.js +2 -2
- package/lib/components/TreeView/TreeNode.d.ts +3 -5
- package/lib/components/TreeView/TreeNode.js +3 -4
- package/lib/components/TreeView/TreeView.js +2 -2
- package/lib/components/UIShell/HeaderContainer.js +2 -2
- package/lib/components/UIShell/HeaderMenu.js +2 -2
- package/lib/components/UIShell/HeaderPanel.js +2 -2
- package/lib/components/UIShell/SideNav.d.ts +1 -1
- package/lib/components/UIShell/SideNav.js +2 -2
- package/lib/components/UIShell/SideNavHeader.d.ts +2 -3
- package/lib/components/UIShell/SideNavHeader.js +1 -2
- package/lib/components/UIShell/SideNavLink.d.ts +2 -2
- package/lib/components/UIShell/SideNavLink.js +1 -1
- package/lib/components/UIShell/SideNavMenu.d.ts +2 -2
- package/lib/components/UIShell/SideNavMenu.js +3 -3
- package/lib/components/UIShell/SwitcherItem.js +2 -2
- package/lib/internal/FloatingMenu.js +5 -5
- package/lib/internal/OptimizedResize.d.ts +18 -0
- package/lib/internal/OptimizedResize.js +21 -24
- package/lib/internal/keyboard/index.d.ts +9 -0
- package/lib/internal/keyboard/keys.d.ts +23 -0
- package/lib/internal/keyboard/keys.js +2 -2
- package/lib/internal/keyboard/match.d.ts +26 -0
- package/lib/internal/keyboard/match.js +17 -41
- package/lib/internal/keyboard/navigation.d.ts +37 -0
- package/lib/internal/keyboard/navigation.js +15 -27
- package/lib/internal/useMergedRefs.js +3 -0
- package/package.json +7 -7
- package/scss/components/dialog/_dialog.scss +9 -0
- package/scss/components/dialog/_index.scss +9 -0
- package/telemetry.yml +1 -0
- package/es/components/Modal/next/index.d.ts +0 -171
- package/es/internal/focus/index.js +0 -15
- package/lib/components/Modal/next/index.d.ts +0 -171
- 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
|
-
|
|
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 =
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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__*/
|
|
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
|
|
51
|
-
const
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
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: '
|
|
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.
|
|
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
|
-
*
|
|
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 (
|
|
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
|
-
}, [
|
|
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
|
-
},
|
|
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
|
-
*
|
|
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.
|
|
255
|
+
if (!context.state.hasSelectableItems) {
|
|
259
256
|
// @ts-ignore - TODO: Should we be passing payload?
|
|
260
257
|
context.dispatch({
|
|
261
|
-
type: '
|
|
258
|
+
type: 'enableSelectableItems'
|
|
262
259
|
});
|
|
263
260
|
}
|
|
264
|
-
}, [context.state.
|
|
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.
|
|
352
|
+
if (!context.state.hasSelectableItems) {
|
|
360
353
|
// @ts-ignore - TODO: Should we be passing payload?
|
|
361
354
|
context.dispatch({
|
|
362
|
-
type: '
|
|
355
|
+
type: 'enableSelectableItems'
|
|
363
356
|
});
|
|
364
357
|
}
|
|
365
|
-
}, [context.state.
|
|
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
|
-
|
|
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,
|