@acusti/dropdown 0.49.0 → 0.50.1

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.
@@ -1,7 +1,7 @@
1
- import * as React from 'react';
1
+ import { CSSProperties, JSX, MouseEvent as ReactMouseEvent, ReactNode, SyntheticEvent } from 'react';
2
2
  export type Item = {
3
3
  element: MaybeHTMLElement;
4
- event: Event | React.SyntheticEvent<HTMLElement>;
4
+ event: Event | SyntheticEvent<HTMLElement>;
5
5
  label: string;
6
6
  value: string;
7
7
  };
@@ -19,7 +19,7 @@ export type Props = {
19
19
  /**
20
20
  * Can take a single React element or exactly two renderable children.
21
21
  */
22
- children: ChildrenTuple | React.JSX.Element;
22
+ children: ChildrenTuple | JSX.Element;
23
23
  className?: string;
24
24
  disabled?: boolean;
25
25
  /**
@@ -39,10 +39,10 @@ export type Props = {
39
39
  * Used as search input’s name.
40
40
  */
41
41
  name?: string;
42
- onClick?: (event: React.MouseEvent<HTMLElement>) => unknown;
42
+ onClick?: (event: ReactMouseEvent<HTMLElement>) => unknown;
43
43
  onClose?: () => unknown;
44
- onMouseDown?: (event: React.MouseEvent<HTMLElement>) => unknown;
45
- onMouseUp?: (event: React.MouseEvent<HTMLElement>) => unknown;
44
+ onMouseDown?: (event: ReactMouseEvent<HTMLElement>) => unknown;
45
+ onMouseUp?: (event: ReactMouseEvent<HTMLElement>) => unknown;
46
46
  onOpen?: () => unknown;
47
47
  onSubmitItem?: (payload: Item) => void;
48
48
  /**
@@ -50,7 +50,7 @@ export type Props = {
50
50
  * Used as search input’s placeholder.
51
51
  */
52
52
  placeholder?: string;
53
- style?: React.CSSProperties;
53
+ style?: CSSProperties;
54
54
  /**
55
55
  * Only usable in conjunction with {isSearchable: true}.
56
56
  * Used as search input’s tabIndex.
@@ -62,7 +62,7 @@ export type Props = {
62
62
  */
63
63
  value?: string;
64
64
  };
65
- type ChildrenTuple = [React.ReactNode, React.ReactNode] | readonly [React.ReactNode, React.ReactNode];
65
+ type ChildrenTuple = [ReactNode, ReactNode] | readonly [ReactNode, ReactNode];
66
66
  type MaybeHTMLElement = HTMLElement | null;
67
- export default function Dropdown({ allowCreate, allowEmpty, children, className, disabled, hasItems, isOpenOnMount, isSearchable, keepOpenOnSubmit, label, minHeightBody, minWidthBody, name, onClick, onClose, onMouseDown, onMouseUp, onOpen, onSubmitItem, placeholder, style: styleFromProps, tabIndex, value, }: Props): React.JSX.Element;
67
+ export default function Dropdown({ allowCreate, allowEmpty, children, className, disabled, hasItems, isOpenOnMount, isSearchable, keepOpenOnSubmit, label, minHeightBody, minWidthBody, name, onClick, onClose, onMouseDown, onMouseUp, onOpen, onSubmitItem, placeholder, style: styleFromProps, tabIndex, value, }: Props): import("react/jsx-runtime").JSX.Element;
68
68
  export {};
package/dist/Dropdown.js CHANGED
@@ -4,7 +4,7 @@ import { SYSTEM_UI_FONT, Style } from "@acusti/styling";
4
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
- import * as React from "react";
7
+ import { Children, useState, useId, useRef, useEffect, isValidElement, Fragment } from "react";
8
8
  import { getBestMatch } from "@acusti/matchmaking";
9
9
  const ROOT_CLASS_NAME = "uktdropdown";
10
10
  const ROOT_SELECTOR = `.${ROOT_CLASS_NAME}`;
@@ -212,20 +212,10 @@ const setActiveItem = ({
212
212
  }
213
213
  }
214
214
  };
215
- const {
216
- Children,
217
- Fragment,
218
- useEffect,
219
- useRef,
220
- useState
221
- } = React;
222
- const noop = () => {
223
- };
224
215
  const CHILDREN_ERROR = "@acusti/dropdown requires either 1 child (the dropdown body) or 2 children: the dropdown trigger and the dropdown body.";
225
216
  const TEXT_INPUT_SELECTOR = "input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea";
