@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,123 @@
1
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
2
+ import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
3
+ import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
4
+ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
5
+ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
6
+ import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
7
+ import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
8
+ import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
9
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
10
+ import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
11
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
12
+
13
+ function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
14
+
15
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
+
17
+ import React, { forwardRef } from 'react';
18
+ import PropTypes from 'prop-types';
19
+ import ChevronRightIcon from 'mdi-react/ChevronRightIcon';
20
+ import ChevronLeftIcon from 'mdi-react/ChevronLeftIcon';
21
+ import { useOverlayTriggerState } from '@react-stately/overlays';
22
+ import MultiselectBadge from './MultiselectBadge';
23
+ import { Icon, IconButton, Box } from '../../index';
24
+ import { useStatusClasses } from '../../hooks';
25
+ /**
26
+ * The MultiselectListContainer serves as a wrapper around a list and its associated trigger,
27
+ * linking the list's open state with the trigger's press state and providing necessary context.
28
+ */
29
+
30
+ import { jsx as ___EmotionJSX } from "@emotion/react";
31
+ var MultiselectListContainer = /*#__PURE__*/forwardRef(function (props, ref) {
32
+ var selectedFilterCount = props.selectedFilterCount,
33
+ className = props.className,
34
+ children = props.children,
35
+ closeAriaLabel = props.closeAriaLabel,
36
+ isDefaultOpen = props.isDefaultOpen,
37
+ isOpen = props.isOpen,
38
+ onOpenChange = props.onOpenChange,
39
+ openAriaLabel = props.openAriaLabel,
40
+ others = _objectWithoutProperties(props, ["selectedFilterCount", "className", "children", "closeAriaLabel", "isDefaultOpen", "isOpen", "onOpenChange", "openAriaLabel"]);
41
+
42
+ var triggerRef = React.useRef();
43
+ var state = useOverlayTriggerState({
44
+ defaultOpen: isDefaultOpen,
45
+ isOpen: isOpen,
46
+ onOpenChange: onOpenChange
47
+ });
48
+ var close = state.close;
49
+
50
+ var _useStatusClasses = useStatusClasses(className, {
51
+ isOpen: state.isOpen
52
+ }),
53
+ classNames = _useStatusClasses.classNames;
54
+
55
+ var handleButtonPress = function handleButtonPress() {
56
+ if (state.isOpen) {
57
+ close(state, triggerRef, close);
58
+ } else {
59
+ state.open();
60
+ }
61
+ };
62
+
63
+ var handleClose = function handleClose(e) {
64
+ if (e.key === 'Escape') {
65
+ close(state, triggerRef, close);
66
+ }
67
+ };
68
+
69
+ return ___EmotionJSX(Box, _extends({
70
+ className: classNames,
71
+ onKeyUp: handleClose,
72
+ ref: ref,
73
+ variant: "multiselectListContainer.multiselectListContainer",
74
+ isRow: true
75
+ }, others), ___EmotionJSX(IconButton, {
76
+ isRow: true,
77
+ "aria-label": state.isOpen ? closeAriaLabel : openAriaLabel,
78
+ "data-testid": "multiselect-list-button",
79
+ onPress: handleButtonPress,
80
+ ref: triggerRef,
81
+ variant: "multiselectToggle",
82
+ pr: "sm"
83
+ }, ___EmotionJSX(Icon, {
84
+ color: "active",
85
+ icon: state.isOpen ? ChevronRightIcon : ChevronLeftIcon,
86
+ role: "button",
87
+ size: "30px"
88
+ }), !state.isOpen && selectedFilterCount && ___EmotionJSX(MultiselectBadge, {
89
+ "data-testid": "multiselect-list-badge",
90
+ margin: "auto",
91
+ selectedFilterCount: selectedFilterCount
92
+ })), state.isOpen && _objectSpread({}, children));
93
+ });
94
+ MultiselectListContainer.propTypes = {
95
+ /** Amount of selected items indicator. */
96
+ selectedFilterCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
97
+
98
+ /** Defines a string value that labels the trigger icon when menu is open. */
99
+ closeAriaLabel: PropTypes.string,
100
+
101
+ /** Sets the default open state of the overlay. */
102
+ isDefaultOpen: PropTypes.bool,
103
+
104
+ /** Whether the overlay is currently open. */
105
+ isOpen: PropTypes.bool,
106
+
107
+ /**
108
+ * Method that is called when the open state of the menu changes.
109
+ * Returns the new open state and the action that caused the opening of the menu.
110
+ *
111
+ * `(isOpen: boolean, overlayTrigger: OverlayTriggerAction) => void`
112
+ */
113
+ onOpenChange: PropTypes.func,
114
+
115
+ /** Defines a string value that labels the trigger icon when menu is closed. */
116
+ openAriaLabel: PropTypes.string
117
+ };
118
+ MultiselectListContainer.defaultProps = {
119
+ openAriaLabel: 'Open filter menu?',
120
+ closeAriaLabel: 'Close filter menu?'
121
+ };
122
+ MultiselectListContainer.displayName = 'MultiselectListContainer';
123
+ export default MultiselectListContainer;
@@ -0,0 +1,81 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import React from 'react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import axeTest from '../../utils/testUtils/testAxe';
5
+ import { render, screen } from '../../utils/testUtils/testWrapper';
6
+ import MultiselectListContainer from './MultiselectListContainer';
7
+ import { jsx as ___EmotionJSX } from "@emotion/react";
8
+ var testId = 'test-multiselectListContainer';
9
+ var multiselectListBadgeId = 'multiselect-list-badge';
10
+ var multiselectListButtonId = 'multiselect-list-button';
11
+ var multiselectFilterId = 'multiselect-filter';
12
+ var defaultProps = {
13
+ 'data-testid': testId
14
+ };
15
+
16
+ var getComponent = function getComponent() {
17
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18
+ return render(___EmotionJSX(MultiselectListContainer, _extends({}, defaultProps, props), ___EmotionJSX("div", {
19
+ "data-testid": multiselectFilterId
20
+ })));
21
+ };
22
+
23
+ afterEach(function () {
24
+ jest.restoreAllMocks();
25
+ }); // Need to be added to each test file to test accessibility using axe.
26
+
27
+ axeTest(getComponent);
28
+ test('default MultiselectListContainer', function () {
29
+ getComponent();
30
+ var multiselectListContainer = screen.getByTestId(testId);
31
+ expect(multiselectListContainer).toBeInTheDocument();
32
+ });
33
+ test('custom classname can be passed', function () {
34
+ getComponent({
35
+ className: 'testing-class'
36
+ });
37
+ var multiselectListContainer = screen.getByTestId(testId);
38
+ expect(multiselectListContainer).toHaveClass('testing-class');
39
+ });
40
+ test('shows badge when container is closed', function () {
41
+ getComponent({
42
+ selectedFilterCount: 9,
43
+ state: {
44
+ isOpen: false
45
+ }
46
+ });
47
+ var badge = screen.getByTestId(multiselectListBadgeId);
48
+ expect(badge).toBeInTheDocument();
49
+ });
50
+ test('updates aria label when button is clicked', function () {
51
+ var state = {
52
+ isOpen: true
53
+ };
54
+ getComponent({
55
+ state: state
56
+ });
57
+ var button = screen.getByTestId(multiselectListButtonId);
58
+ userEvent.click(button);
59
+ var multiSelect = screen.queryByTestId(multiselectFilterId);
60
+ expect(button).toHaveAttribute('aria-label', 'Close filter menu?');
61
+ expect(multiSelect).toBeInTheDocument();
62
+ userEvent.click(button);
63
+ expect(button).toHaveAttribute('aria-label', 'Open filter menu?');
64
+ expect(multiSelect).not.toBeInTheDocument();
65
+ });
66
+ test('shows children when isOpen is true', function () {
67
+ getComponent({
68
+ isOpen: true
69
+ });
70
+ var multiselectFilter = screen.getByTestId(multiselectFilterId);
71
+ expect(multiselectFilter).toBeInTheDocument();
72
+ });
73
+ test('should hide children when pressing the escape key', function () {
74
+ getComponent();
75
+ var button = screen.getByTestId(multiselectListButtonId);
76
+ userEvent.click(button);
77
+ var multiSelect = screen.queryByTestId(multiselectFilterId);
78
+ expect(multiSelect).toBeInTheDocument();
79
+ userEvent.type(button, '{esc}');
80
+ expect(multiSelect).not.toBeInTheDocument();
81
+ });
@@ -0,0 +1 @@
1
+ export { default } from './MultiselectListContainer';
@@ -49,7 +49,8 @@ var PopoverMenu = /*#__PURE__*/forwardRef(function (props, ref) {
49
49
  isDefaultOpen = props.isDefaultOpen,
50
50
  isNotFlippable = props.isNotFlippable,
51
51
  isNotClosedOnSelect = props.isNotClosedOnSelect,
52
- hasNoArrow = props.hasNoArrow;
52
+ hasNoArrow = props.hasNoArrow,
53
+ isContainFocus = props.isContainFocus;
53
54
 
54
55
  var _React$Children$toArr = React.Children.toArray(children),
55
56
  _React$Children$toArr2 = _slicedToArray(_React$Children$toArr, 2),
@@ -90,7 +91,8 @@ var PopoverMenu = /*#__PURE__*/forwardRef(function (props, ref) {
90
91
  });
91
92
 
92
93
  var contents = ___EmotionJSX(FocusScope, {
93
- restoreFocus: true
94
+ restoreFocus: true,
95
+ contain: isContainFocus
94
96
  }, ___EmotionJSX(DismissButton, {
95
97
  onDismiss: state.close
96
98
  }), menu, ___EmotionJSX(DismissButton, {
@@ -136,6 +138,9 @@ PopoverMenu.propTypes = {
136
138
  /** Whether the PopoverMenu hides the arrow. */
137
139
  hasNoArrow: PropTypes.bool,
138
140
 
141
+ /** Whether the PopoverMenu contains focus inside the scope. */
142
+ isContainFocus: PropTypes.bool,
143
+
139
144
  /**
140
145
  * Handler that is called when the overlay's open state changes.
141
146
  *
@@ -7,13 +7,11 @@ import { useFocusRing } from '@react-aria/focus';
7
7
  import { useHover } from '@react-aria/interactions';
8
8
  import { mergeProps } from '@react-aria/utils';
9
9
  import { Item as Tab } from '@react-stately/collections';
10
- import Box from '../Box';
11
10
  import { TabsContext } from '../Tabs';
12
- import Text from '../Text';
13
11
  import { useStatusClasses, usePropWarning } from '../../hooks';
14
12
  import ORIENTATION from '../../utils/devUtils/constants/orientation';
15
- import TooltipTrigger, { Tooltip } from '../TooltipTrigger';
16
- import Button from '../Button';
13
+ import TabPicker from '../TabPicker';
14
+ import { Box, Text, TooltipTrigger, Tooltip, Button } from '../..';
17
15
  import { jsx as ___EmotionJSX } from "@emotion/react";
18
16
  export var CollectionTab = /*#__PURE__*/forwardRef(function (props, ref) {
19
17
  var className = props.className,
@@ -84,6 +82,16 @@ export var CollectionTab = /*#__PURE__*/forwardRef(function (props, ref) {
84
82
  variant: "tabLabel"
85
83
  }, tabLabelProps), rendered), isSelected && !isDisabled && ___EmotionJSX(TabLine, tabLineProps)), slots === null || slots === void 0 ? void 0 : slots.afterTab);
86
84
 
85
+ if (mode === 'list' && itemProps.list) {
86
+ return ___EmotionJSX(TabPicker, _extends({
87
+ ref: tabRef,
88
+ className: classNames,
89
+ items: itemProps.list,
90
+ state: state,
91
+ item: item
92
+ }, mergeProps(focusProps, hoverProps, tabProps), otherItemProps));
93
+ }
94
+
87
95
  if (mode === 'tooltip') {
88
96
  return ___EmotionJSX(React.Fragment, null, separator, ___EmotionJSX(TooltipTrigger, _extends({}, tooltipTriggerProps, {
89
97
  isOpen: isHovered || isFocusVisible
@@ -103,7 +111,7 @@ CollectionTab.propTypes = {
103
111
  rendered: PropTypes.node,
104
112
  tabLineProps: PropTypes.shape({})
105
113
  }),
106
- mode: PropTypes.oneOf(['default', 'tooltip']),
114
+ mode: PropTypes.oneOf(['default', 'tooltip', 'list']),
107
115
  orientation: PropTypes.oneOf(['horizontal', 'vertical']),
108
116
  tooltipTriggerProps: PropTypes.shape({}),
109
117
  slots: PropTypes.shape({
@@ -111,13 +119,11 @@ CollectionTab.propTypes = {
111
119
  afterTab: PropTypes.node
112
120
  })
113
121
  };
114
-
115
- var TabLine = function TabLine(props) {
122
+ export var TabLine = function TabLine(props) {
116
123
  return ___EmotionJSX(Box, _extends({
117
124
  role: "presentation",
118
125
  variant: "tabLine"
119
126
  }, props));
120
127
  }; // Export Item as default Tab for simplicity, convert to CollectionTab within Tabs component
121
128
 
122
-
123
129
  export default Tab;
@@ -0,0 +1,210 @@
1
+ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
2
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
3
+ import _findInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/find";
4
+ import _findIndexInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/find-index";
5
+ import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
6
+ import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
7
+ import _someInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/some";
8
+ import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
9
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
10
+ import React, { forwardRef, useEffect, useMemo, useRef, useState } from 'react';
11
+ import PropTypes from 'prop-types';
12
+ import { Item as Tab } from '@react-stately/collections';
13
+ import ArrowDropUpIcon from 'mdi-react/ArrowDropUpIcon';
14
+ import ArrowDropDownIcon from 'mdi-react/ArrowDropDownIcon';
15
+ import { useStatusClasses } from '../../hooks';
16
+ import { Box, Text, Button, PopoverMenu, Icon, Menu } from '../..';
17
+ import { TabLine } from '../Tab';
18
+ /* istanbul ignore next */
19
+
20
+ import { jsx as ___EmotionJSX } from "@emotion/react";
21
+ var TabPicker = /*#__PURE__*/forwardRef(function (_ref, ref) {
22
+ var className = _ref.className,
23
+ items = _ref.items,
24
+ state = _ref.state,
25
+ item = _ref.item,
26
+ others = _objectWithoutProperties(_ref, ["className", "items", "state", "item"]);
27
+
28
+ var _useState = useState(false),
29
+ _useState2 = _slicedToArray(_useState, 2),
30
+ isOpen = _useState2[0],
31
+ setIsOpen = _useState2[1];
32
+
33
+ var _useState3 = useState(state.selectedKey),
34
+ _useState4 = _slicedToArray(_useState3, 2),
35
+ selectedItem = _useState4[0],
36
+ setSelectedItem = _useState4[1];
37
+
38
+ var selectionManager = state.selectionManager;
39
+
40
+ var _useState5 = useState(selectionManager.focusedKey),
41
+ _useState6 = _slicedToArray(_useState5, 2),
42
+ focusedItem = _useState6[0],
43
+ setFocusedItem = _useState6[1];
44
+
45
+ var isTabFocused = selectionManager.focusedKey === item.key;
46
+ var isTabSelected = state.selectedKey === item.key;
47
+
48
+ var isListItemFocused = _someInstanceProperty(items).call(items, function (el) {
49
+ return el.key === selectionManager.focusedKey;
50
+ });
51
+
52
+ var isListItemSelected = _someInstanceProperty(items).call(items, function (el) {
53
+ return el.key === state.selectedKey;
54
+ });
55
+
56
+ var _useMemo = useMemo(function () {
57
+ var _context, _tabs$prevIndex, _tabs$nextIndex;
58
+
59
+ var tabs = _filterInstanceProperty(_context = _Array$from(state.collection)).call(_context, function (tab) {
60
+ var _tab$value;
61
+
62
+ return !(tab === null || tab === void 0 ? void 0 : (_tab$value = tab.value) === null || _tab$value === void 0 ? void 0 : _tab$value.isListItem);
63
+ });
64
+
65
+ var prevIndex = _findIndexInstanceProperty(tabs).call(tabs, function (tab) {
66
+ return tab.key === item.key;
67
+ }) - 1;
68
+ var nextIndex = _findIndexInstanceProperty(tabs).call(tabs, function (tab) {
69
+ return tab.key === item.key;
70
+ }) + 1;
71
+ return {
72
+ prevKey: ((_tabs$prevIndex = tabs[prevIndex]) === null || _tabs$prevIndex === void 0 ? void 0 : _tabs$prevIndex.key) || tabs[tabs.length].key,
73
+ nextKey: ((_tabs$nextIndex = tabs[nextIndex]) === null || _tabs$nextIndex === void 0 ? void 0 : _tabs$nextIndex.key) || tabs[0].key
74
+ };
75
+ }, []),
76
+ prevKey = _useMemo.prevKey,
77
+ nextKey = _useMemo.nextKey;
78
+
79
+ var _useStatusClasses = useStatusClasses(className, {
80
+ isSelected: isListItemSelected
81
+ }),
82
+ classNames = _useStatusClasses.classNames;
83
+
84
+ var menuRef = useRef();
85
+
86
+ var handleSelectedItem = function handleSelectedItem(currentItem) {
87
+ state.setSelectedKey(currentItem);
88
+ setFocusedItem(currentItem);
89
+ };
90
+
91
+ useEffect(function () {
92
+ if (selectedItem) {
93
+ handleSelectedItem(selectedItem);
94
+ }
95
+ }, [selectedItem]);
96
+ useEffect(function () {
97
+ if (focusedItem) {
98
+ selectionManager.setFocusedKey(focusedItem);
99
+ }
100
+ }, [focusedItem]);
101
+ useEffect(function () {
102
+ if (isOpen && (isTabFocused || isListItemSelected) && menuRef.current) {
103
+ if (focusedItem) {
104
+ var _context2;
105
+
106
+ _findInstanceProperty(_context2 = _Array$from(menuRef.current.children)).call(_context2, function (el) {
107
+ return el.dataset.key === focusedItem;
108
+ }).focus();
109
+ } else {
110
+ menuRef.current.firstChild.focus();
111
+ }
112
+ }
113
+
114
+ if (!isOpen && isTabSelected && !selectedItem) {
115
+ setSelectedItem(selectionManager.focusedKey);
116
+ }
117
+ }, [isOpen]);
118
+ useEffect(function () {
119
+ if (isOpen && isListItemFocused) {
120
+ setFocusedItem(selectionManager.focusedKey);
121
+ } else if (!isOpen && isListItemFocused) {
122
+ selectionManager.setFocusedKey(item.key);
123
+ }
124
+ }, [selectionManager.focusedKey]);
125
+ useEffect(function () {
126
+ if (isTabSelected || isTabFocused) {
127
+ if (selectedItem) {
128
+ handleSelectedItem(selectedItem);
129
+ } else if (isListItemSelected && !selectedItem) {
130
+ setSelectedItem(state.selectedKey);
131
+ } else {
132
+ setFocusedItem(items[0].key);
133
+ }
134
+ } else if (!isListItemSelected && !isListItemFocused) {
135
+ setIsOpen(false);
136
+ setSelectedItem(null);
137
+ setFocusedItem(null);
138
+ }
139
+ }, [isTabSelected, isListItemSelected]);
140
+
141
+ var handleKeyNavigation = function handleKeyNavigation(e) {
142
+ switch (e.key) {
143
+ case 'ArrowRight':
144
+ {
145
+ selectionManager.setFocusedKey(nextKey);
146
+ break;
147
+ }
148
+
149
+ case 'ArrowLeft':
150
+ {
151
+ selectionManager.setFocusedKey(prevKey);
152
+ break;
153
+ }
154
+
155
+ default:
156
+ break;
157
+ }
158
+ };
159
+
160
+ var tabProps = others;
161
+ delete tabProps.onPointerDown;
162
+ delete tabProps.onKeyDown;
163
+ return ___EmotionJSX(PopoverMenu, {
164
+ onOpenChange: setIsOpen,
165
+ isOpen: isOpen,
166
+ isContainFocus: true
167
+ }, ___EmotionJSX(Button, {
168
+ className: classNames,
169
+ variant: "menuTab",
170
+ onKeyDown: handleKeyNavigation
171
+ }, ___EmotionJSX(Box, _extends({
172
+ className: classNames,
173
+ variant: "tab",
174
+ ref: ref
175
+ }, tabProps), ___EmotionJSX(Text, {
176
+ variant: "tabLabel"
177
+ }, item.props.name), selectedItem && ___EmotionJSX(TabLine, null)), ___EmotionJSX(Icon, {
178
+ icon: isOpen ? ArrowDropUpIcon : ArrowDropDownIcon
179
+ })), ___EmotionJSX(Menu, {
180
+ onAction: setSelectedItem,
181
+ selectionMode: "single",
182
+ selectedKeys: [selectionManager.focusedKey],
183
+ ref: menuRef
184
+ }, _mapInstanceProperty(items).call(items, function (tab) {
185
+ return ___EmotionJSX(Tab, {
186
+ key: tab.key
187
+ }, tab.name);
188
+ })));
189
+ });
190
+ TabPicker.propTypes = {
191
+ item: PropTypes.shape({
192
+ key: PropTypes.string,
193
+ props: PropTypes.shape({
194
+ name: PropTypes.string
195
+ })
196
+ }),
197
+ items: PropTypes.arrayOf(PropTypes.shape({
198
+ key: PropTypes.string
199
+ })),
200
+ state: PropTypes.shape({
201
+ collection: PropTypes.shape({}),
202
+ selectedKey: PropTypes.string,
203
+ setSelectedKey: PropTypes["function"],
204
+ selectionManager: PropTypes.shape({
205
+ focusedKey: PropTypes.string,
206
+ setFocusedKey: PropTypes["function"]
207
+ })
208
+ })
209
+ };
210
+ export default TabPicker;
@@ -0,0 +1 @@
1
+ export { default } from './TabPicker';
@@ -1,20 +1,21 @@
1
1
  import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
2
2
  import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
3
3
  import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
4
- import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
5
4
  import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
6
- import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
7
5
  import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
8
6
  import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
9
7
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
10
8
  import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
11
- import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
9
+ import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
12
10
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
11
+ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
12
+ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
13
+ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
13
14
  import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
14
15
 
15
16
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
16
17
 
17
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source), true)).call(_context2, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context3; _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context6; _forEachInstanceProperty(_context6 = ownKeys(Object(source), true)).call(_context6, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context7; _forEachInstanceProperty(_context7 = ownKeys(Object(source))).call(_context7, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
18
19
 
19
20
  import React, { forwardRef, useImperativeHandle, useRef } from 'react';
20
21
  import PropTypes from 'prop-types';
@@ -27,16 +28,17 @@ import { usePropWarning } from '../../hooks';
27
28
  import { jsx as ___EmotionJSX } from "@emotion/react";
28
29
  export var TabsContext = /*#__PURE__*/React.createContext({});
29
30
  var Tabs = /*#__PURE__*/forwardRef(function (props, ref) {
30
- var _context;
31
+ var _context4, _context5;
31
32
 
32
33
  var children = props.children,
33
34
  isDisabled = props.isDisabled,
35
+ items = props.items,
34
36
  onSelectionChange = props.onSelectionChange,
35
37
  orientation = props.orientation,
36
38
  mode = props.mode,
37
39
  tabListProps = props.tabListProps,
38
40
  tabPanelProps = props.tabPanelProps,
39
- others = _objectWithoutProperties(props, ["children", "isDisabled", "onSelectionChange", "orientation", "mode", "tabListProps", "tabPanelProps"]);
41
+ others = _objectWithoutProperties(props, ["children", "isDisabled", "items", "onSelectionChange", "orientation", "mode", "tabListProps", "tabPanelProps"]);
40
42
 
41
43
  var tabListRef = useRef();
42
44
  usePropWarning(props, 'disabled', 'isDisabled');
@@ -51,8 +53,31 @@ var Tabs = /*#__PURE__*/forwardRef(function (props, ref) {
51
53
  useImperativeHandle(ref, function () {
52
54
  return tabPanelRef.current;
53
55
  });
56
+ var allItems = [];
57
+
58
+ if (mode === 'list') {
59
+ _forEachInstanceProperty(items).call(items, function (item) {
60
+ var _context;
61
+
62
+ allItems = _concatInstanceProperty(_context = []).call(_context, allItems, [item]);
63
+
64
+ if (item.list) {
65
+ var _context2, _context3;
66
+
67
+ var list = _mapInstanceProperty(_context2 = item.list).call(_context2, function (el) {
68
+ return _objectSpread(_objectSpread({}, el), {}, {
69
+ isListItem: true
70
+ });
71
+ });
72
+
73
+ allItems = _concatInstanceProperty(_context3 = []).call(_context3, allItems, list);
74
+ }
75
+ });
76
+ }
77
+
54
78
  var state = useTabListState(_objectSpread(_objectSpread({}, props), {}, {
55
- onSelectionChange: onSelectionChange
79
+ onSelectionChange: onSelectionChange,
80
+ items: mode === 'list' ? allItems : items
56
81
  }));
57
82
 
58
83
  var _useTabList = useTabList(props, state, tabListRef),
@@ -70,7 +95,11 @@ var Tabs = /*#__PURE__*/forwardRef(function (props, ref) {
70
95
  isRow: orientation === ORIENTATION.HORIZONTAL
71
96
  }, tabListProps, raTabListProps, {
72
97
  ref: tabListRef
73
- }), _mapInstanceProperty(_context = _Array$from(state.collection)).call(_context, function (item) {
98
+ }), _mapInstanceProperty(_context4 = _filterInstanceProperty(_context5 = _Array$from(state.collection)).call(_context5, function (item) {
99
+ var _item$value;
100
+
101
+ return !(item === null || item === void 0 ? void 0 : (_item$value = item.value) === null || _item$value === void 0 ? void 0 : _item$value.isListItem);
102
+ })).call(_context4, function (item) {
74
103
  var _item$props;
75
104
 
76
105
  return ___EmotionJSX(CollectionTab, {
@@ -100,7 +129,7 @@ Tabs.propTypes = {
100
129
  orientation: PropTypes.oneOf(['horizontal', 'vertical']),
101
130
 
102
131
  /** Determines the behavior model for the tabs. */
103
- mode: PropTypes.oneOf(['default', 'tooltip']),
132
+ mode: PropTypes.oneOf(['default', 'tooltip', 'list']),
104
133
 
105
134
  /**
106
135
  * *For performance reasons, use this prop instead of Array.map when iteratively rendering Items*.
@@ -118,12 +147,16 @@ Tabs.propTypes = {
118
147
  tabListProps: PropTypes.shape({}),
119
148
 
120
149
  /** Props object that is spread directly into all of the tab panel wrapper elements. */
121
- tabPanelProps: PropTypes.shape({})
150
+ tabPanelProps: PropTypes.shape({}),
151
+
152
+ /** Whether tabs are activated automatically on focus or manually¸ */
153
+ keyboardActivation: PropTypes.oneOf(['automatic', 'manual'])
122
154
  };
123
155
  Tabs.defaultProps = {
124
156
  isDisabled: false,
125
157
  orientation: 'horizontal',
126
- mode: 'default'
158
+ mode: 'default',
159
+ keyboardActivation: 'manual'
127
160
  };
128
161
  Tabs.displayName = 'Tabs';
129
162
  export default Tabs;
@@ -1,3 +1,4 @@
1
+ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
1
2
  import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
2
3
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
3
4
  import React, { useState } from 'react';
@@ -225,4 +226,30 @@ export var ContentSlots = function ContentSlots() {
225
226
  afterTab: afterTabNode
226
227
  }
227
228
  }, ___EmotionJSX(Text, null, "Users Matched"))));
229
+ };
230
+ export var WithList = function WithList() {
231
+ var _context;
232
+
233
+ var allTabs = _concatInstanceProperty(_context = []).call(_context, tabs, [{
234
+ name: 'Tab 4',
235
+ list: [{
236
+ key: 'tab1list',
237
+ name: 'Tab 1 list',
238
+ children: 'Tab 1 from list'
239
+ }, {
240
+ key: 'tab2list',
241
+ name: 'Tab 2 list',
242
+ children: 'Tab 2 from list'
243
+ }]
244
+ }]);
245
+
246
+ return ___EmotionJSX(Tabs, {
247
+ items: allTabs,
248
+ mode: "list"
249
+ }, function (item) {
250
+ return ___EmotionJSX(Tab, _extends({
251
+ key: item.name,
252
+ title: item.name
253
+ }, item), item.children);
254
+ });
228
255
  };