@zendeskgarden/react-dropdowns.legacy 9.0.0-next.6 → 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.
Files changed (60) hide show
  1. package/dist/esm/elements/Autocomplete/Autocomplete.js +144 -0
  2. package/dist/esm/elements/Combobox/Combobox.js +106 -0
  3. package/dist/esm/elements/Dropdown/Dropdown.js +178 -0
  4. package/dist/esm/elements/Fields/Field.js +35 -0
  5. package/dist/esm/elements/Fields/Hint.js +15 -0
  6. package/dist/esm/elements/Fields/Label.js +46 -0
  7. package/dist/esm/elements/Fields/Message.js +19 -0
  8. package/dist/esm/elements/Menu/Items/AddItem.js +66 -0
  9. package/dist/esm/elements/Menu/Items/HeaderIcon.js +44 -0
  10. package/dist/esm/elements/Menu/Items/HeaderItem.js +44 -0
  11. package/dist/esm/elements/Menu/Items/Item.js +140 -0
  12. package/dist/esm/elements/Menu/Items/ItemMeta.js +49 -0
  13. package/dist/esm/elements/Menu/Items/MediaBody.js +44 -0
  14. package/dist/esm/elements/Menu/Items/MediaFigure.js +42 -0
  15. package/dist/esm/elements/Menu/Items/MediaItem.js +44 -0
  16. package/dist/esm/elements/Menu/Items/NextItem.js +90 -0
  17. package/dist/esm/elements/Menu/Items/PreviousItem.js +87 -0
  18. package/dist/esm/elements/Menu/Menu.js +160 -0
  19. package/dist/esm/elements/Menu/Separator.js +37 -0
  20. package/dist/esm/elements/Multiselect/Multiselect.js +316 -0
  21. package/dist/esm/elements/Select/Select.js +195 -0
  22. package/dist/esm/elements/Trigger/Trigger.js +185 -0
  23. package/dist/esm/index.js +29 -0
  24. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/check-lg-stroke.svg.js +28 -0
  25. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-down-stroke.svg.js +25 -0
  26. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-left-stroke.svg.js +25 -0
  27. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/chevron-right-stroke.svg.js +25 -0
  28. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/plus-stroke.svg.js +26 -0
  29. package/dist/esm/styled/items/StyledAddItem.js +23 -0
  30. package/dist/esm/styled/items/StyledItem.js +44 -0
  31. package/dist/esm/styled/items/StyledItemIcon.js +27 -0
  32. package/dist/esm/styled/items/StyledItemMeta.js +22 -0
  33. package/dist/esm/styled/items/StyledNextIcon.js +31 -0
  34. package/dist/esm/styled/items/StyledNextItem.js +24 -0
  35. package/dist/esm/styled/items/StyledPreviousIcon.js +31 -0
  36. package/dist/esm/styled/items/StyledPreviousItem.js +23 -0
  37. package/dist/esm/styled/items/header/StyledHeaderIcon.js +22 -0
  38. package/dist/esm/styled/items/header/StyledHeaderItem.js +29 -0
  39. package/dist/esm/styled/items/media/StyledMediaBody.js +22 -0
  40. package/dist/esm/styled/items/media/StyledMediaFigure.js +34 -0
  41. package/dist/esm/styled/items/media/StyledMediaItem.js +23 -0
  42. package/dist/esm/styled/menu/StyledMenu.js +28 -0
  43. package/dist/esm/styled/menu/StyledMenuWrapper.js +30 -0
  44. package/dist/esm/styled/menu/StyledSeparator.js +23 -0
  45. package/dist/esm/styled/multiselect/StyledMultiselectInput.js +33 -0
  46. package/dist/esm/styled/multiselect/StyledMultiselectItemWrapper.js +22 -0
  47. package/dist/esm/styled/multiselect/StyledMultiselectItemsContainer.js +34 -0
  48. package/dist/esm/styled/multiselect/StyledMultiselectMoreAnchor.js +22 -0
  49. package/dist/esm/styled/select/StyledFauxInput.js +25 -0
  50. package/dist/esm/styled/select/StyledInput.js +25 -0
  51. package/dist/esm/styled/select/StyledSelect.js +22 -0
  52. package/dist/esm/types/index.js +10 -0
  53. package/dist/esm/utils/garden-placements.js +77 -0
  54. package/dist/esm/utils/useDropdownContext.js +18 -0
  55. package/dist/esm/utils/useFieldContext.js +18 -0
  56. package/dist/esm/utils/useItemContext.js +18 -0
  57. package/dist/esm/utils/useMenuContext.js +18 -0
  58. package/dist/index.cjs.js +51 -67
  59. package/package.json +6 -6
  60. package/dist/index.esm.js +0 -2032
