@pingux/astro 2.84.0-alpha.2 → 2.84.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.
Files changed (32) hide show
  1. package/lib/cjs/components/LinkSelectField/LinkSelectField.stories.js +3 -6
  2. package/lib/cjs/components/Menu/Menu.js +15 -3
  3. package/lib/cjs/components/Menu/Menu.test.js +23 -0
  4. package/lib/cjs/components/MenuSection/MenuSection.d.ts +9 -0
  5. package/lib/cjs/components/MenuSection/MenuSection.js +76 -0
  6. package/lib/cjs/components/MenuSection/MenuSection.styles.d.ts +21 -0
  7. package/lib/cjs/components/MenuSection/MenuSection.styles.js +35 -0
  8. package/lib/cjs/components/MenuSection/MenuSection.test.d.ts +1 -0
  9. package/lib/cjs/components/MenuSection/MenuSection.test.js +100 -0
  10. package/lib/cjs/components/MenuSection/index.d.ts +1 -0
  11. package/lib/cjs/components/MenuSection/index.js +14 -0
  12. package/lib/cjs/components/PopoverMenu/PopoverMenu.stories.d.ts +2 -0
  13. package/lib/cjs/components/PopoverMenu/PopoverMenu.stories.js +73 -5
  14. package/lib/cjs/components/SelectField/SelectField.stories.js +3 -6
  15. package/lib/cjs/styles/variants/variants.js +2 -0
  16. package/lib/cjs/types/index.d.ts +1 -0
  17. package/lib/cjs/types/index.js +32 -21
  18. package/lib/cjs/types/menuSection.d.ts +24 -0
  19. package/lib/cjs/types/menuSection.js +6 -0
  20. package/lib/components/LinkSelectField/LinkSelectField.stories.js +4 -7
  21. package/lib/components/Menu/Menu.js +15 -3
  22. package/lib/components/Menu/Menu.test.js +24 -1
  23. package/lib/components/MenuSection/MenuSection.js +64 -0
  24. package/lib/components/MenuSection/MenuSection.styles.js +27 -0
  25. package/lib/components/MenuSection/MenuSection.test.js +97 -0
  26. package/lib/components/MenuSection/index.js +1 -0
  27. package/lib/components/PopoverMenu/PopoverMenu.stories.js +70 -4
  28. package/lib/components/SelectField/SelectField.stories.js +4 -7
  29. package/lib/styles/variants/variants.js +2 -0
  30. package/lib/types/index.js +1 -0
  31. package/lib/types/menuSection.js +1 -0
  32. package/package.json +1 -1
@@ -181,18 +181,15 @@ exports.Controlled = Controlled;
181
181
  var WithNoneOption = function WithNoneOption() {
182
182
  return (0, _react2.jsx)(_index.LinkSelectField, {
183
183
  label: "What's your favorite color?"
184
- }, (0, _react2.jsx)(_index.Item, {
184
+ }, (0, _react2.jsx)(_index.Section, null, (0, _react2.jsx)(_index.Item, {
185
185
  key: "none"
186
- }, "None"), (0, _react2.jsx)(_index.Item, {
187
- isSeparator: true,
188
- textValue: "-"
189
- }, (0, _react2.jsx)(_index.Separator, null)), (0, _react2.jsx)(_index.Item, {
186
+ }, "None")), (0, _react2.jsx)(_index.Section, null, (0, _react2.jsx)(_index.Item, {
190
187
  key: "red"
191
188
  }, "Red"), (0, _react2.jsx)(_index.Item, {
192
189
  key: "blue"
193
190
  }, "Blue"), (0, _react2.jsx)(_index.Item, {
194
191
  key: "yellow"
195
- }, "Yellow"));
192
+ }, "Yellow")));
196
193
  };
197
194
  exports.WithNoneOption = WithNoneOption;
198
195
  var DisabledField = function DisabledField() {
@@ -30,6 +30,7 @@ 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 _MenuSection = _interopRequireDefault(require("../MenuSection"));
33
34
  var _react2 = require("@emotion/react");
34
35
  var _excluded = ["isDisabled", "isNotFocusedOnHover", "onAction", "onHoverChange", "onHoverEnd", "onHoverStart", "onSelectionChange", "selectionMode"];
35
36
  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); }
@@ -77,10 +78,21 @@ var Menu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
77
78
  "aria-orientation": _orientation["default"].VERTICAL
