@acusti/dropdown 0.47.0 → 0.48.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 +2 -1
- package/dist/Dropdown.js +259 -207
- package/dist/Dropdown.js.map +1 -1
- package/dist/styles.d.ts +1 -1
- package/package.json +3 -3
package/dist/Dropdown.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
export type Item = {
|
|
3
|
-
element:
|
|
3
|
+
element: MaybeHTMLElement;
|
|
4
4
|
event: Event | React.SyntheticEvent<HTMLElement>;
|
|
5
5
|
label: string;
|
|
6
6
|
value: string;
|
|
@@ -61,5 +61,6 @@ export type Props = {
|
|
|
61
61
|
value?: string;
|
|
62
62
|
};
|
|
63
63
|
type ChildrenTuple = [React.ReactNode, React.ReactNode];
|
|
64
|
+
type MaybeHTMLElement = HTMLElement | null;
|
|
64
65
|
export default function Dropdown({ allowCreate, allowEmpty, children, className, disabled, hasItems, isOpenOnMount, isSearchable, keepOpenOnSubmit, label, name, onClick, onClose, onMouseDown, onMouseUp, onOpen, onSubmitItem, placeholder, style: styleFromProps, tabIndex, value, }: Props): React.JSX.Element;
|
|
65
66
|
export {};
|
package/dist/Dropdown.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { c } from "react/compiler-runtime";
|
|
3
3
|
import { SYSTEM_UI_FONT, Style } from "@acusti/styling";
|
|
4
|
-
import
|
|
4
|
+
import useBoundingClientRect from "@acusti/use-bounding-client-rect";
|
|
5
5
|
import useKeyboardEvents, { isEventTargetUsingKeyEvent } from "@acusti/use-keyboard-events";
|
|
6
6
|
import clsx from "clsx";
|
|
7
7
|
import * as React from "react";
|
|
@@ -38,8 +38,7 @@ ${TRIGGER_SELECTOR} {
|
|
|
38
38
|
font-family: var(--uktdd-font-family);
|
|
39
39
|
}
|
|
40
40
|
${ROOT_SELECTOR} {
|
|
41
|
-
|
|
42
|
-
display: inline-block;
|
|
41
|
+
width: max-content;
|
|
43
42
|
}
|
|
44
43
|
${ROOT_SELECTOR}.disabled {
|
|
45
44
|
pointer-events: none;
|
|
@@ -49,6 +48,7 @@ ${ROOT_SELECTOR} > * {
|
|
|
49
48
|
}
|
|
50
49
|
${LABEL_SELECTOR} {
|
|
51
50
|
display: flex;
|
|
51
|
+
align-items: center;
|
|
52
52
|
}
|
|
53
53
|
${LABEL_TEXT_SELECTOR} {
|
|
54
54
|
padding-right: var(--uktdd-label-pad-right);
|
|
@@ -56,31 +56,36 @@ ${LABEL_TEXT_SELECTOR} {
|
|
|
56
56
|
${BODY_SELECTOR} {
|
|
57
57
|
box-sizing: border-box;
|
|
58
58
|
position: absolute;
|
|
59
|
-
top:
|
|
60
|
-
|
|
59
|
+
top: anchor(bottom);
|
|
60
|
+
left: anchor(left);
|
|
61
|
+
position-try-fallbacks: --uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;
|
|
61
62
|
min-height: 50px;
|
|
63
|
+
max-height: var(${BODY_MAX_HEIGHT_VAR});
|
|
64
|
+
min-width: min(50px, 100%);
|
|
62
65
|
max-width: var(${BODY_MAX_WIDTH_VAR});
|
|
63
|
-
min-width: 100%;
|
|
64
66
|
overflow: auto;
|
|
65
67
|
z-index: 2;
|
|
66
68
|
padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);
|
|
67
69
|
background-color: var(--uktdd-body-bg-color);
|
|
68
70
|
box-shadow: 0 8px 18px rgba(0,0,0,0.25);
|
|
69
71
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
bottom: 100%;
|
|
72
|
+
@position-try --uktdd-top-left {
|
|
73
|
+
bottom: anchor(top);
|
|
74
|
+
left: anchor(left);
|
|
75
|
+
top: revert;
|
|
76
|
+
right: revert;
|
|
76
77
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
right:
|
|
78
|
+
@position-try --uktdd-bottom-right {
|
|
79
|
+
top: anchor(bottom);
|
|
80
|
+
right: anchor(right);
|
|
81
|
+
bottom: revert;
|
|
82
|
+
left: revert;
|
|
80
83
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
right:
|
|
84
|
+
@position-try --uktdd-top-right {
|
|
85
|
+
bottom: anchor(top);
|
|
86
|
+
right: anchor(right);
|
|
87
|
+
top: revert;
|
|
88
|
+
left: revert;
|
|
84
89
|
}
|
|
85
90
|
${BODY_SELECTOR}.has-items {
|
|
86
91
|
user-select: none;
|
|
@@ -216,8 +221,9 @@ const noop = () => {
|
|
|
216
221
|
};
|
|
217
222
|
const CHILDREN_ERROR = "@acusti/dropdown requires either 1 child (the dropdown body) or 2 children: the dropdown trigger and the dropdown body.";
|
|
218
223
|
const TEXT_INPUT_SELECTOR = "input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea";
|
|
224
|
+
let idCounter = 0;
|
|
219
225
|
function Dropdown(t0) {
|
|
220
|
-
const $ = c(
|
|
226
|
+
const $ = c(106);
|
|
221
227
|
const {
|
|
222
228
|
allowCreate,
|
|
223
229
|
allowEmpty: t1,
|
|
@@ -266,8 +272,9 @@ function Dropdown(t0) {
|
|
|
266
272
|
const isTriggerFromProps = t4;
|
|
267
273
|
const [isOpen, setIsOpen] = useState(isOpenOnMount ?? false);
|
|
268
274
|
const [isOpening, setIsOpening] = useState(!isOpenOnMount);
|
|
275
|
+
const [dropdownElement, setDropdownElement] = useState(null);
|
|
269
276
|
const [dropdownBodyElement, setDropdownBodyElement] = useState(null);
|
|
270
|
-
const
|
|
277
|
+
const [id] = useState(_temp);
|
|
271
278
|
const inputElementRef = useRef(null);
|
|
272
279
|
const closingTimerRef = useRef(null);
|
|
273
280
|
const isOpeningTimerRef = useRef(null);
|
|
@@ -275,7 +282,6 @@ function Dropdown(t0) {
|
|
|
275
282
|
const clearEnteredCharactersTimerRef = useRef(null);
|
|
276
283
|
const enteredCharactersRef = useRef("");
|
|
277
284
|
const mouseDownPositionRef = useRef(null);
|
|
278
|
-
const outOfBounds = useIsOutOfBounds(dropdownBodyElement);
|
|
279
285
|
const allowCreateRef = useRef(allowCreate);
|
|
280
286
|
const allowEmptyRef = useRef(allowEmpty);
|
|
281
287
|
const hasItemsRef = useRef(hasItems);
|
|
@@ -367,20 +373,16 @@ function Dropdown(t0) {
|
|
|
367
373
|
}
|
|
368
374
|
const closeDropdown = t9;
|
|
369
375
|
let t10;
|
|
370
|
-
if ($[20] !== closeDropdown) {
|
|
376
|
+
if ($[20] !== closeDropdown || $[21] !== dropdownElement) {
|
|
371
377
|
t10 = (event) => {
|
|
372
378
|
var _a;
|
|
373
|
-
const eventTarget = event.target;
|
|
374
379
|
if (isOpenRef.current && !keepOpenOnSubmitRef.current) {
|
|
375
|
-
|
|
376
|
-
if (!(keepOpen == null ? void 0 : keepOpen.dataset.uktKeepOpen) || keepOpen.dataset.uktKeepOpen === "false") {
|
|
377
|
-
closingTimerRef.current = setTimeout(closeDropdown, 90);
|
|
378
|
-
}
|
|
380
|
+
closingTimerRef.current = setTimeout(closeDropdown, 90);
|
|
379
381
|
}
|
|
380
382
|
if (!hasItemsRef.current) {
|
|
381
383
|
return;
|
|
382
384
|
}
|
|
383
|
-
const element = getActiveItemElement(
|
|
385
|
+
const element = getActiveItemElement(dropdownElement);
|
|
384
386
|
if (!element && !allowCreateRef.current) {
|
|
385
387
|
if (!allowEmptyRef.current) {
|
|
386
388
|
return;
|
|
@@ -414,13 +416,14 @@ function Dropdown(t0) {
|
|
|
414
416
|
}
|
|
415
417
|
};
|
|
416
418
|
$[20] = closeDropdown;
|
|
417
|
-
$[21] =
|
|
419
|
+
$[21] = dropdownElement;
|
|
420
|
+
$[22] = t10;
|
|
418
421
|
} else {
|
|
419
|
-
t10 = $[
|
|
422
|
+
t10 = $[22];
|
|
420
423
|
}
|
|
421
424
|
const handleSubmitItem = t10;
|
|
422
425
|
let t11;
|
|
423
|
-
if ($[
|
|
426
|
+
if ($[23] !== setIsOpening) {
|
|
424
427
|
t11 = (t122) => {
|
|
425
428
|
const {
|
|
426
429
|
clientX,
|
|
@@ -436,14 +439,14 @@ function Dropdown(t0) {
|
|
|
436
439
|
}
|
|
437
440
|
setIsOpening(false);
|
|
438
441
|
};
|
|
439
|
-
$[
|
|
440
|
-
$[
|
|
442
|
+
$[23] = setIsOpening;
|
|
443
|
+
$[24] = t11;
|
|
441
444
|
} else {
|
|
442
|
-
t11 = $[
|
|
445
|
+
t11 = $[24];
|
|
443
446
|
}
|
|
444
447
|
const handleMouseMove = t11;
|
|
445
448
|
let t12;
|
|
446
|
-
if ($[
|
|
449
|
+
if ($[25] !== dropdownElement) {
|
|
447
450
|
t12 = (event_0) => {
|
|
448
451
|
if (!hasItemsRef.current) {
|
|
449
452
|
return;
|
|
@@ -451,7 +454,6 @@ function Dropdown(t0) {
|
|
|
451
454
|
if (currentInputMethodRef.current !== "mouse") {
|
|
452
455
|
return;
|
|
453
456
|
}
|
|
454
|
-
const dropdownElement = dropdownElementRef.current;
|
|
455
457
|
if (!dropdownElement) {
|
|
456
458
|
return;
|
|
457
459
|
}
|
|
@@ -459,9 +461,9 @@ function Dropdown(t0) {
|
|
|
459
461
|
if (!itemElements) {
|
|
460
462
|
return;
|
|
461
463
|
}
|
|
462
|
-
const
|
|
463
|
-
const item =
|
|
464
|
-
const element_0 = item ??
|
|
464
|
+
const eventTarget = event_0.target;
|
|
465
|
+
const item = eventTarget.closest(ITEM_SELECTOR);
|
|
466
|
+
const element_0 = item ?? eventTarget;
|
|
465
467
|
for (const itemElement of itemElements) {
|
|
466
468
|
if (itemElement === element_0) {
|
|
467
469
|
setActiveItem({
|
|
@@ -472,18 +474,19 @@ function Dropdown(t0) {
|
|
|
472
474
|
}
|
|
473
475
|
}
|
|
474
476
|
};
|
|
475
|
-
$[
|
|
477
|
+
$[25] = dropdownElement;
|
|
478
|
+
$[26] = t12;
|
|
476
479
|
} else {
|
|
477
|
-
t12 = $[
|
|
480
|
+
t12 = $[26];
|
|
478
481
|
}
|
|
479
482
|
const handleMouseOver = t12;
|
|
480
483
|
let t13;
|
|
481
|
-
if ($[
|
|
484
|
+
if ($[27] !== dropdownElement) {
|
|
482
485
|
t13 = (event_1) => {
|
|
483
486
|
if (!hasItemsRef.current) {
|
|
484
487
|
return;
|
|
485
488
|
}
|
|
486
|
-
const activeItem = getActiveItemElement(
|
|
489
|
+
const activeItem = getActiveItemElement(dropdownElement);
|
|
487
490
|
if (!activeItem) {
|
|
488
491
|
return;
|
|
489
492
|
}
|
|
@@ -493,13 +496,14 @@ function Dropdown(t0) {
|
|
|
493
496
|
}
|
|
494
497
|
delete activeItem.dataset.uktActive;
|
|
495
498
|
};
|
|
496
|
-
$[
|
|
499
|
+
$[27] = dropdownElement;
|
|
500
|
+
$[28] = t13;
|
|
497
501
|
} else {
|
|
498
|
-
t13 = $[
|
|
502
|
+
t13 = $[28];
|
|
499
503
|
}
|
|
500
504
|
const handleMouseOut = t13;
|
|
501
505
|
let t14;
|
|
502
|
-
if ($[
|
|
506
|
+
if ($[29] !== onMouseDown || $[30] !== setIsOpen || $[31] !== setIsOpening) {
|
|
503
507
|
t14 = (event_2) => {
|
|
504
508
|
if (onMouseDown) {
|
|
505
509
|
onMouseDown(event_2);
|
|
@@ -518,16 +522,16 @@ function Dropdown(t0) {
|
|
|
518
522
|
isOpeningTimerRef.current = null;
|
|
519
523
|
}, 1e3);
|
|
520
524
|
};
|
|
521
|
-
$[
|
|
522
|
-
$[
|
|
523
|
-
$[
|
|
524
|
-
$[
|
|
525
|
+
$[29] = onMouseDown;
|
|
526
|
+
$[30] = setIsOpen;
|
|
527
|
+
$[31] = setIsOpening;
|
|
528
|
+
$[32] = t14;
|
|
525
529
|
} else {
|
|
526
|
-
t14 = $[
|
|
530
|
+
t14 = $[32];
|
|
527
531
|
}
|
|
528
532
|
const handleMouseDown = t14;
|
|
529
533
|
let t15;
|
|
530
|
-
if ($[
|
|
534
|
+
if ($[33] !== closeDropdown || $[34] !== handleSubmitItem || $[35] !== onMouseUp) {
|
|
531
535
|
t15 = (event_3) => {
|
|
532
536
|
if (onMouseUp) {
|
|
533
537
|
onMouseUp(event_3);
|
|
@@ -535,9 +539,9 @@ function Dropdown(t0) {
|
|
|
535
539
|
if (isOpeningRef.current || !isOpenRef.current || closingTimerRef.current) {
|
|
536
540
|
return;
|
|
537
541
|
}
|
|
538
|
-
const
|
|
539
|
-
if (!
|
|
540
|
-
if (!isOpeningRef.current && inputElementRef.current !==
|
|
542
|
+
const eventTarget_0 = event_3.target;
|
|
543
|
+
if (!eventTarget_0.closest(BODY_SELECTOR)) {
|
|
544
|
+
if (!isOpeningRef.current && inputElementRef.current !== eventTarget_0.ownerDocument.activeElement) {
|
|
541
545
|
closeDropdown();
|
|
542
546
|
}
|
|
543
547
|
return;
|
|
@@ -547,16 +551,16 @@ function Dropdown(t0) {
|
|
|
547
551
|
}
|
|
548
552
|
handleSubmitItem(event_3);
|
|
549
553
|
};
|
|
550
|
-
$[
|
|
551
|
-
$[
|
|
552
|
-
$[
|
|
553
|
-
$[
|
|
554
|
+
$[33] = closeDropdown;
|
|
555
|
+
$[34] = handleSubmitItem;
|
|
556
|
+
$[35] = onMouseUp;
|
|
557
|
+
$[36] = t15;
|
|
554
558
|
} else {
|
|
555
|
-
t15 = $[
|
|
559
|
+
t15 = $[36];
|
|
556
560
|
}
|
|
557
561
|
const handleMouseUp = t15;
|
|
558
562
|
let t16;
|
|
559
|
-
if ($[
|
|
563
|
+
if ($[37] !== closeDropdown || $[38] !== dropdownElement || $[39] !== handleSubmitItem || $[40] !== setIsOpen) {
|
|
560
564
|
t16 = (event_4) => {
|
|
561
565
|
const {
|
|
562
566
|
altKey,
|
|
@@ -564,9 +568,8 @@ function Dropdown(t0) {
|
|
|
564
568
|
key,
|
|
565
569
|
metaKey
|
|
566
570
|
} = event_4;
|
|
567
|
-
const
|
|
568
|
-
|
|
569
|
-
if (!dropdownElement_0) {
|
|
571
|
+
const eventTarget_1 = event_4.target;
|
|
572
|
+
if (!dropdownElement) {
|
|
570
573
|
return;
|
|
571
574
|
}
|
|
572
575
|
const onEventHandled = () => {
|
|
@@ -574,7 +577,7 @@ function Dropdown(t0) {
|
|
|
574
577
|
event_4.preventDefault();
|
|
575
578
|
currentInputMethodRef.current = "keyboard";
|
|
576
579
|
};
|
|
577
|
-
const isEventTargetingDropdown =
|
|
580
|
+
const isEventTargetingDropdown = dropdownElement.contains(eventTarget_1);
|
|
578
581
|
if (!isOpenRef.current) {
|
|
579
582
|
if (!isEventTargetingDropdown) {
|
|
580
583
|
return;
|
|
@@ -599,7 +602,7 @@ function Dropdown(t0) {
|
|
|
599
602
|
enteredCharactersRef.current = enteredCharactersRef.current + key;
|
|
600
603
|
}
|
|
601
604
|
setActiveItem({
|
|
602
|
-
dropdownElement
|
|
605
|
+
dropdownElement,
|
|
603
606
|
isExactMatch: allowCreateRef.current,
|
|
604
607
|
text: enteredCharactersRef.current
|
|
605
608
|
});
|
|
@@ -629,12 +632,12 @@ function Dropdown(t0) {
|
|
|
629
632
|
onEventHandled();
|
|
630
633
|
if (altKey || metaKey) {
|
|
631
634
|
setActiveItem({
|
|
632
|
-
dropdownElement
|
|
635
|
+
dropdownElement,
|
|
633
636
|
index: 0
|
|
634
637
|
});
|
|
635
638
|
} else {
|
|
636
639
|
setActiveItem({
|
|
637
|
-
dropdownElement
|
|
640
|
+
dropdownElement,
|
|
638
641
|
indexAddend: -1
|
|
639
642
|
});
|
|
640
643
|
}
|
|
@@ -644,12 +647,12 @@ function Dropdown(t0) {
|
|
|
644
647
|
onEventHandled();
|
|
645
648
|
if (altKey || metaKey) {
|
|
646
649
|
setActiveItem({
|
|
647
|
-
dropdownElement
|
|
650
|
+
dropdownElement,
|
|
648
651
|
index: -1
|
|
649
652
|
});
|
|
650
653
|
} else {
|
|
651
654
|
setActiveItem({
|
|
652
|
-
dropdownElement
|
|
655
|
+
dropdownElement,
|
|
653
656
|
indexAddend: 1
|
|
654
657
|
});
|
|
655
658
|
}
|
|
@@ -657,31 +660,32 @@ function Dropdown(t0) {
|
|
|
657
660
|
}
|
|
658
661
|
}
|
|
659
662
|
};
|
|
660
|
-
$[
|
|
661
|
-
$[
|
|
662
|
-
$[
|
|
663
|
-
$[
|
|
663
|
+
$[37] = closeDropdown;
|
|
664
|
+
$[38] = dropdownElement;
|
|
665
|
+
$[39] = handleSubmitItem;
|
|
666
|
+
$[40] = setIsOpen;
|
|
667
|
+
$[41] = t16;
|
|
664
668
|
} else {
|
|
665
|
-
t16 = $[
|
|
669
|
+
t16 = $[41];
|
|
666
670
|
}
|
|
667
671
|
const handleKeyDown = t16;
|
|
668
672
|
let t17;
|
|
669
|
-
if ($[
|
|
673
|
+
if ($[42] !== handleKeyDown) {
|
|
670
674
|
t17 = {
|
|
671
675
|
ignoreUsedKeyboardEvents: false,
|
|
672
676
|
onKeyDown: handleKeyDown
|
|
673
677
|
};
|
|
674
|
-
$[
|
|
675
|
-
$[
|
|
678
|
+
$[42] = handleKeyDown;
|
|
679
|
+
$[43] = t17;
|
|
676
680
|
} else {
|
|
677
|
-
t17 = $[
|
|
681
|
+
t17 = $[43];
|
|
678
682
|
}
|
|
679
683
|
useKeyboardEvents(t17);
|
|
680
684
|
const cleanupEventListenersRef = useRef(noop);
|
|
681
685
|
let t18;
|
|
682
|
-
if ($[
|
|
686
|
+
if ($[44] !== closeDropdown || $[45] !== isOpenOnMount || $[46] !== isTriggerFromProps || $[47] !== setDropdownElement || $[48] !== setIsOpen || $[49] !== setIsOpening) {
|
|
683
687
|
t18 = (ref) => {
|
|
684
|
-
|
|
688
|
+
setDropdownElement(ref);
|
|
685
689
|
if (!ref) {
|
|
686
690
|
cleanupEventListenersRef.current();
|
|
687
691
|
cleanupEventListenersRef.current = noop;
|
|
@@ -703,13 +707,12 @@ function Dropdown(t0) {
|
|
|
703
707
|
const {
|
|
704
708
|
target
|
|
705
709
|
} = t192;
|
|
706
|
-
const
|
|
707
|
-
if (
|
|
710
|
+
const eventTarget_2 = target;
|
|
711
|
+
if (!ref.contains(eventTarget_2)) {
|
|
708
712
|
closeDropdown();
|
|
709
713
|
}
|
|
710
714
|
};
|
|
711
715
|
const handleGlobalMouseUp = (t202) => {
|
|
712
|
-
var _a;
|
|
713
716
|
const {
|
|
714
717
|
target: target_0
|
|
715
718
|
} = t202;
|
|
@@ -724,8 +727,8 @@ function Dropdown(t0) {
|
|
|
724
727
|
}
|
|
725
728
|
return;
|
|
726
729
|
}
|
|
727
|
-
const
|
|
728
|
-
if (!
|
|
730
|
+
const eventTarget_3 = target_0;
|
|
731
|
+
if (!ref.contains(eventTarget_3)) {
|
|
729
732
|
closeDropdown();
|
|
730
733
|
}
|
|
731
734
|
};
|
|
@@ -736,8 +739,8 @@ function Dropdown(t0) {
|
|
|
736
739
|
if (!isOpenRef.current) {
|
|
737
740
|
return;
|
|
738
741
|
}
|
|
739
|
-
const
|
|
740
|
-
if (
|
|
742
|
+
const eventTarget_4 = target_1;
|
|
743
|
+
if (ref.contains(eventTarget_4) || eventTarget_4.contains(ref)) {
|
|
741
744
|
return;
|
|
742
745
|
}
|
|
743
746
|
closeDropdown();
|
|
@@ -754,21 +757,17 @@ function Dropdown(t0) {
|
|
|
754
757
|
ref.focus();
|
|
755
758
|
}
|
|
756
759
|
const handleInput = (event_5) => {
|
|
757
|
-
const dropdownElement_1 = dropdownElementRef.current;
|
|
758
|
-
if (!dropdownElement_1) {
|
|
759
|
-
return;
|
|
760
|
-
}
|
|
761
760
|
if (!isOpenRef.current) {
|
|
762
761
|
setIsOpen(true);
|
|
763
762
|
}
|
|
764
763
|
const input = event_5.target;
|
|
765
764
|
const isDeleting = enteredCharactersRef.current.length > input.value.length;
|
|
766
765
|
enteredCharactersRef.current = input.value;
|
|
767
|
-
if (isDeleting && input.value.length && getActiveItemElement(
|
|
766
|
+
if (isDeleting && input.value.length && getActiveItemElement(ref)) {
|
|
768
767
|
return;
|
|
769
768
|
}
|
|
770
769
|
setActiveItem({
|
|
771
|
-
dropdownElement:
|
|
770
|
+
dropdownElement: ref,
|
|
772
771
|
isExactMatch: allowCreateRef.current,
|
|
773
772
|
text: enteredCharactersRef.current
|
|
774
773
|
});
|
|
@@ -790,180 +789,233 @@ function Dropdown(t0) {
|
|
|
790
789
|
}
|
|
791
790
|
};
|
|
792
791
|
};
|
|
793
|
-
$[
|
|
794
|
-
$[
|
|
795
|
-
$[
|
|
796
|
-
$[
|
|
797
|
-
$[
|
|
798
|
-
$[
|
|
792
|
+
$[44] = closeDropdown;
|
|
793
|
+
$[45] = isOpenOnMount;
|
|
794
|
+
$[46] = isTriggerFromProps;
|
|
795
|
+
$[47] = setDropdownElement;
|
|
796
|
+
$[48] = setIsOpen;
|
|
797
|
+
$[49] = setIsOpening;
|
|
798
|
+
$[50] = t18;
|
|
799
799
|
} else {
|
|
800
|
-
t18 = $[
|
|
800
|
+
t18 = $[50];
|
|
801
801
|
}
|
|
802
802
|
const handleRef = t18;
|
|
803
803
|
if (!isTriggerFromProps) {
|
|
804
804
|
if (isSearchable) {
|
|
805
805
|
const t192 = value ?? "";
|
|
806
806
|
let t202;
|
|
807
|
-
if ($[
|
|
807
|
+
if ($[51] !== setIsOpen) {
|
|
808
808
|
t202 = () => setIsOpen(true);
|
|
809
|
-
$[
|
|
810
|
-
$[
|
|
809
|
+
$[51] = setIsOpen;
|
|
810
|
+
$[52] = t202;
|
|
811
811
|
} else {
|
|
812
|
-
t202 = $[
|
|
812
|
+
t202 = $[52];
|
|
813
813
|
}
|
|
814
814
|
let t212;
|
|
815
|
-
if ($[
|
|
815
|
+
if ($[53] !== disabled || $[54] !== name || $[55] !== placeholder || $[56] !== t192 || $[57] !== t202 || $[58] !== tabIndex) {
|
|
816
816
|
t212 = /* @__PURE__ */ jsx("input", { autoComplete: "off", className: TRIGGER_CLASS_NAME, defaultValue: t192, disabled, name, onFocus: t202, placeholder, ref: inputElementRef, tabIndex, type: "text" });
|
|
817
|
-
$[
|
|
818
|
-
$[
|
|
819
|
-
$[
|
|
820
|
-
$[
|
|
821
|
-
$[
|
|
822
|
-
$[
|
|
823
|
-
$[
|
|
817
|
+
$[53] = disabled;
|
|
818
|
+
$[54] = name;
|
|
819
|
+
$[55] = placeholder;
|
|
820
|
+
$[56] = t192;
|
|
821
|
+
$[57] = t202;
|
|
822
|
+
$[58] = tabIndex;
|
|
823
|
+
$[59] = t212;
|
|
824
824
|
} else {
|
|
825
|
-
t212 = $[
|
|
825
|
+
t212 = $[59];
|
|
826
826
|
}
|
|
827
827
|
trigger = t212;
|
|
828
828
|
} else {
|
|
829
829
|
let t192;
|
|
830
|
-
if ($[
|
|
830
|
+
if ($[60] !== trigger) {
|
|
831
831
|
t192 = /* @__PURE__ */ jsx("button", { className: TRIGGER_CLASS_NAME, tabIndex: 0, children: trigger });
|
|
832
|
-
$[
|
|
833
|
-
$[
|
|
832
|
+
$[60] = trigger;
|
|
833
|
+
$[61] = t192;
|
|
834
834
|
} else {
|
|
835
|
-
t192 = $[
|
|
835
|
+
t192 = $[61];
|
|
836
836
|
}
|
|
837
837
|
trigger = t192;
|
|
838
838
|
}
|
|
839
839
|
}
|
|
840
840
|
if (label) {
|
|
841
841
|
let t192;
|
|
842
|
-
if ($[
|
|
842
|
+
if ($[62] !== label) {
|
|
843
843
|
t192 = /* @__PURE__ */ jsx("div", { className: LABEL_TEXT_CLASS_NAME, children: label });
|
|
844
|
-
$[
|
|
845
|
-
$[
|
|
844
|
+
$[62] = label;
|
|
845
|
+
$[63] = t192;
|
|
846
846
|
} else {
|
|
847
|
-
t192 = $[
|
|
847
|
+
t192 = $[63];
|
|
848
848
|
}
|
|
849
849
|
let t202;
|
|
850
|
-
if ($[
|
|
850
|
+
if ($[64] !== t192 || $[65] !== trigger) {
|
|
851
851
|
t202 = /* @__PURE__ */ jsxs("label", { className: LABEL_CLASS_NAME, children: [
|
|
852
852
|
t192,
|
|
853
853
|
trigger
|
|
854
854
|
] });
|
|
855
|
-
$[
|
|
856
|
-
$[
|
|
857
|
-
$[
|
|
855
|
+
$[64] = t192;
|
|
856
|
+
$[65] = trigger;
|
|
857
|
+
$[66] = t202;
|
|
858
858
|
} else {
|
|
859
|
-
t202 = $[
|
|
859
|
+
t202 = $[66];
|
|
860
860
|
}
|
|
861
861
|
trigger = t202;
|
|
862
862
|
}
|
|
863
|
+
const dropdownRect = useBoundingClientRect(dropdownElement);
|
|
864
|
+
const dropdownBodyRect = useBoundingClientRect(dropdownBodyElement);
|
|
863
865
|
let t19;
|
|
864
|
-
if ($[
|
|
865
|
-
t19 =
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
$[62] = outOfBounds.maxHeight;
|
|
869
|
-
$[63] = t19;
|
|
866
|
+
if ($[67] !== dropdownBodyElement) {
|
|
867
|
+
t19 = getBoundingAncestor(dropdownBodyElement);
|
|
868
|
+
$[67] = dropdownBodyElement;
|
|
869
|
+
$[68] = t19;
|
|
870
870
|
} else {
|
|
871
|
-
t19 = $[
|
|
871
|
+
t19 = $[68];
|
|
872
|
+
}
|
|
873
|
+
const boundingElement = t19;
|
|
874
|
+
const boundingElementRect = useBoundingClientRect(boundingElement);
|
|
875
|
+
let maxHeight;
|
|
876
|
+
let maxWidth;
|
|
877
|
+
if (dropdownBodyRect.top != null && dropdownRect.top != null && boundingElementRect.top != null) {
|
|
878
|
+
const maxHeightUp = dropdownBodyRect.bottom - boundingElementRect.top;
|
|
879
|
+
const maxHeightDown = boundingElementRect.bottom - dropdownBodyRect.top;
|
|
880
|
+
maxHeight = dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp;
|
|
881
|
+
const maxWidthLeft = dropdownBodyRect.right - boundingElementRect.left;
|
|
882
|
+
const maxWidthRight = boundingElementRect.right - dropdownBodyRect.left;
|
|
883
|
+
maxWidth = dropdownBodyRect.left > dropdownRect.left ? maxWidthRight : maxWidthLeft;
|
|
872
884
|
}
|
|
873
885
|
let t20;
|
|
874
|
-
if ($[
|
|
875
|
-
t20 =
|
|
876
|
-
[
|
|
886
|
+
if ($[69] !== maxHeight) {
|
|
887
|
+
t20 = maxHeight != null && maxHeight > 0 ? {
|
|
888
|
+
[BODY_MAX_HEIGHT_VAR]: `calc(${maxHeight}px - var(--uktdd-body-buffer))`
|
|
877
889
|
} : null;
|
|
878
|
-
$[
|
|
879
|
-
$[
|
|
890
|
+
$[69] = maxHeight;
|
|
891
|
+
$[70] = t20;
|
|
880
892
|
} else {
|
|
881
|
-
t20 = $[
|
|
893
|
+
t20 = $[70];
|
|
882
894
|
}
|
|
883
895
|
let t21;
|
|
884
|
-
if ($[
|
|
885
|
-
t21 = {
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
$[66] = styleFromProps;
|
|
891
|
-
$[67] = t19;
|
|
892
|
-
$[68] = t20;
|
|
893
|
-
$[69] = t21;
|
|
896
|
+
if ($[71] !== maxWidth) {
|
|
897
|
+
t21 = maxWidth != null && maxWidth > 0 ? {
|
|
898
|
+
[BODY_MAX_WIDTH_VAR]: `calc(${maxWidth}px - var(--uktdd-body-buffer))`
|
|
899
|
+
} : null;
|
|
900
|
+
$[71] = maxWidth;
|
|
901
|
+
$[72] = t21;
|
|
894
902
|
} else {
|
|
895
|
-
t21 = $[
|
|
903
|
+
t21 = $[72];
|
|
896
904
|
}
|
|
897
|
-
const style = t21;
|
|
898
905
|
let t22;
|
|
899
|
-
if ($[
|
|
900
|
-
t22 =
|
|
901
|
-
|
|
906
|
+
if ($[73] !== styleFromProps || $[74] !== t20 || $[75] !== t21) {
|
|
907
|
+
t22 = {
|
|
908
|
+
...styleFromProps,
|
|
909
|
+
...t20,
|
|
910
|
+
...t21
|
|
911
|
+
};
|
|
912
|
+
$[73] = styleFromProps;
|
|
913
|
+
$[74] = t20;
|
|
914
|
+
$[75] = t21;
|
|
915
|
+
$[76] = t22;
|
|
902
916
|
} else {
|
|
903
|
-
t22 = $[
|
|
917
|
+
t22 = $[76];
|
|
904
918
|
}
|
|
919
|
+
const style = t22;
|
|
905
920
|
let t23;
|
|
906
|
-
if ($[
|
|
907
|
-
t23 =
|
|
921
|
+
if ($[77] === Symbol.for("react.memo_cache_sentinel")) {
|
|
922
|
+
t23 = /* @__PURE__ */ jsx(Style, { href: "@acusti/dropdown/Dropdown", children: STYLES });
|
|
923
|
+
$[77] = t23;
|
|
924
|
+
} else {
|
|
925
|
+
t23 = $[77];
|
|
926
|
+
}
|
|
927
|
+
const t24 = `
|
|
928
|
+
[data-ukt-id="${id}"] > :first-child {
|
|
929
|
+
anchor-name: --uktdd-anchor${id};
|
|
930
|
+
}
|
|
931
|
+
[data-ukt-id="${id}"] ${BODY_SELECTOR} {
|
|
932
|
+
position-anchor: --uktdd-anchor${id};
|
|
933
|
+
}
|
|
934
|
+
`;
|
|
935
|
+
let t25;
|
|
936
|
+
if ($[78] !== t24) {
|
|
937
|
+
t25 = /* @__PURE__ */ jsx(Style, { children: t24 });
|
|
938
|
+
$[78] = t24;
|
|
939
|
+
$[79] = t25;
|
|
940
|
+
} else {
|
|
941
|
+
t25 = $[79];
|
|
942
|
+
}
|
|
943
|
+
let t26;
|
|
944
|
+
if ($[80] !== className || $[81] !== disabled || $[82] !== isOpen || $[83] !== isSearchable) {
|
|
945
|
+
t26 = clsx(ROOT_CLASS_NAME, className, {
|
|
908
946
|
disabled,
|
|
909
947
|
"is-open": isOpen,
|
|
910
948
|
"is-searchable": isSearchable
|
|
911
949
|
});
|
|
912
|
-
$[
|
|
913
|
-
$[
|
|
914
|
-
$[
|
|
915
|
-
$[
|
|
916
|
-
$[
|
|
950
|
+
$[80] = className;
|
|
951
|
+
$[81] = disabled;
|
|
952
|
+
$[82] = isOpen;
|
|
953
|
+
$[83] = isSearchable;
|
|
954
|
+
$[84] = t26;
|
|
917
955
|
} else {
|
|
918
|
-
|
|
919
|
-
}
|
|
920
|
-
let
|
|
921
|
-
if ($[
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
"out-of-bounds-top": outOfBounds.top && !outOfBounds.bottom
|
|
929
|
-
}), ref: setDropdownBodyElement, children: childrenCount > 1 ? children[1] : children }) : null;
|
|
930
|
-
$[76] = children;
|
|
931
|
-
$[77] = childrenCount;
|
|
932
|
-
$[78] = hasItems;
|
|
933
|
-
$[79] = isOpen;
|
|
934
|
-
$[80] = outOfBounds.bottom;
|
|
935
|
-
$[81] = outOfBounds.hasLayout;
|
|
936
|
-
$[82] = outOfBounds.left;
|
|
937
|
-
$[83] = outOfBounds.right;
|
|
938
|
-
$[84] = outOfBounds.top;
|
|
939
|
-
$[85] = setDropdownBodyElement;
|
|
940
|
-
$[86] = t24;
|
|
956
|
+
t26 = $[84];
|
|
957
|
+
}
|
|
958
|
+
let t27;
|
|
959
|
+
if ($[85] !== children || $[86] !== childrenCount || $[87] !== isOpen || $[88] !== setDropdownBodyElement) {
|
|
960
|
+
t27 = isOpen ? /* @__PURE__ */ jsx("div", { className: BODY_CLASS_NAME, ref: setDropdownBodyElement, children: childrenCount > 1 ? children[1] : children }) : null;
|
|
961
|
+
$[85] = children;
|
|
962
|
+
$[86] = childrenCount;
|
|
963
|
+
$[87] = isOpen;
|
|
964
|
+
$[88] = setDropdownBodyElement;
|
|
965
|
+
$[89] = t27;
|
|
941
966
|
} else {
|
|
942
|
-
|
|
967
|
+
t27 = $[89];
|
|
943
968
|
}
|
|
944
|
-
let
|
|
945
|
-
if ($[
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
969
|
+
let t28;
|
|
970
|
+
if ($[90] !== handleMouseDown || $[91] !== handleMouseMove || $[92] !== handleMouseOut || $[93] !== handleMouseOver || $[94] !== handleMouseUp || $[95] !== handleRef || $[96] !== id || $[97] !== onClick || $[98] !== style || $[99] !== t26 || $[100] !== t27 || $[101] !== trigger) {
|
|
971
|
+
t28 = /* @__PURE__ */ jsxs("div", { className: t26, "data-ukt-id": id, onClick, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseOut: handleMouseOut, onMouseOver: handleMouseOver, onMouseUp: handleMouseUp, ref: handleRef, style, children: [
|
|
972
|
+
trigger,
|
|
973
|
+
t27
|
|
974
|
+
] });
|
|
975
|
+
$[90] = handleMouseDown;
|
|
976
|
+
$[91] = handleMouseMove;
|
|
977
|
+
$[92] = handleMouseOut;
|
|
978
|
+
$[93] = handleMouseOver;
|
|
979
|
+
$[94] = handleMouseUp;
|
|
980
|
+
$[95] = handleRef;
|
|
981
|
+
$[96] = id;
|
|
982
|
+
$[97] = onClick;
|
|
983
|
+
$[98] = style;
|
|
984
|
+
$[99] = t26;
|
|
985
|
+
$[100] = t27;
|
|
986
|
+
$[101] = trigger;
|
|
987
|
+
$[102] = t28;
|
|
988
|
+
} else {
|
|
989
|
+
t28 = $[102];
|
|
990
|
+
}
|
|
991
|
+
let t29;
|
|
992
|
+
if ($[103] !== t25 || $[104] !== t28) {
|
|
993
|
+
t29 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
994
|
+
t23,
|
|
995
|
+
t25,
|
|
996
|
+
t28
|
|
952
997
|
] });
|
|
953
|
-
$[
|
|
954
|
-
$[
|
|
955
|
-
$[
|
|
956
|
-
$[90] = handleRef;
|
|
957
|
-
$[91] = onClick;
|
|
958
|
-
$[92] = style;
|
|
959
|
-
$[93] = t23;
|
|
960
|
-
$[94] = t24;
|
|
961
|
-
$[95] = trigger;
|
|
962
|
-
$[96] = t25;
|
|
998
|
+
$[103] = t25;
|
|
999
|
+
$[104] = t28;
|
|
1000
|
+
$[105] = t29;
|
|
963
1001
|
} else {
|
|
964
|
-
|
|
1002
|
+
t29 = $[105];
|
|
1003
|
+
}
|
|
1004
|
+
return t29;
|
|
1005
|
+
}
|
|
1006
|
+
function _temp() {
|
|
1007
|
+
idCounter = idCounter >= 999999 ? 0 : idCounter + 1;
|
|
1008
|
+
return idCounter;
|
|
1009
|
+
}
|
|
1010
|
+
function getBoundingAncestor(element) {
|
|
1011
|
+
while (element == null ? void 0 : element.parentElement) {
|
|
1012
|
+
if (element.parentElement.tagName === "BODY") return element.parentElement;
|
|
1013
|
+
if (getComputedStyle(element.parentElement).overflowX !== "visible") {
|
|
1014
|
+
return element.parentElement;
|
|
1015
|
+
}
|
|
1016
|
+
element = element.parentElement;
|
|
965
1017
|
}
|
|
966
|
-
return
|
|
1018
|
+
return null;
|
|
967
1019
|
}
|
|
968
1020
|
export {
|
|
969
1021
|
Dropdown as default
|
package/dist/Dropdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../src/styles.ts","../src/helpers.ts","../src/Dropdown.tsx"],"sourcesContent":["import { SYSTEM_UI_FONT } from '@acusti/styling';\n\nexport const ROOT_CLASS_NAME = 'uktdropdown';\nexport const ROOT_SELECTOR = `.${ROOT_CLASS_NAME}`;\n\nexport const BODY_CLASS_NAME = `${ROOT_CLASS_NAME}-body`;\nexport const LABEL_CLASS_NAME = `${ROOT_CLASS_NAME}-label`;\nexport const LABEL_TEXT_CLASS_NAME = `${ROOT_CLASS_NAME}-label-text`;\nexport const TRIGGER_CLASS_NAME = `${ROOT_CLASS_NAME}-trigger`;\n\nexport const BODY_SELECTOR = `.${BODY_CLASS_NAME}`;\nexport const LABEL_SELECTOR = `.${LABEL_CLASS_NAME}`;\nexport const LABEL_TEXT_SELECTOR = `.${LABEL_TEXT_CLASS_NAME}`;\nexport const TRIGGER_SELECTOR = `.${TRIGGER_CLASS_NAME}`;\n\nexport const BODY_MAX_HEIGHT_VAR = '--uktdd-body-max-height';\nexport const BODY_MAX_WIDTH_VAR = '--uktdd-body-max-width';\n\nexport const STYLES = `\n:root {\n --uktdd-font-family: ${SYSTEM_UI_FONT};\n --uktdd-body-bg-color: #fff;\n --uktdd-body-bg-color-hover: rgb(105,162,249);\n --uktdd-body-color-hover: #fff;\n --uktdd-body-buffer: 10px;\n ${BODY_MAX_HEIGHT_VAR}: calc(100vh - var(--uktdd-body-buffer));\n ${BODY_MAX_WIDTH_VAR}: calc(100vw - var(--uktdd-body-buffer));\n --uktdd-body-pad-bottom: 9px;\n --uktdd-body-pad-left: 12px;\n --uktdd-body-pad-right: 12px;\n --uktdd-body-pad-top: 9px;\n --uktdd-label-pad-right: 10px;\n}\n${ROOT_SELECTOR},\n${TRIGGER_SELECTOR} {\n font-family: var(--uktdd-font-family);\n}\n${ROOT_SELECTOR} {\n position: relative;\n display: inline-block;\n}\n${ROOT_SELECTOR}.disabled {\n pointer-events: none;\n}\n${ROOT_SELECTOR} > * {\n cursor: default;\n}\n${LABEL_SELECTOR} {\n display: flex;\n}\n${LABEL_TEXT_SELECTOR} {\n padding-right: var(--uktdd-label-pad-right);\n}\n${BODY_SELECTOR} {\n box-sizing: border-box;\n position: absolute;\n top: 100%;\n max-height: var(${BODY_MAX_HEIGHT_VAR});\n min-height: 50px;\n max-width: var(${BODY_MAX_WIDTH_VAR});\n min-width: 100%;\n overflow: auto;\n z-index: 2;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);\n background-color: var(--uktdd-body-bg-color);\n box-shadow: 0 8px 18px rgba(0,0,0,0.25);\n}\n${BODY_SELECTOR}.calculating-position {\n visibility: hidden;\n}\n${BODY_SELECTOR}.out-of-bounds-bottom:not(.out-of-bounds-top) {\n top: auto;\n bottom: 100%;\n}\n${BODY_SELECTOR}.out-of-bounds-right:not(.out-of-bounds-left) {\n left: auto;\n right: 0px;\n}\n${LABEL_SELECTOR} + ${BODY_SELECTOR} {\n left: auto;\n right: 0;\n}\n${BODY_SELECTOR}.has-items {\n user-select: none;\n}\n${BODY_SELECTOR} [data-ukt-active] {\n background-color: var(--uktdd-body-bg-color-hover);\n color: var(--uktdd-body-color-hover);\n}\n`;\n","import { getBestMatch } from '@acusti/matchmaking';\n\nimport { BODY_SELECTOR } from './styles.js';\n\nexport const ITEM_SELECTOR = `[data-ukt-item], [data-ukt-value]`;\n\nexport const getItemElements = (dropdownElement: HTMLElement | null) => {\n if (!dropdownElement) return null;\n\n const bodyElement = dropdownElement.querySelector(BODY_SELECTOR);\n if (!bodyElement) return null;\n\n let items: HTMLCollection | NodeListOf<Element> =\n bodyElement.querySelectorAll(ITEM_SELECTOR);\n\n if (items.length) return items;\n // If no items found via [data-ukt-item] or [data-ukt-value] selector,\n // use first instance of multiple children found\n items = bodyElement.children;\n while (items.length === 1) {\n if (items[0].children == null) break;\n items = items[0].children;\n }\n // If unable to find an element with more than one child, treat direct child as items\n if (items.length === 1) {\n items = bodyElement.children;\n }\n return items;\n};\n\nexport const getActiveItemElement = (dropdownElement: HTMLElement | null) => {\n if (!dropdownElement) return null;\n return dropdownElement.querySelector('[data-ukt-active]') as HTMLElement | null;\n};\n\nconst clearItemElementsState = (itemElements: Array<HTMLElement>) => {\n itemElements.forEach((itemElement) => {\n if (itemElement.hasAttribute('data-ukt-active')) {\n delete itemElement.dataset.uktActive;\n }\n });\n};\n\nexport const setActiveItem = ({\n dropdownElement,\n element,\n index,\n indexAddend,\n isExactMatch,\n text,\n}:\n | {\n dropdownElement: HTMLElement;\n element: HTMLElement;\n index?: null;\n indexAddend?: null;\n isExactMatch?: null;\n text?: null;\n }\n | {\n dropdownElement: HTMLElement;\n element?: null;\n index: number;\n indexAddend?: null;\n isExactMatch?: null;\n text?: null;\n }\n | {\n dropdownElement: HTMLElement;\n element?: null;\n index?: null;\n indexAddend: number;\n isExactMatch?: null;\n text?: null;\n }\n | {\n dropdownElement: HTMLElement;\n element?: null;\n index?: null;\n indexAddend?: null;\n isExactMatch?: boolean;\n text: string;\n }) => {\n const items = getItemElements(dropdownElement);\n if (!items) return;\n\n const itemElements = Array.from(items) as Array<HTMLElement>;\n if (!itemElements.length) return;\n\n const lastIndex = itemElements.length - 1;\n const currentActiveIndex = itemElements.findIndex((itemElement) =>\n itemElement.hasAttribute('data-ukt-active'),\n );\n\n let nextActiveIndex = currentActiveIndex;\n if (typeof index === 'number') {\n // Negative index means count back from the end\n nextActiveIndex = index < 0 ? itemElements.length + index : index;\n }\n\n if (element) {\n nextActiveIndex = itemElements.findIndex(\n (itemElement) => itemElement === element,\n );\n } else if (typeof indexAddend === 'number') {\n // If there’s no currentActiveIndex and we are handling -1, start at lastIndex\n if (currentActiveIndex === -1 && indexAddend === -1) {\n nextActiveIndex = lastIndex;\n } else {\n nextActiveIndex += indexAddend;\n }\n // Keep it within the bounds of the items list\n if (nextActiveIndex < 0) {\n nextActiveIndex = 0;\n } else if (nextActiveIndex > lastIndex) {\n nextActiveIndex = lastIndex;\n }\n } else if (typeof text === 'string') {\n // If text is empty, clear existing active items and early return\n if (!text) {\n clearItemElementsState(itemElements);\n return;\n }\n\n const itemTexts = itemElements.map((itemElement) => itemElement.innerText);\n if (isExactMatch) {\n const textToCompare = text.toLowerCase();\n nextActiveIndex = itemTexts.findIndex((itemText) =>\n itemText.toLowerCase().startsWith(textToCompare),\n );\n // If isExactMatch is required and no exact match was found, clear active items\n if (nextActiveIndex === -1) {\n clearItemElementsState(itemElements);\n }\n } else {\n const bestMatch = getBestMatch({ items: itemTexts, text });\n nextActiveIndex = itemTexts.findIndex((itemText) => itemText === bestMatch);\n }\n }\n\n if (nextActiveIndex === -1 || nextActiveIndex === currentActiveIndex) return;\n\n // Clear any existing active dropdown body item state\n clearItemElementsState(itemElements);\n\n const nextActiveItem = items[nextActiveIndex];\n if (nextActiveItem != null) {\n nextActiveItem.setAttribute('data-ukt-active', '');\n // Find closest scrollable parent and ensure that next active item is visible\n let { parentElement } = nextActiveItem;\n let scrollableParent = null;\n while (!scrollableParent && parentElement && parentElement !== dropdownElement) {\n const isScrollable =\n parentElement.scrollHeight > parentElement.clientHeight + 15;\n if (isScrollable) {\n scrollableParent = parentElement;\n } else {\n parentElement = parentElement.parentElement;\n }\n }\n\n if (scrollableParent) {\n const parentRect = scrollableParent.getBoundingClientRect();\n const itemRect = nextActiveItem.getBoundingClientRect();\n const isAboveTop = itemRect.top < parentRect.top;\n const isBelowBottom = itemRect.bottom > parentRect.bottom;\n if (isAboveTop || isBelowBottom) {\n let { scrollTop } = scrollableParent;\n // Item isn’t fully visible; adjust scrollTop to put item within closest edge\n if (isAboveTop) {\n scrollTop -= parentRect.top - itemRect.top;\n } else {\n scrollTop += itemRect.bottom - parentRect.bottom;\n }\n scrollableParent.scrollTop = scrollTop;\n }\n }\n }\n};\n","/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/mouse-events-have-key-events, jsx-a11y/no-static-element-interactions */\nimport { Style } from '@acusti/styling';\nimport useIsOutOfBounds from '@acusti/use-is-out-of-bounds';\nimport useKeyboardEvents, {\n isEventTargetUsingKeyEvent,\n} from '@acusti/use-keyboard-events';\nimport clsx from 'clsx';\nimport * as React from 'react';\n\nimport {\n getActiveItemElement,\n getItemElements,\n ITEM_SELECTOR,\n setActiveItem,\n} from './helpers.js';\nimport {\n BODY_CLASS_NAME,\n BODY_MAX_HEIGHT_VAR,\n BODY_MAX_WIDTH_VAR,\n BODY_SELECTOR,\n LABEL_CLASS_NAME,\n LABEL_TEXT_CLASS_NAME,\n ROOT_CLASS_NAME,\n STYLES,\n TRIGGER_CLASS_NAME,\n} from './styles.js';\n\nexport type Item = {\n element: HTMLElement | null;\n event: Event | React.SyntheticEvent<HTMLElement>;\n label: string;\n value: string;\n};\n\nexport type Props = {\n /**\n * Boolean indicating if the user can submit a value not already in the\n * dropdown.\n */\n allowCreate?: boolean;\n /**\n * Boolean indicating if the user can submit an empty value (i.e. clear\n * the value). Defaults to true.\n */\n allowEmpty?: boolean;\n /**\n * Can take a single React element or exactly two renderable children.\n */\n children: ChildrenTuple | React.JSX.Element;\n className?: string;\n disabled?: boolean;\n /**\n * Group identifier string links dropdowns together into a menu\n * (like macOS top menubar).\n */\n group?: string;\n hasItems?: boolean;\n isOpenOnMount?: boolean;\n isSearchable?: boolean;\n keepOpenOnSubmit?: boolean;\n label?: string;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s name.\n */\n name?: string;\n onClick?: (event: React.MouseEvent<HTMLElement>) => unknown;\n onClose?: () => unknown;\n onMouseDown?: (event: React.MouseEvent<HTMLElement>) => unknown;\n onMouseUp?: (event: React.MouseEvent<HTMLElement>) => unknown;\n onOpen?: () => unknown;\n onSubmitItem?: (payload: Item) => void;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s placeholder.\n */\n placeholder?: string;\n style?: React.CSSProperties;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s tabIndex.\n */\n tabIndex?: number;\n /**\n * Used as search input’s value if props.isSearchable === true\n * Used to determine if value has changed to avoid triggering onSubmitItem if not\n */\n value?: string;\n};\n\ntype ChildrenTuple = [React.ReactNode, React.ReactNode];\n\ntype MousePosition = { clientX: number; clientY: number };\n\ntype TimeoutID = ReturnType<typeof setTimeout>;\n\nconst { Children, Fragment, useEffect, useRef, useState } = React;\n\nconst noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n\nconst CHILDREN_ERROR =\n '@acusti/dropdown requires either 1 child (the dropdown body) or 2 children: the dropdown trigger and the dropdown body.';\nconst TEXT_INPUT_SELECTOR =\n 'input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea';\n\nexport default function Dropdown({\n allowCreate,\n allowEmpty = true,\n children,\n className,\n disabled,\n hasItems = true,\n isOpenOnMount,\n isSearchable,\n keepOpenOnSubmit = !hasItems,\n label,\n name,\n onClick,\n onClose,\n onMouseDown,\n onMouseUp,\n onOpen,\n onSubmitItem,\n placeholder,\n style: styleFromProps,\n tabIndex,\n value,\n}: Props) {\n const childrenCount = Children.count(children);\n if (childrenCount !== 1 && childrenCount !== 2) {\n if (childrenCount === 0) {\n throw new Error(CHILDREN_ERROR + ' Received no children.');\n }\n console.error(`${CHILDREN_ERROR} Received ${childrenCount} children.`);\n }\n\n let trigger: React.ReactNode;\n if (childrenCount > 1) {\n trigger = (children as ChildrenTuple)[0];\n }\n const isTriggerFromProps = React.isValidElement(trigger);\n const [isOpen, setIsOpen] = useState<boolean>(isOpenOnMount ?? false);\n const [isOpening, setIsOpening] = useState<boolean>(!isOpenOnMount);\n const [dropdownBodyElement, setDropdownBodyElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const dropdownElementRef = useRef<HTMLDivElement | null>(null);\n const inputElementRef = useRef<HTMLInputElement | null>(null);\n const closingTimerRef = useRef<null | TimeoutID>(null);\n const isOpeningTimerRef = useRef<null | TimeoutID>(null);\n const currentInputMethodRef = useRef<'keyboard' | 'mouse'>('mouse');\n const clearEnteredCharactersTimerRef = useRef<null | TimeoutID>(null);\n const enteredCharactersRef = useRef<string>('');\n const mouseDownPositionRef = useRef<MousePosition | null>(null);\n const outOfBounds = useIsOutOfBounds(dropdownBodyElement);\n\n const allowCreateRef = useRef(allowCreate);\n const allowEmptyRef = useRef(allowEmpty);\n const hasItemsRef = useRef(hasItems);\n const isOpenRef = useRef(isOpen);\n const isOpeningRef = useRef(isOpening);\n const keepOpenOnSubmitRef = useRef(keepOpenOnSubmit);\n const onCloseRef = useRef(onClose);\n const onOpenRef = useRef(onOpen);\n const onSubmitItemRef = useRef(onSubmitItem);\n const valueRef = useRef(value);\n\n useEffect(() => {\n allowCreateRef.current = allowCreate;\n allowEmptyRef.current = allowEmpty;\n hasItemsRef.current = hasItems;\n isOpenRef.current = isOpen;\n isOpeningRef.current = isOpening;\n keepOpenOnSubmitRef.current = keepOpenOnSubmit;\n onCloseRef.current = onClose;\n onOpenRef.current = onOpen;\n onSubmitItemRef.current = onSubmitItem;\n valueRef.current = value;\n }, [\n allowCreate,\n allowEmpty,\n hasItems,\n isOpen,\n isOpening,\n keepOpenOnSubmit,\n onClose,\n onOpen,\n onSubmitItem,\n value,\n ]);\n\n const isMountedRef = useRef(false);\n\n useEffect(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n // If isOpenOnMount, trigger onOpen right away\n if (isOpenRef.current && onOpenRef.current) {\n onOpenRef.current();\n }\n return;\n }\n\n if (isOpen && onOpenRef.current) {\n onOpenRef.current();\n } else if (!isOpen && onCloseRef.current) {\n onCloseRef.current();\n }\n }, [isOpen]);\n\n const closeDropdown = () => {\n setIsOpen(false);\n setIsOpening(false);\n mouseDownPositionRef.current = null;\n if (closingTimerRef.current) {\n clearTimeout(closingTimerRef.current);\n closingTimerRef.current = null;\n }\n };\n\n const handleSubmitItem = (event: Event | React.SyntheticEvent<HTMLElement>) => {\n const eventTarget = event.target as HTMLElement;\n if (isOpenRef.current && !keepOpenOnSubmitRef.current) {\n const keepOpen = eventTarget.closest(\n '[data-ukt-keep-open]',\n ) as HTMLElement | null;\n // Don’t close dropdown if event occurs w/in data-ukt-keep-open element\n if (\n !keepOpen?.dataset.uktKeepOpen ||\n keepOpen.dataset.uktKeepOpen === 'false'\n ) {\n // A short timeout before closing is better UX when user selects an item so dropdown\n // doesn’t close before expected. It also enables using <Link />s in the dropdown body.\n closingTimerRef.current = setTimeout(closeDropdown, 90);\n }\n }\n\n if (!hasItemsRef.current) return;\n\n const element = getActiveItemElement(dropdownElementRef.current);\n if (!element && !allowCreateRef.current) {\n // If not allowEmpty, don’t allow submitting an empty item\n if (!allowEmptyRef.current) return;\n // If we have an input element as trigger & the user didn’t clear the text, do nothing\n if (inputElementRef.current?.value) return;\n }\n\n let itemLabel = element?.innerText ?? '';\n if (inputElementRef.current) {\n if (!element) {\n itemLabel = inputElementRef.current.value;\n } else {\n inputElementRef.current.value = itemLabel;\n }\n\n if (\n inputElementRef.current ===\n inputElementRef.current.ownerDocument.activeElement\n ) {\n inputElementRef.current.blur();\n }\n }\n\n const nextValue = element?.dataset.uktValue ?? itemLabel;\n // If parent is controlling Dropdown via props.value and nextValue is the same, do nothing\n if (valueRef.current && valueRef.current === nextValue) return;\n\n if (onSubmitItemRef.current) {\n onSubmitItemRef.current({\n element,\n event,\n label: itemLabel,\n value: nextValue,\n });\n }\n };\n\n const handleMouseMove = ({ clientX, clientY }: React.MouseEvent<HTMLElement>) => {\n currentInputMethodRef.current = 'mouse';\n const initialPosition = mouseDownPositionRef.current;\n if (!initialPosition) return;\n if (\n Math.abs(initialPosition.clientX - clientX) < 12 &&\n Math.abs(initialPosition.clientY - clientY) < 12\n ) {\n return;\n }\n setIsOpening(false);\n };\n\n const handleMouseOver = (event: React.MouseEvent<HTMLElement>) => {\n if (!hasItemsRef.current) return;\n\n // If user isn’t currently using the mouse to navigate the dropdown, do nothing\n if (currentInputMethodRef.current !== 'mouse') return;\n\n // Ensure we have the dropdown root HTMLElement\n const dropdownElement = dropdownElementRef.current;\n if (!dropdownElement) return;\n\n const itemElements = getItemElements(dropdownElement);\n if (!itemElements) return;\n\n const eventTarget = event.target as HTMLElement;\n const item = eventTarget.closest(ITEM_SELECTOR) as HTMLElement | null;\n const element = item ?? eventTarget;\n for (const itemElement of itemElements) {\n if (itemElement === element) {\n setActiveItem({ dropdownElement, element });\n return;\n }\n }\n };\n\n const handleMouseOut = (event: React.MouseEvent<HTMLElement>) => {\n if (!hasItemsRef.current) return;\n const activeItem = getActiveItemElement(dropdownElementRef.current);\n if (!activeItem) return;\n const eventRelatedTarget = event.relatedTarget as HTMLElement;\n if (activeItem !== event.target || activeItem.contains(eventRelatedTarget)) {\n return;\n }\n // If user moused out of activeItem (not into a descendant), it’s no longer active\n delete activeItem.dataset.uktActive;\n };\n\n const handleMouseDown = (event: React.MouseEvent<HTMLElement>) => {\n if (onMouseDown) onMouseDown(event);\n if (isOpenRef.current) return;\n\n setIsOpen(true);\n setIsOpening(true);\n mouseDownPositionRef.current = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n isOpeningTimerRef.current = setTimeout(() => {\n setIsOpening(false);\n isOpeningTimerRef.current = null;\n }, 1000);\n };\n\n const handleMouseUp = (event: React.MouseEvent<HTMLElement>) => {\n if (onMouseUp) onMouseUp(event);\n // If dropdown is still opening or isn’t open or is closing, do nothing\n if (isOpeningRef.current || !isOpenRef.current || closingTimerRef.current) {\n return;\n }\n\n const eventTarget = event.target as HTMLElement;\n // If click was outside dropdown body, don’t trigger submit\n if (!eventTarget.closest(BODY_SELECTOR)) {\n // Don’t close dropdown if isOpening or search input is focused\n if (\n !isOpeningRef.current &&\n inputElementRef.current !== eventTarget.ownerDocument.activeElement\n ) {\n closeDropdown();\n }\n return;\n }\n\n // If dropdown has no items and click was within dropdown body, do nothing\n if (!hasItemsRef.current) return;\n\n handleSubmitItem(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const { altKey, ctrlKey, key, metaKey } = event;\n const eventTarget = event.target as HTMLElement;\n const dropdownElement = dropdownElementRef.current;\n if (!dropdownElement) return;\n\n const onEventHandled = () => {\n event.stopPropagation();\n event.preventDefault();\n currentInputMethodRef.current = 'keyboard';\n };\n\n const isEventTargetingDropdown = dropdownElement.contains(eventTarget);\n\n if (!isOpenRef.current) {\n // If dropdown is closed, don’t handle key events if event target isn’t within dropdown\n if (!isEventTargetingDropdown) return;\n // Open the dropdown on spacebar, enter, or if isSearchable and user hits the ↑/↓ arrows\n if (\n key === ' ' ||\n key === 'Enter' ||\n (hasItemsRef.current && (key === 'ArrowUp' || key === 'ArrowDown'))\n ) {\n onEventHandled();\n setIsOpen(true);\n }\n return;\n }\n\n const isTargetUsingKeyEvents = isEventTargetUsingKeyEvent(event);\n\n // If dropdown isOpen + hasItems & eventTargetNotUsingKeyEvents, handle characters\n if (hasItemsRef.current && !isTargetUsingKeyEvents) {\n let isEditingCharacters = !ctrlKey && !metaKey && /^[A-Za-z0-9]$/.test(key);\n // User could also be editing characters if there are already characters entered\n // and they are hitting delete or spacebar\n if (!isEditingCharacters && enteredCharactersRef.current) {\n isEditingCharacters = key === ' ' || key === 'Backspace';\n }\n\n if (isEditingCharacters) {\n onEventHandled();\n if (key === 'Backspace') {\n enteredCharactersRef.current = enteredCharactersRef.current.slice(\n 0,\n -1,\n );\n } else {\n enteredCharactersRef.current += key;\n }\n\n setActiveItem({\n dropdownElement,\n // If props.allowCreate, only override the input’s value with an\n // exact text match so user can enter a value not in items\n isExactMatch: allowCreateRef.current,\n text: enteredCharactersRef.current,\n });\n\n if (clearEnteredCharactersTimerRef.current) {\n clearTimeout(clearEnteredCharactersTimerRef.current);\n }\n\n clearEnteredCharactersTimerRef.current = setTimeout(() => {\n enteredCharactersRef.current = '';\n clearEnteredCharactersTimerRef.current = null;\n }, 1500);\n\n return;\n }\n }\n\n // If dropdown isOpen, handle submitting the value\n if (key === 'Enter' || (key === ' ' && !inputElementRef.current)) {\n onEventHandled();\n handleSubmitItem(event);\n return;\n }\n\n // If dropdown isOpen, handle closing it on escape or spacebar if !hasItems\n if (\n key === 'Escape' ||\n (isEventTargetingDropdown && key === ' ' && !hasItemsRef.current)\n ) {\n // Close dropdown if hasItems or event target not using key events\n if (hasItemsRef.current || !isTargetUsingKeyEvents) {\n closeDropdown();\n }\n return;\n }\n\n // Handle ↑/↓ arrows\n if (hasItemsRef.current) {\n if (key === 'ArrowUp') {\n onEventHandled();\n if (altKey || metaKey) {\n setActiveItem({ dropdownElement, index: 0 });\n } else {\n setActiveItem({ dropdownElement, indexAddend: -1 });\n }\n return;\n }\n if (key === 'ArrowDown') {\n onEventHandled();\n if (altKey || metaKey) {\n // Using a negative index counts back from the end\n setActiveItem({ dropdownElement, index: -1 });\n } else {\n setActiveItem({ dropdownElement, indexAddend: 1 });\n }\n return;\n }\n }\n };\n\n useKeyboardEvents({ ignoreUsedKeyboardEvents: false, onKeyDown: handleKeyDown });\n\n const cleanupEventListenersRef = useRef<() => void>(noop);\n\n const handleRef = (ref: HTMLDivElement | null) => {\n dropdownElementRef.current = ref;\n if (!ref) {\n // If component was unmounted, cleanup handlers\n cleanupEventListenersRef.current();\n cleanupEventListenersRef.current = noop;\n return;\n }\n\n const { ownerDocument } = ref;\n let inputElement = inputElementRef.current;\n // Check if trigger from props is a textual input or textarea element\n if (isTriggerFromProps && !inputElement && ref.firstElementChild) {\n if (ref.firstElementChild.matches(TEXT_INPUT_SELECTOR)) {\n inputElement = ref.firstElementChild as HTMLInputElement;\n } else {\n inputElement = ref.firstElementChild.querySelector(TEXT_INPUT_SELECTOR);\n }\n inputElementRef.current = inputElement;\n }\n\n const handleGlobalMouseDown = ({ target }: MouseEvent) => {\n const eventTarget = target as HTMLElement;\n if (\n dropdownElementRef.current &&\n !dropdownElementRef.current.contains(eventTarget)\n ) {\n // Close dropdown on an outside click\n closeDropdown();\n }\n };\n\n const handleGlobalMouseUp = ({ target }: MouseEvent) => {\n if (!isOpenRef.current || closingTimerRef.current) return;\n\n // If still isOpening (gets set false 1s after open triggers), set it to false onMouseUp\n if (isOpeningRef.current) {\n setIsOpening(false);\n if (isOpeningTimerRef.current) {\n clearTimeout(isOpeningTimerRef.current);\n isOpeningTimerRef.current = null;\n }\n return;\n }\n\n const eventTarget = target as HTMLElement;\n // Only handle mouseup events from outside the dropdown here\n if (!dropdownElementRef.current?.contains(eventTarget)) {\n closeDropdown();\n }\n };\n\n // Close dropdown if any element is focused outside of this dropdown\n const handleGlobalFocusIn = ({ target }: Event) => {\n if (!isOpenRef.current) return;\n\n const eventTarget = target as HTMLElement;\n // If focused element is a descendant or a parent of the dropdown, do nothing\n if (\n !dropdownElementRef.current ||\n dropdownElementRef.current.contains(eventTarget) ||\n eventTarget.contains(dropdownElementRef.current)\n ) {\n return;\n }\n\n closeDropdown();\n };\n\n document.addEventListener('focusin', handleGlobalFocusIn);\n document.addEventListener('mousedown', handleGlobalMouseDown);\n document.addEventListener('mouseup', handleGlobalMouseUp);\n\n if (ownerDocument !== document) {\n ownerDocument.addEventListener('focusin', handleGlobalFocusIn);\n ownerDocument.addEventListener('mousedown', handleGlobalMouseDown);\n ownerDocument.addEventListener('mouseup', handleGlobalMouseUp);\n }\n\n // If dropdown should be open on mount, focus it\n if (isOpenOnMount) {\n ref.focus();\n }\n\n const handleInput = (event: Event) => {\n const dropdownElement = dropdownElementRef.current;\n if (!dropdownElement) return;\n\n if (!isOpenRef.current) setIsOpen(true);\n\n const input = event.target as HTMLInputElement;\n const isDeleting = enteredCharactersRef.current.length > input.value.length;\n enteredCharactersRef.current = input.value;\n // When deleting text, if there’s already an active item and\n // input isn’t empty, preserve the active item, else update it\n if (\n isDeleting &&\n input.value.length &&\n getActiveItemElement(dropdownElement)\n ) {\n return;\n }\n\n setActiveItem({\n dropdownElement,\n // If props.allowCreate, only override the input’s value with an\n // exact text match so user can enter a value not in items\n isExactMatch: allowCreateRef.current,\n text: enteredCharactersRef.current,\n });\n };\n\n if (inputElement) {\n inputElement.addEventListener('input', handleInput);\n }\n\n cleanupEventListenersRef.current = () => {\n document.removeEventListener('focusin', handleGlobalFocusIn);\n document.removeEventListener('mousedown', handleGlobalMouseDown);\n document.removeEventListener('mouseup', handleGlobalMouseUp);\n\n if (ownerDocument !== document) {\n ownerDocument.removeEventListener('focusin', handleGlobalFocusIn);\n ownerDocument.removeEventListener('mousedown', handleGlobalMouseDown);\n ownerDocument.removeEventListener('mouseup', handleGlobalMouseUp);\n }\n\n if (inputElement) {\n inputElement.removeEventListener('input', handleInput);\n }\n };\n };\n\n if (!isTriggerFromProps) {\n if (isSearchable) {\n trigger = (\n <input\n autoComplete=\"off\"\n className={TRIGGER_CLASS_NAME}\n defaultValue={value ?? ''}\n disabled={disabled}\n name={name}\n onFocus={() => setIsOpen(true)}\n placeholder={placeholder}\n ref={inputElementRef}\n tabIndex={tabIndex}\n type=\"text\"\n />\n );\n } else {\n trigger = (\n <button className={TRIGGER_CLASS_NAME} tabIndex={0}>\n {trigger}\n </button>\n );\n }\n }\n\n if (label) {\n trigger = (\n <label className={LABEL_CLASS_NAME}>\n <div className={LABEL_TEXT_CLASS_NAME}>{label}</div>\n {trigger}\n </label>\n );\n }\n\n const style = {\n ...styleFromProps,\n ...(outOfBounds.maxHeight != null && outOfBounds.maxHeight > 0\n ? {\n [BODY_MAX_HEIGHT_VAR]: `calc(${outOfBounds.maxHeight}px - var(--uktdd-body-buffer))`,\n }\n : null),\n ...(outOfBounds.maxWidth != null && outOfBounds.maxWidth > 0\n ? {\n [BODY_MAX_WIDTH_VAR]: `calc(${outOfBounds.maxWidth}px - var(--uktdd-body-buffer))`,\n }\n : null),\n };\n\n return (\n <Fragment>\n <Style href=\"@acusti/dropdown/Dropdown\">{STYLES}</Style>\n <div\n className={clsx(ROOT_CLASS_NAME, className, {\n disabled,\n 'is-open': isOpen,\n 'is-searchable': isSearchable,\n })}\n onClick={onClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseOut={handleMouseOut}\n onMouseOver={handleMouseOver}\n onMouseUp={handleMouseUp}\n ref={handleRef}\n style={style}\n >\n {trigger}\n {isOpen ? (\n <div\n className={clsx(BODY_CLASS_NAME, {\n 'calculating-position': !outOfBounds.hasLayout,\n 'has-items': hasItems,\n 'out-of-bounds-bottom':\n outOfBounds.bottom && !outOfBounds.top,\n 'out-of-bounds-left': outOfBounds.left && !outOfBounds.right,\n 'out-of-bounds-right': outOfBounds.right && !outOfBounds.left,\n 'out-of-bounds-top': outOfBounds.top && !outOfBounds.bottom,\n })}\n ref={setDropdownBodyElement}\n >\n {childrenCount > 1 ? (children as ChildrenTuple)[1] : children}\n </div>\n ) : null}\n </div>\n </Fragment>\n );\n}\n"],"names":["ROOT_CLASS_NAME","ROOT_SELECTOR","BODY_CLASS_NAME","LABEL_CLASS_NAME","LABEL_TEXT_CLASS_NAME","TRIGGER_CLASS_NAME","BODY_SELECTOR","LABEL_SELECTOR","LABEL_TEXT_SELECTOR","TRIGGER_SELECTOR","BODY_MAX_HEIGHT_VAR","BODY_MAX_WIDTH_VAR","STYLES","SYSTEM_UI_FONT","ITEM_SELECTOR","getItemElements","dropdownElement","bodyElement","querySelector","items","querySelectorAll","length","children","getActiveItemElement","clearItemElementsState","itemElements","forEach","itemElement","hasAttribute","dataset","uktActive","setActiveItem","element","index","indexAddend","isExactMatch","text","Array","from","lastIndex","currentActiveIndex","findIndex","nextActiveIndex","itemTexts","map","innerText","textToCompare","toLowerCase","itemText","startsWith","bestMatch","getBestMatch","nextActiveItem","setAttribute","parentElement","scrollableParent","isScrollable","scrollHeight","clientHeight","parentRect","getBoundingClientRect","itemRect","isAboveTop","top","isBelowBottom","bottom","scrollTop","Children","Fragment","useEffect","useRef","useState","React","noop","CHILDREN_ERROR","TEXT_INPUT_SELECTOR","Dropdown","t0","$","_c","allowCreate","allowEmpty","t1","className","disabled","hasItems","t2","isOpenOnMount","isSearchable","keepOpenOnSubmit","t3","label","name","onClick","onClose","onMouseDown","onMouseUp","onOpen","onSubmitItem","placeholder","style","styleFromProps","tabIndex","value","undefined","childrenCount","count","Error","console","error","trigger","t4","isValidElement","isTriggerFromProps","isOpen","setIsOpen","isOpening","setIsOpening","dropdownBodyElement","setDropdownBodyElement","dropdownElementRef","inputElementRef","closingTimerRef","isOpeningTimerRef","currentInputMethodRef","clearEnteredCharactersTimerRef","enteredCharactersRef","mouseDownPositionRef","outOfBounds","useIsOutOfBounds","allowCreateRef","allowEmptyRef","hasItemsRef","isOpenRef","isOpeningRef","keepOpenOnSubmitRef","onCloseRef","onOpenRef","onSubmitItemRef","valueRef","t5","t6","current","isMountedRef","t7","t8","t9","clearTimeout","closeDropdown","t10","event","eventTarget","target","keepOpen","closest","uktKeepOpen","setTimeout","itemLabel","ownerDocument","activeElement","blur","nextValue","uktValue","handleSubmitItem","t11","t12","clientX","clientY","initialPosition","Math","abs","handleMouseMove","Symbol","for","event_0","eventTarget_0","item","element_0","handleMouseOver","t13","event_1","activeItem","eventRelatedTarget","relatedTarget","contains","handleMouseOut","t14","event_2","handleMouseDown","t15","event_3","eventTarget_1","handleMouseUp","t16","event_4","altKey","ctrlKey","key","metaKey","eventTarget_2","dropdownElement_0","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEventTargetUsingKeyEvent","isEditingCharacters","test","slice","handleKeyDown","t17","ignoreUsedKeyboardEvents","onKeyDown","useKeyboardEvents","cleanupEventListenersRef","t18","ref","inputElement","firstElementChild","matches","handleGlobalMouseDown","t19","eventTarget_3","handleGlobalMouseUp","t20","target_0","eventTarget_4","handleGlobalFocusIn","t21","target_1","eventTarget_5","addEventListener","document","focus","handleInput","event_5","dropdownElement_1","input","isDeleting","removeEventListener","handleRef","maxHeight","maxWidth","t22","t23","clsx","t24","hasLayout","left","right","t25"],"mappings":";;;;;;;;AAEO,MAAMA,kBAAkB;AAClBC,MAAAA,gBAAgB,IAAID,eAAe;AAEnCE,MAAAA,kBAAkB,GAAGF,eAAe;AACpCG,MAAAA,mBAAmB,GAAGH,eAAe;AACrCI,MAAAA,wBAAwB,GAAGJ,eAAe;AAC1CK,MAAAA,qBAAqB,GAAGL,eAAe;AAEvCM,MAAAA,gBAAgB,IAAIJ,eAAe;AACnCK,MAAAA,iBAAiB,IAAIJ,gBAAgB;AACrCK,MAAAA,sBAAsB,IAAIJ,qBAAqB;AAC/CK,MAAAA,mBAAmB,IAAIJ,kBAAkB;AAE/C,MAAMK,sBAAsB;AAC5B,MAAMC,qBAAqB;AAE3B,MAAMC,SAAS;AAAA;AAAA,yBAEGC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,IAKnCH,mBAAmB;AAAA,IACnBC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpBV,aAAa;AAAA,EACbQ,gBAAgB;AAAA;AAAA;AAAA,EAGhBR,aAAa;AAAA;AAAA;AAAA;AAAA,EAIbA,aAAa;AAAA;AAAA;AAAA,EAGbA,aAAa;AAAA;AAAA;AAAA,EAGbM,cAAc;AAAA;AAAA;AAAA,EAGdC,mBAAmB;AAAA;AAAA;AAAA,EAGnBF,aAAa;AAAA;AAAA;AAAA;AAAA,oBAIKI,mBAAmB;AAAA;AAAA,mBAEpBC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnCL,aAAa;AAAA;AAAA;AAAA,EAGbA,aAAa;AAAA;AAAA;AAAA;AAAA,EAIbA,aAAa;AAAA;AAAA;AAAA;AAAA,EAIbC,cAAc,MAAMD,aAAa;AAAA;AAAA;AAAA;AAAA,EAIjCA,aAAa;AAAA;AAAA;AAAA,EAGbA,aAAa;AAAA;AAAA;AAAA;AAAA;ACjFR,MAAMQ,gBAAgB;AAEhBC,MAAAA,kBAAkBA,CAACC,oBAAwC;AAChE,MAAA,CAACA,gBAAwB,QAAA;AAEvBC,QAAAA,cAAcD,gBAAgBE,cAAcZ,aAAa;AAC3D,MAAA,CAACW,YAAoB,QAAA;AAErBE,MAAAA,QACAF,YAAYG,iBAAiBN,aAAa;AAE1CK,MAAAA,MAAME,OAAeF,QAAAA;AAGzBA,UAAQF,YAAYK;AACbH,SAAAA,MAAME,WAAW,GAAG;AACvB,QAAIF,MAAM,CAAC,EAAEG,YAAY,KAAM;AACvBH,YAAAA,MAAM,CAAC,EAAEG;AAAAA,EAAAA;AAGjBH,MAAAA,MAAME,WAAW,GAAG;AACpBF,YAAQF,YAAYK;AAAAA,EAAAA;AAEjBH,SAAAA;AACX;AAEaI,MAAAA,uBAAuBA,CAACP,oBAAwC;AACrE,MAAA,CAACA,gBAAwB,QAAA;AACtBA,SAAAA,gBAAgBE,cAAc,mBAAmB;AAC5D;AAEA,MAAMM,yBAAyBA,CAACC,iBAAqC;AACjEA,eAAaC,QAASC,CAAgB,gBAAA;AAC9BA,QAAAA,YAAYC,aAAa,iBAAiB,GAAG;AAC7C,aAAOD,YAAYE,QAAQC;AAAAA,IAAAA;AAAAA,EAC/B,CACH;AACL;AAEO,MAAMC,gBAAgBA,CAAC;AAAA,EAC1Bf;AAAAA,EACAgB;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAiCE,MAAM;AACFjB,QAAAA,QAAQJ,gBAAgBC,eAAe;AAC7C,MAAI,CAACG,MAAO;AAENM,QAAAA,eAAeY,MAAMC,KAAKnB,KAAK;AACjC,MAAA,CAACM,aAAaJ,OAAQ;AAEpBkB,QAAAA,YAAYd,aAAaJ,SAAS;AACxC,QAAMmB,qBAAqBf,aAAagB,UAAWd,iBAC/CA,YAAYC,aAAa,iBAAiB,CAC9C;AAEA,MAAIc,kBAAkBF;AAClB,MAAA,OAAOP,UAAU,UAAU;AAE3BS,sBAAkBT,QAAQ,IAAIR,aAAaJ,SAASY,QAAQA;AAAAA,EAAAA;AAGhE,MAAID,SAAS;AACTU,sBAAkBjB,aAAagB,UAC1Bd,CAAgBA,gBAAAA,gBAAgBK,OACrC;AAAA,EAAA,WACO,OAAOE,gBAAgB,UAAU;AAEpCM,QAAAA,uBAAuB,MAAMN,gBAAgB,IAAI;AAC/BK,wBAAAA;AAAAA,IAAAA,OACf;AACgBL,yBAAAA;AAAAA,IAAAA;AAGvB,QAAIQ,kBAAkB,GAAG;AACH,wBAAA;AAAA,IAAA,WACXA,kBAAkBH,WAAW;AAClBA,wBAAAA;AAAAA,IAAAA;AAAAA,EACtB,WACO,OAAOH,SAAS,UAAU;AAEjC,QAAI,CAACA,MAAM;AACPZ,6BAAuBC,YAAY;AACnC;AAAA,IAAA;AAGJ,UAAMkB,YAAYlB,aAAamB,IAAKjB,CAAAA,gBAAgBA,YAAYkB,SAAS;AACzE,QAAIV,cAAc;AACRW,YAAAA,gBAAgBV,KAAKW,YAAY;AACrBJ,wBAAAA,UAAUF,UAAWO,CACnCA,aAAAA,SAASD,YAAcE,EAAAA,WAAWH,aAAa,CACnD;AAEA,UAAIJ,oBAAoB,IAAI;AACxBlB,+BAAuBC,YAAY;AAAA,MAAA;AAAA,IACvC,OACG;AACH,YAAMyB,YAAYC,aAAa;AAAA,QAAEhC,OAAOwB;AAAAA,QAAWP;AAAAA,MAAAA,CAAM;AACzDM,wBAAkBC,UAAUF,UAAWO,CAAaA,aAAAA,aAAaE,SAAS;AAAA,IAAA;AAAA,EAC9E;AAGAR,MAAAA,oBAAoB,MAAMA,oBAAoBF,mBAAoB;AAGtEhB,yBAAuBC,YAAY;AAE7B2B,QAAAA,iBAAiBjC,MAAMuB,eAAe;AAC5C,MAAIU,kBAAkB,MAAM;AACTC,mBAAAA,aAAa,mBAAmB,EAAE;AAE7C,QAAA;AAAA,MAAEC;AAAAA,IAAAA,IAAkBF;AACxB,QAAIG,mBAAmB;AACvB,WAAO,CAACA,oBAAoBD,iBAAiBA,kBAAkBtC,iBAAiB;AAC5E,YAAMwC,eACFF,cAAcG,eAAeH,cAAcI,eAAe;AAC9D,UAAIF,cAAc;AACKF,2BAAAA;AAAAA,MAAAA,OAChB;AACHA,wBAAgBA,cAAcA;AAAAA,MAAAA;AAAAA,IAClC;AAGJ,QAAIC,kBAAkB;AACZI,YAAAA,aAAaJ,iBAAiBK,sBAAsB;AACpDC,YAAAA,WAAWT,eAAeQ,sBAAsB;AAChDE,YAAAA,aAAaD,SAASE,MAAMJ,WAAWI;AACvCC,YAAAA,gBAAgBH,SAASI,SAASN,WAAWM;AACnD,UAAIH,cAAcE,eAAe;AACzB,YAAA;AAAA,UAAEE;AAAAA,QAAAA,IAAcX;AAEpB,YAAIO,YAAY;AACCH,uBAAAA,WAAWI,MAAMF,SAASE;AAAAA,QAAAA,OACpC;AACUF,uBAAAA,SAASI,SAASN,WAAWM;AAAAA,QAAAA;AAE9CV,yBAAiBW,YAAYA;AAAAA,MAAAA;AAAAA,IACjC;AAAA,EACJ;AAER;AClFA,MAAM;AAAA,EAAEC;AAAAA,EAAUC;AAAAA,EAAUC;AAAAA,EAAWC;AAAAA,EAAQC;AAAS,IAAIC;AAE5D,MAAMC,OAAOA,MAAM;AAAC;AAEpB,MAAMC,iBACF;AACJ,MAAMC,sBACF;AAEJ,SAAeC,SAAAC,IAAA;AAAAC,QAAAA,IAAAC,EAAA,EAAA;AAAkB,QAAA;AAAA,IAAAC;AAAAA,IAAAC,YAAAC;AAAAA,IAAA5D;AAAAA,IAAA6D;AAAAA,IAAAC;AAAAA,IAAAC,UAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC,kBAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC,OAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAA1B;AAE7BI,QAAAA,aAAAC,OAAiBsB,gBAAjBtB;AAIAG,QAAAA,WAAAC,OAAekB,gBAAflB;AAGA,QAAAG,mBAAAC,OAA4Bc,SAARnB,CAAAA,WAApBK;AAcAe,QAAAA,gBAAsBtC,SAAAuC,MAAepF,QAAQ;AACzCmF,MAAAA,kBAAa,KAAUA,kBAAmB,GAAA;AAAA,QACtCA,kBAAmB,GAAA;AAAA,YAAA,IAAAE,MACHjC,iBAAiB,wBAAwB;AAAA,IAAA;AAE7DkC,YAAAC,MAAc,GAAAnC,cAAA,aAA8B+B,aAAa,YAAY;AAAA,EAAA;AAGrEK,MAAAA;AAAwB,MACxBL,gBAAiB,GAAA;AACjBK,cAAWxF,SAAyB,CAAA;AAAA,EAAA;AAA7ByF,MAAAA;AAAAjC,MAAAA,SAAAgC,SAAA;AAEgBtC,SAAAA,MAAAwC,eAAqBF,OAAO;AAAChC,WAAAgC;AAAAhC,WAAAiC;AAAAA,EAAAA,OAAA;AAAAA,SAAAjC,EAAA,CAAA;AAAA,EAAA;AAAxD,QAAAmC,qBAA2BF;AAC3B,QAAAG,CAAAA,QAAAC,SAAA,IAA4B5C,SAAkBgB,sBAAsB;AACpE,QAAA,CAAA6B,WAAAC,YAAA,IAAkC9C,SAAA,CAAmBgB,aAAa;AAClE,QAAA,CAAA+B,qBAAAC,sBAAA,IAAsDhD,aAEtD;AAEAiD,QAAAA,qBAA2BlD,OAAA,IAAkC;AAC7DmD,QAAAA,kBAAwBnD,OAAA,IAAoC;AAC5DoD,QAAAA,kBAAwBpD,OAAA,IAA6B;AACrDqD,QAAAA,oBAA0BrD,OAAA,IAA6B;AACvDsD,QAAAA,wBAA8BtD,OAA6B,OAAO;AAClEuD,QAAAA,iCAAuCvD,OAAA,IAA6B;AACpEwD,QAAAA,uBAA6BxD,OAAe,EAAE;AAC9CyD,QAAAA,uBAA6BzD,OAAA,IAAiC;AAC9D0D,QAAAA,cAAoBC,iBAAiBX,mBAAmB;AAExDY,QAAAA,iBAAuB5D,OAAOU,WAAW;AACzCmD,QAAAA,gBAAsB7D,OAAOW,UAAU;AACvCmD,QAAAA,cAAoB9D,OAAOe,QAAQ;AACnCgD,QAAAA,YAAkB/D,OAAO4C,MAAM;AAC/BoB,QAAAA,eAAqBhE,OAAO8C,SAAS;AACrCmB,QAAAA,sBAA4BjE,OAAOmB,gBAAgB;AACnD+C,QAAAA,aAAmBlE,OAAOwB,OAAO;AACjC2C,QAAAA,YAAkBnE,OAAO2B,MAAM;AAC/ByC,QAAAA,kBAAwBpE,OAAO4B,YAAY;AAC3CyC,QAAAA,WAAiBrE,OAAOiC,KAAK;AAAEqC,MAAAA;AAAAC,MAAAA;AAAA,MAAA/D,EAAAE,CAAAA,MAAAA,eAAAF,SAAAG,cAAAH,EAAA,CAAA,MAAAO,YAAAP,SAAAoC,UAAApC,EAAAsC,CAAAA,MAAAA,aAAAtC,SAAAW,oBAAAX,EAAA,CAAA,MAAAgB,WAAAhB,EAAAmB,CAAAA,MAAAA,UAAAnB,EAAA,EAAA,MAAAoB,gBAAApB,UAAAyB,OAAA;AAErBqC,SAAAA,MAAA;AACNV,qBAAcY,UAAW9D;AACzBmD,oBAAaW,UAAW7D;AACxBmD,kBAAWU,UAAWzD;AACtBgD,gBAASS,UAAW5B;AACpBoB,mBAAYQ,UAAW1B;AACvBmB,0BAAmBO,UAAWrD;AAC9B+C,iBAAUM,UAAWhD;AACrB2C,gBAASK,UAAW7C;AACpByC,sBAAeI,UAAW5C;AAC1ByC,eAAQG,UAAWvC;AAAAA,IAAK;UAExBvB,aACAC,YACAI,UACA6B,QACAE,WACA3B,kBACAK,SACAG,QACAC,cACAK,KAAK;AACRzB,WAAAE;AAAAF,WAAAG;AAAAH,WAAAO;AAAAP,WAAAoC;AAAApC,WAAAsC;AAAAtC,WAAAW;AAAAX,WAAAgB;AAAAhB,WAAAmB;AAAAnB,YAAAoB;AAAApB,YAAAyB;AAAAzB,YAAA8D;AAAA9D,YAAA+D;AAAAA,EAAAA,OAAA;AAAAD,SAAA9D,EAAA,EAAA;AAAA+D,SAAA/D,EAAA,EAAA;AAAA,EAAA;AAtBDT,YAAUuE,IAWPC,EAWF;AAEDE,QAAAA,eAAqBzE,OAAA,KAAY;AAAE0E,MAAAA;AAAAC,MAAAA;AAAAnE,MAAAA,UAAAoC,QAAA;AAEzB8B,SAAAA,MAAA;AACDD,UAAAA,CAAAA,aAAYD,SAAA;AACbC,qBAAYD,UAAA;AAERT,YAAAA,UAASS,WAAYL,UAASK,SAAQ;AACtCL,oBAASK,QAAS;AAAA,QAAA;AAAC;AAAA,MAAA;AAKvB5B,UAAAA,UAAUuB,UAASK,SAAQ;AAC3BL,kBAASK,QAAS;AAAA,MAAA,OAAC;AACZ,YAAA,CAAC5B,UAAUsB,WAAUM,SAAQ;AACpCN,qBAAUM,QAAS;AAAA,QAAA;AAAA,MAAC;AAAA,IAAA;AAEzBG,UAAC/B,MAAM;AAACpC,YAAAoC;AAAApC,YAAAkE;AAAAlE,YAAAmE;AAAAA,EAAAA,OAAA;AAAAD,SAAAlE,EAAA,EAAA;AAAAmE,SAAAnE,EAAA,EAAA;AAAA,EAAA;AAfXT,YAAU2E,IAePC,EAAQ;AAACC,MAAAA;AAAA,MAAApE,EAAAqC,EAAAA,MAAAA,aAAArC,UAAAuC,cAAA;AAEU6B,SAAAA,MAAA;AAClB/B,qBAAe;AACfE,wBAAkB;AAClBU,2BAAoBe,UAAA;AAAA,UAChBpB,gBAAeoB,SAAA;AACfK,qBAAazB,gBAAeoB,OAAQ;AACpCpB,wBAAeoB,UAAA;AAAA,MAAA;AAAA,IAAA;AAEtBhE,YAAAqC;AAAArC,YAAAuC;AAAAvC,YAAAoE;AAAAA,EAAAA,OAAA;AAAAA,SAAApE,EAAA,EAAA;AAAA,EAAA;AARD,QAAAsE,gBAAsBF;AAQpBG,MAAAA;AAAAvE,MAAAA,UAAAsE,eAAA;AAEuBC,UAAAC,CAAA,UAAA;;AACrB,YAAAC,cAAoBD,MAAKE;AAAuB,UAC5CnB,UAASS,WAAaP,CAAAA,oBAAmBO,SAAQ;AACjDW,cAAAA,WAAiBF,YAAWG,QACxB,sBACJ;AAAwB,YAGpB,EAACD,qCAAQ5H,QAAA8H,gBACTF,SAAQ5H,QAAA8H,gBAAyB,SAAO;AAIzBb,0BAAAA,UAAWc,WAAWR,iBAAiB;AAAA,QAAA;AAAA,MAAC;AAI1DhB,UAAAA,CAAAA,YAAWU,SAAA;AAAA;AAAA,MAAA;AAEhB9G,YAAAA,UAAgBT,qBAAqBiG,mBAAkBsB,OAAQ;AAAE,UAC7D,CAAC9G,WAAYkG,CAAAA,eAAcY,SAAQ;AAE9BX,YAAAA,CAAAA,cAAaW,SAAA;AAAA;AAAA,QAAA;AAEdrB,aAAAA,qBAAeqB,YAAfrB,mBAAelB,OAAA;AAAA;AAAA,QAAA;AAAA,MAAA;AAGvBsD,UAAAA,aAAgB7H,mCAAOa,cAAe;AAAG,UACrC4E,gBAAeqB,SAAA;AAAA,YAAA,CACV9G,SAAO;AACR6H,sBAAYpC,gBAAeqB,QAAAvC;AAAAA,QAAAA,OAAlB;AAETkB,0BAAeqB,QAAAvC,QAAiBsD;AAAAA,QAAAA;AAAS,YAIzCpC,gBAAeqB,YACfrB,gBAAeqB,QAAAgB,cAAAC,eAAoC;AAEnDtC,0BAAeqB,QAAAkB,KAAc;AAAA,QAAA;AAAA,MAAC;AAItCC,YAAAA,aAAkBjI,mCAAOH,QAAAqI,aAAsBL;AAAU,UAErDlB,SAAQG,WAAYH,SAAQG,YAAamB,WAAS;AAAA;AAAA,MAAA;AAAA,UAElDvB,gBAAeI,SAAA;AACfJ,wBAAeI,QAAA;AAAA,UAAA9G;AAAAA,UAAAsH;AAAAA,UAAA3D,OAGJkE;AAAAA,UAAStD,OACT0D;AAAAA,QAAAA,CACV;AAAA,MAAA;AAAA,IAAC;AAETnF,YAAAsE;AAAAtE,YAAAuE;AAAAA,EAAAA,OAAA;AAAAA,UAAAvE,EAAA,EAAA;AAAA,EAAA;AAvDD,QAAAqF,mBAAyBd;AAuDvBe,MAAAA;AAAAtF,MAAAA,UAAAuC,cAAA;AAEsB+C,UAAAC,CAAAA,SAAA;AAAC,YAAA;AAAA,QAAAC;AAAAA,QAAAC;AAAAA,MAAAA,IAAAF;AACrBzC,4BAAqBkB,UAAW;AAChC,YAAA0B,kBAAwBzC,qBAAoBe;AAAS,UAAA,CAChD0B,iBAAe;AAAA;AAAA,MAAA;AAAA,UAEhBC,KAAAC,IAASF,gBAAeF,UAAWA,OAAO,IAAC,MAC3CG,KAAAC,IAASF,gBAAeD,UAAWA,OAAO,IAAM,IAAA;AAAA;AAAA,MAAA;AAIpDlD,wBAAkB;AAAA,IAAC;AACtBvC,YAAAuC;AAAAvC,YAAAsF;AAAAA,EAAAA,OAAA;AAAAA,UAAAtF,EAAA,EAAA;AAAA,EAAA;AAXD,QAAA6F,kBAAwBP;AAWtBC,MAAAA;AAAA,MAAAvF,EAAA,EAAA,MAAA8F,OAAAC,IAAA,2BAAA,GAAA;AAEsBR,UAAAS,CAAA,YAAA;AACf1C,UAAAA,CAAAA,YAAWU,SAAA;AAAA;AAAA,MAAA;AAGZlB,UAAAA,sBAAqBkB,YAAa,SAAO;AAAA;AAAA,MAAA;AAG7C,YAAA9H,kBAAwBwG,mBAAkBsB;AAAS,UAAA,CAC9C9H,iBAAe;AAAA;AAAA,MAAA;AAEpBS,YAAAA,eAAqBV,gBAAgBC,eAAe;AAAE,UAAA,CACjDS,cAAY;AAAA;AAAA,MAAA;AAEjB,YAAAsJ,gBAAoBzB,QAAKE;AACzBwB,YAAAA,OAAazB,cAAWG,QAAA5I,aAAsB;AAC9C,YAAAmK,YAAgBD,QAAQzB;AAAY,iBAC/B5H,eAAqBF,cAAY;AAAA,YAC9BE,gBAAgBK,WAAO;AACvB,wBAAA;AAAA,YAAAhB;AAAAA,YAAAgB,SAAiCA;AAAAA,UAAAA,CAAS;AAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAItD8C,YAAAuF;AAAAA,EAAAA,OAAA;AAAAA,UAAAvF,EAAA,EAAA;AAAA,EAAA;AAtBD,QAAAoG,kBAAwBb;AAsBtBc,MAAAA;AAAA,MAAArG,EAAA,EAAA,MAAA8F,OAAAC,IAAA,2BAAA,GAAA;AAEqBM,UAAAC,CAAA,YAAA;AACdhD,UAAAA,CAAAA,YAAWU,SAAA;AAAA;AAAA,MAAA;AAChBuC,YAAAA,aAAmB9J,qBAAqBiG,mBAAkBsB,OAAQ;AAAE,UAAA,CAC/DuC,YAAU;AAAA;AAAA,MAAA;AACf,YAAAC,qBAA2BhC,QAAKiC;AAA8B,UAC1DF,eAAe/B,QAAKE,UAAW6B,WAAUG,SAAUF,kBAAkB,GAAC;AAAA;AAAA,MAAA;AAAA,aAInED,WAAUxJ,QAAAC;AAAAA,IAAA;AACpBgD,YAAAqG;AAAAA,EAAAA,OAAA;AAAAA,UAAArG,EAAA,EAAA;AAAA,EAAA;AAVD,QAAA2G,iBAAuBN;AAUrBO,MAAAA;AAAA5G,MAAAA,EAAAiB,EAAAA,MAAAA,eAAAjB,UAAAqC,aAAArC,EAAA,EAAA,MAAAuC,cAAA;AAEsBqE,UAAAC,CAAA,YAAA;AAAA,UAChB5F,aAAW;AAAEA,oBAAYuD,OAAK;AAAA,MAAA;AAAC,UAC/BjB,UAASS,SAAA;AAAA;AAAA,MAAA;AAEb3B,oBAAc;AACdE,uBAAiB;AACjBU,2BAAoBe,UAAA;AAAA,QAAAwB,SACPhB,QAAKgB;AAAAA,QAAAC,SACLjB,QAAKiB;AAAAA,MAAA;AAEDzB,wBAAAA,UAAWc,WAAA,MAAA;AACxBvC,0BAAkB;AAClBM,0BAAiBmB,UAAA;AAAA,SAAA,GACd;AAAA,IAAC;AACXhE,YAAAiB;AAAAjB,YAAAqC;AAAArC,YAAAuC;AAAAvC,YAAA4G;AAAAA,EAAAA,OAAA;AAAAA,UAAA5G,EAAA,EAAA;AAAA,EAAA;AAdD,QAAA8G,kBAAwBF;AActBG,MAAAA;AAAA/G,MAAAA,EAAAsE,EAAAA,MAAAA,iBAAAtE,UAAAqF,oBAAArF,EAAA,EAAA,MAAAkB,WAAA;AAEoB6F,UAAAC,CAAA,YAAA;AAAA,UACd9F,WAAS;AAAEA,kBAAUsD,OAAK;AAAA,MAAA;AAAC,UAE3BhB,aAAYQ,WAAaT,CAAAA,UAASS,WAAYpB,gBAAeoB,SAAQ;AAAA;AAAA,MAAA;AAIzE,YAAAiD,gBAAoBzC,QAAKE;AAAuB,UAAA,CAE3CD,cAAWG,QAAApJ,aAAsB,GAAC;AAAA,YAG/B,CAACgI,aAAYQ,WACbrB,gBAAeqB,YAAaS,cAAWO,cAAAC,eAA4B;AAErD,wBAAA;AAAA,QAAA;AAAC;AAAA,MAAA;AAMlB3B,UAAAA,CAAAA,YAAWU,SAAA;AAAA;AAAA,MAAA;AAEhBqB,uBAAiBb,OAAK;AAAA,IAAC;AAC1BxE,YAAAsE;AAAAtE,YAAAqF;AAAArF,YAAAkB;AAAAlB,YAAA+G;AAAAA,EAAAA,OAAA;AAAAA,UAAA/G,EAAA,EAAA;AAAA,EAAA;AAxBD,QAAAkH,gBAAsBH;AAwBpBI,MAAAA;AAAAnH,MAAAA,EAAAsE,EAAAA,MAAAA,iBAAAtE,UAAAqF,oBAAArF,EAAA,EAAA,MAAAqC,WAAA;AAEoB8E,UAAAC,CAAA,YAAA;AAClB,YAAA;AAAA,QAAAC;AAAAA,QAAAC;AAAAA,QAAAC;AAAAA,QAAAC;AAAAA,MAAAA,IAA0ChD;AAC1C,YAAAiD,gBAAoBjD,QAAKE;AACzB,YAAAgD,oBAAwBhF,mBAAkBsB;AAAS,UAAA,CAC9C9H,mBAAe;AAAA;AAAA,MAAA;AAEpB,YAAAyL,iBAAAA,MAAA;AACInD,gBAAKoD,gBAAiB;AACtBpD,gBAAKqD,eAAgB;AACrB/E,8BAAqBkB,UAAW;AAAA,MAAU;AAG9C8D,YAAAA,2BAAiC5L,kBAAewK,SAAUjC,aAAW;AAEhElB,UAAAA,CAAAA,UAASS,SAAA;AAAA,YAAA,CAEL8D,0BAAwB;AAAA;AAAA,QAAA;AAGzBP,YAAAA,QAAQ,OACRA,QAAQ,WACPjE,YAAWU,YAAauD,QAAQ,aAAaA,QAAQ,cAAa;AAEpD,yBAAA;AACflF,wBAAc;AAAA,QAAA;AAAC;AAAA,MAAA;AAKvB0F,YAAAA,yBAA+BC,2BAA2BxD,OAAK;AAG3DlB,UAAAA,YAAWU,WAAA,CAAa+D,wBAAsB;AAC9C,YAAAE,sBAA0B,CAACX,WAAO,CAAKE,WAAW,gBAAAU,KAAqBX,GAAG;AAGtE,YAAA,CAACU,uBAAuBjF,qBAAoBgB,SAAQ;AAC9BuD,gCAAAA,QAAQ,OAAOA,QAAQ;AAAA,QAAA;AAA1B,YAGnBU,qBAAmB;AACJ,yBAAA;AAAC,cACZV,QAAQ,aAAW;AACnBvE,iCAAoBgB,UAAWhB,qBAAoBgB,QAAAmE,MAAA,GAAA,EAGnD;AAAA,UAAA,OAAC;AAEmBnE,iCAAAA,UAApBhB,qBAAoBgB,UAAYuD;AAAAA,UAAAA;AAGpC,wBAAA;AAAA,YAAArL,iBACIA;AAAAA,YAAemB,cAGD+F,eAAcY;AAAAA,YAAA1G,MACtB0F,qBAAoBgB;AAAAA,UAAAA,CAC7B;AAAC,cAEEjB,+BAA8BiB,SAAA;AAC9BK,yBAAatB,+BAA8BiB,OAAQ;AAAA,UAAA;AAGzBA,yCAAAA,UAAWc,WAAA,MAAA;AACrC9B,iCAAoBgB,UAAW;AAC/BjB,2CAA8BiB,UAAA;AAAA,aAAA,IAC3B;AAAC;AAAA,QAAA;AAAA,MAAA;AAAA,UAOZuD,QAAQ,WAAYA,QAAQ,OAAG,CAAK5E,gBAAeqB,SAAS;AAC7C,uBAAA;AACfqB,yBAAiBb,OAAK;AAAC;AAAA,MAAA;AAAA,UAMvB+C,QAAQ,YACPO,4BAA4BP,QAAQ,OAAG,CAAKjE,YAAWU,SAAS;AAG7DV,YAAAA,YAAWU,WAAA,CAAa+D,wBAAsB;AAChC,wBAAA;AAAA,QAAA;AAAC;AAAA,MAAA;AAAA,UAMnBzE,YAAWU,SAAA;AAAA,YACPuD,QAAQ,WAAS;AACF,yBAAA;AAAC,cACZF,UAAUG,SAAO;AACjB,0BAAA;AAAA,cAAAtL,iBAAgBA;AAAAA,cAAeiB,OAAA;AAAA,YAAA,CAAY;AAAA,UAAA,OAAC;AAE5C,0BAAA;AAAA,cAAAjB,iBAAgBA;AAAAA,cAAekB,aAAA;AAAA,YAAA,CAAmB;AAAA,UAAA;AAAC;AAAA,QAAA;AAAA,YAIvDmK,QAAQ,aAAW;AACJ,yBAAA;AAAC,cACZF,UAAUG,SAAO;AAEjB,0BAAA;AAAA,cAAAtL,iBAAgBA;AAAAA,cAAeiB,OAAA;AAAA,YAAA,CAAa;AAAA,UAAA,OAAC;AAE7C,0BAAA;AAAA,cAAAjB,iBAAgBA;AAAAA,cAAekB,aAAA;AAAA,YAAA,CAAkB;AAAA,UAAA;AAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAKjE4C,YAAAsE;AAAAtE,YAAAqF;AAAArF,YAAAqC;AAAArC,YAAAmH;AAAAA,EAAAA,OAAA;AAAAA,UAAAnH,EAAA,EAAA;AAAA,EAAA;AAjHD,QAAAoI,gBAAsBjB;AAiHpBkB,MAAAA;AAAArI,MAAAA,UAAAoI,eAAA;AAEgB,UAAA;AAAA,MAAAE,0BAAA;AAAA,MAAAC,WAA8CH;AAAAA,IAAa;AAAEpI,YAAAoI;AAAApI,YAAAqI;AAAAA,EAAAA,OAAA;AAAAA,UAAArI,EAAA,EAAA;AAAA,EAAA;AAA/EwI,oBAAkBH,GAA6D;AAE/EI,QAAAA,2BAAiCjJ,OAAAG,IAAuB;AAAE+I,MAAAA;AAAA,MAAA1I,EAAAsE,EAAAA,MAAAA,iBAAAtE,EAAA,EAAA,MAAAS,iBAAAT,EAAAmC,EAAAA,MAAAA,sBAAAnC,EAAA,EAAA,MAAAqC,aAAArC,UAAAuC,cAAA;AAExCmG,UAAAC,CAAA,QAAA;AACdjG,yBAAkBsB,UAAW2E;AAAG,UAAA,CAC3BA,KAAG;AAEJF,iCAAwBzE,QAAS;AACjCyE,iCAAwBzE,UAAArE;AAAA;AAAA,MAAA;AAI5B,YAAA;AAAA,QAAAqF;AAAAA,MAAAA,IAA0B2D;AAC1B,UAAAC,eAAmBjG,gBAAeqB;AAAS,UAEvC7B,sBAAuByG,CAAAA,gBAAgBD,IAAGE,mBAAkB;AAAA,YACxDF,IAAGE,kBAAAC,QAAAjJ,mBAA8C,GAAC;AAClD+I,yBAAeD,IAAGE;AAAAA,QAAAA,OAAN;AAEGF,yBAAAA,IAAGE,kBAAAzM,cAAAyD,mBAAoD;AAAA,QAAA;AAE1E8C,wBAAeqB,UAAW4E;AAAAA,MAAAA;AAG9BG,YAAAA,wBAAAC,CAAAA,SAAA;AAA+B,cAAA;AAAA,UAAAtE;AAAAA,QAAAA,IAAAsE;AAC3B,cAAAC,gBAAoBvE;AAAsB,YAEtChC,mBAAkBsB,WACjBtB,CAAAA,mBAAkBsB,QAAA0C,SAAkBjC,aAAW,GAAC;AAGnC,wBAAA;AAAA,QAAA;AAAA,MAAC;AAIvByE,YAAAA,sBAAAC,CAAAA,SAAA;;AAA6B,cAAA;AAAA,UAAAzE,QAAA0E;AAAAA,QAAAA,IAAAD;AAAsB,YAC3C,CAAC5F,UAASS,WAAYpB,gBAAeoB,SAAQ;AAAA;AAAA,QAAA;AAAA,YAG7CR,aAAYQ,SAAA;AACZzB,4BAAkB;AAAC,cACfM,kBAAiBmB,SAAA;AACjBK,yBAAaxB,kBAAiBmB,OAAQ;AACtCnB,8BAAiBmB,UAAA;AAAA,UAAA;AAAA;AAAA,QAAA;AAKzB,cAAAqF,gBAAoB3E;AAAsB,YAAA,GAErChC,wBAAkBsB,YAAlBtB,mBAAkBgE,SAAmBjC,iBAAW;AACnC,wBAAA;AAAA,QAAA;AAAA,MAAC;AAKvB6E,YAAAA,sBAAAC,CAAAA,SAAA;AAA6B,cAAA;AAAA,UAAA7E,QAAA8E;AAAAA,QAAAA,IAAAD;AACpBhG,YAAAA,CAAAA,UAASS,SAAA;AAAA;AAAA,QAAA;AAEd,cAAAyF,gBAAoB/E;AAAsB,YAGtC,CAAChC,mBAAkBsB,WACnBtB,mBAAkBsB,QAAA0C,SAAkBjC,aAAW,KAC/CA,cAAWiC,SAAUhE,mBAAkBsB,OAAQ,GAAC;AAAA;AAAA,QAAA;AAKtC,sBAAA;AAAA,MAAC;AAGnB0F,eAAAA,iBAA0B,WAAWJ,mBAAmB;AACxDI,eAAAA,iBAA0B,aAAaX,qBAAqB;AAC5DW,eAAAA,iBAA0B,WAAWR,mBAAmB;AAAC,UAErDlE,kBAAa2E,UAAa;AACbD,sBAAAA,iBAAkB,WAAWJ,mBAAmB;AAChDI,sBAAAA,iBAAkB,aAAaX,qBAAqB;AACpDW,sBAAAA,iBAAkB,WAAWR,mBAAmB;AAAA,MAAA;AAAC,UAI9DzI,eAAa;AACbkI,YAAGiB,MAAO;AAAA,MAAA;AAGd,YAAAC,cAAAC,CAAA,YAAA;AACI,cAAAC,oBAAwBrH,mBAAkBsB;AAAS,YAAA,CAC9C9H,mBAAe;AAAA;AAAA,QAAA;AAEfqH,YAAAA,CAAAA,UAASS,SAAA;AAAU3B,wBAAc;AAAA,QAAA;AAEtC,cAAA2H,QAAcxF,QAAKE;AACnB,cAAAuF,aAAmBjH,qBAAoBgB,QAAAzH,SAAkByN,MAAKvI,MAAAlF;AAC9DyG,6BAAoBgB,UAAWgG,MAAKvI;AAAA,YAIhCwI,cACAD,MAAKvI,MAAAlF,UACLE,qBAAqBP,iBAAe,GAAC;AAAA;AAAA,QAAA;AAKzC,sBAAA;AAAA,UAAAA,iBACIA;AAAAA,UAAemB,cAGD+F,eAAcY;AAAAA,UAAA1G,MACtB0F,qBAAoBgB;AAAAA,QAAAA,CAC7B;AAAA,MAAC;AACJ,UAEE4E,cAAY;AACAc,qBAAAA,iBAAkB,SAASG,WAAW;AAAA,MAAA;AAGtDpB,+BAAwBzE,UAAA,MAAA;AACpBkG,iBAAAA,oBAA6B,WAAWZ,mBAAmB;AAC3DY,iBAAAA,oBAA6B,aAAanB,qBAAqB;AAC/DmB,iBAAAA,oBAA6B,WAAWhB,mBAAmB;AAAC,YAExDlE,kBAAa2E,UAAa;AACbO,wBAAAA,oBAAqB,WAAWZ,mBAAmB;AACnDY,wBAAAA,oBAAqB,aAAanB,qBAAqB;AACvDmB,wBAAAA,oBAAqB,WAAWhB,mBAAmB;AAAA,QAAA;AAAC,YAGjEN,cAAY;AACAsB,uBAAAA,oBAAqB,SAASL,WAAW;AAAA,QAAA;AAAA,MAAC;AAAA,IAAA;AAGjE7J,YAAAsE;AAAAtE,YAAAS;AAAAT,YAAAmC;AAAAnC,YAAAqC;AAAArC,YAAAuC;AAAAvC,YAAA0I;AAAAA,EAAAA,OAAA;AAAAA,UAAA1I,EAAA,EAAA;AAAA,EAAA;AAnID,QAAAmK,YAAkBzB;AAmIhB,MAAA,CAEGvG,oBAAkB;AAAA,QACfzB,cAAY;AAKU,YAAAsI,OAAAvH,SAAS;AAAE0H,UAAAA;AAAAnJ,UAAAA,UAAAqC,WAAA;AAGhB8G,eAAAA,MAAM9G,cAAc;AAACrC,gBAAAqC;AAAArC,gBAAAmJ;AAAAA,MAAAA,OAAA;AAAAA,eAAAnJ,EAAA,EAAA;AAAA,MAAA;AAAAuJ,UAAAA;AAAAvJ,UAAAA,UAAAM,YAAAN,EAAAc,EAAAA,MAAAA,QAAAd,EAAAqB,EAAAA,MAAAA,eAAArB,EAAA,EAAA,MAAAgJ,QAAAhJ,UAAAmJ,QAAAnJ,EAAA,EAAA,MAAAwB,UAAA;AANlC+H,eAAA,oBAAA,SAAA,EACiB,cAAA,OACFhO,WAAAA,oBACG,cAAAyN,MACJ1I,UACJQ,MACG,SAAAqI,MACI9H,aACRsB,KAAc,iBACTnB,UACL,MAAA,QACP;AAAAxB,gBAAAM;AAAAN,gBAAAc;AAAAd,gBAAAqB;AAAArB,gBAAAgJ;AAAAhJ,gBAAAmJ;AAAAnJ,gBAAAwB;AAAAxB,gBAAAuJ;AAAAA,MAAAA,OAAA;AAAAA,eAAAvJ,EAAA,EAAA;AAAA,MAAA;AAXFgC,gBAAAA;AAAAA,IAAAA,OADG;AAAAgH,UAAAA;AAAAhJ,UAAAA,UAAAgC,SAAA;AAgBHgH,eAES,oBAAA,UAAA,EAFUzN,+BAA8B,UAAC,GACvC,UACX,SAAA;AAASyE,gBAAAgC;AAAAhC,gBAAAgJ;AAAAA,MAAAA,OAAA;AAAAA,eAAAhJ,EAAA,EAAA;AAAA,MAAA;AAFTgC,gBAAAA;AAAAA,IAAAA;AAAAA,EADG;AAAA,MAQXnB,OAAK;AAAAmI,QAAAA;AAAAhJ,QAAAA,UAAAa,OAAA;AAGGmI,aAAA,oBAAA,OAAgB1N,EAAAA,WAAAA,uBAAwBuF,UAAM,OAAA;AAAMb,cAAAa;AAAAb,cAAAgJ;AAAAA,IAAAA,OAAA;AAAAA,aAAAhJ,EAAA,EAAA;AAAA,IAAA;AAAAmJ,QAAAA;AAAA,QAAAnJ,EAAAgJ,EAAAA,MAAAA,QAAAhJ,UAAAgC,SAAA;AADxDmH,aAGQ,qBAAA,SAHU9N,EAAAA,WAAeA,kBAC7B2N,UAAAA;AAAAA,QAAAA;AAAAA,QACO;AAAA,MAAA,GACX;AAAQhJ,cAAAgJ;AAAAhJ,cAAAgC;AAAAhC,cAAAmJ;AAAAA,IAAAA,OAAA;AAAAA,aAAAnJ,EAAA,EAAA;AAAA,IAAA;AAHRgC,cAAAA;AAAAA,EAAAA;AADGgH,MAAAA;AAAA,MAAAhJ,EAAA,EAAA,MAAAkD,YAAAkH,WAAA;AAUHpB,UAAA9F,YAAWkH,qBAAsBlH,YAAWkH,YAAc,IAAA;AAAA,MAAA,CAAAxO,mBAAA,GAE7B,QAAQsH,YAAWkH,SAAA;AAAA,IAAA,IAE1C;AAAA,MAAA,EAAA,IAAAlH,YAAAkH;AAAApK,YAAAgJ;AAAAA,EAAAA,OAAA;AAAAA,UAAAhJ,EAAA,EAAA;AAAA,EAAA;AAAAmJ,MAAAA;AAAA,MAAAnJ,EAAA,EAAA,MAAAkD,YAAAmH,UAAA;AACNlB,UAAAjG,YAAWmH,oBAAqBnH,YAAWmH,WAAa,IAAA;AAAA,MAAA,CAAAxO,kBAAA,GAE5B,QAAQqH,YAAWmH,QAAA;AAAA,IAAA,IAEzC;AAAA,MAAA,EAAA,IAAAnH,YAAAmH;AAAArK,YAAAmJ;AAAAA,EAAAA,OAAA;AAAAA,UAAAnJ,EAAA,EAAA;AAAA,EAAA;AAAAuJ,MAAAA;AAAAvJ,MAAAA,EAAAuB,EAAAA,MAAAA,kBAAAvB,UAAAgJ,OAAAhJ,EAAA,EAAA,MAAAmJ,KAAA;AAXA,UAAA;AAAA,MAAA,GACP5H;AAAAA,MAAc,GACbyH;AAAAA,MAIM,GACNG;AAAAA,IAIM;AACbnJ,YAAAuB;AAAAvB,YAAAgJ;AAAAhJ,YAAAmJ;AAAAnJ,YAAAuJ;AAAAA,EAAAA,OAAA;AAAAA,UAAAvJ,EAAA,EAAA;AAAA,EAAA;AAZD,QAAAsB,QAAciI;AAYZe,MAAAA;AAAA,MAAAtK,EAAA,EAAA,MAAA8F,OAAAC,IAAA,2BAAA,GAAA;AAIMuE,UAAC,oBAAA,OAAA,EAAW,MAAA,6BAAkCxO,UAAE,QAAA;AAAQkE,YAAAsK;AAAAA,EAAAA,OAAA;AAAAA,UAAAtK,EAAA,EAAA;AAAA,EAAA;AAAAuK,MAAAA;AAAA,MAAAvK,EAAA,EAAA,MAAAK,aAAAL,EAAAM,EAAAA,MAAAA,YAAAN,EAAAoC,EAAAA,MAAAA,UAAApC,UAAAU,cAAA;AAEzC8J,UAAAA,KAAAtP,iBAAsBmF,WAAS;AAAA,MAAAC;AAAAA,MAAA,WAE3B8B;AAAAA,MAAM,iBACA1B;AAAAA,IAAAA,CACpB;AAACV,YAAAK;AAAAL,YAAAM;AAAAN,YAAAoC;AAAApC,YAAAU;AAAAV,YAAAuK;AAAAA,EAAAA,OAAA;AAAAA,UAAAvK,EAAA,EAAA;AAAA,EAAA;AAAAyK,MAAAA;AAAAzK,MAAAA,UAAAxD,YAAAwD,EAAA2B,EAAAA,MAAAA,iBAAA3B,EAAAO,EAAAA,MAAAA,YAAAP,EAAA,EAAA,MAAAoC,UAAApC,UAAAkD,YAAA/D,UAAAa,EAAA,EAAA,MAAAkD,YAAAwH,aAAA1K,EAAA,EAAA,MAAAkD,YAAAyH,QAAA3K,EAAAkD,EAAAA,MAAAA,YAAA0H,SAAA5K,EAAAkD,EAAAA,MAAAA,YAAAjE,OAAAe,EAAA,EAAA,MAAAyC,wBAAA;AAWDgI,UAAArI,SACG,oBAaM,OAZS,EAAA,WAAAoI,KAAApP,iBAAA;AAAA,MAAA,wBACkB8H,CAAAA,YAAWwH;AAAAA,MAAA,aACvBnK;AAAAA,MAAQ,wBAEjB2C,YAAW/D,UAAY+D,CAAAA,YAAWjE;AAAAA,MAAI,sBACpBiE,YAAWyH,QAAUzH,CAAAA,YAAW0H;AAAAA,MAAM,uBACrC1H,YAAW0H,SAAW1H,CAAAA,YAAWyH;AAAAA,MAAK,qBACxCzH,YAAWjE,OAAA,CAASiE,YAAW/D;AAAAA,IACvD,CAAA,GACIsD,KAAqB,wBAEzBd,UAAAA,oBAAqBnF,SAAyB,CAAA,IAAOA,SAAAA,CAC1D,IACI;AAAAwD,YAAAxD;AAAAwD,YAAA2B;AAAA3B,YAAAO;AAAAP,YAAAoC;AAAA,MAAA,EAAA,IAAAc,YAAA/D;AAAA,MAAA,EAAA,IAAA+D,YAAAwH;AAAA,MAAA,EAAA,IAAAxH,YAAAyH;AAAA,MAAA,EAAA,IAAAzH,YAAA0H;AAAA,MAAA,EAAA,IAAA1H,YAAAjE;AAAAe,YAAAyC;AAAAzC,YAAAyK;AAAAA,EAAAA,OAAA;AAAAA,UAAAzK,EAAA,EAAA;AAAA,EAAA;AAAA6K,MAAAA;AAAA,MAAA7K,EAAA,EAAA,MAAA8G,mBAAA9G,EAAA6F,EAAAA,MAAAA,mBAAA7F,UAAAkH,iBAAAlH,EAAA,EAAA,MAAAmK,aAAAnK,EAAAe,EAAAA,MAAAA,WAAAf,EAAAsB,EAAAA,MAAAA,SAAAtB,EAAA,EAAA,MAAAuK,OAAAvK,EAAAyK,EAAAA,MAAAA,OAAAzK,UAAAgC,SAAA;AAjChB6I,+BAAC,UACGP,EAAAA,UAAAA;AAAAA,MAAAA;AAAAA,2BAiCM,OA/BS,EAAA,WAAAC,KAKFxJ,SACI+F,aAAc,iBACdjB,aAAAA,iBACDc,YAAAA,gBACCP,aAAc,iBAChBc,WAAAA,eACNiD,gBACE7I,OAENU,UAAAA;AAAAA,QAAAA;AAAAA,QACAyI;AAAAA,MAAAA,EAgBL,CAAA;AAAA,IAAA,GACJ;AAAWzK,YAAA8G;AAAA9G,YAAA6F;AAAA7F,YAAAkH;AAAAlH,YAAAmK;AAAAnK,YAAAe;AAAAf,YAAAsB;AAAAtB,YAAAuK;AAAAvK,YAAAyK;AAAAzK,YAAAgC;AAAAhC,YAAA6K;AAAAA,EAAAA,OAAA;AAAAA,UAAA7K,EAAA,EAAA;AAAA,EAAA;AAnCX6K,SAAAA;AAmCW;"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../src/styles.ts","../src/helpers.ts","../src/Dropdown.tsx"],"sourcesContent":["import { SYSTEM_UI_FONT } from '@acusti/styling';\n\nexport const ROOT_CLASS_NAME = 'uktdropdown';\nexport const ROOT_SELECTOR = `.${ROOT_CLASS_NAME}`;\n\nexport const BODY_CLASS_NAME = `${ROOT_CLASS_NAME}-body`;\nexport const LABEL_CLASS_NAME = `${ROOT_CLASS_NAME}-label`;\nexport const LABEL_TEXT_CLASS_NAME = `${ROOT_CLASS_NAME}-label-text`;\nexport const TRIGGER_CLASS_NAME = `${ROOT_CLASS_NAME}-trigger`;\n\nexport const BODY_SELECTOR = `.${BODY_CLASS_NAME}`;\nexport const LABEL_SELECTOR = `.${LABEL_CLASS_NAME}`;\nexport const LABEL_TEXT_SELECTOR = `.${LABEL_TEXT_CLASS_NAME}`;\nexport const TRIGGER_SELECTOR = `.${TRIGGER_CLASS_NAME}`;\n\nexport const BODY_MAX_HEIGHT_VAR = '--uktdd-body-max-height';\nexport const BODY_MAX_WIDTH_VAR = '--uktdd-body-max-width';\n\nexport const STYLES = `\n:root {\n --uktdd-font-family: ${SYSTEM_UI_FONT};\n --uktdd-body-bg-color: #fff;\n --uktdd-body-bg-color-hover: rgb(105,162,249);\n --uktdd-body-color-hover: #fff;\n --uktdd-body-buffer: 10px;\n ${BODY_MAX_HEIGHT_VAR}: calc(100vh - var(--uktdd-body-buffer));\n ${BODY_MAX_WIDTH_VAR}: calc(100vw - var(--uktdd-body-buffer));\n --uktdd-body-pad-bottom: 9px;\n --uktdd-body-pad-left: 12px;\n --uktdd-body-pad-right: 12px;\n --uktdd-body-pad-top: 9px;\n --uktdd-label-pad-right: 10px;\n}\n${ROOT_SELECTOR},\n${TRIGGER_SELECTOR} {\n font-family: var(--uktdd-font-family);\n}\n${ROOT_SELECTOR} {\n width: max-content;\n}\n${ROOT_SELECTOR}.disabled {\n pointer-events: none;\n}\n${ROOT_SELECTOR} > * {\n cursor: default;\n}\n${LABEL_SELECTOR} {\n display: flex;\n align-items: center;\n}\n${LABEL_TEXT_SELECTOR} {\n padding-right: var(--uktdd-label-pad-right);\n}\n${BODY_SELECTOR} {\n box-sizing: border-box;\n position: absolute;\n top: anchor(bottom);\n left: anchor(left);\n position-try-fallbacks: --uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;\n min-height: 50px;\n max-height: var(${BODY_MAX_HEIGHT_VAR});\n min-width: min(50px, 100%);\n max-width: var(${BODY_MAX_WIDTH_VAR});\n overflow: auto;\n z-index: 2;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);\n background-color: var(--uktdd-body-bg-color);\n box-shadow: 0 8px 18px rgba(0,0,0,0.25);\n}\n@position-try --uktdd-top-left {\n bottom: anchor(top);\n left: anchor(left);\n top: revert;\n right: revert;\n}\n@position-try --uktdd-bottom-right {\n top: anchor(bottom);\n right: anchor(right);\n bottom: revert;\n left: revert;\n}\n@position-try --uktdd-top-right {\n bottom: anchor(top);\n right: anchor(right);\n top: revert;\n left: revert;\n}\n${BODY_SELECTOR}.has-items {\n user-select: none;\n}\n${BODY_SELECTOR} [data-ukt-active] {\n background-color: var(--uktdd-body-bg-color-hover);\n color: var(--uktdd-body-color-hover);\n}\n`;\n","import { getBestMatch } from '@acusti/matchmaking';\n\nimport { BODY_SELECTOR } from './styles.js';\n\nexport const ITEM_SELECTOR = `[data-ukt-item], [data-ukt-value]`;\n\nexport const getItemElements = (dropdownElement: HTMLElement | null) => {\n if (!dropdownElement) return null;\n\n const bodyElement = dropdownElement.querySelector(BODY_SELECTOR);\n if (!bodyElement) return null;\n\n let items: HTMLCollection | NodeListOf<Element> =\n bodyElement.querySelectorAll(ITEM_SELECTOR);\n\n if (items.length) return items;\n // If no items found via [data-ukt-item] or [data-ukt-value] selector,\n // use first instance of multiple children found\n items = bodyElement.children;\n while (items.length === 1) {\n if (items[0].children == null) break;\n items = items[0].children;\n }\n // If unable to find an element with more than one child, treat direct child as items\n if (items.length === 1) {\n items = bodyElement.children;\n }\n return items;\n};\n\nexport const getActiveItemElement = (dropdownElement: HTMLElement | null) => {\n if (!dropdownElement) return null;\n return dropdownElement.querySelector('[data-ukt-active]') as HTMLElement | null;\n};\n\nconst clearItemElementsState = (itemElements: Array<HTMLElement>) => {\n itemElements.forEach((itemElement) => {\n if (itemElement.hasAttribute('data-ukt-active')) {\n delete itemElement.dataset.uktActive;\n }\n });\n};\n\nexport const setActiveItem = ({\n dropdownElement,\n element,\n index,\n indexAddend,\n isExactMatch,\n text,\n}:\n | {\n dropdownElement: HTMLElement;\n element: HTMLElement;\n index?: null;\n indexAddend?: null;\n isExactMatch?: null;\n text?: null;\n }\n | {\n dropdownElement: HTMLElement;\n element?: null;\n index: number;\n indexAddend?: null;\n isExactMatch?: null;\n text?: null;\n }\n | {\n dropdownElement: HTMLElement;\n element?: null;\n index?: null;\n indexAddend: number;\n isExactMatch?: null;\n text?: null;\n }\n | {\n dropdownElement: HTMLElement;\n element?: null;\n index?: null;\n indexAddend?: null;\n isExactMatch?: boolean;\n text: string;\n }) => {\n const items = getItemElements(dropdownElement);\n if (!items) return;\n\n const itemElements = Array.from(items) as Array<HTMLElement>;\n if (!itemElements.length) return;\n\n const lastIndex = itemElements.length - 1;\n const currentActiveIndex = itemElements.findIndex((itemElement) =>\n itemElement.hasAttribute('data-ukt-active'),\n );\n\n let nextActiveIndex = currentActiveIndex;\n if (typeof index === 'number') {\n // Negative index means count back from the end\n nextActiveIndex = index < 0 ? itemElements.length + index : index;\n }\n\n if (element) {\n nextActiveIndex = itemElements.findIndex(\n (itemElement) => itemElement === element,\n );\n } else if (typeof indexAddend === 'number') {\n // If there’s no currentActiveIndex and we are handling -1, start at lastIndex\n if (currentActiveIndex === -1 && indexAddend === -1) {\n nextActiveIndex = lastIndex;\n } else {\n nextActiveIndex += indexAddend;\n }\n // Keep it within the bounds of the items list\n if (nextActiveIndex < 0) {\n nextActiveIndex = 0;\n } else if (nextActiveIndex > lastIndex) {\n nextActiveIndex = lastIndex;\n }\n } else if (typeof text === 'string') {\n // If text is empty, clear existing active items and early return\n if (!text) {\n clearItemElementsState(itemElements);\n return;\n }\n\n const itemTexts = itemElements.map((itemElement) => itemElement.innerText);\n if (isExactMatch) {\n const textToCompare = text.toLowerCase();\n nextActiveIndex = itemTexts.findIndex((itemText) =>\n itemText.toLowerCase().startsWith(textToCompare),\n );\n // If isExactMatch is required and no exact match was found, clear active items\n if (nextActiveIndex === -1) {\n clearItemElementsState(itemElements);\n }\n } else {\n const bestMatch = getBestMatch({ items: itemTexts, text });\n nextActiveIndex = itemTexts.findIndex((itemText) => itemText === bestMatch);\n }\n }\n\n if (nextActiveIndex === -1 || nextActiveIndex === currentActiveIndex) return;\n\n // Clear any existing active dropdown body item state\n clearItemElementsState(itemElements);\n\n const nextActiveItem = items[nextActiveIndex];\n if (nextActiveItem != null) {\n nextActiveItem.setAttribute('data-ukt-active', '');\n // Find closest scrollable parent and ensure that next active item is visible\n let { parentElement } = nextActiveItem;\n let scrollableParent = null;\n while (!scrollableParent && parentElement && parentElement !== dropdownElement) {\n const isScrollable =\n parentElement.scrollHeight > parentElement.clientHeight + 15;\n if (isScrollable) {\n scrollableParent = parentElement;\n } else {\n parentElement = parentElement.parentElement;\n }\n }\n\n if (scrollableParent) {\n const parentRect = scrollableParent.getBoundingClientRect();\n const itemRect = nextActiveItem.getBoundingClientRect();\n const isAboveTop = itemRect.top < parentRect.top;\n const isBelowBottom = itemRect.bottom > parentRect.bottom;\n if (isAboveTop || isBelowBottom) {\n let { scrollTop } = scrollableParent;\n // Item isn’t fully visible; adjust scrollTop to put item within closest edge\n if (isAboveTop) {\n scrollTop -= parentRect.top - itemRect.top;\n } else {\n scrollTop += itemRect.bottom - parentRect.bottom;\n }\n scrollableParent.scrollTop = scrollTop;\n }\n }\n }\n};\n","/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/mouse-events-have-key-events, jsx-a11y/no-static-element-interactions */\nimport { Style } from '@acusti/styling';\nimport useBoundingClientRect from '@acusti/use-bounding-client-rect';\nimport useKeyboardEvents, {\n isEventTargetUsingKeyEvent,\n} from '@acusti/use-keyboard-events';\nimport clsx from 'clsx';\nimport * as React from 'react';\n\nimport {\n getActiveItemElement,\n getItemElements,\n ITEM_SELECTOR,\n setActiveItem,\n} from './helpers.js';\nimport {\n BODY_CLASS_NAME,\n BODY_MAX_HEIGHT_VAR,\n BODY_MAX_WIDTH_VAR,\n BODY_SELECTOR,\n LABEL_CLASS_NAME,\n LABEL_TEXT_CLASS_NAME,\n ROOT_CLASS_NAME,\n STYLES,\n TRIGGER_CLASS_NAME,\n} from './styles.js';\n\nexport type Item = {\n element: MaybeHTMLElement;\n event: Event | React.SyntheticEvent<HTMLElement>;\n label: string;\n value: string;\n};\n\nexport type Props = {\n /**\n * Boolean indicating if the user can submit a value not already in the\n * dropdown.\n */\n allowCreate?: boolean;\n /**\n * Boolean indicating if the user can submit an empty value (i.e. clear\n * the value). Defaults to true.\n */\n allowEmpty?: boolean;\n /**\n * Can take a single React element or exactly two renderable children.\n */\n children: ChildrenTuple | React.JSX.Element;\n className?: string;\n disabled?: boolean;\n /**\n * Group identifier string links dropdowns together into a menu\n * (like macOS top menubar).\n */\n group?: string;\n hasItems?: boolean;\n isOpenOnMount?: boolean;\n isSearchable?: boolean;\n keepOpenOnSubmit?: boolean;\n label?: string;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s name.\n */\n name?: string;\n onClick?: (event: React.MouseEvent<HTMLElement>) => unknown;\n onClose?: () => unknown;\n onMouseDown?: (event: React.MouseEvent<HTMLElement>) => unknown;\n onMouseUp?: (event: React.MouseEvent<HTMLElement>) => unknown;\n onOpen?: () => unknown;\n onSubmitItem?: (payload: Item) => void;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s placeholder.\n */\n placeholder?: string;\n style?: React.CSSProperties;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s tabIndex.\n */\n tabIndex?: number;\n /**\n * Used as search input’s value if props.isSearchable === true\n * Used to determine if value has changed to avoid triggering onSubmitItem if not\n */\n value?: string;\n};\n\ntype ChildrenTuple = [React.ReactNode, React.ReactNode];\n\ntype MaybeHTMLElement = HTMLElement | null;\n\ntype MousePosition = { clientX: number; clientY: number };\n\ntype TimeoutID = ReturnType<typeof setTimeout>;\n\nconst { Children, Fragment, useEffect, useRef, useState } = React;\n\nconst noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n\nconst CHILDREN_ERROR =\n '@acusti/dropdown requires either 1 child (the dropdown body) or 2 children: the dropdown trigger and the dropdown body.';\nconst TEXT_INPUT_SELECTOR =\n 'input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea';\n\nlet idCounter = 0;\n\nexport default function Dropdown({\n allowCreate,\n allowEmpty = true,\n children,\n className,\n disabled,\n hasItems = true,\n isOpenOnMount,\n isSearchable,\n keepOpenOnSubmit = !hasItems,\n label,\n name,\n onClick,\n onClose,\n onMouseDown,\n onMouseUp,\n onOpen,\n onSubmitItem,\n placeholder,\n style: styleFromProps,\n tabIndex,\n value,\n}: Props) {\n const childrenCount = Children.count(children);\n if (childrenCount !== 1 && childrenCount !== 2) {\n if (childrenCount === 0) {\n throw new Error(CHILDREN_ERROR + ' Received no children.');\n }\n console.error(`${CHILDREN_ERROR} Received ${childrenCount} children.`);\n }\n\n let trigger: React.ReactNode;\n if (childrenCount > 1) {\n trigger = (children as ChildrenTuple)[0];\n }\n const isTriggerFromProps = React.isValidElement(trigger);\n\n const [isOpen, setIsOpen] = useState<boolean>(isOpenOnMount ?? false);\n const [isOpening, setIsOpening] = useState<boolean>(!isOpenOnMount);\n const [dropdownElement, setDropdownElement] = useState<MaybeHTMLElement>(null);\n const [dropdownBodyElement, setDropdownBodyElement] =\n useState<MaybeHTMLElement>(null);\n const [id] = useState(() => {\n idCounter = idCounter >= 999_999 ? 0 : idCounter + 1;\n return idCounter;\n });\n\n const inputElementRef = useRef<HTMLInputElement | null>(null);\n const closingTimerRef = useRef<null | TimeoutID>(null);\n const isOpeningTimerRef = useRef<null | TimeoutID>(null);\n const currentInputMethodRef = useRef<'keyboard' | 'mouse'>('mouse');\n const clearEnteredCharactersTimerRef = useRef<null | TimeoutID>(null);\n const enteredCharactersRef = useRef<string>('');\n const mouseDownPositionRef = useRef<MousePosition | null>(null);\n\n const allowCreateRef = useRef(allowCreate);\n const allowEmptyRef = useRef(allowEmpty);\n const hasItemsRef = useRef(hasItems);\n const isOpenRef = useRef(isOpen);\n const isOpeningRef = useRef(isOpening);\n const keepOpenOnSubmitRef = useRef(keepOpenOnSubmit);\n const onCloseRef = useRef(onClose);\n const onOpenRef = useRef(onOpen);\n const onSubmitItemRef = useRef(onSubmitItem);\n const valueRef = useRef(value);\n\n useEffect(() => {\n allowCreateRef.current = allowCreate;\n allowEmptyRef.current = allowEmpty;\n hasItemsRef.current = hasItems;\n isOpenRef.current = isOpen;\n isOpeningRef.current = isOpening;\n keepOpenOnSubmitRef.current = keepOpenOnSubmit;\n onCloseRef.current = onClose;\n onOpenRef.current = onOpen;\n onSubmitItemRef.current = onSubmitItem;\n valueRef.current = value;\n }, [\n allowCreate,\n allowEmpty,\n hasItems,\n isOpen,\n isOpening,\n keepOpenOnSubmit,\n onClose,\n onOpen,\n onSubmitItem,\n value,\n ]);\n\n const isMountedRef = useRef(false);\n\n useEffect(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n // If isOpenOnMount, trigger onOpen right away\n if (isOpenRef.current && onOpenRef.current) {\n onOpenRef.current();\n }\n return;\n }\n\n if (isOpen && onOpenRef.current) {\n onOpenRef.current();\n } else if (!isOpen && onCloseRef.current) {\n onCloseRef.current();\n }\n }, [isOpen]);\n\n const closeDropdown = () => {\n setIsOpen(false);\n setIsOpening(false);\n mouseDownPositionRef.current = null;\n if (closingTimerRef.current) {\n clearTimeout(closingTimerRef.current);\n closingTimerRef.current = null;\n }\n };\n\n const handleSubmitItem = (event: Event | React.SyntheticEvent<HTMLElement>) => {\n if (isOpenRef.current && !keepOpenOnSubmitRef.current) {\n // A short timeout before closing is better UX when user selects an item so dropdown\n // doesn’t close before expected. It also enables using <Link />s in the dropdown body.\n closingTimerRef.current = setTimeout(closeDropdown, 90);\n }\n\n if (!hasItemsRef.current) return;\n\n const element = getActiveItemElement(dropdownElement);\n if (!element && !allowCreateRef.current) {\n // If not allowEmpty, don’t allow submitting an empty item\n if (!allowEmptyRef.current) return;\n // If we have an input element as trigger & the user didn’t clear the text, do nothing\n if (inputElementRef.current?.value) return;\n }\n\n let itemLabel = element?.innerText ?? '';\n if (inputElementRef.current) {\n if (!element) {\n itemLabel = inputElementRef.current.value;\n } else {\n inputElementRef.current.value = itemLabel;\n }\n\n if (\n inputElementRef.current ===\n inputElementRef.current.ownerDocument.activeElement\n ) {\n inputElementRef.current.blur();\n }\n }\n\n const nextValue = element?.dataset.uktValue ?? itemLabel;\n // If parent is controlling Dropdown via props.value and nextValue is the same, do nothing\n if (valueRef.current && valueRef.current === nextValue) return;\n\n if (onSubmitItemRef.current) {\n onSubmitItemRef.current({\n element,\n event,\n label: itemLabel,\n value: nextValue,\n });\n }\n };\n\n const handleMouseMove = ({ clientX, clientY }: React.MouseEvent<HTMLElement>) => {\n currentInputMethodRef.current = 'mouse';\n const initialPosition = mouseDownPositionRef.current;\n if (!initialPosition) return;\n if (\n Math.abs(initialPosition.clientX - clientX) < 12 &&\n Math.abs(initialPosition.clientY - clientY) < 12\n ) {\n return;\n }\n setIsOpening(false);\n };\n\n const handleMouseOver = (event: React.MouseEvent<HTMLElement>) => {\n if (!hasItemsRef.current) return;\n\n // If user isn’t currently using the mouse to navigate the dropdown, do nothing\n if (currentInputMethodRef.current !== 'mouse') return;\n\n // Ensure we have the dropdown root HTMLElement\n if (!dropdownElement) return;\n\n const itemElements = getItemElements(dropdownElement);\n if (!itemElements) return;\n\n const eventTarget = event.target as HTMLElement;\n const item = eventTarget.closest(ITEM_SELECTOR) as MaybeHTMLElement;\n const element = item ?? eventTarget;\n for (const itemElement of itemElements) {\n if (itemElement === element) {\n setActiveItem({ dropdownElement, element });\n return;\n }\n }\n };\n\n const handleMouseOut = (event: React.MouseEvent<HTMLElement>) => {\n if (!hasItemsRef.current) return;\n const activeItem = getActiveItemElement(dropdownElement);\n if (!activeItem) return;\n const eventRelatedTarget = event.relatedTarget as HTMLElement;\n if (activeItem !== event.target || activeItem.contains(eventRelatedTarget)) {\n return;\n }\n // If user moused out of activeItem (not into a descendant), it’s no longer active\n delete activeItem.dataset.uktActive;\n };\n\n const handleMouseDown = (event: React.MouseEvent<HTMLElement>) => {\n if (onMouseDown) onMouseDown(event);\n if (isOpenRef.current) return;\n\n setIsOpen(true);\n setIsOpening(true);\n mouseDownPositionRef.current = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n isOpeningTimerRef.current = setTimeout(() => {\n setIsOpening(false);\n isOpeningTimerRef.current = null;\n }, 1000);\n };\n\n const handleMouseUp = (event: React.MouseEvent<HTMLElement>) => {\n if (onMouseUp) onMouseUp(event);\n // If dropdown is still opening or isn’t open or is closing, do nothing\n if (isOpeningRef.current || !isOpenRef.current || closingTimerRef.current) {\n return;\n }\n\n const eventTarget = event.target as HTMLElement;\n // If click was outside dropdown body, don’t trigger submit\n if (!eventTarget.closest(BODY_SELECTOR)) {\n // Don’t close dropdown if isOpening or search input is focused\n if (\n !isOpeningRef.current &&\n inputElementRef.current !== eventTarget.ownerDocument.activeElement\n ) {\n closeDropdown();\n }\n return;\n }\n\n // If dropdown has no items and click was within dropdown body, do nothing\n if (!hasItemsRef.current) return;\n\n handleSubmitItem(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const { altKey, ctrlKey, key, metaKey } = event;\n const eventTarget = event.target as HTMLElement;\n if (!dropdownElement) return;\n\n const onEventHandled = () => {\n event.stopPropagation();\n event.preventDefault();\n currentInputMethodRef.current = 'keyboard';\n };\n\n const isEventTargetingDropdown = dropdownElement.contains(eventTarget);\n\n if (!isOpenRef.current) {\n // If dropdown is closed, don’t handle key events if event target isn’t within dropdown\n if (!isEventTargetingDropdown) return;\n // Open the dropdown on spacebar, enter, or if isSearchable and user hits the ↑/↓ arrows\n if (\n key === ' ' ||\n key === 'Enter' ||\n (hasItemsRef.current && (key === 'ArrowUp' || key === 'ArrowDown'))\n ) {\n onEventHandled();\n setIsOpen(true);\n }\n return;\n }\n\n const isTargetUsingKeyEvents = isEventTargetUsingKeyEvent(event);\n\n // If dropdown isOpen + hasItems & eventTargetNotUsingKeyEvents, handle characters\n if (hasItemsRef.current && !isTargetUsingKeyEvents) {\n let isEditingCharacters = !ctrlKey && !metaKey && /^[A-Za-z0-9]$/.test(key);\n // User could also be editing characters if there are already characters entered\n // and they are hitting delete or spacebar\n if (!isEditingCharacters && enteredCharactersRef.current) {\n isEditingCharacters = key === ' ' || key === 'Backspace';\n }\n\n if (isEditingCharacters) {\n onEventHandled();\n if (key === 'Backspace') {\n enteredCharactersRef.current = enteredCharactersRef.current.slice(\n 0,\n -1,\n );\n } else {\n enteredCharactersRef.current += key;\n }\n\n setActiveItem({\n dropdownElement,\n // If props.allowCreate, only override the input’s value with an\n // exact text match so user can enter a value not in items\n isExactMatch: allowCreateRef.current,\n text: enteredCharactersRef.current,\n });\n\n if (clearEnteredCharactersTimerRef.current) {\n clearTimeout(clearEnteredCharactersTimerRef.current);\n }\n\n clearEnteredCharactersTimerRef.current = setTimeout(() => {\n enteredCharactersRef.current = '';\n clearEnteredCharactersTimerRef.current = null;\n }, 1500);\n\n return;\n }\n }\n\n // If dropdown isOpen, handle submitting the value\n if (key === 'Enter' || (key === ' ' && !inputElementRef.current)) {\n onEventHandled();\n handleSubmitItem(event);\n return;\n }\n\n // If dropdown isOpen, handle closing it on escape or spacebar if !hasItems\n if (\n key === 'Escape' ||\n (isEventTargetingDropdown && key === ' ' && !hasItemsRef.current)\n ) {\n // Close dropdown if hasItems or event target not using key events\n if (hasItemsRef.current || !isTargetUsingKeyEvents) {\n closeDropdown();\n }\n return;\n }\n\n // Handle ↑/↓ arrows\n if (hasItemsRef.current) {\n if (key === 'ArrowUp') {\n onEventHandled();\n if (altKey || metaKey) {\n setActiveItem({ dropdownElement, index: 0 });\n } else {\n setActiveItem({ dropdownElement, indexAddend: -1 });\n }\n return;\n }\n if (key === 'ArrowDown') {\n onEventHandled();\n if (altKey || metaKey) {\n // Using a negative index counts back from the end\n setActiveItem({ dropdownElement, index: -1 });\n } else {\n setActiveItem({ dropdownElement, indexAddend: 1 });\n }\n return;\n }\n }\n };\n\n useKeyboardEvents({ ignoreUsedKeyboardEvents: false, onKeyDown: handleKeyDown });\n\n const cleanupEventListenersRef = useRef<() => void>(noop);\n\n const handleRef = (ref: HTMLDivElement | null) => {\n setDropdownElement(ref);\n if (!ref) {\n // If component was unmounted, cleanup handlers\n cleanupEventListenersRef.current();\n cleanupEventListenersRef.current = noop;\n return;\n }\n\n const { ownerDocument } = ref;\n let inputElement = inputElementRef.current;\n // Check if trigger from props is a textual input or textarea element\n if (isTriggerFromProps && !inputElement && ref.firstElementChild) {\n if (ref.firstElementChild.matches(TEXT_INPUT_SELECTOR)) {\n inputElement = ref.firstElementChild as HTMLInputElement;\n } else {\n inputElement = ref.firstElementChild.querySelector(TEXT_INPUT_SELECTOR);\n }\n inputElementRef.current = inputElement;\n }\n\n const handleGlobalMouseDown = ({ target }: MouseEvent) => {\n const eventTarget = target as HTMLElement;\n if (!ref.contains(eventTarget)) {\n // Close dropdown on an outside click\n closeDropdown();\n }\n };\n\n const handleGlobalMouseUp = ({ target }: MouseEvent) => {\n if (!isOpenRef.current || closingTimerRef.current) return;\n\n // If still isOpening (gets set false 1s after open triggers), set it to false onMouseUp\n if (isOpeningRef.current) {\n setIsOpening(false);\n if (isOpeningTimerRef.current) {\n clearTimeout(isOpeningTimerRef.current);\n isOpeningTimerRef.current = null;\n }\n return;\n }\n\n const eventTarget = target as HTMLElement;\n // Only handle mouseup events from outside the dropdown here\n if (!ref.contains(eventTarget)) {\n closeDropdown();\n }\n };\n\n // Close dropdown if any element is focused outside of this dropdown\n const handleGlobalFocusIn = ({ target }: Event) => {\n if (!isOpenRef.current) return;\n\n const eventTarget = target as HTMLElement;\n // If focused element is a descendant or a parent of the dropdown, do nothing\n if (ref.contains(eventTarget) || eventTarget.contains(ref)) {\n return;\n }\n\n closeDropdown();\n };\n\n document.addEventListener('focusin', handleGlobalFocusIn);\n document.addEventListener('mousedown', handleGlobalMouseDown);\n document.addEventListener('mouseup', handleGlobalMouseUp);\n\n if (ownerDocument !== document) {\n ownerDocument.addEventListener('focusin', handleGlobalFocusIn);\n ownerDocument.addEventListener('mousedown', handleGlobalMouseDown);\n ownerDocument.addEventListener('mouseup', handleGlobalMouseUp);\n }\n\n // If dropdown should be open on mount, focus it\n if (isOpenOnMount) {\n ref.focus();\n }\n\n const handleInput = (event: Event) => {\n if (!isOpenRef.current) setIsOpen(true);\n\n const input = event.target as HTMLInputElement;\n const isDeleting = enteredCharactersRef.current.length > input.value.length;\n enteredCharactersRef.current = input.value;\n // When deleting text, if there’s already an active item and\n // input isn’t empty, preserve the active item, else update it\n if (isDeleting && input.value.length && getActiveItemElement(ref)) {\n return;\n }\n\n setActiveItem({\n dropdownElement: ref,\n // If props.allowCreate, only override the input’s value with an\n // exact text match so user can enter a value not in items\n isExactMatch: allowCreateRef.current,\n text: enteredCharactersRef.current,\n });\n };\n\n if (inputElement) {\n inputElement.addEventListener('input', handleInput);\n }\n\n cleanupEventListenersRef.current = () => {\n document.removeEventListener('focusin', handleGlobalFocusIn);\n document.removeEventListener('mousedown', handleGlobalMouseDown);\n document.removeEventListener('mouseup', handleGlobalMouseUp);\n\n if (ownerDocument !== document) {\n ownerDocument.removeEventListener('focusin', handleGlobalFocusIn);\n ownerDocument.removeEventListener('mousedown', handleGlobalMouseDown);\n ownerDocument.removeEventListener('mouseup', handleGlobalMouseUp);\n }\n\n if (inputElement) {\n inputElement.removeEventListener('input', handleInput);\n }\n };\n };\n\n if (!isTriggerFromProps) {\n if (isSearchable) {\n trigger = (\n <input\n autoComplete=\"off\"\n className={TRIGGER_CLASS_NAME}\n defaultValue={value ?? ''}\n disabled={disabled}\n name={name}\n onFocus={() => setIsOpen(true)}\n placeholder={placeholder}\n ref={inputElementRef}\n tabIndex={tabIndex}\n type=\"text\"\n />\n );\n } else {\n trigger = (\n <button className={TRIGGER_CLASS_NAME} tabIndex={0}>\n {trigger}\n </button>\n );\n }\n }\n\n if (label) {\n trigger = (\n <label className={LABEL_CLASS_NAME}>\n <div className={LABEL_TEXT_CLASS_NAME}>{label}</div>\n {trigger}\n </label>\n );\n }\n\n const dropdownRect = useBoundingClientRect(dropdownElement);\n const dropdownBodyRect = useBoundingClientRect(dropdownBodyElement);\n const boundingElement = getBoundingAncestor(dropdownBodyElement);\n const boundingElementRect = useBoundingClientRect(boundingElement);\n let maxHeight;\n let maxWidth;\n if (\n dropdownBodyRect.top != null &&\n dropdownRect.top != null &&\n boundingElementRect.top != null\n ) {\n const maxHeightUp = dropdownBodyRect.bottom - boundingElementRect.top;\n const maxHeightDown = boundingElementRect.bottom - dropdownBodyRect.top;\n maxHeight = dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp;\n const maxWidthLeft = dropdownBodyRect.right - boundingElementRect.left;\n const maxWidthRight = boundingElementRect.right - dropdownBodyRect.left;\n maxWidth =\n dropdownBodyRect.left > dropdownRect.left ? maxWidthRight : maxWidthLeft;\n }\n\n const style = {\n ...styleFromProps,\n ...(maxHeight != null && maxHeight > 0\n ? { [BODY_MAX_HEIGHT_VAR]: `calc(${maxHeight}px - var(--uktdd-body-buffer))` }\n : null),\n ...(maxWidth != null && maxWidth > 0\n ? { [BODY_MAX_WIDTH_VAR]: `calc(${maxWidth}px - var(--uktdd-body-buffer))` }\n : null),\n };\n\n return (\n <Fragment>\n <Style href=\"@acusti/dropdown/Dropdown\">{STYLES}</Style>\n <Style>{`\n[data-ukt-id=\"${id}\"] > :first-child {\n anchor-name: --uktdd-anchor${id};\n}\n[data-ukt-id=\"${id}\"] ${BODY_SELECTOR} {\n position-anchor: --uktdd-anchor${id};\n}\n`}</Style>\n <div\n className={clsx(ROOT_CLASS_NAME, className, {\n disabled,\n 'is-open': isOpen,\n 'is-searchable': isSearchable,\n })}\n data-ukt-id={id}\n onClick={onClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseOut={handleMouseOut}\n onMouseOver={handleMouseOver}\n onMouseUp={handleMouseUp}\n ref={handleRef}\n style={style}\n >\n {trigger}\n {isOpen ? (\n <div className={BODY_CLASS_NAME} ref={setDropdownBodyElement}>\n {childrenCount > 1 ? (children as ChildrenTuple)[1] : children}\n </div>\n ) : null}\n </div>\n </Fragment>\n );\n}\n\nfunction getBoundingAncestor(element?: MaybeHTMLElement): MaybeHTMLElement {\n while (element?.parentElement) {\n // If we’ve reached the body, use that as boundingElement\n if (element.parentElement.tagName === 'BODY') return element.parentElement;\n // Only need to check one overflow direction, because if either direction\n // is not visible, neither can be visible\n if (getComputedStyle(element.parentElement).overflowX !== 'visible') {\n return element.parentElement;\n }\n\n element = element.parentElement as MaybeHTMLElement;\n }\n\n return null;\n}\n"],"names":["ROOT_CLASS_NAME","ROOT_SELECTOR","BODY_CLASS_NAME","LABEL_CLASS_NAME","LABEL_TEXT_CLASS_NAME","TRIGGER_CLASS_NAME","BODY_SELECTOR","LABEL_SELECTOR","LABEL_TEXT_SELECTOR","TRIGGER_SELECTOR","BODY_MAX_HEIGHT_VAR","BODY_MAX_WIDTH_VAR","STYLES","SYSTEM_UI_FONT","ITEM_SELECTOR","getItemElements","dropdownElement","bodyElement","querySelector","items","querySelectorAll","length","children","getActiveItemElement","clearItemElementsState","itemElements","forEach","itemElement","hasAttribute","dataset","uktActive","setActiveItem","element","index","indexAddend","isExactMatch","text","Array","from","lastIndex","currentActiveIndex","findIndex","nextActiveIndex","itemTexts","map","innerText","textToCompare","toLowerCase","itemText","startsWith","bestMatch","getBestMatch","nextActiveItem","setAttribute","parentElement","scrollableParent","isScrollable","scrollHeight","clientHeight","parentRect","getBoundingClientRect","itemRect","isAboveTop","top","isBelowBottom","bottom","scrollTop","Children","Fragment","useEffect","useRef","useState","React","noop","CHILDREN_ERROR","TEXT_INPUT_SELECTOR","idCounter","Dropdown","t0","$","_c","allowCreate","allowEmpty","t1","className","disabled","hasItems","t2","isOpenOnMount","isSearchable","keepOpenOnSubmit","t3","label","name","onClick","onClose","onMouseDown","onMouseUp","onOpen","onSubmitItem","placeholder","style","styleFromProps","tabIndex","value","undefined","childrenCount","count","Error","console","error","trigger","t4","isValidElement","isTriggerFromProps","isOpen","setIsOpen","isOpening","setIsOpening","setDropdownElement","dropdownBodyElement","setDropdownBodyElement","id","_temp","inputElementRef","closingTimerRef","isOpeningTimerRef","currentInputMethodRef","clearEnteredCharactersTimerRef","enteredCharactersRef","mouseDownPositionRef","allowCreateRef","allowEmptyRef","hasItemsRef","isOpenRef","isOpeningRef","keepOpenOnSubmitRef","onCloseRef","onOpenRef","onSubmitItemRef","valueRef","t5","t6","current","isMountedRef","t7","t8","t9","clearTimeout","closeDropdown","t10","event","setTimeout","itemLabel","ownerDocument","activeElement","blur","nextValue","uktValue","handleSubmitItem","t11","t12","clientX","clientY","initialPosition","Math","abs","handleMouseMove","event_0","eventTarget","target","item","closest","element_0","handleMouseOver","t13","event_1","activeItem","eventRelatedTarget","relatedTarget","contains","handleMouseOut","t14","event_2","handleMouseDown","t15","event_3","eventTarget_0","handleMouseUp","t16","event_4","altKey","ctrlKey","key","metaKey","eventTarget_1","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEventTargetUsingKeyEvent","isEditingCharacters","test","slice","handleKeyDown","t17","ignoreUsedKeyboardEvents","onKeyDown","useKeyboardEvents","cleanupEventListenersRef","t18","ref","inputElement","firstElementChild","matches","handleGlobalMouseDown","t19","eventTarget_2","handleGlobalMouseUp","t20","target_0","eventTarget_3","handleGlobalFocusIn","t21","target_1","eventTarget_4","addEventListener","document","focus","handleInput","event_5","input","isDeleting","removeEventListener","handleRef","dropdownRect","useBoundingClientRect","dropdownBodyRect","getBoundingAncestor","boundingElement","boundingElementRect","maxHeight","maxWidth","maxHeightUp","maxHeightDown","maxWidthLeft","right","left","maxWidthRight","t22","t23","Symbol","for","t24","t25","t26","clsx","t27","t28","t29","tagName","getComputedStyle","overflowX"],"mappings":"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"}
|
package/dist/styles.d.ts
CHANGED
|
@@ -10,4 +10,4 @@ export declare const LABEL_TEXT_SELECTOR = ".uktdropdown-label-text";
|
|
|
10
10
|
export declare const TRIGGER_SELECTOR = ".uktdropdown-trigger";
|
|
11
11
|
export declare const BODY_MAX_HEIGHT_VAR = "--uktdd-body-max-height";
|
|
12
12
|
export declare const BODY_MAX_WIDTH_VAR = "--uktdd-body-max-width";
|
|
13
|
-
export declare const STYLES = "\n:root {\n --uktdd-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n --uktdd-body-bg-color: #fff;\n --uktdd-body-bg-color-hover: rgb(105,162,249);\n --uktdd-body-color-hover: #fff;\n --uktdd-body-buffer: 10px;\n --uktdd-body-max-height: calc(100vh - var(--uktdd-body-buffer));\n --uktdd-body-max-width: calc(100vw - var(--uktdd-body-buffer));\n --uktdd-body-pad-bottom: 9px;\n --uktdd-body-pad-left: 12px;\n --uktdd-body-pad-right: 12px;\n --uktdd-body-pad-top: 9px;\n --uktdd-label-pad-right: 10px;\n}\n.uktdropdown,\n.uktdropdown-trigger {\n font-family: var(--uktdd-font-family);\n}\n.uktdropdown {\n
|
|
13
|
+
export declare const STYLES = "\n:root {\n --uktdd-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n --uktdd-body-bg-color: #fff;\n --uktdd-body-bg-color-hover: rgb(105,162,249);\n --uktdd-body-color-hover: #fff;\n --uktdd-body-buffer: 10px;\n --uktdd-body-max-height: calc(100vh - var(--uktdd-body-buffer));\n --uktdd-body-max-width: calc(100vw - var(--uktdd-body-buffer));\n --uktdd-body-pad-bottom: 9px;\n --uktdd-body-pad-left: 12px;\n --uktdd-body-pad-right: 12px;\n --uktdd-body-pad-top: 9px;\n --uktdd-label-pad-right: 10px;\n}\n.uktdropdown,\n.uktdropdown-trigger {\n font-family: var(--uktdd-font-family);\n}\n.uktdropdown {\n width: max-content;\n}\n.uktdropdown.disabled {\n pointer-events: none;\n}\n.uktdropdown > * {\n cursor: default;\n}\n.uktdropdown-label {\n display: flex;\n align-items: center;\n}\n.uktdropdown-label-text {\n padding-right: var(--uktdd-label-pad-right);\n}\n.uktdropdown-body {\n box-sizing: border-box;\n position: absolute;\n top: anchor(bottom);\n left: anchor(left);\n position-try-fallbacks: --uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;\n min-height: 50px;\n max-height: var(--uktdd-body-max-height);\n min-width: min(50px, 100%);\n max-width: var(--uktdd-body-max-width);\n overflow: auto;\n z-index: 2;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);\n background-color: var(--uktdd-body-bg-color);\n box-shadow: 0 8px 18px rgba(0,0,0,0.25);\n}\n@position-try --uktdd-top-left {\n bottom: anchor(top);\n left: anchor(left);\n top: revert;\n right: revert;\n}\n@position-try --uktdd-bottom-right {\n top: anchor(bottom);\n right: anchor(right);\n bottom: revert;\n left: revert;\n}\n@position-try --uktdd-top-right {\n bottom: anchor(top);\n right: anchor(right);\n top: revert;\n left: revert;\n}\n.uktdropdown-body.has-items {\n user-select: none;\n}\n.uktdropdown-body [data-ukt-active] {\n background-color: var(--uktdd-body-bg-color-hover);\n color: var(--uktdd-body-color-hover);\n}\n";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acusti/dropdown",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.48.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": "./dist/Dropdown.js",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@types/react": "^19.1.6",
|
|
48
48
|
"@vitejs/plugin-react": "^4.5.0",
|
|
49
49
|
"babel-plugin-react-compiler": "rc",
|
|
50
|
-
"happy-dom": "^17.
|
|
50
|
+
"happy-dom": "^17.5.6",
|
|
51
51
|
"react": "^19",
|
|
52
52
|
"react-dom": "^19",
|
|
53
53
|
"typescript": "5.8.3",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@acusti/matchmaking": "^0.10.0",
|
|
60
60
|
"@acusti/styling": "^2.0.0",
|
|
61
|
-
"@acusti/use-
|
|
61
|
+
"@acusti/use-bounding-client-rect": "^2.0.1",
|
|
62
62
|
"@acusti/use-keyboard-events": "^0.11.0",
|
|
63
63
|
"clsx": "^2"
|
|
64
64
|
},
|