226
- let idCounter = 0;
227
217
  function Dropdown(t0) {
228
- const $ = c(119);
218
+ const $ = c(99);
229
219
  const {
230
220
  allowCreate,
231
221
  allowEmpty: t1,
@@ -267,20 +257,11 @@ function Dropdown(t0) {
267
257
  if (childrenCount > 1) {
268
258
  trigger = children[0];
269
259
  }
270
- let t6;
271
- if ($[0] !== trigger) {
272
- t6 = React.isValidElement(trigger);
273
- $[0] = trigger;
274
- $[1] = t6;
275
- } else {
276
- t6 = $[1];
277
- }
278
- const isTriggerFromProps = t6;
279
260
  const [isOpen, setIsOpen] = useState(isOpenOnMount ?? false);
280
261
  const [isOpening, setIsOpening] = useState(!isOpenOnMount);
281
262
  const [dropdownElement, setDropdownElement] = useState(null);
282
263
  const [dropdownBodyElement, setDropdownBodyElement] = useState(null);
283
- const [id] = useState(_temp);
264
+ const id = useId();
284
265
  const inputElementRef = useRef(null);
285
266
  const closingTimerRef = useRef(null);
286
267
  const isOpeningTimerRef = useRef(null);
@@ -298,10 +279,10 @@ function Dropdown(t0) {
298
279
  const onOpenRef = useRef(onOpen);
299
280
  const onSubmitItemRef = useRef(onSubmitItem);
300
281
  const valueRef = useRef(value);
282
+ let t6;
301
283
  let t7;
302
- let t8;
303
- if ($[2] !== allowCreate || $[3] !== allowEmpty || $[4] !== hasItems || $[5] !== isOpen || $[6] !== isOpening || $[7] !== keepOpenOnSubmit || $[8] !== onClose || $[9] !== onOpen || $[10] !== onSubmitItem || $[11] !== value) {
304
- t7 = () => {
284
+ if ($[0] !== allowCreate || $[1] !== allowEmpty || $[2] !== hasItems || $[3] !== isOpen || $[4] !== isOpening || $[5] !== keepOpenOnSubmit || $[6] !== onClose || $[7] !== onOpen || $[8] !== onSubmitItem || $[9] !== value) {
285
+ t6 = () => {
305
286
  allowCreateRef.current = allowCreate;
306
287
  allowEmptyRef.current = allowEmpty;
307
288
  hasItemsRef.current = hasItems;
@@ -313,29 +294,29 @@ function Dropdown(t0) {
313
294
  onSubmitItemRef.current = onSubmitItem;
314
295
  valueRef.current = value;
315
296
  };
316
- t8 = [allowCreate, allowEmpty, hasItems, isOpen, isOpening, keepOpenOnSubmit, onClose, onOpen, onSubmitItem, value];
317
- $[2] = allowCreate;
318
- $[3] = allowEmpty;
319
- $[4] = hasItems;
320
- $[5] = isOpen;
321
- $[6] = isOpening;
322
- $[7] = keepOpenOnSubmit;
323
- $[8] = onClose;
324
- $[9] = onOpen;
325
- $[10] = onSubmitItem;
326
- $[11] = value;
327
- $[12] = t7;
328
- $[13] = t8;
297
+ t7 = [allowCreate, allowEmpty, hasItems, isOpen, isOpening, keepOpenOnSubmit, onClose, onOpen, onSubmitItem, value];
298
+ $[0] = allowCreate;
299
+ $[1] = allowEmpty;
300
+ $[2] = hasItems;
301
+ $[3] = isOpen;
302
+ $[4] = isOpening;
303
+ $[5] = keepOpenOnSubmit;
304
+ $[6] = onClose;
305
+ $[7] = onOpen;
306
+ $[8] = onSubmitItem;
307
+ $[9] = value;
308
+ $[10] = t6;
309
+ $[11] = t7;
329
310
  } else {
330
- t7 = $[12];
331
- t8 = $[13];
311
+ t6 = $[10];
312
+ t7 = $[11];
332
313
  }
333
- useEffect(t7, t8);
314
+ useEffect(t6, t7);
334
315
  const isMountedRef = useRef(false);
335
- let t10;
316
+ let t8;
336
317
  let t9;
337
- if ($[14] !== isOpen) {
338
- t9 = () => {
318
+ if ($[12] !== isOpen) {
319
+ t8 = () => {
339
320
  if (!isMountedRef.current) {
340
321
  isMountedRef.current = true;
341
322
  if (isOpenRef.current && onOpenRef.current) {
@@ -351,18 +332,18 @@ function Dropdown(t0) {
351
332
  }
352
333
  }
353
334
  };
354
- t10 = [isOpen];
355
- $[14] = isOpen;
356
- $[15] = t10;
357
- $[16] = t9;
335
+ t9 = [isOpen];
336
+ $[12] = isOpen;
337
+ $[13] = t8;
338
+ $[14] = t9;
358
339
  } else {
359
- t10 = $[15];
360
- t9 = $[16];
340
+ t8 = $[13];
341
+ t9 = $[14];
361
342
  }
362
- useEffect(t9, t10);
363
- let t11;
364
- if ($[17] !== setIsOpen || $[18] !== setIsOpening) {
365
- t11 = () => {
343
+ useEffect(t8, t9);
344
+ let t10;
345
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
346
+ t10 = () => {
366
347
  setIsOpen(false);
367
348
  setIsOpening(false);
368
349
  mouseDownPositionRef.current = null;
@@ -371,17 +352,14 @@ function Dropdown(t0) {
371
352
  closingTimerRef.current = null;
372
353
  }
373
354
  };
374
- $[17] = setIsOpen;
375
- $[18] = setIsOpening;
376
- $[19] = t11;
355
+ $[15] = t10;
377
356
  } else {
378
- t11 = $[19];
357
+ t10 = $[15];
379
358
  }
380
- const closeDropdown = t11;
381
- let t12;
382
- if ($[20] !== closeDropdown || $[21] !== dropdownElement) {
383
- t12 = (event) => {
384
- var _a;
359
+ const closeDropdown = t10;
360
+ let t11;
361
+ if ($[16] !== dropdownElement) {
362
+ t11 = (event) => {
385
363
  if (isOpenRef.current && !keepOpenOnSubmitRef.current) {
386
364
  closingTimerRef.current = setTimeout(closeDropdown, 90);
387
365
  }
@@ -393,11 +371,11 @@ function Dropdown(t0) {
393
371
  if (!allowEmptyRef.current) {
394
372
  return;
395
373
  }
396
- if ((_a = inputElementRef.current) == null ? void 0 : _a.value) {
374
+ if (inputElementRef.current?.value) {
397
375
  return;
398
376
  }
399
377
  }
400
- let itemLabel = (element == null ? void 0 : element.innerText) ?? "";
378
+ let itemLabel = element?.innerText ?? "";
401
379
  if (inputElementRef.current) {
402
380
  if (!element) {
403
381
  itemLabel = inputElementRef.current.value;
@@ -408,7 +386,7 @@ function Dropdown(t0) {
408
386
  inputElementRef.current.blur();
409
387
  }
410
388
  }
411
- const nextValue = (element == null ? void 0 : element.dataset.uktValue) ?? itemLabel;
389
+ const nextValue = element?.dataset.uktValue ?? itemLabel;
412
390
  if (valueRef.current && valueRef.current === nextValue) {
413
391
  return;
414
392
  }
@@ -421,20 +399,19 @@ function Dropdown(t0) {
421
399
  });
422
400
  }
423
401
  };
424
- $[20] = closeDropdown;
425
- $[21] = dropdownElement;
426
- $[22] = t12;
402
+ $[16] = dropdownElement;
403
+ $[17] = t11;
427
404
  } else {
428
- t12 = $[22];
405
+ t11 = $[17];
429
406
  }
430
- const handleSubmitItem = t12;
431
- let t13;
432
- if ($[23] !== setIsOpening) {
433
- t13 = (t142) => {
407
+ const handleSubmitItem = t11;
408
+ let t12;
409
+ if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
410
+ t12 = (t132) => {
434
411
  const {
435
412
  clientX,
436
413
  clientY
437
- } = t142;
414
+ } = t132;
438
415
  currentInputMethodRef.current = "mouse";
439
416
  const initialPosition = mouseDownPositionRef.current;
440
417
  if (!initialPosition) {
@@ -445,15 +422,14 @@ function Dropdown(t0) {
445
422
  }
446
423
  setIsOpening(false);
447
424
  };
448
- $[23] = setIsOpening;
449
- $[24] = t13;
425
+ $[18] = t12;
450
426
  } else {
451
- t13 = $[24];
427
+ t12 = $[18];
452
428
  }
453
- const handleMouseMove = t13;
454
- let t14;
455
- if ($[25] !== dropdownElement) {
456
- t14 = (event_0) => {
429
+ const handleMouseMove = t12;
430
+ let t13;
431
+ if ($[19] !== dropdownElement) {
432
+ t13 = (event_0) => {
457
433
  if (!hasItemsRef.current) {
458
434
  return;
459
435
  }
@@ -480,15 +456,15 @@ function Dropdown(t0) {
480
456
  }
481
457
  }
482
458
  };
483
- $[25] = dropdownElement;
484
- $[26] = t14;
459
+ $[19] = dropdownElement;
460
+ $[20] = t13;
485
461
  } else {
486
- t14 = $[26];
462
+ t13 = $[20];
487
463
  }
488
- const handleMouseOver = t14;
489
- let t15;
490
- if ($[27] !== dropdownElement) {
491
- t15 = (event_1) => {
464
+ const handleMouseOver = t13;
465
+ let t14;
466
+ if ($[21] !== dropdownElement) {
467
+ t14 = (event_1) => {
492
468
  if (!hasItemsRef.current) {
493
469
  return;
494
470
  }
@@ -502,15 +478,15 @@ function Dropdown(t0) {
502
478
  }
503
479
  delete activeItem.dataset.uktActive;
504
480
  };
505
- $[27] = dropdownElement;
506
- $[28] = t15;
481
+ $[21] = dropdownElement;
482
+ $[22] = t14;
507
483
  } else {
508
- t15 = $[28];
484
+ t14 = $[22];
509
485
  }
510
- const handleMouseOut = t15;
511
- let t16;
512
- if ($[29] !== onMouseDown || $[30] !== setIsOpen || $[31] !== setIsOpening) {
513
- t16 = (event_2) => {
486
+ const handleMouseOut = t14;
487
+ let t15;
488
+ if ($[23] !== onMouseDown) {
489
+ t15 = (event_2) => {
514
490
  if (onMouseDown) {
515
491
  onMouseDown(event_2);
516
492
  }
@@ -528,17 +504,15 @@ function Dropdown(t0) {
528
504
  isOpeningTimerRef.current = null;
529
505
  }, 1e3);
530
506
  };
531
- $[29] = onMouseDown;
532
- $[30] = setIsOpen;
533
- $[31] = setIsOpening;
534
- $[32] = t16;
507
+ $[23] = onMouseDown;
508
+ $[24] = t15;
535
509
  } else {
536
- t16 = $[32];
510
+ t15 = $[24];
537
511
  }
538
- const handleMouseDown = t16;
539
- let t17;
540
- if ($[33] !== closeDropdown || $[34] !== handleSubmitItem || $[35] !== onMouseUp) {
541
- t17 = (event_3) => {
512
+ const handleMouseDown = t15;
513
+ let t16;
514
+ if ($[25] !== handleSubmitItem || $[26] !== onMouseUp) {
515
+ t16 = (event_3) => {
542
516
  if (onMouseUp) {
543
517
  onMouseUp(event_3);
544
518
  }
@@ -557,17 +531,16 @@ function Dropdown(t0) {
557
531
  }
558
532
  handleSubmitItem(event_3);
559
533
  };
560
- $[33] = closeDropdown;
561
- $[34] = handleSubmitItem;
562
- $[35] = onMouseUp;
563
- $[36] = t17;
534
+ $[25] = handleSubmitItem;
535
+ $[26] = onMouseUp;
536
+ $[27] = t16;
564
537
  } else {
565
- t17 = $[36];
538
+ t16 = $[27];
566
539
  }
567
- const handleMouseUp = t17;
568
- let t18;
569
- if ($[37] !== closeDropdown || $[38] !== dropdownElement || $[39] !== handleSubmitItem || $[40] !== setIsOpen) {
570
- t18 = (event_4) => {
540
+ const handleMouseUp = t16;
541
+ let t17;
542
+ if ($[28] !== dropdownElement || $[29] !== handleSubmitItem) {
543
+ t17 = (event_4) => {
571
544
  const {
572
545
  altKey,
573
546
  ctrlKey,
@@ -666,42 +639,37 @@ function Dropdown(t0) {
666
639
  }
667
640
  }
668
641
  };
669
- $[37] = closeDropdown;
670
- $[38] = dropdownElement;
671
- $[39] = handleSubmitItem;
672
- $[40] = setIsOpen;
673
- $[41] = t18;
642
+ $[28] = dropdownElement;
643
+ $[29] = handleSubmitItem;
644
+ $[30] = t17;
674
645
  } else {
675
- t18 = $[41];
646
+ t17 = $[30];
676
647
  }
677
- const handleKeyDown = t18;
678
- let t19;
679
- if ($[42] !== handleKeyDown) {
680
- t19 = {
648
+ const handleKeyDown = t17;
649
+ let t18;
650
+ if ($[31] !== handleKeyDown) {
651
+ t18 = {
681
652
  ignoreUsedKeyboardEvents: false,
682
653
  onKeyDown: handleKeyDown
683
654
  };
684
- $[42] = handleKeyDown;
685
- $[43] = t19;
655
+ $[31] = handleKeyDown;
656
+ $[32] = t18;
686
657
  } else {
687
- t19 = $[43];
658
+ t18 = $[32];
688
659
  }
689
- useKeyboardEvents(t19);
690
- const cleanupEventListenersRef = useRef(noop);
691
- let t20;
692
- if ($[44] !== closeDropdown || $[45] !== isOpenOnMount || $[46] !== isTriggerFromProps || $[47] !== setDropdownElement || $[48] !== setIsOpen || $[49] !== setIsOpening) {
693
- t20 = (ref) => {
660
+ useKeyboardEvents(t18);
661
+ let t19;
662
+ if ($[33] !== isOpenOnMount) {
663
+ t19 = (ref) => {
694
664
  setDropdownElement(ref);
695
665
  if (!ref) {
696
- cleanupEventListenersRef.current();
697
- cleanupEventListenersRef.current = noop;
698
666
  return;
699
667
  }
700
668
  const {
701
669
  ownerDocument
702
670
  } = ref;
703
671
  let inputElement = inputElementRef.current;
704
- if (isTriggerFromProps && !inputElement && ref.firstElementChild) {
672
+ if (!inputElement && ref.firstElementChild) {
705
673
  if (ref.firstElementChild.matches(TEXT_INPUT_SELECTOR)) {
706
674
  inputElement = ref.firstElementChild;
707
675
  } else {
@@ -709,19 +677,19 @@ function Dropdown(t0) {
709
677
  }
710
678
  inputElementRef.current = inputElement;
711
679
  }
712
- const handleGlobalMouseDown = (t212) => {
680
+ const handleGlobalMouseDown = (t202) => {
713
681
  const {
714
682
  target
715
- } = t212;
683
+ } = t202;
716
684
  const eventTarget_2 = target;
717
685
  if (!ref.contains(eventTarget_2)) {
718
686
  closeDropdown();
719
687
  }
720
688
  };
721
- const handleGlobalMouseUp = (t222) => {
689
+ const handleGlobalMouseUp = (t212) => {
722
690
  const {
723
691
  target: target_0
724
- } = t222;
692
+ } = t212;
725
693
  if (!isOpenRef.current || closingTimerRef.current) {
726
694
  return;
727
695
  }
@@ -738,10 +706,10 @@ function Dropdown(t0) {
738
706
  closeDropdown();
739
707
  }
740
708
  };
741
- const handleGlobalFocusIn = (t232) => {
709
+ const handleGlobalFocusIn = (t222) => {
742
710
  const {
743
711
  target: target_1
744
- } = t232;
712
+ } = t222;
745
713
  if (!isOpenRef.current) {
746
714
  return;
747
715
  }
@@ -781,7 +749,7 @@ function Dropdown(t0) {
781
749
  if (inputElement) {
782
750
  inputElement.addEventListener("input", handleInput);
783
751
  }
784
- cleanupEventListenersRef.current = () => {
752
+ return () => {
785
753
  document.removeEventListener("focusin", handleGlobalFocusIn);
786
754
  document.removeEventListener("mousedown", handleGlobalMouseDown);
787
755
  document.removeEventListener("mouseup", handleGlobalMouseUp);
@@ -795,250 +763,237 @@ function Dropdown(t0) {
795
763
  }
796
764
  };
797
765
  };
798
- $[44] = closeDropdown;
799
- $[45] = isOpenOnMount;
800
- $[46] = isTriggerFromProps;
801
- $[47] = setDropdownElement;
802
- $[48] = setIsOpen;
803
- $[49] = setIsOpening;
804
- $[50] = t20;
766
+ $[33] = isOpenOnMount;
767
+ $[34] = t19;
805
768
  } else {
806
- t20 = $[50];
769
+ t19 = $[34];
807
770
  }
808
- const handleRef = t20;
809
- if (!isTriggerFromProps) {
771
+ const handleRef = t19;
772
+ if (!isValidElement(trigger)) {
810
773
  if (isSearchable) {
811
- const t212 = value ?? "";
812
- let t222;
813
- if ($[51] !== setIsOpen) {
814
- t222 = () => setIsOpen(true);
815
- $[51] = setIsOpen;
816
- $[52] = t222;
774
+ const t202 = value ?? "";
775
+ let t212;
776
+ if ($[35] === Symbol.for("react.memo_cache_sentinel")) {
777
+ t212 = () => setIsOpen(true);
778
+ $[35] = t212;
817
779
  } else {
818
- t222 = $[52];
780
+ t212 = $[35];
819
781
  }
820
- let t232;
821
- if ($[53] !== disabled || $[54] !== name || $[55] !== placeholder || $[56] !== t212 || $[57] !== t222 || $[58] !== tabIndex) {
822
- t232 = /* @__PURE__ */ jsx("input", { autoComplete: "off", className: TRIGGER_CLASS_NAME, defaultValue: t212, disabled, name, onFocus: t222, placeholder, ref: inputElementRef, tabIndex, type: "text" });
823
- $[53] = disabled;
824
- $[54] = name;
825
- $[55] = placeholder;
826
- $[56] = t212;
827
- $[57] = t222;
828
- $[58] = tabIndex;
829
- $[59] = t232;
782
+ let t222;
783
+ if ($[36] !== disabled || $[37] !== name || $[38] !== placeholder || $[39] !== t202 || $[40] !== tabIndex) {
784
+ t222 = /* @__PURE__ */ jsx("input", { autoComplete: "off", className: TRIGGER_CLASS_NAME, defaultValue: t202, disabled, name, onFocus: t212, placeholder, ref: inputElementRef, tabIndex, type: "text" });
785
+ $[36] = disabled;
786
+ $[37] = name;
787
+ $[38] = placeholder;
788
+ $[39] = t202;
789
+ $[40] = tabIndex;
790
+ $[41] = t222;
830
791
  } else {
831
- t232 = $[59];
792
+ t222 = $[41];
832
793
  }
833
- trigger = t232;
794
+ trigger = t222;
834
795
  } else {
835
- let t212;
836
- if ($[60] !== trigger) {
837
- t212 = /* @__PURE__ */ jsx("button", { className: TRIGGER_CLASS_NAME, tabIndex: 0, children: trigger });
838
- $[60] = trigger;
839
- $[61] = t212;
796
+ let t202;
797
+ if ($[42] !== trigger) {
798
+ t202 = /* @__PURE__ */ jsx("button", { className: TRIGGER_CLASS_NAME, tabIndex: 0, children: trigger });
799
+ $[42] = trigger;
800
+ $[43] = t202;
840
801
  } else {
841
- t212 = $[61];
802
+ t202 = $[43];
842
803
  }
843
- trigger = t212;
804
+ trigger = t202;
844
805
  }
845
806
  }
846
807
  if (label) {
847
- let t212;
848
- if ($[62] !== label) {
849
- t212 = /* @__PURE__ */ jsx("div", { className: LABEL_TEXT_CLASS_NAME, children: label });
850
- $[62] = label;
851
- $[63] = t212;
808
+ let t202;
809
+ if ($[44] !== label) {
810
+ t202 = /* @__PURE__ */ jsx("div", { className: LABEL_TEXT_CLASS_NAME, children: label });
811
+ $[44] = label;
812
+ $[45] = t202;
852
813
  } else {
853
- t212 = $[63];
814
+ t202 = $[45];
854
815
  }
855
- let t222;
856
- if ($[64] !== t212 || $[65] !== trigger) {
857
- t222 = /* @__PURE__ */ jsxs("label", { className: LABEL_CLASS_NAME, children: [
858
- t212,
816
+ let t212;
817
+ if ($[46] !== t202 || $[47] !== trigger) {
818
+ t212 = /* @__PURE__ */ jsxs("label", { className: LABEL_CLASS_NAME, children: [
819
+ t202,
859
820
  trigger
860
821
  ] });
861
- $[64] = t212;
862
- $[65] = trigger;
863
- $[66] = t222;
822
+ $[46] = t202;
823
+ $[47] = trigger;
824
+ $[48] = t212;
864
825
  } else {
865
- t222 = $[66];
826
+ t212 = $[48];
866
827
  }
867
- trigger = t222;
828
+ trigger = t212;
868
829
  }
869
830
  const dropdownRect = useBoundingClientRect(dropdownElement);
870
831
  const dropdownBodyRect = useBoundingClientRect(dropdownBodyElement);
871
- let t21;
872
- if ($[67] !== dropdownBodyElement) {
873
- t21 = getBoundingAncestor(dropdownBodyElement);
874
- $[67] = dropdownBodyElement;
875
- $[68] = t21;
832
+ let t20;
833
+ if ($[49] !== dropdownBodyElement) {
834
+ t20 = getBoundingAncestor(dropdownBodyElement);
835
+ $[49] = dropdownBodyElement;
836
+ $[50] = t20;
876
837
  } else {
877
- t21 = $[68];
838
+ t20 = $[50];
878
839
  }
879
- const boundingElement = t21;
840
+ const boundingElement = t20;
880
841
  const boundingElementRect = useBoundingClientRect(boundingElement);
881
842
  let maxHeight;
882
843
  let maxWidth;
883
844
  if (dropdownBodyRect.top != null && dropdownRect.top != null && boundingElementRect.top != null) {
884
845
  const maxHeightUp = dropdownBodyRect.bottom - boundingElementRect.top;
885
846
  const maxHeightDown = boundingElementRect.bottom - dropdownBodyRect.top;
886
- let t222;
887
- if ($[69] !== dropdownBodyRect.top || $[70] !== dropdownRect.top || $[71] !== maxHeightDown || $[72] !== maxHeightUp) {
888
- t222 = Math.round(dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp);
889
- $[69] = dropdownBodyRect.top;
890
- $[70] = dropdownRect.top;
891
- $[71] = maxHeightDown;
892
- $[72] = maxHeightUp;
893
- $[73] = t222;
847
+ let t212;
848
+ if ($[51] !== dropdownBodyRect.top || $[52] !== dropdownRect.top || $[53] !== maxHeightDown || $[54] !== maxHeightUp) {
849
+ t212 = Math.round(dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp);
850
+ $[51] = dropdownBodyRect.top;
851
+ $[52] = dropdownRect.top;
852
+ $[53] = maxHeightDown;
853
+ $[54] = maxHeightUp;
854
+ $[55] = t212;
894
855
  } else {
895
- t222 = $[73];
856
+ t212 = $[55];
896
857
  }
897
- maxHeight = t222;
858
+ maxHeight = t212;
898
859
  const maxWidthLeft = dropdownBodyRect.right - boundingElementRect.left;
899
860
  const maxWidthRight = boundingElementRect.right - dropdownBodyRect.left;
900
- let t232;
901
- if ($[74] !== dropdownBodyRect.left || $[75] !== dropdownRect.left || $[76] !== maxWidthLeft || $[77] !== maxWidthRight) {
902
- t232 = Math.round(dropdownBodyRect.left > dropdownRect.left ? maxWidthRight : maxWidthLeft);
903
- $[74] = dropdownBodyRect.left;
904
- $[75] = dropdownRect.left;
905
- $[76] = maxWidthLeft;
906
- $[77] = maxWidthRight;
907
- $[78] = t232;
861
+ let t222;
862
+ if ($[56] !== dropdownBodyRect.left || $[57] !== dropdownRect.left || $[58] !== maxWidthLeft || $[59] !== maxWidthRight) {
863
+ t222 = Math.round(dropdownBodyRect.left > dropdownRect.left ? maxWidthRight : maxWidthLeft);
864
+ $[56] = dropdownBodyRect.left;
865
+ $[57] = dropdownRect.left;
866
+ $[58] = maxWidthLeft;
867
+ $[59] = maxWidthRight;
868
+ $[60] = t222;
908
869
  } else {
909
- t232 = $[78];
870
+ t222 = $[60];
910
871
  }
911
- maxWidth = t232;
872
+ maxWidth = t222;
912
873
  }
913
- let t22;
914
- if ($[79] !== maxHeight || $[80] !== minHeightBody) {
915
- t22 = maxHeight != null && maxHeight > minHeightBody ? {
874
+ let t21;
875
+ if ($[61] !== maxHeight || $[62] !== minHeightBody) {
876
+ t21 = maxHeight != null && maxHeight > minHeightBody ? {
916
877
  [BODY_MAX_HEIGHT_VAR]: `calc(${maxHeight}px - var(--uktdd-body-buffer))`
917
878
  } : null;
918
- $[79] = maxHeight;
919
- $[80] = minHeightBody;
920
- $[81] = t22;
879
+ $[61] = maxHeight;
880
+ $[62] = minHeightBody;
881
+ $[63] = t21;
921
882
  } else {
922
- t22 = $[81];
883
+ t21 = $[63];
923
884
  }
924
- let t23;
925
- if ($[82] !== maxWidth || $[83] !== minWidthBody) {
926
- t23 = maxWidth != null && maxWidth > minWidthBody ? {
885
+ let t22;
886
+ if ($[64] !== maxWidth || $[65] !== minWidthBody) {
887
+ t22 = maxWidth != null && maxWidth > minWidthBody ? {
927
888
  [BODY_MAX_WIDTH_VAR]: `calc(${maxWidth}px - var(--uktdd-body-buffer))`
928
889
  } : null;
929
- $[82] = maxWidth;
930
- $[83] = minWidthBody;
931
- $[84] = t23;
890
+ $[64] = maxWidth;
891
+ $[65] = minWidthBody;
892
+ $[66] = t22;
932
893
  } else {
933
- t23 = $[84];
894
+ t22 = $[66];
934
895
  }
935
- let t24;
936
- if ($[85] !== styleFromProps || $[86] !== t22 || $[87] !== t23) {
937
- t24 = {
896
+ let t23;
897
+ if ($[67] !== styleFromProps || $[68] !== t21 || $[69] !== t22) {
898
+ t23 = {
938
899
  ...styleFromProps,
939
- ...t22,
940
- ...t23
900
+ ...t21,
901
+ ...t22
941
902
  };
942
- $[85] = styleFromProps;
943
- $[86] = t22;
944
- $[87] = t23;
945
- $[88] = t24;
903
+ $[67] = styleFromProps;
904
+ $[68] = t21;
905
+ $[69] = t22;
906
+ $[70] = t23;
946
907
  } else {
947
- t24 = $[88];
908
+ t23 = $[70];
948
909
  }
949
- const style = t24;
910
+ const style = t23;
950
911
  const anchorStyles = `[data-ukt-id="${id}"] > :first-child {
951
912
  anchor-name: --uktdd-anchor${id};
952
913
  }
953
914
  [data-ukt-id="${id}"] ${BODY_SELECTOR} {
954
915
  position-anchor: --uktdd-anchor${id};
955
916
  }`;
956
- let t25;
957
- if ($[89] === Symbol.for("react.memo_cache_sentinel")) {
958
- t25 = /* @__PURE__ */ jsx(Style, { href: "@acusti/dropdown/Dropdown", children: STYLES });
959
- $[89] = t25;
917
+ let t24;
918
+ if ($[71] === Symbol.for("react.memo_cache_sentinel")) {
919
+ t24 = /* @__PURE__ */ jsx(Style, { href: "@acusti/dropdown/Dropdown", children: STYLES });
920
+ $[71] = t24;
960
921
  } else {
961
- t25 = $[89];
962
- }
963
- const t26 = `@acusti/dropdown/Dropdown/${id}`;
964
- let t27;
965
- if ($[90] !== anchorStyles || $[91] !== t26) {
966
- t27 = /* @__PURE__ */ jsx(Style, { href: t26, children: anchorStyles });
967
- $[90] = anchorStyles;
968
- $[91] = t26;
969
- $[92] = t27;
922
+ t24 = $[71];
923
+ }
924
+ const t25 = `@acusti/dropdown/Dropdown/${id}`;
925
+ let t26;
926
+ if ($[72] !== anchorStyles || $[73] !== t25) {
927
+ t26 = /* @__PURE__ */ jsx(Style, { href: t25, children: anchorStyles });
928
+ $[72] = anchorStyles;
929
+ $[73] = t25;
930
+ $[74] = t26;
970
931
  } else {
971
- t27 = $[92];
932
+ t26 = $[74];
972
933
  }
973
- let t28;
974
- if ($[93] !== className || $[94] !== disabled || $[95] !== isOpen || $[96] !== isSearchable) {
975
- t28 = clsx(ROOT_CLASS_NAME, className, {
934
+ let t27;
935
+ if ($[75] !== className || $[76] !== disabled || $[77] !== isOpen || $[78] !== isSearchable) {
936
+ t27 = clsx(ROOT_CLASS_NAME, className, {
976
937
  disabled,
977
938
  "is-open": isOpen,
978
939
  "is-searchable": isSearchable
979
940
  });
980
- $[93] = className;
981
- $[94] = disabled;
982
- $[95] = isOpen;
983
- $[96] = isSearchable;
984
- $[97] = t28;
941
+ $[75] = className;
942
+ $[76] = disabled;
943
+ $[77] = isOpen;
944
+ $[78] = isSearchable;
945
+ $[79] = t27;
985
946
  } else {
986
- t28 = $[97];
947
+ t27 = $[79];
987
948
  }
988
- let t29;
989
- if ($[98] !== children || $[99] !== childrenCount || $[100] !== isOpen || $[101] !== setDropdownBodyElement) {
990
- t29 = isOpen ? /* @__PURE__ */ jsx("div", { className: BODY_CLASS_NAME, ref: setDropdownBodyElement, children: childrenCount > 1 ? children[1] : children }) : null;
991
- $[98] = children;
992
- $[99] = childrenCount;
993
- $[100] = isOpen;
994
- $[101] = setDropdownBodyElement;
995
- $[102] = t29;
949
+ let t28;
950
+ if ($[80] !== children || $[81] !== childrenCount || $[82] !== isOpen) {
951
+ t28 = isOpen ? /* @__PURE__ */ jsx("div", { className: BODY_CLASS_NAME, ref: setDropdownBodyElement, children: childrenCount > 1 ? children[1] : children }) : null;
952
+ $[80] = children;
953
+ $[81] = childrenCount;
954
+ $[82] = isOpen;
955
+ $[83] = t28;
996
956
  } else {
997
- t29 = $[102];
957
+ t28 = $[83];
998
958
  }
999
- let t30;
1000
- if ($[103] !== handleMouseDown || $[104] !== handleMouseMove || $[105] !== handleMouseOut || $[106] !== handleMouseOver || $[107] !== handleMouseUp || $[108] !== handleRef || $[109] !== id || $[110] !== onClick || $[111] !== style || $[112] !== t28 || $[113] !== t29 || $[114] !== trigger) {
1001
- t30 = /* @__PURE__ */ jsxs("div", { className: t28, "data-ukt-id": id, onClick, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseOut: handleMouseOut, onMouseOver: handleMouseOver, onMouseUp: handleMouseUp, ref: handleRef, style, children: [
959
+ let t29;
960
+ if ($[84] !== handleMouseDown || $[85] !== handleMouseOut || $[86] !== handleMouseOver || $[87] !== handleMouseUp || $[88] !== handleRef || $[89] !== id || $[90] !== onClick || $[91] !== style || $[92] !== t27 || $[93] !== t28 || $[94] !== trigger) {
961
+ t29 = /* @__PURE__ */ jsxs("div", { className: t27, "data-ukt-id": id, onClick, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseOut: handleMouseOut, onMouseOver: handleMouseOver, onMouseUp: handleMouseUp, ref: handleRef, style, children: [
1002
962
  trigger,
1003
- t29
963
+ t28
1004
964
  ] });
1005
- $[103] = handleMouseDown;
1006
- $[104] = handleMouseMove;
1007
- $[105] = handleMouseOut;
1008
- $[106] = handleMouseOver;
1009
- $[107] = handleMouseUp;
1010
- $[108] = handleRef;
1011
- $[109] = id;
1012
- $[110] = onClick;
1013
- $[111] = style;
1014
- $[112] = t28;
1015
- $[113] = t29;
1016
- $[114] = trigger;
1017
- $[115] = t30;
965
+ $[84] = handleMouseDown;
966
+ $[85] = handleMouseOut;
967
+ $[86] = handleMouseOver;
968
+ $[87] = handleMouseUp;
969
+ $[88] = handleRef;
970
+ $[89] = id;
971
+ $[90] = onClick;
972
+ $[91] = style;
973
+ $[92] = t27;
974
+ $[93] = t28;
975
+ $[94] = trigger;
976
+ $[95] = t29;
1018
977
  } else {
1019
- t30 = $[115];
978
+ t29 = $[95];
1020
979
  }
1021
- let t31;
1022
- if ($[116] !== t27 || $[117] !== t30) {
1023
- t31 = /* @__PURE__ */ jsxs(Fragment, { children: [
1024
- t25,
1025
- t27,
1026
- t30
980
+ let t30;
981
+ if ($[96] !== t26 || $[97] !== t29) {
982
+ t30 = /* @__PURE__ */ jsxs(Fragment, { children: [
983
+ t24,
984
+ t26,
985
+ t29
1027
986
  ] });
1028
- $[116] = t27;
1029
- $[117] = t30;
1030
- $[118] = t31;
987
+ $[96] = t26;
988
+ $[97] = t29;
989
+ $[98] = t30;
1031
990
  } else {
1032
- t31 = $[118];
991
+ t30 = $[98];
1033
992
  }
1034
- return t31;
1035
- }
1036
- function _temp() {
1037
- idCounter = idCounter >= 999999 ? 0 : idCounter + 1;
1038
- return idCounter;
993
+ return t30;
1039
994
  }
1040
995
  function getBoundingAncestor(element) {
1041
- while (element == null ? void 0 : element.parentElement) {
996
+ while (element?.parentElement) {
1042
997
  if (element.parentElement.tagName === "BODY") return element.parentElement;
1043
998
  if (getComputedStyle(element.parentElement).overflowX !== "visible") {
1044
999
  return element.parentElement;
@@ -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 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 bottom: auto;\n right: auto;\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: auto;\n right: auto;\n}\n@position-try --uktdd-bottom-right {\n top: anchor(bottom);\n right: anchor(right);\n bottom: auto;\n left: auto;\n}\n@position-try --uktdd-top-right {\n bottom: anchor(top);\n right: anchor(right);\n top: auto;\n left: auto;\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 minHeightBody?: number;\n minWidthBody?: number;\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 =\n | [React.ReactNode, React.ReactNode]\n | readonly [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 minHeightBody = 30,\n minWidthBody = 100,\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 = Math.round(\n dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp,\n );\n const maxWidthLeft = dropdownBodyRect.right - boundingElementRect.left;\n const maxWidthRight = boundingElementRect.right - dropdownBodyRect.left;\n maxWidth = Math.round(\n dropdownBodyRect.left > dropdownRect.left ? maxWidthRight : maxWidthLeft,\n );\n }\n\n const style = {\n ...styleFromProps,\n ...(maxHeight != null && maxHeight > minHeightBody\n ? { [BODY_MAX_HEIGHT_VAR]: `calc(${maxHeight}px - var(--uktdd-body-buffer))` }\n : null),\n ...(maxWidth != null && maxWidth > minWidthBody\n ? { [BODY_MAX_WIDTH_VAR]: `calc(${maxWidth}px - var(--uktdd-body-buffer))` }\n : null),\n };\n\n const anchorStyles = `\\\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\n return (\n <Fragment>\n <Style href=\"@acusti/dropdown/Dropdown\">{STYLES}</Style>\n <Style href={`@acusti/dropdown/Dropdown/${id}`}>{anchorStyles}</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","minHeightBody","t4","minWidthBody","t5","name","onClick","onClose","onMouseDown","onMouseUp","onOpen","onSubmitItem","placeholder","style","styleFromProps","tabIndex","value","undefined","childrenCount","count","Error","console","error","trigger","t6","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","t7","t8","current","isMountedRef","t10","t9","t11","clearTimeout","closeDropdown","t12","event","setTimeout","itemLabel","ownerDocument","activeElement","blur","nextValue","uktValue","handleSubmitItem","t13","t14","clientX","clientY","initialPosition","Math","abs","handleMouseMove","event_0","eventTarget","target","item","closest","element_0","handleMouseOver","t15","event_1","activeItem","eventRelatedTarget","relatedTarget","contains","handleMouseOut","t16","event_2","handleMouseDown","t17","event_3","eventTarget_0","handleMouseUp","t18","event_4","altKey","ctrlKey","key","metaKey","eventTarget_1","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEventTargetUsingKeyEvent","isEditingCharacters","test","slice","handleKeyDown","t19","ignoreUsedKeyboardEvents","onKeyDown","useKeyboardEvents","cleanupEventListenersRef","t20","ref","inputElement","firstElementChild","matches","handleGlobalMouseDown","t21","eventTarget_2","handleGlobalMouseUp","t22","target_0","eventTarget_3","handleGlobalFocusIn","t23","target_1","eventTarget_4","addEventListener","document","focus","handleInput","event_5","input","isDeleting","removeEventListener","handleRef","dropdownRect","useBoundingClientRect","dropdownBodyRect","getBoundingAncestor","boundingElement","boundingElementRect","maxHeight","maxWidth","maxHeightUp","maxHeightDown","round","maxWidthLeft","right","left","maxWidthRight","t24","anchorStyles","t25","Symbol","for","t26","t27","t28","clsx","t29","t30","t31","tagName","getComputedStyle","overflowX"],"mappings":"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"}
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 bottom: auto;\n right: auto;\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: auto;\n right: auto;\n}\n@position-try --uktdd-bottom-right {\n top: anchor(bottom);\n right: anchor(right);\n bottom: auto;\n left: auto;\n}\n@position-try --uktdd-top-right {\n bottom: anchor(top);\n right: anchor(right);\n top: auto;\n left: auto;\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 {\n Children,\n type CSSProperties,\n Fragment,\n isValidElement,\n type JSX,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type SyntheticEvent,\n useEffect,\n useId,\n useRef,\n useState,\n} 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 | 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 | 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 minHeightBody?: number;\n minWidthBody?: number;\n /**\n * Only usable in conjunction with {isSearchable: true}.\n * Used as search input’s name.\n */\n name?: string;\n onClick?: (event: ReactMouseEvent<HTMLElement>) => unknown;\n onClose?: () => unknown;\n onMouseDown?: (event: ReactMouseEvent<HTMLElement>) => unknown;\n onMouseUp?: (event: ReactMouseEvent<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?: 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 = [ReactNode, ReactNode] | readonly [ReactNode, ReactNode];\n\ntype MaybeHTMLElement = HTMLElement | null;\n\ntype MousePosition = { clientX: number; clientY: number };\n\ntype TimeoutID = ReturnType<typeof setTimeout>;\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 minHeightBody = 30,\n minWidthBody = 100,\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\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 = useId();\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 }: ReactMouseEvent<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: ReactMouseEvent<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: ReactMouseEvent<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: ReactMouseEvent<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: ReactMouseEvent<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 handleRef = (ref: HTMLDivElement | null): (() => void) | void => {\n setDropdownElement(ref);\n if (!ref) return;\n\n const { ownerDocument } = ref;\n let inputElement = inputElementRef.current;\n // Check if trigger is a textual input or textarea element\n if (!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 return () => {\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 (!isValidElement(trigger)) {\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 = Math.round(\n dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp,\n );\n const maxWidthLeft = dropdownBodyRect.right - boundingElementRect.left;\n const maxWidthRight = boundingElementRect.right - dropdownBodyRect.left;\n maxWidth = Math.round(\n dropdownBodyRect.left > dropdownRect.left ? maxWidthRight : maxWidthLeft,\n );\n }\n\n const style = {\n ...styleFromProps,\n ...(maxHeight != null && maxHeight > minHeightBody\n ? { [BODY_MAX_HEIGHT_VAR]: `calc(${maxHeight}px - var(--uktdd-body-buffer))` }\n : null),\n ...(maxWidth != null && maxWidth > minWidthBody\n ? { [BODY_MAX_WIDTH_VAR]: `calc(${maxWidth}px - var(--uktdd-body-buffer))` }\n : null),\n };\n\n const anchorStyles = `\\\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\n return (\n <Fragment>\n <Style href=\"@acusti/dropdown/Dropdown\">{STYLES}</Style>\n <Style href={`@acusti/dropdown/Dropdown/${id}`}>{anchorStyles}</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 {/* TODO next version of Dropdown should use <Activity> for body https://react.dev/reference/react/Activity */}\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_ERROR","TEXT_INPUT_SELECTOR","Dropdown","t0","$","_c","allowCreate","allowEmpty","t1","className","disabled","hasItems","t2","isOpenOnMount","isSearchable","keepOpenOnSubmit","t3","label","minHeightBody","t4","minWidthBody","t5","name","onClick","onClose","onMouseDown","onMouseUp","onOpen","onSubmitItem","placeholder","style","styleFromProps","tabIndex","value","undefined","childrenCount","Children","count","Error","console","error","trigger","isOpen","setIsOpen","useState","isOpening","setIsOpening","setDropdownElement","dropdownBodyElement","setDropdownBodyElement","id","useId","inputElementRef","useRef","closingTimerRef","isOpeningTimerRef","currentInputMethodRef","clearEnteredCharactersTimerRef","enteredCharactersRef","mouseDownPositionRef","allowCreateRef","allowEmptyRef","hasItemsRef","isOpenRef","isOpeningRef","keepOpenOnSubmitRef","onCloseRef","onOpenRef","onSubmitItemRef","valueRef","t6","t7","current","useEffect","isMountedRef","t8","t9","t10","Symbol","for","clearTimeout","closeDropdown","t11","event","setTimeout","itemLabel","ownerDocument","activeElement","blur","nextValue","uktValue","handleSubmitItem","t12","t13","clientX","clientY","initialPosition","Math","abs","handleMouseMove","event_0","eventTarget","target","item","closest","element_0","handleMouseOver","t14","event_1","activeItem","eventRelatedTarget","relatedTarget","contains","handleMouseOut","t15","event_2","handleMouseDown","t16","event_3","eventTarget_0","handleMouseUp","t17","event_4","altKey","ctrlKey","key","metaKey","eventTarget_1","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEventTargetUsingKeyEvent","isEditingCharacters","test","slice","handleKeyDown","t18","ignoreUsedKeyboardEvents","onKeyDown","useKeyboardEvents","t19","ref","inputElement","firstElementChild","matches","handleGlobalMouseDown","t20","eventTarget_2","handleGlobalMouseUp","t21","target_0","eventTarget_3","handleGlobalFocusIn","t22","target_1","eventTarget_4","document","addEventListener","focus","handleInput","event_5","input","isDeleting","removeEventListener","handleRef","isValidElement","dropdownRect","useBoundingClientRect","dropdownBodyRect","getBoundingAncestor","boundingElement","boundingElementRect","maxHeight","maxWidth","maxHeightUp","maxHeightDown","round","maxWidthLeft","right","left","maxWidthRight","t23","anchorStyles","t24","t25","t26","t27","clsx","t28","t29","t30","tagName","getComputedStyle","overflowX"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acusti/dropdown",
3
- "version": "0.49.0",
3
+ "version": "0.50.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": "./dist/Dropdown.js",
@@ -44,20 +44,20 @@
44
44
  "@testing-library/dom": "^10.4.0",
45
45
  "@testing-library/react": "^16.3.0",
46
46
  "@testing-library/user-event": "^14.6.1",
47
- "@types/react": "^19.1.6",
48
- "@vitejs/plugin-react": "^4.5.0",
47
+ "@types/react": "^19.1.8",
48
+ "@vitejs/plugin-react": "^4.6.0",
49
49
  "babel-plugin-react-compiler": "rc",
50
- "happy-dom": "^17.5.6",
50
+ "happy-dom": "^18.0.1",
51
51
  "react": "^19",
52
52
  "react-dom": "^19",
53
53
  "typescript": "5.8.3",
54
- "unplugin-dts": "^1.0.0-beta.0",
55
- "vite": "^6.3.5",
56
- "vitest": "^3.1.4"
54
+ "unplugin-dts": "^1.0.0-beta.2",
55
+ "vite": "^7.0.0-0",
56
+ "vitest": "^3.2.4"
57
57
  },
58
58
  "dependencies": {
59
59
  "@acusti/matchmaking": "^0.10.0",
60
- "@acusti/styling": "^2.0.1",
60
+ "@acusti/styling": "^2.1.0",
61
61
  "@acusti/use-bounding-client-rect": "^2.0.1",
62
62
  "@acusti/use-keyboard-events": "^0.11.0",
63
63
  "clsx": "^2"