78
79
  }, others, (0, _reactAria.mergeProps)(focusProps, menuProps, hoverProps), {
79
80
  role: "menu"
80
- }), (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (item) {
81
+ }), (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (element) {
82
+ if (element.type === 'section') {
83
+ return (0, _react2.jsx)(_MenuSection["default"], {
84
+ key: element.key,
85
+ section: element,
86
+ state: state,
87
+ onAction: onAction,
88
+ isDisabled: isDisabled,
89
+ isFocusVisible: isFocusVisible,
90
+ isNotFocusedOnHover: isNotFocusedOnHover
91
+ });
92
+ }
81
93
  return (0, _react2.jsx)(_MenuItem["default"], {
82
- key: item.key,
83
- item: item,
94
+ key: element.key,
95
+ item: element,
84
96
  state: state,
85
97
  onAction: onAction,
86
98
  isDisabled: isDisabled,
@@ -54,6 +54,29 @@ test('should render basic menu with children', function () {
54
54
  expect(menuItems).toHaveLength(3);
55
55
  expect(menu).toHaveAttribute('aria-orientation', _orientation["default"].VERTICAL);
56
56
  });
57
+ test('should render sections when sections are passed as Children', function () {
58
+ var menuSections = [{
59
+ key: 'menuSection 1',
60
+ children: defaultItems
61
+ }, {
62
+ key: 'menuSection 2',
63
+ children: defaultItems
64
+ }];
65
+ (0, _testWrapper.render)((0, _react2.jsx)(_index.Menu, defaultProps, (0, _map["default"])(menuSections).call(menuSections, function (section) {
66
+ var _context;
67
+ return (0, _react2.jsx)(_index.Section, section, (0, _map["default"])(_context = section.children).call(_context, function (item) {
68
+ return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({
69
+ key: item.id
70
+ }, item));
71
+ }));
72
+ })));
73
+ var menu = _testWrapper.screen.queryByRole('menu');
74
+ expect(menu).toBeInTheDocument();
75
+ var menuSection = _testWrapper.screen.queryAllByRole('group');
76
+ expect(menuSection).toHaveLength(2);
77
+ var menuItems = _testWrapper.screen.getAllByRole('menuitem');
78
+ expect(menuItems).toHaveLength(6);
79
+ });
57
80
  test('should render items when selectionMode is set to single', function () {
58
81
  getComponent({
59
82
  selectionMode: 'single'
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { MenuSectionProps } from '../../types';
3
+ /**
4
+ * Menu Section 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 MenuSection: React.ForwardRefExoticComponent<MenuSectionProps & React.RefAttributes<HTMLDivElement>>;
9
+ export default MenuSection;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
5
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
7
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
8
+ _Object$defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ exports["default"] = void 0;
12
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
13
+ var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));
14
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
15
+ var _react = _interopRequireWildcard(require("react"));
16
+ var _reactAria = require("react-aria");
17
+ var _hooks = require("../../hooks");
18
+ var _Box = _interopRequireDefault(require("../Box"));
19
+ var _MenuItem = _interopRequireDefault(require("../MenuItem"));
20
+ var _Separator = _interopRequireDefault(require("../Separator"));
21
+ var _react2 = require("@emotion/react");
22
+ 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); }
23
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
+ /**
25
+ * Menu Section component intended to be used within Menu or PopupMenu.
26
+ * This component is not intented to be used outside of Menu or independently.
27
+ * Utilizes [React Aria](https://react-spectrum.adobe.com/react-aria/useMenu.html)
28
+ */var MenuSection = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
29
+ var _context;
30
+ var section = props.section,
31
+ state = props.state,
32
+ onAction = props.onAction,
33
+ isDisabled = props.isDisabled,
34
+ isFocusVisible = props.isFocusVisible,
35
+ isNotFocusedOnHover = props.isNotFocusedOnHover;
36
+ var menuSectionRef = (0, _hooks.useLocalOrForwardRef)(ref);
37
+ var _useMenuSection = (0, _reactAria.useMenuSection)({
38
+ heading: section.rendered,
39
+ 'aria-label': section['aria-label']
40
+ }),
41
+ itemProps = _useMenuSection.itemProps,
42
+ groupProps = _useMenuSection.groupProps,
43
+ headingProps = _useMenuSection.headingProps;
44
+ return (0, _react2.jsx)(_react["default"].Fragment, null, section.key !== state.collection.getFirstKey() && (0, _react2.jsx)(_Separator["default"], {
45
+ as: "li",
46
+ p: 0,
47
+ m: 0
48
+ }), (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
49
+ as: "li"
50
+ }, itemProps, {
51
+ ref: menuSectionRef,
52
+ role: "presentation"
53
+ }), section.rendered && (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
54
+ as: "span",
55
+ variant: "menuSection.sectionTitle"
56
+ }, headingProps, {
57
+ role: "presentation"
58
+ }), section.rendered), (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
59
+ as: "ul",
60
+ variant: "menuSection.section"
61
+ }, groupProps, {
62
+ role: "group"
63
+ }), (0, _map["default"])(_context = (0, _from["default"])(section.childNodes)).call(_context, function (node) {
64
+ return (0, _react2.jsx)(_MenuItem["default"], {
65
+ key: node.key,
66
+ item: node,
67
+ state: state,
68
+ onAction: onAction,
69
+ isDisabled: isDisabled,
70
+ isFocusVisible: isFocusVisible,
71
+ isNotFocusedOnHover: isNotFocusedOnHover
72
+ });
73
+ }))));
74
+ });
75
+ var _default = MenuSection;
76
+ exports["default"] = _default;
@@ -0,0 +1,21 @@
1
+ declare const _default: {
2
+ section: {
3
+ borderRadius: number;
4
+ padding: number;
5
+ margin: number;
6
+ listStyle: string;
7
+ maxWidth: number;
8
+ outline: string;
9
+ overflow: string;
10
+ minWidth: string;
11
+ };
12
+ sectionTitle: {
13
+ fontSize: string;
14
+ fontWeight: string;
15
+ color: string;
16
+ height: string;
17
+ ml: string;
18
+ justifyContent: string;
19
+ };
20
+ };
21
+ export default _default;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
4
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
5
+ var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
7
+ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
8
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
9
+ var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
10
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
11
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
12
+ _Object$defineProperty(exports, "__esModule", {
13
+ value: true
14
+ });
15
+ exports["default"] = void 0;
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
17
+ var _Menu = _interopRequireDefault(require("../Menu/Menu.styles"));
18
+ 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; }
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
20
+ var section = _objectSpread(_objectSpread({}, _Menu["default"]), {}, {
21
+ borderRadius: 0
22
+ });
23
+ var sectionTitle = {
24
+ fontSize: 'sm',
25
+ fontWeight: '3',
26
+ color: 'text.secondary',
27
+ height: '36px',
28
+ ml: 'sm',
29
+ justifyContent: 'center'
30
+ };
31
+ var _default = {
32
+ section: section,
33
+ sectionTitle: sectionTitle
34
+ };
35
+ exports["default"] = _default;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
5
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
6
+ var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _index = require("../../index");
9
+ var _testWrapper = require("../../utils/testUtils/testWrapper");
10
+ var _universalComponentTest = require("../../utils/testUtils/universalComponentTest");
11
+ var _react2 = require("@emotion/react");
12
+ var testId = 'testId';
13
+ var defaultMenuSections = [{
14
+ key: 'menuSection 1',
15
+ 'data-id': 'menuSection1',
16
+ title: 'Section 1',
17
+ children: [{
18
+ key: 'menuItem1',
19
+ children: 'MenuItem 1',
20
+ 'data-id': 'menuItem1',
21
+ isPressed: false,
22
+ backgroundColor: 'orange'
23
+ }]
24
+ }, {
25
+ key: 'menuSection 2',
26
+ 'data-id': 'menuSection2',
27
+ children: [{
28
+ key: 'menuItem2',
29
+ children: 'MenuItem 2',
30
+ 'data-id': 'menuItem1',
31
+ isPressed: false
32
+ }, {
33
+ key: 'menuItem3',
34
+ children: 'MenuItem 3',
35
+ 'data-id': 'menuItem1',
36
+ isPressed: false
37
+ }]
38
+ }];
39
+ var defaultProps = {
40
+ 'data-testid': testId,
41
+ defaultSelectedKey: 'menuItem1',
42
+ 'aria-label': 'testLabel'
43
+ };
44
+ var getComponent = function getComponent() {
45
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
46
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
47
+ _ref$items = _ref.items,
48
+ items = _ref$items === void 0 ? defaultMenuSections : _ref$items,
49
+ _ref$renderFn = _ref.renderFn,
50
+ renderFn = _ref$renderFn === void 0 ? _testWrapper.render : _ref$renderFn;
51
+ return renderFn((0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({}, defaultProps, props), (0, _map["default"])(items).call(items, function (section) {
52
+ var _context;
53
+ return (0, _react2.jsx)(_index.Section, section, (0, _map["default"])(_context = section.children).call(_context, function (li) {
54
+ return (0, _react2.jsx)(_index.Item, li);
55
+ }));
56
+ })));
57
+ };
58
+
59
+ // Needs to be added to each components test file
60
+ (0, _universalComponentTest.universalComponentTests)({
61
+ renderComponent: function renderComponent(props) {
62
+ return (0, _react2.jsx)(_index.Menu, (0, _extends2["default"])({}, defaultProps, props), (0, _map["default"])(defaultMenuSections).call(defaultMenuSections, function (section) {
63
+ var _context2;
64
+ return (0, _react2.jsx)(_index.Section, section, (0, _map["default"])(_context2 = section.children).call(_context2, function (li) {
65
+ return (0, _react2.jsx)(_index.Item, (0, _extends2["default"])({}, li, {
66
+ sx: {
67
+ backgroundColor: 'orange'
68
+ }
69
+ }));
70
+ }));
71
+ }));
72
+ }
73
+ });
74
+ test('renders menu with menu sections and titles', function () {
75
+ getComponent();
76
+ var menu = _testWrapper.screen.getByRole('menu');
77
+ var menuSections = _testWrapper.screen.getAllByRole('group');
78
+ var menuTitle = _testWrapper.screen.getByText('Section 1');
79
+ expect(menu).toBeInTheDocument();
80
+ expect(menuTitle).toBeInTheDocument();
81
+ expect(menuSections).toHaveLength(defaultMenuSections.length);
82
+ });
83
+ test('renders sections with menu items', function () {
84
+ getComponent();
85
+ var menuItems = _testWrapper.screen.getAllByRole('menuitem');
86
+ expect(menuItems).toHaveLength((0, _reduce["default"])(defaultMenuSections).call(defaultMenuSections, function (acc, section) {
87
+ return acc + section.children.length;
88
+ }, 0));
89
+ });
90
+ test('custom props are passed into menuItem', function () {
91
+ getComponent();
92
+ var itemText1 = defaultMenuSections[0].children[0].children;
93
+ var menuItem1 = _testWrapper.screen.getByText(itemText1);
94
+ expect(menuItem1).toHaveStyleRule('background-color', 'orange');
95
+ });
96
+ test('renders separator before menu section if it is not the first section', function () {
97
+ getComponent();
98
+ var separators = _testWrapper.screen.getByRole('separator');
99
+ expect(separators).toBeInTheDocument();
100
+ });
@@ -0,0 +1 @@
1
+ export { default } from './MenuSection';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ _Object$defineProperty(exports, "default", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _MenuSection["default"];
12
+ }
13
+ });
14
+ var _MenuSection = _interopRequireDefault(require("./MenuSection"));
@@ -8,3 +8,5 @@ export declare const Controlled: StoryFn;
8
8
  export declare const Placement: StoryFn;
