@zendeskgarden/react-dropdowns 9.0.0-next.7 → 9.0.0-next.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/context/useComboboxContext.js +18 -0
- package/dist/esm/context/useFieldContext.js +18 -0
- package/dist/esm/context/useItemContext.js +18 -0
- package/dist/esm/context/useItemGroupContext.js +14 -0
- package/dist/esm/context/useMenuContext.js +18 -0
- package/dist/esm/context/useOptionContext.js +18 -0
- package/dist/esm/elements/combobox/Combobox.js +330 -0
- package/dist/esm/elements/combobox/Field.js +75 -0
- package/dist/esm/elements/combobox/Hint.js +57 -0
- package/dist/esm/elements/combobox/Label.js +68 -0
- package/dist/esm/elements/combobox/Listbox.js +155 -0
- package/dist/esm/elements/combobox/Message.js +63 -0
- package/dist/esm/elements/combobox/OptGroup.js +93 -0
- package/dist/esm/elements/combobox/Option.js +133 -0
- package/dist/esm/elements/combobox/OptionMeta.js +55 -0
- package/dist/esm/elements/combobox/Tag.js +98 -0
- package/dist/esm/elements/combobox/TagAvatar.js +13 -0
- package/dist/esm/elements/combobox/TagGroup.js +35 -0
- package/dist/esm/elements/combobox/utils.js +36 -0
- package/dist/esm/elements/menu/Item.js +140 -0
- package/dist/esm/elements/menu/ItemGroup.js +96 -0
- package/dist/esm/elements/menu/ItemMeta.js +55 -0
- package/dist/esm/elements/menu/Menu.js +157 -0
- package/dist/esm/elements/menu/MenuList.js +170 -0
- package/dist/esm/elements/menu/Separator.js +58 -0
- package/dist/esm/elements/menu/utils.js +55 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/check-lg-stroke.svg.js +28 -0
- package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-down-stroke.svg.js +25 -0
- package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-left-stroke.svg.js +25 -0
- package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-right-stroke.svg.js +25 -0
- package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/plus-stroke.svg.js +26 -0
- package/dist/esm/types/index.js +12 -0
- package/dist/esm/views/combobox/StyledCombobox.js +30 -0
- package/dist/esm/views/combobox/StyledContainer.js +22 -0
- package/dist/esm/views/combobox/StyledField.js +22 -0
- package/dist/esm/views/combobox/StyledFloatingListbox.js +27 -0
- package/dist/esm/views/combobox/StyledHint.js +23 -0
- package/dist/esm/views/combobox/StyledInput.js +41 -0
- package/dist/esm/views/combobox/StyledInputGroup.js +26 -0
- package/dist/esm/views/combobox/StyledInputIcon.js +56 -0
- package/dist/esm/views/combobox/StyledLabel.js +23 -0
- package/dist/esm/views/combobox/StyledListbox.js +31 -0
- package/dist/esm/views/combobox/StyledListboxSeparator.js +31 -0
- package/dist/esm/views/combobox/StyledMessage.js +23 -0
- package/dist/esm/views/combobox/StyledOptGroup.js +22 -0
- package/dist/esm/views/combobox/StyledOption.js +48 -0
- package/dist/esm/views/combobox/StyledOptionContent.js +22 -0
- package/dist/esm/views/combobox/StyledOptionIcon.js +37 -0
- package/dist/esm/views/combobox/StyledOptionMeta.js +31 -0
- package/dist/esm/views/combobox/StyledOptionTypeIcon.js +58 -0
- package/dist/esm/views/combobox/StyledTag.js +24 -0
- package/dist/esm/views/combobox/StyledTagsButton.js +28 -0
- package/dist/esm/views/combobox/StyledTrigger.js +94 -0
- package/dist/esm/views/combobox/StyledValue.js +32 -0
- package/dist/esm/views/menu/StyledButton.js +23 -0
- package/dist/esm/views/menu/StyledFloatingMenu.js +23 -0
- package/dist/esm/views/menu/StyledItem.js +23 -0
- package/dist/esm/views/menu/StyledItemContent.js +23 -0
- package/dist/esm/views/menu/StyledItemGroup.js +23 -0
- package/dist/esm/views/menu/StyledItemIcon.js +23 -0
- package/dist/esm/views/menu/StyledItemMeta.js +23 -0
- package/dist/esm/views/menu/StyledItemTypeIcon.js +24 -0
- package/dist/esm/views/menu/StyledMenu.js +27 -0
- package/dist/esm/views/menu/StyledSeparator.js +23 -0
- package/dist/index.cjs.js +61 -75
- package/package.json +9 -9
- 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 };
|