@pingux/astro 1.4.1 → 1.5.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/lib/cjs/components/ListView/ListView.js +12 -13
  2. package/lib/cjs/components/ListView/ListView.test.js +8 -8
  3. package/lib/cjs/components/ListViewItem/ListViewItem.js +0 -2
  4. package/lib/cjs/components/MultiselectFilter/MultiselectFilter.js +143 -0
  5. package/lib/cjs/components/MultiselectFilter/MultiselectFilter.stories.js +283 -0
  6. package/lib/cjs/components/MultiselectFilter/MultiselectFilter.test.js +83 -0
  7. package/lib/cjs/components/MultiselectFilter/index.js +18 -0
  8. package/lib/cjs/components/MultiselectFilterItem/MultiselectFilterItem.js +55 -0
  9. package/lib/cjs/components/MultiselectFilterItem/MultiselectFilterItem.test.js +53 -0
  10. package/lib/cjs/components/MultiselectFilterItem/index.js +18 -0
  11. package/lib/cjs/components/MultiselectListContainer/MultiselectBadge.js +47 -0
  12. package/lib/cjs/components/MultiselectListContainer/MultiselectBadge.test.js +48 -0
  13. package/lib/cjs/components/MultiselectListContainer/MultiselectListContainer.js +157 -0
  14. package/lib/cjs/components/MultiselectListContainer/MultiselectListContainer.test.js +112 -0
  15. package/lib/cjs/components/MultiselectListContainer/index.js +18 -0
  16. package/lib/cjs/components/PopoverMenu/PopoverMenu.js +7 -2
  17. package/lib/cjs/components/Tab/Tab.js +22 -15
  18. package/lib/cjs/components/TabPicker/TabPicker.js +239 -0
  19. package/lib/cjs/components/TabPicker/index.js +18 -0
  20. package/lib/cjs/components/Tabs/Tabs.js +46 -13
  21. package/lib/cjs/components/Tabs/Tabs.stories.js +32 -2
  22. package/lib/cjs/components/Tabs/Tabs.test.js +183 -32
  23. package/lib/cjs/index.js +98 -32
  24. package/lib/cjs/styles/variants/buttons.js +38 -1
  25. package/lib/cjs/styles/variants/multiselectListContainer.js +73 -0
  26. package/lib/cjs/styles/variants/tabs.js +5 -1
  27. package/lib/cjs/styles/variants/text.js +29 -2
  28. package/lib/cjs/styles/variants/variants.js +3 -0
  29. package/lib/components/ListView/ListView.js +12 -13
  30. package/lib/components/ListView/ListView.test.js +8 -8
  31. package/lib/components/ListViewItem/ListViewItem.js +0 -2
  32. package/lib/components/MultiselectFilter/MultiselectFilter.js +118 -0
  33. package/lib/components/MultiselectFilter/MultiselectFilter.stories.js +251 -0
  34. package/lib/components/MultiselectFilter/MultiselectFilter.test.js +69 -0
  35. package/lib/components/MultiselectFilter/index.js +1 -0
  36. package/lib/components/MultiselectFilterItem/MultiselectFilterItem.js +36 -0
  37. package/lib/components/MultiselectFilterItem/MultiselectFilterItem.test.js +37 -0
  38. package/lib/components/MultiselectFilterItem/index.js +1 -0
  39. package/lib/components/MultiselectListContainer/MultiselectBadge.js +31 -0
  40. package/lib/components/MultiselectListContainer/MultiselectBadge.test.js +34 -0
  41. package/lib/components/MultiselectListContainer/MultiselectListContainer.js +123 -0
  42. package/lib/components/MultiselectListContainer/MultiselectListContainer.test.js +81 -0
  43. package/lib/components/MultiselectListContainer/index.js +1 -0
  44. package/lib/components/PopoverMenu/PopoverMenu.js +7 -2
  45. package/lib/components/Tab/Tab.js +14 -8
  46. package/lib/components/TabPicker/TabPicker.js +210 -0
  47. package/lib/components/TabPicker/index.js +1 -0
  48. package/lib/components/Tabs/Tabs.js +44 -11
  49. package/lib/components/Tabs/Tabs.stories.js +27 -0
  50. package/lib/components/Tabs/Tabs.test.js +165 -32
  51. package/lib/index.js +6 -0
  52. package/lib/styles/variants/buttons.js +38 -1
  53. package/lib/styles/variants/multiselectListContainer.js +63 -0
  54. package/lib/styles/variants/tabs.js +5 -1
  55. package/lib/styles/variants/text.js +29 -2
  56. package/lib/styles/variants/variants.js +2 -0
  57. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard");