9
9
  export declare const NotFlippable: StoryFn;
10
10
  export declare const NotClosedOnSelect: StoryFn;
11
+ export declare const WithSeparator: StoryFn<PopoverMenuProps>;
12
+ export declare const WithSections: StoryFn<PopoverMenuProps>;
@@ -8,7 +8,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
8
8
  _Object$defineProperty(exports, "__esModule", {
9
9
  value: true
10
10
  });
11
- exports["default"] = exports.Placement = exports.NotFlippable = exports.NotClosedOnSelect = exports.DefaultOpen = exports.Default = exports.Controlled = void 0;
11
+ exports["default"] = exports.WithSeparator = exports.WithSections = exports.Placement = exports.NotFlippable = exports.NotClosedOnSelect = exports.DefaultOpen = exports.Default = exports.Controlled = void 0;
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
14
  var _DotsVerticalIcon = _interopRequireDefault(require("@pingux/mdi-react/DotsVerticalIcon"));
@@ -103,12 +103,12 @@ var DefaultOpen = function DefaultOpen() {
103
103
  }
104
104
  })), (0, _react2.jsx)(_index.Menu, {
105
105
  onAction: (0, _addonActions.action)('onAction'),
106
- disabledKeys: ['duplicate']
106
+ disabledKeys: ['disabledItem']
107
107
  }, (0, _react2.jsx)(_index.Item, {
108
108
  key: "edit"
109
109
  }, "Edit"), (0, _react2.jsx)(_index.Item, {
110
- key: "duplicate"
111
- }, "Duplicate"), (0, _react2.jsx)(_index.Item, {
110
+ key: "disabledItem"
111
+ }, "Disabled Item"), (0, _react2.jsx)(_index.Item, {
112
112
  key: "delete",
113
113
  textValue: "delete"
114
114
  }, (0, _react2.jsx)(_index.Text, {
@@ -242,4 +242,72 @@ var NotClosedOnSelect = function NotClosedOnSelect() {
242
242
  }, "Delete")))))
243
243
  );
244
244
  };
245
- exports.NotClosedOnSelect = NotClosedOnSelect;
245
+ exports.NotClosedOnSelect = NotClosedOnSelect;
246
+ var WithSeparator = function WithSeparator(args) {
247
+ return (
248
+ // Application must be wrapped in an OverlayProvider so that it can be hidden from screen
249
+ // readers when an overlay opens.
250
+ (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.PopoverMenu, args, (0, _react2.jsx)(_index.IconButton, {
251
+ "aria-label": "more options",
252
+ variant: "inverted"
253
+ }, (0, _react2.jsx)(_index.Icon, {
254
+ icon: _DotsVerticalIcon["default"],
255
+ size: "md",
256
+ title: {
257
+ name: 'Dots Vertical Icon'
258
+ }
259
+ })), (0, _react2.jsx)(_index.Menu, {
260
+ onAction: (0, _addonActions.action)('onAction'),
261
+ disabledKeys: ['disabledItem']
262
+ }, (0, _react2.jsx)(_index.Section, null, (0, _react2.jsx)(_index.Item, {
263
+ key: "edit"
264
+ }, "Edit")), (0, _react2.jsx)(_index.Section, null, (0, _react2.jsx)(_index.Item, {
265
+ key: "disabledItem"
266
+ }, "Disabled Item"), (0, _react2.jsx)(_index.Item, {
267
+ key: "delete",
268
+ textValue: "delete"
269
+ }, (0, _react2.jsx)(_index.Text, {
270
+ color: "critical.bright"
271
+ }, "Delete"))))))
272
+ );
273
+ };
274
+ exports.WithSeparator = WithSeparator;
275
+ var WithSections = function WithSections(args) {
276
+ return (
277
+ // Application must be wrapped in an OverlayProvider so that it can be hidden from screen
278
+ // readers when an overlay opens.
279
+ (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.PopoverMenu, args, (0, _react2.jsx)(_index.IconButton, {
280
+ "aria-label": "more options",
281
+ variant: "inverted"
282
+ }, (0, _react2.jsx)(_index.Icon, {
283
+ icon: _DotsVerticalIcon["default"],
284
+ size: "md",
285
+ title: {
286
+ name: 'Dots Vertical Icon'
287
+ }
288
+ })), (0, _react2.jsx)(_index.Menu, {
289
+ onAction: (0, _addonActions.action)('onAction'),
290
+ disabledKeys: ['disabledItem']
291
+ }, (0, _react2.jsx)(_index.Section, {
292
+ key: "section 1",
293
+ title: "Section 1"
294
+ }, (0, _react2.jsx)(_index.Item, {
295
+ key: "edit"
296
+ }, "Edit"), (0, _react2.jsx)(_index.Item, {
297
+ key: "disabledItem"
298
+ }, "Disabled Item"), (0, _react2.jsx)(_index.Item, {
299
+ key: "copy"
300
+ }, "Copy")), (0, _react2.jsx)(_index.Section, {
301
+ key: "section 2",
302
+ title: "Section 2"
303
+ }, (0, _react2.jsx)(_index.Item, {
304
+ key: "duplicate"
305
+ }, "Duplicate"), (0, _react2.jsx)(_index.Item, {
306
+ key: "delete",
307
+ textValue: "delete"
308
+ }, (0, _react2.jsx)(_index.Text, {
309
+ color: "critical.bright"
310
+ }, "Delete"))))))
311
+ );
312
+ };
313
+ exports.WithSections = WithSections;
@@ -264,18 +264,15 @@ exports.Controlled = Controlled;
264
264
  var WithNoneOption = function WithNoneOption() {
265
265
  return (0, _react2.jsx)(_index.SelectField, {
266
266
  label: "What's your favorite color?"
267
- }, (0, _react2.jsx)(_index.Item, {
267
+ }, (0, _react2.jsx)(_index.Section, null, (0, _react2.jsx)(_index.Item, {
268
268
  key: "none"
269
- }, "None"), (0, _react2.jsx)(_index.Item, {
270
- isSeparator: true,
271
- textValue: "-"
272
- }, (0, _react2.jsx)(_index.Separator, null)), (0, _react2.jsx)(_index.Item, {
269
+ }, "None")), (0, _react2.jsx)(_index.Section, null, (0, _react2.jsx)(_index.Item, {
273
270
  key: "red"
274
271
  }, "Red"), (0, _react2.jsx)(_index.Item, {
275
272
  key: "blue"
276
273
  }, "Blue"), (0, _react2.jsx)(_index.Item, {
277
274
  key: "yellow"
278
- }, "Yellow"));
275
+ }, "Yellow")));
279
276
  };
