@acusti/dropdown 0.53.0 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,7 +27,7 @@ The three primary design goals for the existence of this component:
27
27
  and the value of that item at the same time (otherwise, the value is
28
28
  the text content of the dropdown item element)
29
29
  4. To style your dropdowns, use CSS; there are a
30
- [collection of CSS custom properties](https://github.com/acusti/uikit/blob/main/packages/dropdown/src/styles.ts#L21-L32)
30
+ [collection of CSS custom properties](https://github.com/acusti/uikit/blob/main/packages/dropdown/src/Dropdown.css)
31
31
  used internally to style them if that works best for you, or just
32
32
  override the minimal default CSS as appropriate
33
33
  3. **Lightweight bundle size** with the bare minimum of dependencies (see
package/dist/Dropdown.js CHANGED
@@ -1,111 +1,15 @@
1
1
  import { c } from "react/compiler-runtime";
2
- import { SYSTEM_UI_FONT, Style } from "@acusti/styling";
3
2
  import useBoundingClientRect from "@acusti/use-bounding-client-rect";
4
3
  import useKeyboardEvents, { isEventTargetUsingKeyEvent } from "@acusti/use-keyboard-events";
5
4
  import clsx from "clsx";
6
5
  import { Children, Fragment, isValidElement, useEffect, useRef, useState } from "react";
7
6
  import { getBestMatch } from "@acusti/matchmaking";
8
7
  import { jsx, jsxs } from "react/jsx-runtime";
9
- const ROOT_CLASS_NAME = "uktdropdown";
10
- const ROOT_SELECTOR = `.${ROOT_CLASS_NAME}`;
11
- const BODY_CLASS_NAME = `${ROOT_CLASS_NAME}-body`;
12
- const LABEL_CLASS_NAME = `${ROOT_CLASS_NAME}-label`;
13
- const LABEL_TEXT_CLASS_NAME = `${ROOT_CLASS_NAME}-label-text`;
14
- const TRIGGER_CLASS_NAME = `${ROOT_CLASS_NAME}-trigger`;
15
- const BODY_SELECTOR = `.${BODY_CLASS_NAME}`;
16
- const LABEL_SELECTOR = `.${LABEL_CLASS_NAME}`;
17
- const LABEL_TEXT_SELECTOR = `.${LABEL_TEXT_CLASS_NAME}`;
18
- const TRIGGER_SELECTOR = `.${TRIGGER_CLASS_NAME}`;
19
- const BODY_MAX_HEIGHT_VAR = "--uktdd-body-max-height";
20
- const BODY_MAX_WIDTH_VAR = "--uktdd-body-max-width";
21
- const STYLES = `
22
- :root {
23
- --uktdd-font-family: ${SYSTEM_UI_FONT};
24
- --uktdd-body-bg-color: #fff;
25
- --uktdd-body-bg-color-hover: rgb(105,162,249);
26
- --uktdd-body-color-hover: #fff;
27
- --uktdd-body-buffer: 10px;
28
- ${BODY_MAX_HEIGHT_VAR}: calc(100vh - var(--uktdd-body-buffer));
29
- ${BODY_MAX_WIDTH_VAR}: calc(100vw - var(--uktdd-body-buffer));
30
- --uktdd-body-pad-bottom: 9px;
31
- --uktdd-body-pad-left: 12px;
32
- --uktdd-body-pad-right: 12px;
33
- --uktdd-body-pad-top: 9px;
34
- --uktdd-label-pad-right: 10px;
35
- }
36
- ${ROOT_SELECTOR},
37
- ${TRIGGER_SELECTOR} {
38
- font-family: var(--uktdd-font-family);
39
- }
40
- ${ROOT_SELECTOR} {
41
- width: max-content;
42
- anchor-scope: --uktdd-anchor;
43
- }
44
- ${ROOT_SELECTOR}.disabled {
45
- pointer-events: none;
46
- }
47
- ${ROOT_SELECTOR} > * {
48
- cursor: default;
49
- }
50
- ${ROOT_SELECTOR} > :first-child {
51
- anchor-name: --uktdd-anchor;
52
- }
53
- ${LABEL_SELECTOR} {
54
- display: flex;
55
- align-items: center;
56
- }
57
- ${LABEL_TEXT_SELECTOR} {
58
- padding-right: var(--uktdd-label-pad-right);
59
- }
60
- ${BODY_SELECTOR} {
61
- box-sizing: border-box;
62
- position: absolute;
63
- position-anchor: --uktdd-anchor;
64
- top: anchor(bottom);
65
- left: anchor(left);
66
- bottom: auto;
67
- right: auto;
68
- position-try-fallbacks: --uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;
69
- min-height: 50px;
70
- max-height: var(${BODY_MAX_HEIGHT_VAR});
71
- min-width: min(50px, 100%);
72
- max-width: var(${BODY_MAX_WIDTH_VAR});
73
- overflow: auto;
74
- z-index: 2;
75
- padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);
76
- background-color: var(--uktdd-body-bg-color);
77
- box-shadow: 0 8px 18px rgba(0,0,0,0.25);
78
- }
79
- @position-try --uktdd-top-left {
80
- bottom: anchor(top);
81
- left: anchor(left);
82
- top: auto;
83
- right: auto;
84
- }
85
- @position-try --uktdd-bottom-right {
86
- top: anchor(bottom);
87
- right: anchor(right);
88
- bottom: auto;
89
- left: auto;
90
- }
91
- @position-try --uktdd-top-right {
92
- bottom: anchor(top);
93
- right: anchor(right);
94
- top: auto;
95
- left: auto;
96
- }
97
- ${BODY_SELECTOR}.has-items {
98
- user-select: none;
99
- }
100
- ${BODY_SELECTOR} [data-ukt-active] {
101
- background-color: var(--uktdd-body-bg-color-hover);
102
- color: var(--uktdd-body-color-hover);
103
- }
104
- `;
8
+ var Dropdown_default = ":root{--uktdd-font-family:system-ui, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue, Helvetica, Arial, sans-serif;--uktdd-body-bg-color:#fff;--uktdd-body-bg-color-hover:#69a2f9;--uktdd-body-color-hover:#fff;--uktdd-body-buffer:10px;--uktdd-body-max-height:calc(100vh - var(--uktdd-body-buffer));--uktdd-body-max-width:calc(100vw - var(--uktdd-body-buffer));--uktdd-body-pad-bottom:9px;--uktdd-body-pad-left:12px;--uktdd-body-pad-right:12px;--uktdd-body-pad-top:9px;--uktdd-body-min-width:min(50px, 100%);--uktdd-label-pad-right:10px}.uktdropdown,.uktdropdown-trigger{font-family:var(--uktdd-font-family)}.uktdropdown{anchor-scope:--uktdd-anchor;width:max-content}.uktdropdown.disabled{pointer-events:none}.uktdropdown>*{cursor:default}.uktdropdown>:first-child{anchor-name:--uktdd-anchor}.uktdropdown-label{align-items:center;display:flex}.uktdropdown-label-text{padding-right:var(--uktdd-label-pad-right)}.uktdropdown-body{box-sizing:border-box;position-anchor:--uktdd-anchor;top:anchor(bottom);left:anchor(left);position-try-fallbacks:--uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;min-height:50px;max-height:var(--uktdd-body-max-height);min-width:var(--uktdd-body-min-width);max-width:var(--uktdd-body-max-width);z-index:2;padding:var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);background-color:var(--uktdd-body-bg-color);position:absolute;bottom:auto;right:auto;overflow:auto;box-shadow:0 8px 18px #00000040}.uktdropdown-body.has-items{-webkit-user-select:none;user-select:none}.uktdropdown-body [data-ukt-active]{background-color:var(--uktdd-body-bg-color-hover);color:var(--uktdd-body-color-hover)}@position-try --uktdd-top-left{bottom: anchor(top); left: anchor(left); top: auto; right: auto;}@position-try --uktdd-bottom-right{top: anchor(bottom); right: anchor(right); bottom: auto; left: auto;}@position-try --uktdd-top-right{bottom: anchor(top); right: anchor(right); top: auto; left: auto;}";
105
9
  const ITEM_SELECTOR = `[data-ukt-item], [data-ukt-value]`;
106
10
  const getItemElements = (dropdownElement) => {
107
11
  if (!dropdownElement) return null;
108
- const bodyElement = dropdownElement.querySelector(BODY_SELECTOR);
12
+ const bodyElement = dropdownElement.querySelector(".uktdropdown-body");
109
13
  if (!bodyElement) return null;
110
14
  let items = bodyElement.querySelectorAll(ITEM_SELECTOR);
111
15
  if (items.length) return items;
@@ -191,8 +95,8 @@ var CHILDREN_ERROR = "@acusti/dropdown requires either 1 child (the dropdown bod
191
95
  var CLICKABLE_SELECTOR = "button, a[href], input[type=\"button\"], input[type=\"submit\"]";
192
96
  var TEXT_INPUT_SELECTOR = "input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea";
193
97
  function Dropdown(t0) {
194
- const $ = c(86);
195
- const { allowCreate, allowEmpty: t1, children, className, disabled, hasItems: t2, isOpenOnMount, isSearchable, keepOpenOnSubmit: t3, label, minHeightBody: t4, minWidthBody: t5, name, onActiveItem, onClick, onClose, onMouseDown, onMouseUp, onOpen, onSubmitItem, placeholder, style: styleFromProps, tabIndex, value } = t0;
98
+ const $ = c(89);
99
+ const { allowCreate, allowEmpty: t1, children, className, disabled, hasItems: t2, isOpenOnMount, isSearchable, keepOpenOnSubmit: t3, label, minHeightBody: t4, minWidthBody, name, onActiveItem, onClick, onClose, onMouseDown, onMouseUp, onOpen, onSubmitItem, placeholder, style: styleFromProps, tabIndex, value } = t0;
196
100
  const allowEmpty = t1 === void 0 ? true : t1;
197
101
  const hasItems = t2 === void 0 ? true : t2;
198
102
  const keepOpenOnSubmit = t3 === void 0 ? !hasItems : t3;
@@ -225,10 +129,10 @@ function Dropdown(t0) {
225
129
  const onOpenRef = useRef(onOpen);
226
130
  const onSubmitItemRef = useRef(onSubmitItem);
227
131
  const valueRef = useRef(value);
132
+ let t5;
228
133
  let t6;
229
- let t7;
230
134
  if ($[0] !== allowCreate || $[1] !== allowEmpty || $[2] !== hasItems || $[3] !== isOpen || $[4] !== isOpening || $[5] !== keepOpenOnSubmit || $[6] !== onClose || $[7] !== onOpen || $[8] !== onSubmitItem || $[9] !== value) {
231
- t6 = () => {
135
+ t5 = () => {
232
136
  allowCreateRef.current = allowCreate;
233
137
  allowEmptyRef.current = allowEmpty;
234
138
  hasItemsRef.current = hasItems;
@@ -240,7 +144,7 @@ function Dropdown(t0) {
240
144
  onSubmitItemRef.current = onSubmitItem;
241
145
  valueRef.current = value;
242
146
  };
243
- t7 = [
147
+ t6 = [
244
148
  allowCreate,
245
149
  allowEmpty,
246
150
  hasItems,
@@ -262,18 +166,18 @@ function Dropdown(t0) {
262
166
  $[7] = onOpen;
263
167
  $[8] = onSubmitItem;
264
168
  $[9] = value;
265
- $[10] = t6;
266
- $[11] = t7;
169
+ $[10] = t5;
170
+ $[11] = t6;
267
171
  } else {
268
- t6 = $[10];
269
- t7 = $[11];
172
+ t5 = $[10];
173
+ t6 = $[11];
270
174
  }
271
- useEffect(t6, t7);
175
+ useEffect(t5, t6);
272
176
  const isMountedRef = useRef(false);
177
+ let t7;
273
178
  let t8;
274
- let t9;
275
179
  if ($[12] !== isOpen) {
276
- t8 = () => {
180
+ t7 = () => {
277
181
  if (!isMountedRef.current) {
278
182
  isMountedRef.current = true;
279
183
  if (isOpenRef.current && onOpenRef.current) onOpenRef.current();
@@ -282,18 +186,18 @@ function Dropdown(t0) {
282
186
  if (isOpen && onOpenRef.current) onOpenRef.current();
283
187
  else if (!isOpen && onCloseRef.current) onCloseRef.current();
284
188
  };
285
- t9 = [isOpen];
189
+ t8 = [isOpen];
286
190
  $[12] = isOpen;
287
- $[13] = t8;
288
- $[14] = t9;
191
+ $[13] = t7;
192
+ $[14] = t8;
289
193
  } else {
290
- t8 = $[13];
291
- t9 = $[14];
194
+ t7 = $[13];
195
+ t8 = $[14];
292
196
  }
293
- useEffect(t8, t9);
294
- let t10;
197
+ useEffect(t7, t8);
198
+ let t9;
295
199
  if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
296
- t10 = () => {
200
+ t9 = () => {
297
201
  setIsOpen(false);
298
202
  setIsOpening(false);
299
203
  mouseDownPositionRef.current = null;
@@ -302,12 +206,12 @@ function Dropdown(t0) {
302
206
  closingTimerRef.current = null;
303
207
  }
304
208
  };
305
- $[15] = t10;
306
- } else t10 = $[15];
307
- const closeDropdown = t10;
308
- let t11;
209
+ $[15] = t9;
210
+ } else t9 = $[15];
211
+ const closeDropdown = t9;
212
+ let t10;
309
213
  if ($[16] !== dropdownElement) {
310
- t11 = (event) => {
214
+ t10 = (event) => {
311
215
  if (isOpenRef.current && !keepOpenOnSubmitRef.current) closingTimerRef.current = setTimeout(closeDropdown, 90);
312
216
  if (!hasItemsRef.current) return;
313
217
  const element = getActiveItemElement(dropdownElement);
@@ -343,25 +247,25 @@ function Dropdown(t0) {
343
247
  });
344
248
  };
345
249
  $[16] = dropdownElement;
346
- $[17] = t11;
347
- } else t11 = $[17];
348
- const handleSubmitItem = t11;
349
- let t12;
250
+ $[17] = t10;
251
+ } else t10 = $[17];
252
+ const handleSubmitItem = t10;
253
+ let t11;
350
254
  if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
351
- t12 = (t13) => {
352
- const { clientX, clientY } = t13;
255
+ t11 = (t12) => {
256
+ const { clientX, clientY } = t12;
353
257
  currentInputMethodRef.current = "mouse";
354
258
  const initialPosition = mouseDownPositionRef.current;
355
259
  if (!initialPosition) return;
356
260
  if (Math.abs(initialPosition.clientX - clientX) < 12 && Math.abs(initialPosition.clientY - clientY) < 12) return;
357
261
  setIsOpening(false);
358
262
  };
359
- $[18] = t12;
360
- } else t12 = $[18];
361
- const handleMouseMove = t12;
362
- let t13;
263
+ $[18] = t11;
264
+ } else t11 = $[18];
265
+ const handleMouseMove = t11;
266
+ let t12;
363
267
  if ($[19] !== dropdownElement || $[20] !== onActiveItem) {
364
- t13 = (event_0) => {
268
+ t12 = (event_0) => {
365
269
  if (!hasItemsRef.current) return;
366
270
  if (currentInputMethodRef.current !== "mouse") return;
367
271
  if (!dropdownElement) return;
@@ -381,12 +285,12 @@ function Dropdown(t0) {
381
285
  };
382
286
  $[19] = dropdownElement;
383
287
  $[20] = onActiveItem;
384
- $[21] = t13;
385
- } else t13 = $[21];
386
- const handleMouseOver = t13;
387
- let t14;
288
+ $[21] = t12;
289
+ } else t12 = $[21];
290
+ const handleMouseOver = t12;
291
+ let t13;
388
292
  if ($[22] !== dropdownElement) {
389
- t14 = (event_1) => {
293
+ t13 = (event_1) => {
390
294
  if (!hasItemsRef.current) return;
391
295
  const activeItem = getActiveItemElement(dropdownElement);
392
296
  if (!activeItem) return;
@@ -395,12 +299,12 @@ function Dropdown(t0) {
395
299
  delete activeItem.dataset.uktActive;
396
300
  };
397
301
  $[22] = dropdownElement;
398
- $[23] = t14;
399
- } else t14 = $[23];
400
- const handleMouseOut = t14;
401
- let t15;
302
+ $[23] = t13;
303
+ } else t13 = $[23];
304
+ const handleMouseOut = t13;
305
+ let t14;
402
306
  if ($[24] !== onMouseDown) {
403
- t15 = (event_2) => {
307
+ t14 = (event_2) => {
404
308
  if (onMouseDown) onMouseDown(event_2);
405
309
  if (isOpenRef.current) return;
406
310
  setIsOpen(true);
@@ -415,16 +319,16 @@ function Dropdown(t0) {
415
319
  }, 1e3);
416
320
  };
417
321
  $[24] = onMouseDown;
418
- $[25] = t15;
419
- } else t15 = $[25];
420
- const handleMouseDown = t15;
421
- let t16;
322
+ $[25] = t14;
323
+ } else t14 = $[25];
324
+ const handleMouseDown = t14;
325
+ let t15;
422
326
  if ($[26] !== handleSubmitItem || $[27] !== onMouseUp) {
423
- t16 = (event_3) => {
327
+ t15 = (event_3) => {
424
328
  if (onMouseUp) onMouseUp(event_3);
425
329
  if (isOpeningRef.current || !isOpenRef.current || closingTimerRef.current != null) return;
426
330
  const eventTarget_1 = event_3.target;
427
- if (!eventTarget_1.closest(BODY_SELECTOR)) {
331
+ if (!eventTarget_1.closest(".uktdropdown-body")) {
428
332
  if (!isOpeningRef.current && inputElementRef.current !== eventTarget_1.ownerDocument.activeElement) closeDropdown();
429
333
  return;
430
334
  }
@@ -433,12 +337,12 @@ function Dropdown(t0) {
433
337
  };
434
338
  $[26] = handleSubmitItem;
435
339
  $[27] = onMouseUp;
436
- $[28] = t16;
437
- } else t16 = $[28];
438
- const handleMouseUp = t16;
439
- let t17;
340
+ $[28] = t15;
341
+ } else t15 = $[28];
342
+ const handleMouseUp = t15;
343
+ let t16;
440
344
  if ($[29] !== dropdownElement || $[30] !== handleSubmitItem || $[31] !== onActiveItem) {
441
- t17 = (event_4) => {
345
+ t16 = (event_4) => {
442
346
  const { altKey, ctrlKey, key, metaKey } = event_4;
443
347
  const eventTarget_2 = event_4.target;
444
348
  if (!dropdownElement) return;
@@ -526,22 +430,22 @@ function Dropdown(t0) {
526
430
  $[29] = dropdownElement;
527
431
  $[30] = handleSubmitItem;
528
432
  $[31] = onActiveItem;
529
- $[32] = t17;
530
- } else t17 = $[32];
531
- const handleKeyDown = t17;
532
- let t18;
433
+ $[32] = t16;
434
+ } else t16 = $[32];
435
+ const handleKeyDown = t16;
436
+ let t17;
533
437
  if ($[33] !== handleKeyDown) {
534
- t18 = {
438
+ t17 = {
535
439
  ignoreUsedKeyboardEvents: false,
536
440
  onKeyDown: handleKeyDown
537
441
  };
538
442
  $[33] = handleKeyDown;
539
- $[34] = t18;
540
- } else t18 = $[34];
541
- useKeyboardEvents(t18);
542
- let t19;
443
+ $[34] = t17;
444
+ } else t17 = $[34];
445
+ useKeyboardEvents(t17);
446
+ let t18;
543
447
  if ($[35] !== isOpenOnMount || $[36] !== onActiveItem) {
544
- t19 = (ref) => {
448
+ t18 = (ref) => {
545
449
  setDropdownElement(ref);
546
450
  if (!ref) return;
547
451
  const { ownerDocument } = ref;
@@ -551,13 +455,13 @@ function Dropdown(t0) {
551
455
  else inputElement = ref.firstElementChild.querySelector(TEXT_INPUT_SELECTOR);
552
456
  inputElementRef.current = inputElement;
553
457
  }
554
- const handleGlobalMouseDown = (t20) => {
555
- const { target } = t20;
458
+ const handleGlobalMouseDown = (t19) => {
459
+ const { target } = t19;
556
460
  const eventTarget_3 = target;
557
461
  if (!ref.contains(eventTarget_3)) closeDropdown();
558
462
  };
559
- const handleGlobalMouseUp = (t21) => {
560
- const { target: target_0 } = t21;
463
+ const handleGlobalMouseUp = (t20) => {
464
+ const { target: target_0 } = t20;
561
465
  if (!isOpenRef.current || closingTimerRef.current != null) return;
562
466
  if (isOpeningRef.current) {
563
467
  setIsOpening(false);
@@ -570,8 +474,8 @@ function Dropdown(t0) {
570
474
  const eventTarget_4 = target_0;
571
475
  if (!ref.contains(eventTarget_4)) closeDropdown();
572
476
  };
573
- const handleGlobalFocusIn = (t22) => {
574
- const { target: target_1 } = t22;
477
+ const handleGlobalFocusIn = (t21) => {
478
+ const { target: target_1 } = t21;
575
479
  if (!isOpenRef.current) return;
576
480
  const eventTarget_5 = target_1;
577
481
  if (ref.contains(eventTarget_5) || eventTarget_5.contains(ref)) return;
@@ -615,25 +519,25 @@ function Dropdown(t0) {
615
519
  };
616
520
  $[35] = isOpenOnMount;
617
521
  $[36] = onActiveItem;
618
- $[37] = t19;
619
- } else t19 = $[37];
620
- const handleRef = t19;
522
+ $[37] = t18;
523
+ } else t18 = $[37];
524
+ const handleRef = t18;
621
525
  if (!isValidElement(trigger)) if (isSearchable) {
622
- const t20 = value ?? "";
623
- let t21;
526
+ const t19 = value ?? "";
527
+ let t20;
624
528
  if ($[38] === Symbol.for("react.memo_cache_sentinel")) {
625
- t21 = () => setIsOpen(true);
626
- $[38] = t21;
627
- } else t21 = $[38];
628
- let t22;
629
- if ($[39] !== disabled || $[40] !== name || $[41] !== placeholder || $[42] !== t20 || $[43] !== tabIndex) {
630
- t22 = /* @__PURE__ */ jsx("input", {
529
+ t20 = () => setIsOpen(true);
530
+ $[38] = t20;
531
+ } else t20 = $[38];
532
+ let t21;
533
+ if ($[39] !== disabled || $[40] !== name || $[41] !== placeholder || $[42] !== t19 || $[43] !== tabIndex) {
534
+ t21 = /* @__PURE__ */ jsx("input", {
631
535
  autoComplete: "off",
632
- className: TRIGGER_CLASS_NAME,
633
- defaultValue: t20,
536
+ className: "uktdropdown-trigger",
537
+ defaultValue: t19,
634
538
  disabled,
635
539
  name,
636
- onFocus: t21,
540
+ onFocus: t20,
637
541
  placeholder,
638
542
  ref: inputElementRef,
639
543
  tabIndex,
@@ -642,124 +546,133 @@ function Dropdown(t0) {
642
546
  $[39] = disabled;
643
547
  $[40] = name;
644
548
  $[41] = placeholder;
645
- $[42] = t20;
549
+ $[42] = t19;
646
550
  $[43] = tabIndex;
647
- $[44] = t22;
648
- } else t22 = $[44];
649
- trigger = t22;
551
+ $[44] = t21;
552
+ } else t21 = $[44];
553
+ trigger = t21;
650
554
  } else {
651
- let t20;
555
+ let t19;
652
556
  if ($[45] !== trigger) {
653
- t20 = /* @__PURE__ */ jsx("button", {
654
- className: TRIGGER_CLASS_NAME,
557
+ t19 = /* @__PURE__ */ jsx("button", {
558
+ className: "uktdropdown-trigger",
655
559
  tabIndex: 0,
656
560
  type: "button",
657
561
  children: trigger
658
562
  });
659
563
  $[45] = trigger;
660
- $[46] = t20;
661
- } else t20 = $[46];
662
- trigger = t20;
564
+ $[46] = t19;
565
+ } else t19 = $[46];
566
+ trigger = t19;
663
567
  }
664
568
  if (label) {
665
- let t20;
569
+ let t19;
666
570
  if ($[47] !== label) {
667
- t20 = /* @__PURE__ */ jsx("div", {
668
- className: LABEL_TEXT_CLASS_NAME,
571
+ t19 = /* @__PURE__ */ jsx("div", {
572
+ className: "uktdropdown-label-text",
669
573
  children: label
670
574
  });
671
575
  $[47] = label;
672
- $[48] = t20;
673
- } else t20 = $[48];
674
- let t21;
675
- if ($[49] !== t20 || $[50] !== trigger) {
676
- t21 = /* @__PURE__ */ jsxs("label", {
677
- className: LABEL_CLASS_NAME,
678
- children: [t20, trigger]
576
+ $[48] = t19;
577
+ } else t19 = $[48];
578
+ let t20;
579
+ if ($[49] !== t19 || $[50] !== trigger) {
580
+ t20 = /* @__PURE__ */ jsxs("label", {
581
+ className: "uktdropdown-label",
582
+ children: [t19, trigger]
679
583
  });
680
- $[49] = t20;
584
+ $[49] = t19;
681
585
  $[50] = trigger;
682
- $[51] = t21;
683
- } else t21 = $[51];
684
- trigger = t21;
586
+ $[51] = t20;
587
+ } else t20 = $[51];
588
+ trigger = t20;
685
589
  }
686
590
  const dropdownRect = useBoundingClientRect(dropdownElement);
687
591
  const dropdownBodyRect = useBoundingClientRect(dropdownBodyElement);
688
- let t20;
592
+ let t19;
689
593
  if ($[52] !== dropdownBodyElement) {
690
- t20 = getBoundingAncestor(dropdownBodyElement);
594
+ t19 = getBoundingAncestor(dropdownBodyElement);
691
595
  $[52] = dropdownBodyElement;
692
- $[53] = t20;
693
- } else t20 = $[53];
694
- const boundingElementRect = useBoundingClientRect(t20);
596
+ $[53] = t19;
597
+ } else t19 = $[53];
598
+ const boundingElementRect = useBoundingClientRect(t19);
695
599
  let maxHeight;
696
600
  if (dropdownBodyRect.top != null && dropdownRect.top != null && boundingElementRect.top != null) {
697
601
  const maxHeightUp = dropdownBodyRect.bottom - boundingElementRect.top;
698
602
  const maxHeightDown = boundingElementRect.bottom - dropdownBodyRect.top;
699
- let t21;
603
+ let t20;
700
604
  if ($[54] !== dropdownBodyRect.top || $[55] !== dropdownRect.top || $[56] !== maxHeightDown || $[57] !== maxHeightUp) {
701
- t21 = Math.round(dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp);
605
+ t20 = Math.round(dropdownBodyRect.top > dropdownRect.top ? maxHeightDown : maxHeightUp);
702
606
  $[54] = dropdownBodyRect.top;
703
607
  $[55] = dropdownRect.top;
704
608
  $[56] = maxHeightDown;
705
609
  $[57] = maxHeightUp;
706
- $[58] = t21;
707
- } else t21 = $[58];
708
- maxHeight = t21;
610
+ $[58] = t20;
611
+ } else t20 = $[58];
612
+ maxHeight = t20;
709
613
  }
710
- let t21;
614
+ let t20;
711
615
  if ($[59] !== maxHeight || $[60] !== minHeightBody) {
712
- t21 = maxHeight != null && maxHeight > minHeightBody ? { [BODY_MAX_HEIGHT_VAR]: `calc(${maxHeight}px - var(--uktdd-body-buffer))` } : null;
616
+ t20 = maxHeight != null && maxHeight > minHeightBody ? { "--uktdd-body-max-height": `calc(${maxHeight}px - var(--uktdd-body-buffer))` } : null;
713
617
  $[59] = maxHeight;
714
618
  $[60] = minHeightBody;
715
- $[61] = t21;
716
- } else t21 = $[61];
619
+ $[61] = t20;
620
+ } else t20 = $[61];
621
+ let t21;
622
+ if ($[62] !== minWidthBody) {
623
+ t21 = minWidthBody != null && minWidthBody > 0 ? { "--uktdd-body-min-width": `${minWidthBody}px` } : null;
624
+ $[62] = minWidthBody;
625
+ $[63] = t21;
626
+ } else t21 = $[63];
717
627
  let t22;
718
- if ($[62] !== styleFromProps || $[63] !== t21) {
628
+ if ($[64] !== styleFromProps || $[65] !== t20 || $[66] !== t21) {
719
629
  t22 = {
720
630
  ...styleFromProps,
631
+ ...t20,
721
632
  ...t21
722
633
  };
723
- $[62] = styleFromProps;
724
- $[63] = t21;
725
- $[64] = t22;
726
- } else t22 = $[64];
634
+ $[64] = styleFromProps;
635
+ $[65] = t20;
636
+ $[66] = t21;
637
+ $[67] = t22;
638
+ } else t22 = $[67];
727
639
  const style = t22;
728
640
  let t23;
729
- if ($[65] === Symbol.for("react.memo_cache_sentinel")) {
730
- t23 = /* @__PURE__ */ jsx(Style, {
641
+ if ($[68] === Symbol.for("react.memo_cache_sentinel")) {
642
+ t23 = /* @__PURE__ */ jsx("style", {
731
643
  href: "@acusti/dropdown/Dropdown",
732
- children: STYLES
644
+ precedence: "medium",
645
+ children: Dropdown_default
733
646
  });
734
- $[65] = t23;
735
- } else t23 = $[65];
647
+ $[68] = t23;
648
+ } else t23 = $[68];
736
649
  let t24;
737
- if ($[66] !== className || $[67] !== disabled || $[68] !== isOpen || $[69] !== isSearchable) {
738
- t24 = clsx(ROOT_CLASS_NAME, className, {
650
+ if ($[69] !== className || $[70] !== disabled || $[71] !== isOpen || $[72] !== isSearchable) {
651
+ t24 = clsx("uktdropdown", className, {
739
652
  disabled,
740
653
  "is-open": isOpen,
741
654
  "is-searchable": isSearchable
742
655
  });
743
- $[66] = className;
744
- $[67] = disabled;
745
- $[68] = isOpen;
746
- $[69] = isSearchable;
747
- $[70] = t24;
748
- } else t24 = $[70];
656
+ $[69] = className;
657
+ $[70] = disabled;
658
+ $[71] = isOpen;
659
+ $[72] = isSearchable;
660
+ $[73] = t24;
661
+ } else t24 = $[73];
749
662
  let t25;
750
- if ($[71] !== children || $[72] !== childrenCount || $[73] !== isOpen) {
663
+ if ($[74] !== children || $[75] !== childrenCount || $[76] !== isOpen) {
751
664
  t25 = isOpen ? /* @__PURE__ */ jsx("div", {
752
- className: BODY_CLASS_NAME,
665
+ className: "uktdropdown-body",
753
666
  ref: setDropdownBodyElement,
754
667
  children: childrenCount > 1 ? children[1] : children
755
668
  }) : null;
756
- $[71] = children;
757
- $[72] = childrenCount;
758
- $[73] = isOpen;
759
- $[74] = t25;
760
- } else t25 = $[74];
669
+ $[74] = children;
670
+ $[75] = childrenCount;
671
+ $[76] = isOpen;
672
+ $[77] = t25;
673
+ } else t25 = $[77];
761
674
  let t26;
762
- if ($[75] !== handleMouseDown || $[76] !== handleMouseOut || $[77] !== handleMouseOver || $[78] !== handleMouseUp || $[79] !== handleRef || $[80] !== onClick || $[81] !== style || $[82] !== t24 || $[83] !== t25 || $[84] !== trigger) {
675
+ if ($[78] !== handleMouseDown || $[79] !== handleMouseOut || $[80] !== handleMouseOver || $[81] !== handleMouseUp || $[82] !== handleRef || $[83] !== onClick || $[84] !== style || $[85] !== t24 || $[86] !== t25 || $[87] !== trigger) {
763
676
  t26 = /* @__PURE__ */ jsxs(Fragment, { children: [t23, /* @__PURE__ */ jsxs("div", {
764
677
  className: t24,
765
678
  onClick,
@@ -772,18 +685,18 @@ function Dropdown(t0) {
772
685
  style,
773
686
  children: [trigger, t25]
774
687
  })] });
775
- $[75] = handleMouseDown;
776
- $[76] = handleMouseOut;
777
- $[77] = handleMouseOver;
778
- $[78] = handleMouseUp;
779
- $[79] = handleRef;
780
- $[80] = onClick;
781
- $[81] = style;
782
- $[82] = t24;
783
- $[83] = t25;
784
- $[84] = trigger;
785
- $[85] = t26;
786
- } else t26 = $[85];
688
+ $[78] = handleMouseDown;
689
+ $[79] = handleMouseOut;
690
+ $[80] = handleMouseOver;
691
+ $[81] = handleMouseUp;
692
+ $[82] = handleRef;
693
+ $[83] = onClick;
694
+ $[84] = style;
695
+ $[85] = t24;
696
+ $[86] = t25;
697
+ $[87] = trigger;
698
+ $[88] = t26;
699
+ } else t26 = $[88];
787
700
  return t26;
788
701
  }
789
702
  function getBoundingAncestor(element) {
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","names":["SYSTEM_UI_FONT","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","getBestMatch","SyntheticEvent","Item","BODY_SELECTOR","ITEM_SELECTOR","getItemElements","dropdownElement","HTMLElement","bodyElement","querySelector","items","HTMLCollection","NodeListOf","Element","querySelectorAll","length","children","getActiveItemElement","clearItemElementsState","itemElements","Array","forEach","itemElement","hasAttribute","dataset","uktActive","BaseSetActiveItemPayload","element","event","Event","index","indexAddend","isExactMatch","onActiveItem","payload","text","setActiveItem","Omit","from","lastIndex","currentActiveIndex","findIndex","nextActiveIndex","Math","max","min","itemTexts","map","innerText","textToCompare","toLowerCase","itemText","startsWith","bestMatch","nextActiveItem","setAttribute","label","value","uktValue","parentElement","scrollableParent","isScrollable","scrollHeight","clientHeight","parentRect","getBoundingClientRect","itemRect","isAboveTop","top","isBelowBottom","bottom","scrollTop","Style","useBoundingClientRect","useKeyboardEvents","isEventTargetUsingKeyEvent","clsx","Children","CSSProperties","Fragment","isValidElement","JSX","MouseEvent","ReactMouseEvent","ReactNode","SyntheticEvent","useEffect","useRef","useState","getActiveItemElement","getItemElements","ITEM_SELECTOR","setActiveItem","BODY_CLASS_NAME","BODY_MAX_HEIGHT_VAR","BODY_SELECTOR","LABEL_CLASS_NAME","LABEL_TEXT_CLASS_NAME","ROOT_CLASS_NAME","STYLES","TRIGGER_CLASS_NAME","Item","element","MaybeHTMLElement","event","Event","HTMLElement","label","value","Props","allowCreate","allowEmpty","children","ChildrenTuple","Element","className","disabled","group","hasItems","isOpenOnMount","isSearchable","keepOpenOnSubmit","minHeightBody","minWidthBody","name","onActiveItem","payload","onClick","onClose","onMouseDown","onMouseUp","onOpen","onSubmitItem","placeholder","style","tabIndex","MousePosition","clientX","clientY","TimeoutID","ReturnType","setTimeout","CHILDREN_ERROR","CLICKABLE_SELECTOR","TEXT_INPUT_SELECTOR","Dropdown","t0","$","_c","t1","t2","t3","t4","t5","styleFromProps","undefined","childrenCount","count","Error","console","error","trigger","isOpen","setIsOpen","isOpening","setIsOpening","dropdownElement","setDropdownElement","dropdownBodyElement","setDropdownBodyElement","inputElementRef","closingTimerRef","isOpeningTimerRef","currentInputMethodRef","clearEnteredCharactersTimerRef","enteredCharactersRef","mouseDownPositionRef","allowCreateRef","allowEmptyRef","hasItemsRef","isOpenRef","isOpeningRef","keepOpenOnSubmitRef","onCloseRef","onOpenRef","onSubmitItemRef","valueRef","t6","t7","current","isMountedRef","t8","t9","t10","Symbol","for","clearTimeout","closeDropdown","t11","itemLabel","innerText","ownerDocument","activeElement","blur","nextValue","dataset","uktValue","eventTarget","target","matches","contains","click","clickableElements","querySelectorAll","length","clickableElement","handleSubmitItem","t12","t13","initialPosition","Math","abs","handleMouseMove","event_0","itemElements","eventTarget_0","item","closest","element_0","itemElement","handleMouseOver","t14","event_1","activeItem","eventRelatedTarget","relatedTarget","uktActive","handleMouseOut","t15","event_2","handleMouseDown","t16","event_3","eventTarget_1","handleMouseUp","t17","event_4","altKey","ctrlKey","key","metaKey","eventTarget_2","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEditingCharacters","test","slice","isExactMatch","text","index","indexAddend","handleKeyDown","t18","ignoreUsedKeyboardEvents","onKeyDown","t19","ref","inputElement","firstElementChild","HTMLInputElement","querySelector","handleGlobalMouseDown","t20","eventTarget_3","handleGlobalMouseUp","t21","target_0","eventTarget_4","handleGlobalFocusIn","t22","target_1","eventTarget_5","document","addEventListener","focus","handleInput","event_5","input","isDeleting","removeEventListener","handleRef","dropdownRect","dropdownBodyRect","getBoundingAncestor","boundingElement","boundingElementRect","maxHeight","top","maxHeightUp","bottom","maxHeightDown","round","t23","t24","t25","t26","parentElement","tagName","getComputedStyle","overflowX"],"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 anchor-scope: --uktdd-anchor;\n}\n${ROOT_SELECTOR}.disabled {\n pointer-events: none;\n}\n${ROOT_SELECTOR} > * {\n cursor: default;\n}\n${ROOT_SELECTOR} > :first-child {\n anchor-name: --uktdd-anchor;\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 position-anchor: --uktdd-anchor;\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';\nimport { type SyntheticEvent } from 'react';\n\nimport { type Item } from './Dropdown.js';\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\ntype BaseSetActiveItemPayload = {\n dropdownElement: HTMLElement;\n element?: null;\n event: Event | SyntheticEvent<HTMLElement>;\n index?: null;\n indexAddend?: null;\n isExactMatch?: null;\n onActiveItem?: (payload: Item) => void;\n text?: null;\n};\n\nexport const setActiveItem = ({\n dropdownElement,\n element,\n event,\n index,\n indexAddend,\n isExactMatch,\n onActiveItem,\n text,\n}:\n | ({\n element: HTMLElement;\n } & Omit<BaseSetActiveItemPayload, 'element'>)\n | ({\n index: number;\n } & Omit<BaseSetActiveItemPayload, 'index'>)\n | ({\n indexAddend: number;\n } & Omit<BaseSetActiveItemPayload, 'indexAddend'>)\n | ({\n isExactMatch?: boolean;\n text: string;\n } & Omit<BaseSetActiveItemPayload, 'isExactMatch' | 'text'>)) => {\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 nextActiveIndex = Math.max(0, Math.min(nextActiveIndex, lastIndex));\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 const nextActiveItem = items[nextActiveIndex] as HTMLElement | null;\n if (nextActiveItem == null || nextActiveIndex === currentActiveIndex) return;\n\n // Clear any existing active dropdown body item state\n clearItemElementsState(itemElements);\n nextActiveItem.setAttribute('data-ukt-active', '');\n const label = nextActiveItem.innerText;\n const value = nextActiveItem.dataset.uktValue ?? label;\n onActiveItem?.({ element: nextActiveItem, event, label, value });\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 = 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","/* 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 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_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 onActiveItem?: (payload: Item) => void;\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 CLICKABLE_SELECTOR = 'button, a[href], input[type=\"button\"], input[type=\"submit\"]';\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 onActiveItem,\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 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 != null) {\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 the item is clickable or contains exactly one clickable element, invoke it\n // (but only if the event didn’t already originate from that element)\n if (element) {\n const eventTarget = event.target as HTMLElement;\n\n if (element.matches(CLICKABLE_SELECTOR)) {\n // The item element itself is clickable (e.g., <button data-ukt-value=\"…\">)\n if (element !== eventTarget && !element.contains(eventTarget)) {\n element.click();\n }\n } else {\n // Check if item contains exactly one clickable child element\n const clickableElements = element.querySelectorAll(CLICKABLE_SELECTOR);\n if (clickableElements.length === 1) {\n const clickableElement = clickableElements[0] as HTMLElement;\n if (\n clickableElement !== eventTarget &&\n !clickableElement.contains(eventTarget)\n ) {\n clickableElement.click();\n }\n }\n }\n }\n\n onSubmitItemRef.current?.({\n element,\n event,\n label: itemLabel,\n value: nextValue,\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, event, onActiveItem });\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 (\n isOpeningRef.current ||\n !isOpenRef.current ||\n closingTimerRef.current != null\n ) {\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 event,\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 onActiveItem,\n text: enteredCharactersRef.current,\n });\n\n if (clearEnteredCharactersTimerRef.current != null) {\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, event, index: 0, onActiveItem });\n } else {\n setActiveItem({\n dropdownElement,\n event,\n indexAddend: -1,\n onActiveItem,\n });\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, event, index: -1, onActiveItem });\n } else {\n setActiveItem({\n dropdownElement,\n event,\n indexAddend: 1,\n onActiveItem,\n });\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 != null) 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 != null) {\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 event,\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 onActiveItem,\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} type=\"button\">\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 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 }\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 };\n\n return (\n <Fragment>\n <Style href=\"@acusti/dropdown/Dropdown\">{STYLES}</Style>\n <div\n className={clsx(ROOT_CLASS_NAME, className, {\n disabled,\n 'is-open': isOpen,\n 'is-searchable': isSearchable,\n })}\n onClick={onClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseOut={handleMouseOut}\n onMouseOver={handleMouseOver}\n onMouseUp={handleMouseUp}\n ref={handleRef}\n style={style}\n >\n {trigger}\n {/* 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"],"mappings":"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"}
1
+ {"version":3,"file":"Dropdown.js","names":["getBestMatch","SyntheticEvent","Item","ITEM_SELECTOR","getItemElements","dropdownElement","HTMLElement","bodyElement","querySelector","items","HTMLCollection","NodeListOf","Element","querySelectorAll","length","children","getActiveItemElement","clearItemElementsState","itemElements","Array","forEach","itemElement","hasAttribute","dataset","uktActive","BaseSetActiveItemPayload","element","event","Event","index","indexAddend","isExactMatch","onActiveItem","payload","text","setActiveItem","Omit","from","lastIndex","currentActiveIndex","findIndex","nextActiveIndex","Math","max","min","itemTexts","map","innerText","textToCompare","toLowerCase","itemText","startsWith","bestMatch","nextActiveItem","setAttribute","label","value","uktValue","parentElement","scrollableParent","isScrollable","scrollHeight","clientHeight","parentRect","getBoundingClientRect","itemRect","isAboveTop","top","isBelowBottom","bottom","scrollTop","useBoundingClientRect","useKeyboardEvents","isEventTargetUsingKeyEvent","clsx","Children","CSSProperties","Fragment","isValidElement","JSX","MouseEvent","ReactMouseEvent","ReactNode","SyntheticEvent","useEffect","useRef","useState","styles","getActiveItemElement","getItemElements","ITEM_SELECTOR","setActiveItem","Item","element","MaybeHTMLElement","event","Event","HTMLElement","label","value","Props","allowCreate","allowEmpty","children","ChildrenTuple","Element","className","disabled","group","hasItems","isOpenOnMount","isSearchable","keepOpenOnSubmit","minHeightBody","minWidthBody","name","onActiveItem","payload","onClick","onClose","onMouseDown","onMouseUp","onOpen","onSubmitItem","placeholder","style","tabIndex","MousePosition","clientX","clientY","TimeoutID","ReturnType","setTimeout","CHILDREN_ERROR","CLICKABLE_SELECTOR","TEXT_INPUT_SELECTOR","Dropdown","t0","$","_c","t1","t2","t3","t4","styleFromProps","undefined","childrenCount","count","Error","console","error","trigger","isOpen","setIsOpen","isOpening","setIsOpening","dropdownElement","setDropdownElement","dropdownBodyElement","setDropdownBodyElement","inputElementRef","closingTimerRef","isOpeningTimerRef","currentInputMethodRef","clearEnteredCharactersTimerRef","enteredCharactersRef","mouseDownPositionRef","allowCreateRef","allowEmptyRef","hasItemsRef","isOpenRef","isOpeningRef","keepOpenOnSubmitRef","onCloseRef","onOpenRef","onSubmitItemRef","valueRef","t5","t6","current","isMountedRef","t7","t8","t9","Symbol","for","clearTimeout","closeDropdown","t10","itemLabel","innerText","ownerDocument","activeElement","blur","nextValue","dataset","uktValue","eventTarget","target","matches","contains","click","clickableElements","querySelectorAll","length","clickableElement","handleSubmitItem","t11","t12","initialPosition","Math","abs","handleMouseMove","event_0","itemElements","eventTarget_0","item","closest","element_0","itemElement","handleMouseOver","t13","event_1","activeItem","eventRelatedTarget","relatedTarget","uktActive","handleMouseOut","t14","event_2","handleMouseDown","t15","event_3","eventTarget_1","handleMouseUp","t16","event_4","altKey","ctrlKey","key","metaKey","eventTarget_2","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEditingCharacters","test","slice","isExactMatch","text","index","indexAddend","handleKeyDown","t17","ignoreUsedKeyboardEvents","onKeyDown","t18","ref","inputElement","firstElementChild","HTMLInputElement","querySelector","handleGlobalMouseDown","t19","eventTarget_3","handleGlobalMouseUp","t20","target_0","eventTarget_4","handleGlobalFocusIn","t21","target_1","eventTarget_5","document","addEventListener","focus","handleInput","event_5","input","isDeleting","removeEventListener","handleRef","dropdownRect","dropdownBodyRect","getBoundingAncestor","boundingElement","boundingElementRect","maxHeight","top","maxHeightUp","bottom","maxHeightDown","round","t22","t23","t24","t25","t26","parentElement","tagName","getComputedStyle","overflowX"],"sources":["../src/Dropdown.css?inline","../src/helpers.ts","../src/Dropdown.tsx"],"sourcesContent":[":root {\n --uktdd-font-family:\n system-ui, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue,\n Helvetica, Arial, sans-serif;\n --uktdd-body-bg-color: #fff;\n --uktdd-body-bg-color-hover: rgb(105, 162, 249);\n --uktdd-body-color-hover: #fff;\n --uktdd-body-buffer: 10px;\n --uktdd-body-max-height: calc(100vh - var(--uktdd-body-buffer));\n --uktdd-body-max-width: calc(100vw - var(--uktdd-body-buffer));\n --uktdd-body-pad-bottom: 9px;\n --uktdd-body-pad-left: 12px;\n --uktdd-body-pad-right: 12px;\n --uktdd-body-pad-top: 9px;\n --uktdd-body-min-width: min(50px, 100%);\n --uktdd-label-pad-right: 10px;\n}\n\n.uktdropdown,\n.uktdropdown-trigger {\n font-family: var(--uktdd-font-family);\n}\n\n.uktdropdown {\n width: max-content;\n anchor-scope: --uktdd-anchor;\n\n &.disabled {\n pointer-events: none;\n }\n\n > * {\n cursor: default;\n }\n\n > :first-child {\n anchor-name: --uktdd-anchor;\n }\n}\n\n.uktdropdown-label {\n display: flex;\n align-items: center;\n}\n\n.uktdropdown-label-text {\n padding-right: var(--uktdd-label-pad-right);\n}\n\n.uktdropdown-body {\n box-sizing: border-box;\n position: absolute;\n position-anchor: --uktdd-anchor;\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(--uktdd-body-max-height);\n min-width: var(--uktdd-body-min-width);\n max-width: var(--uktdd-body-max-width);\n overflow: auto;\n z-index: 2;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right)\n 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 &.has-items {\n user-select: none;\n }\n\n [data-ukt-active] {\n background-color: var(--uktdd-body-bg-color-hover);\n color: var(--uktdd-body-color-hover);\n }\n}\n\n@position-try --uktdd-top-left {\n bottom: anchor(top);\n left: anchor(left);\n top: auto;\n right: auto;\n}\n\n@position-try --uktdd-bottom-right {\n top: anchor(bottom);\n right: anchor(right);\n bottom: auto;\n left: auto;\n}\n\n@position-try --uktdd-top-right {\n bottom: anchor(top);\n right: anchor(right);\n top: auto;\n left: auto;\n}\n","import { getBestMatch } from '@acusti/matchmaking';\nimport { type SyntheticEvent } from 'react';\n\nimport { type Item } from './Dropdown.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('.uktdropdown-body');\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\ntype BaseSetActiveItemPayload = {\n dropdownElement: HTMLElement;\n element?: null;\n event: Event | SyntheticEvent<HTMLElement>;\n index?: null;\n indexAddend?: null;\n isExactMatch?: null;\n onActiveItem?: (payload: Item) => void;\n text?: null;\n};\n\nexport const setActiveItem = ({\n dropdownElement,\n element,\n event,\n index,\n indexAddend,\n isExactMatch,\n onActiveItem,\n text,\n}:\n | ({\n element: HTMLElement;\n } & Omit<BaseSetActiveItemPayload, 'element'>)\n | ({\n index: number;\n } & Omit<BaseSetActiveItemPayload, 'index'>)\n | ({\n indexAddend: number;\n } & Omit<BaseSetActiveItemPayload, 'indexAddend'>)\n | ({\n isExactMatch?: boolean;\n text: string;\n } & Omit<BaseSetActiveItemPayload, 'isExactMatch' | 'text'>)) => {\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 nextActiveIndex = Math.max(0, Math.min(nextActiveIndex, lastIndex));\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 const nextActiveItem = items[nextActiveIndex] as HTMLElement | null;\n if (nextActiveItem == null || nextActiveIndex === currentActiveIndex) return;\n\n // Clear any existing active dropdown body item state\n clearItemElementsState(itemElements);\n nextActiveItem.setAttribute('data-ukt-active', '');\n const label = nextActiveItem.innerText;\n const value = nextActiveItem.dataset.uktValue ?? label;\n onActiveItem?.({ element: nextActiveItem, event, label, value });\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 = 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","/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/mouse-events-have-key-events, jsx-a11y/no-static-element-interactions */\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 useRef,\n useState,\n} from 'react';\n\nimport styles from './Dropdown.css?inline';\nimport {\n getActiveItemElement,\n getItemElements,\n ITEM_SELECTOR,\n setActiveItem,\n} from './helpers.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 onActiveItem?: (payload: Item) => void;\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 CLICKABLE_SELECTOR = 'button, a[href], input[type=\"button\"], input[type=\"submit\"]';\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,\n name,\n onActiveItem,\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 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 != null) {\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 the item is clickable or contains exactly one clickable element, invoke it\n // (but only if the event didn’t already originate from that element)\n if (element) {\n const eventTarget = event.target as HTMLElement;\n\n if (element.matches(CLICKABLE_SELECTOR)) {\n // The item element itself is clickable (e.g., <button data-ukt-value=\"…\">)\n if (element !== eventTarget && !element.contains(eventTarget)) {\n element.click();\n }\n } else {\n // Check if item contains exactly one clickable child element\n const clickableElements = element.querySelectorAll(CLICKABLE_SELECTOR);\n if (clickableElements.length === 1) {\n const clickableElement = clickableElements[0] as HTMLElement;\n if (\n clickableElement !== eventTarget &&\n !clickableElement.contains(eventTarget)\n ) {\n clickableElement.click();\n }\n }\n }\n }\n\n onSubmitItemRef.current?.({\n element,\n event,\n label: itemLabel,\n value: nextValue,\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, event, onActiveItem });\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 (\n isOpeningRef.current ||\n !isOpenRef.current ||\n closingTimerRef.current != null\n ) {\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('.uktdropdown-body')) {\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 event,\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 onActiveItem,\n text: enteredCharactersRef.current,\n });\n\n if (clearEnteredCharactersTimerRef.current != null) {\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, event, index: 0, onActiveItem });\n } else {\n setActiveItem({\n dropdownElement,\n event,\n indexAddend: -1,\n onActiveItem,\n });\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, event, index: -1, onActiveItem });\n } else {\n setActiveItem({\n dropdownElement,\n event,\n indexAddend: 1,\n onActiveItem,\n });\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 != null) 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 != null) {\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 event,\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 onActiveItem,\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=\"uktdropdown-trigger\"\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=\"uktdropdown-trigger\" tabIndex={0} type=\"button\">\n {trigger}\n </button>\n );\n }\n }\n\n if (label) {\n trigger = (\n <label className=\"uktdropdown-label\">\n <div className=\"uktdropdown-label-text\">{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 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 }\n\n const style = {\n ...styleFromProps,\n ...(maxHeight != null && maxHeight > minHeightBody\n ? {\n '--uktdd-body-max-height': `calc(${maxHeight}px - var(--uktdd-body-buffer))`,\n }\n : null),\n ...(minWidthBody != null && minWidthBody > 0\n ? { '--uktdd-body-min-width': `${minWidthBody}px` }\n : null),\n };\n\n return (\n <Fragment>\n <style href=\"@acusti/dropdown/Dropdown\" precedence=\"medium\">\n {styles}\n </style>\n <div\n className={clsx('uktdropdown', className, {\n disabled,\n 'is-open': isOpen,\n 'is-searchable': isSearchable,\n })}\n onClick={onClick}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseOut={handleMouseOut}\n onMouseOver={handleMouseOver}\n onMouseUp={handleMouseUp}\n ref={handleRef}\n style={style}\n >\n {trigger}\n {/* TODO next version of Dropdown should use <Activity> for body https://react.dev/reference/react/Activity */}\n {isOpen ? (\n <div className=\"uktdropdown-body\" 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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acusti/dropdown",
3
- "version": "0.53.0",
3
+ "version": "0.54.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": "./dist/Dropdown.js",
@@ -57,7 +57,6 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@acusti/matchmaking": "^0.10.0",
60
- "@acusti/styling": "^2.1.0",
61
60
  "@acusti/use-bounding-client-rect": "^2.0.1",
62
61
  "@acusti/use-keyboard-events": "^0.11.0",
63
62
  "clsx": "^2"
package/dist/styles.d.ts DELETED
@@ -1,13 +0,0 @@
1
- export declare const ROOT_CLASS_NAME = "uktdropdown";
2
- export declare const ROOT_SELECTOR = ".uktdropdown";
3
- export declare const BODY_CLASS_NAME = "uktdropdown-body";
4
- export declare const LABEL_CLASS_NAME = "uktdropdown-label";
5
- export declare const LABEL_TEXT_CLASS_NAME = "uktdropdown-label-text";
6
- export declare const TRIGGER_CLASS_NAME = "uktdropdown-trigger";
7
- export declare const BODY_SELECTOR = ".uktdropdown-body";
8
- export declare const LABEL_SELECTOR = ".uktdropdown-label";
9
- export declare const LABEL_TEXT_SELECTOR = ".uktdropdown-label-text";
10
- export declare const TRIGGER_SELECTOR = ".uktdropdown-trigger";
11
- export declare const BODY_MAX_HEIGHT_VAR = "--uktdd-body-max-height";
12
- export declare const BODY_MAX_WIDTH_VAR = "--uktdd-body-max-width";
13
- export declare const STYLES = "\n:root {\n --uktdd-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n --uktdd-body-bg-color: #fff;\n --uktdd-body-bg-color-hover: rgb(105,162,249);\n --uktdd-body-color-hover: #fff;\n --uktdd-body-buffer: 10px;\n --uktdd-body-max-height: calc(100vh - var(--uktdd-body-buffer));\n --uktdd-body-max-width: calc(100vw - var(--uktdd-body-buffer));\n --uktdd-body-pad-bottom: 9px;\n --uktdd-body-pad-left: 12px;\n --uktdd-body-pad-right: 12px;\n --uktdd-body-pad-top: 9px;\n --uktdd-label-pad-right: 10px;\n}\n.uktdropdown,\n.uktdropdown-trigger {\n font-family: var(--uktdd-font-family);\n}\n.uktdropdown {\n width: max-content;\n anchor-scope: --uktdd-anchor;\n}\n.uktdropdown.disabled {\n pointer-events: none;\n}\n.uktdropdown > * {\n cursor: default;\n}\n.uktdropdown > :first-child {\n anchor-name: --uktdd-anchor;\n}\n.uktdropdown-label {\n display: flex;\n align-items: center;\n}\n.uktdropdown-label-text {\n padding-right: var(--uktdd-label-pad-right);\n}\n.uktdropdown-body {\n box-sizing: border-box;\n position: absolute;\n position-anchor: --uktdd-anchor;\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(--uktdd-body-max-height);\n min-width: min(50px, 100%);\n max-width: var(--uktdd-body-max-width);\n overflow: auto;\n z-index: 2;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);\n background-color: var(--uktdd-body-bg-color);\n box-shadow: 0 8px 18px rgba(0,0,0,0.25);\n}\n@position-try --uktdd-top-left {\n bottom: anchor(top);\n left: anchor(left);\n top: 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.uktdropdown-body.has-items {\n user-select: none;\n}\n.uktdropdown-body [data-ukt-active] {\n background-color: var(--uktdd-body-bg-color-hover);\n color: var(--uktdd-body-color-hover);\n}\n";