6
+
7
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
8
+
9
+ _Object$defineProperty(exports, "__esModule", {
10
+ value: true
11
+ });
12
+
13
+ exports["default"] = void 0;
14
+
15
+ var _react = _interopRequireWildcard(require("react"));
16
+
17
+ var _propTypes = _interopRequireDefault(require("prop-types"));
18
+
19
+ var _index = require("../../index");
20
+
21
+ var _react2 = require("@emotion/react");
22
+
23
+ var MultiselectFilterItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
24
+ var text = props.text,
25
+ icon = props.icon;
26
+ return (0, _react2.jsx)(_index.Box, {
27
+ "data-testid": "multiselect-filter-item",
28
+ isRow: true,
29
+ justifyContent: "space-between",
30
+ ref: ref
31
+ }, (0, _react2.jsx)(_index.Text, {
32
+ variant: "multiselectFilterItem"
33
+ }, text), icon && (0, _react2.jsx)(_index.Icon, {
34
+ "data-testid": "multiselect-filter-data-icon",
35
+ icon: icon,
36
+ mr: "md",
37
+ color: "neutral.10",
38
+ size: 13,
39
+ flexShrink: 0
40
+ }));
41
+ });
42
+ MultiselectFilterItem.propTypes = {
43
+ /**
44
+ * Display text.
45
+ */
46
+ text: _propTypes["default"].string,
47
+
48
+ /**
49
+ * List icon.
50
+ */
51
+ icon: _propTypes["default"].shape({})
52
+ };
53
+ MultiselectFilterItem.displayName = 'MultiselectFilterItem';
54
+ var _default = MultiselectFilterItem;
55
+ exports["default"] = _default;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
6
+
7
+ var _react = _interopRequireDefault(require("react"));
8
+
9
+ var _FilterIcon = _interopRequireDefault(require("mdi-react/FilterIcon"));
10
+
11
+ var _testAxe = _interopRequireDefault(require("../../utils/testUtils/testAxe"));
12
+
13
+ var _testWrapper = require("../../utils/testUtils/testWrapper");
14
+
15
+ var _MultiselectFilterItem = _interopRequireDefault(require("./MultiselectFilterItem"));
16
+
17
+ var _react2 = require("@emotion/react");
18
+
19
+ var testId = 'multiselect-filter-item';
20
+ var iconId = 'multiselect-filter-data-icon';
21
+ var defaultProps = {
22
+ text: 'Item name'
23
+ };
24
+
25
+ var getComponent = function getComponent() {
26
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
27
+ return (0, _testWrapper.render)((0, _react2.jsx)(_MultiselectFilterItem["default"], (0, _extends2["default"])({}, defaultProps, props)));
28
+ };
29
+
30
+ afterEach(function () {
31
+ jest.restoreAllMocks();
32
+ }); // Need to be added to each test file to test accessibility using axe.
33
+
34
+ (0, _testAxe["default"])(getComponent);
35
+ test('default multiselectFilter', function () {
36
+ getComponent();
37
+
38
+ var multiselectFilterItem = _testWrapper.screen.getByTestId(testId);
39
+
40
+ var icon = _testWrapper.screen.queryByTestId(iconId);
41
+
42
+ expect(icon).not.toBeInTheDocument();
43
+ expect(multiselectFilterItem).toBeInTheDocument();
44
+ });
45
+ test('icon displays when icon prop is present', function () {
46
+ getComponent({
47
+ icon: _FilterIcon["default"]
48
+ });
49
+
50
+ var icon = _testWrapper.screen.getByTestId(iconId);
51
+
52
+ expect(icon).toBeInTheDocument();
53
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ _Object$defineProperty(exports, "default", {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return _MultiselectFilterItem["default"];
15
+ }
16
+ });
17
+
18
+ var _MultiselectFilterItem = _interopRequireDefault(require("./MultiselectFilterItem"));
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ exports["default"] = void 0;
12
+
13
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
14
+
15
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
16
+
17
+ var _react = _interopRequireDefault(require("react"));
18
+
19
+ var _propTypes = _interopRequireDefault(require("prop-types"));
20
+
21
+ var _Chip = _interopRequireDefault(require("../Chip"));
22
+
23
+ var _react2 = require("@emotion/react");
24
+
25
+ /**
26
+ * The MultiselectBadge serves as a badge to display selected count.
27
+ */
28
+ var MultiselectBadge = function MultiselectBadge(props) {
29
+ var selectedFilterCount = props.selectedFilterCount,
30
+ others = (0, _objectWithoutProperties2["default"])(props, ["selectedFilterCount"]);
31
+ return (0, _react2.jsx)(_Chip["default"], (0, _extends2["default"])({
32
+ as: "span",
33
+ bg: "neutral.90",
34
+ label: selectedFilterCount.toString(),
35
+ textColor: "neutral.30",
36
+ variant: "multiselectListContainer.multiselectListBadge",
37
+ isUppercase: true
38
+ }, others));
39
+ };
40
+
41
+ MultiselectBadge.propTypes = {
42
+ selectedFilterCount: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
43
+ margin: _propTypes["default"].string
44
+ };
45
+ MultiselectBadge.displayName = 'MultiselectBadge';
46
+ var _default = MultiselectBadge;
47
+ exports["default"] = _default;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
6
+
7
+ var _react = _interopRequireDefault(require("react"));
8
+
9
+ var _testAxe = _interopRequireDefault(require("../../utils/testUtils/testAxe"));
10
+
11
+ var _testWrapper = require("../../utils/testUtils/testWrapper");
12
+
13
+ var _MultiselectBadge = _interopRequireDefault(require("./MultiselectBadge"));
14
+
15
+ var _react2 = require("@emotion/react");
16
+
17
+ var testId = 'test-multiselectBadge';
18
+ var defaultProps = {
19
+ 'data-testid': testId,
20
+ selectedFilterCount: 9
21
+ };
22
+
23
+ var getComponent = function getComponent() {
24
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
25
+ return (0, _testWrapper.render)((0, _react2.jsx)(_MultiselectBadge["default"], (0, _extends2["default"])({}, defaultProps, props)));
26
+ };
27
+
28
+ afterEach(function () {
29
+ jest.restoreAllMocks();
30
+ }); // Need to be added to each test file to test accessibility using axe.
31
+
32
+ (0, _testAxe["default"])(getComponent);
33
+ test('default multiselectBadge', function () {
34
+ getComponent();
35
+
36
+ var multiselectBadge = _testWrapper.screen.getByTestId(testId);
37
+
38
+ expect(multiselectBadge).toBeInTheDocument();
39
+ });
40
+ test('custom classname can be passed', function () {
41
+ getComponent({
42
+ className: 'testing-class'
43
+ });
44
+
45
+ var multiselectBadge = _testWrapper.screen.getByTestId(testId);
46
+
47
+ expect(multiselectBadge).toHaveClass('testing-class');
48
+ });
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
6
+
7
+ var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
8
+
9
+ _Object$defineProperty2(exports, "__esModule", {
10
+ value: true
11
+ });
12
+
13
+ exports["default"] = void 0;
14
+
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
16
+
17
+ var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));
18
+
19
+ var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));
20
+
21
+ var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
22
+
23
+ var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));
24
+
25
+ var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
26
+
27
+ var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
28
+
29
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
30
+
31
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
32
+
33
+ var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
34
+
35
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
36
+
37
+ var _react = _interopRequireWildcard(require("react"));
38
+
39
+ var _propTypes = _interopRequireDefault(require("prop-types"));
40
+
41
+ var _ChevronRightIcon = _interopRequireDefault(require("mdi-react/ChevronRightIcon"));
42
+
43
+ var _ChevronLeftIcon = _interopRequireDefault(require("mdi-react/ChevronLeftIcon"));
44
+
45
+ var _overlays = require("@react-stately/overlays");
46
+
47
+ var _MultiselectBadge = _interopRequireDefault(require("./MultiselectBadge"));
48
+
49
+ var _index = require("../../index");
50
+
51
+ var _hooks = require("../../hooks");
52
+
53
+ var _react2 = require("@emotion/react");
54
+
55
+ function ownKeys(object, enumerableOnly) { var keys = (0, _keys["default"])(object); if (_getOwnPropertySymbols["default"]) { var symbols = (0, _getOwnPropertySymbols["default"])(object); if (enumerableOnly) symbols = (0, _filter["default"])(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor["default"])(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
56
+
57
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; (0, _forEach["default"])(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty3["default"])(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors["default"]) { (0, _defineProperties["default"])(target, (0, _getOwnPropertyDescriptors["default"])(source)); } else { var _context2; (0, _forEach["default"])(_context2 = ownKeys(Object(source))).call(_context2, function (key) { (0, _defineProperty2["default"])(target, key, (0, _getOwnPropertyDescriptor["default"])(source, key)); }); } } return target; }
58
+
59
+ /**
60
+ * The MultiselectListContainer serves as a wrapper around a list and its associated trigger,
61
+ * linking the list's open state with the trigger's press state and providing necessary context.
62
+ */
63
+ var MultiselectListContainer = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
64
+ var selectedFilterCount = props.selectedFilterCount,
65
+ className = props.className,
66
+ children = props.children,
67
+ closeAriaLabel = props.closeAriaLabel,
68
+ isDefaultOpen = props.isDefaultOpen,
69
+ isOpen = props.isOpen,
70
+ onOpenChange = props.onOpenChange,
71
+ openAriaLabel = props.openAriaLabel,
72
+ others = (0, _objectWithoutProperties2["default"])(props, ["selectedFilterCount", "className", "children", "closeAriaLabel", "isDefaultOpen", "isOpen", "onOpenChange", "openAriaLabel"]);
73
+
74
+ var triggerRef = _react["default"].useRef();
75
+
76
+ var state = (0, _overlays.useOverlayTriggerState)({
77
+ defaultOpen: isDefaultOpen,
78
+ isOpen: isOpen,
79
+ onOpenChange: onOpenChange
80
+ });
81
+ var close = state.close;
82
+
83
+ var _useStatusClasses = (0, _hooks.useStatusClasses)(className, {
84
+ isOpen: state.isOpen
85
+ }),
86
+ classNames = _useStatusClasses.classNames;
87
+
88
+ var handleButtonPress = function handleButtonPress() {
89
+ if (state.isOpen) {
90
+ close(state, triggerRef, close);
91
+ } else {
92
+ state.open();
93
+ }
94
+ };
95
+
96
+ var handleClose = function handleClose(e) {
97
+ if (e.key === 'Escape') {
98
+ close(state, triggerRef, close);
99
+ }
100
+ };
101
+
102
+ return (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
103
+ className: classNames,
104
+ onKeyUp: handleClose,
105
+ ref: ref,
106
+ variant: "multiselectListContainer.multiselectListContainer",
107
+ isRow: true
108
+ }, others), (0, _react2.jsx)(_index.IconButton, {
109
+ isRow: true,
110
+ "aria-label": state.isOpen ? closeAriaLabel : openAriaLabel,
111
+ "data-testid": "multiselect-list-button",
112
+ onPress: handleButtonPress,
113
+ ref: triggerRef,
114
+ variant: "multiselectToggle",
115
+ pr: "sm"
116
+ }, (0, _react2.jsx)(_index.Icon, {
117
+ color: "active",
118
+ icon: state.isOpen ? _ChevronRightIcon["default"] : _ChevronLeftIcon["default"],
119
+ role: "button",
120
+ size: "30px"
121
+ }), !state.isOpen && selectedFilterCount && (0, _react2.jsx)(_MultiselectBadge["default"], {
122
+ "data-testid": "multiselect-list-badge",
123
+ margin: "auto",
124
+ selectedFilterCount: selectedFilterCount
125
+ })), state.isOpen && _objectSpread({}, children));
126
+ });
127
+ MultiselectListContainer.propTypes = {
128
+ /** Amount of selected items indicator. */
129
+ selectedFilterCount: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
130
+
131
+ /** Defines a string value that labels the trigger icon when menu is open. */
132
+ closeAriaLabel: _propTypes["default"].string,
133
+
134
+ /** Sets the default open state of the overlay. */
135
+ isDefaultOpen: _propTypes["default"].bool,
136
+
137
+ /** Whether the overlay is currently open. */
138
+ isOpen: _propTypes["default"].bool,
139
+
140
+ /**
141
+ * Method that is called when the open state of the menu changes.
142
+ * Returns the new open state and the action that caused the opening of the menu.
143
+ *
144
+ * `(isOpen: boolean, overlayTrigger: OverlayTriggerAction) => void`
145
+ */
146
+ onOpenChange: _propTypes["default"].func,
147
+
148
+ /** Defines a string value that labels the trigger icon when menu is closed. */
149
+ openAriaLabel: _propTypes["default"].string
150
+ };
151
+ MultiselectListContainer.defaultProps = {
152
+ openAriaLabel: 'Open filter menu?',
153
+ closeAriaLabel: 'Close filter menu?'
154
+ };
155
+ MultiselectListContainer.displayName = 'MultiselectListContainer';
156
+ var _default = MultiselectListContainer;
157
+ exports["default"] = _default;
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
6
+
7
+ var _react = _interopRequireDefault(require("react"));
8
+
9
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
+
11
+ var _testAxe = _interopRequireDefault(require("../../utils/testUtils/testAxe"));
12
+
13
+ var _testWrapper = require("../../utils/testUtils/testWrapper");
14
+
15
+ var _MultiselectListContainer = _interopRequireDefault(require("./MultiselectListContainer"));
16
+
17
+ var _react2 = require("@emotion/react");
18
+
19
+ var testId = 'test-multiselectListContainer';
20
+ var multiselectListBadgeId = 'multiselect-list-badge';
21
+ var multiselectListButtonId = 'multiselect-list-button';
22
+ var multiselectFilterId = 'multiselect-filter';
23
+ var defaultProps = {
24
+ 'data-testid': testId
25
+ };
26
+
27
+ var getComponent = function getComponent() {
28
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
29
+ return (0, _testWrapper.render)((0, _react2.jsx)(_MultiselectListContainer["default"], (0, _extends2["default"])({}, defaultProps, props), (0, _react2.jsx)("div", {
30
+ "data-testid": multiselectFilterId
31
+ })));
32
+ };
33
+
34
+ afterEach(function () {
35
+ jest.restoreAllMocks();
36
+ }); // Need to be added to each test file to test accessibility using axe.
37
+
38
+ (0, _testAxe["default"])(getComponent);
39
+ test('default MultiselectListContainer', function () {
40
+ getComponent();
41
+
42
+ var multiselectListContainer = _testWrapper.screen.getByTestId(testId);
43
+
44
+ expect(multiselectListContainer).toBeInTheDocument();
45
+ });
46
+ test('custom classname can be passed', function () {
47
+ getComponent({
48
+ className: 'testing-class'
49
+ });
50
+
51
+ var multiselectListContainer = _testWrapper.screen.getByTestId(testId);
52
+
53
+ expect(multiselectListContainer).toHaveClass('testing-class');
54
+ });
55
+ test('shows badge when container is closed', function () {
56
+ getComponent({
57
+ selectedFilterCount: 9,
58
+ state: {
59
+ isOpen: false
60
+ }
61
+ });
62
+
63
+ var badge = _testWrapper.screen.getByTestId(multiselectListBadgeId);
64
+
65
+ expect(badge).toBeInTheDocument();
66
+ });
67
+ test('updates aria label when button is clicked', function () {
68
+ var state = {
69
+ isOpen: true
70
+ };
71
+ getComponent({
72
+ state: state
73
+ });
74
+
75
+ var button = _testWrapper.screen.getByTestId(multiselectListButtonId);
76
+
77
+ _userEvent["default"].click(button);
78
+
79
+ var multiSelect = _testWrapper.screen.queryByTestId(multiselectFilterId);
80
+
81
+ expect(button).toHaveAttribute('aria-label', 'Close filter menu?');
82
+ expect(multiSelect).toBeInTheDocument();
83
+
84
+ _userEvent["default"].click(button);
85
+
86
+ expect(button).toHaveAttribute('aria-label', 'Open filter menu?');
87
+ expect(multiSelect).not.toBeInTheDocument();
88
+ });
89
+ test('shows children when isOpen is true', function () {
90
+ getComponent({
91
+ isOpen: true
92
+ });
93
+
94
+ var multiselectFilter = _testWrapper.screen.getByTestId(multiselectFilterId);
95
+
96
+ expect(multiselectFilter).toBeInTheDocument();
97
+ });
98
+ test('should hide children when pressing the escape key', function () {
99
+ getComponent();
100
+
101
+ var button = _testWrapper.screen.getByTestId(multiselectListButtonId);
102
+
103
+ _userEvent["default"].click(button);
104
+
105
+ var multiSelect = _testWrapper.screen.queryByTestId(multiselectFilterId);
106
+
107
+ expect(multiSelect).toBeInTheDocument();
108
+
109
+ _userEvent["default"].type(button, '{esc}');
110
+
111
+ expect(multiSelect).not.toBeInTheDocument();
112
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ _Object$defineProperty(exports, "default", {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return _MultiselectListContainer["default"];
15
+ }
16
+ });
17
+
18
+ var _MultiselectListContainer = _interopRequireDefault(require("./MultiselectListContainer"));
@@ -83,7 +83,8 @@ var PopoverMenu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
83
83
  isDefaultOpen = props.isDefaultOpen,
84
84
  isNotFlippable = props.isNotFlippable,
85
85
  isNotClosedOnSelect = props.isNotClosedOnSelect,
86
- hasNoArrow = props.hasNoArrow;
86
+ hasNoArrow = props.hasNoArrow,
87
+ isContainFocus = props.isContainFocus;
87
88
 
88
89
  var _React$Children$toArr = _react["default"].Children.toArray(children),
89
90
  _React$Children$toArr2 = (0, _slicedToArray2["default"])(_React$Children$toArr, 2),
@@ -124,7 +125,8 @@ var PopoverMenu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
124
125
  });