@@ -0,0 +1,160 @@
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, useEffect, useState, useContext } from 'react';
8
+ import { createPortal } from 'react-dom';
9
+ import PropTypes from 'prop-types';
10
+ import { ThemeContext } from 'styled-components';
11
+ import { Popper } from 'react-popper';
12
+ import { PLACEMENT } from '../../types/index.js';
13
+ import { StyledMenu } from '../../styled/menu/StyledMenu.js';
14
+ import { StyledMenuWrapper } from '../../styled/menu/StyledMenuWrapper.js';
15
+ import '../../styled/menu/StyledSeparator.js';
16
+ import '../../styled/items/StyledAddItem.js';
17
+ import '../../styled/items/StyledItem.js';
18
+ import '../../styled/items/StyledItemMeta.js';
19
+ import '../../styled/items/StyledNextItem.js';
20
+ import '../../styled/items/StyledNextIcon.js';
21
+ import '../../styled/items/StyledPreviousItem.js';
22
+ import '../../styled/items/StyledPreviousIcon.js';
23
+ import '../../styled/items/StyledItemIcon.js';
24
+ import '../../styled/items/header/StyledHeaderIcon.js';
25
+ import '../../styled/items/header/StyledHeaderItem.js';
26
+ import '../../styled/items/media/StyledMediaBody.js';
27
+ import '../../styled/items/media/StyledMediaFigure.js';
28
+ import '../../styled/items/media/StyledMediaItem.js';
29
+ import '../../styled/select/StyledFauxInput.js';
30
+ import '../../styled/select/StyledInput.js';
31
+ import '../../styled/select/StyledSelect.js';
32
+ import '../../styled/multiselect/StyledMultiselectInput.js';
33
+ import '../../styled/multiselect/StyledMultiselectItemsContainer.js';
34
+ import '../../styled/multiselect/StyledMultiselectItemWrapper.js';
35
+ import '../../styled/multiselect/StyledMultiselectMoreAnchor.js';
36
+ import useDropdownContext from '../../utils/useDropdownContext.js';
37
+ import { getRtlPopperPlacement, getPopperPlacement } from '../../utils/garden-placements.js';
38
+ import { MenuContext } from '../../utils/useMenuContext.js';
39
+
40
+ const Menu = forwardRef((props, menuRef) => {
41
+ const {
42
+ placement,
43
+ popperModifiers,
44
+ eventsEnabled,
45
+ isAnimated,
46
+ maxHeight,
47
+ style: menuStyle,
48
+ zIndex,
49
+ isCompact,
50
+ children,
51
+ appendToNode,
52
+ ...otherProps
53
+ } = props;
54
+ const {
55
+ hasMenuRef,
56
+ itemIndexRef,
57
+ previousIndexRef,
58
+ nextItemsHashRef,
59
+ popperReferenceElementRef,
60
+ itemSearchRegistry,
61
+ downshift: {
62
+ isOpen,
63
+ getMenuProps
64
+ }
65
+ } = useDropdownContext();
66
+ const scheduleUpdateRef = useRef(undefined);
67
+ useEffect(() => {
68
+ if (scheduleUpdateRef.current && isOpen) {
69
+ scheduleUpdateRef.current();
70
+ }
71
+ });
72
+ const [isVisible, setIsVisible] = useState(isOpen);
73
+ useEffect(() => {
74
+ let timeout;
75
+ if (isOpen) {
76
+ setIsVisible(true);
77
+ } else if (isAnimated) {
78
+ timeout = setTimeout(() => setIsVisible(false), 200);
79
+ } else {
80
+ setIsVisible(false);
81
+ }
82
+ return () => clearTimeout(timeout);
83
+ }, [isOpen, isAnimated]);
84
+ const themeContext = useContext(ThemeContext);
85
+ itemIndexRef.current = 0;
86
+ nextItemsHashRef.current = {};
87
+ previousIndexRef.current = undefined;
88
+ itemSearchRegistry.current = [];
89
+ const popperPlacement = themeContext.rtl ? getRtlPopperPlacement(placement) : getPopperPlacement(placement);
90
+ return (
91
+ React__default.createElement(MenuContext.Provider, {
92
+ value: {
93
+ itemIndexRef,
94
+ isCompact
95
+ }
96
+ }, React__default.createElement(Popper, {
97
+ placement: popperPlacement,
98
+ modifiers: popperModifiers
99
+ ,
100
+ eventsEnabled: isOpen && eventsEnabled
101
+ }, _ref => {
102
+ let {
103
+ ref,
104
+ style,
105
+ scheduleUpdate,
106
+ placement: currentPlacement
107
+ } = _ref;
108
+ let computedStyle = menuStyle;
109
+ scheduleUpdateRef.current = scheduleUpdate;
110
+ if ((isOpen || isVisible) && popperReferenceElementRef.current && popperReferenceElementRef.current.getBoundingClientRect) {
111
+ computedStyle = {
112
+ width: popperReferenceElementRef.current.getBoundingClientRect().width,
113
+ ...menuStyle
114
+ };
115
+ }
116
+ const menuProps = getMenuProps({
117
+ role: hasMenuRef.current ? 'menu' : 'listbox',
118
+ placement: currentPlacement,
119
+ isAnimated: isAnimated && (isOpen || isVisible),
120
+ ...otherProps
121
+ });
122
+ const menu = React__default.createElement(StyledMenuWrapper, {
123
+ ref: isOpen ? ref : undefined,
124
+ hasArrow: menuProps.hasArrow,
125
+ placement: menuProps.placement,
126
+ style: style,
127
+ isHidden: !isOpen,
128
+ isAnimated: menuProps.isAnimated,
129
+ zIndex: zIndex
130
+ }, React__default.createElement(StyledMenu, Object.assign({
131
+ ref: menuRef,
132
+ isCompact: isCompact,
133
+ maxHeight: maxHeight,
134
+ style: computedStyle
135
+ }, menuProps), (isOpen || isVisible) && children));
136
+ return appendToNode ? createPortal(menu, appendToNode) : menu;
137
+ }))
138
+ );
139
+ });
140
+ Menu.displayName = 'Menu';
141
+ Menu.propTypes = {
142
+ popperModifiers: PropTypes.any,
143
+ eventsEnabled: PropTypes.bool,
144
+ zIndex: PropTypes.number,
145
+ style: PropTypes.object,
146
+ placement: PropTypes.oneOf(PLACEMENT),
147
+ isAnimated: PropTypes.bool,
148
+ isCompact: PropTypes.bool,
149
+ hasArrow: PropTypes.bool,
150
+ maxHeight: PropTypes.string
151
+ };
152
+ Menu.defaultProps = {
153
+ placement: 'bottom-start',
154
+ isAnimated: true,
155
+ eventsEnabled: true,
156
+ maxHeight: '400px',
157
+ zIndex: 1000
158
+ };
159
+
160
+ export { Menu };
@@ -0,0 +1,37 @@
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 '../../styled/menu/StyledMenu.js';
9
+ import '../../styled/menu/StyledMenuWrapper.js';
10
+ import { StyledSeparator } from '../../styled/menu/StyledSeparator.js';
11
+ import '../../styled/items/StyledAddItem.js';
12
+ import '../../styled/items/StyledItem.js';
13
+ import '../../styled/items/StyledItemMeta.js';
14
+ import '../../styled/items/StyledNextItem.js';
15
+ import '../../styled/items/StyledNextIcon.js';
16
+ import '../../styled/items/StyledPreviousItem.js';
17
+ import '../../styled/items/StyledPreviousIcon.js';
18
+ import '../../styled/items/StyledItemIcon.js';
19
+ import '../../styled/items/header/StyledHeaderIcon.js';
20
+ import '../../styled/items/header/StyledHeaderItem.js';
21
+ import '../../styled/items/media/StyledMediaBody.js';
22
+ import '../../styled/items/media/StyledMediaFigure.js';
23
+ import '../../styled/items/media/StyledMediaItem.js';
24
+ import '../../styled/select/StyledFauxInput.js';
25
+ import '../../styled/select/StyledInput.js';
26
+ import '../../styled/select/StyledSelect.js';
27
+ import '../../styled/multiselect/StyledMultiselectInput.js';
28
+ import '../../styled/multiselect/StyledMultiselectItemsContainer.js';
29
+ import '../../styled/multiselect/StyledMultiselectItemWrapper.js';
30
+ import '../../styled/multiselect/StyledMultiselectMoreAnchor.js';
31
+
32
+ const Separator = React__default.forwardRef((props, ref) => React__default.createElement(StyledSeparator, Object.assign({
33
+ ref: ref
34
+ }, props)));
35
+ Separator.displayName = 'Separator';
36
+
37
+ export { Separator };
@@ -0,0 +1,316 @@
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, { useRef, useState, useContext, useEffect, useCallback, useMemo } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { ThemeContext } from 'styled-components';
10
+ import { Reference } from 'react-popper';
11
+ import { useSelection } from '@zendeskgarden/container-selection';
12
+ import { composeEventHandlers, KEY_CODES } from '@zendeskgarden/container-utilities';
13
+ import { useDocument } from '@zendeskgarden/react-theming';
14
+ import SvgChevronDownStroke from '../../node_modules/@zendeskgarden/svg-icons/src/16/chevron-down-stroke.svg.js';
15
+ import { mergeRefs } from 'react-merge-refs';
16
+ import '../../styled/menu/StyledMenu.js';
17
+ import '../../styled/menu/StyledMenuWrapper.js';
18
+ import '../../styled/menu/StyledSeparator.js';
19
+ import '../../styled/items/StyledAddItem.js';
20
+ import '../../styled/items/StyledItem.js';
21
+ import '../../styled/items/StyledItemMeta.js';
22
+ import '../../styled/items/StyledNextItem.js';
23
+ import '../../styled/items/StyledNextIcon.js';
24
+ import '../../styled/items/StyledPreviousItem.js';
25
+ import '../../styled/items/StyledPreviousIcon.js';
26
+ import '../../styled/items/StyledItemIcon.js';
27
+ import '../../styled/items/header/StyledHeaderIcon.js';
28
+ import '../../styled/items/header/StyledHeaderItem.js';
29
+ import '../../styled/items/media/StyledMediaBody.js';
30
+ import '../../styled/items/media/StyledMediaFigure.js';
31
+ import '../../styled/items/media/StyledMediaItem.js';
32
+ import { StyledFauxInput } from '../../styled/select/StyledFauxInput.js';
33
+ import '../../styled/select/StyledInput.js';
34
+ import '../../styled/select/StyledSelect.js';
35
+ import { StyledMultiselectInput } from '../../styled/multiselect/StyledMultiselectInput.js';
36
+ import { StyledMultiselectItemsContainer } from '../../styled/multiselect/StyledMultiselectItemsContainer.js';
37
+ import { StyledMultiselectItemWrapper } from '../../styled/multiselect/StyledMultiselectItemWrapper.js';
38
+ import { StyledMultiselectMoreAnchor } from '../../styled/multiselect/StyledMultiselectMoreAnchor.js';
39
+ import useDropdownContext from '../../utils/useDropdownContext.js';
40
+ import useFieldContext from '../../utils/useFieldContext.js';
41
+ import { REMOVE_ITEM_STATE_TYPE } from '../Dropdown/Dropdown.js';
42
+
43
+ const Multiselect = React__default.forwardRef((_ref, ref) => {
44
+ let {
45
+ renderItem,
46
+ placeholder,
47
+ maxItems,
48
+ renderShowMore,
49
+ inputRef: externalInputRef = null,
50
+ start,
51
+ onKeyDown,
52
+ ...props
53
+ } = _ref;
54
+ const {
55
+ popperReferenceElementRef,
56
+ selectedItems = [],
57
+ containsMultiselectRef,
58
+ previousIndexRef,
59
+ downshift: {
60
+ getToggleButtonProps,
61
+ getRootProps,
62
+ getInputProps,
63
+ isOpen,
64
+ closeMenu,
65
+ inputValue,
66
+ setState: setDownshiftState,
67
+ itemToString
68
+ },
69
+ setDropdownType
70
+ } = useDropdownContext();
71
+ const {
72
+ isLabelHovered
73
+ } = useFieldContext();
74
+ const inputRef = useRef();
75
+ const triggerRef = useRef();
76
+ const blurTimeoutRef = useRef();
77
+ const previousIsOpenRef = useRef(undefined);
78
+ const previousIsFocusedRef = useRef(undefined);
79
+ const [isHovered, setIsHovered] = useState(false);
80
+ const [isFocused, setIsFocused] = useState(false);
81
+ const [focusedItem, setFocusedItem] = useState(undefined);
82
+ const themeContext = useContext(ThemeContext);
83
+ const environment = useDocument(themeContext);
84
+ const {
85
+ getContainerProps,
86
+ getItemProps
87
+ } = useSelection({
88
+ rtl: themeContext.rtl,
89
+ focusedItem,
90
+ selectedItem: undefined,
91
+ onFocus: item => {
92
+ setFocusedItem(item);
93
+ }
94
+ });
95
+ useEffect(() => {
96
+ containsMultiselectRef.current = true;
97
+ const tempRef = blurTimeoutRef;
98
+ return () => {
99
+ clearTimeout(tempRef.current);
100
+ };
101
+ }, []);
102
+ useEffect(() => {
103
+ if (inputRef.current) {
104
+ if (isOpen && !previousIsOpenRef.current) {
105
+ inputRef.current.focus();
106
+ } else if (isFocused && !previousIsFocusedRef.current && focusedItem === undefined) {
107
+ inputRef.current.focus();
108
+ }
109
+ }
110
+ previousIsOpenRef.current = isOpen;
111
+ previousIsFocusedRef.current = isFocused;
112
+ }, [isOpen, inputRef, isFocused, focusedItem]);
113
+ useEffect(() => {
114
+ if (focusedItem !== undefined && isOpen) {
115
+ closeMenu();
116
+ }
117
+ }, [focusedItem, isOpen, closeMenu]);
118
+ const {
119
+ type,
120
+ ...selectProps
121
+ } = getToggleButtonProps(getRootProps({
122
+ tabIndex: props.disabled ? undefined : -1,
123
+ onKeyDown: composeEventHandlers(onKeyDown, e => {
124
+ if (isOpen) {
125
+ e.nativeEvent.preventDownshiftDefault = true;
126
+ } else if (!inputValue && e.keyCode === KEY_CODES.HOME) {
127
+ setFocusedItem(selectedItems[0]);
128
+ e.preventDefault();
129
+ }
130
+ }),
131
+ onFocus: () => {
132
+ setIsFocused(true);
133
+ },
134
+ onBlur: e => {
135
+ const currentTarget = e.currentTarget;
136
+ blurTimeoutRef.current = setTimeout(() => {
137
+ if (environment && !currentTarget.contains(environment.activeElement)) {
138
+ setIsFocused(false);
139
+ }
140
+ }, 0);
141
+ },
142
+ onMouseEnter: composeEventHandlers(props.onMouseEnter, () => setIsHovered(true)),
143
+ onMouseLeave: composeEventHandlers(props.onMouseLeave, () => setIsHovered(false)),
144
+ role: null,
145
+ ...props
146
+ }));
147
+ const renderSelectableItem = useCallback((item, index) => {
148
+ const removeValue = () => {
149
+ setDownshiftState({
150
+ type: REMOVE_ITEM_STATE_TYPE,
151
+ selectedItem: item
152
+ });
153
+ inputRef.current && inputRef.current.focus();
154
+ };
155
+ const renderedItem = renderItem({
156
+ value: item,
157
+ removeValue
158
+ });
159
+ const focusRef = React__default.createRef();
160
+ const clonedChild = React__default.cloneElement(renderedItem, {
161
+ ...getItemProps({
162
+ item,
163
+ focusRef,
164
+ onKeyDown: e => {
165
+ if (e.keyCode === KEY_CODES.DELETE || e.keyCode === KEY_CODES.BACKSPACE) {
166
+ e.preventDefault();
167
+ removeValue();
168
+ }
169
+ if (e.keyCode === KEY_CODES.END && !inputValue) {
170
+ inputRef.current && inputRef.current.focus();
171
+ e.preventDefault();
172
+ }
173
+ if (themeContext.rtl) {
174
+ if (e.keyCode === KEY_CODES.RIGHT && index === 0) {
175
+ e.preventDefault();
176
+ }
177
+ if (e.keyCode === KEY_CODES.LEFT && index === selectedItems.length - 1) {
178
+ e.preventDefault();
179
+ inputRef.current && inputRef.current.focus();
180
+ }
181
+ } else {
182
+ if (e.keyCode === KEY_CODES.LEFT && index === 0) {
183
+ e.preventDefault();
184
+ }
185
+ if (e.keyCode === KEY_CODES.RIGHT && index === selectedItems.length - 1) {
186
+ e.preventDefault();
187
+ inputRef.current && inputRef.current.focus();
188
+ }
189
+ }
190
+ },
191
+ onClick: e => {
192
+ e.nativeEvent.preventDownshiftDefault = true;
193
+ },
194
+ tabIndex: -1
195
+ }),
196
+ size: props.isCompact ? 'medium' : 'large'
197
+ });
198
+ const key = `${itemToString(item)}-${index}`;
199
+ return React__default.createElement(StyledMultiselectItemWrapper, {
200
+ key: key
201
+ }, clonedChild);
202
+ }, [getItemProps, inputValue, renderItem, setDownshiftState, itemToString, selectedItems, props, inputRef, themeContext.rtl]);
203
+ const items = useMemo(() => {
204
+ const itemValues = selectedItems || [];
205
+ const output = [];
206
+ for (let x = 0; x < itemValues.length; x++) {
207
+ const item = itemValues[x];
208
+ if (x < maxItems) {
209
+ if (props.disabled) {
210
+ const renderedItem = React__default.cloneElement(renderItem({
211
+ value: item,
212
+ removeValue: () => {
213
+ return undefined;
214
+ }
215
+ }), {
216
+ size: props.isCompact ? 'medium' : 'large'
217
+ });
218
+ output.push( React__default.createElement(StyledMultiselectItemWrapper, {
219
+ key: x
220
+ }, renderedItem));
221
+ } else {
222
+ output.push(renderSelectableItem(item, x));
223
+ }
224
+ } else if (!isFocused && !inputValue || props.disabled) {
225
+ output.push( React__default.createElement(StyledMultiselectItemWrapper, {
226
+ key: "more-anchor"
227
+ }, React__default.createElement(StyledMultiselectMoreAnchor, {
228
+ isCompact: props.isCompact,
229
+ isDisabled: props.disabled
230
+ }, renderShowMore ? renderShowMore(itemValues.length - x) : `+ ${itemValues.length - x} more`)));
231
+ break;
232
+ } else {
233
+ output.push(renderSelectableItem(item, x));
234
+ }
235
+ }
236
+ return output;
237
+ }, [isFocused, props.disabled, renderSelectableItem, selectedItems, renderItem, inputValue, maxItems, renderShowMore, props.isCompact]);
238
+ const isContainerHovered = isLabelHovered && !isOpen;
239
+ const isContainerFocused = isOpen || isFocused;
240
+ useEffect(() => {
241
+ setDropdownType('multiselect');
242
+ }, [setDropdownType]);
243
+ return React__default.createElement(Reference, null, _ref2 => {
244
+ let {
245
+ ref: popperReference
246
+ } = _ref2;
247
+ return React__default.createElement(StyledFauxInput, getContainerProps({
248
+ ...selectProps,
249
+ isHovered: isContainerHovered,
250
+ isFocused: isContainerFocused,
251
+ ref: selectRef => {
252
+ popperReference(selectRef);
253
+ mergeRefs([triggerRef, popperReferenceElementRef, ref])(selectRef);
254
+ }
255
+ }), start && React__default.createElement(StyledFauxInput.StartIcon, {
256
+ isHovered: isHovered || isLabelHovered && !isOpen,
257
+ isFocused: isContainerFocused,
258
+ isDisabled: props.disabled
259
+ }, start), React__default.createElement(StyledMultiselectItemsContainer, {
260
+ isBare: props.isBare,
261
+ isCompact: props.isCompact
262
+ }, items, React__default.createElement(StyledMultiselectInput, getInputProps({
263
+ disabled: props.disabled,
264
+ onFocus: () => {
265
+ setFocusedItem(undefined);
266
+ },
267
+ onClick: e => {
268
+ if (inputValue && inputValue.length > 0 && isOpen) {
269
+ e.nativeEvent.preventDownshiftDefault = true;
270
+ }
271
+ },
272
+ onKeyDown: e => {
273
+ if (!inputValue) {
274
+ if (themeContext.rtl && e.keyCode === KEY_CODES.RIGHT && selectedItems.length > 0 && previousIndexRef.current === undefined) {
275
+ setFocusedItem(selectedItems[selectedItems.length - 1]);
276
+ } else if (!themeContext.rtl && e.keyCode === KEY_CODES.LEFT && selectedItems.length > 0 && previousIndexRef.current === undefined) {
277
+ setFocusedItem(selectedItems[selectedItems.length - 1]);
278
+ } else if (e.keyCode === KEY_CODES.BACKSPACE && selectedItems.length > 0) {
279
+ setDownshiftState({
280
+ type: REMOVE_ITEM_STATE_TYPE,
281
+ selectedItem: selectedItems[selectedItems.length - 1]
282
+ });
283
+ e.nativeEvent.preventDownshiftDefault = true;
284
+ e.preventDefault();
285
+ e.stopPropagation();
286
+ }
287
+ }
288
+ },
289
+ isVisible: isFocused || inputValue || selectedItems.length === 0,
290
+ isCompact: props.isCompact,
291
+ role: 'combobox',
292
+ ref: mergeRefs([inputRef, externalInputRef]),
293
+ placeholder: selectedItems.length === 0 ? placeholder : undefined
294
+ }))), !props.isBare && React__default.createElement(StyledFauxInput.EndIcon, {
295
+ isHovered: isHovered || isLabelHovered && !isOpen,
296
+ isFocused: isContainerFocused,
297
+ isDisabled: props.disabled,
298
+ isRotated: isOpen
299
+ }, React__default.createElement(SvgChevronDownStroke, null)));
300
+ });
301
+ });
302
+ Multiselect.propTypes = {
303
+ isCompact: PropTypes.bool,
304
+ isBare: PropTypes.bool,
305
+ disabled: PropTypes.bool,
306
+ focusInset: PropTypes.bool,
307
+ renderItem: PropTypes.func.isRequired,
308
+ maxItems: PropTypes.number,
309
+ validation: PropTypes.oneOf(['success', 'warning', 'error'])
310
+ };
311
+ Multiselect.defaultProps = {
312
+ maxItems: 4
313
+ };
314
+ Multiselect.displayName = 'Multiselect';
315
+
316
+ export { Multiselect };