@acusti/dropdown 0.19.0 → 0.21.0
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/Dropdown.d.ts +1 -0
- package/dist/Dropdown.js +100 -59
- package/dist/Dropdown.js.flow +1 -0
- package/dist/Dropdown.js.map +1 -1
- package/package.json +3 -4
- package/src/Dropdown.tsx +143 -88
package/dist/Dropdown.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare type Props = {
|
|
|
15
15
|
hasItems?: boolean;
|
|
16
16
|
isOpenOnMount?: boolean;
|
|
17
17
|
isSearchable?: boolean;
|
|
18
|
+
keepOpenOnSubmit?: boolean;
|
|
18
19
|
label?: string;
|
|
19
20
|
/** Only usable in conjunction with {isSearchable: true}; used as search input’s name */
|
|
20
21
|
name?: string;
|
package/dist/Dropdown.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
// TODO
|
|
2
|
-
//
|
|
1
|
+
// TODO fix searching to match on significant parts of value (i.e. not parts that are the same)
|
|
2
|
+
// could also match on ukt-values (see searchable Font Weight example in storybook docs)
|
|
3
3
|
import InputText from '@acusti/input-text';
|
|
4
4
|
import { Style } from '@acusti/styling';
|
|
5
5
|
import useIsOutOfBounds from '@acusti/use-is-out-of-bounds';
|
|
6
|
-
import
|
|
6
|
+
import clsx from 'clsx';
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import { BODY_CLASS_NAME, BODY_SELECTOR, LABEL_CLASS_NAME, LABEL_TEXT_CLASS_NAME, ROOT_CLASS_NAME, STYLES, TRIGGER_CLASS_NAME, } from './styles.js';
|
|
9
9
|
import { getActiveItemElement, getItemElements, ITEM_SELECTOR, KEY_EVENT_ELEMENTS, setActiveItem, } from './helpers.js';
|
|
10
|
-
const { Children, Fragment, useCallback,
|
|
10
|
+
const { Children, Fragment, useCallback, useEffect, useRef, useState } = React;
|
|
11
11
|
const noop = () => { };
|
|
12
12
|
const CHILDREN_ERROR = '@acusti/dropdown requires either 1 child (the dropdown body) or 2 children: the dropdown trigger and the dropdown body.';
|
|
13
|
-
const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems = true, isOpenOnMount, isSearchable, label, name, onClick, onMouseDown, onMouseUp, onSubmitItem, placeholder, tabIndex, value, }) => {
|
|
13
|
+
const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems = true, isOpenOnMount, isSearchable, keepOpenOnSubmit = !hasItems, label, name, onClick, onMouseDown, onMouseUp, onSubmitItem, placeholder, tabIndex, value, }) => {
|
|
14
14
|
const childrenCount = Children.count(children);
|
|
15
15
|
if (childrenCount !== 1 && childrenCount !== 2) {
|
|
16
16
|
if (childrenCount === 0) {
|
|
@@ -37,14 +37,16 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
37
37
|
const isOpenRef = useRef(isOpen);
|
|
38
38
|
const isOpeningRef = useRef(isOpening);
|
|
39
39
|
const isTriggerFromPropsRef = useRef(isOpening);
|
|
40
|
+
const keepOpenOnSubmitRef = useRef(keepOpenOnSubmit);
|
|
40
41
|
const onSubmitItemRef = useRef(onSubmitItem);
|
|
41
42
|
const valueRef = useRef(value);
|
|
42
|
-
|
|
43
|
+
useEffect(() => {
|
|
43
44
|
allowEmptyRef.current = allowEmpty;
|
|
44
45
|
hasItemsRef.current = hasItems;
|
|
45
46
|
isOpenRef.current = isOpen;
|
|
46
47
|
isOpeningRef.current = isOpening;
|
|
47
48
|
isTriggerFromPropsRef.current = isTriggerFromProps;
|
|
49
|
+
keepOpenOnSubmitRef.current = keepOpenOnSubmit;
|
|
48
50
|
onSubmitItemRef.current = onSubmitItem;
|
|
49
51
|
valueRef.current = value;
|
|
50
52
|
}, [
|
|
@@ -53,6 +55,7 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
53
55
|
isOpen,
|
|
54
56
|
isOpening,
|
|
55
57
|
isTriggerFromProps,
|
|
58
|
+
keepOpenOnSubmit,
|
|
56
59
|
onSubmitItem,
|
|
57
60
|
value,
|
|
58
61
|
]);
|
|
@@ -65,12 +68,18 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
65
68
|
closingTimerRef.current = null;
|
|
66
69
|
}
|
|
67
70
|
}, []);
|
|
68
|
-
const handleSubmitItem = useCallback(() => {
|
|
71
|
+
const handleSubmitItem = useCallback((event) => {
|
|
69
72
|
var _a;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
const eventTarget = event.target;
|
|
74
|
+
if (isOpenRef.current && !keepOpenOnSubmitRef.current) {
|
|
75
|
+
const keepOpen = eventTarget.closest('[data-ukt-keep-open]');
|
|
76
|
+
// Don’t close dropdown if event occurs w/in data-ukt-keep-open element
|
|
77
|
+
if (!(keepOpen === null || keepOpen === void 0 ? void 0 : keepOpen.dataset.uktKeepOpen) ||
|
|
78
|
+
keepOpen.dataset.uktKeepOpen === 'false') {
|
|
79
|
+
// A short timeout before closing is better UX when user selects an item so dropdown
|
|
80
|
+
// doesn’t close before expected. It also enables using <Link />s in the dropdown body.
|
|
81
|
+
closingTimerRef.current = setTimeout(closeDropdown, 90);
|
|
82
|
+
}
|
|
74
83
|
}
|
|
75
84
|
if (!hasItemsRef.current)
|
|
76
85
|
return;
|
|
@@ -137,6 +146,56 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
148
|
}, []);
|
|
149
|
+
const handleMouseOut = useCallback((event) => {
|
|
150
|
+
if (!hasItemsRef.current)
|
|
151
|
+
return;
|
|
152
|
+
const activeItem = getActiveItemElement(dropdownElementRef.current);
|
|
153
|
+
if (!activeItem)
|
|
154
|
+
return;
|
|
155
|
+
const eventRelatedTarget = event.relatedTarget;
|
|
156
|
+
if (activeItem !== event.target || activeItem.contains(eventRelatedTarget)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// If user moused out of activeItem (not into a descendant), it’s no longer active
|
|
160
|
+
delete activeItem.dataset.uktActive;
|
|
161
|
+
}, []);
|
|
162
|
+
const handleMouseDown = useCallback((event) => {
|
|
163
|
+
if (onMouseDown)
|
|
164
|
+
onMouseDown(event);
|
|
165
|
+
if (isOpenRef.current)
|
|
166
|
+
return;
|
|
167
|
+
setIsOpen(true);
|
|
168
|
+
setIsOpening(true);
|
|
169
|
+
mouseDownPositionRef.current = {
|
|
170
|
+
clientX: event.clientX,
|
|
171
|
+
clientY: event.clientY,
|
|
172
|
+
};
|
|
173
|
+
isOpeningTimerRef.current = setTimeout(() => {
|
|
174
|
+
setIsOpening(false);
|
|
175
|
+
isOpeningTimerRef.current = null;
|
|
176
|
+
}, 1000);
|
|
177
|
+
}, [onMouseDown]);
|
|
178
|
+
const handleMouseUp = useCallback((event) => {
|
|
179
|
+
if (onMouseUp)
|
|
180
|
+
onMouseUp(event);
|
|
181
|
+
// If dropdown isn’t open or is already closing, do nothing
|
|
182
|
+
if (!isOpenRef.current || closingTimerRef.current)
|
|
183
|
+
return;
|
|
184
|
+
const eventTarget = event.target;
|
|
185
|
+
// If click was outside dropdown body, don’t trigger submit
|
|
186
|
+
if (!eventTarget.closest(BODY_SELECTOR)) {
|
|
187
|
+
// Don’t close dropdown if isOpening or search input is focused
|
|
188
|
+
if (!isOpeningRef.current &&
|
|
189
|
+
inputElementRef.current !== eventTarget.ownerDocument.activeElement) {
|
|
190
|
+
closeDropdown();
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// If dropdown has no items and click was within dropdown body, do nothing
|
|
195
|
+
if (!hasItemsRef.current)
|
|
196
|
+
return;
|
|
197
|
+
handleSubmitItem(event);
|
|
198
|
+
}, [closeDropdown, handleSubmitItem, onMouseUp]);
|
|
140
199
|
const cleanupEventListenersRef = useRef(noop);
|
|
141
200
|
const handleRef = useCallback((ref) => {
|
|
142
201
|
dropdownElementRef.current = ref;
|
|
@@ -153,25 +212,16 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
153
212
|
inputElement = ref.firstElementChild.querySelector('input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea');
|
|
154
213
|
inputElementRef.current = inputElement;
|
|
155
214
|
}
|
|
156
|
-
const
|
|
215
|
+
const handleGlobalMouseDown = ({ target }) => {
|
|
157
216
|
const eventTarget = target;
|
|
158
217
|
if (dropdownElementRef.current &&
|
|
159
218
|
!dropdownElementRef.current.contains(eventTarget)) {
|
|
160
219
|
// Close dropdown on an outside click
|
|
161
220
|
closeDropdown();
|
|
162
|
-
return;
|
|
163
221
|
}
|
|
164
|
-
if (isOpenRef.current)
|
|
165
|
-
return;
|
|
166
|
-
setIsOpen(true);
|
|
167
|
-
setIsOpening(true);
|
|
168
|
-
mouseDownPositionRef.current = { clientX, clientY };
|
|
169
|
-
isOpeningTimerRef.current = setTimeout(() => {
|
|
170
|
-
setIsOpening(false);
|
|
171
|
-
isOpeningTimerRef.current = null;
|
|
172
|
-
}, 1000);
|
|
173
222
|
};
|
|
174
|
-
const
|
|
223
|
+
const handleGlobalMouseUp = ({ target }) => {
|
|
224
|
+
var _a;
|
|
175
225
|
if (!isOpenRef.current || closingTimerRef.current)
|
|
176
226
|
return;
|
|
177
227
|
// If still isOpening (gets set false 1s after open triggers), set it to false onMouseUp
|
|
@@ -183,22 +233,13 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
183
233
|
}
|
|
184
234
|
return;
|
|
185
235
|
}
|
|
186
|
-
const
|
|
187
|
-
//
|
|
188
|
-
if (!
|
|
189
|
-
return;
|
|
190
|
-
// If mouseup is on an item, trigger submit item, else close the dropdown
|
|
191
|
-
if (isTargetInBody) {
|
|
192
|
-
handleSubmitItem();
|
|
193
|
-
}
|
|
194
|
-
else if (!inputElementRef.current ||
|
|
195
|
-
(dropdownElementRef.current &&
|
|
196
|
-
dropdownElementRef.current.contains(ownerDocument.activeElement))) {
|
|
197
|
-
// If dropdown is searchable and ref is still focused, this won’t be invoked
|
|
236
|
+
const eventTarget = target;
|
|
237
|
+
// Only handle mouseup events from outside the dropdown here
|
|
238
|
+
if (!((_a = dropdownElementRef.current) === null || _a === void 0 ? void 0 : _a.contains(eventTarget))) {
|
|
198
239
|
closeDropdown();
|
|
199
240
|
}
|
|
200
241
|
};
|
|
201
|
-
const
|
|
242
|
+
const handleGlobalKeyDown = (event) => {
|
|
202
243
|
const { altKey, ctrlKey, key, metaKey } = event;
|
|
203
244
|
const eventTarget = event.target;
|
|
204
245
|
const dropdownElement = dropdownElementRef.current;
|
|
@@ -214,7 +255,7 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
214
255
|
// If dropdown is closed, don’t handle key events if event target isn’t within dropdown
|
|
215
256
|
if (!isEventTargetingDropdown)
|
|
216
257
|
return;
|
|
217
|
-
// Open the dropdown on spacebar, enter, or if isSearchable and user hits the
|
|
258
|
+
// Open the dropdown on spacebar, enter, or if isSearchable and user hits the ↑/↓ arrows
|
|
218
259
|
if (key === ' ' ||
|
|
219
260
|
key === 'Enter' ||
|
|
220
261
|
(hasItemsRef.current &&
|
|
@@ -262,7 +303,7 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
262
303
|
// If dropdown isOpen, handle submitting the value
|
|
263
304
|
if (key === 'Enter' || (key === ' ' && !inputElementRef.current)) {
|
|
264
305
|
onEventHandled();
|
|
265
|
-
handleSubmitItem();
|
|
306
|
+
handleSubmitItem(event);
|
|
266
307
|
return;
|
|
267
308
|
}
|
|
268
309
|
// If dropdown isOpen, handle closing it on escape or spacebar if !hasItems
|
|
@@ -315,10 +356,10 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
315
356
|
}
|
|
316
357
|
};
|
|
317
358
|
// Close dropdown if any element is focused outside of this dropdown
|
|
318
|
-
const
|
|
359
|
+
const handleGlobalFocusIn = ({ target }) => {
|
|
319
360
|
if (!isOpenRef.current)
|
|
320
361
|
return;
|
|
321
|
-
const eventTarget =
|
|
362
|
+
const eventTarget = target;
|
|
322
363
|
// If focused element is a descendant or a parent of the dropdown, do nothing
|
|
323
364
|
if (!dropdownElementRef.current ||
|
|
324
365
|
dropdownElementRef.current.contains(eventTarget) ||
|
|
@@ -327,15 +368,15 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
327
368
|
}
|
|
328
369
|
closeDropdown();
|
|
329
370
|
};
|
|
330
|
-
document.addEventListener('focusin',
|
|
331
|
-
document.addEventListener('keydown',
|
|
332
|
-
document.addEventListener('mousedown',
|
|
333
|
-
document.addEventListener('mouseup',
|
|
371
|
+
document.addEventListener('focusin', handleGlobalFocusIn);
|
|
372
|
+
document.addEventListener('keydown', handleGlobalKeyDown);
|
|
373
|
+
document.addEventListener('mousedown', handleGlobalMouseDown);
|
|
374
|
+
document.addEventListener('mouseup', handleGlobalMouseUp);
|
|
334
375
|
if (ownerDocument !== document) {
|
|
335
|
-
ownerDocument.addEventListener('focusin',
|
|
336
|
-
ownerDocument.addEventListener('keydown',
|
|
337
|
-
ownerDocument.addEventListener('mousedown',
|
|
338
|
-
ownerDocument.addEventListener('mouseup',
|
|
376
|
+
ownerDocument.addEventListener('focusin', handleGlobalFocusIn);
|
|
377
|
+
ownerDocument.addEventListener('keydown', handleGlobalKeyDown);
|
|
378
|
+
ownerDocument.addEventListener('mousedown', handleGlobalMouseDown);
|
|
379
|
+
ownerDocument.addEventListener('mouseup', handleGlobalMouseUp);
|
|
339
380
|
}
|
|
340
381
|
// If dropdown should be open on mount, focus it
|
|
341
382
|
if (isOpenOnMount) {
|
|
@@ -365,15 +406,15 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
365
406
|
inputElement.addEventListener('input', handleInput);
|
|
366
407
|
}
|
|
367
408
|
cleanupEventListenersRef.current = () => {
|
|
368
|
-
document.removeEventListener('focusin',
|
|
369
|
-
document.removeEventListener('keydown',
|
|
370
|
-
document.removeEventListener('mousedown',
|
|
371
|
-
document.removeEventListener('mouseup',
|
|
409
|
+
document.removeEventListener('focusin', handleGlobalFocusIn);
|
|
410
|
+
document.removeEventListener('keydown', handleGlobalKeyDown);
|
|
411
|
+
document.removeEventListener('mousedown', handleGlobalMouseDown);
|
|
412
|
+
document.removeEventListener('mouseup', handleGlobalMouseUp);
|
|
372
413
|
if (ownerDocument !== document) {
|
|
373
|
-
ownerDocument.removeEventListener('focusin',
|
|
374
|
-
ownerDocument.removeEventListener('keydown',
|
|
375
|
-
ownerDocument.removeEventListener('mousedown',
|
|
376
|
-
ownerDocument.removeEventListener('mouseup',
|
|
414
|
+
ownerDocument.removeEventListener('focusin', handleGlobalFocusIn);
|
|
415
|
+
ownerDocument.removeEventListener('keydown', handleGlobalKeyDown);
|
|
416
|
+
ownerDocument.removeEventListener('mousedown', handleGlobalMouseDown);
|
|
417
|
+
ownerDocument.removeEventListener('mouseup', handleGlobalMouseUp);
|
|
377
418
|
}
|
|
378
419
|
if (inputElement) {
|
|
379
420
|
inputElement.removeEventListener('input', handleInput);
|
|
@@ -398,15 +439,15 @@ const Dropdown = ({ allowEmpty = true, children, className, disabled, hasItems =
|
|
|
398
439
|
}
|
|
399
440
|
return (React.createElement(Fragment, null,
|
|
400
441
|
React.createElement(Style, null, STYLES),
|
|
401
|
-
React.createElement("div", { className:
|
|
442
|
+
React.createElement("div", { className: clsx(ROOT_CLASS_NAME, className, {
|
|
402
443
|
disabled,
|
|
403
444
|
'is-open': isOpen,
|
|
404
445
|
'is-searchable': isSearchable,
|
|
405
|
-
}), onClick: onClick, onMouseDown:
|
|
446
|
+
}), onClick: onClick, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onMouseMove: handleMouseMove, onMouseOut: handleMouseOut, onMouseOver: handleMouseOver, ref: handleRef, tabIndex: isSearchable || inputElementRef.current || !isTriggerFromProps
|
|
406
447
|
? undefined
|
|
407
448
|
: 0 },
|
|
408
449
|
trigger,
|
|
409
|
-
isOpen ? (React.createElement("div", { className:
|
|
450
|
+
isOpen ? (React.createElement("div", { className: clsx(BODY_CLASS_NAME, {
|
|
410
451
|
'calculating-position': !outOfBounds.hasLayout,
|
|
411
452
|
'has-items': hasItems,
|
|
412
453
|
'out-of-bounds-bottom': outOfBounds.bottom,
|
package/dist/Dropdown.js.flow
CHANGED
package/dist/Dropdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../src/Dropdown.tsx"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,2BAA2B;AAC3B,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EACH,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,MAAM,EACN,kBAAkB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,aAAa,GAChB,MAAM,cAAc,CAAC;AAsCtB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;AAErF,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AAEtB,MAAM,cAAc,GAChB,yHAAyH,CAAC;AAE9H,MAAM,QAAQ,GAAoB,CAAC,EAC/B,UAAU,GAAG,IAAI,EACjB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,aAAa,EACb,YAAY,EACZ,KAAK,EACL,IAAI,EACJ,OAAO,EACP,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,KAAK,GACR,EAAE,EAAE;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE;QAC5C,IAAI,aAAa,KAAK,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,wBAAwB,CAAC,CAAC;SAC9D;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,cAAc,aAAa,aAAa,YAAY,CAAC,CAAC;KAC1E;IAED,IAAI,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,MAAM,kBAAkB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAU,aAAa,IAAI,KAAK,CAAC,CAAC;IACtE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,CAAC,aAAa,CAAC,CAAC;IACpE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAC1D,IAAI,CACP,CAAC;IAEF,MAAM,kBAAkB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IACvD,MAAM,iBAAiB,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IACzD,MAAM,qBAAqB,GAAG,MAAM,CAAuB,OAAO,CAAC,CAAC;IACpE,MAAM,8BAA8B,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IACtE,MAAM,oBAAoB,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;IAChD,MAAM,oBAAoB,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAE1D,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,qBAAqB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/B,eAAe,CAAC,GAAG,EAAE;QACjB,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC;QACnC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;QAC/B,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;QAC3B,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;QACjC,qBAAqB,CAAC,OAAO,GAAG,kBAAkB,CAAC;QACnD,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;QACvC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAC7B,CAAC,EAAE;QACC,UAAU;QACV,QAAQ;QACR,MAAM;QACN,SAAS;QACT,kBAAkB;QAClB,YAAY;QACZ,KAAK;KACR,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,oBAAoB,CAAC,OAAO,GAAG,IAAI,CAAC;QACpC,IAAI,eAAe,CAAC,OAAO,EAAE;YACzB,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;SAClC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;;QACtC,IAAI,SAAS,CAAC,OAAO,EAAE;YACnB,oFAAoF;YACpF,uFAAuF;YACvF,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;SAC3D;QAED,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAO;QAEjC,MAAM,WAAW,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW,EAAE;YACd,0DAA0D;YAC1D,IAAI,CAAC,aAAa,CAAC,OAAO;gBAAE,OAAO;YACnC,sFAAsF;YACtF,IAAI,MAAA,eAAe,CAAC,OAAO,0CAAE,KAAK;gBAAE,OAAO;SAC9C;QAED,MAAM,KAAK,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,SAAS,KAAI,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,QAAQ,KAAI,KAAK,CAAC;QACzD,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC5D,IAAI,eAAe,CAAC,OAAO,EAAE;YACzB,eAAe,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YACtC,IACI,eAAe,CAAC,OAAO;gBACvB,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,EACrD;gBACE,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;aAClC;SACJ;QAED,0FAA0F;QAC1F,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO;QAE/D,IAAI,eAAe,CAAC,OAAO,EAAE;YACzB,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SACrC;IACL,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,eAAe,GAAG,WAAW,CAC/B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAiC,EAAE,EAAE;QACpD,qBAAqB,CAAC,OAAO,GAAG,OAAO,CAAC;QACxC,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC;QACrD,IAAI,CAAC,eAAe;YAAE,OAAO;QAC7B,IACI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;YAChD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,EAClD;YACE,OAAO;SACV;QACD,YAAY,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EACD,EAAE,CACL,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,KAAoC,EAAE,EAAE;QACzE,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAO;QAEjC,+EAA+E;QAC/E,IAAI,qBAAqB,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO;QAEtD,+CAA+C;QAC/C,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;QACnD,IAAI,CAAC,eAAe;YAAE,OAAO;QAE7B,MAAM,YAAY,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB,CAAC;QAChD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAuB,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC;QACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACtD,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE;gBACjC,aAAa,CAAC;oBACV,eAAe;oBACf,OAAO;iBACV,CAAC,CAAC;gBACH,OAAO;aACV;SACJ;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,wBAAwB,GAAG,MAAM,CAAa,IAAI,CAAC,CAAC;IAE1D,MAAM,SAAS,GAAG,WAAW,CACzB,CAAC,GAA0B,EAAE,EAAE;QAC3B,kBAAkB,CAAC,OAAO,GAAG,GAAG,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE;YACN,+CAA+C;YAC/C,wBAAwB,CAAC,OAAO,EAAE,CAAC;YACnC,wBAAwB,CAAC,OAAO,GAAG,IAAI,CAAC;YACxC,OAAO;SACV;QAED,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;QAC9B,IAAI,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC3C,8DAA8D;QAC9D,IAAI,kBAAkB,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,iBAAiB,EAAE;YAC9D,YAAY,GAAG,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAC9C,yEAAyE,CAC5E,CAAC;YACF,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;SAC1C;QAED,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAc,EAAE,EAAE;YACjE,MAAM,WAAW,GAAG,MAAqB,CAAC;YAC1C,IACI,kBAAkB,CAAC,OAAO;gBAC1B,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EACnD;gBACE,qCAAqC;gBACrC,aAAa,EAAE,CAAC;gBAChB,OAAO;aACV;YAED,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO;YAE9B,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,oBAAoB,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACpD,iBAAiB,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACxC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACrC,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,EAAE,MAAM,EAAc,EAAE,EAAE;YAC7C,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,eAAe,CAAC,OAAO;gBAAE,OAAO;YAE1D,wFAAwF;YACxF,IAAI,YAAY,CAAC,OAAO,EAAE;gBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,iBAAiB,CAAC,OAAO,EAAE;oBAC3B,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;oBACxC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;iBACpC;gBACD,OAAO;aACV;YAED,MAAM,cAAc,GAAI,MAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAEtE,kFAAkF;YAClF,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,cAAc;gBAAE,OAAO;YAEnD,yEAAyE;YACzE,IAAI,cAAc,EAAE;gBAChB,gBAAgB,EAAE,CAAC;aACtB;iBAAM,IACH,CAAC,eAAe,CAAC,OAAO;gBACxB,CAAC,kBAAkB,CAAC,OAAO;oBACvB,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,EACvE;gBACE,4EAA4E;gBAC5E,aAAa,EAAE,CAAC;aACnB;QACL,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;YAChD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB,CAAC;YAChD,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;YACnD,IAAI,CAAC,eAAe;gBAAE,OAAO;YAE7B,MAAM,cAAc,GAAG,GAAG,EAAE;gBACxB,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,qBAAqB,CAAC,OAAO,GAAG,UAAU,CAAC;YAC/C,CAAC,CAAC;YAEF,MAAM,wBAAwB,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAEvE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;gBACpB,uFAAuF;gBACvF,IAAI,CAAC,wBAAwB;oBAAE,OAAO;gBACtC,4FAA4F;gBAC5F,IACI,GAAG,KAAK,GAAG;oBACX,GAAG,KAAK,OAAO;oBACf,CAAC,WAAW,CAAC,OAAO;wBAChB,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,CAAC,CAAC,EACjD;oBACE,cAAc,EAAE,CAAC;oBACjB,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChB,OAAO;iBACV;gBAED,OAAO;aACV;YAED,iFAAiF;YACjF,IAAI,WAAW,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;gBACjD,IAAI,mBAAmB,GACnB,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtD,gFAAgF;gBAChF,0CAA0C;gBAC1C,IAAI,CAAC,mBAAmB,IAAI,oBAAoB,CAAC,OAAO,EAAE;oBACtD,mBAAmB,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,WAAW,CAAC;iBAC5D;gBAED,IAAI,mBAAmB,EAAE;oBACrB,cAAc,EAAE,CAAC;oBACjB,IAAI,GAAG,KAAK,WAAW,EAAE;wBACrB,oBAAoB,CAAC,OAAO;4BACxB,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;qBACjD;yBAAM;wBACH,oBAAoB,CAAC,OAAO,IAAI,GAAG,CAAC;qBACvC;oBAED,aAAa,CAAC;wBACV,eAAe;wBACf,oEAAoE;wBACpE,kEAAkE;wBAClE,YAAY,EAAE,qBAAqB,CAAC,OAAO;wBAC3C,IAAI,EAAE,oBAAoB,CAAC,OAAO;qBACrC,CAAC,CAAC;oBAEH,IAAI,8BAA8B,CAAC,OAAO,EAAE;wBACxC,YAAY,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;qBACxD;oBAED,8BAA8B,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;wBACrD,oBAAoB,CAAC,OAAO,GAAG,EAAE,CAAC;wBAClC,8BAA8B,CAAC,OAAO,GAAG,IAAI,CAAC;oBAClD,CAAC,EAAE,IAAI,CAAC,CAAC;oBAET,OAAO;iBACV;aACJ;YACD,kDAAkD;YAClD,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;gBAC9D,cAAc,EAAE,CAAC;gBACjB,gBAAgB,EAAE,CAAC;gBACnB,OAAO;aACV;YACD,2EAA2E;YAC3E,IACI,GAAG,KAAK,QAAQ;gBAChB,CAAC,wBAAwB,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EACnE;gBACE,+EAA+E;gBAC/E,IACI,CAAC,WAAW,CAAC,OAAO;oBACpB,CAAC,WAAW,CAAC,iBAAiB;wBAC1B,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAClD;oBACE,OAAO;iBACV;gBACD,aAAa,EAAE,CAAC;gBAChB,OAAO;aACV;YACD,oBAAoB;YACpB,IAAI,WAAW,CAAC,OAAO,EAAE;gBACrB,IAAI,GAAG,KAAK,SAAS,EAAE;oBACnB,cAAc,EAAE,CAAC;oBACjB,IAAI,MAAM,IAAI,OAAO,EAAE;wBACnB,aAAa,CAAC;4BACV,eAAe;4BACf,KAAK,EAAE,CAAC;yBACX,CAAC,CAAC;qBACN;yBAAM;wBACH,aAAa,CAAC;4BACV,eAAe;4BACf,WAAW,EAAE,CAAC,CAAC;yBAClB,CAAC,CAAC;qBACN;oBACD,OAAO;iBACV;gBACD,IAAI,GAAG,KAAK,WAAW,EAAE;oBACrB,cAAc,EAAE,CAAC;oBACjB,IAAI,MAAM,IAAI,OAAO,EAAE;wBACnB,kDAAkD;wBAClD,aAAa,CAAC;4BACV,eAAe;4BACf,KAAK,EAAE,CAAC,CAAC;yBACZ,CAAC,CAAC;qBACN;yBAAM;wBACH,aAAa,CAAC;4BACV,eAAe;4BACf,WAAW,EAAE,CAAC;yBACjB,CAAC,CAAC;qBACN;oBACD,OAAO;iBACV;aACJ;QACL,CAAC,CAAC;QAEF,oEAAoE;QACpE,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO;YAE/B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB,CAAC;YAChD,6EAA6E;YAC7E,IACI,CAAC,kBAAkB,CAAC,OAAO;gBAC3B,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAChD,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAClD;gBACE,OAAO;aACV;YAED,aAAa,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAEpD,IAAI,aAAa,KAAK,QAAQ,EAAE;YAC5B,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACzD,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACzD,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAC7D,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;SAC5D;QAED,gDAAgD;QAChD,IAAI,aAAa,EAAE;YACf,GAAG,CAAC,KAAK,EAAE,CAAC;SACf;QAED,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE;YACjC,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;YACnD,IAAI,CAAC,eAAe;gBAAE,OAAO;YAE7B,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;YAC/C,MAAM,UAAU,GACZ,oBAAoB,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAC7D,oBAAoB,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;YAC3C,gFAAgF;YAChF,IAAI,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO;YAE7C,aAAa,CAAC;gBACV,eAAe;gBACf,oEAAoE;gBACpE,kEAAkE;gBAClE,YAAY,EAAE,qBAAqB,CAAC,OAAO;gBAC3C,IAAI,EAAE,oBAAoB,CAAC,OAAO;aACrC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,IAAI,YAAY,EAAE;YACd,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;SACvD;QAED,wBAAwB,CAAC,OAAO,GAAG,GAAG,EAAE;YACpC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACvD,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACvD,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAC3D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAEvD,IAAI,aAAa,KAAK,QAAQ,EAAE;gBAC5B,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBAC5D,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBAC5D,aAAa,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;gBAChE,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;aAC/D;YAED,IAAI,YAAY,EAAE;gBACd,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;aAC1D;QACL,CAAC,CAAC;IACN,CAAC,EACD,CAAC,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,CAAC,CACvE,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,kBAAkB,EAAE;QACrB,IAAI,YAAY,EAAE;YACd,OAAO,GAAG,CACN,oBAAC,SAAS,IACN,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,KAAK,IAAI,EAAE,EACzB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,eAAe,EACpB,iBAAiB,QACjB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,MAAM,GACb,CACL,CAAC;SACL;aAAM;YACH,OAAO,GAAG,CACN,gCAAQ,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,IAC7C,OAAO,CACH,CACZ,CAAC;SACL;KACJ;IAED,IAAI,KAAK,EAAE;QACP,OAAO,GAAG,CACN,+BAAO,SAAS,EAAE,gBAAgB;YAC9B,6BAAK,SAAS,EAAE,qBAAqB,IAAG,KAAK,CAAO;YACnD,OAAO,CACJ,CACX,CAAC;KACL;IAED,OAAO,CACH,oBAAC,QAAQ;QACL,oBAAC,KAAK,QAAE,MAAM,CAAS;QACvB,6BACI,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE;gBAC9C,QAAQ;gBACR,SAAS,EAAE,MAAM;gBACjB,eAAe,EAAE,YAAY;aAChC,CAAC,EACF,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,eAAe,EAC5B,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,SAAS,EACd,QAAQ,EACJ,YAAY,IAAI,eAAe,CAAC,OAAO,IAAI,CAAC,kBAAkB;gBAC1D,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC;YAGV,OAAO;YACP,MAAM,CAAC,CAAC,CAAC,CACN,6BACI,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE;oBACnC,sBAAsB,EAAE,CAAC,WAAW,CAAC,SAAS;oBAC9C,WAAW,EAAE,QAAQ;oBACrB,sBAAsB,EAAE,WAAW,CAAC,MAAM;oBAC1C,oBAAoB,EAAE,WAAW,CAAC,IAAI;oBACtC,qBAAqB,EAAE,WAAW,CAAC,KAAK;oBACxC,mBAAmB,EAAE,WAAW,CAAC,GAAG;iBACvC,CAAC,EACF,GAAG,EAAE,sBAAsB,IAE1B,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CACrC,CACT,CAAC,CAAC,CAAC,IAAI,CACN,CACC,CACd,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../src/Dropdown.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acusti/dropdown",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": "./dist/Dropdown.js",
|
|
@@ -22,17 +22,16 @@
|
|
|
22
22
|
"homepage": "https://github.com/acusti/uikit/tree/main/packages/dropdown#readme",
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/react": "^18.0.15",
|
|
25
|
-
"classnames": "^2",
|
|
26
25
|
"typescript": "^4.8.4"
|
|
27
26
|
},
|
|
28
27
|
"dependencies": {
|
|
29
28
|
"@acusti/input-text": "^0.11.0",
|
|
30
29
|
"@acusti/matchmaking": "^0.3.0",
|
|
31
30
|
"@acusti/styling": "^0.5.3",
|
|
32
|
-
"@acusti/use-is-out-of-bounds": "^0.5.0"
|
|
31
|
+
"@acusti/use-is-out-of-bounds": "^0.5.0",
|
|
32
|
+
"clsx": "^1.1.1"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"classnames": "^2",
|
|
36
35
|
"react": "^16.8 || ^17 || ^18",
|
|
37
36
|
"react-dom": "^16.8 || ^17 || ^18"
|
|
38
37
|
}
|
package/src/Dropdown.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// TODO
|
|
2
|
-
//
|
|
1
|
+
// TODO fix searching to match on significant parts of value (i.e. not parts that are the same)
|
|
2
|
+
// could also match on ukt-values (see searchable Font Weight example in storybook docs)
|
|
3
3
|
import InputText from '@acusti/input-text';
|
|
4
4
|
import { Style } from '@acusti/styling';
|
|
5
5
|
import useIsOutOfBounds from '@acusti/use-is-out-of-bounds';
|
|
6
|
-
import
|
|
6
|
+
import clsx from 'clsx';
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
|
|
9
9
|
import {
|
|
@@ -37,6 +37,7 @@ export type Props = {
|
|
|
37
37
|
hasItems?: boolean;
|
|
38
38
|
isOpenOnMount?: boolean;
|
|
39
39
|
isSearchable?: boolean;
|
|
40
|
+
keepOpenOnSubmit?: boolean;
|
|
40
41
|
label?: string;
|
|
41
42
|
/** Only usable in conjunction with {isSearchable: true}; used as search input’s name */
|
|
42
43
|
name?: string;
|
|
@@ -59,7 +60,7 @@ type TimeoutID = ReturnType<typeof setTimeout>;
|
|
|
59
60
|
|
|
60
61
|
type MousePosition = { clientX: number; clientY: number };
|
|
61
62
|
|
|
62
|
-
const { Children, Fragment, useCallback,
|
|
63
|
+
const { Children, Fragment, useCallback, useEffect, useRef, useState } = React;
|
|
63
64
|
|
|
64
65
|
const noop = () => {};
|
|
65
66
|
|
|
@@ -74,6 +75,7 @@ const Dropdown: React.FC<Props> = ({
|
|
|
74
75
|
hasItems = true,
|
|
75
76
|
isOpenOnMount,
|
|
76
77
|
isSearchable,
|
|
78
|
+
keepOpenOnSubmit = !hasItems,
|
|
77
79
|
label,
|
|
78
80
|
name,
|
|
79
81
|
onClick,
|
|
@@ -115,15 +117,17 @@ const Dropdown: React.FC<Props> = ({
|
|
|
115
117
|
const isOpenRef = useRef(isOpen);
|
|
116
118
|
const isOpeningRef = useRef(isOpening);
|
|
117
119
|
const isTriggerFromPropsRef = useRef(isOpening);
|
|
120
|
+
const keepOpenOnSubmitRef = useRef(keepOpenOnSubmit);
|
|
118
121
|
const onSubmitItemRef = useRef(onSubmitItem);
|
|
119
122
|
const valueRef = useRef(value);
|
|
120
123
|
|
|
121
|
-
|
|
124
|
+
useEffect(() => {
|
|
122
125
|
allowEmptyRef.current = allowEmpty;
|
|
123
126
|
hasItemsRef.current = hasItems;
|
|
124
127
|
isOpenRef.current = isOpen;
|
|
125
128
|
isOpeningRef.current = isOpening;
|
|
126
129
|
isTriggerFromPropsRef.current = isTriggerFromProps;
|
|
130
|
+
keepOpenOnSubmitRef.current = keepOpenOnSubmit;
|
|
127
131
|
onSubmitItemRef.current = onSubmitItem;
|
|
128
132
|
valueRef.current = value;
|
|
129
133
|
}, [
|
|
@@ -132,6 +136,7 @@ const Dropdown: React.FC<Props> = ({
|
|
|
132
136
|
isOpen,
|
|
133
137
|
isOpening,
|
|
134
138
|
isTriggerFromProps,
|
|
139
|
+
keepOpenOnSubmit,
|
|
135
140
|
onSubmitItem,
|
|
136
141
|
value,
|
|
137
142
|
]);
|
|
@@ -146,43 +151,56 @@ const Dropdown: React.FC<Props> = ({
|
|
|
146
151
|
}
|
|
147
152
|
}, []);
|
|
148
153
|
|
|
149
|
-
const handleSubmitItem = useCallback(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
154
|
+
const handleSubmitItem = useCallback(
|
|
155
|
+
(event: Event | React.SyntheticEvent<HTMLElement>) => {
|
|
156
|
+
const eventTarget = event.target as HTMLElement;
|
|
157
|
+
if (isOpenRef.current && !keepOpenOnSubmitRef.current) {
|
|
158
|
+
const keepOpen = eventTarget.closest(
|
|
159
|
+
'[data-ukt-keep-open]',
|
|
160
|
+
) as HTMLElement | null;
|
|
161
|
+
// Don’t close dropdown if event occurs w/in data-ukt-keep-open element
|
|
162
|
+
if (
|
|
163
|
+
!keepOpen?.dataset.uktKeepOpen ||
|
|
164
|
+
keepOpen.dataset.uktKeepOpen === 'false'
|
|
165
|
+
) {
|
|
166
|
+
// A short timeout before closing is better UX when user selects an item so dropdown
|
|
167
|
+
// doesn’t close before expected. It also enables using <Link />s in the dropdown body.
|
|
168
|
+
closingTimerRef.current = setTimeout(closeDropdown, 90);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
155
171
|
|
|
156
|
-
|
|
172
|
+
if (!hasItemsRef.current) return;
|
|
157
173
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
174
|
+
const nextElement = getActiveItemElement(dropdownElementRef.current);
|
|
175
|
+
if (!nextElement) {
|
|
176
|
+
// If not allowEmpty, don’t allow submitting an empty item
|
|
177
|
+
if (!allowEmptyRef.current) return;
|
|
178
|
+
// If we have an input element as trigger & the user didn’t clear the text, do nothing
|
|
179
|
+
if (inputElementRef.current?.value) return;
|
|
180
|
+
}
|
|
165
181
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
182
|
+
const label = nextElement?.innerText || '';
|
|
183
|
+
const nextValue = nextElement?.dataset.uktValue || label;
|
|
184
|
+
const nextItem = { element: nextElement, value: nextValue };
|
|
185
|
+
if (inputElementRef.current) {
|
|
186
|
+
inputElementRef.current.value = label;
|
|
187
|
+
if (
|
|
188
|
+
inputElementRef.current ===
|
|
189
|
+
inputElementRef.current.ownerDocument.activeElement
|
|
190
|
+
) {
|
|
191
|
+
inputElementRef.current.blur();
|
|
192
|
+
}
|
|
176
193
|
}
|
|
177
|
-
}
|
|
178
194
|
|
|
179
|
-
|
|
180
|
-
|
|
195
|
+
// If parent is controlling Dropdown via props.value and nextValue is the same, do nothing
|
|
196
|
+
if (valueRef.current && valueRef.current === nextValue) return;
|
|
181
197
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
198
|
+
if (onSubmitItemRef.current) {
|
|
199
|
+
onSubmitItemRef.current(nextItem);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
[closeDropdown],
|
|
203
|
+
);
|
|
186
204
|
|
|
187
205
|
const handleMouseMove = useCallback(
|
|
188
206
|
({ clientX, clientY }: React.MouseEvent<HTMLElement>) => {
|
|
@@ -227,6 +245,64 @@ const Dropdown: React.FC<Props> = ({
|
|
|
227
245
|
}
|
|
228
246
|
}, []);
|
|
229
247
|
|
|
248
|
+
const handleMouseOut = useCallback((event: React.MouseEvent<HTMLElement>) => {
|
|
249
|
+
if (!hasItemsRef.current) return;
|
|
250
|
+
const activeItem = getActiveItemElement(dropdownElementRef.current);
|
|
251
|
+
if (!activeItem) return;
|
|
252
|
+
const eventRelatedTarget = event.relatedTarget as HTMLElement;
|
|
253
|
+
if (activeItem !== event.target || activeItem.contains(eventRelatedTarget)) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// If user moused out of activeItem (not into a descendant), it’s no longer active
|
|
257
|
+
delete activeItem.dataset.uktActive;
|
|
258
|
+
}, []);
|
|
259
|
+
|
|
260
|
+
const handleMouseDown = useCallback(
|
|
261
|
+
(event: React.MouseEvent<HTMLElement>) => {
|
|
262
|
+
if (onMouseDown) onMouseDown(event);
|
|
263
|
+
if (isOpenRef.current) return;
|
|
264
|
+
|
|
265
|
+
setIsOpen(true);
|
|
266
|
+
setIsOpening(true);
|
|
267
|
+
mouseDownPositionRef.current = {
|
|
268
|
+
clientX: event.clientX,
|
|
269
|
+
clientY: event.clientY,
|
|
270
|
+
};
|
|
271
|
+
isOpeningTimerRef.current = setTimeout(() => {
|
|
272
|
+
setIsOpening(false);
|
|
273
|
+
isOpeningTimerRef.current = null;
|
|
274
|
+
}, 1000);
|
|
275
|
+
},
|
|
276
|
+
[onMouseDown],
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
const handleMouseUp = useCallback(
|
|
280
|
+
(event: React.MouseEvent<HTMLElement>) => {
|
|
281
|
+
if (onMouseUp) onMouseUp(event);
|
|
282
|
+
// If dropdown isn’t open or is already closing, do nothing
|
|
283
|
+
if (!isOpenRef.current || closingTimerRef.current) return;
|
|
284
|
+
|
|
285
|
+
const eventTarget = event.target as HTMLElement;
|
|
286
|
+
// If click was outside dropdown body, don’t trigger submit
|
|
287
|
+
if (!eventTarget.closest(BODY_SELECTOR)) {
|
|
288
|
+
// Don’t close dropdown if isOpening or search input is focused
|
|
289
|
+
if (
|
|
290
|
+
!isOpeningRef.current &&
|
|
291
|
+
inputElementRef.current !== eventTarget.ownerDocument.activeElement
|
|
292
|
+
) {
|
|
293
|
+
closeDropdown();
|
|
294
|
+
}
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// If dropdown has no items and click was within dropdown body, do nothing
|
|
299
|
+
if (!hasItemsRef.current) return;
|
|
300
|
+
|
|
301
|
+
handleSubmitItem(event);
|
|
302
|
+
},
|
|
303
|
+
[closeDropdown, handleSubmitItem, onMouseUp],
|
|
304
|
+
);
|
|
305
|
+
|
|
230
306
|
const cleanupEventListenersRef = useRef<() => void>(noop);
|
|
231
307
|
|
|
232
308
|
const handleRef = useCallback(
|
|
@@ -249,7 +325,7 @@ const Dropdown: React.FC<Props> = ({
|
|
|
249
325
|
inputElementRef.current = inputElement;
|
|
250
326
|
}
|
|
251
327
|
|
|
252
|
-
const
|
|
328
|
+
const handleGlobalMouseDown = ({ target }: MouseEvent) => {
|
|
253
329
|
const eventTarget = target as HTMLElement;
|
|
254
330
|
if (
|
|
255
331
|
dropdownElementRef.current &&
|
|
@@ -257,21 +333,10 @@ const Dropdown: React.FC<Props> = ({
|
|
|
257
333
|
) {
|
|
258
334
|
// Close dropdown on an outside click
|
|
259
335
|
closeDropdown();
|
|
260
|
-
return;
|
|
261
336
|
}
|
|
262
|
-
|
|
263
|
-
if (isOpenRef.current) return;
|
|
264
|
-
|
|
265
|
-
setIsOpen(true);
|
|
266
|
-
setIsOpening(true);
|
|
267
|
-
mouseDownPositionRef.current = { clientX, clientY };
|
|
268
|
-
isOpeningTimerRef.current = setTimeout(() => {
|
|
269
|
-
setIsOpening(false);
|
|
270
|
-
isOpeningTimerRef.current = null;
|
|
271
|
-
}, 1000);
|
|
272
337
|
};
|
|
273
338
|
|
|
274
|
-
const
|
|
339
|
+
const handleGlobalMouseUp = ({ target }: MouseEvent) => {
|
|
275
340
|
if (!isOpenRef.current || closingTimerRef.current) return;
|
|
276
341
|
|
|
277
342
|
// If still isOpening (gets set false 1s after open triggers), set it to false onMouseUp
|
|
@@ -284,25 +349,14 @@ const Dropdown: React.FC<Props> = ({
|
|
|
284
349
|
return;
|
|
285
350
|
}
|
|
286
351
|
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
if (!hasItemsRef.current && isTargetInBody) return;
|
|
291
|
-
|
|
292
|
-
// If mouseup is on an item, trigger submit item, else close the dropdown
|
|
293
|
-
if (isTargetInBody) {
|
|
294
|
-
handleSubmitItem();
|
|
295
|
-
} else if (
|
|
296
|
-
!inputElementRef.current ||
|
|
297
|
-
(dropdownElementRef.current &&
|
|
298
|
-
dropdownElementRef.current.contains(ownerDocument.activeElement))
|
|
299
|
-
) {
|
|
300
|
-
// If dropdown is searchable and ref is still focused, this won’t be invoked
|
|
352
|
+
const eventTarget = target as HTMLElement;
|
|
353
|
+
// Only handle mouseup events from outside the dropdown here
|
|
354
|
+
if (!dropdownElementRef.current?.contains(eventTarget)) {
|
|
301
355
|
closeDropdown();
|
|
302
356
|
}
|
|
303
357
|
};
|
|
304
358
|
|
|
305
|
-
const
|
|
359
|
+
const handleGlobalKeyDown = (event: KeyboardEvent) => {
|
|
306
360
|
const { altKey, ctrlKey, key, metaKey } = event;
|
|
307
361
|
const eventTarget = event.target as HTMLElement;
|
|
308
362
|
const dropdownElement = dropdownElementRef.current;
|
|
@@ -319,7 +373,7 @@ const Dropdown: React.FC<Props> = ({
|
|
|
319
373
|
if (!isOpenRef.current) {
|
|
320
374
|
// If dropdown is closed, don’t handle key events if event target isn’t within dropdown
|
|
321
375
|
if (!isEventTargetingDropdown) return;
|
|
322
|
-
// Open the dropdown on spacebar, enter, or if isSearchable and user hits the
|
|
376
|
+
// Open the dropdown on spacebar, enter, or if isSearchable and user hits the ↑/↓ arrows
|
|
323
377
|
if (
|
|
324
378
|
key === ' ' ||
|
|
325
379
|
key === 'Enter' ||
|
|
@@ -376,7 +430,7 @@ const Dropdown: React.FC<Props> = ({
|
|
|
376
430
|
// If dropdown isOpen, handle submitting the value
|
|
377
431
|
if (key === 'Enter' || (key === ' ' && !inputElementRef.current)) {
|
|
378
432
|
onEventHandled();
|
|
379
|
-
handleSubmitItem();
|
|
433
|
+
handleSubmitItem(event);
|
|
380
434
|
return;
|
|
381
435
|
}
|
|
382
436
|
// If dropdown isOpen, handle closing it on escape or spacebar if !hasItems
|
|
@@ -432,10 +486,10 @@ const Dropdown: React.FC<Props> = ({
|
|
|
432
486
|
};
|
|
433
487
|
|
|
434
488
|
// Close dropdown if any element is focused outside of this dropdown
|
|
435
|
-
const
|
|
489
|
+
const handleGlobalFocusIn = ({ target }: Event) => {
|
|
436
490
|
if (!isOpenRef.current) return;
|
|
437
491
|
|
|
438
|
-
const eventTarget =
|
|
492
|
+
const eventTarget = target as HTMLElement;
|
|
439
493
|
// If focused element is a descendant or a parent of the dropdown, do nothing
|
|
440
494
|
if (
|
|
441
495
|
!dropdownElementRef.current ||
|
|
@@ -448,16 +502,16 @@ const Dropdown: React.FC<Props> = ({
|
|
|
448
502
|
closeDropdown();
|
|
449
503
|
};
|
|
450
504
|
|
|
451
|
-
document.addEventListener('focusin',
|
|
452
|
-
document.addEventListener('keydown',
|
|
453
|
-
document.addEventListener('mousedown',
|
|
454
|
-
document.addEventListener('mouseup',
|
|
505
|
+
document.addEventListener('focusin', handleGlobalFocusIn);
|
|
506
|
+
document.addEventListener('keydown', handleGlobalKeyDown);
|
|
507
|
+
document.addEventListener('mousedown', handleGlobalMouseDown);
|
|
508
|
+
document.addEventListener('mouseup', handleGlobalMouseUp);
|
|
455
509
|
|
|
456
510
|
if (ownerDocument !== document) {
|
|
457
|
-
ownerDocument.addEventListener('focusin',
|
|
458
|
-
ownerDocument.addEventListener('keydown',
|
|
459
|
-
ownerDocument.addEventListener('mousedown',
|
|
460
|
-
ownerDocument.addEventListener('mouseup',
|
|
511
|
+
ownerDocument.addEventListener('focusin', handleGlobalFocusIn);
|
|
512
|
+
ownerDocument.addEventListener('keydown', handleGlobalKeyDown);
|
|
513
|
+
ownerDocument.addEventListener('mousedown', handleGlobalMouseDown);
|
|
514
|
+
ownerDocument.addEventListener('mouseup', handleGlobalMouseUp);
|
|
461
515
|
}
|
|
462
516
|
|
|
463
517
|
// If dropdown should be open on mount, focus it
|
|
@@ -492,16 +546,16 @@ const Dropdown: React.FC<Props> = ({
|
|
|
492
546
|
}
|
|
493
547
|
|
|
494
548
|
cleanupEventListenersRef.current = () => {
|
|
495
|
-
document.removeEventListener('focusin',
|
|
496
|
-
document.removeEventListener('keydown',
|
|
497
|
-
document.removeEventListener('mousedown',
|
|
498
|
-
document.removeEventListener('mouseup',
|
|
549
|
+
document.removeEventListener('focusin', handleGlobalFocusIn);
|
|
550
|
+
document.removeEventListener('keydown', handleGlobalKeyDown);
|
|
551
|
+
document.removeEventListener('mousedown', handleGlobalMouseDown);
|
|
552
|
+
document.removeEventListener('mouseup', handleGlobalMouseUp);
|
|
499
553
|
|
|
500
554
|
if (ownerDocument !== document) {
|
|
501
|
-
ownerDocument.removeEventListener('focusin',
|
|
502
|
-
ownerDocument.removeEventListener('keydown',
|
|
503
|
-
ownerDocument.removeEventListener('mousedown',
|
|
504
|
-
ownerDocument.removeEventListener('mouseup',
|
|
555
|
+
ownerDocument.removeEventListener('focusin', handleGlobalFocusIn);
|
|
556
|
+
ownerDocument.removeEventListener('keydown', handleGlobalKeyDown);
|
|
557
|
+
ownerDocument.removeEventListener('mousedown', handleGlobalMouseDown);
|
|
558
|
+
ownerDocument.removeEventListener('mouseup', handleGlobalMouseUp);
|
|
505
559
|
}
|
|
506
560
|
|
|
507
561
|
if (inputElement) {
|
|
@@ -554,15 +608,16 @@ const Dropdown: React.FC<Props> = ({
|
|
|
554
608
|
<Fragment>
|
|
555
609
|
<Style>{STYLES}</Style>
|
|
556
610
|
<div
|
|
557
|
-
className={
|
|
611
|
+
className={clsx(ROOT_CLASS_NAME, className, {
|
|
558
612
|
disabled,
|
|
559
613
|
'is-open': isOpen,
|
|
560
614
|
'is-searchable': isSearchable,
|
|
561
615
|
})}
|
|
562
616
|
onClick={onClick}
|
|
563
|
-
onMouseDown={
|
|
564
|
-
onMouseUp={
|
|
617
|
+
onMouseDown={handleMouseDown}
|
|
618
|
+
onMouseUp={handleMouseUp}
|
|
565
619
|
onMouseMove={handleMouseMove}
|
|
620
|
+
onMouseOut={handleMouseOut}
|
|
566
621
|
onMouseOver={handleMouseOver}
|
|
567
622
|
ref={handleRef}
|
|
568
623
|
tabIndex={
|
|
@@ -574,7 +629,7 @@ const Dropdown: React.FC<Props> = ({
|
|
|
574
629
|
{trigger}
|
|
575
630
|
{isOpen ? (
|
|
576
631
|
<div
|
|
577
|
-
className={
|
|
632
|
+
className={clsx(BODY_CLASS_NAME, {
|
|
578
633
|
'calculating-position': !outOfBounds.hasLayout,
|
|
579
634
|
'has-items': hasItems,
|
|
580
635
|
'out-of-bounds-bottom': outOfBounds.bottom,
|