@acusti/dropdown 0.55.0 → 0.55.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Dropdown.js +146 -147
- package/dist/Dropdown.js.map +1 -1
- package/package.json +32 -32
package/dist/Dropdown.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Children, Fragment, isValidElement, useEffect, useRef, useState } from
|
|
|
5
5
|
import { getBestMatch } from "@acusti/matchmaking";
|
|
6
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
//#region src/Dropdown.css?inline
|
|
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(100dvh - var(--uktdd-body-buffer));--uktdd-body-max-width:calc(100dvw - var(--uktdd-body-buffer));--uktdd-body-min-height:30px;--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-body-position-area:bottom span-right;--uktdd-body-position-try-fallbacks:--uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;--uktdd-body-translate:0 0;--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;position-area:var(--uktdd-body-position-area);position-try-order:most-height;position-try-fallbacks:var(--uktdd-body-position-try-fallbacks);min-block-size:min(var(--uktdd-body-min-height), var(--uktdd-body-max-height));max-block-size:min(var(--uktdd-body-max-height), 100%);min-inline-size:min(var(--uktdd-body-min-width), var(--uktdd-body-max-width));max-inline-size:var(--uktdd-body-max-width);inline-size:max-content;translate:var(--uktdd-body-translate);z-index:2;background-color:var(--uktdd-body-bg-color);flex-direction:column;display:flex;position:fixed;overflow:hidden;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)}.uktdropdown-content{box-sizing:border-box;overscroll-behavior:contain;
|
|
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(100dvh - var(--uktdd-body-buffer));--uktdd-body-max-width:calc(100dvw - var(--uktdd-body-buffer));--uktdd-body-min-height:30px;--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-body-position-area:bottom span-right;--uktdd-body-position-try-fallbacks:--uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;--uktdd-body-translate:0 0;--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;position-area:var(--uktdd-body-position-area);position-try-order:most-height;position-try-fallbacks:var(--uktdd-body-position-try-fallbacks);min-block-size:min(var(--uktdd-body-min-height), var(--uktdd-body-max-height));max-block-size:min(var(--uktdd-body-max-height), 100%);min-inline-size:min(var(--uktdd-body-min-width), var(--uktdd-body-max-width));max-inline-size:var(--uktdd-body-max-width);inline-size:max-content;translate:var(--uktdd-body-translate);z-index:2;background-color:var(--uktdd-body-bg-color);flex-direction:column;display:flex;position:fixed;overflow:hidden;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)}.uktdropdown-content{box-sizing:border-box;overscroll-behavior:contain;min-block-size:0;padding:var(--uktdd-body-pad-top) var(--uktdd-body-pad-right) var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);overflow:auto}@position-try --uktdd-top-left{position-area: top span-right;}@position-try --uktdd-bottom-left{position-area: bottom span-right;}@position-try --uktdd-bottom-right{position-area: bottom span-left;}@position-try --uktdd-top-right{position-area: top span-left;}";
|
|
9
9
|
//#endregion
|
|
10
10
|
//#region src/helpers.ts
|
|
11
11
|
var ITEM_SELECTOR = `[data-ukt-item], [data-ukt-value]`;
|
|
@@ -100,11 +100,10 @@ var CLICKABLE_SELECTOR = "button, a[href], input[type=\"button\"], input[type=\"
|
|
|
100
100
|
var TEXT_INPUT_SELECTOR = "input:not([type=radio]):not([type=checkbox]):not([type=range]),textarea";
|
|
101
101
|
function Dropdown(t0) {
|
|
102
102
|
const $ = c(82);
|
|
103
|
-
const { allowCreate, allowEmpty: t1, children, className, disabled, hasItems: t2, isOpenOnMount, isSearchable, keepOpenOnSubmit: t3, label, minHeightBody
|
|
103
|
+
const { allowCreate, allowEmpty: t1, children, className, disabled, hasItems: t2, isOpenOnMount, isSearchable, keepOpenOnSubmit: t3, label, minHeightBody, minWidthBody, name, onActiveItem, onClick, onClose, onMouseDown, onMouseUp, onOpen, onSubmitItem, placeholder, style: styleFromProps, tabIndex, value } = t0;
|
|
104
104
|
const allowEmpty = t1 === void 0 ? true : t1;
|
|
105
105
|
const hasItems = t2 === void 0 ? true : t2;
|
|
106
106
|
const keepOpenOnSubmit = t3 === void 0 ? !hasItems : t3;
|
|
107
|
-
const minHeightBody = t4 === void 0 ? 30 : t4;
|
|
108
107
|
const childrenCount = Children.count(children);
|
|
109
108
|
if (childrenCount !== 1 && childrenCount !== 2) {
|
|
110
109
|
if (childrenCount === 0) throw new Error(CHILDREN_ERROR + " Received no children.");
|
|
@@ -132,10 +131,10 @@ function Dropdown(t0) {
|
|
|
132
131
|
const onOpenRef = useRef(onOpen);
|
|
133
132
|
const onSubmitItemRef = useRef(onSubmitItem);
|
|
134
133
|
const valueRef = useRef(value);
|
|
134
|
+
let t4;
|
|
135
135
|
let t5;
|
|
136
|
-
let t6;
|
|
137
136
|
if ($[0] !== allowCreate || $[1] !== allowEmpty || $[2] !== hasItems || $[3] !== isOpen || $[4] !== isOpening || $[5] !== keepOpenOnSubmit || $[6] !== onClose || $[7] !== onOpen || $[8] !== onSubmitItem || $[9] !== value) {
|
|
138
|
-
|
|
137
|
+
t4 = () => {
|
|
139
138
|
allowCreateRef.current = allowCreate;
|
|
140
139
|
allowEmptyRef.current = allowEmpty;
|
|
141
140
|
hasItemsRef.current = hasItems;
|
|
@@ -147,7 +146,7 @@ function Dropdown(t0) {
|
|
|
147
146
|
onSubmitItemRef.current = onSubmitItem;
|
|
148
147
|
valueRef.current = value;
|
|
149
148
|
};
|
|
150
|
-
|
|
149
|
+
t5 = [
|
|
151
150
|
allowCreate,
|
|
152
151
|
allowEmpty,
|
|
153
152
|
hasItems,
|
|
@@ -169,18 +168,18 @@ function Dropdown(t0) {
|
|
|
169
168
|
$[7] = onOpen;
|
|
170
169
|
$[8] = onSubmitItem;
|
|
171
170
|
$[9] = value;
|
|
172
|
-
$[10] =
|
|
173
|
-
$[11] =
|
|
171
|
+
$[10] = t4;
|
|
172
|
+
$[11] = t5;
|
|
174
173
|
} else {
|
|
175
|
-
|
|
176
|
-
|
|
174
|
+
t4 = $[10];
|
|
175
|
+
t5 = $[11];
|
|
177
176
|
}
|
|
178
|
-
useEffect(
|
|
177
|
+
useEffect(t4, t5);
|
|
179
178
|
const isMountedRef = useRef(false);
|
|
179
|
+
let t6;
|
|
180
180
|
let t7;
|
|
181
|
-
let t8;
|
|
182
181
|
if ($[12] !== isOpen) {
|
|
183
|
-
|
|
182
|
+
t6 = () => {
|
|
184
183
|
if (!isMountedRef.current) {
|
|
185
184
|
isMountedRef.current = true;
|
|
186
185
|
if (isOpenRef.current && onOpenRef.current) onOpenRef.current();
|
|
@@ -189,18 +188,18 @@ function Dropdown(t0) {
|
|
|
189
188
|
if (isOpen && onOpenRef.current) onOpenRef.current();
|
|
190
189
|
else if (!isOpen && onCloseRef.current) onCloseRef.current();
|
|
191
190
|
};
|
|
192
|
-
|
|
191
|
+
t7 = [isOpen];
|
|
193
192
|
$[12] = isOpen;
|
|
194
|
-
$[13] =
|
|
195
|
-
$[14] =
|
|
193
|
+
$[13] = t6;
|
|
194
|
+
$[14] = t7;
|
|
196
195
|
} else {
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
t6 = $[13];
|
|
197
|
+
t7 = $[14];
|
|
199
198
|
}
|
|
200
|
-
useEffect(
|
|
201
|
-
let
|
|
199
|
+
useEffect(t6, t7);
|
|
200
|
+
let t8;
|
|
202
201
|
if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
|
|
203
|
-
|
|
202
|
+
t8 = () => {
|
|
204
203
|
setIsOpen(false);
|
|
205
204
|
setIsOpening(false);
|
|
206
205
|
mouseDownPositionRef.current = null;
|
|
@@ -209,12 +208,12 @@ function Dropdown(t0) {
|
|
|
209
208
|
closingTimerRef.current = null;
|
|
210
209
|
}
|
|
211
210
|
};
|
|
212
|
-
$[15] =
|
|
213
|
-
} else
|
|
214
|
-
const closeDropdown =
|
|
215
|
-
let
|
|
211
|
+
$[15] = t8;
|
|
212
|
+
} else t8 = $[15];
|
|
213
|
+
const closeDropdown = t8;
|
|
214
|
+
let t9;
|
|
216
215
|
if ($[16] !== dropdownElement) {
|
|
217
|
-
|
|
216
|
+
t9 = (event) => {
|
|
218
217
|
if (isOpenRef.current && !keepOpenOnSubmitRef.current) closingTimerRef.current = setTimeout(closeDropdown, 90);
|
|
219
218
|
if (!hasItemsRef.current) return;
|
|
220
219
|
const element = getActiveItemElement(dropdownElement);
|
|
@@ -250,25 +249,25 @@ function Dropdown(t0) {
|
|
|
250
249
|
});
|
|
251
250
|
};
|
|
252
251
|
$[16] = dropdownElement;
|
|
253
|
-
$[17] =
|
|
254
|
-
} else
|
|
255
|
-
const handleSubmitItem =
|
|
256
|
-
let
|
|
252
|
+
$[17] = t9;
|
|
253
|
+
} else t9 = $[17];
|
|
254
|
+
const handleSubmitItem = t9;
|
|
255
|
+
let t10;
|
|
257
256
|
if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
|
|
258
|
-
|
|
259
|
-
const { clientX, clientY } =
|
|
257
|
+
t10 = (t11) => {
|
|
258
|
+
const { clientX, clientY } = t11;
|
|
260
259
|
currentInputMethodRef.current = "mouse";
|
|
261
260
|
const initialPosition = mouseDownPositionRef.current;
|
|
262
261
|
if (!initialPosition) return;
|
|
263
262
|
if (Math.abs(initialPosition.clientX - clientX) < 12 && Math.abs(initialPosition.clientY - clientY) < 12) return;
|
|
264
263
|
setIsOpening(false);
|
|
265
264
|
};
|
|
266
|
-
$[18] =
|
|
267
|
-
} else
|
|
268
|
-
const handleMouseMove =
|
|
269
|
-
let
|
|
265
|
+
$[18] = t10;
|
|
266
|
+
} else t10 = $[18];
|
|
267
|
+
const handleMouseMove = t10;
|
|
268
|
+
let t11;
|
|
270
269
|
if ($[19] !== dropdownElement || $[20] !== onActiveItem) {
|
|
271
|
-
|
|
270
|
+
t11 = (event_0) => {
|
|
272
271
|
if (!hasItemsRef.current) return;
|
|
273
272
|
if (currentInputMethodRef.current !== "mouse") return;
|
|
274
273
|
if (!dropdownElement) return;
|
|
@@ -288,12 +287,12 @@ function Dropdown(t0) {
|
|
|
288
287
|
};
|
|
289
288
|
$[19] = dropdownElement;
|
|
290
289
|
$[20] = onActiveItem;
|
|
291
|
-
$[21] =
|
|
292
|
-
} else
|
|
293
|
-
const handleMouseOver =
|
|
294
|
-
let
|
|
290
|
+
$[21] = t11;
|
|
291
|
+
} else t11 = $[21];
|
|
292
|
+
const handleMouseOver = t11;
|
|
293
|
+
let t12;
|
|
295
294
|
if ($[22] !== dropdownElement) {
|
|
296
|
-
|
|
295
|
+
t12 = (event_1) => {
|
|
297
296
|
if (!hasItemsRef.current) return;
|
|
298
297
|
const activeItem = getActiveItemElement(dropdownElement);
|
|
299
298
|
if (!activeItem) return;
|
|
@@ -302,12 +301,12 @@ function Dropdown(t0) {
|
|
|
302
301
|
delete activeItem.dataset.uktActive;
|
|
303
302
|
};
|
|
304
303
|
$[22] = dropdownElement;
|
|
305
|
-
$[23] =
|
|
306
|
-
} else
|
|
307
|
-
const handleMouseOut =
|
|
308
|
-
let
|
|
304
|
+
$[23] = t12;
|
|
305
|
+
} else t12 = $[23];
|
|
306
|
+
const handleMouseOut = t12;
|
|
307
|
+
let t13;
|
|
309
308
|
if ($[24] !== onMouseDown) {
|
|
310
|
-
|
|
309
|
+
t13 = (event_2) => {
|
|
311
310
|
if (onMouseDown) onMouseDown(event_2);
|
|
312
311
|
if (isOpenRef.current) return;
|
|
313
312
|
setIsOpen(true);
|
|
@@ -322,12 +321,12 @@ function Dropdown(t0) {
|
|
|
322
321
|
}, 1e3);
|
|
323
322
|
};
|
|
324
323
|
$[24] = onMouseDown;
|
|
325
|
-
$[25] =
|
|
326
|
-
} else
|
|
327
|
-
const handleMouseDown =
|
|
328
|
-
let
|
|
324
|
+
$[25] = t13;
|
|
325
|
+
} else t13 = $[25];
|
|
326
|
+
const handleMouseDown = t13;
|
|
327
|
+
let t14;
|
|
329
328
|
if ($[26] !== handleSubmitItem || $[27] !== onMouseUp) {
|
|
330
|
-
|
|
329
|
+
t14 = (event_3) => {
|
|
331
330
|
if (onMouseUp) onMouseUp(event_3);
|
|
332
331
|
if (isOpeningRef.current || !isOpenRef.current || closingTimerRef.current != null) return;
|
|
333
332
|
const eventTarget_1 = event_3.target;
|
|
@@ -340,12 +339,12 @@ function Dropdown(t0) {
|
|
|
340
339
|
};
|
|
341
340
|
$[26] = handleSubmitItem;
|
|
342
341
|
$[27] = onMouseUp;
|
|
343
|
-
$[28] =
|
|
344
|
-
} else
|
|
345
|
-
const handleMouseUp =
|
|
346
|
-
let
|
|
342
|
+
$[28] = t14;
|
|
343
|
+
} else t14 = $[28];
|
|
344
|
+
const handleMouseUp = t14;
|
|
345
|
+
let t15;
|
|
347
346
|
if ($[29] !== dropdownElement || $[30] !== handleSubmitItem || $[31] !== onActiveItem) {
|
|
348
|
-
|
|
347
|
+
t15 = (event_4) => {
|
|
349
348
|
const { altKey, ctrlKey, key, metaKey } = event_4;
|
|
350
349
|
const eventTarget_2 = event_4.target;
|
|
351
350
|
if (!dropdownElement) return;
|
|
@@ -433,22 +432,22 @@ function Dropdown(t0) {
|
|
|
433
432
|
$[29] = dropdownElement;
|
|
434
433
|
$[30] = handleSubmitItem;
|
|
435
434
|
$[31] = onActiveItem;
|
|
436
|
-
$[32] =
|
|
437
|
-
} else
|
|
438
|
-
const handleKeyDown =
|
|
439
|
-
let
|
|
435
|
+
$[32] = t15;
|
|
436
|
+
} else t15 = $[32];
|
|
437
|
+
const handleKeyDown = t15;
|
|
438
|
+
let t16;
|
|
440
439
|
if ($[33] !== handleKeyDown) {
|
|
441
|
-
|
|
440
|
+
t16 = {
|
|
442
441
|
ignoreUsedKeyboardEvents: false,
|
|
443
442
|
onKeyDown: handleKeyDown
|
|
444
443
|
};
|
|
445
444
|
$[33] = handleKeyDown;
|
|
446
|
-
$[34] =
|
|
447
|
-
} else
|
|
448
|
-
useKeyboardEvents(
|
|
449
|
-
let
|
|
445
|
+
$[34] = t16;
|
|
446
|
+
} else t16 = $[34];
|
|
447
|
+
useKeyboardEvents(t16);
|
|
448
|
+
let t17;
|
|
450
449
|
if ($[35] !== isOpenOnMount || $[36] !== onActiveItem) {
|
|
451
|
-
|
|
450
|
+
t17 = (ref) => {
|
|
452
451
|
setDropdownElement(ref);
|
|
453
452
|
if (!ref) return;
|
|
454
453
|
const { ownerDocument } = ref;
|
|
@@ -458,13 +457,13 @@ function Dropdown(t0) {
|
|
|
458
457
|
else inputElement = ref.firstElementChild.querySelector(TEXT_INPUT_SELECTOR);
|
|
459
458
|
inputElementRef.current = inputElement;
|
|
460
459
|
}
|
|
461
|
-
const handleGlobalMouseDown = (
|
|
462
|
-
const { target } =
|
|
460
|
+
const handleGlobalMouseDown = (t18) => {
|
|
461
|
+
const { target } = t18;
|
|
463
462
|
const eventTarget_3 = target;
|
|
464
463
|
if (!ref.contains(eventTarget_3)) closeDropdown();
|
|
465
464
|
};
|
|
466
|
-
const handleGlobalMouseUp = (
|
|
467
|
-
const { target: target_0 } =
|
|
465
|
+
const handleGlobalMouseUp = (t19) => {
|
|
466
|
+
const { target: target_0 } = t19;
|
|
468
467
|
if (!isOpenRef.current || closingTimerRef.current != null) return;
|
|
469
468
|
if (isOpeningRef.current) {
|
|
470
469
|
setIsOpening(false);
|
|
@@ -477,8 +476,8 @@ function Dropdown(t0) {
|
|
|
477
476
|
const eventTarget_4 = target_0;
|
|
478
477
|
if (!ref.contains(eventTarget_4)) closeDropdown();
|
|
479
478
|
};
|
|
480
|
-
const handleGlobalFocusIn = (
|
|
481
|
-
const { target: target_1 } =
|
|
479
|
+
const handleGlobalFocusIn = (t20) => {
|
|
480
|
+
const { target: target_1 } = t20;
|
|
482
481
|
if (!isOpenRef.current) return;
|
|
483
482
|
const eventTarget_5 = target_1;
|
|
484
483
|
if (ref.contains(eventTarget_5) || eventTarget_5.contains(ref)) return;
|
|
@@ -522,25 +521,25 @@ function Dropdown(t0) {
|
|
|
522
521
|
};
|
|
523
522
|
$[35] = isOpenOnMount;
|
|
524
523
|
$[36] = onActiveItem;
|
|
525
|
-
$[37] =
|
|
526
|
-
} else
|
|
527
|
-
const handleRef =
|
|
524
|
+
$[37] = t17;
|
|
525
|
+
} else t17 = $[37];
|
|
526
|
+
const handleRef = t17;
|
|
528
527
|
if (!isValidElement(trigger)) if (isSearchable) {
|
|
529
|
-
const
|
|
530
|
-
let
|
|
528
|
+
const t18 = value ?? "";
|
|
529
|
+
let t19;
|
|
531
530
|
if ($[38] === Symbol.for("react.memo_cache_sentinel")) {
|
|
532
|
-
|
|
533
|
-
$[38] =
|
|
534
|
-
} else
|
|
535
|
-
let
|
|
536
|
-
if ($[39] !== disabled || $[40] !== name || $[41] !== placeholder || $[42] !==
|
|
537
|
-
|
|
531
|
+
t19 = () => setIsOpen(true);
|
|
532
|
+
$[38] = t19;
|
|
533
|
+
} else t19 = $[38];
|
|
534
|
+
let t20;
|
|
535
|
+
if ($[39] !== disabled || $[40] !== name || $[41] !== placeholder || $[42] !== t18 || $[43] !== tabIndex) {
|
|
536
|
+
t20 = /* @__PURE__ */ jsx("input", {
|
|
538
537
|
autoComplete: "off",
|
|
539
538
|
className: "uktdropdown-trigger",
|
|
540
|
-
defaultValue:
|
|
539
|
+
defaultValue: t18,
|
|
541
540
|
disabled,
|
|
542
541
|
name,
|
|
543
|
-
onFocus:
|
|
542
|
+
onFocus: t19,
|
|
544
543
|
placeholder,
|
|
545
544
|
ref: inputElementRef,
|
|
546
545
|
tabIndex,
|
|
@@ -549,84 +548,84 @@ function Dropdown(t0) {
|
|
|
549
548
|
$[39] = disabled;
|
|
550
549
|
$[40] = name;
|
|
551
550
|
$[41] = placeholder;
|
|
552
|
-
$[42] =
|
|
551
|
+
$[42] = t18;
|
|
553
552
|
$[43] = tabIndex;
|
|
554
|
-
$[44] =
|
|
555
|
-
} else
|
|
556
|
-
trigger =
|
|
553
|
+
$[44] = t20;
|
|
554
|
+
} else t20 = $[44];
|
|
555
|
+
trigger = t20;
|
|
557
556
|
} else {
|
|
558
|
-
let
|
|
557
|
+
let t18;
|
|
559
558
|
if ($[45] !== trigger) {
|
|
560
|
-
|
|
559
|
+
t18 = /* @__PURE__ */ jsx("button", {
|
|
561
560
|
className: "uktdropdown-trigger",
|
|
562
561
|
tabIndex: 0,
|
|
563
562
|
type: "button",
|
|
564
563
|
children: trigger
|
|
565
564
|
});
|
|
566
565
|
$[45] = trigger;
|
|
567
|
-
$[46] =
|
|
568
|
-
} else
|
|
569
|
-
trigger =
|
|
566
|
+
$[46] = t18;
|
|
567
|
+
} else t18 = $[46];
|
|
568
|
+
trigger = t18;
|
|
570
569
|
}
|
|
571
570
|
if (label != null) {
|
|
572
|
-
let
|
|
571
|
+
let t18;
|
|
573
572
|
if ($[47] !== label) {
|
|
574
|
-
|
|
573
|
+
t18 = /* @__PURE__ */ jsx("div", {
|
|
575
574
|
className: "uktdropdown-label-text",
|
|
576
575
|
children: label
|
|
577
576
|
});
|
|
578
577
|
$[47] = label;
|
|
579
|
-
$[48] =
|
|
580
|
-
} else
|
|
581
|
-
let
|
|
582
|
-
if ($[49] !==
|
|
583
|
-
|
|
578
|
+
$[48] = t18;
|
|
579
|
+
} else t18 = $[48];
|
|
580
|
+
let t19;
|
|
581
|
+
if ($[49] !== t18 || $[50] !== trigger) {
|
|
582
|
+
t19 = /* @__PURE__ */ jsxs("label", {
|
|
584
583
|
className: "uktdropdown-label",
|
|
585
|
-
children: [
|
|
584
|
+
children: [t18, trigger]
|
|
586
585
|
});
|
|
587
|
-
$[49] =
|
|
586
|
+
$[49] = t18;
|
|
588
587
|
$[50] = trigger;
|
|
589
|
-
$[51] =
|
|
590
|
-
} else
|
|
591
|
-
trigger =
|
|
588
|
+
$[51] = t19;
|
|
589
|
+
} else t19 = $[51];
|
|
590
|
+
trigger = t19;
|
|
592
591
|
}
|
|
593
|
-
let
|
|
592
|
+
let t18;
|
|
594
593
|
if ($[52] !== minHeightBody) {
|
|
595
|
-
|
|
594
|
+
t18 = minHeightBody != null && minHeightBody > 0 ? { "--uktdd-body-min-height": `${minHeightBody}px` } : null;
|
|
596
595
|
$[52] = minHeightBody;
|
|
597
|
-
$[53] =
|
|
598
|
-
} else
|
|
599
|
-
let
|
|
596
|
+
$[53] = t18;
|
|
597
|
+
} else t18 = $[53];
|
|
598
|
+
let t19;
|
|
600
599
|
if ($[54] !== minWidthBody) {
|
|
601
|
-
|
|
600
|
+
t19 = minWidthBody != null && minWidthBody > 0 ? { "--uktdd-body-min-width": `${minWidthBody}px` } : null;
|
|
602
601
|
$[54] = minWidthBody;
|
|
603
|
-
$[55] =
|
|
604
|
-
} else
|
|
605
|
-
let
|
|
606
|
-
if ($[56] !== styleFromProps || $[57] !==
|
|
607
|
-
|
|
602
|
+
$[55] = t19;
|
|
603
|
+
} else t19 = $[55];
|
|
604
|
+
let t20;
|
|
605
|
+
if ($[56] !== styleFromProps || $[57] !== t18 || $[58] !== t19) {
|
|
606
|
+
t20 = {
|
|
608
607
|
...styleFromProps,
|
|
609
|
-
...
|
|
610
|
-
...
|
|
608
|
+
...t18,
|
|
609
|
+
...t19
|
|
611
610
|
};
|
|
612
611
|
$[56] = styleFromProps;
|
|
613
|
-
$[57] =
|
|
614
|
-
$[58] =
|
|
615
|
-
$[59] =
|
|
616
|
-
} else
|
|
617
|
-
const style =
|
|
618
|
-
let
|
|
612
|
+
$[57] = t18;
|
|
613
|
+
$[58] = t19;
|
|
614
|
+
$[59] = t20;
|
|
615
|
+
} else t20 = $[59];
|
|
616
|
+
const style = t20;
|
|
617
|
+
let t21;
|
|
619
618
|
if ($[60] === Symbol.for("react.memo_cache_sentinel")) {
|
|
620
|
-
|
|
619
|
+
t21 = /* @__PURE__ */ jsx("style", {
|
|
621
620
|
href: "@acusti/dropdown/Dropdown",
|
|
622
621
|
precedence: "medium",
|
|
623
622
|
children: Dropdown_default
|
|
624
623
|
});
|
|
625
|
-
$[60] =
|
|
626
|
-
} else
|
|
627
|
-
let
|
|
624
|
+
$[60] = t21;
|
|
625
|
+
} else t21 = $[60];
|
|
626
|
+
let t22;
|
|
628
627
|
if ($[61] !== className || $[62] !== disabled || $[63] !== isOpen || $[64] !== isSearchable) {
|
|
629
|
-
|
|
628
|
+
t22 = clsx("uktdropdown", className, {
|
|
630
629
|
disabled,
|
|
631
630
|
"is-open": isOpen,
|
|
632
631
|
"is-searchable": isSearchable
|
|
@@ -635,11 +634,11 @@ function Dropdown(t0) {
|
|
|
635
634
|
$[62] = disabled;
|
|
636
635
|
$[63] = isOpen;
|
|
637
636
|
$[64] = isSearchable;
|
|
638
|
-
$[65] =
|
|
639
|
-
} else
|
|
640
|
-
let
|
|
637
|
+
$[65] = t22;
|
|
638
|
+
} else t22 = $[65];
|
|
639
|
+
let t23;
|
|
641
640
|
if ($[66] !== children || $[67] !== childrenCount || $[68] !== hasItems || $[69] !== isOpen) {
|
|
642
|
-
|
|
641
|
+
t23 = isOpen ? /* @__PURE__ */ jsx("div", {
|
|
643
642
|
className: clsx("uktdropdown-body", { "has-items": hasItems }),
|
|
644
643
|
children: /* @__PURE__ */ jsx("div", {
|
|
645
644
|
className: "uktdropdown-content",
|
|
@@ -650,12 +649,12 @@ function Dropdown(t0) {
|
|
|
650
649
|
$[67] = childrenCount;
|
|
651
650
|
$[68] = hasItems;
|
|
652
651
|
$[69] = isOpen;
|
|
653
|
-
$[70] =
|
|
654
|
-
} else
|
|
655
|
-
let
|
|
656
|
-
if ($[71] !== handleMouseDown || $[72] !== handleMouseOut || $[73] !== handleMouseOver || $[74] !== handleMouseUp || $[75] !== handleRef || $[76] !== onClick || $[77] !== style || $[78] !==
|
|
657
|
-
|
|
658
|
-
className:
|
|
652
|
+
$[70] = t23;
|
|
653
|
+
} else t23 = $[70];
|
|
654
|
+
let t24;
|
|
655
|
+
if ($[71] !== handleMouseDown || $[72] !== handleMouseOut || $[73] !== handleMouseOver || $[74] !== handleMouseUp || $[75] !== handleRef || $[76] !== onClick || $[77] !== style || $[78] !== t22 || $[79] !== t23 || $[80] !== trigger) {
|
|
656
|
+
t24 = /* @__PURE__ */ jsxs(Fragment, { children: [t21, /* @__PURE__ */ jsxs("div", {
|
|
657
|
+
className: t22,
|
|
659
658
|
onClick,
|
|
660
659
|
onMouseDown: handleMouseDown,
|
|
661
660
|
onMouseMove: handleMouseMove,
|
|
@@ -664,7 +663,7 @@ function Dropdown(t0) {
|
|
|
664
663
|
onMouseUp: handleMouseUp,
|
|
665
664
|
ref: handleRef,
|
|
666
665
|
style,
|
|
667
|
-
children: [trigger,
|
|
666
|
+
children: [trigger, t23]
|
|
668
667
|
})] });
|
|
669
668
|
$[71] = handleMouseDown;
|
|
670
669
|
$[72] = handleMouseOut;
|
|
@@ -673,12 +672,12 @@ function Dropdown(t0) {
|
|
|
673
672
|
$[75] = handleRef;
|
|
674
673
|
$[76] = onClick;
|
|
675
674
|
$[77] = style;
|
|
676
|
-
$[78] =
|
|
677
|
-
$[79] =
|
|
675
|
+
$[78] = t22;
|
|
676
|
+
$[79] = t23;
|
|
678
677
|
$[80] = trigger;
|
|
679
|
-
$[81] =
|
|
680
|
-
} else
|
|
681
|
-
return
|
|
678
|
+
$[81] = t24;
|
|
679
|
+
} else t24 = $[81];
|
|
680
|
+
return t24;
|
|
682
681
|
}
|
|
683
682
|
//#endregion
|
|
684
683
|
export { Dropdown as default };
|
package/dist/Dropdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","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","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","t22","t23","t24","t25"],"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(100dvh - var(--uktdd-body-buffer));\n --uktdd-body-max-width: calc(100dvw - var(--uktdd-body-buffer));\n --uktdd-body-min-height: 30px;\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-body-position-area: bottom span-right;\n --uktdd-body-position-try-fallbacks:\n --uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;\n --uktdd-body-translate: 0 0;\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 display: flex;\n flex-direction: column;\n position: fixed;\n position-anchor: --uktdd-anchor;\n position-area: var(--uktdd-body-position-area);\n position-try-order: most-height;\n position-try-fallbacks: var(--uktdd-body-position-try-fallbacks);\n min-block-size: min(var(--uktdd-body-min-height), var(--uktdd-body-max-height));\n max-block-size: min(var(--uktdd-body-max-height), 100%);\n min-inline-size: min(var(--uktdd-body-min-width), var(--uktdd-body-max-width));\n max-inline-size: var(--uktdd-body-max-width);\n inline-size: max-content;\n overflow: hidden;\n translate: var(--uktdd-body-translate);\n z-index: 2;\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.uktdropdown-content {\n box-sizing: border-box;\n min-block-size: 0;\n overflow: auto;\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right)\n var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);\n}\n\n@position-try --uktdd-top-left {\n position-area: top span-right;\n}\n\n@position-try --uktdd-bottom-left {\n position-area: bottom span-right;\n}\n\n@position-try --uktdd-bottom-right {\n position-area: bottom span-left;\n}\n\n@position-try --uktdd-top-right {\n position-area: top span-left;\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 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?: ReactNode;\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 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 != null) {\n trigger = (\n <label className=\"uktdropdown-label\">\n <div className=\"uktdropdown-label-text\">{label}</div>\n {trigger}\n </label>\n );\n }\n\n const style = {\n ...styleFromProps,\n ...(minHeightBody != null && minHeightBody > 0\n ? { '--uktdd-body-min-height': `${minHeightBody}px` }\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\n className={clsx('uktdropdown-body', {\n 'has-items': hasItems,\n })}\n >\n <div className=\"uktdropdown-content\">\n {childrenCount > 1\n ? (children as ChildrenTuple)[1]\n : children}\n </div>\n </div>\n ) : null}\n </div>\n </Fragment>\n );\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","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","styleFromProps","undefined","childrenCount","count","Error","console","error","trigger","isOpen","setIsOpen","isOpening","setIsOpening","dropdownElement","setDropdownElement","inputElementRef","closingTimerRef","isOpeningTimerRef","currentInputMethodRef","clearEnteredCharactersTimerRef","enteredCharactersRef","mouseDownPositionRef","allowCreateRef","allowEmptyRef","hasItemsRef","isOpenRef","isOpeningRef","keepOpenOnSubmitRef","onCloseRef","onOpenRef","onSubmitItemRef","valueRef","t4","t5","current","isMountedRef","t6","t7","t8","Symbol","for","clearTimeout","closeDropdown","t9","itemLabel","innerText","ownerDocument","activeElement","blur","nextValue","dataset","uktValue","eventTarget","target","matches","contains","click","clickableElements","querySelectorAll","length","clickableElement","handleSubmitItem","t10","t11","initialPosition","Math","abs","handleMouseMove","event_0","itemElements","eventTarget_0","item","closest","element_0","itemElement","handleMouseOver","t12","event_1","activeItem","eventRelatedTarget","relatedTarget","uktActive","handleMouseOut","t13","event_2","handleMouseDown","t14","event_3","eventTarget_1","handleMouseUp","t15","event_4","altKey","ctrlKey","key","metaKey","eventTarget_2","onEventHandled","stopPropagation","preventDefault","isEventTargetingDropdown","isTargetUsingKeyEvents","isEditingCharacters","test","slice","isExactMatch","text","index","indexAddend","handleKeyDown","t16","ignoreUsedKeyboardEvents","onKeyDown","t17","ref","inputElement","firstElementChild","HTMLInputElement","querySelector","handleGlobalMouseDown","t18","eventTarget_3","handleGlobalMouseUp","t19","target_0","eventTarget_4","handleGlobalFocusIn","t20","target_1","eventTarget_5","document","addEventListener","focus","handleInput","event_5","input","isDeleting","removeEventListener","handleRef","t21","t22","t23","t24"],"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(100dvh - var(--uktdd-body-buffer));\n --uktdd-body-max-width: calc(100dvw - var(--uktdd-body-buffer));\n --uktdd-body-min-height: 30px;\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-body-position-area: bottom span-right;\n --uktdd-body-position-try-fallbacks:\n --uktdd-top-left, --uktdd-bottom-right, --uktdd-top-right;\n --uktdd-body-translate: 0 0;\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 display: flex;\n flex-direction: column;\n position: fixed;\n position-anchor: --uktdd-anchor;\n position-area: var(--uktdd-body-position-area);\n position-try-order: most-height;\n position-try-fallbacks: var(--uktdd-body-position-try-fallbacks);\n min-block-size: min(var(--uktdd-body-min-height), var(--uktdd-body-max-height));\n max-block-size: min(var(--uktdd-body-max-height), 100%);\n min-inline-size: min(var(--uktdd-body-min-width), var(--uktdd-body-max-width));\n max-inline-size: var(--uktdd-body-max-width);\n inline-size: max-content;\n overflow: hidden;\n translate: var(--uktdd-body-translate);\n z-index: 2;\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.uktdropdown-content {\n box-sizing: border-box;\n min-block-size: 0;\n overflow: auto;\n overscroll-behavior: contain;\n padding: var(--uktdd-body-pad-top) var(--uktdd-body-pad-right)\n var(--uktdd-body-pad-bottom) var(--uktdd-body-pad-left);\n}\n\n@position-try --uktdd-top-left {\n position-area: top span-right;\n}\n\n@position-try --uktdd-bottom-left {\n position-area: bottom span-right;\n}\n\n@position-try --uktdd-bottom-right {\n position-area: bottom span-left;\n}\n\n@position-try --uktdd-top-right {\n position-area: top span-left;\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 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?: ReactNode;\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,\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 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 != null) {\n trigger = (\n <label className=\"uktdropdown-label\">\n <div className=\"uktdropdown-label-text\">{label}</div>\n {trigger}\n </label>\n );\n }\n\n const style = {\n ...styleFromProps,\n ...(minHeightBody != null && minHeightBody > 0\n ? { '--uktdd-body-min-height': `${minHeightBody}px` }\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\n className={clsx('uktdropdown-body', {\n 'has-items': hasItems,\n })}\n >\n <div className=\"uktdropdown-content\">\n {childrenCount > 1\n ? (children as ChildrenTuple)[1]\n : children}\n </div>\n </div>\n ) : null}\n </div>\n </Fragment>\n );\n}\n"],"mappings":";;;;;;;;;;ACKA,IAAaG,gBAAgB;AAE7B,IAAaC,mBAAmBC,oBAAwC;AACpE,KAAI,CAACA,gBAAiB,QAAO;CAE7B,MAAME,cAAcF,gBAAgBG,cAAc,oBAAoB;AACtE,KAAI,CAACD,YAAa,QAAO;CAEzB,IAAIE,QACAF,YAAYM,iBAAiBV,cAAc;AAE/C,KAAIM,MAAMK,OAAQ,QAAOL;AAGzBA,SAAQF,YAAYQ;AACpB,QAAON,MAAMK,WAAW,GAAG;AACvB,MAAIL,MAAM,GAAGM,YAAY,KAAM;AAC/BN,UAAQA,MAAM,GAAGM;;AAGrB,KAAIN,MAAMK,WAAW,EACjBL,SAAQF,YAAYQ;AAExB,QAAON;;AAGX,IAAaO,wBAAwBX,oBAAwC;AACzE,KAAI,CAACA,gBAAiB,QAAO;AAC7B,QAAOA,gBAAgBG,cAAc,oBAAoB;;AAG7D,IAAMS,0BAA0BC,iBAAqC;AACjEA,cAAaE,SAASC,gBAAgB;AAClC,MAAIA,YAAYC,aAAa,kBAAkB,CAC3C,QAAOD,YAAYE,QAAQC;GAEjC;;AAcN,IAAaW,iBAAiB,EAC1B9B,iBACAqB,SACAC,OACAE,OACAC,aACAC,cACAC,cACAE,WAcmE;CACnE,MAAMzB,QAAQL,gBAAgBC,gBAAgB;AAC9C,KAAI,CAACI,MAAO;CAEZ,MAAMS,eAAeC,MAAMkB,KAAK5B,MAAM;AACtC,KAAI,CAACS,aAAaJ,OAAQ;CAE1B,MAAMwB,YAAYpB,aAAaJ,SAAS;CACxC,MAAMyB,qBAAqBrB,aAAasB,WAAWnB,gBAC/CA,YAAYC,aAAa,kBAC7B,CAAC;CAED,IAAImB,kBAAkBF;AACtB,KAAI,OAAOV,UAAU,SAEjBY,mBAAkBZ,QAAQ,IAAIX,aAAaJ,SAASe,QAAQA;AAGhE,KAAIH,QACAe,mBAAkBvB,aAAasB,WAC1BnB,gBAAgBA,gBAAgBK,QACpC;UACM,OAAOI,gBAAgB,UAAU;AAExC,MAAIS,uBAAuB,MAAMT,gBAAgB,GAC7CW,mBAAkBH;MAElBG,oBAAmBX;AAGvBW,oBAAkBC,KAAKC,IAAI,GAAGD,KAAKE,IAAIH,iBAAiBH,UAAU,CAAC;YAC5D,OAAOJ,SAAS,UAAU;AAEjC,MAAI,CAACA,MAAM;AACPjB,0BAAuBC,aAAa;AACpC;;EAGJ,MAAM2B,YAAY3B,aAAa4B,KAAKzB,gBAAgBA,YAAY0B,UAAU;AAC1E,MAAIhB,cAAc;GACd,MAAMiB,gBAAgBd,KAAKe,aAAa;AACxCR,qBAAkBI,UAAUL,WAAWU,aACnCA,SAASD,aAAa,CAACE,WAAWH,cACtC,CAAC;AAED,OAAIP,oBAAoB,GACpBxB,wBAAuBC,aAAa;SAErC;GACH,MAAMkC,YAAYpD,aAAa;IAAES,OAAOoC;IAAWX;IAAM,CAAC;AAC1DO,qBAAkBI,UAAUL,WAAWU,aAAaA,aAAaE,UAAU;;;CAInF,MAAMC,iBAAiB5C,MAAMgC;AAC7B,KAAIY,kBAAkB,QAAQZ,oBAAoBF,mBAAoB;AAGtEtB,wBAAuBC,aAAa;AACpCmC,gBAAeC,aAAa,mBAAmB,GAAG;CAClD,MAAMC,QAAQF,eAAeN;CAC7B,MAAMS,QAAQH,eAAe9B,QAAQkC,YAAYF;AACjDvB,gBAAe;EAAEN,SAAS2B;EAAgB1B;EAAO4B;EAAOC;EAAO,CAAC;CAEhE,IAAI,EAAEE,kBAAkBL;CACxB,IAAIM,mBAAmB;AACvB,QAAO,CAACA,oBAAoBD,iBAAiBA,kBAAkBrD,gBAE3D,KADqBqD,cAAcG,eAAeH,cAAcI,eAAe,GAE3EH,oBAAmBD;KAEnBA,iBAAgBA,cAAcA;AAItC,KAAIC,kBAAkB;EAClB,MAAMI,aAAaJ,iBAAiBK,uBAAuB;EAC3D,MAAMC,WAAWZ,eAAeW,uBAAuB;EACvD,MAAME,aAAaD,SAASE,MAAMJ,WAAWI;EAC7C,MAAMC,gBAAgBH,SAASI,SAASN,WAAWM;AACnD,MAAIH,cAAcE,eAAe;GAC7B,IAAI,EAAEE,cAAcX;AAEpB,OAAIO,WACAI,cAAaP,WAAWI,MAAMF,SAASE;OAEvCG,cAAaL,SAASI,SAASN,WAAWM;AAE9CV,oBAAiBW,YAAYA;;;;;;AChEzC,IAAM8D,iBACF;AACJ,IAAMC,qBAAqB;AAC3B,IAAMC,sBACF;AAEJ,SAAeC,SAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAkB,MAAA,EAAAtC,aAAAC,YAAAsC,IAAArC,UAAAG,WAAAC,UAAAE,UAAAgC,IAAA/B,eAAAC,cAAAC,kBAAA8B,IAAA5C,OAAAe,eAAAC,cAAAC,MAAAC,cAAAE,SAAAC,SAAAC,aAAAC,WAAAC,QAAAC,cAAAC,aAAAC,OAAAkB,gBAAAjB,UAAA3B,UAAAsC;CAE7B,MAAAnC,aAAAsC,OAAAI,KAAAA,IAAA,OAAAJ;CAIA,MAAA/B,WAAAgC,OAAAG,KAAAA,IAAA,OAAAH;CAGA,MAAA7B,mBAAA8B,OAAAE,KAAAA,IAAA,CAAoBnC,WAApBiC;CAiBA,MAAAG,gBAAsBtE,SAAQuE,MAAO3C,SAAS;AAC9C,KAAI0C,kBAAkB,KAAKA,kBAAkB,GAAC;AAC1C,MAAIA,kBAAkB,EAClB,OAAM,IAAIE,MAAMd,iBAAiB,yBAAyB;AAE9De,UAAOC,MAAO,GAAGhB,eAAc,YAAaY,cAAa,YAAa;;CAGtEK,IAAAA;AACJ,KAAIL,gBAAgB,EAChBK,WAAW/C,SAAyB;CAGxC,MAAA,CAAAgD,QAAAC,aAA4BlE,SAAkBwB,iBAAA,MAAuB;CACrE,MAAA,CAAA2C,WAAAC,gBAAkCpE,SAAkB,CAACwB,cAAc;CACnE,MAAA,CAAA6C,iBAAAC,sBAA8CtE,SAA2B,KAAK;CAC9E,MAAAuE,kBAAwBxE,OAAgC,KAAK;CAC7D,MAAAyE,kBAAwBzE,OAAyB,KAAK;CACtD,MAAA0E,oBAA0B1E,OAAyB,KAAK;CACxD,MAAA2E,wBAA8B3E,OAA6B,QAAQ;CACnE,MAAA4E,iCAAuC5E,OAAyB,KAAK;CACrE,MAAA6E,uBAA6B7E,OAAe,GAAG;CAC/C,MAAA8E,uBAA6B9E,OAA6B,KAAK;CAE/D,MAAA+E,iBAAuB/E,OAAOgB,YAAY;CAC1C,MAAAgE,gBAAsBhF,OAAOiB,WAAW;CACxC,MAAAgE,cAAoBjF,OAAOwB,SAAS;CACpC,MAAA0D,YAAkBlF,OAAOkE,OAAO;CAChC,MAAAiB,eAAqBnF,OAAOoE,UAAU;CACtC,MAAAgB,sBAA4BpF,OAAO2B,iBAAiB;CACpD,MAAA0D,aAAmBrF,OAAOkC,QAAQ;CAClC,MAAAoD,YAAkBtF,OAAOqC,OAAO;CAChC,MAAAkD,kBAAwBvF,OAAOsC,aAAa;CAC5C,MAAAkD,WAAiBxF,OAAOc,MAAM;CAAC,IAAA2E;CAAA,IAAAC;AAAA,KAAArC,EAAA,OAAArC,eAAAqC,EAAA,OAAApC,cAAAoC,EAAA,OAAA7B,YAAA6B,EAAA,OAAAa,UAAAb,EAAA,OAAAe,aAAAf,EAAA,OAAA1B,oBAAA0B,EAAA,OAAAnB,WAAAmB,EAAA,OAAAhB,UAAAgB,EAAA,OAAAf,gBAAAe,EAAA,OAAAvC,OAAA;AAErB2E,aAAA;AACNV,kBAAcY,UAAW3E;AACzBgE,iBAAaW,UAAW1E;AACxBgE,eAAWU,UAAWnE;AACtB0D,aAASS,UAAWzB;AACpBiB,gBAAYQ,UAAWvB;AACvBgB,uBAAmBO,UAAWhE;AAC9B0D,cAAUM,UAAWzD;AACrBoD,aAASK,UAAWtD;AACpBkD,mBAAeI,UAAWrD;AAC1BkD,YAAQG,UAAW7E;;AACpB4E,OAAA;GACC1E;GACAC;GACAO;GACA0C;GACAE;GACAzC;GACAO;GACAG;GACAC;GACAxB;GACH;AAAAuC,IAAA,KAAArC;AAAAqC,IAAA,KAAApC;AAAAoC,IAAA,KAAA7B;AAAA6B,IAAA,KAAAa;AAAAb,IAAA,KAAAe;AAAAf,IAAA,KAAA1B;AAAA0B,IAAA,KAAAnB;AAAAmB,IAAA,KAAAhB;AAAAgB,IAAA,KAAAf;AAAAe,IAAA,KAAAvC;AAAAuC,IAAA,MAAAoC;AAAApC,IAAA,MAAAqC;QAAA;AAAAD,OAAApC,EAAA;AAAAqC,OAAArC,EAAA;;AAtBDtD,WAAU0F,IAWPC,GAWD;CAEF,MAAAE,eAAqB5F,OAAO,MAAM;CAAC,IAAA6F;CAAA,IAAAC;AAAA,KAAAzC,EAAA,QAAAa,QAAA;AAEzB2B,aAAA;AACN,OAAI,CAACD,aAAYD,SAAQ;AACrBC,iBAAYD,UAAW;AAEvB,QAAIT,UAASS,WAAYL,UAASK,QAC9BL,WAASK,SAAU;AACtB;;AAIL,OAAIzB,UAAUoB,UAASK,QACnBL,WAASK,SAAU;YACZ,CAACzB,UAAUmB,WAAUM,QAC5BN,YAAUM,SAAU;;AAEzBG,OAAA,CAAC5B,OAAO;AAAAb,IAAA,MAAAa;AAAAb,IAAA,MAAAwC;AAAAxC,IAAA,MAAAyC;QAAA;AAAAD,OAAAxC,EAAA;AAAAyC,OAAAzC,EAAA;;AAfXtD,WAAU8F,IAePC,GAAS;CAAA,IAAAC;AAAA,KAAA1C,EAAA,QAAA2C,OAAAC,IAAA,4BAAA,EAAA;AAEUF,aAAA;AAClB5B,aAAU,MAAM;AAChBE,gBAAa,MAAM;AACnBS,wBAAoBa,UAAW;AAC/B,OAAIlB,gBAAekB,WAAY,MAAI;AAC/BO,iBAAazB,gBAAekB,QAAS;AACrClB,oBAAekB,UAAW;;;AAEjCtC,IAAA,MAAA0C;OAAAA,MAAA1C,EAAA;CARD,MAAA8C,gBAAsBJ;CAQpB,IAAAK;AAAA,KAAA/C,EAAA,QAAAiB,iBAAA;AAEuB8B,QAAA1F,UAAA;AACrB,OAAIwE,UAASS,WAAT,CAAsBP,oBAAmBO,QAGzClB,iBAAekB,UAAW5C,WAAWoD,eAAe,GAA7B;AAG3B,OAAI,CAAClB,YAAWU,QAAQ;GAExB,MAAAnF,UAAgBL,qBAAqBmE,gBAAgB;AACrD,OAAI,CAAC9D,WAAD,CAAauE,eAAcY,SAAQ;AAEnC,QAAI,CAACX,cAAaW,QAAQ;AAE1B,QAAInB,gBAAemB,SAAe7E,MAAA;;GAGtC,IAAAuF,YAAgB7F,SAAO8F,aAAP;AAChB,OAAI9B,gBAAemB,SAAQ;AACvB,QAAI,CAACnF,QACD6F,aAAY7B,gBAAemB,QAAQ7E;QAEnC0D,iBAAemB,QAAQ7E,QAASuF;AAGpC,QACI7B,gBAAemB,YACfnB,gBAAemB,QAAQY,cAAcC,cAErChC,iBAAemB,QAAQc,MAAO;;GAItC,MAAAC,YAAkBlG,SAAOmG,QAAkBC,YAAzBP;AAElB,OAAIb,SAAQG,WAAYH,SAAQG,YAAae,UAAS;AAItD,OAAIlG,SAAO;IACP,MAAAqG,cAAoBnG,MAAKoG;AAEzB,QAAItG,QAAOuG,QAAS9D,mBAAmB;SAE/BzC,YAAYqG,eAAZ,CAA4BrG,QAAOwG,SAAUH,YAAY,CACzDrG,SAAOyG,OAAQ;WAClB;KAGD,MAAAC,oBAA0B1G,QAAO2G,iBAAkBlE,mBAAmB;AACtE,SAAIiE,kBAAiBE,WAAY,GAAC;MAC9B,MAAAC,mBAAyBH,kBAAiB;AAC1C,UACIG,qBAAqBR,eAArB,CACCQ,iBAAgBL,SAAUH,YAAY,CAEvCQ,kBAAgBJ,OAAQ;;;;AAMxC1B,mBAAeI,UAAW;IAAAnF;IAAAE;IAAAG,OAGfwF;IAASvF,OACT4F;IACV,CAAC;;AACLrD,IAAA,MAAAiB;AAAAjB,IAAA,MAAA+C;OAAAA,MAAA/C,EAAA;CApED,MAAAiE,mBAAyBlB;CAoEvB,IAAAmB;AAAA,KAAAlE,EAAA,QAAA2C,OAAAC,IAAA,4BAAA,EAAA;AAEsBsB,SAAAC,QAAA;GAAC,MAAA,EAAA7E,SAAAC,YAAA4E;AACrB7C,yBAAqBgB,UAAW;GAChC,MAAA8B,kBAAwB3C,qBAAoBa;AAC5C,OAAI,CAAC8B,gBAAe;AACpB,OACIC,KAAIC,IAAKF,gBAAe9E,UAAWA,QAAQ,GAAG,MAC9C+E,KAAIC,IAAKF,gBAAe7E,UAAWA,QAAQ,GAAG,GAAE;AAIpDyB,gBAAa,MAAM;;AACtBhB,IAAA,MAAAkE;OAAAA,OAAAlE,EAAA;CAXD,MAAAuE,kBAAwBL;CAWtB,IAAAC;AAAA,KAAAnE,EAAA,QAAAiB,mBAAAjB,EAAA,QAAAtB,cAAA;AAEsByF,SAAAK,YAAA;AACpB,OAAI,CAAC5C,YAAWU,QAAQ;AAGxB,OAAIhB,sBAAqBgB,YAAa,QAAO;AAG7C,OAAI,CAACrB,gBAAe;GAEpB,MAAAwD,eAAqB1H,gBAAgBkE,gBAAgB;AACrD,OAAI,CAACwD,aAAY;GAEjB,MAAAC,gBAAoBrH,QAAKoG;GAEzB,MAAAoB,YADarB,cAAWoB,QAAS5H,cAAc,IAC/B0H;AAChB,QAAK,MAAAI,eAAqBL,aACtB,KAAIK,gBAAgB3H,WAAO;AACvBF,kBAAc;KAAAgE;KAAA9D,SAAmBA;KAAOE,OAAEA;KAAKqB;KAAgB,CAAC;AAAA;;;AAI3EsB,IAAA,MAAAiB;AAAAjB,IAAA,MAAAtB;AAAAsB,IAAA,MAAAmE;OAAAA,OAAAnE,EAAA;CArBD,MAAA+E,kBAAwBZ;CAqBtB,IAAAa;AAAA,KAAAhF,EAAA,QAAAiB,iBAAA;AAEqB+D,SAAAC,YAAA;AACnB,OAAI,CAACrD,YAAWU,QAAQ;GACxB,MAAA4C,aAAmBpI,qBAAqBmE,gBAAgB;AACxD,OAAI,CAACiE,WAAU;GACf,MAAAC,qBAA2B9H,QAAK+H;AAChC,OAAIF,eAAe7H,QAAKoG,UAAWyB,WAAUvB,SAAUwB,mBAAmB,CAAA;AAI1E,UAAOD,WAAU5B,QAAQ+B;;AAC5BrF,IAAA,MAAAiB;AAAAjB,IAAA,MAAAgF;OAAAA,OAAAhF,EAAA;CAVD,MAAAsF,iBAAuBN;CAUrB,IAAAO;AAAA,KAAAvF,EAAA,QAAAlB,aAAA;AAEsByG,SAAAC,YAAA;AACpB,OAAI1G,YAAaA,aAAYzB,QAAM;AACnC,OAAIwE,UAASS,QAAQ;AAErBxB,aAAU,KAAK;AACfE,gBAAa,KAAK;AAClBS,wBAAoBa,UAAW;IAAAhD,SAClBjC,QAAKiC;IAAQC,SACblC,QAAKkC;IAFU;AAI5B8B,qBAAiBiB,UAAW5C,iBAAW;AACnCsB,iBAAa,MAAM;AACnBK,sBAAiBiB,UAAW;MAC7B,IAHsB;;AAI5BtC,IAAA,MAAAlB;AAAAkB,IAAA,MAAAuF;OAAAA,OAAAvF,EAAA;CAdD,MAAAyF,kBAAwBF;CActB,IAAAG;AAAA,KAAA1F,EAAA,QAAAiE,oBAAAjE,EAAA,QAAAjB,WAAA;AAEoB2G,SAAAC,YAAA;AAClB,OAAI5G,UAAWA,WAAU1B,QAAM;AAE/B,OACIyE,aAAYQ,WAAZ,CACCT,UAASS,WACVlB,gBAAekB,WAAY,KAAI;GAKnC,MAAAsD,gBAAoBvI,QAAKoG;AAEzB,OAAI,CAACD,cAAWoB,QAAS,oBAAoB,EAAA;AAEzC,QACI,CAAC9C,aAAYQ,WACbnB,gBAAemB,YAAakB,cAAWN,cAAcC,cAErDL,gBAAe;AAClB;;AAKL,OAAI,CAAClB,YAAWU,QAAQ;AAExB2B,oBAAiB5G,QAAM;;AAC1B2C,IAAA,MAAAiE;AAAAjE,IAAA,MAAAjB;AAAAiB,IAAA,MAAA0F;OAAAA,OAAA1F,EAAA;CA5BD,MAAA6F,gBAAsBH;CA4BpB,IAAAI;AAAA,KAAA9F,EAAA,QAAAiB,mBAAAjB,EAAA,QAAAiE,oBAAAjE,EAAA,QAAAtB,cAAA;AAEoBoH,SAAAC,YAAA;GAClB,MAAA,EAAAC,QAAAC,SAAAC,KAAAC,YAA0C9I;GAC1C,MAAA+I,gBAAoB/I,QAAKoG;AACzB,OAAI,CAACxC,gBAAe;GAEpB,MAAAoF,uBAAuB;AACnBhJ,YAAKiJ,iBAAkB;AACvBjJ,YAAKkJ,gBAAiB;AACtBjF,0BAAqBgB,UAAW;;GAGpC,MAAAkE,2BAAiCvF,gBAAe0C,SAAUH,cAAY;AAEtE,OAAI,CAAC3B,UAASS,SAAQ;AAElB,QAAI,CAACkE,yBAAwB;AAE7B,QACIN,QAAQ,OACRA,QAAQ,WACPtE,YAAWU,YAAa4D,QAAQ,aAAaA,QAAQ,cAAa;AAEnEG,qBAAgB;AAChBvF,eAAU,KAAK;;AAClB;;GAIL,MAAA2F,yBAA+B1K,2BAA2BsB,QAAM;AAGhE,OAAIuE,YAAWU,WAAX,CAAwBmE,wBAAsB;IAC9C,IAAAC,sBAA0B,CAACT,WAAD,CAAaE,WAAW,gBAAeQ,KAAMT,IAAI;AAG3E,QAAI,CAACQ,uBAAuBlF,qBAAoBc,QAC5CoE,uBAAsBR,QAAQ,OAAOA,QAAQ;AAGjD,QAAIQ,qBAAmB;AACnBL,qBAAgB;AAChB,SAAIH,QAAQ,YACR1E,sBAAoBc,UAAWd,qBAAoBc,QAAQsE,MACvD,GACA,GAFwB;SAK5BpF,sBAAoBc,UAApBd,qBAAoBc,UAAY4D;AAGpCjJ,mBAAc;MAAAgE;MAAA5D,OAEVA;MAAKwJ,cAGSnF,eAAcY;MAAQ5D;MAAAoI,MAE9BtF,qBAAoBc;MAC7B,CAAC;AAEF,SAAIf,+BAA8Be,WAAY,KAC1CO,cAAatB,+BAA8Be,QAAS;AAGxDf,oCAA8Be,UAAW5C,iBAAW;AAChD8B,2BAAoBc,UAAW;AAC/Bf,qCAA8Be,UAAW;QAC1C,KAHmC;AAAA;;;AAU9C,OAAI4D,QAAQ,WAAYA,QAAQ,OAAR,CAAgB/E,gBAAemB,SAAS;AAC5D+D,oBAAgB;AAChBpC,qBAAiB5G,QAAM;AAAA;;AAK3B,OACI6I,QAAQ,YACPM,4BAA4BN,QAAQ,OAApC,CAA4CtE,YAAWU,SAAS;AAGjE,QAAIV,YAAWU,WAAX,CAAwBmE,uBACxB3D,gBAAe;AAClB;;AAKL,OAAIlB,YAAWU,SAAQ;AACnB,QAAI4D,QAAQ,WAAS;AACjBG,qBAAgB;AAChB,SAAIL,UAAAG,QACAlJ,eAAc;MAAAgE;MAAA5D,OAAmBA;MAAK0J,OAAS;MAACrI;MAAgB,CAAC;SAEjEzB,eAAc;MAAAgE;MAAA5D,OAEVA;MAAK2J,aACQ;MAAEtI;MAElB,CAAC;AACL;;AAGL,QAAIwH,QAAQ,aAAW;AACnBG,qBAAgB;AAChB,SAAIL,UAAAG,QAEAlJ,eAAc;MAAAgE;MAAA5D,OAAmBA;MAAK0J,OAAS;MAAErI;MAAgB,CAAC;SAElEzB,eAAc;MAAAgE;MAAA5D,OAEVA;MAAK2J,aACQ;MAACtI;MAEjB,CAAC;AACL;;;;AAIZsB,IAAA,MAAAiB;AAAAjB,IAAA,MAAAiE;AAAAjE,IAAA,MAAAtB;AAAAsB,IAAA,MAAA8F;OAAAA,OAAA9F,EAAA;CA5HD,MAAAiH,gBAAsBnB;CA4HpB,IAAAoB;AAAA,KAAAlH,EAAA,QAAAiH,eAAA;AAEgBC,QAAA;GAAAC,0BAA4B;GAAKC,WAAaH;GAAe;AAAAjH,IAAA,MAAAiH;AAAAjH,IAAA,MAAAkH;OAAAA,OAAAlH,EAAA;AAA/ElE,mBAAkBoL,IAA8D;CAAA,IAAAG;AAAA,KAAArH,EAAA,QAAA5B,iBAAA4B,EAAA,QAAAtB,cAAA;AAE9D2I,SAAAC,QAAA;AACdpG,sBAAmBoG,IAAI;AACvB,OAAI,CAACA,IAAG;GAER,MAAA,EAAApE,kBAA0BoE;GAC1B,IAAAC,eAAmBpG,gBAAemB;AAElC,OAAI,CAACiF,gBAAgBD,IAAGE,mBAAkB;AACtC,QAAIF,IAAGE,kBAAkB9D,QAAS7D,oBAAoB,CAClD0H,gBAAeD,IAAGE;QAElBD,gBAAeD,IAAGE,kBAAkBE,cAAe7H,oBAAoB;AAE3EsB,oBAAemB,UAAWiF;;GAG9B,MAAAI,yBAA8BC,QAAA;IAAC,MAAA,EAAAnE,WAAAmE;IAC3B,MAAAC,gBAAoBpE;AACpB,QAAI,CAAC6D,IAAG3D,SAAUH,cAAY,CAE1BV,gBAAe;;GAIvB,MAAAgF,uBAA4BC,QAAA;IAAC,MAAA,EAAAtE,QAAAuE,aAAAD;AACzB,QAAI,CAAClG,UAASS,WAAYlB,gBAAekB,WAAY,KAAI;AAGzD,QAAIR,aAAYQ,SAAQ;AACpBtB,kBAAa,MAAM;AACnB,SAAIK,kBAAiBiB,WAAY,MAAI;AACjCO,mBAAaxB,kBAAiBiB,QAAS;AACvCjB,wBAAiBiB,UAAW;;AAC/B;;IAIL,MAAA2F,gBAAoBxE;AAEpB,QAAI,CAAC6D,IAAG3D,SAAUH,cAAY,CAC1BV,gBAAe;;GAKvB,MAAAoF,uBAA4BC,QAAA;IAAC,MAAA,EAAA1E,QAAA2E,aAAAD;AACzB,QAAI,CAACtG,UAASS,QAAQ;IAEtB,MAAA+F,gBAAoB5E;AAEpB,QAAI6D,IAAG3D,SAAUH,cAAyC,IAAzBA,cAAWG,SAAU2D,IAAI,CAAA;AAI1DxE,mBAAe;;AAGnBwF,YAAQC,iBAAkB,WAAWL,oBAAoB;AACzDI,YAAQC,iBAAkB,aAAaZ,sBAAsB;AAC7DW,YAAQC,iBAAkB,WAAWT,oBAAoB;AAEzD,OAAI5E,kBAAkBoF,UAAQ;AAC1BpF,kBAAaqF,iBAAkB,WAAWL,oBAAoB;AAC9DhF,kBAAaqF,iBAAkB,aAAaZ,sBAAsB;AAClEzE,kBAAaqF,iBAAkB,WAAWT,oBAAoB;;AAIlE,OAAI1J,cACAkJ,KAAGkB,OAAQ;GAGf,MAAAC,eAAoBC,YAAA;AAChB,QAAI,CAAC7G,UAASS,QAAUxB,WAAU,KAAK;IAEvC,MAAA6H,QAActL,QAAKoG;IACnB,MAAAmF,aAAmBpH,qBAAoBc,QAAQyB,SAAU4E,MAAKlL,MAAMsG;AACpEvC,yBAAoBc,UAAWqG,MAAKlL;AAGpC,QAAImL,cAAcD,MAAKlL,MAAMsG,UAAWjH,qBAAqBwK,IAAI,CAAA;AAIjErK,kBAAc;KAAAgE,iBACOqG;KAAGjK,OACpBA;KAAKwJ,cAGSnF,eAAcY;KAAQ5D;KAAAoI,MAE9BtF,qBAAoBc;KAC7B,CAAC;;AAGN,OAAIiF,aACAA,cAAYgB,iBAAkB,SAASE,YAAY;AACtD,gBAEM;AACHH,aAAQO,oBAAqB,WAAWX,oBAAoB;AAC5DI,aAAQO,oBAAqB,aAAalB,sBAAsB;AAChEW,aAAQO,oBAAqB,WAAWf,oBAAoB;AAE5D,QAAI5E,kBAAkBoF,UAAQ;AAC1BpF,mBAAa2F,oBAAqB,WAAWX,oBAAoB;AACjEhF,mBAAa2F,oBAAqB,aAAalB,sBAAsB;AACrEzE,mBAAa2F,oBAAqB,WAAWf,oBAAoB;;AAGrE,QAAIP,aACAA,cAAYsB,oBAAqB,SAASJ,YAAY;;;AAGjEzI,IAAA,MAAA5B;AAAA4B,IAAA,MAAAtB;AAAAsB,IAAA,MAAAqH;OAAAA,OAAArH,EAAA;CAlHD,MAAA8I,YAAkBzB;AAoHlB,KAAI,CAACjL,eAAewE,QAAQ,CACxB,KAAIvC,cAAY;EAKU,MAAAuJ,MAAAnK,SAAA;EAAW,IAAAsK;AAAA,MAAA/H,EAAA,QAAA2C,OAAAC,IAAA,4BAAA,EAAA;AAGhBmF,eAAMjH,UAAU,KAAK;AAAAd,KAAA,MAAA+H;QAAAA,OAAA/H,EAAA;EAAA,IAAAmI;AAAA,MAAAnI,EAAA,QAAA/B,YAAA+B,EAAA,QAAAvB,QAAAuB,EAAA,QAAAd,eAAAc,EAAA,QAAA4H,OAAA5H,EAAA,QAAAZ,UAAA;AANlC+I,SAAA,oBAAA,SAAA;IACiB,cAAA;IACH,WAAA;IACI,cAAAP;IACJ3J;IACJQ;IACG,SAAAsJ;IACI7I;IACRiC,KAAAA;IACK/B;IACL,MAAA;IACP,CAAA;AAAAY,KAAA,MAAA/B;AAAA+B,KAAA,MAAAvB;AAAAuB,KAAA,MAAAd;AAAAc,KAAA,MAAA4H;AAAA5H,KAAA,MAAAZ;AAAAY,KAAA,MAAAmI;QAAAA,OAAAnI,EAAA;AAZNY,YACIA;QADG;EAAA,IAAAgH;AAAA,MAAA5H,EAAA,QAAAY,SAAA;AAgBHgH,SAAA,oBAAA,UAAA;IAAkB,WAAA;IAAgC,UAAA;IAAQ,MAAA;cACrDhH;IACI,CAAA;AAAAZ,KAAA,MAAAY;AAAAZ,KAAA,MAAA4H;QAAAA,OAAA5H,EAAA;AAHbY,YACIA;;AAOZ,KAAIpD,SAAS,MAAI;EAAA,IAAAoK;AAAA,MAAA5H,EAAA,QAAAxC,OAAA;AAGLoK,SAAA,oBAAA,OAAA;IAAe,WAAA;cAA0BpK;IAAY,CAAA;AAAAwC,KAAA,MAAAxC;AAAAwC,KAAA,MAAA4H;QAAAA,OAAA5H,EAAA;EAAA,IAAA+H;AAAA,MAAA/H,EAAA,QAAA4H,OAAA5H,EAAA,QAAAY,SAAA;AADzDmH,SAAA,qBAAA,SAAA;IAAiB,WAAA;cAAjB,CACIH,KACChH,QACG;;AAAAZ,KAAA,MAAA4H;AAAA5H,KAAA,MAAAY;AAAAZ,KAAA,MAAA+H;QAAAA,OAAA/H,EAAA;AAJZY,YACIA;;CAKP,IAAAgH;AAAA,KAAA5H,EAAA,QAAAzB,eAAA;AAIOqJ,QAAArJ,iBAAiB,QAAQA,gBAAgB,IAAzC,EAAA,2BAC+B,GAAGA,cAAa,KACzC,GAFN;AAEMyB,IAAA,MAAAzB;AAAAyB,IAAA,MAAA4H;OAAAA,OAAA5H,EAAA;CAAA,IAAA+H;AAAA,KAAA/H,EAAA,QAAAxB,cAAA;AACNuJ,QAAAvJ,gBAAgB,QAAQA,eAAe,IAAvC,EAAA,0BAC8B,GAAGA,aAAY,KACvC,GAFN;AAEMwB,IAAA,MAAAxB;AAAAwB,IAAA,MAAA+H;OAAAA,OAAA/H,EAAA;CAAA,IAAAmI;AAAA,KAAAnI,EAAA,QAAAK,kBAAAL,EAAA,QAAA4H,OAAA5H,EAAA,QAAA+H,KAAA;AAPAI,QAAA;GAAA,GACP9H;GAAc,GACbuH;GAEM,GACNG;GAGP;AAAA/H,IAAA,MAAAK;AAAAL,IAAA,MAAA4H;AAAA5H,IAAA,MAAA+H;AAAA/H,IAAA,MAAAmI;OAAAA,OAAAnI,EAAA;CARD,MAAAb,QAAcgJ;CAQZ,IAAAY;AAAA,KAAA/I,EAAA,QAAA2C,OAAAC,IAAA,4BAAA,EAAA;AAIMmG,QAAA,oBAAA,SAAA;GAAY,MAAA;GAAuC,YAAA;aAC9ClM;GACG,CAAA;AAAAmD,IAAA,MAAA+I;OAAAA,OAAA/I,EAAA;CAAA,IAAAgJ;AAAA,KAAAhJ,EAAA,QAAAhC,aAAAgC,EAAA,QAAA/B,YAAA+B,EAAA,QAAAa,UAAAb,EAAA,QAAA3B,cAAA;AAEO2K,QAAAhN,KAAK,eAAegC,WAAW;GAAAC;GAAA,WAE3B4C;GAAM,iBACAxC;GACpB,CAAC;AAAA2B,IAAA,MAAAhC;AAAAgC,IAAA,MAAA/B;AAAA+B,IAAA,MAAAa;AAAAb,IAAA,MAAA3B;AAAA2B,IAAA,MAAAgJ;OAAAA,OAAAhJ,EAAA;CAAA,IAAAiJ;AAAA,KAAAjJ,EAAA,QAAAnC,YAAAmC,EAAA,QAAAO,iBAAAP,EAAA,QAAA7B,YAAA6B,EAAA,QAAAa,QAAA;AAYDoI,QAAApI,SACG,oBAAA,OAAA;GACe,WAAA7E,KAAK,oBAAoB,EAAA,aACnBmC,UAChB,CAAA;aAED,oBAAA,OAAA;IAAe,WAAA;cACVoC,gBAAgB,IACV1C,SAAyB,KAD/BA;IAIT,CAAA;GACI,CAAA,GAZP;AAYOmC,IAAA,MAAAnC;AAAAmC,IAAA,MAAAO;AAAAP,IAAA,MAAA7B;AAAA6B,IAAA,MAAAa;AAAAb,IAAA,MAAAiJ;OAAAA,OAAAjJ,EAAA;CAAA,IAAAkJ;AAAA,KAAAlJ,EAAA,QAAAyF,mBAAAzF,EAAA,QAAAsF,kBAAAtF,EAAA,QAAA+E,mBAAA/E,EAAA,QAAA6F,iBAAA7F,EAAA,QAAA8I,aAAA9I,EAAA,QAAApB,WAAAoB,EAAA,QAAAb,SAAAa,EAAA,QAAAgJ,OAAAhJ,EAAA,QAAAiJ,OAAAjJ,EAAA,QAAAY,SAAA;AAjChBsI,QAAA,qBAAC,UAAD,EAAA,UAAA,CACIH,KAGA,qBAAA,OAAA;GACe,WAAAC;GAKFpK;GACI6G,aAAAA;GACAlB,aAAAA;GACDe,YAAAA;GACCP,aAAAA;GACFc,WAAAA;GACNiD,KAAAA;GACE3J;aAbX,CAeKyB,SAEAqI,IAcT;KAAW,EAAA,CAAA;AAAAjJ,IAAA,MAAAyF;AAAAzF,IAAA,MAAAsF;AAAAtF,IAAA,MAAA+E;AAAA/E,IAAA,MAAA6F;AAAA7F,IAAA,MAAA8I;AAAA9I,IAAA,MAAApB;AAAAoB,IAAA,MAAAb;AAAAa,IAAA,MAAAgJ;AAAAhJ,IAAA,MAAAiJ;AAAAjJ,IAAA,MAAAY;AAAAZ,IAAA,MAAAkJ;OAAAA,OAAAlJ,EAAA;AAAA,QAnCXkJ"}
|
package/package.json
CHANGED
|
@@ -1,46 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acusti/dropdown",
|
|
3
|
-
"version": "0.55.
|
|
4
|
-
"type": "module",
|
|
5
|
-
"sideEffects": false,
|
|
6
|
-
"exports": "./dist/Dropdown.js",
|
|
7
|
-
"main": "./dist/Dropdown.js",
|
|
8
|
-
"types": "./dist/Dropdown.d.ts",
|
|
9
|
-
"files": [
|
|
10
|
-
"dist"
|
|
11
|
-
],
|
|
3
|
+
"version": "0.55.1",
|
|
12
4
|
"description": "React component that renders a dropdown with a trigger and supports searching, keyboard access, and more",
|
|
13
5
|
"keywords": [
|
|
14
|
-
"react",
|
|
15
|
-
"react-component",
|
|
16
|
-
"dropdown",
|
|
17
|
-
"menu",
|
|
18
|
-
"combobox",
|
|
19
|
-
"search",
|
|
20
|
-
"typeahead",
|
|
21
6
|
"a11y",
|
|
22
7
|
"accessibility",
|
|
8
|
+
"combobox",
|
|
9
|
+
"dropdown",
|
|
23
10
|
"key-navigation",
|
|
11
|
+
"menu",
|
|
12
|
+
"react",
|
|
13
|
+
"react-component",
|
|
14
|
+
"search",
|
|
24
15
|
"ssr",
|
|
25
|
-
"
|
|
26
|
-
"
|
|
16
|
+
"ts",
|
|
17
|
+
"typeahead",
|
|
18
|
+
"typescript"
|
|
27
19
|
],
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
"tsc": "tsc --noEmit"
|
|
20
|
+
"homepage": "https://github.com/acusti/uikit/tree/main/packages/dropdown#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/acusti/uikit/issues"
|
|
32
23
|
},
|
|
24
|
+
"license": "Unlicense",
|
|
25
|
+
"author": "andrew patton <andrew@acusti.ca> (https://www.acusti.ca)",
|
|
33
26
|
"repository": {
|
|
34
27
|
"type": "git",
|
|
35
28
|
"url": "https://github.com/acusti/uikit.git",
|
|
36
29
|
"directory": "packages/dropdown"
|
|
37
30
|
},
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"type": "module",
|
|
35
|
+
"sideEffects": false,
|
|
36
|
+
"main": "./dist/Dropdown.js",
|
|
37
|
+
"types": "./dist/Dropdown.d.ts",
|
|
38
|
+
"exports": "./dist/Dropdown.js",
|
|
39
|
+
"scripts": {
|
|
40
|
+
"test": "vitest",
|
|
41
|
+
"build": "vite build",
|
|
42
|
+
"tsc": "tsc --noEmit"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@acusti/matchmaking": "^0.10.0",
|
|
46
|
+
"@acusti/use-keyboard-events": "^0.11.0",
|
|
47
|
+
"clsx": "^2"
|
|
42
48
|
},
|
|
43
|
-
"homepage": "https://github.com/acusti/uikit/tree/main/packages/dropdown#readme",
|
|
44
49
|
"devDependencies": {
|
|
45
50
|
"@testing-library/dom": "^10.4.1",
|
|
46
51
|
"@testing-library/react": "^16.3.2",
|
|
@@ -56,11 +61,6 @@
|
|
|
56
61
|
"vite": "^8.0.0-0",
|
|
57
62
|
"vitest": "^4"
|
|
58
63
|
},
|
|
59
|
-
"dependencies": {
|
|
60
|
-
"@acusti/matchmaking": "^0.10.0",
|
|
61
|
-
"@acusti/use-keyboard-events": "^0.11.0",
|
|
62
|
-
"clsx": "^2"
|
|
63
|
-
},
|
|
64
64
|
"peerDependencies": {
|
|
65
65
|
"react": "^19 || ~0.0.0-experimental < 0.0.0-f",
|
|
66
66
|
"react-dom": "^19 || ~0.0.0-experimental < 0.0.0-f"
|