125
126
 
126
127
  var contents = (0, _react2.jsx)(_focus.FocusScope, {
127
- restoreFocus: true
128
+ restoreFocus: true,
129
+ contain: isContainFocus
128
130
  }, (0, _react2.jsx)(_overlays.DismissButton, {
129
131
  onDismiss: state.close
130
132
  }), menu, (0, _react2.jsx)(_overlays.DismissButton, {
@@ -169,6 +171,9 @@ PopoverMenu.propTypes = {
169
171
  /** Whether the PopoverMenu hides the arrow. */
170
172
  hasNoArrow: _propTypes["default"].bool,
171
173
 
174
+ /** Whether the PopoverMenu contains focus inside the scope. */
175
+ isContainFocus: _propTypes["default"].bool,
176
+
172
177
  /**
173
178
  * Handler that is called when the overlay's open state changes.
174
179
  *
@@ -10,7 +10,7 @@ _Object$defineProperty(exports, "__esModule", {
10
10
  value: true
11
11
  });
12
12
 
13
- exports["default"] = exports.CollectionTab = void 0;
13
+ exports["default"] = exports.TabLine = exports.CollectionTab = void 0;
14
14
 
15
15
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
16
16
 
@@ -30,19 +30,15 @@ var _utils = require("@react-aria/utils");
30
30
 
31
31
  var _collections = require("@react-stately/collections");
32
32
 
33
- var _Box = _interopRequireDefault(require("../Box"));
34
-
35
33
  var _Tabs = require("../Tabs");
36
34
 
37
- var _Text = _interopRequireDefault(require("../Text"));
38
-
39
35
  var _hooks = require("../../hooks");
40
36
 
41
37
  var _orientation = _interopRequireDefault(require("../../utils/devUtils/constants/orientation"));
42
38
 
43
- var _TooltipTrigger = _interopRequireWildcard(require("../TooltipTrigger"));
39
+ var _TabPicker = _interopRequireDefault(require("../TabPicker"));
44
40
 
45
- var _Button = _interopRequireDefault(require("../Button"));
41
+ var _ = require("../..");
46
42
 
47
43
  var _react2 = require("@emotion/react");
48
44
 
@@ -101,24 +97,34 @@ var CollectionTab = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
101
97
  }, state, tabRef),
102
98
  tabProps = _useTab.tabProps;
103
99
 
104
- var tab = (0, _react2.jsx)(_Box["default"], {
100
+ var tab = (0, _react2.jsx)(_.Box, {
105
101
  isRow: true
106
- }, slots === null || slots === void 0 ? void 0 : slots.beforeTab, (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
102
+ }, slots === null || slots === void 0 ? void 0 : slots.beforeTab, (0, _react2.jsx)(_.Box, (0, _extends2["default"])({
107
103
  className: classNames,
108
104
  variant: "tab"
109
105
  }, (0, _utils.mergeProps)(focusProps, hoverProps, tabProps), otherItemProps, {
110
106
  ref: tabRef,
111
107
  title: titleAttr || undefined
112
- }), icon, (0, _react2.jsx)(_Text["default"], (0, _extends2["default"])({
108
+ }), icon, (0, _react2.jsx)(_.Text, (0, _extends2["default"])({
113
109
  variant: "tabLabel"
114
110
  }, tabLabelProps), rendered), isSelected && !isDisabled && (0, _react2.jsx)(TabLine, tabLineProps)), slots === null || slots === void 0 ? void 0 : slots.afterTab);
115
111
 
112
+ if (mode === 'list' && itemProps.list) {
113
+ return (0, _react2.jsx)(_TabPicker["default"], (0, _extends2["default"])({
114
+ ref: tabRef,
115
+ className: classNames,
116
+ items: itemProps.list,
117
+ state: state,
118
+ item: item
119
+ }, (0, _utils.mergeProps)(focusProps, hoverProps, tabProps), otherItemProps));
120
+ }
121
+
116
122
  if (mode === 'tooltip') {
117
- return (0, _react2.jsx)(_react["default"].Fragment, null, separator, (0, _react2.jsx)(_TooltipTrigger["default"], (0, _extends2["default"])({}, tooltipTriggerProps, {
123
+ return (0, _react2.jsx)(_react["default"].Fragment, null, separator, (0, _react2.jsx)(_.TooltipTrigger, (0, _extends2["default"])({}, tooltipTriggerProps, {
118
124
  isOpen: isHovered || isFocusVisible
119
- }), (0, _react2.jsx)(_Button["default"], {
125
+ }), (0, _react2.jsx)(_.Button, {
120
126
  variant: "quiet"
121
- }, tab), (0, _react2.jsx)(_TooltipTrigger.Tooltip, null, itemProps.textValue || itemProps.title)));
127
+ }, tab), (0, _react2.jsx)(_.Tooltip, null, itemProps.textValue || itemProps.title)));
122
128
  }
123
129
 
124
130
  return tab;
@@ -133,7 +139,7 @@ CollectionTab.propTypes = {
133
139
  rendered: _propTypes["default"].node,
134
140
  tabLineProps: _propTypes["default"].shape({})
135
141
  }),
136
- mode: _propTypes["default"].oneOf(['default', 'tooltip']),
142
+ mode: _propTypes["default"].oneOf(['default', 'tooltip', 'list']),
137
143
  orientation: _propTypes["default"].oneOf(['horizontal', 'vertical']),
138
144
  tooltipTriggerProps: _propTypes["default"].shape({}),
139
145
  slots: _propTypes["default"].shape({
@@ -143,12 +149,13 @@ CollectionTab.propTypes = {
143
149
  };
144
150
 
145
151
  var TabLine = function TabLine(props) {
146
- return (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
152
+ return (0, _react2.jsx)(_.Box, (0, _extends2["default"])({
147
153
  role: "presentation",
148
154
  variant: "tabLine"
149
155
  }, props));
150
156
  }; // Export Item as default Tab for simplicity, convert to CollectionTab within Tabs component
151
157
 
152
158
 
159
+ exports.TabLine = TabLine;
153
160
  var _default = _collections.Item;
154
161
  exports["default"] = _default;