280
277
  exports.WithNoneOption = WithNoneOption;
281
278
  var WithSlots = function WithSlots() {
@@ -41,6 +41,7 @@ var _ListViewItem = _interopRequireDefault(require("../../components/ListViewIte
41
41
  var _Loader = _interopRequireDefault(require("../../components/Loader/Loader.styles"));
42
42
  var _Menu = _interopRequireDefault(require("../../components/Menu/Menu.styles"));
43
43
  var _MenuItem = _interopRequireDefault(require("../../components/MenuItem/MenuItem.styles"));
44
+ var _MenuSection = _interopRequireDefault(require("../../components/MenuSection/MenuSection.styles"));
44
45
  var _Message = _interopRequireDefault(require("../../components/Messages/Message.styles"));
45
46
  var _Modal = _interopRequireDefault(require("../../components/Modal/Modal.styles"));
46
47
  var _NavBar = _interopRequireDefault(require("../../components/NavBar/NavBar.styles"));
@@ -90,6 +91,7 @@ var _default = _objectSpread({
90
91
  loader: _Loader["default"],
91
92
  menu: _Menu["default"],
92
93
  menuItem: _MenuItem["default"],
94
+ menuSection: _MenuSection["default"],
93
95
  message: _Message["default"],
94
96
  modal: _Modal["default"],
95
97
  navBar: _NavBar["default"],
@@ -30,6 +30,7 @@ export * from './listItem';
30
30
  export * from './loader';
31
31
  export * from './menu';
32
32
  export * from './menuItem';
33
+ export * from './menuSection';
33
34
  export * from './messages';
34
35
  export * from './Modal';
35
36
  export * from './navBar';
@@ -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, _context28, _context29, _context30, _context31, _context32, _context33, _context34, _context35, _context36, _context37, _context38, _context39, _context40, _context41, _context42, _context43, _context44, _context45, _context46, _context47, _context48, _context49, _context50, _context51, _context52;
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, _context30, _context31, _context32, _context33, _context34, _context35, _context36, _context37, _context38, _context39, _context40, _context41, _context42, _context43, _context44, _context45, _context46, _context47, _context48, _context49, _context50, _context51, _context52, _context53;
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");
@@ -359,8 +359,19 @@ _forEachInstanceProperty(_context32 = _Object$keys(_menuItem)).call(_context32,
359
359
  }
360
360
  });
361
361
  });
362
+ var _menuSection = require("./menuSection");
363
+ _forEachInstanceProperty(_context33 = _Object$keys(_menuSection)).call(_context33, function (key) {
364
+ if (key === "default" || key === "__esModule") return;
365
+ if (key in exports && exports[key] === _menuSection[key]) return;
366
+ _Object$defineProperty(exports, key, {
367
+ enumerable: true,
368
+ get: function get() {
369
+ return _menuSection[key];
370
+ }
371
+ });
372
+ });
362
373
  var _messages = require("./messages");
363
- _forEachInstanceProperty(_context33 = _Object$keys(_messages)).call(_context33, function (key) {
374
+ _forEachInstanceProperty(_context34 = _Object$keys(_messages)).call(_context34, function (key) {
364
375
  if (key === "default" || key === "__esModule") return;
365
376
  if (key in exports && exports[key] === _messages[key]) return;
366
377
  _Object$defineProperty(exports, key, {
@@ -371,7 +382,7 @@ _forEachInstanceProperty(_context33 = _Object$keys(_messages)).call(_context33,
371
382
  });
372
383
  });
373
384
  var _Modal = require("./Modal");
374
- _forEachInstanceProperty(_context34 = _Object$keys(_Modal)).call(_context34, function (key) {
385
+ _forEachInstanceProperty(_context35 = _Object$keys(_Modal)).call(_context35, function (key) {
375
386
  if (key === "default" || key === "__esModule") return;
376
387
  if (key in exports && exports[key] === _Modal[key]) return;
377
388
  _Object$defineProperty(exports, key, {
@@ -382,7 +393,7 @@ _forEachInstanceProperty(_context34 = _Object$keys(_Modal)).call(_context34, fun
382
393
  });
383
394
  });
384
395
  var _navBar = require("./navBar");
385
- _forEachInstanceProperty(_context35 = _Object$keys(_navBar)).call(_context35, function (key) {
396
+ _forEachInstanceProperty(_context36 = _Object$keys(_navBar)).call(_context36, function (key) {
386
397
  if (key === "default" || key === "__esModule") return;
387
398
  if (key in exports && exports[key] === _navBar[key]) return;
388
399
  _Object$defineProperty(exports, key, {
@@ -393,7 +404,7 @@ _forEachInstanceProperty(_context35 = _Object$keys(_navBar)).call(_context35, fu
393
404
  });
394
405
  });
395
406
  var _navSideBar = require("./navSideBar");
396
- _forEachInstanceProperty(_context36 = _Object$keys(_navSideBar)).call(_context36, function (key) {
407
+ _forEachInstanceProperty(_context37 = _Object$keys(_navSideBar)).call(_context37, function (key) {
397
408
  if (key === "default" || key === "__esModule") return;
398
409
  if (key in exports && exports[key] === _navSideBar[key]) return;
399
410
  _Object$defineProperty(exports, key, {
@@ -404,7 +415,7 @@ _forEachInstanceProperty(_context36 = _Object$keys(_navSideBar)).call(_context36
404
415
  });
405
416
  });
406
417
  var _overlayPanel = require("./overlayPanel");
407
- _forEachInstanceProperty(_context37 = _Object$keys(_overlayPanel)).call(_context37, function (key) {
418
+ _forEachInstanceProperty(_context38 = _Object$keys(_overlayPanel)).call(_context38, function (key) {
408
419
  if (key === "default" || key === "__esModule") return;
409
420
  if (key in exports && exports[key] === _overlayPanel[key]) return;
410
421
  _Object$defineProperty(exports, key, {
@@ -415,7 +426,7 @@ _forEachInstanceProperty(_context37 = _Object$keys(_overlayPanel)).call(_context
415
426
  });
416
427
  });
417
428
  var _popoverContainer = require("./popoverContainer");
418
- _forEachInstanceProperty(_context38 = _Object$keys(_popoverContainer)).call(_context38, function (key) {
429
+ _forEachInstanceProperty(_context39 = _Object$keys(_popoverContainer)).call(_context39, function (key) {
419
430
  if (key === "default" || key === "__esModule") return;
420
431
  if (key in exports && exports[key] === _popoverContainer[key]) return;
421
432
  _Object$defineProperty(exports, key, {
@@ -426,7 +437,7 @@ _forEachInstanceProperty(_context38 = _Object$keys(_popoverContainer)).call(_con
426
437
  });
427
438
  });
428
439
  var _popoverMenu = require("./popoverMenu");
429
- _forEachInstanceProperty(_context39 = _Object$keys(_popoverMenu)).call(_context39, function (key) {
440
+ _forEachInstanceProperty(_context40 = _Object$keys(_popoverMenu)).call(_context40, function (key) {
430
441
  if (key === "default" || key === "__esModule") return;
431
442
  if (key in exports && exports[key] === _popoverMenu[key]) return;
432
443
  _Object$defineProperty(exports, key, {
@@ -437,7 +448,7 @@ _forEachInstanceProperty(_context39 = _Object$keys(_popoverMenu)).call(_context3
437
448
  });
438
449
  });
439
450
  var _progressBar = require("./progressBar");
440
- _forEachInstanceProperty(_context40 = _Object$keys(_progressBar)).call(_context40, function (key) {
451
+ _forEachInstanceProperty(_context41 = _Object$keys(_progressBar)).call(_context41, function (key) {
441
452
  if (key === "default" || key === "__esModule") return;
442
453
  if (key in exports && exports[key] === _progressBar[key]) return;
443
454
  _Object$defineProperty(exports, key, {
@@ -448,7 +459,7 @@ _forEachInstanceProperty(_context40 = _Object$keys(_progressBar)).call(_context4
448
459
  });
449
460
  });
450
461
  var _requirementsList = require("./requirementsList");
451
- _forEachInstanceProperty(_context41 = _Object$keys(_requirementsList)).call(_context41, function (key) {
462
+ _forEachInstanceProperty(_context42 = _Object$keys(_requirementsList)).call(_context42, function (key) {
452
463
  if (key === "default" || key === "__esModule") return;
453
464
  if (key in exports && exports[key] === _requirementsList[key]) return;
454
465
  _Object$defineProperty(exports, key, {
@@ -459,7 +470,7 @@ _forEachInstanceProperty(_context41 = _Object$keys(_requirementsList)).call(_con
459
470
  });
460
471
  });
461
472
  var _rockerButtonGroup = require("./rockerButtonGroup");
462
- _forEachInstanceProperty(_context42 = _Object$keys(_rockerButtonGroup)).call(_context42, function (key) {
473
+ _forEachInstanceProperty(_context43 = _Object$keys(_rockerButtonGroup)).call(_context43, function (key) {
463
474
  if (key === "default" || key === "__esModule") return;
464
475
  if (key in exports && exports[key] === _rockerButtonGroup[key]) return;
465
476
  _Object$defineProperty(exports, key, {
@@ -470,7 +481,7 @@ _forEachInstanceProperty(_context42 = _Object$keys(_rockerButtonGroup)).call(_co
470
481
  });
471
482
  });
472
483
  var _scrollBox = require("./scrollBox");
473
- _forEachInstanceProperty(_context43 = _Object$keys(_scrollBox)).call(_context43, function (key) {
484
+ _forEachInstanceProperty(_context44 = _Object$keys(_scrollBox)).call(_context44, function (key) {
474
485
  if (key === "default" || key === "__esModule") return;
475
486
  if (key in exports && exports[key] === _scrollBox[key]) return;
476
487
  _Object$defineProperty(exports, key, {
@@ -481,7 +492,7 @@ _forEachInstanceProperty(_context43 = _Object$keys(_scrollBox)).call(_context43,
481
492
  });
482
493
  });
483
494
  var _separator = require("./separator");
484
- _forEachInstanceProperty(_context44 = _Object$keys(_separator)).call(_context44, function (key) {
495
+ _forEachInstanceProperty(_context45 = _Object$keys(_separator)).call(_context45, function (key) {
485
496
  if (key === "default" || key === "__esModule") return;
486
497
  if (key in exports && exports[key] === _separator[key]) return;
487
498
  _Object$defineProperty(exports, key, {
@@ -492,7 +503,7 @@ _forEachInstanceProperty(_context44 = _Object$keys(_separator)).call(_context44,
492
503
  });
493
504
  });
494
505
  var _shared = require("./shared");
495
- _forEachInstanceProperty(_context45 = _Object$keys(_shared)).call(_context45, function (key) {
506
+ _forEachInstanceProperty(_context46 = _Object$keys(_shared)).call(_context46, function (key) {
496
507
  if (key === "default" || key === "__esModule") return;
497
508
  if (key in exports && exports[key] === _shared[key]) return;
498
509
  _Object$defineProperty(exports, key, {
@@ -503,7 +514,7 @@ _forEachInstanceProperty(_context45 = _Object$keys(_shared)).call(_context45, fu
503
514
  });
504
515
  });
505
516
  var _tab = require("./tab");
506
- _forEachInstanceProperty(_context46 = _Object$keys(_tab)).call(_context46, function (key) {
517
+ _forEachInstanceProperty(_context47 = _Object$keys(_tab)).call(_context47, function (key) {
507
518
  if (key === "default" || key === "__esModule") return;
508
519
  if (key in exports && exports[key] === _tab[key]) return;
509
520
  _Object$defineProperty(exports, key, {
@@ -514,7 +525,7 @@ _forEachInstanceProperty(_context46 = _Object$keys(_tab)).call(_context46, funct
514
525
  });
515
526
  });
516
527
  var _table = require("./table");
517
- _forEachInstanceProperty(_context47 = _Object$keys(_table)).call(_context47, function (key) {
528
+ _forEachInstanceProperty(_context48 = _Object$keys(_table)).call(_context48, function (key) {
518
529
  if (key === "default" || key === "__esModule") return;
519
530
  if (key in exports && exports[key] === _table[key]) return;
520
531
  _Object$defineProperty(exports, key, {
@@ -525,7 +536,7 @@ _forEachInstanceProperty(_context47 = _Object$keys(_table)).call(_context47, fun
525
536
  });
526
537
  });
527
538
  var _tabs = require("./tabs");
528
- _forEachInstanceProperty(_context48 = _Object$keys(_tabs)).call(_context48, function (key) {
539
+ _forEachInstanceProperty(_context49 = _Object$keys(_tabs)).call(_context49, function (key) {
529
540
  if (key === "default" || key === "__esModule") return;
530
541
  if (key in exports && exports[key] === _tabs[key]) return;
531
542
  _Object$defineProperty(exports, key, {
@@ -536,7 +547,7 @@ _forEachInstanceProperty(_context48 = _Object$keys(_tabs)).call(_context48, func
536
547
  });
537
548
  });
538
549
  var _text = require("./text");
539
- _forEachInstanceProperty(_context49 = _Object$keys(_text)).call(_context49, function (key) {
550
+ _forEachInstanceProperty(_context50 = _Object$keys(_text)).call(_context50, function (key) {
540
551
  if (key === "default" || key === "__esModule") return;
541
552
  if (key in exports && exports[key] === _text[key]) return;
542
553
  _Object$defineProperty(exports, key, {
@@ -547,7 +558,7 @@ _forEachInstanceProperty(_context49 = _Object$keys(_text)).call(_context49, func
547
558
  });
548
559
  });
549
560
  var _textField = require("./textField");
550
- _forEachInstanceProperty(_context50 = _Object$keys(_textField)).call(_context50, function (key) {
561
+ _forEachInstanceProperty(_context51 = _Object$keys(_textField)).call(_context51, function (key) {
551
562
  if (key === "default" || key === "__esModule") return;
552
563
  if (key in exports && exports[key] === _textField[key]) return;
553
564
  _Object$defineProperty(exports, key, {
@@ -558,7 +569,7 @@ _forEachInstanceProperty(_context50 = _Object$keys(_textField)).call(_context50,
558
569
  });
559
570
  });
560
571
  var _timefield = require("./timefield");
561
- _forEachInstanceProperty(_context51 = _Object$keys(_timefield)).call(_context51, function (key) {
572
+ _forEachInstanceProperty(_context52 = _Object$keys(_timefield)).call(_context52, function (key) {
562
573
  if (key === "default" || key === "__esModule") return;
563
574
  if (key in exports && exports[key] === _timefield[key]) return;
564
575
  _Object$defineProperty(exports, key, {
@@ -569,7 +580,7 @@ _forEachInstanceProperty(_context51 = _Object$keys(_timefield)).call(_context51,
569
580
  });
570
581
  });
571
582
  var _tooltipTrigger = require("./tooltipTrigger");
572
- _forEachInstanceProperty(_context52 = _Object$keys(_tooltipTrigger)).call(_context52, function (key) {
583
+ _forEachInstanceProperty(_context53 = _Object$keys(_tooltipTrigger)).call(_context53, function (key) {
573
584
  if (key === "default" || key === "__esModule") return;
574
585
  if (key in exports && exports[key] === _tooltipTrigger[key]) return;
575
586
  _Object$defineProperty(exports, key, {
@@ -0,0 +1,24 @@
1
+ import { Node, TreeState } from 'react-stately';
2
+ import { TestingAttributes } from './shared/test';
3
+ import { BoxProps } from './box';
4
+ export interface MenuSectionProps extends BoxProps, TestingAttributes {
5
+ /** Whether the menu item is currently pressed. */
6
+ isPressed?: boolean;
7
+ /**
8
+ * Whether the containing menu has keyboard focus.
9
+ * Used to determine when to present hover vs focus styling.
10
+ */
11
+ isFocusVisible?: boolean;
12
+ /**
13
+ * Whether menu item should receive focus state on hover.
14
+ */
15
+ isNotFocusedOnHover?: boolean;
16
+ /** A screen reader only label for the menu item. */
17
+ /** Handler that is called when the menu should close after selecting an item. */
18
+ onClose?: () => void;
19
+ /** Handler that is called when the user activates the item. */
20
+ onAction?: () => void;
21
+ section: Node<object>;
22
+ state: TreeState<object>;
23
+ defaultSelectedKey?: string | number;
24
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
@@ -29,7 +29,7 @@ import React, { useState } from 'react';
29
29
  import { OverlayProvider } from 'react-aria';
30
30
  import { useAsyncList } from 'react-stately';
31
31
  import DocsLayout from '../../../.storybook/storybookDocsLayout';
32
- import { Box, Item, LinkSelectField, Separator } from '../../index';
32
+ import { Box, Item, LinkSelectField, Section } from '../../index';
33
33
  import { ariaAttributeBaseArgTypes } from '../../utils/docUtils/ariaAttributes';
34
34
  import { inputFieldAttributeBaseArgTypes } from '../../utils/docUtils/fieldAttributes';
35
35
  import { statusArgTypes } from '../../utils/docUtils/statusProp';
@@ -166,18 +166,15 @@ export var Controlled = function Controlled() {
166
166
  export var WithNoneOption = function WithNoneOption() {
167
167
  return ___EmotionJSX(LinkSelectField, {
168
168
  label: "What's your favorite color?"
169
- }, ___EmotionJSX(Item, {
169
+ }, ___EmotionJSX(Section, null, ___EmotionJSX(Item, {
170
170
  key: "none"
171
- }, "None"), ___EmotionJSX(Item, {
172
- isSeparator: true,
173
- textValue: "-"
174
- }, ___EmotionJSX(Separator, null)), ___EmotionJSX(Item, {
171
+ }, "None")), ___EmotionJSX(Section, null, ___EmotionJSX(Item, {
175
172
  key: "red"
176
173
  }, "Red"), ___EmotionJSX(Item, {
177
174
  key: "blue"
178
175
  }, "Blue"), ___EmotionJSX(Item, {
179
176
  key: "yellow"
180
- }, "Yellow"));
177
+ }, "Yellow")));
181
178
  };
182
179
  export var DisabledField = function DisabledField() {
183
180
  return ___EmotionJSX(LinkSelectField, {
@@ -24,6 +24,7 @@ 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 MenuSection from '../MenuSection';
27
28
  import { jsx as ___EmotionJSX } from "@emotion/react";
28
29
  var Menu = /*#__PURE__*/forwardRef(function (props, ref) {
29
30
  var _context;
@@ -66,10 +67,21 @@ var Menu = /*#__PURE__*/forwardRef(function (props, ref) {
66
67
  "aria-orientation": ORIENTATION.VERTICAL
67
68
  }, others, mergeProps(focusProps, menuProps, hoverProps), {
68
69
  role: "menu"
69
- }), _mapInstanceProperty(_context = _Array$from(state.collection)).call(_context, function (item) {
70
+ }), _mapInstanceProperty(_context = _Array$from(state.collection)).call(_context, function (element) {
71
+ if (element.type === 'section') {
72
+ return ___EmotionJSX(MenuSection, {
73
+ key: element.key,
74
+ section: element,
75
+ state: state,
76
+ onAction: onAction,
77
+ isDisabled: isDisabled,
78
+ isFocusVisible: isFocusVisible,
79
+ isNotFocusedOnHover: isNotFocusedOnHover
80
+ });
81
+ }
70
82
  return ___EmotionJSX(MenuItem, {
71
- key: item.key,
72
- item: item,
83
+ key: element.key,
84
+ item: element,
73
85
  state: state,
74
86
  onAction: onAction,
75
87
  isDisabled: isDisabled,
@@ -4,7 +4,7 @@ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/inst
4
4
  import _Set from "@babel/runtime-corejs3/core-js-stable/set";
5
5
  import React from 'react';
6
6
  import userEvent from '@testing-library/user-event';
7
- import { Item, Menu } from '../../index';
7
+ import { Item, Menu, Section } from '../../index';
8
8
  import ORIENTATION from '../../utils/devUtils/constants/orientation';
9
9
  import { fireEvent, render, screen } from '../../utils/testUtils/testWrapper';
10
10
  import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
@@ -51,6 +51,29 @@ test('should render basic menu with children', function () {
51
51
  expect(menuItems).toHaveLength(3);
52
52
  expect(menu).toHaveAttribute('aria-orientation', ORIENTATION.VERTICAL);
53
53
  });
54
+ test('should render sections when sections are passed as Children', function () {
55
+ var menuSections = [{
56
+ key: 'menuSection 1',
57
+ children: defaultItems
58
+ }, {
59
+ key: 'menuSection 2',
60
+ children: defaultItems
61
+ }];
62
+ render(___EmotionJSX(Menu, defaultProps, _mapInstanceProperty(menuSections).call(menuSections, function (section) {
63
+ var _context;
64
+ return ___EmotionJSX(Section, section, _mapInstanceProperty(_context = section.children).call(_context, function (item) {
65
+ return ___EmotionJSX(Item, _extends({
66
+ key: item.id
67
+ }, item));
68
+ }));
69
+ })));
70
+ var menu = screen.queryByRole('menu');
71
+ expect(menu).toBeInTheDocument();
72
+ var menuSection = screen.queryAllByRole('group');
73
+ expect(menuSection).toHaveLength(2);
74
+ var menuItems = screen.getAllByRole('menuitem');
75
+ expect(menuItems).toHaveLength(6);
76
+ });
54
77
  test('should render items when selectionMode is set to single', function () {
55
78
  getComponent({
56
79
  selectionMode: 'single'
@@ -0,0 +1,64 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
3
+ import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
4
+ import React, { forwardRef } from 'react';
5
+ import { useMenuSection } from 'react-aria';
6
+ import { useLocalOrForwardRef } from '../../hooks';
7
+ import Box from '../Box';
8
+ import MenuItem from '../MenuItem';
9
+ import Separator from '../Separator';
10
+
11
+ /**
12
+ * Menu Section component intended to be used within Menu or PopupMenu.
13
+ * This component is not intented to be used outside of Menu or independently.
14
+ * Utilizes [React Aria](https://react-spectrum.adobe.com/react-aria/useMenu.html)
15
+ */
16
+ import { jsx as ___EmotionJSX } from "@emotion/react";
17
+ var MenuSection = /*#__PURE__*/forwardRef(function (props, ref) {
18
+ var _context;
19
+ var section = props.section,
20
+ state = props.state,
21
+ onAction = props.onAction,
22
+ isDisabled = props.isDisabled,
23
+ isFocusVisible = props.isFocusVisible,
24
+ isNotFocusedOnHover = props.isNotFocusedOnHover;
25
+ var menuSectionRef = useLocalOrForwardRef(ref);
26
+ var _useMenuSection = useMenuSection({
27
+ heading: section.rendered,
28
+ 'aria-label': section['aria-label']
29
+ }),
30
+ itemProps = _useMenuSection.itemProps,
31
+ groupProps = _useMenuSection.groupProps,
32
+ headingProps = _useMenuSection.headingProps;
33
+ return ___EmotionJSX(React.Fragment, null, section.key !== state.collection.getFirstKey() && ___EmotionJSX(Separator, {
34
+ as: "li",
35
+ p: 0,
36
+ m: 0
37
+ }), ___EmotionJSX(Box, _extends({
38
+ as: "li"
39
+ }, itemProps, {
40
+ ref: menuSectionRef,
41
+ role: "presentation"
42
+ }), section.rendered && ___EmotionJSX(Box, _extends({
43
+ as: "span",
44
+ variant: "menuSection.sectionTitle"
45
+ }, headingProps, {
46
+ role: "presentation"
47
+ }), section.rendered), ___EmotionJSX(Box, _extends({
48
+ as: "ul",
49
+ variant: "menuSection.section"
50
+ }, groupProps, {
51
+ role: "group"
52
+ }), _mapInstanceProperty(_context = _Array$from(section.childNodes)).call(_context, function (node) {
53
+ return ___EmotionJSX(MenuItem, {
54
+ key: node.key,
55
+ item: node,
56
+ state: state,
57
+ onAction: onAction,
58
+ isDisabled: isDisabled,
59
+ isFocusVisible: isFocusVisible,
60
+ isNotFocusedOnHover: isNotFocusedOnHover
61
+ });
62
+ }))));
63
+ });
64
+ export default MenuSection;
@@ -0,0 +1,27 @@
1
+ import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
2
+ import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
3
+ import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
4
+ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
5
+ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
6
+ import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
+ import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
9
+ import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
10
+ 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; }
11
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
12
+ import menu from '../Menu/Menu.styles';
13
+ var section = _objectSpread(_objectSpread({}, menu), {}, {
14
+ borderRadius: 0
15
+ });
16
+ var sectionTitle = {
17
+ fontSize: 'sm',
18
+ fontWeight: '3',
19
+ color: 'text.secondary',
20
+ height: '36px',
21
+ ml: 'sm',
22
+ justifyContent: 'center'
23
+ };
24
+ export default {
25
+ section: section,
26
+ sectionTitle: sectionTitle
27
+ };
@@ -0,0 +1,97 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
3
+ import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
4
+ import React from 'react';
5
+ import { Item, Menu, Section } from '../../index';
6
+ import { render, screen } from '../../utils/testUtils/testWrapper';
7
+ import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
8
+ import { jsx as ___EmotionJSX } from "@emotion/react";
9
+ var testId = 'testId';
10
+ var defaultMenuSections = [{
11
+ key: 'menuSection 1',
12
+ 'data-id': 'menuSection1',
13
+ title: 'Section 1',
14
+ children: [{
15
+ key: 'menuItem1',
16
+ children: 'MenuItem 1',
17
+ 'data-id': 'menuItem1',
18
+ isPressed: false,
19
+ backgroundColor: 'orange'
20
+ }]
21
+ }, {
22
+ key: 'menuSection 2',
23
+ 'data-id': 'menuSection2',
24
+ children: [{
25
+ key: 'menuItem2',
26
+ children: 'MenuItem 2',
27
+ 'data-id': 'menuItem1',
28
+ isPressed: false
29
+ }, {
30
+ key: 'menuItem3',
31
+ children: 'MenuItem 3',
32
+ 'data-id': 'menuItem1',
33
+ isPressed: false
34
+ }]
35
+ }];
36
+ var defaultProps = {
37
+ 'data-testid': testId,
38
+ defaultSelectedKey: 'menuItem1',
39
+ 'aria-label': 'testLabel'
40
+ };
41
+ var getComponent = function getComponent() {
42
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
43
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
44
+ _ref$items = _ref.items,
45
+ items = _ref$items === void 0 ? defaultMenuSections : _ref$items,
46
+ _ref$renderFn = _ref.renderFn,
47
+ renderFn = _ref$renderFn === void 0 ? render : _ref$renderFn;
48
+ return renderFn(___EmotionJSX(Menu, _extends({}, defaultProps, props), _mapInstanceProperty(items).call(items, function (section) {
49
+ var _context;
50
+ return ___EmotionJSX(Section, section, _mapInstanceProperty(_context = section.children).call(_context, function (li) {
51
+ return ___EmotionJSX(Item, li);
52
+ }));
53
+ })));
54
+ };
55
+
56
+ // Needs to be added to each components test file
57
+ universalComponentTests({
58
+ renderComponent: function renderComponent(props) {
59
+ return ___EmotionJSX(Menu, _extends({}, defaultProps, props), _mapInstanceProperty(defaultMenuSections).call(defaultMenuSections, function (section) {
60
+ var _context2;
61
+ return ___EmotionJSX(Section, section, _mapInstanceProperty(_context2 = section.children).call(_context2, function (li) {
62
+ return ___EmotionJSX(Item, _extends({}, li, {
63
+ sx: {
64
+ backgroundColor: 'orange'
65
+ }
66
+ }));
67
+ }));
68
+ }));
69
+ }
70
+ });
71
+ test('renders menu with menu sections and titles', function () {
72
+ getComponent();
73
+ var menu = screen.getByRole('menu');
74
+ var menuSections = screen.getAllByRole('group');
75
+ var menuTitle = screen.getByText('Section 1');
76
+ expect(menu).toBeInTheDocument();
77
+ expect(menuTitle).toBeInTheDocument();
78
+ expect(menuSections).toHaveLength(defaultMenuSections.length);
79
+ });
80
+ test('renders sections with menu items', function () {
81
+ getComponent();
82
+ var menuItems = screen.getAllByRole('menuitem');
83
+ expect(menuItems).toHaveLength(_reduceInstanceProperty(defaultMenuSections).call(defaultMenuSections, function (acc, section) {
84
+ return acc + section.children.length;
85
+ }, 0));
86
+ });
87
+ test('custom props are passed into menuItem', function () {
88
+ getComponent();
89
+ var itemText1 = defaultMenuSections[0].children[0].children;
90
+ var menuItem1 = screen.getByText(itemText1);
91
+ expect(menuItem1).toHaveStyleRule('background-color', 'orange');
92
+ });
93
+ test('renders separator before menu section if it is not the first section', function () {
94
+ getComponent();
95
+ var separators = screen.getByRole('separator');
96
+ expect(separators).toBeInTheDocument();
97
+ });
@@ -0,0 +1 @@
1
+ export { default } from './MenuSection';
@@ -4,7 +4,7 @@ import DotsVerticalIcon from '@pingux/mdi-react/DotsVerticalIcon';
4
4
  import { action } from '@storybook/addon-actions';
5
5
  import { withDesign } from 'storybook-addon-designs';
6
6
  import DocsLayout from '../../../.storybook/storybookDocsLayout';
7
- import { Icon, IconButton, Item, Menu, OverlayProvider, PopoverMenu, Text } from '../../index';
7
+ import { Icon, IconButton, Item, Menu, OverlayProvider, PopoverMenu, Section, Text } from '../../index';
8
8
  import { FIGMA_LINKS } from '../../utils/designUtils/figmaLinks';
9
9
  import PopoverMenuReadme from './PopoverMenu.mdx';
10
10
  import { jsx as ___EmotionJSX } from "@emotion/react";
@@ -88,12 +88,12 @@ export var DefaultOpen = function DefaultOpen() {
88
88
  }
89
89
  })), ___EmotionJSX(Menu, {
90
90
  onAction: action('onAction'),
91
- disabledKeys: ['duplicate']
91
+ disabledKeys: ['disabledItem']
92
92
  }, ___EmotionJSX(Item, {
93
93
  key: "edit"
94
94
  }, "Edit"), ___EmotionJSX(Item, {
95
- key: "duplicate"
96
- }, "Duplicate"), ___EmotionJSX(Item, {
95
+ key: "disabledItem"
96
+ }, "Disabled Item"), ___EmotionJSX(Item, {
97
97
  key: "delete",
98
98
  textValue: "delete"
99
99
  }, ___EmotionJSX(Text, {
@@ -222,4 +222,70 @@ export var NotClosedOnSelect = function NotClosedOnSelect() {
222
222
  color: "critical.bright"
223
223
  }, "Delete")))))
224
224
  );
225
+ };
226
+ export var WithSeparator = function WithSeparator(args) {
227
+ return (
228
+ // Application must be wrapped in an OverlayProvider so that it can be hidden from screen
229
+ // readers when an overlay opens.
230
+ ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(PopoverMenu, args, ___EmotionJSX(IconButton, {
231
+ "aria-label": "more options",
232
+ variant: "inverted"
233
+ }, ___EmotionJSX(Icon, {
234
+ icon: DotsVerticalIcon,
235
+ size: "md",
236
+ title: {
237
+ name: 'Dots Vertical Icon'
238
+ }
239
+ })), ___EmotionJSX(Menu, {
240
+ onAction: action('onAction'),
241
+ disabledKeys: ['disabledItem']
242
+ }, ___EmotionJSX(Section, null, ___EmotionJSX(Item, {
243
+ key: "edit"
244
+ }, "Edit")), ___EmotionJSX(Section, null, ___EmotionJSX(Item, {
245
+ key: "disabledItem"
246
+ }, "Disabled Item"), ___EmotionJSX(Item, {
247
+ key: "delete",
248
+ textValue: "delete"
249
+ }, ___EmotionJSX(Text, {
250
+ color: "critical.bright"
251
+ }, "Delete"))))))
252
+ );
253
+ };
254
+ export var WithSections = function WithSections(args) {
255
+ return (
256
+ // Application must be wrapped in an OverlayProvider so that it can be hidden from screen
257
+ // readers when an overlay opens.
258
+ ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(PopoverMenu, args, ___EmotionJSX(IconButton, {
259
+ "aria-label": "more options",
260
+ variant: "inverted"
261
+ }, ___EmotionJSX(Icon, {
262
+ icon: DotsVerticalIcon,
263
+ size: "md",
264
+ title: {
265
+ name: 'Dots Vertical Icon'
266
+ }
267
+ })), ___EmotionJSX(Menu, {
268
+ onAction: action('onAction'),
269
+ disabledKeys: ['disabledItem']
270
+ }, ___EmotionJSX(Section, {
271
+ key: "section 1",
272
+ title: "Section 1"
273
+ }, ___EmotionJSX(Item, {
274
+ key: "edit"
275
+ }, "Edit"), ___EmotionJSX(Item, {
276
+ key: "disabledItem"
277
+ }, "Disabled Item"), ___EmotionJSX(Item, {
278
+ key: "copy"
279
+ }, "Copy")), ___EmotionJSX(Section, {
280
+ key: "section 2",
281
+ title: "Section 2"
282
+ }, ___EmotionJSX(Item, {
283
+ key: "duplicate"
284
+ }, "Duplicate"), ___EmotionJSX(Item, {
285
+ key: "delete",
286
+ textValue: "delete"
287
+ }, ___EmotionJSX(Text, {
288
+ color: "critical.bright"
289
+ }, "Delete"))))))
290
+ );
225
291
  };
@@ -31,7 +31,7 @@ import { OverlayProvider } from 'react-aria';
31
31
  import { useAsyncList } from 'react-stately';
32
32
  import CalendarRangeIcon from '@pingux/mdi-react/CalendarRangeIcon';
33
33
  import DocsLayout from '../../../.storybook/storybookDocsLayout';
34
- import { Icon, Item, Section, SelectField, Separator } from '../../index';
34
+ import { Icon, Item, Section, SelectField } from '../../index';
35
35
  import { modes as labelModes } from '../../utils/devUtils/constants/labelModes';
36
36
  import { ariaAttributeBaseArgTypes } from '../../utils/docUtils/ariaAttributes';
37
37
  import { inputFieldAttributeBaseArgTypes } from '../../utils/docUtils/fieldAttributes';
@@ -247,18 +247,15 @@ export var Controlled = function Controlled() {
247
247
  export var WithNoneOption = function WithNoneOption() {
248
248
  return ___EmotionJSX(SelectField, {
249
249
  label: "What's your favorite color?"
250
- }, ___EmotionJSX(Item, {
250
+ }, ___EmotionJSX(Section, null, ___EmotionJSX(Item, {
251
251
  key: "none"
252
- }, "None"), ___EmotionJSX(Item, {
253
- isSeparator: true,
254
- textValue: "-"
255
- }, ___EmotionJSX(Separator, null)), ___EmotionJSX(Item, {
252
+ }, "None")), ___EmotionJSX(Section, null, ___EmotionJSX(Item, {
256
253
  key: "red"
257
254
  }, "Red"), ___EmotionJSX(Item, {
258
255
  key: "blue"
259
256
  }, "Blue"), ___EmotionJSX(Item, {
260
257
  key: "yellow"
261
- }, "Yellow"));
258
+ }, "Yellow")));
262
259
  };
263
260
  export var WithSlots = function WithSlots() {
264
261
  return ___EmotionJSX(SelectField, {
@@ -34,6 +34,7 @@ import listViewItem from '../../components/ListViewItem/ListViewItem.styles';
34
34
  import loader from '../../components/Loader/Loader.styles';
35
35
  import menu from '../../components/Menu/Menu.styles';
36
36
  import menuItem from '../../components/MenuItem/MenuItem.styles';
37
+ import menuSection from '../../components/MenuSection/MenuSection.styles';
37
38
  import message from '../../components/Messages/Message.styles';
38
39
  import modal from '../../components/Modal/Modal.styles';
39
40
  import navBar from '../../components/NavBar/NavBar.styles';
@@ -79,6 +80,7 @@ export default _objectSpread({
79
80
  loader: loader,
80
81
  menu: menu,
81
82
  menuItem: menuItem,
83
+ menuSection: menuSection,
82
84
  message: message,
83
85
  modal: modal,
84
86
  navBar: navBar,
@@ -30,6 +30,7 @@ export * from './listItem';
30
30
  export * from './loader';
31
31
  export * from './menu';
32
32
  export * from './menuItem';
33
+ export * from './menuSection';
33
34
  export * from './messages';
34
35
  export * from './Modal';
35
36
  export * from './navBar';
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.84.0-alpha.2",
3
+ "version": "2.84.0-alpha.3",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",