@pingux/astro 2.49.0-alpha.1 → 2.49.0-alpha.3
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/lib/cjs/components/CopyText/CopyText.styles.js +1 -1
- package/lib/cjs/components/Menu/Menu.d.ts +4 -0
- package/lib/cjs/components/Menu/Menu.js +4 -8
- package/lib/cjs/components/Menu/Menu.stories.d.ts +5 -0
- package/lib/cjs/components/Menu/Menu.stories.js +2 -4
- package/lib/cjs/components/Menu/Menu.styles.d.ts +11 -0
- package/lib/cjs/components/Menu/Menu.test.d.ts +1 -0
- package/lib/cjs/components/Menu/Menu.test.js +7 -7
- package/lib/cjs/components/Menu/index.d.ts +1 -0
- package/lib/cjs/components/Menu/menuAttributes.d.ts +2 -0
- package/lib/cjs/components/MenuItem/MenuItem.d.ts +9 -0
- package/lib/cjs/components/MenuItem/MenuItem.js +10 -53
- package/lib/cjs/components/MenuItem/MenuItem.styles.d.ts +25 -0
- package/lib/cjs/components/MenuItem/MenuItem.test.d.ts +1 -0
- package/lib/cjs/components/MenuItem/MenuItem.test.js +24 -9
- package/lib/cjs/components/MenuItem/index.d.ts +1 -0
- package/lib/cjs/components/Tabs/Tabs.stories.js +2 -2
- package/lib/cjs/components/Tabs/Tabs.test.js +4 -4
- package/lib/cjs/context/MenuContext/index.d.ts +7 -5
- package/lib/cjs/context/MenuContext/index.js +4 -6
- package/lib/cjs/types/index.d.ts +2 -0
- package/lib/cjs/types/index.js +34 -12
- package/lib/cjs/types/menu.d.ts +14 -0
- package/lib/cjs/types/menu.js +6 -0
- package/lib/cjs/types/menuItem.d.ts +28 -0
- package/lib/cjs/types/menuItem.js +6 -0
- package/lib/components/CopyText/CopyText.styles.js +1 -1
- package/lib/components/Menu/Menu.js +6 -10
- package/lib/components/Menu/Menu.stories.js +2 -4
- package/lib/components/Menu/Menu.test.js +7 -7
- package/lib/components/MenuItem/MenuItem.js +12 -55
- package/lib/components/MenuItem/MenuItem.test.js +24 -9
- package/lib/components/Tabs/Tabs.stories.js +2 -2
- package/lib/components/Tabs/Tabs.test.js +4 -4
- package/lib/context/MenuContext/index.js +2 -5
- package/lib/types/index.js +2 -0
- package/lib/types/menu.js +1 -0
- package/lib/types/menuItem.js +1 -0
- package/package.json +1 -1
@@ -30,7 +30,6 @@ var _hooks = require("../../hooks");
|
|
30
30
|
var _orientation = _interopRequireDefault(require("../../utils/devUtils/constants/orientation"));
|
31
31
|
var _Box = _interopRequireDefault(require("../Box"));
|
32
32
|
var _MenuItem = _interopRequireDefault(require("../MenuItem"));
|
33
|
-
var _menuAttributes = require("./menuAttributes");
|
34
33
|
var _react2 = require("@emotion/react");
|
35
34
|
var _excluded = ["isDisabled", "isNotFocusedOnHover", "onAction", "onHoverChange", "onHoverEnd", "onHoverStart", "onSelectionChange", "selectionMode"];
|
36
35
|
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
@@ -59,12 +58,8 @@ var Menu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
59
58
|
}),
|
60
59
|
hoverProps = _useHover.hoverProps;
|
61
60
|
var state = (0, _reactStately.useTreeState)(completeProps);
|
62
|
-
var menuRef = (0,
|
61
|
+
var menuRef = (0, _hooks.useLocalOrForwardRef)(ref);
|
63
62
|
(0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
|
64
|
-
/* istanbul ignore next */
|
65
|
-
(0, _react.useImperativeHandle)(ref, function () {
|
66
|
-
return menuRef.current;
|
67
|
-
});
|
68
63
|
var _useMenu = (0, _reactAria.useMenu)(completeProps, state, menuRef),
|
69
64
|
menuProps = _useMenu.menuProps;
|
70
65
|
var _useFocusRing = (0, _reactAria.useFocusRing)({
|
@@ -80,7 +75,9 @@ var Menu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
80
75
|
ref: menuRef,
|
81
76
|
variant: "menu",
|
82
77
|
"aria-orientation": _orientation["default"].VERTICAL
|
83
|
-
}, others, (0, _reactAria.mergeProps)(focusProps, menuProps, hoverProps)
|
78
|
+
}, others, (0, _reactAria.mergeProps)(focusProps, menuProps, hoverProps), {
|
79
|
+
role: "menu"
|
80
|
+
}), (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (item) {
|
84
81
|
return (0, _react2.jsx)(_MenuItem["default"], {
|
85
82
|
key: item.key,
|
86
83
|
item: item,
|
@@ -92,7 +89,6 @@ var Menu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
92
89
|
});
|
93
90
|
}));
|
94
91
|
});
|
95
|
-
Menu.propTypes = _menuAttributes.menuPropTypes;
|
96
92
|
Menu.displayName = 'Menu';
|
97
93
|
var _default = Menu;
|
98
94
|
exports["default"] = _default;
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import { StoryFn } from '@storybook/react';
|
2
|
+
import { MenuProps } from '../../types';
|
3
|
+
declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, import("@storybook/types").Args>;
|
4
|
+
export default _default;
|
5
|
+
export declare const Default: StoryFn<MenuProps>;
|
@@ -6,14 +6,13 @@ _Object$defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
7
7
|
});
|
8
8
|
exports["default"] = exports.Default = void 0;
|
9
|
-
var _objectDestructuringEmpty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectDestructuringEmpty"));
|
10
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
11
10
|
var _react = _interopRequireDefault(require("react"));
|
12
11
|
var _reactStately = require("react-stately");
|
13
12
|
var _storybookAddonDesigns = require("storybook-addon-designs");
|
14
13
|
var _storybookDocsLayout = _interopRequireDefault(require("../../../.storybook/storybookDocsLayout"));
|
15
14
|
var _index = require("../../index");
|
16
|
-
var _figmaLinks = require("../../utils/designUtils/figmaLinks
|
15
|
+
var _figmaLinks = require("../../utils/designUtils/figmaLinks");
|
17
16
|
var _Menu = _interopRequireDefault(require("./Menu.mdx"));
|
18
17
|
var _menuAttributes = require("./menuAttributes");
|
19
18
|
var _react2 = require("@emotion/react");
|
@@ -40,8 +39,7 @@ var _default = {
|
|
40
39
|
argTypes: _menuAttributes.menuArgTypes
|
41
40
|
};
|
42
41
|
exports["default"] = _default;
|
43
|
-
var Default = function Default(
|
44
|
-
var args = (0, _extends2["default"])({}, ((0, _objectDestructuringEmpty2["default"])(_ref), _ref));
|
42
|
+
var Default = function Default(args) {
|
45
43
|
return (0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({
|
46
44
|
"aria-label": "Example Menu"
|
47
45
|
}, args), (0, _react2.jsx)(_reactStately.Item, {
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -18,20 +18,20 @@ var defaultProps = {
|
|
18
18
|
'aria-label': 'testLabel'
|
19
19
|
};
|
20
20
|
var defaultItems = [{
|
21
|
-
|
21
|
+
id: 'a',
|
22
22
|
children: 'A'
|
23
23
|
}, {
|
24
|
-
|
24
|
+
id: 'b',
|
25
25
|
children: 'B'
|
26
26
|
}, {
|
27
|
-
|
27
|
+
id: 'c',
|
28
28
|
children: 'C'
|
29
29
|
}];
|
30
30
|
var getComponent = function getComponent() {
|
31
31
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
32
32
|
return (0, _testWrapper.render)((0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({}, defaultProps, props), (0, _map["default"])(defaultItems).call(defaultItems, function (item) {
|
33
33
|
return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({
|
34
|
-
key: item.
|
34
|
+
key: item.id
|
35
35
|
}, item));
|
36
36
|
})));
|
37
37
|
};
|
@@ -41,7 +41,7 @@ var getComponent = function getComponent() {
|
|
41
41
|
renderComponent: function renderComponent(props) {
|
42
42
|
return (0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({}, defaultProps, props), (0, _map["default"])(defaultItems).call(defaultItems, function (item) {
|
43
43
|
return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({
|
44
|
-
key: item.
|
44
|
+
key: item.id
|
45
45
|
}, item));
|
46
46
|
}));
|
47
47
|
}
|
@@ -124,11 +124,11 @@ test('should fire onAction', function () {
|
|
124
124
|
_testWrapper.fireEvent.keyUp(menuItems[0], {
|
125
125
|
key: 'Enter'
|
126
126
|
});
|
127
|
-
expect(onAction).toHaveBeenNthCalledWith(1, defaultItems[0].
|
127
|
+
expect(onAction).toHaveBeenNthCalledWith(1, defaultItems[0].id);
|
128
128
|
|
129
129
|
// Click events
|
130
130
|
_userEvent["default"].click(menuItems[1]);
|
131
|
-
expect(onAction).toHaveBeenNthCalledWith(2, defaultItems[1].
|
131
|
+
expect(onAction).toHaveBeenNthCalledWith(2, defaultItems[1].id);
|
132
132
|
});
|
133
133
|
test('should not fire onSelectionChange when selectionMode is none', function () {
|
134
134
|
var onSelectionChange = jest.fn();
|
@@ -0,0 +1 @@
|
|
1
|
+
export { default } from './Menu';
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { MenuItemProps } from '../../types';
|
3
|
+
/**
|
4
|
+
* Menu Item component intended to be used within Menu or PopupMenu.
|
5
|
+
* This component is not intented to be used outside of Menu or independently.
|
6
|
+
* Utilizes [React Aria](https://react-spectrum.adobe.com/react-aria/useMenu.html)
|
7
|
+
*/
|
8
|
+
declare const MenuItem: React.ForwardRefExoticComponent<MenuItemProps & React.RefAttributes<HTMLDivElement>>;
|
9
|
+
export default MenuItem;
|
@@ -15,10 +15,8 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-c
|
|
15
15
|
var _react = _interopRequireWildcard(require("react"));
|
16
16
|
var _reactAria = require("react-aria");
|
17
17
|
var _interactions = require("@react-aria/interactions");
|
18
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
19
18
|
var _MenuContext = require("../../context/MenuContext");
|
20
19
|
var _hooks = require("../../hooks");
|
21
|
-
var _isIterable = require("../../utils/devUtils/props/isIterable");
|
22
20
|
var _Box = _interopRequireDefault(require("../Box"));
|
23
21
|
var _react2 = require("@emotion/react");
|
24
22
|
var _excluded = ["isSeparator", "isPressed", "data-id"];
|
@@ -40,24 +38,21 @@ var MenuItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
40
38
|
var _useMenuContext = (0, _MenuContext.useMenuContext)(),
|
41
39
|
onClose = _useMenuContext.onClose,
|
42
40
|
closeOnSelect = _useMenuContext.closeOnSelect;
|
43
|
-
var
|
44
|
-
|
45
|
-
|
41
|
+
var _ref = item,
|
42
|
+
key = _ref.key,
|
43
|
+
rendered = _ref.rendered,
|
44
|
+
itemProps = _ref.props;
|
46
45
|
var isSeparator = itemProps.isSeparator,
|
47
46
|
propIsPressed = itemProps.isPressed,
|
48
47
|
dataId = itemProps['data-id'],
|
49
48
|
others = (0, _objectWithoutProperties2["default"])(itemProps, _excluded);
|
50
49
|
var isDisabled = propIsDisabled || state.disabledKeys.has(key);
|
51
50
|
var isSelected = state.selectionManager.isSelected(key);
|
52
|
-
var menuItemRef = (0, _react.useRef)();
|
53
51
|
(0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
|
54
|
-
|
55
|
-
(0, _react.useImperativeHandle)(ref, function () {
|
56
|
-
return menuItemRef.current;
|
57
|
-
});
|
52
|
+
var menuItemRef = (0, _hooks.useLocalOrForwardRef)(ref);
|
58
53
|
var _useMenuItem = (0, _reactAria.useMenuItem)({
|
59
|
-
key: item.key,
|
60
|
-
'aria-label': item['aria-label'],
|
54
|
+
key: item === null || item === void 0 ? void 0 : item.key,
|
55
|
+
'aria-label': item === null || item === void 0 ? void 0 : item['aria-label'],
|
61
56
|
isDisabled: isDisabled,
|
62
57
|
onAction: onAction,
|
63
58
|
isSelected: isSelected,
|
@@ -103,49 +98,11 @@ var MenuItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
103
98
|
variant: isSeparator ? 'menuItem.separator' : 'menuItem.item',
|
104
99
|
"data-id": dataId,
|
105
100
|
"aria-disabled": isDisabled
|
106
|
-
}, (0, _reactAria.mergeProps)(pressProps, hoverProps, focusProps, menuItemProps, others)
|
101
|
+
}, (0, _reactAria.mergeProps)(pressProps, hoverProps, focusProps, menuItemProps, others), {
|
102
|
+
role: menuItemProps.role
|
103
|
+
}), rendered);
|
107
104
|
});
|
108
105
|
MenuItem.displayName = 'MenuItem';
|
109
|
-
MenuItem.propTypes = {
|
110
|
-
/** Whether the item is disabled. */
|
111
|
-
isDisabled: _propTypes["default"].bool,
|
112
|
-
/** Whether the menu item is selected. */
|
113
|
-
isSelected: _propTypes["default"].bool,
|
114
|
-
/** Whether the menu item is currently pressed. */
|
115
|
-
isPressed: _propTypes["default"].bool,
|
116
|
-
/**
|
117
|
-
* Whether the containing menu has keyboard focus.
|
118
|
-
* Used to determine when to present hover vs focus styling.
|
119
|
-
*/
|
120
|
-
isFocusVisible: _propTypes["default"].bool,
|
121
|
-
/**
|
122
|
-
* Whether menu item should receive focus state on hover.
|
123
|
-
*/
|
124
|
-
isNotFocusedOnHover: _propTypes["default"].bool,
|
125
|
-
/** A screen reader only label for the menu item. */
|
126
|
-
'aria-label': _propTypes["default"].string,
|
127
|
-
/** Handler that is called when the menu should close after selecting an item. */
|
128
|
-
onClose: _propTypes["default"].func,
|
129
|
-
/** Handler that is called when the user activates the item. */
|
130
|
-
onAction: _propTypes["default"].func,
|
131
|
-
item: _propTypes["default"].shape({
|
132
|
-
'aria-label': _propTypes["default"].string,
|
133
|
-
key: _propTypes["default"].string,
|
134
|
-
props: _propTypes["default"].shape({
|
135
|
-
'data-id': _propTypes["default"].string,
|
136
|
-
isSeparator: _propTypes["default"].bool,
|
137
|
-
isPressed: _propTypes["default"].bool
|
138
|
-
}),
|
139
|
-
rendered: _propTypes["default"].node,
|
140
|
-
isDisabled: _propTypes["default"].bool
|
141
|
-
}),
|
142
|
-
state: _propTypes["default"].shape({
|
143
|
-
disabledKeys: _isIterable.isIterableProp,
|
144
|
-
selectionManager: _propTypes["default"].shape({
|
145
|
-
isSelected: _propTypes["default"].func
|
146
|
-
})
|
147
|
-
})
|
148
|
-
};
|
149
106
|
MenuItem.defaultProps = {
|
150
107
|
isDisabled: false,
|
151
108
|
isPressed: false
|
@@ -0,0 +1,25 @@
|
|
1
|
+
declare const _default: {
|
2
|
+
item: {
|
3
|
+
bg: string;
|
4
|
+
padding: string;
|
5
|
+
outline: string;
|
6
|
+
cursor: string;
|
7
|
+
'&.is-focused, &.is-selected, &.is-pressed': {
|
8
|
+
color: string;
|
9
|
+
bg: string;
|
10
|
+
'> *': {
|
11
|
+
color: string;
|
12
|
+
};
|
13
|
+
};
|
14
|
+
'&.is-pressed': {
|
15
|
+
bg: string;
|
16
|
+
};
|
17
|
+
};
|
18
|
+
separator: {
|
19
|
+
padding: string;
|
20
|
+
'& > [role="separator"]': {
|
21
|
+
margin: string;
|
22
|
+
};
|
23
|
+
};
|
24
|
+
};
|
25
|
+
export default _default;
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -15,15 +15,18 @@ var testId = 'testId';
|
|
15
15
|
var defaultMenuItems = [{
|
16
16
|
key: 'MenuItem 1',
|
17
17
|
children: 'MenuItem 1',
|
18
|
-
'data-id': 'menuItem1'
|
18
|
+
'data-id': 'menuItem1',
|
19
|
+
isPressed: false
|
19
20
|
}, {
|
20
21
|
key: 'MenuItem 2',
|
21
22
|
children: 'MenuItem 2',
|
22
|
-
'data-id': 'menuItem2'
|
23
|
+
'data-id': 'menuItem2',
|
24
|
+
isPressed: false
|
23
25
|
}, {
|
24
26
|
key: 'MenuItem 3',
|
25
27
|
children: 'MenuItem 3',
|
26
|
-
'data-id': 'menuItem3'
|
28
|
+
'data-id': 'menuItem3',
|
29
|
+
isPressed: false
|
27
30
|
}];
|
28
31
|
var defaultProps = {
|
29
32
|
'data-testid': testId,
|
@@ -38,9 +41,7 @@ var getComponent = function getComponent() {
|
|
38
41
|
_ref$renderFn = _ref.renderFn,
|
39
42
|
renderFn = _ref$renderFn === void 0 ? _testWrapper.render : _ref$renderFn;
|
40
43
|
return renderFn((0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({}, defaultProps, props), (0, _map["default"])(items).call(items, function (li) {
|
41
|
-
return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({
|
42
|
-
key: li.key
|
43
|
-
}, li, {
|
44
|
+
return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({}, li, {
|
44
45
|
sx: {
|
45
46
|
backgroundColor: 'orange'
|
46
47
|
}
|
@@ -52,9 +53,7 @@ var getComponent = function getComponent() {
|
|
52
53
|
(0, _universalComponentTest.universalComponentTests)({
|
53
54
|
renderComponent: function renderComponent(props) {
|
54
55
|
return (0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({}, defaultProps, props), (0, _map["default"])(defaultMenuItems).call(defaultMenuItems, function (li) {
|
55
|
-
return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({
|
56
|
-
key: li.key
|
57
|
-
}, li, {
|
56
|
+
return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({}, li, {
|
58
57
|
sx: {
|
59
58
|
backgroundColor: 'orange'
|
60
59
|
}
|
@@ -172,4 +171,20 @@ test('custom props are passed into menuItem', function () {
|
|
172
171
|
var itemText1 = defaultMenuItems[0].children;
|
173
172
|
var menuItem1 = _testWrapper.screen.getByText(itemText1);
|
174
173
|
expect(menuItem1).toHaveStyleRule('background-color', 'orange');
|
174
|
+
});
|
175
|
+
test('Selection mode given as single', function () {
|
176
|
+
getComponent({
|
177
|
+
selectionMode: 'single',
|
178
|
+
defaultSelectedKeys: [defaultMenuItems[0].key]
|
179
|
+
});
|
180
|
+
var menuItems = _testWrapper.screen.queryAllByRole('menuitemradio');
|
181
|
+
expect(menuItems).toHaveLength(defaultMenuItems.length);
|
182
|
+
});
|
183
|
+
test('Selection mode given as multiple', function () {
|
184
|
+
getComponent({
|
185
|
+
selectionMode: 'multiple',
|
186
|
+
defaultSelectedKeys: [defaultMenuItems[0].key]
|
187
|
+
});
|
188
|
+
var menuItems = _testWrapper.screen.queryAllByRole('menuitemcheckbox');
|
189
|
+
expect(menuItems).toHaveLength(defaultMenuItems.length);
|
175
190
|
});
|
@@ -0,0 +1 @@
|
|
1
|
+
export { default } from './MenuItem';
|
@@ -235,12 +235,12 @@ var WithList = function WithList() {
|
|
235
235
|
key: 'tab1list',
|
236
236
|
name: 'Tab 1 list',
|
237
237
|
children: 'Tab 1 from list',
|
238
|
-
role: '
|
238
|
+
role: 'menuitemradio'
|
239
239
|
}, {
|
240
240
|
key: 'tab2list',
|
241
241
|
name: 'Tab 2 list',
|
242
242
|
children: 'Tab 2 from list',
|
243
|
-
role: '
|
243
|
+
role: 'menuitemradio'
|
244
244
|
}]
|
245
245
|
}]);
|
246
246
|
return (0, _react2.jsx)(_index.Tabs, {
|
@@ -55,12 +55,12 @@ var tabsWithList = [{
|
|
55
55
|
key: 'tab1list',
|
56
56
|
name: 'Tab 1 list',
|
57
57
|
children: 'Tab 1 from list',
|
58
|
-
role: '
|
58
|
+
role: 'menuitemradio'
|
59
59
|
}, {
|
60
60
|
key: 'tab2list',
|
61
61
|
name: 'Tab 2 list',
|
62
62
|
children: 'Tab 2 from list',
|
63
|
-
role: '
|
63
|
+
role: 'menuitemradio'
|
64
64
|
}]
|
65
65
|
}];
|
66
66
|
var defaultProps = {
|
@@ -472,7 +472,7 @@ test('will render tab with list if provided', /*#__PURE__*/(0, _asyncToGenerator
|
|
472
472
|
_userEvent["default"].click(menuBtn);
|
473
473
|
expect(_testWrapper.screen.queryByRole('menu')).toBeInTheDocument();
|
474
474
|
testTabPanel(0);
|
475
|
-
menuItems = _testWrapper.screen.queryAllByRole('
|
475
|
+
menuItems = _testWrapper.screen.queryAllByRole('menuitemradio');
|
476
476
|
expect(menuItems).toHaveLength(tabsWithList[1].list.length);
|
477
477
|
expect(menuItems[0]).not.toHaveFocus();
|
478
478
|
_userEvent["default"].click(menuItems[0]);
|
@@ -510,7 +510,7 @@ test('tab list is accessible via keyboard', function () {
|
|
510
510
|
});
|
511
511
|
expect(_testWrapper.screen.queryByRole('menu')).toBeInTheDocument();
|
512
512
|
testTabPanel(0);
|
513
|
-
var menuItems = _testWrapper.screen.queryAllByRole('
|
513
|
+
var menuItems = _testWrapper.screen.queryAllByRole('menuitemradio');
|
514
514
|
expect(menuItems).toHaveLength(tabsWithList[1].list.length);
|
515
515
|
expect(menuItems[0]).toHaveFocus();
|
516
516
|
_testWrapper.fireEvent.keyDown(menuItems[0], {
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
2
|
-
interface
|
1
|
+
import { MutableRefObject } from 'react';
|
2
|
+
export interface MenuContextValue {
|
3
|
+
onClose?: () => void;
|
4
|
+
closeOnSelect?: boolean;
|
5
|
+
ref?: MutableRefObject<HTMLDivElement | HTMLElement | null>;
|
3
6
|
}
|
4
|
-
export declare const MenuContext: import("react").Context<
|
5
|
-
export declare
|
6
|
-
export {};
|
7
|
+
export declare const MenuContext: import("react").Context<MenuContextValue>;
|
8
|
+
export declare function useMenuContext(): MenuContextValue;
|
@@ -4,13 +4,11 @@ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/obje
|
|
4
4
|
_Object$defineProperty(exports, "__esModule", {
|
5
5
|
value: true
|
6
6
|
});
|
7
|
-
exports.
|
7
|
+
exports.MenuContext = void 0;
|
8
|
+
exports.useMenuContext = useMenuContext;
|
8
9
|
var _react = require("react");
|
9
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
10
|
-
|
11
10
|
var MenuContext = /*#__PURE__*/(0, _react.createContext)({});
|
12
11
|
exports.MenuContext = MenuContext;
|
13
|
-
|
12
|
+
function useMenuContext() {
|
14
13
|
return (0, _react.useContext)(MenuContext);
|
15
|
-
}
|
16
|
-
exports.useMenuContext = useMenuContext;
|
14
|
+
}
|
package/lib/cjs/types/index.d.ts
CHANGED
@@ -14,6 +14,8 @@ export * from './item';
|
|
14
14
|
export * from './link';
|
15
15
|
export * from './listItem';
|
16
16
|
export * from './loader';
|
17
|
+
export * from './menu';
|
18
|
+
export * from './menuItem';
|
17
19
|
export * from './overlayPanel';
|
18
20
|
export * from './popoverContainer';
|
19
21
|
export * from './popoverMenu';
|
package/lib/cjs/types/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
-
var _context, _context2, _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10, _context11, _context12, _context13, _context14, _context15, _context16, _context17, _context18, _context19, _context20, _context21, _context22, _context23, _context24, _context25, _context26, _context27;
|
3
|
+
var _context, _context2, _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10, _context11, _context12, _context13, _context14, _context15, _context16, _context17, _context18, _context19, _context20, _context21, _context22, _context23, _context24, _context25, _context26, _context27, _context28, _context29;
|
4
4
|
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
5
5
|
var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
|
6
6
|
var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
|
@@ -183,8 +183,30 @@ _forEachInstanceProperty(_context16 = _Object$keys(_loader)).call(_context16, fu
|
|
183
183
|
}
|
184
184
|
});
|
185
185
|
});
|
186
|
+
var _menu = require("./menu");
|
187
|
+
_forEachInstanceProperty(_context17 = _Object$keys(_menu)).call(_context17, function (key) {
|
188
|
+
if (key === "default" || key === "__esModule") return;
|
189
|
+
if (key in exports && exports[key] === _menu[key]) return;
|
190
|
+
_Object$defineProperty(exports, key, {
|
191
|
+
enumerable: true,
|
192
|
+
get: function get() {
|
193
|
+
return _menu[key];
|
194
|
+
}
|
195
|
+
});
|
196
|
+
});
|
197
|
+
var _menuItem = require("./menuItem");
|
198
|
+
_forEachInstanceProperty(_context18 = _Object$keys(_menuItem)).call(_context18, function (key) {
|
199
|
+
if (key === "default" || key === "__esModule") return;
|
200
|
+
if (key in exports && exports[key] === _menuItem[key]) return;
|
201
|
+
_Object$defineProperty(exports, key, {
|
202
|
+
enumerable: true,
|
203
|
+
get: function get() {
|
204
|
+
return _menuItem[key];
|
205
|
+
}
|
206
|
+
});
|
207
|
+
});
|
186
208
|
var _overlayPanel = require("./overlayPanel");
|
187
|
-
_forEachInstanceProperty(
|
209
|
+
_forEachInstanceProperty(_context19 = _Object$keys(_overlayPanel)).call(_context19, function (key) {
|
188
210
|
if (key === "default" || key === "__esModule") return;
|
189
211
|
if (key in exports && exports[key] === _overlayPanel[key]) return;
|
190
212
|
_Object$defineProperty(exports, key, {
|
@@ -195,7 +217,7 @@ _forEachInstanceProperty(_context17 = _Object$keys(_overlayPanel)).call(_context
|
|
195
217
|
});
|
196
218
|
});
|
197
219
|
var _popoverContainer = require("./popoverContainer");
|
198
|
-
_forEachInstanceProperty(
|
220
|
+
_forEachInstanceProperty(_context20 = _Object$keys(_popoverContainer)).call(_context20, function (key) {
|
199
221
|
if (key === "default" || key === "__esModule") return;
|
200
222
|
if (key in exports && exports[key] === _popoverContainer[key]) return;
|
201
223
|
_Object$defineProperty(exports, key, {
|
@@ -206,7 +228,7 @@ _forEachInstanceProperty(_context18 = _Object$keys(_popoverContainer)).call(_con
|
|
206
228
|
});
|
207
229
|
});
|
208
230
|
var _popoverMenu = require("./popoverMenu");
|
209
|
-
_forEachInstanceProperty(
|
231
|
+
_forEachInstanceProperty(_context21 = _Object$keys(_popoverMenu)).call(_context21, function (key) {
|
210
232
|
if (key === "default" || key === "__esModule") return;
|
211
233
|
if (key in exports && exports[key] === _popoverMenu[key]) return;
|
212
234
|
_Object$defineProperty(exports, key, {
|
@@ -217,7 +239,7 @@ _forEachInstanceProperty(_context19 = _Object$keys(_popoverMenu)).call(_context1
|
|
217
239
|
});
|
218
240
|
});
|
219
241
|
var _requirementsList = require("./requirementsList");
|
220
|
-
_forEachInstanceProperty(
|
242
|
+
_forEachInstanceProperty(_context22 = _Object$keys(_requirementsList)).call(_context22, function (key) {
|
221
243
|
if (key === "default" || key === "__esModule") return;
|
222
244
|
if (key in exports && exports[key] === _requirementsList[key]) return;
|
223
245
|
_Object$defineProperty(exports, key, {
|
@@ -228,7 +250,7 @@ _forEachInstanceProperty(_context20 = _Object$keys(_requirementsList)).call(_con
|
|
228
250
|
});
|
229
251
|
});
|
230
252
|
var _rockerButtonGroup = require("./rockerButtonGroup");
|
231
|
-
_forEachInstanceProperty(
|
253
|
+
_forEachInstanceProperty(_context23 = _Object$keys(_rockerButtonGroup)).call(_context23, function (key) {
|
232
254
|
if (key === "default" || key === "__esModule") return;
|
233
255
|
if (key in exports && exports[key] === _rockerButtonGroup[key]) return;
|
234
256
|
_Object$defineProperty(exports, key, {
|
@@ -239,7 +261,7 @@ _forEachInstanceProperty(_context21 = _Object$keys(_rockerButtonGroup)).call(_co
|
|
239
261
|
});
|
240
262
|
});
|
241
263
|
var _scrollBox = require("./scrollBox");
|
242
|
-
_forEachInstanceProperty(
|
264
|
+
_forEachInstanceProperty(_context24 = _Object$keys(_scrollBox)).call(_context24, function (key) {
|
243
265
|
if (key === "default" || key === "__esModule") return;
|
244
266
|
if (key in exports && exports[key] === _scrollBox[key]) return;
|
245
267
|
_Object$defineProperty(exports, key, {
|
@@ -250,7 +272,7 @@ _forEachInstanceProperty(_context22 = _Object$keys(_scrollBox)).call(_context22,
|
|
250
272
|
});
|
251
273
|
});
|
252
274
|
var _separator = require("./separator");
|
253
|
-
_forEachInstanceProperty(
|
275
|
+
_forEachInstanceProperty(_context25 = _Object$keys(_separator)).call(_context25, function (key) {
|
254
276
|
if (key === "default" || key === "__esModule") return;
|
255
277
|
if (key in exports && exports[key] === _separator[key]) return;
|
256
278
|
_Object$defineProperty(exports, key, {
|
@@ -261,7 +283,7 @@ _forEachInstanceProperty(_context23 = _Object$keys(_separator)).call(_context23,
|
|
261
283
|
});
|
262
284
|
});
|
263
285
|
var _shared = require("./shared");
|
264
|
-
_forEachInstanceProperty(
|
286
|
+
_forEachInstanceProperty(_context26 = _Object$keys(_shared)).call(_context26, function (key) {
|
265
287
|
if (key === "default" || key === "__esModule") return;
|
266
288
|
if (key in exports && exports[key] === _shared[key]) return;
|
267
289
|
_Object$defineProperty(exports, key, {
|
@@ -272,7 +294,7 @@ _forEachInstanceProperty(_context24 = _Object$keys(_shared)).call(_context24, fu
|
|
272
294
|
});
|
273
295
|
});
|
274
296
|
var _table = require("./table");
|
275
|
-
_forEachInstanceProperty(
|
297
|
+
_forEachInstanceProperty(_context27 = _Object$keys(_table)).call(_context27, function (key) {
|
276
298
|
if (key === "default" || key === "__esModule") return;
|
277
299
|
if (key in exports && exports[key] === _table[key]) return;
|
278
300
|
_Object$defineProperty(exports, key, {
|
@@ -283,7 +305,7 @@ _forEachInstanceProperty(_context25 = _Object$keys(_table)).call(_context25, fun
|
|
283
305
|
});
|
284
306
|
});
|
285
307
|
var _text = require("./text");
|
286
|
-
_forEachInstanceProperty(
|
308
|
+
_forEachInstanceProperty(_context28 = _Object$keys(_text)).call(_context28, function (key) {
|
287
309
|
if (key === "default" || key === "__esModule") return;
|
288
310
|
if (key in exports && exports[key] === _text[key]) return;
|
289
311
|
_Object$defineProperty(exports, key, {
|
@@ -294,7 +316,7 @@ _forEachInstanceProperty(_context26 = _Object$keys(_text)).call(_context26, func
|
|
294
316
|
});
|
295
317
|
});
|
296
318
|
var _tooltipTrigger = require("./tooltipTrigger");
|
297
|
-
_forEachInstanceProperty(
|
319
|
+
_forEachInstanceProperty(_context29 = _Object$keys(_tooltipTrigger)).call(_context29, function (key) {
|
298
320
|
if (key === "default" || key === "__esModule") return;
|
299
321
|
if (key in exports && exports[key] === _tooltipTrigger[key]) return;
|
300
322
|
_Object$defineProperty(exports, key, {
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
import { BoxProps } from './box';
|
3
|
+
import { HoverProps } from './shared';
|
4
|
+
export interface MenuProps extends BoxProps, HoverProps {
|
5
|
+
children?: React.ReactNode;
|
6
|
+
title?: string | undefined;
|
7
|
+
'aria-label'?: string | undefined;
|
8
|
+
isNotFocusedOnHover?: boolean;
|
9
|
+
onAction?: () => void;
|
10
|
+
onSelectionChange?: () => void;
|
11
|
+
isSelected?: boolean;
|
12
|
+
selectionMode?: 'none' | 'single' | 'multiple';
|
13
|
+
disabledKeys?: string[];
|
14
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { Node, TreeState } from 'react-stately';
|
2
|
+
import { TestingAttributes } from './shared/test';
|
3
|
+
import { BoxProps } from './box';
|
4
|
+
export interface MenuItemProps extends BoxProps, TestingAttributes {
|
5
|
+
/** Whether the item is disabled. */
|
6
|
+
isDisabled?: boolean;
|
7
|
+
/** Whether the menu item is selected. */
|
8
|
+
isSelected?: boolean;
|
9
|
+
/** Whether the menu item is currently pressed. */
|
10
|
+
isPressed?: boolean;
|
11
|
+
/**
|
12
|
+
* Whether the containing menu has keyboard focus.
|
13
|
+
* Used to determine when to present hover vs focus styling.
|
14
|
+
*/
|
15
|
+
isFocusVisible?: boolean;
|
16
|
+
/**
|
17
|
+
* Whether menu item should receive focus state on hover.
|
18
|
+
*/
|
19
|
+
isNotFocusedOnHover?: boolean;
|
20
|
+
/** A screen reader only label for the menu item. */
|
21
|
+
/** Handler that is called when the menu should close after selecting an item. */
|
22
|
+
onClose?: () => void;
|
23
|
+
/** Handler that is called when the user activates the item. */
|
24
|
+
onAction?: () => void;
|
25
|
+
item?: Node<object>;
|
26
|
+
state: TreeState<object>;
|
27
|
+
defaultSelectedKey?: string | number;
|
28
|
+
}
|
@@ -14,17 +14,16 @@ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance
|
|
14
14
|
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
|
15
15
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
16
16
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
17
|
-
import React, { forwardRef, useContext
|
17
|
+
import React, { forwardRef, useContext } from 'react';
|
18
18
|
import { mergeProps, useFocusRing, useMenu } from 'react-aria';
|
19
19
|
import { useTreeState } from 'react-stately';
|
20
20
|
import { useHover } from '@react-aria/interactions';
|
21
21
|
import { useSyncRef } from '@react-aria/utils';
|
22
22
|
import { MenuContext } from '../../context/MenuContext';
|
23
|
-
import { usePropWarning } from '../../hooks';
|
23
|
+
import { useLocalOrForwardRef, usePropWarning } from '../../hooks';
|
24
24
|
import ORIENTATION from '../../utils/devUtils/constants/orientation';
|
25
25
|
import Box from '../Box';
|
26
26
|
import MenuItem from '../MenuItem';
|
27
|
-
import { menuPropTypes } from './menuAttributes';
|
28
27
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
29
28
|
var Menu = /*#__PURE__*/forwardRef(function (props, ref) {
|
30
29
|
var _context;
|
@@ -48,12 +47,8 @@ var Menu = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
48
47
|
}),
|
49
48
|
hoverProps = _useHover.hoverProps;
|
50
49
|
var state = useTreeState(completeProps);
|
51
|
-
var menuRef =
|
50
|
+
var menuRef = useLocalOrForwardRef(ref);
|
52
51
|
usePropWarning(props, 'disabled', 'isDisabled');
|
53
|
-
/* istanbul ignore next */
|
54
|
-
useImperativeHandle(ref, function () {
|
55
|
-
return menuRef.current;
|
56
|
-
});
|
57
52
|
var _useMenu = useMenu(completeProps, state, menuRef),
|
58
53
|
menuProps = _useMenu.menuProps;
|
59
54
|
var _useFocusRing = useFocusRing({
|
@@ -69,7 +64,9 @@ var Menu = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
69
64
|
ref: menuRef,
|
70
65
|
variant: "menu",
|
71
66
|
"aria-orientation": ORIENTATION.VERTICAL
|
72
|
-
}, others, mergeProps(focusProps, menuProps, hoverProps)
|
67
|
+
}, others, mergeProps(focusProps, menuProps, hoverProps), {
|
68
|
+
role: "menu"
|
69
|
+
}), _mapInstanceProperty(_context = _Array$from(state.collection)).call(_context, function (item) {
|
73
70
|
return ___EmotionJSX(MenuItem, {
|
74
71
|
key: item.key,
|
75
72
|
item: item,
|
@@ -81,6 +78,5 @@ var Menu = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
81
78
|
});
|
82
79
|
}));
|
83
80
|
});
|
84
|
-
Menu.propTypes = menuPropTypes;
|
85
81
|
Menu.displayName = 'Menu';
|
86
82
|
export default Menu;
|
@@ -1,11 +1,10 @@
|
|
1
|
-
import _objectDestructuringEmpty from "@babel/runtime-corejs3/helpers/esm/objectDestructuringEmpty";
|
2
1
|
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
3
2
|
import React from 'react';
|
4
3
|
import { Item } from 'react-stately';
|
5
4
|
import { withDesign } from 'storybook-addon-designs';
|
6
5
|
import DocsLayout from '../../../.storybook/storybookDocsLayout';
|
7
6
|
import { Menu, Text } from '../../index';
|
8
|
-
import { FIGMA_LINKS } from '../../utils/designUtils/figmaLinks
|
7
|
+
import { FIGMA_LINKS } from '../../utils/designUtils/figmaLinks';
|
9
8
|
import MenuReadme from './Menu.mdx';
|
10
9
|
import { menuArgTypes } from './menuAttributes';
|
11
10
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
@@ -31,8 +30,7 @@ export default {
|
|
31
30
|
},
|
32
31
|
argTypes: menuArgTypes
|
33
32
|
};
|
34
|
-
export var Default = function Default(
|
35
|
-
var args = _extends({}, (_objectDestructuringEmpty(_ref), _ref));
|
33
|
+
export var Default = function Default(args) {
|
36
34
|
return ___EmotionJSX(Menu, _extends({
|
37
35
|
"aria-label": "Example Menu"
|
38
36
|
}, args), ___EmotionJSX(Item, {
|
@@ -15,20 +15,20 @@ var defaultProps = {
|
|
15
15
|
'aria-label': 'testLabel'
|
16
16
|
};
|
17
17
|
var defaultItems = [{
|
18
|
-
|
18
|
+
id: 'a',
|
19
19
|
children: 'A'
|
20
20
|
}, {
|
21
|
-
|
21
|
+
id: 'b',
|
22
22
|
children: 'B'
|
23
23
|
}, {
|
24
|
-
|
24
|
+
id: 'c',
|
25
25
|
children: 'C'
|
26
26
|
}];
|
27
27
|
var getComponent = function getComponent() {
|
28
28
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
29
29
|
return render(___EmotionJSX(Menu, _extends({}, defaultProps, props), _mapInstanceProperty(defaultItems).call(defaultItems, function (item) {
|
30
30
|
return ___EmotionJSX(Item, _extends({
|
31
|
-
key: item.
|
31
|
+
key: item.id
|
32
32
|
}, item));
|
33
33
|
})));
|
34
34
|
};
|
@@ -38,7 +38,7 @@ universalComponentTests({
|
|
38
38
|
renderComponent: function renderComponent(props) {
|
39
39
|
return ___EmotionJSX(Menu, _extends({}, defaultProps, props), _mapInstanceProperty(defaultItems).call(defaultItems, function (item) {
|
40
40
|
return ___EmotionJSX(Item, _extends({
|
41
|
-
key: item.
|
41
|
+
key: item.id
|
42
42
|
}, item));
|
43
43
|
}));
|
44
44
|
}
|
@@ -121,11 +121,11 @@ test('should fire onAction', function () {
|
|
121
121
|
fireEvent.keyUp(menuItems[0], {
|
122
122
|
key: 'Enter'
|
123
123
|
});
|
124
|
-
expect(onAction).toHaveBeenNthCalledWith(1, defaultItems[0].
|
124
|
+
expect(onAction).toHaveBeenNthCalledWith(1, defaultItems[0].id);
|
125
125
|
|
126
126
|
// Click events
|
127
127
|
userEvent.click(menuItems[1]);
|
128
|
-
expect(onAction).toHaveBeenNthCalledWith(2, defaultItems[1].
|
128
|
+
expect(onAction).toHaveBeenNthCalledWith(2, defaultItems[1].id);
|
129
129
|
});
|
130
130
|
test('should not fire onSelectionChange when selectionMode is none', function () {
|
131
131
|
var onSelectionChange = jest.fn();
|
@@ -2,13 +2,11 @@ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
|
2
2
|
import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
|
3
3
|
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
4
4
|
var _excluded = ["isSeparator", "isPressed", "data-id"];
|
5
|
-
import React, { forwardRef,
|
5
|
+
import React, { forwardRef, useState } from 'react';
|
6
6
|
import { mergeProps, useMenuItem } from 'react-aria';
|
7
7
|
import { useFocus, useHover, usePress } from '@react-aria/interactions';
|
8
|
-
import PropTypes from 'prop-types';
|
9
8
|
import { useMenuContext } from '../../context/MenuContext';
|
10
|
-
import { usePropWarning, useStatusClasses } from '../../hooks';
|
11
|
-
import { isIterableProp } from '../../utils/devUtils/props/isIterable';
|
9
|
+
import { useLocalOrForwardRef, usePropWarning, useStatusClasses } from '../../hooks';
|
12
10
|
import Box from '../Box';
|
13
11
|
|
14
12
|
/**
|
@@ -28,24 +26,21 @@ var MenuItem = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
28
26
|
var _useMenuContext = useMenuContext(),
|
29
27
|
onClose = _useMenuContext.onClose,
|
30
28
|
closeOnSelect = _useMenuContext.closeOnSelect;
|
31
|
-
var
|
32
|
-
|
33
|
-
|
29
|
+
var _ref = item,
|
30
|
+
key = _ref.key,
|
31
|
+
rendered = _ref.rendered,
|
32
|
+
itemProps = _ref.props;
|
34
33
|
var isSeparator = itemProps.isSeparator,
|
35
34
|
propIsPressed = itemProps.isPressed,
|
36
35
|
dataId = itemProps['data-id'],
|
37
36
|
others = _objectWithoutProperties(itemProps, _excluded);
|
38
37
|
var isDisabled = propIsDisabled || state.disabledKeys.has(key);
|
39
38
|
var isSelected = state.selectionManager.isSelected(key);
|
40
|
-
var menuItemRef = useRef();
|
41
39
|
usePropWarning(props, 'disabled', 'isDisabled');
|
42
|
-
|
43
|
-
useImperativeHandle(ref, function () {
|
44
|
-
return menuItemRef.current;
|
45
|
-
});
|
40
|
+
var menuItemRef = useLocalOrForwardRef(ref);
|
46
41
|
var _useMenuItem = useMenuItem({
|
47
|
-
key: item.key,
|
48
|
-
'aria-label': item['aria-label'],
|
42
|
+
key: item === null || item === void 0 ? void 0 : item.key,
|
43
|
+
'aria-label': item === null || item === void 0 ? void 0 : item['aria-label'],
|
49
44
|
isDisabled: isDisabled,
|
50
45
|
onAction: onAction,
|
51
46
|
isSelected: isSelected,
|
@@ -91,49 +86,11 @@ var MenuItem = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
91
86
|
variant: isSeparator ? 'menuItem.separator' : 'menuItem.item',
|
92
87
|
"data-id": dataId,
|
93
88
|
"aria-disabled": isDisabled
|
94
|
-
}, mergeProps(pressProps, hoverProps, focusProps, menuItemProps, others)
|
89
|
+
}, mergeProps(pressProps, hoverProps, focusProps, menuItemProps, others), {
|
90
|
+
role: menuItemProps.role
|
91
|
+
}), rendered);
|
95
92
|
});
|
96
93
|
MenuItem.displayName = 'MenuItem';
|
97
|
-
MenuItem.propTypes = {
|
98
|
-
/** Whether the item is disabled. */
|
99
|
-
isDisabled: PropTypes.bool,
|
100
|
-
/** Whether the menu item is selected. */
|
101
|
-
isSelected: PropTypes.bool,
|
102
|
-
/** Whether the menu item is currently pressed. */
|
103
|
-
isPressed: PropTypes.bool,
|
104
|
-
/**
|
105
|
-
* Whether the containing menu has keyboard focus.
|
106
|
-
* Used to determine when to present hover vs focus styling.
|
107
|
-
*/
|
108
|
-
isFocusVisible: PropTypes.bool,
|
109
|
-
/**
|
110
|
-
* Whether menu item should receive focus state on hover.
|
111
|
-
*/
|
112
|
-
isNotFocusedOnHover: PropTypes.bool,
|
113
|
-
/** A screen reader only label for the menu item. */
|
114
|
-
'aria-label': PropTypes.string,
|
115
|
-
/** Handler that is called when the menu should close after selecting an item. */
|
116
|
-
onClose: PropTypes.func,
|
117
|
-
/** Handler that is called when the user activates the item. */
|
118
|
-
onAction: PropTypes.func,
|
119
|
-
item: PropTypes.shape({
|
120
|
-
'aria-label': PropTypes.string,
|
121
|
-
key: PropTypes.string,
|
122
|
-
props: PropTypes.shape({
|
123
|
-
'data-id': PropTypes.string,
|
124
|
-
isSeparator: PropTypes.bool,
|
125
|
-
isPressed: PropTypes.bool
|
126
|
-
}),
|
127
|
-
rendered: PropTypes.node,
|
128
|
-
isDisabled: PropTypes.bool
|
129
|
-
}),
|
130
|
-
state: PropTypes.shape({
|
131
|
-
disabledKeys: isIterableProp,
|
132
|
-
selectionManager: PropTypes.shape({
|
133
|
-
isSelected: PropTypes.func
|
134
|
-
})
|
135
|
-
})
|
136
|
-
};
|
137
94
|
MenuItem.defaultProps = {
|
138
95
|
isDisabled: false,
|
139
96
|
isPressed: false
|
@@ -12,15 +12,18 @@ var testId = 'testId';
|
|
12
12
|
var defaultMenuItems = [{
|
13
13
|
key: 'MenuItem 1',
|
14
14
|
children: 'MenuItem 1',
|
15
|
-
'data-id': 'menuItem1'
|
15
|
+
'data-id': 'menuItem1',
|
16
|
+
isPressed: false
|
16
17
|
}, {
|
17
18
|
key: 'MenuItem 2',
|
18
19
|
children: 'MenuItem 2',
|
19
|
-
'data-id': 'menuItem2'
|
20
|
+
'data-id': 'menuItem2',
|
21
|
+
isPressed: false
|
20
22
|
}, {
|
21
23
|
key: 'MenuItem 3',
|
22
24
|
children: 'MenuItem 3',
|
23
|
-
'data-id': 'menuItem3'
|
25
|
+
'data-id': 'menuItem3',
|
26
|
+
isPressed: false
|
24
27
|
}];
|
25
28
|
var defaultProps = {
|
26
29
|
'data-testid': testId,
|
@@ -35,9 +38,7 @@ var getComponent = function getComponent() {
|
|
35
38
|
_ref$renderFn = _ref.renderFn,
|
36
39
|
renderFn = _ref$renderFn === void 0 ? render : _ref$renderFn;
|
37
40
|
return renderFn(___EmotionJSX(Menu, _extends({}, defaultProps, props), _mapInstanceProperty(items).call(items, function (li) {
|
38
|
-
return ___EmotionJSX(Item, _extends({
|
39
|
-
key: li.key
|
40
|
-
}, li, {
|
41
|
+
return ___EmotionJSX(Item, _extends({}, li, {
|
41
42
|
sx: {
|
42
43
|
backgroundColor: 'orange'
|
43
44
|
}
|
@@ -49,9 +50,7 @@ var getComponent = function getComponent() {
|
|
49
50
|
universalComponentTests({
|
50
51
|
renderComponent: function renderComponent(props) {
|
51
52
|
return ___EmotionJSX(Menu, _extends({}, defaultProps, props), _mapInstanceProperty(defaultMenuItems).call(defaultMenuItems, function (li) {
|
52
|
-
return ___EmotionJSX(Item, _extends({
|
53
|
-
key: li.key
|
54
|
-
}, li, {
|
53
|
+
return ___EmotionJSX(Item, _extends({}, li, {
|
55
54
|
sx: {
|
56
55
|
backgroundColor: 'orange'
|
57
56
|
}
|
@@ -169,4 +168,20 @@ test('custom props are passed into menuItem', function () {
|
|
169
168
|
var itemText1 = defaultMenuItems[0].children;
|
170
169
|
var menuItem1 = screen.getByText(itemText1);
|
171
170
|
expect(menuItem1).toHaveStyleRule('background-color', 'orange');
|
171
|
+
});
|
172
|
+
test('Selection mode given as single', function () {
|
173
|
+
getComponent({
|
174
|
+
selectionMode: 'single',
|
175
|
+
defaultSelectedKeys: [defaultMenuItems[0].key]
|
176
|
+
});
|
177
|
+
var menuItems = screen.queryAllByRole('menuitemradio');
|
178
|
+
expect(menuItems).toHaveLength(defaultMenuItems.length);
|
179
|
+
});
|
180
|
+
test('Selection mode given as multiple', function () {
|
181
|
+
getComponent({
|
182
|
+
selectionMode: 'multiple',
|
183
|
+
defaultSelectedKeys: [defaultMenuItems[0].key]
|
184
|
+
});
|
185
|
+
var menuItems = screen.queryAllByRole('menuitemcheckbox');
|
186
|
+
expect(menuItems).toHaveLength(defaultMenuItems.length);
|
172
187
|
});
|
@@ -212,12 +212,12 @@ export var WithList = function WithList() {
|
|
212
212
|
key: 'tab1list',
|
213
213
|
name: 'Tab 1 list',
|
214
214
|
children: 'Tab 1 from list',
|
215
|
-
role: '
|
215
|
+
role: 'menuitemradio'
|
216
216
|
}, {
|
217
217
|
key: 'tab2list',
|
218
218
|
name: 'Tab 2 list',
|
219
219
|
children: 'Tab 2 from list',
|
220
|
-
role: '
|
220
|
+
role: 'menuitemradio'
|
221
221
|
}]
|
222
222
|
}]);
|
223
223
|
return ___EmotionJSX(Tabs, {
|
@@ -54,12 +54,12 @@ var tabsWithList = [{
|
|
54
54
|
key: 'tab1list',
|
55
55
|
name: 'Tab 1 list',
|
56
56
|
children: 'Tab 1 from list',
|
57
|
-
role: '
|
57
|
+
role: 'menuitemradio'
|
58
58
|
}, {
|
59
59
|
key: 'tab2list',
|
60
60
|
name: 'Tab 2 list',
|
61
61
|
children: 'Tab 2 from list',
|
62
|
-
role: '
|
62
|
+
role: 'menuitemradio'
|
63
63
|
}]
|
64
64
|
}];
|
65
65
|
var defaultProps = {
|
@@ -471,7 +471,7 @@ test('will render tab with list if provided', /*#__PURE__*/_asyncToGenerator( /*
|
|
471
471
|
userEvent.click(menuBtn);
|
472
472
|
expect(screen.queryByRole('menu')).toBeInTheDocument();
|
473
473
|
testTabPanel(0);
|
474
|
-
menuItems = screen.queryAllByRole('
|
474
|
+
menuItems = screen.queryAllByRole('menuitemradio');
|
475
475
|
expect(menuItems).toHaveLength(tabsWithList[1].list.length);
|
476
476
|
expect(menuItems[0]).not.toHaveFocus();
|
477
477
|
userEvent.click(menuItems[0]);
|
@@ -509,7 +509,7 @@ test('tab list is accessible via keyboard', function () {
|
|
509
509
|
});
|
510
510
|
expect(screen.queryByRole('menu')).toBeInTheDocument();
|
511
511
|
testTabPanel(0);
|
512
|
-
var menuItems = screen.queryAllByRole('
|
512
|
+
var menuItems = screen.queryAllByRole('menuitemradio');
|
513
513
|
expect(menuItems).toHaveLength(tabsWithList[1].list.length);
|
514
514
|
expect(menuItems[0]).toHaveFocus();
|
515
515
|
fireEvent.keyDown(menuItems[0], {
|
@@ -1,8 +1,5 @@
|
|
1
1
|
import { createContext, useContext } from 'react';
|
2
|
-
|
3
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
4
|
-
|
5
2
|
export var MenuContext = /*#__PURE__*/createContext({});
|
6
|
-
export
|
3
|
+
export function useMenuContext() {
|
7
4
|
return useContext(MenuContext);
|
8
|
-
}
|
5
|
+
}
|
package/lib/types/index.js
CHANGED
@@ -14,6 +14,8 @@ export * from './item';
|
|
14
14
|
export * from './link';
|
15
15
|
export * from './listItem';
|
16
16
|
export * from './loader';
|
17
|
+
export * from './menu';
|
18
|
+
export * from './menuItem';
|
17
19
|
export * from './overlayPanel';
|
18
20
|
export * from './popoverContainer';
|
19
21
|
export * from './popoverMenu';
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|