@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,155 @@
|
|
|
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 { createPortal } from 'react-dom';
|
|
9
|
+
import PropTypes from 'prop-types';
|
|
10
|
+
import { useFloating, offset, flip, size, autoUpdate } from '@floating-ui/react-dom';
|
|
11
|
+
import '../../views/combobox/StyledCombobox.js';
|
|
12
|
+
import '../../views/combobox/StyledContainer.js';
|
|
13
|
+
import '../../views/combobox/StyledField.js';
|
|
14
|
+
import { StyledFloatingListbox } from '../../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 { StyledListbox } from '../../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 '../../views/menu/StyledItem.js';
|
|
36
|
+
import '../../views/menu/StyledItemContent.js';
|
|
37
|
+
import '../../views/menu/StyledItemGroup.js';
|
|
38
|
+
import '../../views/menu/StyledItemIcon.js';
|
|
39
|
+
import '../../views/menu/StyledItemMeta.js';
|
|
40
|
+
import '../../views/menu/StyledItemTypeIcon.js';
|
|
41
|
+
import '../../views/menu/StyledButton.js';
|
|
42
|
+
import '../../views/menu/StyledSeparator.js';
|
|
43
|
+
import { ThemeContext } from 'styled-components';
|
|
44
|
+
import { DEFAULT_THEME } from '@zendeskgarden/react-theming';
|
|
45
|
+
import { composeEventHandlers } from '@zendeskgarden/container-utilities';
|
|
46
|
+
|
|
47
|
+
const Listbox = forwardRef((_ref, ref) => {
|
|
48
|
+
let {
|
|
49
|
+
appendToNode,
|
|
50
|
+
children,
|
|
51
|
+
isCompact,
|
|
52
|
+
isExpanded,
|
|
53
|
+
maxHeight,
|
|
54
|
+
minHeight,
|
|
55
|
+
onMouseDown,
|
|
56
|
+
triggerRef,
|
|
57
|
+
zIndex,
|
|
58
|
+
...props
|
|
59
|
+
} = _ref;
|
|
60
|
+
const floatingRef = useRef(null);
|
|
61
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
62
|
+
const [height, setHeight] = useState();
|
|
63
|
+
const [width, setWidth] = useState();
|
|
64
|
+
const theme = useContext(ThemeContext) || DEFAULT_THEME;
|
|
65
|
+
const {
|
|
66
|
+
refs,
|
|
67
|
+
placement,
|
|
68
|
+
update,
|
|
69
|
+
floatingStyles: {
|
|
70
|
+
transform
|
|
71
|
+
}
|
|
72
|
+
} = useFloating({
|
|
73
|
+
elements: {
|
|
74
|
+
reference: triggerRef?.current,
|
|
75
|
+
floating: floatingRef?.current
|
|
76
|
+
},
|
|
77
|
+
placement: 'bottom-start',
|
|
78
|
+
middleware: [offset(theme.space.base), flip(), size({
|
|
79
|
+
apply: _ref2 => {
|
|
80
|
+
let {
|
|
81
|
+
rects,
|
|
82
|
+
availableHeight
|
|
83
|
+
} = _ref2;
|
|
84
|
+
if (rects.reference.width > 0) {
|
|
85
|
+
setWidth(rects.reference.width);
|
|
86
|
+
if (!(minHeight === null || minHeight === 'fit-content') && rects.floating.height > availableHeight) {
|
|
87
|
+
setHeight(availableHeight);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
})]
|
|
92
|
+
});
|
|
93
|
+
const handleMouseDown = event => event.preventDefault();
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
let cleanup;
|
|
96
|
+
if (isExpanded && refs.reference.current && refs.floating.current) {
|
|
97
|
+
cleanup = autoUpdate(refs.reference.current, refs.floating.current, update, {
|
|
98
|
+
elementResize: typeof ResizeObserver === 'function'
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return () => cleanup && cleanup();
|
|
102
|
+
}, [isExpanded, refs.reference, refs.floating, update]);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
let timeout;
|
|
105
|
+
if (isExpanded) {
|
|
106
|
+
setIsVisible(true);
|
|
107
|
+
} else {
|
|
108
|
+
timeout = setTimeout(() => {
|
|
109
|
+
setIsVisible(false);
|
|
110
|
+
setHeight(undefined);
|
|
111
|
+
}, 200 );
|
|
112
|
+
}
|
|
113
|
+
return () => clearTimeout(timeout);
|
|
114
|
+
}, [isExpanded]);
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
if (height) {
|
|
117
|
+
setHeight(undefined);
|
|
118
|
+
update();
|
|
119
|
+
}
|
|
120
|
+
}, [
|
|
121
|
+
children, update]);
|
|
122
|
+
const Node = React__default.createElement(StyledFloatingListbox, {
|
|
123
|
+
"data-garden-animate": isVisible ? 'true' : 'false',
|
|
124
|
+
isHidden: !isExpanded,
|
|
125
|
+
position: placement === 'bottom-start' ? 'bottom' : 'top',
|
|
126
|
+
style: {
|
|
127
|
+
transform,
|
|
128
|
+
width
|
|
129
|
+
},
|
|
130
|
+
zIndex: zIndex,
|
|
131
|
+
ref: floatingRef
|
|
132
|
+
}, React__default.createElement(StyledListbox, Object.assign({
|
|
133
|
+
isCompact: isCompact,
|
|
134
|
+
maxHeight: maxHeight,
|
|
135
|
+
minHeight: minHeight,
|
|
136
|
+
onMouseDown: composeEventHandlers(onMouseDown, handleMouseDown),
|
|
137
|
+
style: {
|
|
138
|
+
height
|
|
139
|
+
}
|
|
140
|
+
}, props, {
|
|
141
|
+
ref: ref
|
|
142
|
+
}), isVisible && children));
|
|
143
|
+
return appendToNode ? createPortal(Node, appendToNode) : Node;
|
|
144
|
+
});
|
|
145
|
+
Listbox.displayName = 'Listbox';
|
|
146
|
+
Listbox.propTypes = {
|
|
147
|
+
appendToNode: PropTypes.any,
|
|
148
|
+
isCompact: PropTypes.bool,
|
|
149
|
+
isExpanded: PropTypes.bool,
|
|
150
|
+
maxHeight: PropTypes.string,
|
|
151
|
+
triggerRef: PropTypes.any.isRequired,
|
|
152
|
+
zIndex: PropTypes.number
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export { Listbox };
|
|
@@ -0,0 +1,63 @@
|
|
|
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, useEffect } from 'react';
|
|
8
|
+
import PropTypes from 'prop-types';
|
|
9
|
+
import { VALIDATION } from '@zendeskgarden/react-forms';
|
|
10
|
+
import useFieldContext from '../../context/useFieldContext.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 { StyledMessage } from '../../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 '../../views/menu/StyledItem.js';
|
|
36
|
+
import '../../views/menu/StyledItemContent.js';
|
|
37
|
+
import '../../views/menu/StyledItemGroup.js';
|
|
38
|
+
import '../../views/menu/StyledItemIcon.js';
|
|
39
|
+
import '../../views/menu/StyledItemMeta.js';
|
|
40
|
+
import '../../views/menu/StyledItemTypeIcon.js';
|
|
41
|
+
import '../../views/menu/StyledButton.js';
|
|
42
|
+
import '../../views/menu/StyledSeparator.js';
|
|
43
|
+
|
|
44
|
+
const Message = forwardRef((props, ref) => {
|
|
45
|
+
const {
|
|
46
|
+
messageProps,
|
|
47
|
+
setHasMessage
|
|
48
|
+
} = useFieldContext();
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
setHasMessage(true);
|
|
51
|
+
return () => setHasMessage(false);
|
|
52
|
+
}, [setHasMessage]);
|
|
53
|
+
return React__default.createElement(StyledMessage, Object.assign({}, messageProps, props, {
|
|
54
|
+
ref: ref
|
|
55
|
+
}));
|
|
56
|
+
});
|
|
57
|
+
Message.displayName = 'Message';
|
|
58
|
+
Message.propTypes = {
|
|
59
|
+
validation: PropTypes.oneOf(VALIDATION),
|
|
60
|
+
validationLabel: PropTypes.string
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export { Message };
|
|
@@ -0,0 +1,93 @@
|
|
|
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 PropTypes from 'prop-types';
|
|
9
|
+
import { composeEventHandlers } from '@zendeskgarden/container-utilities';
|
|
10
|
+
import { useText } from '@zendeskgarden/react-theming';
|
|
11
|
+
import useComboboxContext from '../../context/useComboboxContext.js';
|
|
12
|
+
import '../../views/combobox/StyledCombobox.js';
|
|
13
|
+
import '../../views/combobox/StyledContainer.js';
|
|
14
|
+
import '../../views/combobox/StyledField.js';
|
|
15
|
+
import '../../views/combobox/StyledFloatingListbox.js';
|
|
16
|
+
import '../../views/combobox/StyledHint.js';
|
|
17
|
+
import '../../views/combobox/StyledInput.js';
|
|
18
|
+
import '../../views/combobox/StyledInputGroup.js';
|
|
19
|
+
import '../../views/combobox/StyledInputIcon.js';
|
|
20
|
+
import '../../views/combobox/StyledLabel.js';
|
|
21
|
+
import '../../views/combobox/StyledListbox.js';
|
|
22
|
+
import { StyledListboxSeparator } from '../../views/combobox/StyledListboxSeparator.js';
|
|
23
|
+
import '../../views/combobox/StyledMessage.js';
|
|
24
|
+
import { StyledOptGroup } from '../../views/combobox/StyledOptGroup.js';
|
|
25
|
+
import { StyledOption } from '../../views/combobox/StyledOption.js';
|
|
26
|
+
import { StyledOptionContent } from '../../views/combobox/StyledOptionContent.js';
|
|
27
|
+
import '../../views/combobox/StyledOptionIcon.js';
|
|
28
|
+
import '../../views/combobox/StyledOptionMeta.js';
|
|
29
|
+
import { StyledOptionTypeIcon } from '../../views/combobox/StyledOptionTypeIcon.js';
|
|
30
|
+
import '../../views/combobox/StyledTag.js';
|
|
31
|
+
import '../../views/combobox/StyledTagsButton.js';
|
|
32
|
+
import '../../views/combobox/StyledTrigger.js';
|
|
33
|
+
import '../../views/combobox/StyledValue.js';
|
|
34
|
+
import '../../views/menu/StyledMenu.js';
|
|
35
|
+
import '../../views/menu/StyledFloatingMenu.js';
|
|
36
|
+
import '../../views/menu/StyledItem.js';
|
|
37
|
+
import '../../views/menu/StyledItemContent.js';
|
|
38
|
+
import '../../views/menu/StyledItemGroup.js';
|
|
39
|
+
import '../../views/menu/StyledItemIcon.js';
|
|
40
|
+
import '../../views/menu/StyledItemMeta.js';
|
|
41
|
+
import '../../views/menu/StyledItemTypeIcon.js';
|
|
42
|
+
import '../../views/menu/StyledButton.js';
|
|
43
|
+
import '../../views/menu/StyledSeparator.js';
|
|
44
|
+
|
|
45
|
+
const OptGroup = forwardRef((_ref, ref) => {
|
|
46
|
+
let {
|
|
47
|
+
children,
|
|
48
|
+
content,
|
|
49
|
+
icon,
|
|
50
|
+
legend,
|
|
51
|
+
'aria-label': ariaLabel,
|
|
52
|
+
onMouseDown,
|
|
53
|
+
...props
|
|
54
|
+
} = _ref;
|
|
55
|
+
const {
|
|
56
|
+
getOptGroupProps,
|
|
57
|
+
isCompact
|
|
58
|
+
} = useComboboxContext();
|
|
59
|
+
const handleMouseDown = event => event.preventDefault();
|
|
60
|
+
const groupAriaLabel = useText(OptGroup, {
|
|
61
|
+
'aria-label': ariaLabel
|
|
62
|
+
}, 'aria-label', 'Group', !legend );
|
|
63
|
+
const optGroupProps = getOptGroupProps({
|
|
64
|
+
'aria-label': groupAriaLabel || legend
|
|
65
|
+
});
|
|
66
|
+
return React__default.createElement(StyledOption, Object.assign({
|
|
67
|
+
isCompact: isCompact,
|
|
68
|
+
$type: "group",
|
|
69
|
+
onMouseDown: composeEventHandlers(onMouseDown, handleMouseDown),
|
|
70
|
+
role: "none"
|
|
71
|
+
}, props, {
|
|
72
|
+
ref: ref
|
|
73
|
+
}), React__default.createElement(StyledOptionContent, null, (content || legend) && React__default.createElement(StyledOption, {
|
|
74
|
+
as: "div",
|
|
75
|
+
isCompact: isCompact,
|
|
76
|
+
$type: "header"
|
|
77
|
+
}, icon && React__default.createElement(StyledOptionTypeIcon, {
|
|
78
|
+
isCompact: isCompact,
|
|
79
|
+
type: "header"
|
|
80
|
+
}, icon), content || legend), React__default.createElement(StyledOptGroup, Object.assign({
|
|
81
|
+
isCompact: isCompact
|
|
82
|
+
}, optGroupProps), React__default.createElement(StyledListboxSeparator, {
|
|
83
|
+
role: "none"
|
|
84
|
+
}), children)));
|
|
85
|
+
});
|
|
86
|
+
OptGroup.displayName = 'OptGroup';
|
|
87
|
+
OptGroup.propTypes = {
|
|
88
|
+
content: PropTypes.any,
|
|
89
|
+
icon: PropTypes.any,
|
|
90
|
+
legend: PropTypes.string
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { OptGroup };
|
|
@@ -0,0 +1,133 @@
|
|
|
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, useRef, useEffect } 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 useComboboxContext from '../../context/useComboboxContext.js';
|
|
16
|
+
import { OptionContext } from '../../context/useOptionContext.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 { StyledOption } from '../../views/combobox/StyledOption.js';
|
|
31
|
+
import { StyledOptionContent } from '../../views/combobox/StyledOptionContent.js';
|
|
32
|
+
import { StyledOptionIcon } from '../../views/combobox/StyledOptionIcon.js';
|
|
33
|
+
import '../../views/combobox/StyledOptionMeta.js';
|
|
34
|
+
import { StyledOptionTypeIcon } from '../../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 '../../views/menu/StyledButton.js';
|
|
48
|
+
import '../../views/menu/StyledSeparator.js';
|
|
49
|
+
import { OptionMeta } from './OptionMeta.js';
|
|
50
|
+
import { toOption } from './utils.js';
|
|
51
|
+
|
|
52
|
+
const OptionComponent = forwardRef((_ref, ref) => {
|
|
53
|
+
let {
|
|
54
|
+
children,
|
|
55
|
+
icon,
|
|
56
|
+
isDisabled,
|
|
57
|
+
isHidden,
|
|
58
|
+
isSelected,
|
|
59
|
+
label,
|
|
60
|
+
type,
|
|
61
|
+
value,
|
|
62
|
+
...props
|
|
63
|
+
} = _ref;
|
|
64
|
+
const contextValue = useMemo(() => ({
|
|
65
|
+
isDisabled
|
|
66
|
+
}), [isDisabled]);
|
|
67
|
+
const {
|
|
68
|
+
activeValue,
|
|
69
|
+
getOptionProps,
|
|
70
|
+
isCompact
|
|
71
|
+
} = useComboboxContext();
|
|
72
|
+
const isActive = value === activeValue;
|
|
73
|
+
const optionRef = useRef(null);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (isActive) {
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
if (optionRef.current && optionRef.current.scrollIntoView) {
|
|
78
|
+
optionRef.current.scrollIntoView({
|
|
79
|
+
block: 'nearest'
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}, [isActive]);
|
|
85
|
+
const renderActionIcon = iconType => {
|
|
86
|
+
switch (iconType) {
|
|
87
|
+
case 'add':
|
|
88
|
+
return React__default.createElement(SvgPlusStroke, null);
|
|
89
|
+
case 'next':
|
|
90
|
+
return React__default.createElement(SvgChevronRightStroke, null);
|
|
91
|
+
case 'previous':
|
|
92
|
+
return React__default.createElement(SvgChevronLeftStroke, null);
|
|
93
|
+
default:
|
|
94
|
+
return React__default.createElement(SvgCheckLgStroke, null);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const option = toOption({
|
|
98
|
+
value,
|
|
99
|
+
label,
|
|
100
|
+
isDisabled,
|
|
101
|
+
isHidden,
|
|
102
|
+
isSelected
|
|
103
|
+
});
|
|
104
|
+
const optionProps = getOptionProps({
|
|
105
|
+
option,
|
|
106
|
+
ref: mergeRefs([optionRef, ref])
|
|
107
|
+
});
|
|
108
|
+
return React__default.createElement(OptionContext.Provider, {
|
|
109
|
+
value: contextValue
|
|
110
|
+
}, React__default.createElement(StyledOption, Object.assign({
|
|
111
|
+
isActive: isActive,
|
|
112
|
+
isCompact: isCompact,
|
|
113
|
+
$type: type
|
|
114
|
+
}, props, optionProps), React__default.createElement(StyledOptionTypeIcon, {
|
|
115
|
+
isCompact: isCompact,
|
|
116
|
+
type: type
|
|
117
|
+
}, renderActionIcon(type)), icon && React__default.createElement(StyledOptionIcon, null, icon), React__default.createElement(StyledOptionContent, null, children || label || value)));
|
|
118
|
+
});
|
|
119
|
+
OptionComponent.displayName = 'Option';
|
|
120
|
+
OptionComponent.propTypes = {
|
|
121
|
+
icon: PropTypes.any,
|
|
122
|
+
isDisabled: PropTypes.bool,
|
|
123
|
+
isSelected: PropTypes.bool,
|
|
124
|
+
isHidden: PropTypes.bool,
|
|
125
|
+
label: PropTypes.string,
|
|
126
|
+
tagProps: PropTypes.object,
|
|
127
|
+
type: PropTypes.oneOf(OPTION_TYPE),
|
|
128
|
+
value: PropTypes.string.isRequired
|
|
129
|
+
};
|
|
130
|
+
const Option = OptionComponent;
|
|
131
|
+
Option.Meta = OptionMeta;
|
|
132
|
+
|
|
133
|
+
export { Option };
|
|
@@ -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 useOptionContext from '../../context/useOptionContext.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 { StyledOptionMeta } from '../../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 '../../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 OptionMetaComponent = forwardRef((props, ref) => {
|
|
43
|
+
const {
|
|
44
|
+
isDisabled
|
|
45
|
+
} = useOptionContext();
|
|
46
|
+
return React__default.createElement(StyledOptionMeta, Object.assign({
|
|
47
|
+
isDisabled: isDisabled
|
|
48
|
+
}, props, {
|
|
49
|
+
ref: ref
|
|
50
|
+
}));
|
|
51
|
+
});
|
|
52
|
+
OptionMetaComponent.displayName = 'Option.Meta';
|
|
53
|
+
const OptionMeta = OptionMetaComponent;
|
|
54
|
+
|
|
55
|
+
export { OptionMeta };
|
|
@@ -0,0 +1,98 @@
|
|
|
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, useContext } from 'react';
|
|
8
|
+
import PropTypes from 'prop-types';
|
|
9
|
+
import { ThemeContext } from 'styled-components';
|
|
10
|
+
import { useText, DEFAULT_THEME, useDocument } from '@zendeskgarden/react-theming';
|
|
11
|
+
import { Tooltip } from '@zendeskgarden/react-tooltips';
|
|
12
|
+
import useComboboxContext from '../../context/useComboboxContext.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 { StyledTag } from '../../views/combobox/StyledTag.js';
|
|
32
|
+
import '../../views/combobox/StyledTagsButton.js';
|
|
33
|
+
import '../../views/combobox/StyledTrigger.js';
|
|
34
|
+
import '../../views/combobox/StyledValue.js';
|
|
35
|
+
import '../../views/menu/StyledMenu.js';
|
|
36
|
+
import '../../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 { TagAvatar } from './TagAvatar.js';
|
|
46
|
+
|
|
47
|
+
const TagComponent = forwardRef((_ref, ref) => {
|
|
48
|
+
let {
|
|
49
|
+
children,
|
|
50
|
+
option,
|
|
51
|
+
removeLabel,
|
|
52
|
+
tooltipZIndex,
|
|
53
|
+
...props
|
|
54
|
+
} = _ref;
|
|
55
|
+
const {
|
|
56
|
+
getTagProps,
|
|
57
|
+
isCompact,
|
|
58
|
+
removeSelection
|
|
59
|
+
} = useComboboxContext();
|
|
60
|
+
const text = option.label || option.value;
|
|
61
|
+
const ariaLabel = useText(
|
|
62
|
+
Tag, props, 'aria-label', `${text}, press delete or backspace to remove`, !option.disabled);
|
|
63
|
+
const tagProps = getTagProps({
|
|
64
|
+
option,
|
|
65
|
+
'aria-label': ariaLabel
|
|
66
|
+
});
|
|
67
|
+
const theme = useContext(ThemeContext) || DEFAULT_THEME;
|
|
68
|
+
const doc = useDocument(theme);
|
|
69
|
+
const handleClick = () => removeSelection(option.value);
|
|
70
|
+
return React__default.createElement(StyledTag, Object.assign({
|
|
71
|
+
"aria-disabled": option.disabled,
|
|
72
|
+
tabIndex: option.disabled ? undefined : 0
|
|
73
|
+
}, tagProps, props, {
|
|
74
|
+
size: isCompact ? 'medium' : 'large',
|
|
75
|
+
ref: ref
|
|
76
|
+
}), children || React__default.createElement("span", null, text), !option.disabled && (removeLabel ?
|
|
77
|
+
React__default.createElement(Tooltip, {
|
|
78
|
+
appendToNode: doc?.body,
|
|
79
|
+
content: removeLabel,
|
|
80
|
+
zIndex: tooltipZIndex
|
|
81
|
+
}, React__default.createElement(StyledTag.Close, {
|
|
82
|
+
"aria-label": removeLabel,
|
|
83
|
+
onClick: handleClick
|
|
84
|
+
})) : React__default.createElement(StyledTag.Close, {
|
|
85
|
+
onClick: handleClick
|
|
86
|
+
})));
|
|
87
|
+
});
|
|
88
|
+
TagComponent.displayName = 'Tag';
|
|
89
|
+
TagComponent.propTypes = {
|
|
90
|
+
hue: PropTypes.string,
|
|
91
|
+
isPill: PropTypes.bool,
|
|
92
|
+
isRegular: PropTypes.bool,
|
|
93
|
+
removeLabel: PropTypes.string
|
|
94
|
+
};
|
|
95
|
+
const Tag = TagComponent;
|
|
96
|
+
Tag.Avatar = TagAvatar;
|
|
97
|
+
|
|
98
|
+
export { Tag };
|
|
@@ -0,0 +1,13 @@
|
|
|
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 { Tag } from '@zendeskgarden/react-tags';
|
|
8
|
+
|
|
9
|
+
const TagAvatarComponent = Tag.Avatar;
|
|
10
|
+
TagAvatarComponent.displayName = 'Tag.Avatar';
|
|
11
|
+
const TagAvatar = TagAvatarComponent;
|
|
12
|
+
|
|
13
|
+
export { TagAvatar };
|
|
@@ -0,0 +1,35 @@
|
|
|
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 from 'react';
|
|
8
|
+
import { Tag } from './Tag.js';
|
|
9
|
+
|
|
10
|
+
const TagGroup = _ref => {
|
|
11
|
+
let {
|
|
12
|
+
children,
|
|
13
|
+
isDisabled,
|
|
14
|
+
isExpanded,
|
|
15
|
+
listboxZIndex,
|
|
16
|
+
maxTags,
|
|
17
|
+
optionTagProps,
|
|
18
|
+
selection
|
|
19
|
+
} = _ref;
|
|
20
|
+
return React__default.createElement(React__default.Fragment, null, selection.map((option, index) => {
|
|
21
|
+
const disabled = isDisabled || option.disabled;
|
|
22
|
+
return React__default.createElement(Tag, Object.assign({
|
|
23
|
+
key: option.value,
|
|
24
|
+
hidden: !isExpanded && index >= maxTags,
|
|
25
|
+
option: {
|
|
26
|
+
...option,
|
|
27
|
+
disabled
|
|
28
|
+
},
|
|
29
|
+
tooltipZIndex: listboxZIndex ? listboxZIndex + 1 : undefined
|
|
30
|
+
}, optionTagProps[option.value]));
|
|
31
|
+
}), children);
|
|
32
|
+
};
|
|
33
|
+
TagGroup.displayName = 'TagGroup';
|
|
34
|
+
|
|
35
|
+
export { TagGroup };
|