@zendeskgarden/react-dropdowns 9.0.0-next.7 → 9.0.0-next.9

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 (74) hide show
  1. package/dist/esm/context/useComboboxContext.js +18 -0
  2. package/dist/esm/context/useFieldContext.js +18 -0
  3. package/dist/esm/context/useItemContext.js +18 -0
  4. package/dist/esm/context/useItemGroupContext.js +14 -0
  5. package/dist/esm/context/useMenuContext.js +18 -0
  6. package/dist/esm/context/useOptionContext.js +18 -0
  7. package/dist/esm/elements/combobox/Combobox.js +330 -0
  8. package/dist/esm/elements/combobox/Field.js +75 -0
  9. package/dist/esm/elements/combobox/Hint.js +57 -0
  10. package/dist/esm/elements/combobox/Label.js +68 -0
  11. package/dist/esm/elements/combobox/Listbox.js +155 -0
  12. package/dist/esm/elements/combobox/Message.js +63 -0
  13. package/dist/esm/elements/combobox/OptGroup.js +93 -0
  14. package/dist/esm/elements/combobox/Option.js +133 -0
  15. package/dist/esm/elements/combobox/OptionMeta.js +55 -0
  16. package/dist/esm/elements/combobox/Tag.js +98 -0
  17. package/dist/esm/elements/combobox/TagAvatar.js +13 -0
  18. package/dist/esm/elements/combobox/TagGroup.js +35 -0
  19. package/dist/esm/elements/combobox/utils.js +36 -0
  20. package/dist/esm/elements/menu/Item.js +140 -0
  21. package/dist/esm/elements/menu/ItemGroup.js +96 -0
  22. package/dist/esm/elements/menu/ItemMeta.js +55 -0
  23. package/dist/esm/elements/menu/Menu.js +157 -0
  24. package/dist/esm/elements/menu/MenuList.js +170 -0
  25. package/dist/esm/elements/menu/Separator.js +58 -0
  26. package/dist/esm/elements/menu/utils.js +55 -0
  27. package/dist/esm/index.js +19 -0
  28. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/check-lg-stroke.svg.js +28 -0
  29. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-down-stroke.svg.js +25 -0
  30. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-left-stroke.svg.js +25 -0
  31. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-right-stroke.svg.js +25 -0
  32. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/plus-stroke.svg.js +26 -0
  33. package/dist/esm/types/index.js +12 -0
  34. package/dist/esm/views/combobox/StyledCombobox.js +30 -0
  35. package/dist/esm/views/combobox/StyledContainer.js +22 -0
  36. package/dist/esm/views/combobox/StyledField.js +22 -0
  37. package/dist/esm/views/combobox/StyledFloatingListbox.js +27 -0
  38. package/dist/esm/views/combobox/StyledHint.js +23 -0
  39. package/dist/esm/views/combobox/StyledInput.js +41 -0
  40. package/dist/esm/views/combobox/StyledInputGroup.js +26 -0
  41. package/dist/esm/views/combobox/StyledInputIcon.js +43 -0
  42. package/dist/esm/views/combobox/StyledLabel.js +23 -0
  43. package/dist/esm/views/combobox/StyledListbox.js +31 -0
  44. package/dist/esm/views/combobox/StyledListboxSeparator.js +31 -0
  45. package/dist/esm/views/combobox/StyledMessage.js +23 -0
  46. package/dist/esm/views/combobox/StyledOptGroup.js +22 -0
  47. package/dist/esm/views/combobox/StyledOption.js +48 -0
  48. package/dist/esm/views/combobox/StyledOptionContent.js +22 -0
  49. package/dist/esm/views/combobox/StyledOptionIcon.js +29 -0
  50. package/dist/esm/views/combobox/StyledOptionMeta.js +31 -0
  51. package/dist/esm/views/combobox/StyledOptionTypeIcon.js +48 -0
  52. package/dist/esm/views/combobox/StyledTag.js +24 -0
  53. package/dist/esm/views/combobox/StyledTagsButton.js +28 -0
  54. package/dist/esm/views/combobox/StyledTrigger.js +94 -0
  55. package/dist/esm/views/combobox/StyledValue.js +32 -0
  56. package/dist/esm/views/menu/StyledButton.js +23 -0
  57. package/dist/esm/views/menu/StyledFloatingMenu.js +23 -0
  58. package/dist/esm/views/menu/StyledItem.js +23 -0
  59. package/dist/esm/views/menu/StyledItemContent.js +23 -0
  60. package/dist/esm/views/menu/StyledItemGroup.js +23 -0
  61. package/dist/esm/views/menu/StyledItemIcon.js +23 -0
  62. package/dist/esm/views/menu/StyledItemMeta.js +23 -0
  63. package/dist/esm/views/menu/StyledItemTypeIcon.js +24 -0
  64. package/dist/esm/views/menu/StyledMenu.js +27 -0
  65. package/dist/esm/views/menu/StyledSeparator.js +23 -0
  66. package/dist/index.cjs.js +86 -128
  67. package/dist/typings/views/combobox/StyledInputIcon.d.ts +6 -6
  68. package/dist/typings/views/combobox/StyledOptionIcon.d.ts +1 -1
  69. package/dist/typings/views/combobox/StyledOptionTypeIcon.d.ts +3 -3
  70. package/dist/typings/views/menu/StyledButton.d.ts +2 -2
  71. package/dist/typings/views/menu/StyledItemIcon.d.ts +1 -1
  72. package/dist/typings/views/menu/StyledItemTypeIcon.d.ts +1 -1
  73. package/package.json +9 -9
  74. package/dist/index.esm.js +0 -1969
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import { Children, isValidElement } from 'react';
8
+
9
+ const toOption = props => {
10
+ return {
11
+ value: props.value,
12
+ label: props.label,
13
+ hidden: props.isHidden,
14
+ disabled: props.isDisabled,
15
+ selected: props.isSelected
16
+ };
17
+ };
18
+ const toOptions = (children, optionTagProps) => Children.toArray(children).reduce((options, option) => {
19
+ const retVal = options;
20
+ if ( isValidElement(option)) {
21
+ if ('value' in option.props) {
22
+ retVal.push(toOption(option.props));
23
+ optionTagProps[option.props.value] = option.props.tagProps;
24
+ } else {
25
+ const props = option.props;
26
+ const groupOptions = toOptions(props.children, optionTagProps);
27
+ retVal.push({
28
+ label: props.legend,
29
+ options: groupOptions
30
+ });
31
+ }
32
+ }
33
+ return retVal;
34
+ }, []);
35
+
36
+ export { toOption, toOptions };
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import React__default, { forwardRef, useMemo } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { mergeRefs } from 'react-merge-refs';
10
+ import SvgPlusStroke from '../../node_modules/@zendeskgarden/svg-icons/src/16/plus-stroke.svg.js';
11
+ import SvgChevronRightStroke from '../../node_modules/@zendeskgarden/svg-icons/src/16/chevron-right-stroke.svg.js';
12
+ import SvgChevronLeftStroke from '../../node_modules/@zendeskgarden/svg-icons/src/16/chevron-left-stroke.svg.js';
13
+ import SvgCheckLgStroke from '../../node_modules/@zendeskgarden/svg-icons/src/16/check-lg-stroke.svg.js';
14
+ import { OPTION_TYPE } from '../../types/index.js';
15
+ import '../../views/combobox/StyledCombobox.js';
16
+ import '../../views/combobox/StyledContainer.js';
17
+ import '../../views/combobox/StyledField.js';
18
+ import '../../views/combobox/StyledFloatingListbox.js';
19
+ import '../../views/combobox/StyledHint.js';
20
+ import '../../views/combobox/StyledInput.js';
21
+ import '../../views/combobox/StyledInputGroup.js';
22
+ import '../../views/combobox/StyledInputIcon.js';
23
+ import '../../views/combobox/StyledLabel.js';
24
+ import '../../views/combobox/StyledListbox.js';
25
+ import '../../views/combobox/StyledListboxSeparator.js';
26
+ import '../../views/combobox/StyledMessage.js';
27
+ import '../../views/combobox/StyledOptGroup.js';
28
+ import '../../views/combobox/StyledOption.js';
29
+ import '../../views/combobox/StyledOptionContent.js';
30
+ import '../../views/combobox/StyledOptionIcon.js';
31
+ import '../../views/combobox/StyledOptionMeta.js';
32
+ import '../../views/combobox/StyledOptionTypeIcon.js';
33
+ import '../../views/combobox/StyledTag.js';
34
+ import '../../views/combobox/StyledTagsButton.js';
35
+ import '../../views/combobox/StyledTrigger.js';
36
+ import '../../views/combobox/StyledValue.js';
37
+ import '../../views/menu/StyledMenu.js';
38
+ import '../../views/menu/StyledFloatingMenu.js';
39
+ import { StyledItem } from '../../views/menu/StyledItem.js';
40
+ import { StyledItemContent } from '../../views/menu/StyledItemContent.js';
41
+ import '../../views/menu/StyledItemGroup.js';
42
+ import { StyledItemIcon } from '../../views/menu/StyledItemIcon.js';
43
+ import '../../views/menu/StyledItemMeta.js';
44
+ import { StyledItemTypeIcon } from '../../views/menu/StyledItemTypeIcon.js';
45
+ import '../../views/menu/StyledButton.js';
46
+ import '../../views/menu/StyledSeparator.js';
47
+ import { ItemMeta } from './ItemMeta.js';
48
+ import useMenuContext from '../../context/useMenuContext.js';
49
+ import useItemGroupContext from '../../context/useItemGroupContext.js';
50
+ import { ItemContext } from '../../context/useItemContext.js';
51
+ import { toItem } from './utils.js';
52
+
53
+ const ItemComponent = forwardRef((_ref, ref) => {
54
+ let {
55
+ children,
56
+ value,
57
+ label = value,
58
+ isSelected,
59
+ icon,
60
+ isDisabled,
61
+ type,
62
+ name,
63
+ onClick,
64
+ onKeyDown,
65
+ onMouseEnter,
66
+ ...props
67
+ } = _ref;
68
+ const {
69
+ type: selectionType
70
+ } = useItemGroupContext();
71
+ const {
72
+ focusedValue,
73
+ getItemProps
74
+ } = useMenuContext();
75
+ const item = {
76
+ ...toItem({
77
+ value,
78
+ label,
79
+ name,
80
+ type,
81
+ isSelected,
82
+ isDisabled
83
+ }),
84
+ type: selectionType
85
+ };
86
+ const {
87
+ ref: _itemRef,
88
+ ...itemProps
89
+ } = getItemProps({
90
+ item,
91
+ onClick,
92
+ onKeyDown,
93
+ onMouseEnter
94
+ });
95
+ const isActive = value === focusedValue;
96
+ const {
97
+ isCompact
98
+ } = useMenuContext();
99
+ const renderActionIcon = iconType => {
100
+ switch (iconType) {
101
+ case 'add':
102
+ return React__default.createElement(SvgPlusStroke, null);
103
+ case 'next':
104
+ return React__default.createElement(SvgChevronRightStroke, null);
105
+ case 'previous':
106
+ return React__default.createElement(SvgChevronLeftStroke, null);
107
+ default:
108
+ return React__default.createElement(SvgCheckLgStroke, null);
109
+ }
110
+ };
111
+ const contextValue = useMemo(() => ({
112
+ isDisabled
113
+ }), [isDisabled]);
114
+ return React__default.createElement(ItemContext.Provider, {
115
+ value: contextValue
116
+ }, React__default.createElement(StyledItem, Object.assign({
117
+ $type: type,
118
+ isCompact: isCompact,
119
+ isActive: isActive
120
+ }, props, itemProps, {
121
+ ref: mergeRefs([_itemRef, ref])
122
+ }), React__default.createElement(StyledItemTypeIcon, {
123
+ $isCompact: isCompact,
124
+ $type: type
125
+ }, renderActionIcon(type)), icon && React__default.createElement(StyledItemIcon, null, icon), React__default.createElement(StyledItemContent, null, children || label)));
126
+ });
127
+ ItemComponent.displayName = 'Item';
128
+ ItemComponent.propTypes = {
129
+ icon: PropTypes.any,
130
+ isDisabled: PropTypes.bool,
131
+ isSelected: PropTypes.bool,
132
+ label: PropTypes.string,
133
+ name: PropTypes.string,
134
+ type: PropTypes.oneOf(OPTION_TYPE),
135
+ value: PropTypes.string.isRequired
136
+ };
137
+ const Item = ItemComponent;
138
+ Item.Meta = ItemMeta;
139
+
140
+ export { Item };
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import React__default, { forwardRef, useMemo } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { useText } from '@zendeskgarden/react-theming';
10
+ import useMenuContext from '../../context/useMenuContext.js';
11
+ import '../../views/combobox/StyledCombobox.js';
12
+ import '../../views/combobox/StyledContainer.js';
13
+ import '../../views/combobox/StyledField.js';
14
+ import '../../views/combobox/StyledFloatingListbox.js';
15
+ import '../../views/combobox/StyledHint.js';
16
+ import '../../views/combobox/StyledInput.js';
17
+ import '../../views/combobox/StyledInputGroup.js';
18
+ import '../../views/combobox/StyledInputIcon.js';
19
+ import '../../views/combobox/StyledLabel.js';
20
+ import '../../views/combobox/StyledListbox.js';
21
+ import '../../views/combobox/StyledListboxSeparator.js';
22
+ import '../../views/combobox/StyledMessage.js';
23
+ import '../../views/combobox/StyledOptGroup.js';
24
+ import '../../views/combobox/StyledOption.js';
25
+ import '../../views/combobox/StyledOptionContent.js';
26
+ import '../../views/combobox/StyledOptionIcon.js';
27
+ import '../../views/combobox/StyledOptionMeta.js';
28
+ import '../../views/combobox/StyledOptionTypeIcon.js';
29
+ import '../../views/combobox/StyledTag.js';
30
+ import '../../views/combobox/StyledTagsButton.js';
31
+ import '../../views/combobox/StyledTrigger.js';
32
+ import '../../views/combobox/StyledValue.js';
33
+ import '../../views/menu/StyledMenu.js';
34
+ import '../../views/menu/StyledFloatingMenu.js';
35
+ import { StyledItem } from '../../views/menu/StyledItem.js';
36
+ import { StyledItemContent } from '../../views/menu/StyledItemContent.js';
37
+ import { StyledItemGroup } from '../../views/menu/StyledItemGroup.js';
38
+ import '../../views/menu/StyledItemIcon.js';
39
+ import '../../views/menu/StyledItemMeta.js';
40
+ import { StyledItemTypeIcon } from '../../views/menu/StyledItemTypeIcon.js';
41
+ import '../../views/menu/StyledButton.js';
42
+ import { StyledSeparator } from '../../views/menu/StyledSeparator.js';
43
+ import { ItemGroupContext } from '../../context/useItemGroupContext.js';
44
+
45
+ const ItemGroup = forwardRef((_ref, ref) => {
46
+ let {
47
+ children,
48
+ content,
49
+ legend,
50
+ icon,
51
+ 'aria-label': ariaLabel,
52
+ type,
53
+ ...props
54
+ } = _ref;
55
+ const {
56
+ isCompact,
57
+ getItemGroupProps
58
+ } = useMenuContext();
59
+ const groupAriaLabel = useText(ItemGroup, {
60
+ 'aria-label': ariaLabel
61
+ }, 'aria-label', 'Group', !legend );
62
+ const groupProps = getItemGroupProps({
63
+ 'aria-label': groupAriaLabel || legend
64
+ });
65
+ const contextValue = useMemo(() => ({
66
+ type
67
+ }), [type]);
68
+ return React__default.createElement(ItemGroupContext.Provider, {
69
+ value: contextValue
70
+ }, React__default.createElement(StyledItem, Object.assign({
71
+ isCompact: isCompact,
72
+ $type: "group"
73
+ }, props, {
74
+ ref: ref
75
+ }), React__default.createElement(StyledItemContent, null, (content || legend) && React__default.createElement(StyledItem, {
76
+ as: "div",
77
+ isCompact: isCompact,
78
+ $type: "header"
79
+ }, icon && React__default.createElement(StyledItemTypeIcon, {
80
+ $isCompact: isCompact,
81
+ $type: "header"
82
+ }, icon), content || legend), React__default.createElement(StyledItemGroup, Object.assign({
83
+ isCompact: isCompact
84
+ }, groupProps), React__default.createElement(StyledSeparator, {
85
+ role: "none"
86
+ }), children))));
87
+ });
88
+ ItemGroup.displayName = 'ItemGroup';
89
+ ItemGroup.propTypes = {
90
+ content: PropTypes.any,
91
+ icon: PropTypes.any,
92
+ legend: PropTypes.string,
93
+ type: PropTypes.oneOf(['checkbox', 'radio', undefined])
94
+ };
95
+
96
+ export { ItemGroup };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import React__default, { forwardRef } from 'react';
8
+ import useItemContext from '../../context/useItemContext.js';
9
+ import '../../views/combobox/StyledCombobox.js';
10
+ import '../../views/combobox/StyledContainer.js';
11
+ import '../../views/combobox/StyledField.js';
12
+ import '../../views/combobox/StyledFloatingListbox.js';
13
+ import '../../views/combobox/StyledHint.js';
14
+ import '../../views/combobox/StyledInput.js';
15
+ import '../../views/combobox/StyledInputGroup.js';
16
+ import '../../views/combobox/StyledInputIcon.js';
17
+ import '../../views/combobox/StyledLabel.js';
18
+ import '../../views/combobox/StyledListbox.js';
19
+ import '../../views/combobox/StyledListboxSeparator.js';
20
+ import '../../views/combobox/StyledMessage.js';
21
+ import '../../views/combobox/StyledOptGroup.js';
22
+ import '../../views/combobox/StyledOption.js';
23
+ import '../../views/combobox/StyledOptionContent.js';
24
+ import '../../views/combobox/StyledOptionIcon.js';
25
+ import '../../views/combobox/StyledOptionMeta.js';
26
+ import '../../views/combobox/StyledOptionTypeIcon.js';
27
+ import '../../views/combobox/StyledTag.js';
28
+ import '../../views/combobox/StyledTagsButton.js';
29
+ import '../../views/combobox/StyledTrigger.js';
30
+ import '../../views/combobox/StyledValue.js';
31
+ import '../../views/menu/StyledMenu.js';
32
+ import '../../views/menu/StyledFloatingMenu.js';
33
+ import '../../views/menu/StyledItem.js';
34
+ import '../../views/menu/StyledItemContent.js';
35
+ import '../../views/menu/StyledItemGroup.js';
36
+ import '../../views/menu/StyledItemIcon.js';
37
+ import { StyledItemMeta } from '../../views/menu/StyledItemMeta.js';
38
+ import '../../views/menu/StyledItemTypeIcon.js';
39
+ import '../../views/menu/StyledButton.js';
40
+ import '../../views/menu/StyledSeparator.js';
41
+
42
+ const ItemMetaComponent = forwardRef((props, ref) => {
43
+ const {
44
+ isDisabled
45
+ } = useItemContext();
46
+ return React__default.createElement(StyledItemMeta, Object.assign({
47
+ isDisabled: isDisabled
48
+ }, props, {
49
+ ref: ref
50
+ }));
51
+ });
52
+ ItemMetaComponent.displayName = 'Item.Meta';
53
+ const ItemMeta = ItemMetaComponent;
54
+
55
+ export { ItemMeta };
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import React__default, { forwardRef, useRef, useContext, useMemo } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { mergeRefs } from 'react-merge-refs';
10
+ import { ThemeContext } from 'styled-components';
11
+ import { useMenu } from '@zendeskgarden/container-menu';
12
+ import { DEFAULT_THEME, useWindow } from '@zendeskgarden/react-theming';
13
+ import { PLACEMENT } from '../../types/index.js';
14
+ import { MenuContext } from '../../context/useMenuContext.js';
15
+ import { toItems } from './utils.js';
16
+ import { MenuList } from './MenuList.js';
17
+ import '../../views/combobox/StyledCombobox.js';
18
+ import '../../views/combobox/StyledContainer.js';
19
+ import '../../views/combobox/StyledField.js';
20
+ import '../../views/combobox/StyledFloatingListbox.js';
21
+ import '../../views/combobox/StyledHint.js';
22
+ import '../../views/combobox/StyledInput.js';
23
+ import '../../views/combobox/StyledInputGroup.js';
24
+ import '../../views/combobox/StyledInputIcon.js';
25
+ import '../../views/combobox/StyledLabel.js';
26
+ import '../../views/combobox/StyledListbox.js';
27
+ import '../../views/combobox/StyledListboxSeparator.js';
28
+ import '../../views/combobox/StyledMessage.js';
29
+ import '../../views/combobox/StyledOptGroup.js';
30
+ import '../../views/combobox/StyledOption.js';
31
+ import '../../views/combobox/StyledOptionContent.js';
32
+ import '../../views/combobox/StyledOptionIcon.js';
33
+ import '../../views/combobox/StyledOptionMeta.js';
34
+ import '../../views/combobox/StyledOptionTypeIcon.js';
35
+ import '../../views/combobox/StyledTag.js';
36
+ import '../../views/combobox/StyledTagsButton.js';
37
+ import '../../views/combobox/StyledTrigger.js';
38
+ import '../../views/combobox/StyledValue.js';
39
+ import '../../views/menu/StyledMenu.js';
40
+ import '../../views/menu/StyledFloatingMenu.js';
41
+ import '../../views/menu/StyledItem.js';
42
+ import '../../views/menu/StyledItemContent.js';
43
+ import '../../views/menu/StyledItemGroup.js';
44
+ import '../../views/menu/StyledItemIcon.js';
45
+ import '../../views/menu/StyledItemMeta.js';
46
+ import '../../views/menu/StyledItemTypeIcon.js';
47
+ import { StyledButton } from '../../views/menu/StyledButton.js';
48
+ import '../../views/menu/StyledSeparator.js';
49
+ import SvgChevronDownStroke from '../../node_modules/@zendeskgarden/svg-icons/src/16/chevron-down-stroke.svg.js';
50
+
51
+ const Menu = forwardRef((_ref, ref) => {
52
+ let {
53
+ button,
54
+ buttonProps: _buttonProps = {},
55
+ children,
56
+ isCompact,
57
+ focusedValue: _focusedValue,
58
+ defaultFocusedValue,
59
+ defaultExpanded,
60
+ isExpanded: _isExpanded,
61
+ selectedItems,
62
+ onChange,
63
+ onMouseLeave,
64
+ ...props
65
+ } = _ref;
66
+ const triggerRef = useRef(null);
67
+ const menuRef = useRef(null);
68
+ const items = toItems(children);
69
+ const theme = useContext(ThemeContext) || DEFAULT_THEME;
70
+ const environment = useWindow(theme);
71
+ const {
72
+ isExpanded,
73
+ focusedValue,
74
+ getTriggerProps,
75
+ getMenuProps,
76
+ getItemProps,
77
+ getItemGroupProps,
78
+ getSeparatorProps
79
+ } = useMenu({
80
+ rtl: theme.rtl,
81
+ environment,
82
+ defaultFocusedValue,
83
+ focusedValue: _focusedValue,
84
+ defaultExpanded,
85
+ isExpanded: _isExpanded,
86
+ selectedItems,
87
+ items,
88
+ menuRef,
89
+ triggerRef,
90
+ onChange
91
+ });
92
+ const {
93
+ onClick,
94
+ onKeyDown,
95
+ disabled,
96
+ ...buttonProps
97
+ } = _buttonProps;
98
+ const triggerProps = {
99
+ ...(isCompact && {
100
+ size: 'small'
101
+ }),
102
+ ...buttonProps,
103
+ ...getTriggerProps({
104
+ type: 'button',
105
+ onClick,
106
+ onKeyDown,
107
+ disabled
108
+ }),
109
+ ref: mergeRefs([triggerRef, ref])
110
+ };
111
+ const trigger = typeof button === 'function' ? button(triggerProps) : React__default.createElement(StyledButton, triggerProps, button, React__default.createElement(StyledButton.EndIcon, {
112
+ isRotated: isExpanded
113
+ }, React__default.createElement(SvgChevronDownStroke, null)));
114
+ const contextValue = useMemo(() => ({
115
+ isCompact,
116
+ focusedValue,
117
+ getItemProps,
118
+ getItemGroupProps,
119
+ getSeparatorProps
120
+ }), [isCompact, focusedValue, getItemProps, getItemGroupProps, getSeparatorProps]);
121
+ return React__default.createElement(MenuContext.Provider, {
122
+ value: contextValue
123
+ }, trigger, React__default.createElement(MenuList, Object.assign({}, props, getMenuProps({
124
+ onMouseLeave
125
+ }), {
126
+ ref: mergeRefs([menuRef, ref]),
127
+ isCompact: isCompact,
128
+ isExpanded: isExpanded,
129
+ triggerRef: triggerRef
130
+ }), children));
131
+ });
132
+ Menu.displayName = 'Menu';
133
+ Menu.propTypes = {
134
+ appendToNode: PropTypes.any,
135
+ button: PropTypes.any.isRequired,
136
+ buttonProps: PropTypes.object,
137
+ defaultExpanded: PropTypes.bool,
138
+ defaultFocusedValue: PropTypes.string,
139
+ fallbackPlacements: PropTypes.arrayOf(PropTypes.any),
140
+ focusedValue: PropTypes.string,
141
+ hasArrow: PropTypes.bool,
142
+ isCompact: PropTypes.bool,
143
+ isExpanded: PropTypes.bool,
144
+ maxHeight: PropTypes.string,
145
+ minHeight: PropTypes.string,
146
+ onChange: PropTypes.func,
147
+ placement: PropTypes.oneOf(PLACEMENT),
148
+ selectedItems: PropTypes.arrayOf(PropTypes.any),
149
+ zIndex: PropTypes.number
150
+ };
151
+ Menu.defaultProps = {
152
+ maxHeight: '400px',
153
+ placement: 'bottom-start',
154
+ zIndex: 1000
155
+ };
156
+
157
+ export { Menu };
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import React__default, { forwardRef, useRef, useState, useContext, useEffect } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { ThemeContext } from 'styled-components';
10
+ import { DEFAULT_THEME, getFloatingPlacements, getMenuPosition, getArrowPosition } from '@zendeskgarden/react-theming';
11
+ import { useFloating, platform, offset, autoPlacement, flip, size, autoUpdate } from '@floating-ui/react-dom';
12
+ import { PLACEMENT } from '../../types/index.js';
13
+ import '../../views/combobox/StyledCombobox.js';
14
+ import '../../views/combobox/StyledContainer.js';
15
+ import '../../views/combobox/StyledField.js';
16
+ import '../../views/combobox/StyledFloatingListbox.js';
17
+ import '../../views/combobox/StyledHint.js';
18
+ import '../../views/combobox/StyledInput.js';
19
+ import '../../views/combobox/StyledInputGroup.js';
20
+ import '../../views/combobox/StyledInputIcon.js';
21
+ import '../../views/combobox/StyledLabel.js';
22
+ import '../../views/combobox/StyledListbox.js';
23
+ import '../../views/combobox/StyledListboxSeparator.js';
24
+ import '../../views/combobox/StyledMessage.js';
25
+ import '../../views/combobox/StyledOptGroup.js';
26
+ import '../../views/combobox/StyledOption.js';
27
+ import '../../views/combobox/StyledOptionContent.js';
28
+ import '../../views/combobox/StyledOptionIcon.js';
29
+ import '../../views/combobox/StyledOptionMeta.js';
30
+ import '../../views/combobox/StyledOptionTypeIcon.js';
31
+ import '../../views/combobox/StyledTag.js';
32
+ import '../../views/combobox/StyledTagsButton.js';
33
+ import '../../views/combobox/StyledTrigger.js';
34
+ import '../../views/combobox/StyledValue.js';
35
+ import { StyledMenu } from '../../views/menu/StyledMenu.js';
36
+ import { StyledFloatingMenu } from '../../views/menu/StyledFloatingMenu.js';
37
+ import '../../views/menu/StyledItem.js';
38
+ import '../../views/menu/StyledItemContent.js';
39
+ import '../../views/menu/StyledItemGroup.js';
40
+ import '../../views/menu/StyledItemIcon.js';
41
+ import '../../views/menu/StyledItemMeta.js';
42
+ import '../../views/menu/StyledItemTypeIcon.js';
43
+ import '../../views/menu/StyledButton.js';
44
+ import '../../views/menu/StyledSeparator.js';
45
+ import { createPortal } from 'react-dom';
46
+
47
+ const PLACEMENT_DEFAULT = 'bottom-start';
48
+ const MenuList = forwardRef((_ref, ref) => {
49
+ let {
50
+ appendToNode,
51
+ hasArrow,
52
+ isCompact,
53
+ isExpanded,
54
+ fallbackPlacements: _fallbackPlacements,
55
+ maxHeight,
56
+ minHeight,
57
+ placement: _placement,
58
+ triggerRef,
59
+ zIndex,
60
+ children,
61
+ ...props
62
+ } = _ref;
63
+ const floatingRef = useRef(null);
64
+ const [isVisible, setIsVisible] = useState(isExpanded);
65
+ const [height, setHeight] = useState();
66
+ const theme = useContext(ThemeContext) || DEFAULT_THEME;
67
+ const [floatingPlacement, fallbackPlacements] = getFloatingPlacements(theme, _placement === 'auto' ? PLACEMENT_DEFAULT : _placement, _fallbackPlacements);
68
+ const {
69
+ refs,
70
+ placement,
71
+ update,
72
+ floatingStyles: {
73
+ transform
74
+ }
75
+ } = useFloating({
76
+ platform: {
77
+ ...platform,
78
+ isRTL: () => theme.rtl
79
+ },
80
+ elements: {
81
+ reference: triggerRef?.current,
82
+ floating: floatingRef?.current
83
+ },
84
+ placement: floatingPlacement,
85
+ middleware: [offset(theme.space.base * (hasArrow ? 2 : 1)), _placement === 'auto' ? autoPlacement() : flip({
86
+ fallbackPlacements
87
+ }), size({
88
+ apply: _ref2 => {
89
+ let {
90
+ rects,
91
+ availableHeight
92
+ } = _ref2;
93
+ if (!(minHeight === null || minHeight === 'fit-content')) {
94
+ if (rects.floating.height > availableHeight) {
95
+ setHeight(availableHeight);
96
+ }
97
+ }
98
+ }
99
+ })]
100
+ });
101
+ useEffect(() => {
102
+ let cleanup;
103
+ if (isExpanded && refs.reference.current && refs.floating.current) {
104
+ cleanup = autoUpdate(refs.reference.current, refs.floating.current, update, {
105
+ elementResize: typeof ResizeObserver === 'function'
106
+ });
107
+ }
108
+ return () => cleanup && cleanup();
109
+ }, [isExpanded, refs.reference, refs.floating, update]);
110
+ useEffect(() => {
111
+ let timeout;
112
+ if (isExpanded) {
113
+ setIsVisible(true);
114
+ } else {
115
+ timeout = setTimeout(() => {
116
+ setIsVisible(false);
117
+ setHeight(undefined);
118
+ }, 200 );
119
+ }
120
+ return () => clearTimeout(timeout);
121
+ }, [isExpanded]);
122
+ useEffect(() => {
123
+ if (height) {
124
+ setHeight(undefined);
125
+ update();
126
+ }
127
+ }, [
128
+ children, update]);
129
+ const Node = React__default.createElement(StyledFloatingMenu, {
130
+ "data-garden-animate": isVisible,
131
+ isHidden: !isExpanded,
132
+ position: getMenuPosition(placement),
133
+ zIndex: zIndex,
134
+ style: {
135
+ transform
136
+ },
137
+ ref: floatingRef
138
+ }, React__default.createElement(StyledMenu, Object.assign({
139
+ "data-garden-animate-arrow": isVisible,
140
+ arrowPosition: hasArrow ? getArrowPosition(theme, placement) : undefined,
141
+ isCompact: isCompact,
142
+ minHeight: minHeight,
143
+ maxHeight: maxHeight,
144
+ style: {
145
+ height
146
+ }
147
+ }, props, {
148
+ ref: ref
149
+ }), isVisible && children));
150
+ return appendToNode ? createPortal(Node, appendToNode) : Node;
151
+ });
152
+ MenuList.displayName = 'MenuList';
153
+ MenuList.propTypes = {
154
+ appendToNode: PropTypes.any,
155
+ hasArrow: PropTypes.bool,
156
+ isCompact: PropTypes.bool,
157
+ isExpanded: PropTypes.bool,
158
+ maxHeight: PropTypes.string,
159
+ minHeight: PropTypes.string,
160
+ placement: PropTypes.oneOf(PLACEMENT),
161
+ triggerRef: PropTypes.any,
162
+ zIndex: PropTypes.number
163
+ };
164
+ MenuList.defaultProps = {
165
+ maxHeight: '400px',
166
+ placement: PLACEMENT_DEFAULT,
167
+ zIndex: 1000
168
+ };
169
+
170
+ export { MenuList };