PluginProbe
Gutenberg / 23.6.0
Gutenberg v23.6.0
23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 7.4.0 All 402 releases
gutenberg / build / widgets / events / render.js

render.js in Gutenberg 23.6.0, at build/widgets/events/render.js

27,644 lines 964.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 var __create = Object.create;
2 var __defProp = Object.defineProperty;
3 var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4 var __getOwnPropNames = Object.getOwnPropertyNames;
5 var __getProtoOf = Object.getPrototypeOf;
6 var __hasOwnProp = Object.prototype.hasOwnProperty;
7 var __commonJS = (cb, mod) => function __require() {
8 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9 };
10 var __export = (target, all) => {
11 for (var name in all)
12 __defProp(target, name, { get: all[name], enumerable: true });
13 };
14 var __copyProps = (to, from, except, desc) => {
15 if (from && typeof from === "object" || typeof from === "function") {
16 for (let key of __getOwnPropNames(from))
17 if (!__hasOwnProp.call(to, key) && key !== except)
18 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19 }
20 return to;
21 };
22 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23 // If the importer is in node compatibility mode or this is not an ESM
24 // file that has been converted to a CommonJS file using a Babel-
25 // compatible transform (i.e. "__esModule" has not been set), then set
26 // "default" to the CommonJS "module.exports" for node compatibility.
27 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28 mod
29 ));
30
31 // package-external:@wordpress/element
32 var require_element = __commonJS({
33 "package-external:@wordpress/element"(exports, module) {
34 module.exports = window.wp.element;
35 }
36 });
37
38 // package-external:@wordpress/data
39 var require_data = __commonJS({
40 "package-external:@wordpress/data"(exports, module) {
41 module.exports = window.wp.data;
42 }
43 });
44
45 // package-external:@wordpress/core-data
46 var require_core_data = __commonJS({
47 "package-external:@wordpress/core-data"(exports, module) {
48 module.exports = window.wp.coreData;
49 }
50 });
51
52 // package-external:@wordpress/components
53 var require_components = __commonJS({
54 "package-external:@wordpress/components"(exports, module) {
55 module.exports = window.wp.components;
56 }
57 });
58
59 // package-external:@wordpress/i18n
60 var require_i18n = __commonJS({
61 "package-external:@wordpress/i18n"(exports, module) {
62 module.exports = window.wp.i18n;
63 }
64 });
65
66 // package-external:@wordpress/primitives
67 var require_primitives = __commonJS({
68 "package-external:@wordpress/primitives"(exports, module) {
69 module.exports = window.wp.primitives;
70 }
71 });
72
73 // vendor-external:react/jsx-runtime
74 var require_jsx_runtime = __commonJS({
75 "vendor-external:react/jsx-runtime"(exports, module) {
76 module.exports = window.ReactJSXRuntime;
77 }
78 });
79
80 // vendor-external:react
81 var require_react = __commonJS({
82 "vendor-external:react"(exports, module) {
83 module.exports = window.React;
84 }
85 });
86
87 // vendor-external:react-dom
88 var require_react_dom = __commonJS({
89 "vendor-external:react-dom"(exports, module) {
90 module.exports = window.ReactDOM;
91 }
92 });
93
94 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js
95 var require_use_sync_external_store_shim_development = __commonJS({
96 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) {
97 "use strict";
98 (function() {
99 function is(x2, y2) {
100 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
101 }
102 function useSyncExternalStore$2(subscribe2, getSnapshot) {
103 didWarnOld18Alpha || void 0 === React49.startTransition || (didWarnOld18Alpha = true, console.error(
104 "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."
105 ));
106 var value = getSnapshot();
107 if (!didWarnUncachedGetSnapshot) {
108 var cachedValue = getSnapshot();
109 objectIs(value, cachedValue) || (console.error(
110 "The result of getSnapshot should be cached to avoid an infinite loop"
111 ), didWarnUncachedGetSnapshot = true);
112 }
113 cachedValue = useState38({
114 inst: { value, getSnapshot }
115 });
116 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1];
117 useLayoutEffect5(
118 function() {
119 inst.value = value;
120 inst.getSnapshot = getSnapshot;
121 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
122 },
123 [subscribe2, value, getSnapshot]
124 );
125 useEffect33(
126 function() {
127 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
128 return subscribe2(function() {
129 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
130 });
131 },
132 [subscribe2]
133 );
134 useDebugValue2(value);
135 return value;
136 }
137 function checkIfSnapshotChanged(inst) {
138 var latestGetSnapshot = inst.getSnapshot;
139 inst = inst.value;
140 try {
141 var nextValue = latestGetSnapshot();
142 return !objectIs(inst, nextValue);
143 } catch (error) {
144 return true;
145 }
146 }
147 function useSyncExternalStore$1(subscribe2, getSnapshot) {
148 return getSnapshot();
149 }
150 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
151 var React49 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState38 = React49.useState, useEffect33 = React49.useEffect, useLayoutEffect5 = React49.useLayoutEffect, useDebugValue2 = React49.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2;
152 exports.useSyncExternalStore = void 0 !== React49.useSyncExternalStore ? React49.useSyncExternalStore : shim;
153 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
154 })();
155 }
156 });
157
158 // node_modules/use-sync-external-store/shim/index.js
159 var require_shim = __commonJS({
160 "node_modules/use-sync-external-store/shim/index.js"(exports, module) {
161 "use strict";
162 if (false) {
163 module.exports = null;
164 } else {
165 module.exports = require_use_sync_external_store_shim_development();
166 }
167 }
168 });
169
170 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js
171 var require_with_selector_development = __commonJS({
172 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports) {
173 "use strict";
174 (function() {
175 function is(x2, y2) {
176 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
177 }
178 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
179 var React49 = require_react(), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore3 = shim.useSyncExternalStore, useRef48 = React49.useRef, useEffect33 = React49.useEffect, useMemo41 = React49.useMemo, useDebugValue2 = React49.useDebugValue;
180 exports.useSyncExternalStoreWithSelector = function(subscribe2, getSnapshot, getServerSnapshot, selector2, isEqual) {
181 var instRef = useRef48(null);
182 if (null === instRef.current) {
183 var inst = { hasValue: false, value: null };
184 instRef.current = inst;
185 } else inst = instRef.current;
186 instRef = useMemo41(
187 function() {
188 function memoizedSelector(nextSnapshot) {
189 if (!hasMemo) {
190 hasMemo = true;
191 memoizedSnapshot = nextSnapshot;
192 nextSnapshot = selector2(nextSnapshot);
193 if (void 0 !== isEqual && inst.hasValue) {
194 var currentSelection = inst.value;
195 if (isEqual(currentSelection, nextSnapshot))
196 return memoizedSelection = currentSelection;
197 }
198 return memoizedSelection = nextSnapshot;
199 }
200 currentSelection = memoizedSelection;
201 if (objectIs(memoizedSnapshot, nextSnapshot))
202 return currentSelection;
203 var nextSelection = selector2(nextSnapshot);
204 if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))
205 return memoizedSnapshot = nextSnapshot, currentSelection;
206 memoizedSnapshot = nextSnapshot;
207 return memoizedSelection = nextSelection;
208 }
209 var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot;
210 return [
211 function() {
212 return memoizedSelector(getSnapshot());
213 },
214 null === maybeGetServerSnapshot ? void 0 : function() {
215 return memoizedSelector(maybeGetServerSnapshot());
216 }
217 ];
218 },
219 [getSnapshot, getServerSnapshot, selector2, isEqual]
220 );
221 var value = useSyncExternalStore3(subscribe2, instRef[0], instRef[1]);
222 useEffect33(
223 function() {
224 inst.hasValue = true;
225 inst.value = value;
226 },
227 [value]
228 );
229 useDebugValue2(value);
230 return value;
231 };
232 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
233 })();
234 }
235 });
236
237 // node_modules/use-sync-external-store/shim/with-selector.js
238 var require_with_selector = __commonJS({
239 "node_modules/use-sync-external-store/shim/with-selector.js"(exports, module) {
240 "use strict";
241 if (false) {
242 module.exports = null;
243 } else {
244 module.exports = require_with_selector_development();
245 }
246 }
247 });
248
249 // package-external:@wordpress/compose
250 var require_compose = __commonJS({
251 "package-external:@wordpress/compose"(exports, module) {
252 module.exports = window.wp.compose;
253 }
254 });
255
256 // package-external:@wordpress/theme
257 var require_theme = __commonJS({
258 "package-external:@wordpress/theme"(exports, module) {
259 module.exports = window.wp.theme;
260 }
261 });
262
263 // package-external:@wordpress/private-apis
264 var require_private_apis = __commonJS({
265 "package-external:@wordpress/private-apis"(exports, module) {
266 module.exports = window.wp.privateApis;
267 }
268 });
269
270 // package-external:@wordpress/keycodes
271 var require_keycodes = __commonJS({
272 "package-external:@wordpress/keycodes"(exports, module) {
273 module.exports = window.wp.keycodes;
274 }
275 });
276
277 // node_modules/remove-accents/index.js
278 var require_remove_accents = __commonJS({
279 "node_modules/remove-accents/index.js"(exports, module) {
280 var characterMap = {
281 "\xC0": "A",
282 "\xC1": "A",
283 "\xC2": "A",
284 "\xC3": "A",
285 "\xC4": "A",
286 "\xC5": "A",
287 "\u1EA4": "A",
288 "\u1EAE": "A",
289 "\u1EB2": "A",
290 "\u1EB4": "A",
291 "\u1EB6": "A",
292 "\xC6": "AE",
293 "\u1EA6": "A",
294 "\u1EB0": "A",
295 "\u0202": "A",
296 "\u1EA2": "A",
297 "\u1EA0": "A",
298 "\u1EA8": "A",
299 "\u1EAA": "A",
300 "\u1EAC": "A",
301 "\xC7": "C",
302 "\u1E08": "C",
303 "\xC8": "E",
304 "\xC9": "E",
305 "\xCA": "E",
306 "\xCB": "E",
307 "\u1EBE": "E",
308 "\u1E16": "E",
309 "\u1EC0": "E",
310 "\u1E14": "E",
311 "\u1E1C": "E",
312 "\u0206": "E",
313 "\u1EBA": "E",
314 "\u1EBC": "E",
315 "\u1EB8": "E",
316 "\u1EC2": "E",
317 "\u1EC4": "E",
318 "\u1EC6": "E",
319 "\xCC": "I",
320 "\xCD": "I",
321 "\xCE": "I",
322 "\xCF": "I",
323 "\u1E2E": "I",
324 "\u020A": "I",
325 "\u1EC8": "I",
326 "\u1ECA": "I",
327 "\xD0": "D",
328 "\xD1": "N",
329 "\xD2": "O",
330 "\xD3": "O",
331 "\xD4": "O",
332 "\xD5": "O",
333 "\xD6": "O",
334 "\xD8": "O",
335 "\u1ED0": "O",
336 "\u1E4C": "O",
337 "\u1E52": "O",
338 "\u020E": "O",
339 "\u1ECE": "O",
340 "\u1ECC": "O",
341 "\u1ED4": "O",
342 "\u1ED6": "O",
343 "\u1ED8": "O",
344 "\u1EDC": "O",
345 "\u1EDE": "O",
346 "\u1EE0": "O",
347 "\u1EDA": "O",
348 "\u1EE2": "O",
349 "\xD9": "U",
350 "\xDA": "U",
351 "\xDB": "U",
352 "\xDC": "U",
353 "\u1EE6": "U",
354 "\u1EE4": "U",
355 "\u1EEC": "U",
356 "\u1EEE": "U",
357 "\u1EF0": "U",
358 "\xDD": "Y",
359 "\xE0": "a",
360 "\xE1": "a",
361 "\xE2": "a",
362 "\xE3": "a",
363 "\xE4": "a",
364 "\xE5": "a",
365 "\u1EA5": "a",
366 "\u1EAF": "a",
367 "\u1EB3": "a",
368 "\u1EB5": "a",
369 "\u1EB7": "a",
370 "\xE6": "ae",
371 "\u1EA7": "a",
372 "\u1EB1": "a",
373 "\u0203": "a",
374 "\u1EA3": "a",
375 "\u1EA1": "a",
376 "\u1EA9": "a",
377 "\u1EAB": "a",
378 "\u1EAD": "a",
379 "\xE7": "c",
380 "\u1E09": "c",
381 "\xE8": "e",
382 "\xE9": "e",
383 "\xEA": "e",
384 "\xEB": "e",
385 "\u1EBF": "e",
386 "\u1E17": "e",
387 "\u1EC1": "e",
388 "\u1E15": "e",
389 "\u1E1D": "e",
390 "\u0207": "e",
391 "\u1EBB": "e",
392 "\u1EBD": "e",
393 "\u1EB9": "e",
394 "\u1EC3": "e",
395 "\u1EC5": "e",
396 "\u1EC7": "e",
397 "\xEC": "i",
398 "\xED": "i",
399 "\xEE": "i",
400 "\xEF": "i",
401 "\u1E2F": "i",
402 "\u020B": "i",
403 "\u1EC9": "i",
404 "\u1ECB": "i",
405 "\xF0": "d",
406 "\xF1": "n",
407 "\xF2": "o",
408 "\xF3": "o",
409 "\xF4": "o",
410 "\xF5": "o",
411 "\xF6": "o",
412 "\xF8": "o",
413 "\u1ED1": "o",
414 "\u1E4D": "o",
415 "\u1E53": "o",
416 "\u020F": "o",
417 "\u1ECF": "o",
418 "\u1ECD": "o",
419 "\u1ED5": "o",
420 "\u1ED7": "o",
421 "\u1ED9": "o",
422 "\u1EDD": "o",
423 "\u1EDF": "o",
424 "\u1EE1": "o",
425 "\u1EDB": "o",
426 "\u1EE3": "o",
427 "\xF9": "u",
428 "\xFA": "u",
429 "\xFB": "u",
430 "\xFC": "u",
431 "\u1EE7": "u",
432 "\u1EE5": "u",
433 "\u1EED": "u",
434 "\u1EEF": "u",
435 "\u1EF1": "u",
436 "\xFD": "y",
437 "\xFF": "y",
438 "\u0100": "A",
439 "\u0101": "a",
440 "\u0102": "A",
441 "\u0103": "a",
442 "\u0104": "A",
443 "\u0105": "a",
444 "\u0106": "C",
445 "\u0107": "c",
446 "\u0108": "C",
447 "\u0109": "c",
448 "\u010A": "C",
449 "\u010B": "c",
450 "\u010C": "C",
451 "\u010D": "c",
452 "C\u0306": "C",
453 "c\u0306": "c",
454 "\u010E": "D",
455 "\u010F": "d",
456 "\u0110": "D",
457 "\u0111": "d",
458 "\u0112": "E",
459 "\u0113": "e",
460 "\u0114": "E",
461 "\u0115": "e",
462 "\u0116": "E",
463 "\u0117": "e",
464 "\u0118": "E",
465 "\u0119": "e",
466 "\u011A": "E",
467 "\u011B": "e",
468 "\u011C": "G",
469 "\u01F4": "G",
470 "\u011D": "g",
471 "\u01F5": "g",
472 "\u011E": "G",
473 "\u011F": "g",
474 "\u0120": "G",
475 "\u0121": "g",
476 "\u0122": "G",
477 "\u0123": "g",
478 "\u0124": "H",
479 "\u0125": "h",
480 "\u0126": "H",
481 "\u0127": "h",
482 "\u1E2A": "H",
483 "\u1E2B": "h",
484 "\u0128": "I",
485 "\u0129": "i",
486 "\u012A": "I",
487 "\u012B": "i",
488 "\u012C": "I",
489 "\u012D": "i",
490 "\u012E": "I",
491 "\u012F": "i",
492 "\u0130": "I",
493 "\u0131": "i",
494 "\u0132": "IJ",
495 "\u0133": "ij",
496 "\u0134": "J",
497 "\u0135": "j",
498 "\u0136": "K",
499 "\u0137": "k",
500 "\u1E30": "K",
501 "\u1E31": "k",
502 "K\u0306": "K",
503 "k\u0306": "k",
504 "\u0139": "L",
505 "\u013A": "l",
506 "\u013B": "L",
507 "\u013C": "l",
508 "\u013D": "L",
509 "\u013E": "l",
510 "\u013F": "L",
511 "\u0140": "l",
512 "\u0141": "l",
513 "\u0142": "l",
514 "\u1E3E": "M",
515 "\u1E3F": "m",
516 "M\u0306": "M",
517 "m\u0306": "m",
518 "\u0143": "N",
519 "\u0144": "n",
520 "\u0145": "N",
521 "\u0146": "n",
522 "\u0147": "N",
523 "\u0148": "n",
524 "\u0149": "n",
525 "N\u0306": "N",
526 "n\u0306": "n",
527 "\u014C": "O",
528 "\u014D": "o",
529 "\u014E": "O",
530 "\u014F": "o",
531 "\u0150": "O",
532 "\u0151": "o",
533 "\u0152": "OE",
534 "\u0153": "oe",
535 "P\u0306": "P",
536 "p\u0306": "p",
537 "\u0154": "R",
538 "\u0155": "r",
539 "\u0156": "R",
540 "\u0157": "r",
541 "\u0158": "R",
542 "\u0159": "r",
543 "R\u0306": "R",
544 "r\u0306": "r",
545 "\u0212": "R",
546 "\u0213": "r",
547 "\u015A": "S",
548 "\u015B": "s",
549 "\u015C": "S",
550 "\u015D": "s",
551 "\u015E": "S",
552 "\u0218": "S",
553 "\u0219": "s",
554 "\u015F": "s",
555 "\u0160": "S",
556 "\u0161": "s",
557 "\u0162": "T",
558 "\u0163": "t",
559 "\u021B": "t",
560 "\u021A": "T",
561 "\u0164": "T",
562 "\u0165": "t",
563 "\u0166": "T",
564 "\u0167": "t",
565 "T\u0306": "T",
566 "t\u0306": "t",
567 "\u0168": "U",
568 "\u0169": "u",
569 "\u016A": "U",
570 "\u016B": "u",
571 "\u016C": "U",
572 "\u016D": "u",
573 "\u016E": "U",
574 "\u016F": "u",
575 "\u0170": "U",
576 "\u0171": "u",
577 "\u0172": "U",
578 "\u0173": "u",
579 "\u0216": "U",
580 "\u0217": "u",
581 "V\u0306": "V",
582 "v\u0306": "v",
583 "\u0174": "W",
584 "\u0175": "w",
585 "\u1E82": "W",
586 "\u1E83": "w",
587 "X\u0306": "X",
588 "x\u0306": "x",
589 "\u0176": "Y",
590 "\u0177": "y",
591 "\u0178": "Y",
592 "Y\u0306": "Y",
593 "y\u0306": "y",
594 "\u0179": "Z",
595 "\u017A": "z",
596 "\u017B": "Z",
597 "\u017C": "z",
598 "\u017D": "Z",
599 "\u017E": "z",
600 "\u017F": "s",
601 "\u0192": "f",
602 "\u01A0": "O",
603 "\u01A1": "o",
604 "\u01AF": "U",
605 "\u01B0": "u",
606 "\u01CD": "A",
607 "\u01CE": "a",
608 "\u01CF": "I",
609 "\u01D0": "i",
610 "\u01D1": "O",
611 "\u01D2": "o",
612 "\u01D3": "U",
613 "\u01D4": "u",
614 "\u01D5": "U",
615 "\u01D6": "u",
616 "\u01D7": "U",
617 "\u01D8": "u",
618 "\u01D9": "U",
619 "\u01DA": "u",
620 "\u01DB": "U",
621 "\u01DC": "u",
622 "\u1EE8": "U",
623 "\u1EE9": "u",
624 "\u1E78": "U",
625 "\u1E79": "u",
626 "\u01FA": "A",
627 "\u01FB": "a",
628 "\u01FC": "AE",
629 "\u01FD": "ae",
630 "\u01FE": "O",
631 "\u01FF": "o",
632 "\xDE": "TH",
633 "\xFE": "th",
634 "\u1E54": "P",
635 "\u1E55": "p",
636 "\u1E64": "S",
637 "\u1E65": "s",
638 "X\u0301": "X",
639 "x\u0301": "x",
640 "\u0403": "\u0413",
641 "\u0453": "\u0433",
642 "\u040C": "\u041A",
643 "\u045C": "\u043A",
644 "A\u030B": "A",
645 "a\u030B": "a",
646 "E\u030B": "E",
647 "e\u030B": "e",
648 "I\u030B": "I",
649 "i\u030B": "i",
650 "\u01F8": "N",
651 "\u01F9": "n",
652 "\u1ED2": "O",
653 "\u1ED3": "o",
654 "\u1E50": "O",
655 "\u1E51": "o",
656 "\u1EEA": "U",
657 "\u1EEB": "u",
658 "\u1E80": "W",
659 "\u1E81": "w",
660 "\u1EF2": "Y",
661 "\u1EF3": "y",
662 "\u0200": "A",
663 "\u0201": "a",
664 "\u0204": "E",
665 "\u0205": "e",
666 "\u0208": "I",
667 "\u0209": "i",
668 "\u020C": "O",
669 "\u020D": "o",
670 "\u0210": "R",
671 "\u0211": "r",
672 "\u0214": "U",
673 "\u0215": "u",
674 "B\u030C": "B",
675 "b\u030C": "b",
676 "\u010C\u0323": "C",
677 "\u010D\u0323": "c",
678 "\xCA\u030C": "E",
679 "\xEA\u030C": "e",
680 "F\u030C": "F",
681 "f\u030C": "f",
682 "\u01E6": "G",
683 "\u01E7": "g",
684 "\u021E": "H",
685 "\u021F": "h",
686 "J\u030C": "J",
687 "\u01F0": "j",
688 "\u01E8": "K",
689 "\u01E9": "k",
690 "M\u030C": "M",
691 "m\u030C": "m",
692 "P\u030C": "P",
693 "p\u030C": "p",
694 "Q\u030C": "Q",
695 "q\u030C": "q",
696 "\u0158\u0329": "R",
697 "\u0159\u0329": "r",
698 "\u1E66": "S",
699 "\u1E67": "s",
700 "V\u030C": "V",
701 "v\u030C": "v",
702 "W\u030C": "W",
703 "w\u030C": "w",
704 "X\u030C": "X",
705 "x\u030C": "x",
706 "Y\u030C": "Y",
707 "y\u030C": "y",
708 "A\u0327": "A",
709 "a\u0327": "a",
710 "B\u0327": "B",
711 "b\u0327": "b",
712 "\u1E10": "D",
713 "\u1E11": "d",
714 "\u0228": "E",
715 "\u0229": "e",
716 "\u0190\u0327": "E",
717 "\u025B\u0327": "e",
718 "\u1E28": "H",
719 "\u1E29": "h",
720 "I\u0327": "I",
721 "i\u0327": "i",
722 "\u0197\u0327": "I",
723 "\u0268\u0327": "i",
724 "M\u0327": "M",
725 "m\u0327": "m",
726 "O\u0327": "O",
727 "o\u0327": "o",
728 "Q\u0327": "Q",
729 "q\u0327": "q",
730 "U\u0327": "U",
731 "u\u0327": "u",
732 "X\u0327": "X",
733 "x\u0327": "x",
734 "Z\u0327": "Z",
735 "z\u0327": "z",
736 "\u0439": "\u0438",
737 "\u0419": "\u0418",
738 "\u0451": "\u0435",
739 "\u0401": "\u0415"
740 };
741 var chars = Object.keys(characterMap).join("|");
742 var allAccents = new RegExp(chars, "g");
743 var firstAccent = new RegExp(chars, "");
744 function matcher(match2) {
745 return characterMap[match2];
746 }
747 var removeAccents2 = function(string) {
748 return string.replace(allAccents, matcher);
749 };
750 var hasAccents = function(string) {
751 return !!string.match(firstAccent);
752 };
753 module.exports = removeAccents2;
754 module.exports.has = hasAccents;
755 module.exports.remove = removeAccents2;
756 }
757 });
758
759 // node_modules/fast-deep-equal/es6/index.js
760 var require_es6 = __commonJS({
761 "node_modules/fast-deep-equal/es6/index.js"(exports, module) {
762 "use strict";
763 module.exports = function equal(a2, b2) {
764 if (a2 === b2) return true;
765 if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") {
766 if (a2.constructor !== b2.constructor) return false;
767 var length, i2, keys;
768 if (Array.isArray(a2)) {
769 length = a2.length;
770 if (length != b2.length) return false;
771 for (i2 = length; i2-- !== 0; )
772 if (!equal(a2[i2], b2[i2])) return false;
773 return true;
774 }
775 if (a2 instanceof Map && b2 instanceof Map) {
776 if (a2.size !== b2.size) return false;
777 for (i2 of a2.entries())
778 if (!b2.has(i2[0])) return false;
779 for (i2 of a2.entries())
780 if (!equal(i2[1], b2.get(i2[0]))) return false;
781 return true;
782 }
783 if (a2 instanceof Set && b2 instanceof Set) {
784 if (a2.size !== b2.size) return false;
785 for (i2 of a2.entries())
786 if (!b2.has(i2[0])) return false;
787 return true;
788 }
789 if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) {
790 length = a2.length;
791 if (length != b2.length) return false;
792 for (i2 = length; i2-- !== 0; )
793 if (a2[i2] !== b2[i2]) return false;
794 return true;
795 }
796 if (a2.constructor === RegExp) return a2.source === b2.source && a2.flags === b2.flags;
797 if (a2.valueOf !== Object.prototype.valueOf) return a2.valueOf() === b2.valueOf();
798 if (a2.toString !== Object.prototype.toString) return a2.toString() === b2.toString();
799 keys = Object.keys(a2);
800 length = keys.length;
801 if (length !== Object.keys(b2).length) return false;
802 for (i2 = length; i2-- !== 0; )
803 if (!Object.prototype.hasOwnProperty.call(b2, keys[i2])) return false;
804 for (i2 = length; i2-- !== 0; ) {
805 var key = keys[i2];
806 if (!equal(a2[key], b2[key])) return false;
807 }
808 return true;
809 }
810 return a2 !== a2 && b2 !== b2;
811 };
812 }
813 });
814
815 // package-external:@wordpress/date
816 var require_date = __commonJS({
817 "package-external:@wordpress/date"(exports, module) {
818 module.exports = window.wp.date;
819 }
820 });
821
822 // package-external:@wordpress/warning
823 var require_warning = __commonJS({
824 "package-external:@wordpress/warning"(exports, module) {
825 module.exports = window.wp.warning;
826 }
827 });
828
829 // package-external:@wordpress/rich-text
830 var require_rich_text = __commonJS({
831 "package-external:@wordpress/rich-text"(exports, module) {
832 module.exports = window.wp.richText;
833 }
834 });
835
836 // widgets/events/render.tsx
837 var import_element87 = __toESM(require_element());
838 var import_data6 = __toESM(require_data());
839 var import_core_data = __toESM(require_core_data());
840 var import_components47 = __toESM(require_components());
841 var import_i18n46 = __toESM(require_i18n());
842
843 // packages/icons/build-module/library/arrow-down.mjs
844 var import_primitives = __toESM(require_primitives(), 1);
845 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
846 var arrow_down_default = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.Path, { d: "m16.5 13.5-3.7 3.7V4h-1.5v13.2l-3.8-3.7-1 1 5.5 5.6 5.5-5.6z" }) });
847
848 // packages/icons/build-module/library/arrow-left.mjs
849 var import_primitives2 = __toESM(require_primitives(), 1);
850 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
851 var arrow_left_default = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.Path, { d: "M20 11.2H6.8l3.7-3.7-1-1L3.9 12l5.6 5.5 1-1-3.7-3.7H20z" }) });
852
853 // packages/icons/build-module/library/arrow-right.mjs
854 var import_primitives3 = __toESM(require_primitives(), 1);
855 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
856 var arrow_right_default = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.Path, { d: "m14.5 6.5-1 1 3.7 3.7H4v1.6h13.2l-3.7 3.7 1 1 5.6-5.5z" }) });
857
858 // packages/icons/build-module/library/arrow-up.mjs
859 var import_primitives4 = __toESM(require_primitives(), 1);
860 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
861 var arrow_up_default = /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.Path, { d: "M12 3.9 6.5 9.5l1 1 3.8-3.7V20h1.5V6.8l3.7 3.7 1-1z" }) });
862
863 // packages/icons/build-module/library/block-table.mjs
864 var import_primitives5 = __toESM(require_primitives(), 1);
865 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
866 var block_table_default = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.Path, { d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5 4.5h14c.3 0 .5.2.5.5v3.5h-15V5c0-.3.2-.5.5-.5zm8 5.5h6.5v3.5H13V10zm-1.5 3.5h-7V10h7v3.5zm-7 5.5v-4h7v4.5H5c-.3 0-.5-.2-.5-.5zm14.5.5h-6V15h6.5v4c0 .3-.2.5-.5.5z" }) });
867
868 // packages/icons/build-module/library/calendar.mjs
869 var import_primitives6 = __toESM(require_primitives(), 1);
870 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
871 var calendar_default = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.Path, { d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm.5 16c0 .3-.2.5-.5.5H5c-.3 0-.5-.2-.5-.5V7h15v12zM9 10H7v2h2v-2zm0 4H7v2h2v-2zm4-4h-2v2h2v-2zm4 0h-2v2h2v-2zm-4 4h-2v2h2v-2zm4 0h-2v2h2v-2z" }) });
872
873 // packages/icons/build-module/library/category.mjs
874 var import_primitives7 = __toESM(require_primitives(), 1);
875 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
876 var category_default = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M6 5.5h3a.5.5 0 01.5.5v3a.5.5 0 01-.5.5H6a.5.5 0 01-.5-.5V6a.5.5 0 01.5-.5zM4 6a2 2 0 012-2h3a2 2 0 012 2v3a2 2 0 01-2 2H6a2 2 0 01-2-2V6zm11-.5h3a.5.5 0 01.5.5v3a.5.5 0 01-.5.5h-3a.5.5 0 01-.5-.5V6a.5.5 0 01.5-.5zM13 6a2 2 0 012-2h3a2 2 0 012 2v3a2 2 0 01-2 2h-3a2 2 0 01-2-2V6zm5 8.5h-3a.5.5 0 00-.5.5v3a.5.5 0 00.5.5h3a.5.5 0 00.5-.5v-3a.5.5 0 00-.5-.5zM15 13a2 2 0 00-2 2v3a2 2 0 002 2h3a2 2 0 002-2v-3a2 2 0 00-2-2h-3zm-9 1.5h3a.5.5 0 01.5.5v3a.5.5 0 01-.5.5H6a.5.5 0 01-.5-.5v-3a.5.5 0 01.5-.5zM4 15a2 2 0 012-2h3a2 2 0 012 2v3a2 2 0 01-2 2H6a2 2 0 01-2-2v-3z" }) });
877
878 // packages/icons/build-module/library/check.mjs
879 var import_primitives8 = __toESM(require_primitives(), 1);
880 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
881 var check_default = /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.Path, { d: "M16.5 7.5 10 13.9l-2.5-2.4-1 1 3.5 3.6 7.5-7.6z" }) });
882
883 // packages/icons/build-module/library/close-small.mjs
884 var import_primitives9 = __toESM(require_primitives(), 1);
885 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
886 var close_small_default = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.Path, { d: "M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z" }) });
887
888 // packages/icons/build-module/library/cog.mjs
889 var import_primitives10 = __toESM(require_primitives(), 1);
890 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
891 var cog_default = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M10.289 4.836A1 1 0 0111.275 4h1.306a1 1 0 01.987.836l.244 1.466c.787.26 1.503.679 2.108 1.218l1.393-.522a1 1 0 011.216.437l.653 1.13a1 1 0 01-.23 1.273l-1.148.944a6.025 6.025 0 010 2.435l1.149.946a1 1 0 01.23 1.272l-.653 1.13a1 1 0 01-1.216.437l-1.394-.522c-.605.54-1.32.958-2.108 1.218l-.244 1.466a1 1 0 01-.987.836h-1.306a1 1 0 01-.986-.836l-.244-1.466a5.995 5.995 0 01-2.108-1.218l-1.394.522a1 1 0 01-1.217-.436l-.653-1.131a1 1 0 01.23-1.272l1.149-.946a6.026 6.026 0 010-2.435l-1.148-.944a1 1 0 01-.23-1.272l.653-1.131a1 1 0 011.217-.437l1.393.522a5.994 5.994 0 012.108-1.218l.244-1.466zM14.929 12a3 3 0 11-6 0 3 3 0 016 0z" }) });
892
893 // packages/icons/build-module/library/envelope.mjs
894 var import_primitives11 = __toESM(require_primitives(), 1);
895 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
896 var envelope_default = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M3 7c0-1.1.9-2 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Zm2-.5h14c.3 0 .5.2.5.5v1L12 13.5 4.5 7.9V7c0-.3.2-.5.5-.5Zm-.5 3.3V17c0 .3.2.5.5.5h14c.3 0 .5-.2.5-.5V9.8L12 15.4 4.5 9.8Z" }) });
897
898 // packages/icons/build-module/library/error.mjs
899 var import_primitives12 = __toESM(require_primitives(), 1);
900 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
901 var error_default = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M12.218 5.377a.25.25 0 0 0-.436 0l-7.29 12.96a.25.25 0 0 0 .218.373h14.58a.25.25 0 0 0 .218-.372l-7.29-12.96Zm-1.743-.735c.669-1.19 2.381-1.19 3.05 0l7.29 12.96a1.75 1.75 0 0 1-1.525 2.608H4.71a1.75 1.75 0 0 1-1.525-2.608l7.29-12.96ZM12.75 17.46h-1.5v-1.5h1.5v1.5Zm-1.5-3h1.5v-5h-1.5v5Z" }) });
902
903 // packages/icons/build-module/library/format-list-bullets-rtl.mjs
904 var import_primitives13 = __toESM(require_primitives(), 1);
905 var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
906 var format_list_bullets_rtl_default = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.Path, { d: "M4 8.8h8.9V7.2H4v1.6zm0 7h8.9v-1.5H4v1.5zM18 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z" }) });
907
908 // packages/icons/build-module/library/format-list-bullets.mjs
909 var import_primitives14 = __toESM(require_primitives(), 1);
910 var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
911 var format_list_bullets_default = /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.Path, { d: "M11.1 15.8H20v-1.5h-8.9v1.5zm0-8.6v1.5H20V7.2h-8.9zM6 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-7c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" }) });
912
913 // packages/icons/build-module/library/funnel.mjs
914 var import_primitives15 = __toESM(require_primitives(), 1);
915 var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
916 var funnel_default = /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_primitives15.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_primitives15.Path, { d: "M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z" }) });
917
918 // packages/icons/build-module/library/link.mjs
919 var import_primitives16 = __toESM(require_primitives(), 1);
920 var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
921 var link_default = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.Path, { d: "M10 17.389H8.444A5.194 5.194 0 1 1 8.444 7H10v1.5H8.444a3.694 3.694 0 0 0 0 7.389H10v1.5ZM14 7h1.556a5.194 5.194 0 0 1 0 10.39H14v-1.5h1.556a3.694 3.694 0 0 0 0-7.39H14V7Zm-4.5 6h5v-1.5h-5V13Z" }) });
922
923 // packages/icons/build-module/library/map-marker.mjs
924 var import_primitives17 = __toESM(require_primitives(), 1);
925 var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
926 var map_marker_default = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.Path, { d: "M12 9c-.8 0-1.5.7-1.5 1.5S11.2 12 12 12s1.5-.7 1.5-1.5S12.8 9 12 9zm0-5c-3.6 0-6.5 2.8-6.5 6.2 0 .8.3 1.8.9 3.1.5 1.1 1.2 2.3 2 3.6.7 1 3 3.8 3.2 3.9l.4.5.4-.5c.2-.2 2.6-2.9 3.2-3.9.8-1.2 1.5-2.5 2-3.6.6-1.3.9-2.3.9-3.1C18.5 6.8 15.6 4 12 4zm4.3 8.7c-.5 1-1.1 2.2-1.9 3.4-.5.7-1.7 2.2-2.4 3-.7-.8-1.9-2.3-2.4-3-.8-1.2-1.4-2.3-1.9-3.3-.6-1.4-.7-2.2-.7-2.5 0-2.6 2.2-4.7 5-4.7s5 2.1 5 4.7c0 .2-.1 1-.7 2.4z" }) });
927
928 // packages/icons/build-module/library/mobile.mjs
929 var import_primitives18 = __toESM(require_primitives(), 1);
930 var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
931 var mobile_default = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_primitives18.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_primitives18.Path, { d: "M15 4H9c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm.5 14c0 .3-.2.5-.5.5H9c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h6c.3 0 .5.2.5.5v12zm-4.5-.5h2V16h-2v1.5z" }) });
932
933 // packages/icons/build-module/library/more-vertical.mjs
934 var import_primitives19 = __toESM(require_primitives(), 1);
935 var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1);
936 var more_vertical_default = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_primitives19.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_primitives19.Path, { d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" }) });
937
938 // packages/icons/build-module/library/next.mjs
939 var import_primitives20 = __toESM(require_primitives(), 1);
940 var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
941 var next_default = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_primitives20.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_primitives20.Path, { d: "M6.6 6L5.4 7l4.5 5-4.5 5 1.1 1 5.5-6-5.4-6zm6 0l-1.1 1 4.5 5-4.5 5 1.1 1 5.5-6-5.5-6z" }) });
942
943 // packages/icons/build-module/library/people.mjs
944 var import_primitives21 = __toESM(require_primitives(), 1);
945 var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1);
946 var people_default = /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_primitives21.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_primitives21.Path, { fillRule: "evenodd", d: "M15.5 9.5a1 1 0 100-2 1 1 0 000 2zm0 1.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5zm-2.25 6v-2a2.75 2.75 0 00-2.75-2.75h-4A2.75 2.75 0 003.75 15v2h1.5v-2c0-.69.56-1.25 1.25-1.25h4c.69 0 1.25.56 1.25 1.25v2h1.5zm7-2v2h-1.5v-2c0-.69-.56-1.25-1.25-1.25H15v-1.5h2.5A2.75 2.75 0 0120.25 15zM9.5 8.5a1 1 0 11-2 0 1 1 0 012 0zm1.5 0a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z" }) });
947
948 // packages/icons/build-module/library/previous.mjs
949 var import_primitives22 = __toESM(require_primitives(), 1);
950 var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1);
951 var previous_default = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.Path, { d: "M11.6 7l-1.1-1L5 12l5.5 6 1.1-1L7 12l4.6-5zm6 0l-1.1-1-5.5 6 5.5 6 1.1-1-4.6-5 4.6-5z" }) });
952
953 // packages/icons/build-module/library/scheduled.mjs
954 var import_primitives23 = __toESM(require_primitives(), 1);
955 var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1);
956 var scheduled_default = /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M12 18.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm9 1V8h-1.5v3.5h-2V13H13Z" }) });
957
958 // packages/icons/build-module/library/search.mjs
959 var import_primitives24 = __toESM(require_primitives(), 1);
960 var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1);
961 var search_default = /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_primitives24.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_primitives24.Path, { d: "M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z" }) });
962
963 // packages/icons/build-module/library/seen.mjs
964 var import_primitives25 = __toESM(require_primitives(), 1);
965 var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
966 var seen_default = /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_primitives25.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_primitives25.Path, { d: "M3.99961 13C4.67043 13.3354 4.6703 13.3357 4.67017 13.3359L4.67298 13.3305C4.67621 13.3242 4.68184 13.3135 4.68988 13.2985C4.70595 13.2686 4.7316 13.2218 4.76695 13.1608C4.8377 13.0385 4.94692 12.8592 5.09541 12.6419C5.39312 12.2062 5.84436 11.624 6.45435 11.0431C7.67308 9.88241 9.49719 8.75 11.9996 8.75C14.502 8.75 16.3261 9.88241 17.5449 11.0431C18.1549 11.624 18.6061 12.2062 18.9038 12.6419C19.0523 12.8592 19.1615 13.0385 19.2323 13.1608C19.2676 13.2218 19.2933 13.2686 19.3093 13.2985C19.3174 13.3135 19.323 13.3242 19.3262 13.3305L19.3291 13.3359C19.3289 13.3357 19.3288 13.3354 19.9996 13C20.6704 12.6646 20.6703 12.6643 20.6701 12.664L20.6697 12.6632L20.6688 12.6614L20.6662 12.6563L20.6583 12.6408C20.6517 12.6282 20.6427 12.6108 20.631 12.5892C20.6078 12.5459 20.5744 12.4852 20.5306 12.4096C20.4432 12.2584 20.3141 12.0471 20.1423 11.7956C19.7994 11.2938 19.2819 10.626 18.5794 9.9569C17.1731 8.61759 14.9972 7.25 11.9996 7.25C9.00203 7.25 6.82614 8.61759 5.41987 9.9569C4.71736 10.626 4.19984 11.2938 3.85694 11.7956C3.68511 12.0471 3.55605 12.2584 3.4686 12.4096C3.42484 12.4852 3.39142 12.5459 3.36818 12.5892C3.35656 12.6108 3.34748 12.6282 3.34092 12.6408L3.33297 12.6563L3.33041 12.6614L3.32948 12.6632L3.32911 12.664C3.32894 12.6643 3.32879 12.6646 3.99961 13ZM11.9996 16C13.9326 16 15.4996 14.433 15.4996 12.5C15.4996 10.567 13.9326 9 11.9996 9C10.0666 9 8.49961 10.567 8.49961 12.5C8.49961 14.433 10.0666 16 11.9996 16Z" }) });
967
968 // packages/icons/build-module/library/unseen.mjs
969 var import_primitives26 = __toESM(require_primitives(), 1);
970 var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
971 var unseen_default = /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_primitives26.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_primitives26.Path, { d: "M20.7 12.7s0-.1-.1-.2c0-.2-.2-.4-.4-.6-.3-.5-.9-1.2-1.6-1.8-.7-.6-1.5-1.3-2.6-1.8l-.6 1.4c.9.4 1.6 1 2.1 1.5.6.6 1.1 1.2 1.4 1.6.1.2.3.4.3.5v.1l.7-.3.7-.3Zm-5.2-9.3-1.8 4c-.5-.1-1.1-.2-1.7-.2-3 0-5.2 1.4-6.6 2.7-.7.7-1.2 1.3-1.6 1.8-.2.3-.3.5-.4.6 0 0 0 .1-.1.2s0 0 .7.3l.7.3V13c0-.1.2-.3.3-.5.3-.4.7-1 1.4-1.6 1.2-1.2 3-2.3 5.5-2.3H13v.3c-.4 0-.8-.1-1.1-.1-1.9 0-3.5 1.6-3.5 3.5s.6 2.3 1.6 2.9l-2 4.4.9.4 7.6-16.2-.9-.4Zm-3 12.6c1.7-.2 3-1.7 3-3.5s-.2-1.4-.6-1.9L12.4 16Z" }) });
972
973 // packages/icons/build-module/library/wordpress.mjs
974 var import_primitives27 = __toESM(require_primitives(), 1);
975 var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
976 var wordpress_default = /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_primitives27.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "-2 -2 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_primitives27.Path, { d: "M20 10c0-5.51-4.49-10-10-10C4.48 0 0 4.49 0 10c0 5.52 4.48 10 10 10 5.51 0 10-4.48 10-10zM7.78 15.37L4.37 6.22c.55-.02 1.17-.08 1.17-.08.5-.06.44-1.13-.06-1.11 0 0-1.45.11-2.37.11-.18 0-.37 0-.58-.01C4.12 2.69 6.87 1.11 10 1.11c2.33 0 4.45.87 6.05 2.34-.68-.11-1.65.39-1.65 1.58 0 .74.45 1.36.9 2.1.35.61.55 1.36.55 2.46 0 1.49-1.4 5-1.4 5l-3.03-8.37c.54-.02.82-.17.82-.17.5-.05.44-1.25-.06-1.22 0 0-1.44.12-2.38.12-.87 0-2.33-.12-2.33-.12-.5-.03-.56 1.2-.06 1.22l.92.08 1.26 3.41zM17.41 10c.24-.64.74-1.87.43-4.25.7 1.29 1.05 2.71 1.05 4.25 0 3.29-1.73 6.24-4.4 7.78.97-2.59 1.94-5.2 2.92-7.78zM6.1 18.09C3.12 16.65 1.11 13.53 1.11 10c0-1.3.23-2.48.72-3.59C3.25 10.3 4.67 14.2 6.1 18.09zm4.03-6.63l2.58 6.98c-.86.29-1.76.45-2.71.45-.79 0-1.57-.11-2.29-.33.81-2.38 1.62-4.74 2.42-7.1z" }) });
977
978 // node_modules/clsx/dist/clsx.mjs
979 function r(e2) {
980 var t2, f2, n2 = "";
981 if ("string" == typeof e2 || "number" == typeof e2) n2 += e2;
982 else if ("object" == typeof e2) if (Array.isArray(e2)) {
983 var o2 = e2.length;
984 for (t2 = 0; t2 < o2; t2++) e2[t2] && (f2 = r(e2[t2])) && (n2 && (n2 += " "), n2 += f2);
985 } else for (f2 in e2) e2[f2] && (n2 && (n2 += " "), n2 += f2);
986 return n2;
987 }
988 function clsx() {
989 for (var e2, t2, f2 = 0, n2 = "", o2 = arguments.length; f2 < o2; f2++) (e2 = arguments[f2]) && (t2 = r(e2)) && (n2 && (n2 += " "), n2 += t2);
990 return n2;
991 }
992 var clsx_default = clsx;
993
994 // node_modules/@base-ui/utils/safeReact.mjs
995 var React = __toESM(require_react(), 1);
996 var SafeReact = {
997 ...React
998 };
999
1000 // node_modules/@base-ui/utils/useRefWithInit.mjs
1001 var React2 = __toESM(require_react(), 1);
1002 var UNINITIALIZED = {};
1003 function useRefWithInit(init2, initArg) {
1004 const ref = React2.useRef(UNINITIALIZED);
1005 if (ref.current === UNINITIALIZED) {
1006 ref.current = init2(initArg);
1007 }
1008 return ref;
1009 }
1010
1011 // node_modules/@base-ui/utils/useStableCallback.mjs
1012 var useInsertionEffect = SafeReact.useInsertionEffect;
1013 var useSafeInsertionEffect = (
1014 // React 17 doesn't have useInsertionEffect.
1015 useInsertionEffect && // Preact replaces useInsertionEffect with useLayoutEffect and fires too late.
1016 useInsertionEffect !== SafeReact.useLayoutEffect ? useInsertionEffect : (fn) => fn()
1017 );
1018 function useStableCallback(callback) {
1019 const stable = useRefWithInit(createStableCallback).current;
1020 stable.next = callback;
1021 useSafeInsertionEffect(stable.effect);
1022 return stable.trampoline;
1023 }
1024 function createStableCallback() {
1025 const stable = {
1026 next: void 0,
1027 callback: assertNotCalled,
1028 trampoline: (...args) => stable.callback?.(...args),
1029 effect: () => {
1030 stable.callback = stable.next;
1031 }
1032 };
1033 return stable;
1034 }
1035 function assertNotCalled() {
1036 if (true) {
1037 throw (
1038 /* minify-error-disabled */
1039 new Error("Base UI: Cannot call an event handler while rendering.")
1040 );
1041 }
1042 }
1043
1044 // node_modules/@base-ui/utils/useIsoLayoutEffect.mjs
1045 var React3 = __toESM(require_react(), 1);
1046 var noop = () => {
1047 };
1048 var useIsoLayoutEffect = typeof document !== "undefined" ? React3.useLayoutEffect : noop;
1049
1050 // node_modules/@base-ui/utils/warn.mjs
1051 var set;
1052 if (true) {
1053 set = /* @__PURE__ */ new Set();
1054 }
1055 function warn(...messages) {
1056 if (true) {
1057 const messageKey = messages.join(" ");
1058 if (!set.has(messageKey)) {
1059 set.add(messageKey);
1060 console.warn(`Base UI: ${messageKey}`);
1061 }
1062 }
1063 }
1064
1065 // node_modules/@base-ui/react/internals/direction-context/DirectionContext.mjs
1066 var React4 = __toESM(require_react(), 1);
1067 var DirectionContext = /* @__PURE__ */ React4.createContext(void 0);
1068 if (true) DirectionContext.displayName = "DirectionContext";
1069 function useDirection() {
1070 const context = React4.useContext(DirectionContext);
1071 return context?.direction ?? "ltr";
1072 }
1073
1074 // node_modules/@base-ui/react/internals/useRenderElement.mjs
1075 var React7 = __toESM(require_react(), 1);
1076
1077 // node_modules/@base-ui/utils/useMergedRefs.mjs
1078 function useMergedRefs(a2, b2, c2, d2) {
1079 const forkRef = useRefWithInit(createForkRef).current;
1080 if (didChange(forkRef, a2, b2, c2, d2)) {
1081 update(forkRef, [a2, b2, c2, d2]);
1082 }
1083 return forkRef.callback;
1084 }
1085 function useMergedRefsN(refs) {
1086 const forkRef = useRefWithInit(createForkRef).current;
1087 if (didChangeN(forkRef, refs)) {
1088 update(forkRef, refs);
1089 }
1090 return forkRef.callback;
1091 }
1092 function createForkRef() {
1093 return {
1094 callback: null,
1095 cleanup: null,
1096 refs: []
1097 };
1098 }
1099 function didChange(forkRef, a2, b2, c2, d2) {
1100 return forkRef.refs[0] !== a2 || forkRef.refs[1] !== b2 || forkRef.refs[2] !== c2 || forkRef.refs[3] !== d2;
1101 }
1102 function didChangeN(forkRef, newRefs) {
1103 return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index2) => ref !== newRefs[index2]);
1104 }
1105 function update(forkRef, refs) {
1106 forkRef.refs = refs;
1107 if (refs.every((ref) => ref == null)) {
1108 forkRef.callback = null;
1109 return;
1110 }
1111 forkRef.callback = (instance) => {
1112 if (forkRef.cleanup) {
1113 forkRef.cleanup();
1114 forkRef.cleanup = null;
1115 }
1116 if (instance != null) {
1117 const cleanupCallbacks = Array(refs.length).fill(null);
1118 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1119 const ref = refs[i2];
1120 if (ref == null) {
1121 continue;
1122 }
1123 switch (typeof ref) {
1124 case "function": {
1125 const refCleanup = ref(instance);
1126 if (typeof refCleanup === "function") {
1127 cleanupCallbacks[i2] = refCleanup;
1128 }
1129 break;
1130 }
1131 case "object": {
1132 ref.current = instance;
1133 break;
1134 }
1135 default:
1136 }
1137 }
1138 forkRef.cleanup = () => {
1139 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1140 const ref = refs[i2];
1141 if (ref == null) {
1142 continue;
1143 }
1144 switch (typeof ref) {
1145 case "function": {
1146 const cleanupCallback = cleanupCallbacks[i2];
1147 if (typeof cleanupCallback === "function") {
1148 cleanupCallback();
1149 } else {
1150 ref(null);
1151 }
1152 break;
1153 }
1154 case "object": {
1155 ref.current = null;
1156 break;
1157 }
1158 default:
1159 }
1160 }
1161 };
1162 }
1163 };
1164 }
1165
1166 // node_modules/@base-ui/utils/getReactElementRef.mjs
1167 var React6 = __toESM(require_react(), 1);
1168
1169 // node_modules/@base-ui/utils/reactVersion.mjs
1170 var React5 = __toESM(require_react(), 1);
1171 var majorVersion = parseInt(React5.version, 10);
1172 function isReactVersionAtLeast(reactVersionToCheck) {
1173 return majorVersion >= reactVersionToCheck;
1174 }
1175
1176 // node_modules/@base-ui/utils/getReactElementRef.mjs
1177 function getReactElementRef(element) {
1178 if (!/* @__PURE__ */ React6.isValidElement(element)) {
1179 return null;
1180 }
1181 const reactElement = element;
1182 const propsWithRef = reactElement.props;
1183 return (isReactVersionAtLeast(19) ? propsWithRef?.ref : reactElement.ref) ?? null;
1184 }
1185
1186 // node_modules/@base-ui/utils/mergeObjects.mjs
1187 function mergeObjects(a2, b2) {
1188 if (a2 && !b2) {
1189 return a2;
1190 }
1191 if (!a2 && b2) {
1192 return b2;
1193 }
1194 if (a2 || b2) {
1195 return {
1196 ...a2,
1197 ...b2
1198 };
1199 }
1200 return void 0;
1201 }
1202
1203 // node_modules/@base-ui/utils/empty.mjs
1204 function NOOP() {
1205 }
1206 var EMPTY_ARRAY = Object.freeze([]);
1207 var EMPTY_OBJECT = Object.freeze({});
1208
1209 // node_modules/@base-ui/react/internals/getStateAttributesProps.mjs
1210 function getStateAttributesProps(state, customMapping) {
1211 const props = {};
1212 for (const key in state) {
1213 const value = state[key];
1214 if (customMapping?.hasOwnProperty(key)) {
1215 const customProps = customMapping[key](value);
1216 if (customProps != null) {
1217 Object.assign(props, customProps);
1218 }
1219 continue;
1220 }
1221 if (value === true) {
1222 props[`data-${key.toLowerCase()}`] = "";
1223 } else if (value) {
1224 props[`data-${key.toLowerCase()}`] = value.toString();
1225 }
1226 }
1227 return props;
1228 }
1229
1230 // node_modules/@base-ui/react/utils/resolveClassName.mjs
1231 function resolveClassName(className, state) {
1232 return typeof className === "function" ? className(state) : className;
1233 }
1234
1235 // node_modules/@base-ui/react/utils/resolveStyle.mjs
1236 function resolveStyle(style, state) {
1237 return typeof style === "function" ? style(state) : style;
1238 }
1239
1240 // node_modules/@base-ui/react/merge-props/mergeProps.mjs
1241 var EMPTY_PROPS = {};
1242 function mergeProps(a2, b2, c2, d2, e2) {
1243 if (!c2 && !d2 && !e2 && !a2) {
1244 return createInitialMergedProps(b2);
1245 }
1246 let merged = createInitialMergedProps(a2);
1247 if (b2) {
1248 merged = mergeInto(merged, b2);
1249 }
1250 if (c2) {
1251 merged = mergeInto(merged, c2);
1252 }
1253 if (d2) {
1254 merged = mergeInto(merged, d2);
1255 }
1256 if (e2) {
1257 merged = mergeInto(merged, e2);
1258 }
1259 return merged;
1260 }
1261 function mergePropsN(props) {
1262 if (props.length === 0) {
1263 return EMPTY_PROPS;
1264 }
1265 if (props.length === 1) {
1266 return createInitialMergedProps(props[0]);
1267 }
1268 let merged = createInitialMergedProps(props[0]);
1269 for (let i2 = 1; i2 < props.length; i2 += 1) {
1270 merged = mergeInto(merged, props[i2]);
1271 }
1272 return merged;
1273 }
1274 function createInitialMergedProps(inputProps) {
1275 if (isPropsGetter(inputProps)) {
1276 return {
1277 ...resolvePropsGetter(inputProps, EMPTY_PROPS)
1278 };
1279 }
1280 return copyInitialProps(inputProps);
1281 }
1282 function mergeInto(merged, inputProps) {
1283 if (isPropsGetter(inputProps)) {
1284 return resolvePropsGetter(inputProps, merged);
1285 }
1286 return mutablyMergeInto(merged, inputProps);
1287 }
1288 function copyInitialProps(inputProps) {
1289 const copiedProps = {
1290 ...inputProps
1291 };
1292 for (const propName in copiedProps) {
1293 const propValue = copiedProps[propName];
1294 if (isEventHandler(propName, propValue)) {
1295 copiedProps[propName] = wrapEventHandler(propValue);
1296 }
1297 }
1298 return copiedProps;
1299 }
1300 function mutablyMergeInto(mergedProps, externalProps) {
1301 if (!externalProps) {
1302 return mergedProps;
1303 }
1304 for (const propName in externalProps) {
1305 const externalPropValue = externalProps[propName];
1306 switch (propName) {
1307 case "style": {
1308 mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue);
1309 break;
1310 }
1311 case "className": {
1312 mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue);
1313 break;
1314 }
1315 default: {
1316 if (isEventHandler(propName, externalPropValue)) {
1317 mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue);
1318 } else {
1319 mergedProps[propName] = externalPropValue;
1320 }
1321 }
1322 }
1323 }
1324 return mergedProps;
1325 }
1326 function isEventHandler(key, value) {
1327 const code0 = key.charCodeAt(0);
1328 const code1 = key.charCodeAt(1);
1329 const code2 = key.charCodeAt(2);
1330 return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined");
1331 }
1332 function isPropsGetter(inputProps) {
1333 return typeof inputProps === "function";
1334 }
1335 function resolvePropsGetter(inputProps, previousProps) {
1336 if (isPropsGetter(inputProps)) {
1337 return inputProps(previousProps);
1338 }
1339 return inputProps ?? EMPTY_PROPS;
1340 }
1341 function mergeEventHandlers(ourHandler, theirHandler) {
1342 if (!theirHandler) {
1343 return ourHandler;
1344 }
1345 if (!ourHandler) {
1346 return wrapEventHandler(theirHandler);
1347 }
1348 return (...args) => {
1349 const event = args[0];
1350 if (isSyntheticEvent(event)) {
1351 const baseUIEvent = event;
1352 makeEventPreventable(baseUIEvent);
1353 const result2 = theirHandler(...args);
1354 if (!baseUIEvent.baseUIHandlerPrevented) {
1355 ourHandler?.(...args);
1356 }
1357 return result2;
1358 }
1359 const result = theirHandler(...args);
1360 ourHandler?.(...args);
1361 return result;
1362 };
1363 }
1364 function wrapEventHandler(handler) {
1365 if (!handler) {
1366 return handler;
1367 }
1368 return (...args) => {
1369 const event = args[0];
1370 if (isSyntheticEvent(event)) {
1371 makeEventPreventable(event);
1372 }
1373 return handler(...args);
1374 };
1375 }
1376 function makeEventPreventable(event) {
1377 event.preventBaseUIHandler = () => {
1378 event.baseUIHandlerPrevented = true;
1379 };
1380 return event;
1381 }
1382 function mergeClassNames(ourClassName, theirClassName) {
1383 if (theirClassName) {
1384 if (ourClassName) {
1385 return theirClassName + " " + ourClassName;
1386 }
1387 return theirClassName;
1388 }
1389 return ourClassName;
1390 }
1391 function isSyntheticEvent(event) {
1392 return event != null && typeof event === "object" && "nativeEvent" in event;
1393 }
1394
1395 // node_modules/@base-ui/react/internals/useRenderElement.mjs
1396 var import_react = __toESM(require_react(), 1);
1397 function useRenderElement(element, componentProps, params = {}) {
1398 const renderProp = componentProps.render;
1399 const outProps = useRenderElementProps(componentProps, params);
1400 if (params.enabled === false) {
1401 return null;
1402 }
1403 const state = params.state ?? EMPTY_OBJECT;
1404 return evaluateRenderProp(element, renderProp, outProps, state);
1405 }
1406 function useRenderElementProps(componentProps, params = {}) {
1407 const {
1408 className: classNameProp,
1409 style: styleProp,
1410 render: renderProp
1411 } = componentProps;
1412 const {
1413 state = EMPTY_OBJECT,
1414 ref,
1415 props,
1416 stateAttributesMapping: stateAttributesMapping3,
1417 enabled = true
1418 } = params;
1419 const className = enabled ? resolveClassName(classNameProp, state) : void 0;
1420 const style = enabled ? resolveStyle(styleProp, state) : void 0;
1421 const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping3) : EMPTY_OBJECT;
1422 const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : void 0;
1423 const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT;
1424 if (typeof document !== "undefined") {
1425 if (!enabled) {
1426 useMergedRefs(null, null);
1427 } else if (Array.isArray(ref)) {
1428 outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]);
1429 } else {
1430 outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref);
1431 }
1432 }
1433 if (!enabled) {
1434 return EMPTY_OBJECT;
1435 }
1436 if (className !== void 0) {
1437 outProps.className = mergeClassNames(outProps.className, className);
1438 }
1439 if (style !== void 0) {
1440 outProps.style = mergeObjects(outProps.style, style);
1441 }
1442 return outProps;
1443 }
1444 function resolveRenderFunctionProps(props) {
1445 if (Array.isArray(props)) {
1446 return mergePropsN(props);
1447 }
1448 return mergeProps(void 0, props);
1449 }
1450 var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
1451 var COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/;
1452 var LOWERCASE_CHARACTER_PATTERN = /[a-z]/;
1453 function evaluateRenderProp(element, render4, props, state) {
1454 if (render4) {
1455 if (typeof render4 === "function") {
1456 if (true) {
1457 warnIfRenderPropLooksLikeComponent(render4);
1458 }
1459 return render4(props, state);
1460 }
1461 const mergedProps = mergeProps(props, render4.props);
1462 mergedProps.ref = props.ref;
1463 let newElement = render4;
1464 if (newElement?.$$typeof === REACT_LAZY_TYPE) {
1465 const children = React7.Children.toArray(render4);
1466 newElement = children[0];
1467 }
1468 if (true) {
1469 if (!/* @__PURE__ */ React7.isValidElement(newElement)) {
1470 throw new Error(["Base UI: The `render` prop was provided an invalid React element as `React.isValidElement(render)` is `false`.", "A valid React element must be provided to the `render` prop because it is cloned with props to replace the default element.", "https://base-ui.com/r/invalid-render-prop"].join("\n"));
1471 }
1472 }
1473 return /* @__PURE__ */ React7.cloneElement(newElement, mergedProps);
1474 }
1475 if (element) {
1476 if (typeof element === "string") {
1477 return renderTag(element, props);
1478 }
1479 }
1480 throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage_default(8));
1481 }
1482 function warnIfRenderPropLooksLikeComponent(renderFn) {
1483 const functionName = renderFn.name;
1484 if (functionName.length === 0) {
1485 return;
1486 }
1487 if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) {
1488 return;
1489 }
1490 if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) {
1491 return;
1492 }
1493 warn(`The \`render\` prop received a function named \`${functionName}\` that starts with an uppercase letter.`, "This usually means a React component was passed directly as `render={Component}`.", "Base UI calls `render` as a plain function, which can break the Rules of Hooks during reconciliation.", "If this is an intentional render callback, rename it to start with a lowercase letter.", "Use `render={<Component />}` or `render={(props) => <Component {...props} />}` instead.", "https://base-ui.com/r/invalid-render-prop");
1494 }
1495 function renderTag(Tag, props) {
1496 if (Tag === "button") {
1497 return /* @__PURE__ */ (0, import_react.createElement)("button", {
1498 type: "button",
1499 ...props,
1500 key: props.key
1501 });
1502 }
1503 if (Tag === "img") {
1504 return /* @__PURE__ */ (0, import_react.createElement)("img", {
1505 alt: "",
1506 ...props,
1507 key: props.key
1508 });
1509 }
1510 return /* @__PURE__ */ React7.createElement(Tag, props);
1511 }
1512
1513 // node_modules/@base-ui/utils/useId.mjs
1514 var React8 = __toESM(require_react(), 1);
1515 var globalId = 0;
1516 function useGlobalId(idOverride, prefix = "mui") {
1517 const [defaultId, setDefaultId] = React8.useState(idOverride);
1518 const id = idOverride || defaultId;
1519 React8.useEffect(() => {
1520 if (defaultId == null) {
1521 globalId += 1;
1522 setDefaultId(`${prefix}-${globalId}`);
1523 }
1524 }, [defaultId, prefix]);
1525 return id;
1526 }
1527 var maybeReactUseId = SafeReact.useId;
1528 function useId(idOverride, prefix) {
1529 if (maybeReactUseId !== void 0) {
1530 const reactId = maybeReactUseId();
1531 return idOverride ?? (prefix ? `${prefix}-${reactId}` : reactId);
1532 }
1533 return useGlobalId(idOverride, prefix);
1534 }
1535
1536 // node_modules/@base-ui/react/internals/useBaseUiId.mjs
1537 function useBaseUiId(idOverride) {
1538 return useId(idOverride, "base-ui");
1539 }
1540
1541 // node_modules/@base-ui/react/internals/reason-parts.mjs
1542 var reason_parts_exports = {};
1543 __export(reason_parts_exports, {
1544 cancelOpen: () => cancelOpen,
1545 chipRemovePress: () => chipRemovePress,
1546 clearPress: () => clearPress,
1547 closePress: () => closePress,
1548 closeWatcher: () => closeWatcher,
1549 decrementPress: () => decrementPress,
1550 disabled: () => disabled,
1551 drag: () => drag,
1552 escapeKey: () => escapeKey,
1553 focusOut: () => focusOut,
1554 imperativeAction: () => imperativeAction,
1555 incrementPress: () => incrementPress,
1556 initial: () => initial,
1557 inputBlur: () => inputBlur,
1558 inputChange: () => inputChange,
1559 inputClear: () => inputClear,
1560 inputPaste: () => inputPaste,
1561 inputPress: () => inputPress,
1562 itemPress: () => itemPress,
1563 keyboard: () => keyboard,
1564 linkPress: () => linkPress,
1565 listNavigation: () => listNavigation,
1566 missing: () => missing,
1567 none: () => none,
1568 outsidePress: () => outsidePress,
1569 pointer: () => pointer,
1570 scrub: () => scrub,
1571 siblingOpen: () => siblingOpen,
1572 swipe: () => swipe,
1573 trackPress: () => trackPress,
1574 triggerFocus: () => triggerFocus,
1575 triggerHover: () => triggerHover,
1576 triggerPress: () => triggerPress,
1577 wheel: () => wheel,
1578 windowResize: () => windowResize
1579 });
1580 var none = "none";
1581 var triggerPress = "trigger-press";
1582 var triggerHover = "trigger-hover";
1583 var triggerFocus = "trigger-focus";
1584 var outsidePress = "outside-press";
1585 var itemPress = "item-press";
1586 var closePress = "close-press";
1587 var linkPress = "link-press";
1588 var clearPress = "clear-press";
1589 var chipRemovePress = "chip-remove-press";
1590 var trackPress = "track-press";
1591 var incrementPress = "increment-press";
1592 var decrementPress = "decrement-press";
1593 var inputChange = "input-change";
1594 var inputClear = "input-clear";
1595 var inputBlur = "input-blur";
1596 var inputPaste = "input-paste";
1597 var inputPress = "input-press";
1598 var focusOut = "focus-out";
1599 var escapeKey = "escape-key";
1600 var closeWatcher = "close-watcher";
1601 var listNavigation = "list-navigation";
1602 var keyboard = "keyboard";
1603 var pointer = "pointer";
1604 var drag = "drag";
1605 var wheel = "wheel";
1606 var scrub = "scrub";
1607 var cancelOpen = "cancel-open";
1608 var siblingOpen = "sibling-open";
1609 var disabled = "disabled";
1610 var missing = "missing";
1611 var initial = "initial";
1612 var imperativeAction = "imperative-action";
1613 var swipe = "swipe";
1614 var windowResize = "window-resize";
1615
1616 // node_modules/@base-ui/react/internals/createBaseUIEventDetails.mjs
1617 function createChangeEventDetails(reason, event, trigger, customProperties) {
1618 let canceled = false;
1619 let allowPropagation = false;
1620 const custom = customProperties ?? EMPTY_OBJECT;
1621 const details = {
1622 reason,
1623 event: event ?? new Event("base-ui"),
1624 cancel() {
1625 canceled = true;
1626 },
1627 allowPropagation() {
1628 allowPropagation = true;
1629 },
1630 get isCanceled() {
1631 return canceled;
1632 },
1633 get isPropagationAllowed() {
1634 return allowPropagation;
1635 },
1636 trigger,
1637 ...custom
1638 };
1639 return details;
1640 }
1641
1642 // node_modules/@base-ui/react/internals/useTransitionStatus.mjs
1643 var React10 = __toESM(require_react(), 1);
1644
1645 // node_modules/@base-ui/utils/useOnMount.mjs
1646 var React9 = __toESM(require_react(), 1);
1647 var EMPTY = [];
1648 function useOnMount(fn) {
1649 React9.useEffect(fn, EMPTY);
1650 }
1651
1652 // node_modules/@base-ui/utils/useAnimationFrame.mjs
1653 var EMPTY2 = null;
1654 var LAST_RAF = globalThis.requestAnimationFrame;
1655 var Scheduler = class {
1656 /* This implementation uses an array as a backing data-structure for frame callbacks.
1657 * It allows `O(1)` callback cancelling by inserting a `null` in the array, though it
1658 * never calls the native `cancelAnimationFrame` if there are no frames left. This can
1659 * be much more efficient if there is a call pattern that alterns as
1660 * "request-cancel-request-cancel-…".
1661 * But in the case of "request-request-…-cancel-cancel-…", it leaves the final animation
1662 * frame to run anyway. We turn that frame into a `O(1)` no-op via `callbacksCount`. */
1663 callbacks = [];
1664 callbacksCount = 0;
1665 nextId = 1;
1666 startId = 1;
1667 isScheduled = false;
1668 tick = (timestamp) => {
1669 this.isScheduled = false;
1670 const currentCallbacks = this.callbacks;
1671 const currentCallbacksCount = this.callbacksCount;
1672 this.callbacks = [];
1673 this.callbacksCount = 0;
1674 this.startId = this.nextId;
1675 if (currentCallbacksCount > 0) {
1676 for (let i2 = 0; i2 < currentCallbacks.length; i2 += 1) {
1677 currentCallbacks[i2]?.(timestamp);
1678 }
1679 }
1680 };
1681 request(fn) {
1682 const id = this.nextId;
1683 this.nextId += 1;
1684 this.callbacks.push(fn);
1685 this.callbacksCount += 1;
1686 const didRAFChange = LAST_RAF !== requestAnimationFrame && (LAST_RAF = requestAnimationFrame, true);
1687 if (!this.isScheduled || didRAFChange) {
1688 requestAnimationFrame(this.tick);
1689 this.isScheduled = true;
1690 }
1691 return id;
1692 }
1693 cancel(id) {
1694 const index2 = id - this.startId;
1695 if (index2 < 0 || index2 >= this.callbacks.length) {
1696 return;
1697 }
1698 this.callbacks[index2] = null;
1699 this.callbacksCount -= 1;
1700 }
1701 };
1702 var scheduler = new Scheduler();
1703 var AnimationFrame = class _AnimationFrame {
1704 static create() {
1705 return new _AnimationFrame();
1706 }
1707 static request(fn) {
1708 return scheduler.request(fn);
1709 }
1710 static cancel(id) {
1711 return scheduler.cancel(id);
1712 }
1713 currentId = EMPTY2;
1714 /**
1715 * Executes `fn` after `delay`, clearing any previously scheduled call.
1716 */
1717 request(fn) {
1718 this.cancel();
1719 this.currentId = scheduler.request(() => {
1720 this.currentId = EMPTY2;
1721 fn();
1722 });
1723 }
1724 cancel = () => {
1725 if (this.currentId !== EMPTY2) {
1726 scheduler.cancel(this.currentId);
1727 this.currentId = EMPTY2;
1728 }
1729 };
1730 disposeEffect = () => {
1731 return this.cancel;
1732 };
1733 };
1734 function useAnimationFrame() {
1735 const timeout = useRefWithInit(AnimationFrame.create).current;
1736 useOnMount(timeout.disposeEffect);
1737 return timeout;
1738 }
1739
1740 // node_modules/@base-ui/react/internals/useTransitionStatus.mjs
1741 function useTransitionStatus(open, enableIdleState = false, deferEndingState = false) {
1742 const [transitionStatus, setTransitionStatus] = React10.useState(open && enableIdleState ? "idle" : void 0);
1743 const [mounted, setMounted] = React10.useState(open);
1744 if (open && !mounted) {
1745 setMounted(true);
1746 setTransitionStatus("starting");
1747 }
1748 if (!open && mounted && transitionStatus !== "ending" && !deferEndingState) {
1749 setTransitionStatus("ending");
1750 }
1751 if (!open && !mounted && transitionStatus === "ending") {
1752 setTransitionStatus(void 0);
1753 }
1754 useIsoLayoutEffect(() => {
1755 if (!open && mounted && transitionStatus !== "ending" && deferEndingState) {
1756 const frame = AnimationFrame.request(() => {
1757 setTransitionStatus("ending");
1758 });
1759 return () => {
1760 AnimationFrame.cancel(frame);
1761 };
1762 }
1763 return void 0;
1764 }, [open, mounted, transitionStatus, deferEndingState]);
1765 useIsoLayoutEffect(() => {
1766 if (!open || enableIdleState) {
1767 return void 0;
1768 }
1769 const frame = AnimationFrame.request(() => {
1770 setTransitionStatus(void 0);
1771 });
1772 return () => {
1773 AnimationFrame.cancel(frame);
1774 };
1775 }, [enableIdleState, open]);
1776 useIsoLayoutEffect(() => {
1777 if (!open || !enableIdleState) {
1778 return void 0;
1779 }
1780 if (open && mounted && transitionStatus !== "idle") {
1781 setTransitionStatus("starting");
1782 }
1783 const frame = AnimationFrame.request(() => {
1784 setTransitionStatus("idle");
1785 });
1786 return () => {
1787 AnimationFrame.cancel(frame);
1788 };
1789 }, [enableIdleState, open, mounted, transitionStatus]);
1790 return {
1791 mounted,
1792 setMounted,
1793 transitionStatus
1794 };
1795 }
1796
1797 // node_modules/@base-ui/react/internals/stateAttributesMapping.mjs
1798 var TransitionStatusDataAttributes = /* @__PURE__ */ (function(TransitionStatusDataAttributes2) {
1799 TransitionStatusDataAttributes2["startingStyle"] = "data-starting-style";
1800 TransitionStatusDataAttributes2["endingStyle"] = "data-ending-style";
1801 return TransitionStatusDataAttributes2;
1802 })({});
1803 var STARTING_HOOK = {
1804 [TransitionStatusDataAttributes.startingStyle]: ""
1805 };
1806 var ENDING_HOOK = {
1807 [TransitionStatusDataAttributes.endingStyle]: ""
1808 };
1809 var transitionStatusMapping = {
1810 transitionStatus(value) {
1811 if (value === "starting") {
1812 return STARTING_HOOK;
1813 }
1814 if (value === "ending") {
1815 return ENDING_HOOK;
1816 }
1817 return null;
1818 }
1819 };
1820
1821 // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
1822 function hasWindow() {
1823 return typeof window !== "undefined";
1824 }
1825 function getNodeName(node) {
1826 if (isNode(node)) {
1827 return (node.nodeName || "").toLowerCase();
1828 }
1829 return "#document";
1830 }
1831 function getWindow(node) {
1832 var _node$ownerDocument;
1833 return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;
1834 }
1835 function getDocumentElement(node) {
1836 var _ref;
1837 return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;
1838 }
1839 function isNode(value) {
1840 if (!hasWindow()) {
1841 return false;
1842 }
1843 return value instanceof Node || value instanceof getWindow(value).Node;
1844 }
1845 function isElement(value) {
1846 if (!hasWindow()) {
1847 return false;
1848 }
1849 return value instanceof Element || value instanceof getWindow(value).Element;
1850 }
1851 function isHTMLElement(value) {
1852 if (!hasWindow()) {
1853 return false;
1854 }
1855 return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;
1856 }
1857 function isShadowRoot(value) {
1858 if (!hasWindow() || typeof ShadowRoot === "undefined") {
1859 return false;
1860 }
1861 return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;
1862 }
1863 function isOverflowElement(element) {
1864 const {
1865 overflow,
1866 overflowX,
1867 overflowY,
1868 display
1869 } = getComputedStyle2(element);
1870 return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== "inline" && display !== "contents";
1871 }
1872 function isTableElement(element) {
1873 return /^(table|td|th)$/.test(getNodeName(element));
1874 }
1875 function isTopLayer(element) {
1876 try {
1877 if (element.matches(":popover-open")) {
1878 return true;
1879 }
1880 } catch (_e) {
1881 }
1882 try {
1883 return element.matches(":modal");
1884 } catch (_e) {
1885 return false;
1886 }
1887 }
1888 var willChangeRe = /transform|translate|scale|rotate|perspective|filter/;
1889 var containRe = /paint|layout|strict|content/;
1890 var isNotNone = (value) => !!value && value !== "none";
1891 var isWebKitValue;
1892 function isContainingBlock(elementOrCss) {
1893 const css = isElement(elementOrCss) ? getComputedStyle2(elementOrCss) : elementOrCss;
1894 return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || "") || containRe.test(css.contain || "");
1895 }
1896 function getContainingBlock(element) {
1897 let currentNode = getParentNode(element);
1898 while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {
1899 if (isContainingBlock(currentNode)) {
1900 return currentNode;
1901 } else if (isTopLayer(currentNode)) {
1902 return null;
1903 }
1904 currentNode = getParentNode(currentNode);
1905 }
1906 return null;
1907 }
1908 function isWebKit() {
1909 if (isWebKitValue == null) {
1910 isWebKitValue = typeof CSS !== "undefined" && CSS.supports && CSS.supports("-webkit-backdrop-filter", "none");
1911 }
1912 return isWebKitValue;
1913 }
1914 function isLastTraversableNode(node) {
1915 return /^(html|body|#document)$/.test(getNodeName(node));
1916 }
1917 function getComputedStyle2(element) {
1918 return getWindow(element).getComputedStyle(element);
1919 }
1920 function getNodeScroll(element) {
1921 if (isElement(element)) {
1922 return {
1923 scrollLeft: element.scrollLeft,
1924 scrollTop: element.scrollTop
1925 };
1926 }
1927 return {
1928 scrollLeft: element.scrollX,
1929 scrollTop: element.scrollY
1930 };
1931 }
1932 function getParentNode(node) {
1933 if (getNodeName(node) === "html") {
1934 return node;
1935 }
1936 const result = (
1937 // Step into the shadow DOM of the parent of a slotted node.
1938 node.assignedSlot || // DOM Element detected.
1939 node.parentNode || // ShadowRoot detected.
1940 isShadowRoot(node) && node.host || // Fallback.
1941 getDocumentElement(node)
1942 );
1943 return isShadowRoot(result) ? result.host : result;
1944 }
1945 function getNearestOverflowAncestor(node) {
1946 const parentNode = getParentNode(node);
1947 if (isLastTraversableNode(parentNode)) {
1948 return node.ownerDocument ? node.ownerDocument.body : node.body;
1949 }
1950 if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {
1951 return parentNode;
1952 }
1953 return getNearestOverflowAncestor(parentNode);
1954 }
1955 function getOverflowAncestors(node, list, traverseIframes) {
1956 var _node$ownerDocument2;
1957 if (list === void 0) {
1958 list = [];
1959 }
1960 if (traverseIframes === void 0) {
1961 traverseIframes = true;
1962 }
1963 const scrollableAncestor = getNearestOverflowAncestor(node);
1964 const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);
1965 const win = getWindow(scrollableAncestor);
1966 if (isBody) {
1967 const frameElement = getFrameElement(win);
1968 return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);
1969 } else {
1970 return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
1971 }
1972 }
1973 function getFrameElement(win) {
1974 return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
1975 }
1976
1977 // node_modules/@base-ui/utils/addEventListener.mjs
1978 function addEventListener(target, type, listener, options) {
1979 target.addEventListener(type, listener, options);
1980 return () => {
1981 target.removeEventListener(type, listener, options);
1982 };
1983 }
1984
1985 // node_modules/@base-ui/utils/useValueAsRef.mjs
1986 function useValueAsRef(value) {
1987 const latest = useRefWithInit(createLatestRef, value).current;
1988 latest.next = value;
1989 useIsoLayoutEffect(latest.effect);
1990 return latest;
1991 }
1992 function createLatestRef(value) {
1993 const latest = {
1994 current: value,
1995 next: value,
1996 effect: () => {
1997 latest.current = latest.next;
1998 }
1999 };
2000 return latest;
2001 }
2002
2003 // node_modules/@base-ui/utils/owner.mjs
2004 function ownerDocument(node) {
2005 return node?.ownerDocument || document;
2006 }
2007
2008 // node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs
2009 var React11 = __toESM(require_react(), 1);
2010
2011 // node_modules/@base-ui/react/internals/useAnimationsFinished.mjs
2012 var ReactDOM = __toESM(require_react_dom(), 1);
2013
2014 // node_modules/@base-ui/react/utils/resolveRef.mjs
2015 function resolveRef(maybeRef) {
2016 if (maybeRef == null) {
2017 return maybeRef;
2018 }
2019 return "current" in maybeRef ? maybeRef.current : maybeRef;
2020 }
2021
2022 // node_modules/@base-ui/react/internals/useAnimationsFinished.mjs
2023 function useAnimationsFinished(elementOrRef, waitForStartingStyleRemoved = false, treatAbortedAsFinished = true) {
2024 const frame = useAnimationFrame();
2025 return useStableCallback((fnToExecute, signal = null) => {
2026 frame.cancel();
2027 const element = resolveRef(elementOrRef);
2028 if (element == null) {
2029 return;
2030 }
2031 const resolvedElement = element;
2032 const done = () => {
2033 ReactDOM.flushSync(fnToExecute);
2034 };
2035 if (typeof resolvedElement.getAnimations !== "function" || globalThis.BASE_UI_ANIMATIONS_DISABLED) {
2036 fnToExecute();
2037 return;
2038 }
2039 function exec() {
2040 Promise.all(resolvedElement.getAnimations().map((animation) => animation.finished)).then(() => {
2041 if (!signal?.aborted) {
2042 done();
2043 }
2044 }).catch(() => {
2045 if (treatAbortedAsFinished) {
2046 if (!signal?.aborted) {
2047 done();
2048 }
2049 return;
2050 }
2051 const currentAnimations = resolvedElement.getAnimations();
2052 if (!signal?.aborted && currentAnimations.length > 0 && currentAnimations.some((animation) => animation.pending || animation.playState !== "finished")) {
2053 exec();
2054 }
2055 });
2056 }
2057 if (waitForStartingStyleRemoved) {
2058 const startingStyleAttribute = TransitionStatusDataAttributes.startingStyle;
2059 if (!resolvedElement.hasAttribute(startingStyleAttribute)) {
2060 frame.request(exec);
2061 return;
2062 }
2063 const attributeObserver = new MutationObserver(() => {
2064 if (!resolvedElement.hasAttribute(startingStyleAttribute)) {
2065 attributeObserver.disconnect();
2066 exec();
2067 }
2068 });
2069 attributeObserver.observe(resolvedElement, {
2070 attributes: true,
2071 attributeFilter: [startingStyleAttribute]
2072 });
2073 signal?.addEventListener("abort", () => attributeObserver.disconnect(), {
2074 once: true
2075 });
2076 return;
2077 }
2078 frame.request(exec);
2079 });
2080 }
2081
2082 // node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs
2083 function useOpenChangeComplete(parameters) {
2084 const {
2085 enabled = true,
2086 open,
2087 ref,
2088 onComplete: onCompleteParam
2089 } = parameters;
2090 const onComplete = useStableCallback(onCompleteParam);
2091 const runOnceAnimationsFinish = useAnimationsFinished(ref, open, false);
2092 React11.useEffect(() => {
2093 if (!enabled) {
2094 return void 0;
2095 }
2096 const abortController = new AbortController();
2097 runOnceAnimationsFinish(onComplete, abortController.signal);
2098 return () => {
2099 abortController.abort();
2100 };
2101 }, [enabled, open, onComplete, runOnceAnimationsFinish]);
2102 }
2103
2104 // node_modules/@base-ui/utils/useOnFirstRender.mjs
2105 var React12 = __toESM(require_react(), 1);
2106 function useOnFirstRender(fn) {
2107 const ref = React12.useRef(true);
2108 if (ref.current) {
2109 ref.current = false;
2110 fn();
2111 }
2112 }
2113
2114 // node_modules/@base-ui/utils/platform/parts.mjs
2115 var parts_exports = {};
2116 __export(parts_exports, {
2117 engine: () => engine_exports,
2118 env: () => env_exports,
2119 os: () => os_exports,
2120 screenReader: () => screen_reader_exports
2121 });
2122
2123 // node_modules/@base-ui/utils/platform/os.mjs
2124 var os_exports = {};
2125 __export(os_exports, {
2126 android: () => android,
2127 apple: () => apple,
2128 ios: () => ios,
2129 linux: () => linux,
2130 mac: () => mac,
2131 windows: () => windows
2132 });
2133
2134 // node_modules/@base-ui/utils/platform/shared.mjs
2135 function readRawData() {
2136 if (typeof navigator === "undefined") {
2137 return {
2138 userAgent: "",
2139 platform: "",
2140 maxTouchPoints: 0
2141 };
2142 }
2143 if (true) {
2144 const uaData = navigator.userAgentData;
2145 if (uaData && Array.isArray(uaData.brands)) {
2146 return {
2147 userAgent: uaData.brands.map(({
2148 brand,
2149 version: version2
2150 }) => `${brand}/${version2}`).join(" "),
2151 platform: uaData.platform ?? navigator.platform ?? "",
2152 maxTouchPoints: navigator.maxTouchPoints ?? 0
2153 };
2154 }
2155 }
2156 return {
2157 userAgent: navigator.userAgent,
2158 platform: navigator.platform ?? "",
2159 maxTouchPoints: navigator.maxTouchPoints ?? 0
2160 };
2161 }
2162 var {
2163 userAgent,
2164 platform,
2165 maxTouchPoints
2166 } = readRawData();
2167 var lowerUserAgent = userAgent.toLowerCase();
2168 var lowerPlatform = platform.toLowerCase();
2169
2170 // node_modules/@base-ui/utils/platform/os.mjs
2171 var ios = /^i(os$|p)/.test(lowerPlatform) || lowerPlatform === "macintel" && maxTouchPoints > 1;
2172 var ANDROID_STRING = "android";
2173 var android = lowerPlatform === ANDROID_STRING || lowerUserAgent.includes(ANDROID_STRING);
2174 var mac = !ios && lowerPlatform.startsWith("mac");
2175 var windows = lowerPlatform.startsWith("win");
2176 var linux = !android && /^(linux|chrome os)/.test(lowerPlatform);
2177 var apple = mac || ios;
2178
2179 // node_modules/@base-ui/utils/platform/engine.mjs
2180 var engine_exports = {};
2181 __export(engine_exports, {
2182 blink: () => blink,
2183 gecko: () => gecko,
2184 webkit: () => webkit
2185 });
2186 var webkit = typeof CSS !== "undefined" && !!CSS.supports?.("-webkit-backdrop-filter:none");
2187 var gecko = !webkit && lowerUserAgent.includes("firefox");
2188 var blink = !webkit && lowerUserAgent.includes("chrom");
2189
2190 // node_modules/@base-ui/utils/platform/screen-reader.mjs
2191 var screen_reader_exports = {};
2192 __export(screen_reader_exports, {
2193 voiceOver: () => voiceOver
2194 });
2195 var voiceOver = apple;
2196
2197 // node_modules/@base-ui/utils/platform/env.mjs
2198 var env_exports = {};
2199 __export(env_exports, {
2200 jsdom: () => jsdom
2201 });
2202 var jsdom = /jsdom|happydom/.test(lowerUserAgent);
2203
2204 // node_modules/@base-ui/utils/useTimeout.mjs
2205 var EMPTY3 = 0;
2206 var Timeout = class _Timeout {
2207 static create() {
2208 return new _Timeout();
2209 }
2210 currentId = EMPTY3;
2211 /**
2212 * Executes `fn` after `delay`, clearing any previously scheduled call.
2213 */
2214 start(delay, fn) {
2215 this.clear();
2216 this.currentId = setTimeout(() => {
2217 this.currentId = EMPTY3;
2218 fn();
2219 }, delay);
2220 }
2221 isStarted() {
2222 return this.currentId !== EMPTY3;
2223 }
2224 clear = () => {
2225 if (this.currentId !== EMPTY3) {
2226 clearTimeout(this.currentId);
2227 this.currentId = EMPTY3;
2228 }
2229 };
2230 disposeEffect = () => {
2231 return this.clear;
2232 };
2233 };
2234 function useTimeout() {
2235 const timeout = useRefWithInit(Timeout.create).current;
2236 useOnMount(timeout.disposeEffect);
2237 return timeout;
2238 }
2239
2240 // node_modules/@base-ui/react/floating-ui-react/components/FloatingDelayGroup.mjs
2241 var React13 = __toESM(require_react(), 1);
2242
2243 // node_modules/@base-ui/react/floating-ui-react/utils/event.mjs
2244 function isReactEvent(event) {
2245 return "nativeEvent" in event;
2246 }
2247 function isMouseLikePointerType(pointerType, strict) {
2248 const values = ["mouse", "pen"];
2249 if (!strict) {
2250 values.push("", void 0);
2251 }
2252 return values.includes(pointerType);
2253 }
2254 function isClickLikeEvent(event) {
2255 const type = event.type;
2256 return type === "click" || type === "mousedown" || type === "keydown" || type === "keyup";
2257 }
2258
2259 // node_modules/@base-ui/react/floating-ui-react/utils/constants.mjs
2260 var FOCUSABLE_ATTRIBUTE = "data-base-ui-focusable";
2261 var TYPEABLE_SELECTOR = "input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])";
2262
2263 // node_modules/@base-ui/react/internals/shadowDom.mjs
2264 function activeElement(doc) {
2265 let element = doc.activeElement;
2266 while (element?.shadowRoot?.activeElement != null) {
2267 element = element.shadowRoot.activeElement;
2268 }
2269 return element;
2270 }
2271 function contains(parent, child) {
2272 if (!parent || !child) {
2273 return false;
2274 }
2275 const rootNode = child.getRootNode?.();
2276 if (parent.contains(child)) {
2277 return true;
2278 }
2279 if (rootNode && isShadowRoot(rootNode)) {
2280 let next = child;
2281 while (next) {
2282 if (parent === next) {
2283 return true;
2284 }
2285 next = next.parentNode || next.host;
2286 }
2287 }
2288 return false;
2289 }
2290 function getTarget(event) {
2291 if ("composedPath" in event) {
2292 return event.composedPath()[0];
2293 }
2294 return event.target;
2295 }
2296
2297 // node_modules/@base-ui/react/floating-ui-react/utils/element.mjs
2298 function isTargetInsideEnabledTrigger(target, triggerElements) {
2299 if (!isElement(target)) {
2300 return false;
2301 }
2302 const targetElement = target;
2303 if (triggerElements.hasElement(targetElement)) {
2304 return !targetElement.hasAttribute("data-trigger-disabled");
2305 }
2306 for (const [, trigger] of triggerElements.entries()) {
2307 if (contains(trigger, targetElement)) {
2308 return !trigger.hasAttribute("data-trigger-disabled");
2309 }
2310 }
2311 return false;
2312 }
2313 function isEventTargetWithin(event, node) {
2314 if (node == null) {
2315 return false;
2316 }
2317 if ("composedPath" in event) {
2318 return event.composedPath().includes(node);
2319 }
2320 const eventAgain = event;
2321 return eventAgain.target != null && node.contains(eventAgain.target);
2322 }
2323 function isRootElement(element) {
2324 return element.matches("html,body");
2325 }
2326 function isTypeableElement(element) {
2327 return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);
2328 }
2329 function isInteractiveElement(element) {
2330 return element?.closest(`button,a[href],[role="button"],select,[tabindex]:not([tabindex="-1"]),${TYPEABLE_SELECTOR}`) != null;
2331 }
2332 function matchesFocusVisible(element) {
2333 if (!element || parts_exports.env.jsdom) {
2334 return true;
2335 }
2336 try {
2337 return element.matches(":focus-visible");
2338 } catch (_e) {
2339 return true;
2340 }
2341 }
2342
2343 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverShared.mjs
2344 function resolveValue(value, pointerType) {
2345 if (pointerType != null && !isMouseLikePointerType(pointerType)) {
2346 return 0;
2347 }
2348 if (typeof value === "function") {
2349 return value();
2350 }
2351 return value;
2352 }
2353 function getDelay(value, prop, pointerType) {
2354 const result = resolveValue(value, pointerType);
2355 if (typeof result === "number") {
2356 return result;
2357 }
2358 return result?.[prop];
2359 }
2360 function getRestMs(value) {
2361 if (typeof value === "function") {
2362 return value();
2363 }
2364 return value;
2365 }
2366 function isClickLikeOpenEvent(openEventType, interactedInside) {
2367 return interactedInside || openEventType === "click" || openEventType === "mousedown";
2368 }
2369 function isHoverOpenEvent(openEventType) {
2370 return openEventType?.includes("mouse") && openEventType !== "mousedown";
2371 }
2372
2373 // node_modules/@base-ui/react/floating-ui-react/components/FloatingDelayGroup.mjs
2374 var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
2375 var FloatingDelayGroupContext = /* @__PURE__ */ React13.createContext({
2376 hasProvider: false,
2377 timeoutMs: 0,
2378 delayRef: {
2379 current: 0
2380 },
2381 initialDelayRef: {
2382 current: 0
2383 },
2384 timeout: new Timeout(),
2385 currentIdRef: {
2386 current: null
2387 },
2388 currentContextRef: {
2389 current: null
2390 }
2391 });
2392 if (true) FloatingDelayGroupContext.displayName = "FloatingDelayGroupContext";
2393 function resetDelayRef(delayRef, initialDelayRef) {
2394 delayRef.current = initialDelayRef.current;
2395 }
2396 function FloatingDelayGroup(props) {
2397 const {
2398 children,
2399 delay,
2400 timeoutMs = 0
2401 } = props;
2402 const delayRef = React13.useRef(delay);
2403 const initialDelayRef = React13.useRef(delay);
2404 const currentIdRef = React13.useRef(null);
2405 const currentContextRef = React13.useRef(null);
2406 const timeout = useTimeout();
2407 useIsoLayoutEffect(() => {
2408 initialDelayRef.current = delay;
2409 if (!currentIdRef.current) {
2410 delayRef.current = delay;
2411 return;
2412 }
2413 delayRef.current = {
2414 open: getDelay(delayRef.current, "open"),
2415 close: getDelay(delay, "close")
2416 };
2417 }, [delay, currentIdRef, delayRef, initialDelayRef]);
2418 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(FloatingDelayGroupContext.Provider, {
2419 value: React13.useMemo(() => ({
2420 hasProvider: true,
2421 delayRef,
2422 initialDelayRef,
2423 currentIdRef,
2424 timeoutMs,
2425 currentContextRef,
2426 timeout
2427 }), [timeoutMs, timeout]),
2428 children
2429 });
2430 }
2431 function useDelayGroup(context, options = {
2432 open: false
2433 }) {
2434 const {
2435 open
2436 } = options;
2437 const store = "rootStore" in context ? context.rootStore : context;
2438 const floatingId = store.useState("floatingId");
2439 const groupContext = React13.useContext(FloatingDelayGroupContext);
2440 const {
2441 currentIdRef,
2442 delayRef,
2443 timeoutMs,
2444 initialDelayRef,
2445 currentContextRef,
2446 hasProvider,
2447 timeout
2448 } = groupContext;
2449 const [isInstantPhase, setIsInstantPhase] = React13.useState(false);
2450 const openRef = React13.useRef(open);
2451 const isUnmountedRef = React13.useRef(false);
2452 useIsoLayoutEffect(() => {
2453 openRef.current = open;
2454 }, [open]);
2455 useIsoLayoutEffect(() => {
2456 return () => {
2457 isUnmountedRef.current = true;
2458 };
2459 }, []);
2460 useIsoLayoutEffect(() => {
2461 function unset() {
2462 if (!isUnmountedRef.current) {
2463 setIsInstantPhase(false);
2464 }
2465 currentContextRef.current?.setIsInstantPhase(false);
2466 currentIdRef.current = null;
2467 currentContextRef.current = null;
2468 delayRef.current = initialDelayRef.current;
2469 timeout.clear();
2470 }
2471 if (!currentIdRef.current) {
2472 return void 0;
2473 }
2474 if (!open && currentIdRef.current === floatingId) {
2475 setIsInstantPhase(false);
2476 if (timeoutMs) {
2477 const closingId = floatingId;
2478 timeout.start(timeoutMs, () => {
2479 if (store.select("open") || currentIdRef.current && currentIdRef.current !== closingId) {
2480 return;
2481 }
2482 unset();
2483 });
2484 return () => {
2485 if (openRef.current || currentIdRef.current !== closingId) {
2486 timeout.clear();
2487 }
2488 };
2489 }
2490 unset();
2491 }
2492 return void 0;
2493 }, [open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeout, store]);
2494 useIsoLayoutEffect(() => {
2495 if (!open) {
2496 return;
2497 }
2498 const prevContext = currentContextRef.current;
2499 const prevId = currentIdRef.current;
2500 timeout.clear();
2501 currentContextRef.current = {
2502 onOpenChange: store.setOpen,
2503 setIsInstantPhase
2504 };
2505 currentIdRef.current = floatingId;
2506 delayRef.current = {
2507 open: 0,
2508 close: getDelay(initialDelayRef.current, "close")
2509 };
2510 if (prevId !== null && prevId !== floatingId) {
2511 setIsInstantPhase(true);
2512 prevContext?.setIsInstantPhase(true);
2513 prevContext?.onOpenChange(false, createChangeEventDetails(reason_parts_exports.none));
2514 } else {
2515 setIsInstantPhase(false);
2516 prevContext?.setIsInstantPhase(false);
2517 }
2518 }, [open, floatingId, store, currentIdRef, delayRef, initialDelayRef, currentContextRef, timeout]);
2519 useIsoLayoutEffect(() => {
2520 return () => {
2521 if (currentIdRef.current === floatingId) {
2522 currentContextRef.current = null;
2523 if (!openRef.current) {
2524 return;
2525 }
2526 currentIdRef.current = null;
2527 resetDelayRef(delayRef, initialDelayRef);
2528 timeout.clear();
2529 }
2530 };
2531 }, [currentContextRef, currentIdRef, delayRef, floatingId, initialDelayRef, timeout]);
2532 return React13.useMemo(() => ({
2533 hasProvider,
2534 delayRef,
2535 isInstantPhase
2536 }), [hasProvider, delayRef, isInstantPhase]);
2537 }
2538
2539 // node_modules/@base-ui/utils/mergeCleanups.mjs
2540 function mergeCleanups(...cleanups) {
2541 return () => {
2542 for (let i2 = 0; i2 < cleanups.length; i2 += 1) {
2543 const cleanup = cleanups[i2];
2544 if (cleanup) {
2545 cleanup();
2546 }
2547 }
2548 };
2549 }
2550
2551 // node_modules/@base-ui/react/utils/FocusGuard.mjs
2552 var React14 = __toESM(require_react(), 1);
2553
2554 // node_modules/@base-ui/utils/visuallyHidden.mjs
2555 var visuallyHiddenBase = {
2556 clipPath: "inset(50%)",
2557 overflow: "hidden",
2558 whiteSpace: "nowrap",
2559 border: 0,
2560 padding: 0,
2561 width: 1,
2562 height: 1,
2563 margin: -1
2564 };
2565 var visuallyHidden = {
2566 ...visuallyHiddenBase,
2567 position: "fixed",
2568 top: 0,
2569 left: 0
2570 };
2571 var visuallyHiddenInput = {
2572 ...visuallyHiddenBase,
2573 position: "absolute"
2574 };
2575
2576 // node_modules/@base-ui/react/utils/FocusGuard.mjs
2577 var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
2578 var FocusGuard = /* @__PURE__ */ React14.forwardRef(function FocusGuard2(props, ref) {
2579 const [role, setRole] = React14.useState();
2580 useIsoLayoutEffect(() => {
2581 if (parts_exports.screenReader.voiceOver && parts_exports.engine.webkit) {
2582 setRole("button");
2583 }
2584 }, []);
2585 const restProps = {
2586 tabIndex: 0,
2587 // Role is only for VoiceOver
2588 role
2589 };
2590 return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", {
2591 ...props,
2592 ref,
2593 style: visuallyHidden,
2594 "aria-hidden": role ? void 0 : true,
2595 ...restProps,
2596 "data-base-ui-focus-guard": ""
2597 });
2598 });
2599 if (true) FocusGuard.displayName = "FocusGuard";
2600
2601 // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
2602 var sides = ["top", "right", "bottom", "left"];
2603 var min = Math.min;
2604 var max = Math.max;
2605 var round = Math.round;
2606 var floor = Math.floor;
2607 var createCoords = (v2) => ({
2608 x: v2,
2609 y: v2
2610 });
2611 var oppositeSideMap = {
2612 left: "right",
2613 right: "left",
2614 bottom: "top",
2615 top: "bottom"
2616 };
2617 function clamp(start, value, end) {
2618 return max(start, min(value, end));
2619 }
2620 function evaluate(value, param) {
2621 return typeof value === "function" ? value(param) : value;
2622 }
2623 function getSide(placement) {
2624 return placement.split("-")[0];
2625 }
2626 function getAlignment(placement) {
2627 return placement.split("-")[1];
2628 }
2629 function getOppositeAxis(axis) {
2630 return axis === "x" ? "y" : "x";
2631 }
2632 function getAxisLength(axis) {
2633 return axis === "y" ? "height" : "width";
2634 }
2635 function getSideAxis(placement) {
2636 const firstChar = placement[0];
2637 return firstChar === "t" || firstChar === "b" ? "y" : "x";
2638 }
2639 function getAlignmentAxis(placement) {
2640 return getOppositeAxis(getSideAxis(placement));
2641 }
2642 function getAlignmentSides(placement, rects, rtl) {
2643 if (rtl === void 0) {
2644 rtl = false;
2645 }
2646 const alignment = getAlignment(placement);
2647 const alignmentAxis = getAlignmentAxis(placement);
2648 const length = getAxisLength(alignmentAxis);
2649 let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top";
2650 if (rects.reference[length] > rects.floating[length]) {
2651 mainAlignmentSide = getOppositePlacement(mainAlignmentSide);
2652 }
2653 return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];
2654 }
2655 function getExpandedPlacements(placement) {
2656 const oppositePlacement = getOppositePlacement(placement);
2657 return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];
2658 }
2659 function getOppositeAlignmentPlacement(placement) {
2660 return placement.includes("start") ? placement.replace("start", "end") : placement.replace("end", "start");
2661 }
2662 var lrPlacement = ["left", "right"];
2663 var rlPlacement = ["right", "left"];
2664 var tbPlacement = ["top", "bottom"];
2665 var btPlacement = ["bottom", "top"];
2666 function getSideList(side, isStart, rtl) {
2667 switch (side) {
2668 case "top":
2669 case "bottom":
2670 if (rtl) return isStart ? rlPlacement : lrPlacement;
2671 return isStart ? lrPlacement : rlPlacement;
2672 case "left":
2673 case "right":
2674 return isStart ? tbPlacement : btPlacement;
2675 default:
2676 return [];
2677 }
2678 }
2679 function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
2680 const alignment = getAlignment(placement);
2681 let list = getSideList(getSide(placement), direction === "start", rtl);
2682 if (alignment) {
2683 list = list.map((side) => side + "-" + alignment);
2684 if (flipAlignment) {
2685 list = list.concat(list.map(getOppositeAlignmentPlacement));
2686 }
2687 }
2688 return list;
2689 }
2690 function getOppositePlacement(placement) {
2691 const side = getSide(placement);
2692 return oppositeSideMap[side] + placement.slice(side.length);
2693 }
2694 function expandPaddingObject(padding) {
2695 return {
2696 top: 0,
2697 right: 0,
2698 bottom: 0,
2699 left: 0,
2700 ...padding
2701 };
2702 }
2703 function getPaddingObject(padding) {
2704 return typeof padding !== "number" ? expandPaddingObject(padding) : {
2705 top: padding,
2706 right: padding,
2707 bottom: padding,
2708 left: padding
2709 };
2710 }
2711 function rectToClientRect(rect) {
2712 const {
2713 x: x2,
2714 y: y2,
2715 width,
2716 height
2717 } = rect;
2718 return {
2719 width,
2720 height,
2721 top: y2,
2722 left: x2,
2723 right: x2 + width,
2724 bottom: y2 + height,
2725 x: x2,
2726 y: y2
2727 };
2728 }
2729
2730 // node_modules/@base-ui/react/floating-ui-react/utils/composite.mjs
2731 function isHiddenByStyles(styles) {
2732 return styles.visibility === "hidden" || styles.visibility === "collapse";
2733 }
2734 function isElementVisible(element, styles = element ? getComputedStyle2(element) : null) {
2735 if (!element || !element.isConnected || !styles || isHiddenByStyles(styles)) {
2736 return false;
2737 }
2738 if (typeof element.checkVisibility === "function") {
2739 return element.checkVisibility();
2740 }
2741 return styles.display !== "none" && styles.display !== "contents";
2742 }
2743
2744 // node_modules/@base-ui/react/floating-ui-react/utils/tabbable.mjs
2745 var CANDIDATE_SELECTOR = 'a[href],button,input,select,textarea,summary,details,iframe,object,embed,[tabindex],[contenteditable]:not([contenteditable="false"]),audio[controls],video[controls]';
2746 function getParentElement(element) {
2747 const assignedSlot = element.assignedSlot;
2748 if (assignedSlot) {
2749 return assignedSlot;
2750 }
2751 if (element.parentElement) {
2752 return element.parentElement;
2753 }
2754 const rootNode = element.getRootNode();
2755 return isShadowRoot(rootNode) ? rootNode.host : null;
2756 }
2757 function getDetailsSummary(details) {
2758 for (const child of Array.from(details.children)) {
2759 if (getNodeName(child) === "summary") {
2760 return child;
2761 }
2762 }
2763 return null;
2764 }
2765 function isWithinOpenDetailsSummary(element, details) {
2766 const summary = getDetailsSummary(details);
2767 return !!summary && (element === summary || contains(summary, element));
2768 }
2769 function isFocusableCandidate(element) {
2770 const nodeName = element ? getNodeName(element) : "";
2771 return element != null && element.matches(CANDIDATE_SELECTOR) && (nodeName !== "summary" || element.parentElement != null && getNodeName(element.parentElement) === "details" && getDetailsSummary(element.parentElement) === element) && (nodeName !== "details" || getDetailsSummary(element) == null) && (nodeName !== "input" || element.type !== "hidden");
2772 }
2773 function isFocusableElement(element) {
2774 if (!isFocusableCandidate(element) || !element.isConnected || element.matches(":disabled")) {
2775 return false;
2776 }
2777 for (let current = element; current; current = getParentElement(current)) {
2778 const isAncestor = current !== element;
2779 const isSlot = getNodeName(current) === "slot";
2780 if (current.hasAttribute("inert")) {
2781 return false;
2782 }
2783 if (isAncestor && getNodeName(current) === "details" && !current.open && !isWithinOpenDetailsSummary(element, current) || current.hasAttribute("hidden") || !isSlot && !isVisibleInTabbableTree(current, isAncestor)) {
2784 return false;
2785 }
2786 }
2787 return true;
2788 }
2789 function isVisibleInTabbableTree(element, isAncestor) {
2790 const styles = getComputedStyle2(element);
2791 if (!isAncestor) {
2792 return isElementVisible(element, styles);
2793 }
2794 return styles.display !== "none";
2795 }
2796 function getTabIndex(element) {
2797 const tabIndex = element.tabIndex;
2798 if (tabIndex < 0) {
2799 const nodeName = getNodeName(element);
2800 if (nodeName === "details" || nodeName === "audio" || nodeName === "video" || isHTMLElement(element) && element.isContentEditable) {
2801 return 0;
2802 }
2803 }
2804 return tabIndex;
2805 }
2806 function getNamedRadioInput(element) {
2807 if (getNodeName(element) !== "input") {
2808 return null;
2809 }
2810 const input = element;
2811 return input.type === "radio" && input.name !== "" ? input : null;
2812 }
2813 function isTabbableRadio(element, candidates) {
2814 const input = getNamedRadioInput(element);
2815 if (!input) {
2816 return true;
2817 }
2818 const checkedRadio = candidates.find((candidate) => {
2819 const radio = getNamedRadioInput(candidate);
2820 return radio?.name === input.name && radio.form === input.form && radio.checked;
2821 });
2822 if (checkedRadio) {
2823 return checkedRadio === input;
2824 }
2825 return candidates.find((candidate) => {
2826 const radio = getNamedRadioInput(candidate);
2827 return radio?.name === input.name && radio.form === input.form;
2828 }) === input;
2829 }
2830 function getComposedChildren(container) {
2831 if (isHTMLElement(container) && getNodeName(container) === "slot") {
2832 const assignedElements = container.assignedElements({
2833 flatten: true
2834 });
2835 if (assignedElements.length > 0) {
2836 return assignedElements;
2837 }
2838 }
2839 if (isHTMLElement(container) && container.shadowRoot) {
2840 return Array.from(container.shadowRoot.children);
2841 }
2842 return Array.from(container.children);
2843 }
2844 function appendCandidates(container, list) {
2845 getComposedChildren(container).forEach((child) => {
2846 if (isFocusableCandidate(child)) {
2847 list.push(child);
2848 }
2849 appendCandidates(child, list);
2850 });
2851 }
2852 function appendMatchingElements(container, selector2, list) {
2853 getComposedChildren(container).forEach((child) => {
2854 if (isHTMLElement(child) && child.matches(selector2)) {
2855 list.push(child);
2856 }
2857 appendMatchingElements(child, selector2, list);
2858 });
2859 }
2860 function focusable(container) {
2861 const candidates = [];
2862 appendCandidates(container, candidates);
2863 return candidates.filter(isFocusableElement);
2864 }
2865 function tabbable(container) {
2866 const candidates = focusable(container);
2867 return candidates.filter((element) => getTabIndex(element) >= 0 && isTabbableRadio(element, candidates));
2868 }
2869 function getTabbableIn(container, dir) {
2870 const list = tabbable(container);
2871 const len = list.length;
2872 if (len === 0) {
2873 return void 0;
2874 }
2875 const active = activeElement(ownerDocument(container));
2876 const index2 = list.indexOf(active);
2877 const nextIndex = index2 === -1 ? dir === 1 ? 0 : len - 1 : index2 + dir;
2878 return list[nextIndex];
2879 }
2880 function getNextTabbable(referenceElement) {
2881 return getTabbableIn(ownerDocument(referenceElement).body, 1) || referenceElement;
2882 }
2883 function getPreviousTabbable(referenceElement) {
2884 return getTabbableIn(ownerDocument(referenceElement).body, -1) || referenceElement;
2885 }
2886 function isOutsideEvent(event, container) {
2887 const containerElement = container || event.currentTarget;
2888 const relatedTarget = event.relatedTarget;
2889 return !relatedTarget || !contains(containerElement, relatedTarget);
2890 }
2891 function disableFocusInside(container) {
2892 const tabbableElements = tabbable(container);
2893 tabbableElements.forEach((element) => {
2894 element.dataset.tabindex = element.getAttribute("tabindex") || "";
2895 element.setAttribute("tabindex", "-1");
2896 });
2897 }
2898 function enableFocusInside(container) {
2899 const elements = [];
2900 appendMatchingElements(container, "[data-tabindex]", elements);
2901 elements.forEach((element) => {
2902 const tabindex = element.dataset.tabindex;
2903 delete element.dataset.tabindex;
2904 if (tabindex) {
2905 element.setAttribute("tabindex", tabindex);
2906 } else {
2907 element.removeAttribute("tabindex");
2908 }
2909 });
2910 }
2911
2912 // node_modules/@base-ui/react/floating-ui-react/utils/nodes.mjs
2913 function getNodeChildren(nodes, id, onlyOpenChildren = true) {
2914 const directChildren = nodes.filter((node) => node.parentId === id);
2915 return directChildren.flatMap((child) => [...!onlyOpenChildren || child.context?.open ? [child] : [], ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);
2916 }
2917
2918 // node_modules/@base-ui/react/floating-ui-react/utils/createAttribute.mjs
2919 function createAttribute(name) {
2920 return `data-base-ui-${name}`;
2921 }
2922
2923 // node_modules/@base-ui/react/floating-ui-react/components/FloatingPortal.mjs
2924 var React15 = __toESM(require_react(), 1);
2925 var ReactDOM2 = __toESM(require_react_dom(), 1);
2926
2927 // node_modules/@base-ui/react/internals/constants.mjs
2928 var DISABLED_TRANSITIONS_STYLE = {
2929 style: {
2930 transition: "none"
2931 }
2932 };
2933 var BASE_UI_SWIPE_IGNORE_ATTRIBUTE = "data-base-ui-swipe-ignore";
2934 var LEGACY_SWIPE_IGNORE_ATTRIBUTE = "data-swipe-ignore";
2935 var BASE_UI_SWIPE_IGNORE_SELECTOR = `[${BASE_UI_SWIPE_IGNORE_ATTRIBUTE}]`;
2936 var LEGACY_SWIPE_IGNORE_SELECTOR = `[${LEGACY_SWIPE_IGNORE_ATTRIBUTE}]`;
2937 var POPUP_COLLISION_AVOIDANCE = {
2938 fallbackAxisSide: "end"
2939 };
2940 var ownerVisuallyHidden = {
2941 clipPath: "inset(50%)",
2942 position: "fixed",
2943 top: 0,
2944 left: 0
2945 };
2946
2947 // node_modules/@base-ui/react/floating-ui-react/components/FloatingPortal.mjs
2948 var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1);
2949 var PortalContext = /* @__PURE__ */ React15.createContext(null);
2950 if (true) PortalContext.displayName = "PortalContext";
2951 var usePortalContext = () => React15.useContext(PortalContext);
2952 var attr = createAttribute("portal");
2953 function useFloatingPortalNode(props = {}) {
2954 const {
2955 ref,
2956 container: containerProp,
2957 componentProps = EMPTY_OBJECT,
2958 elementProps
2959 } = props;
2960 const uniqueId = useId();
2961 const portalContext = usePortalContext();
2962 const parentPortalNode = portalContext?.portalNode;
2963 const [containerElement, setContainerElement] = React15.useState(null);
2964 const [portalNode, setPortalNode] = React15.useState(null);
2965 const setPortalNodeRef = useStableCallback((node) => {
2966 if (node !== null) {
2967 setPortalNode(node);
2968 }
2969 });
2970 const containerRef = React15.useRef(null);
2971 useIsoLayoutEffect(() => {
2972 if (containerProp === null) {
2973 if (containerRef.current) {
2974 containerRef.current = null;
2975 setPortalNode(null);
2976 setContainerElement(null);
2977 }
2978 return;
2979 }
2980 if (uniqueId == null) {
2981 return;
2982 }
2983 const resolvedContainer = (containerProp && (isNode(containerProp) ? containerProp : containerProp.current)) ?? parentPortalNode ?? document.body;
2984 if (resolvedContainer == null) {
2985 if (containerRef.current) {
2986 containerRef.current = null;
2987 setPortalNode(null);
2988 setContainerElement(null);
2989 }
2990 return;
2991 }
2992 if (containerRef.current !== resolvedContainer) {
2993 containerRef.current = resolvedContainer;
2994 setPortalNode(null);
2995 setContainerElement(resolvedContainer);
2996 }
2997 }, [containerProp, parentPortalNode, uniqueId]);
2998 const portalElement = useRenderElement("div", componentProps, {
2999 ref: [ref, setPortalNodeRef],
3000 props: [{
3001 id: uniqueId,
3002 [attr]: ""
3003 }, elementProps]
3004 });
3005 const portalSubtree = containerElement && portalElement ? /* @__PURE__ */ ReactDOM2.createPortal(portalElement, containerElement) : null;
3006 return {
3007 portalNode,
3008 portalSubtree
3009 };
3010 }
3011 var FloatingPortal = /* @__PURE__ */ React15.forwardRef(function FloatingPortal2(componentProps, forwardedRef) {
3012 const {
3013 render: render4,
3014 className,
3015 style,
3016 children,
3017 container,
3018 renderGuards,
3019 ...elementProps
3020 } = componentProps;
3021 const {
3022 portalNode,
3023 portalSubtree
3024 } = useFloatingPortalNode({
3025 container,
3026 ref: forwardedRef,
3027 componentProps,
3028 elementProps
3029 });
3030 const beforeOutsideRef = React15.useRef(null);
3031 const afterOutsideRef = React15.useRef(null);
3032 const beforeInsideRef = React15.useRef(null);
3033 const afterInsideRef = React15.useRef(null);
3034 const [focusManagerState, setFocusManagerState] = React15.useState(null);
3035 const focusInsideDisabledRef = React15.useRef(false);
3036 const modal = focusManagerState?.modal;
3037 const open = focusManagerState?.open;
3038 const shouldRenderGuards = typeof renderGuards === "boolean" ? renderGuards : !!focusManagerState && !focusManagerState.modal && focusManagerState.open && !!portalNode;
3039 React15.useEffect(() => {
3040 if (!portalNode || modal) {
3041 return void 0;
3042 }
3043 function onFocus(event) {
3044 if (portalNode && event.relatedTarget && isOutsideEvent(event)) {
3045 if (event.type === "focusin") {
3046 if (focusInsideDisabledRef.current) {
3047 enableFocusInside(portalNode);
3048 focusInsideDisabledRef.current = false;
3049 }
3050 } else {
3051 disableFocusInside(portalNode);
3052 focusInsideDisabledRef.current = true;
3053 }
3054 }
3055 }
3056 return mergeCleanups(addEventListener(portalNode, "focusin", onFocus, true), addEventListener(portalNode, "focusout", onFocus, true));
3057 }, [portalNode, modal]);
3058 useIsoLayoutEffect(() => {
3059 if (!portalNode || open !== true || !focusInsideDisabledRef.current) {
3060 return;
3061 }
3062 enableFocusInside(portalNode);
3063 focusInsideDisabledRef.current = false;
3064 }, [open, portalNode]);
3065 const portalContextValue = React15.useMemo(() => ({
3066 beforeOutsideRef,
3067 afterOutsideRef,
3068 beforeInsideRef,
3069 afterInsideRef,
3070 portalNode,
3071 setFocusManagerState
3072 }), [portalNode]);
3073 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(React15.Fragment, {
3074 children: [portalSubtree, /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(PortalContext.Provider, {
3075 value: portalContextValue,
3076 children: [shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FocusGuard, {
3077 "data-type": "outside",
3078 ref: beforeOutsideRef,
3079 onFocus: (event) => {
3080 if (isOutsideEvent(event, portalNode)) {
3081 beforeInsideRef.current?.focus();
3082 } else {
3083 const domReference = focusManagerState ? focusManagerState.domReference : null;
3084 const prevTabbable = getPreviousTabbable(domReference);
3085 prevTabbable?.focus();
3086 }
3087 }
3088 }), shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", {
3089 "aria-owns": portalNode.id,
3090 style: ownerVisuallyHidden
3091 }), portalNode && /* @__PURE__ */ ReactDOM2.createPortal(children, portalNode), shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FocusGuard, {
3092 "data-type": "outside",
3093 ref: afterOutsideRef,
3094 onFocus: (event) => {
3095 if (isOutsideEvent(event, portalNode)) {
3096 afterInsideRef.current?.focus();
3097 } else {
3098 const domReference = focusManagerState ? focusManagerState.domReference : null;
3099 const nextTabbable = getNextTabbable(domReference);
3100 nextTabbable?.focus();
3101 if (focusManagerState?.closeOnFocusOut) {
3102 focusManagerState?.onOpenChange(false, createChangeEventDetails(reason_parts_exports.focusOut, event.nativeEvent));
3103 }
3104 }
3105 }
3106 })]
3107 })]
3108 });
3109 });
3110 if (true) FloatingPortal.displayName = "FloatingPortal";
3111
3112 // node_modules/@base-ui/react/floating-ui-react/components/FloatingTree.mjs
3113 var React16 = __toESM(require_react(), 1);
3114
3115 // node_modules/@base-ui/react/floating-ui-react/utils/createEventEmitter.mjs
3116 function createEventEmitter() {
3117 const map = /* @__PURE__ */ new Map();
3118 return {
3119 emit(event, data) {
3120 map.get(event)?.forEach((listener) => listener(data));
3121 },
3122 on(event, listener) {
3123 if (!map.has(event)) {
3124 map.set(event, /* @__PURE__ */ new Set());
3125 }
3126 map.get(event).add(listener);
3127 },
3128 off(event, listener) {
3129 map.get(event)?.delete(listener);
3130 }
3131 };
3132 }
3133
3134 // node_modules/@base-ui/react/floating-ui-react/components/FloatingTree.mjs
3135 var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1);
3136 var FloatingNodeContext = /* @__PURE__ */ React16.createContext(null);
3137 if (true) FloatingNodeContext.displayName = "FloatingNodeContext";
3138 var FloatingTreeContext = /* @__PURE__ */ React16.createContext(null);
3139 if (true) FloatingTreeContext.displayName = "FloatingTreeContext";
3140 var useFloatingParentNodeId = () => React16.useContext(FloatingNodeContext)?.id || null;
3141 var useFloatingTree = (externalTree) => {
3142 const contextTree = React16.useContext(FloatingTreeContext);
3143 return externalTree ?? contextTree;
3144 };
3145
3146 // node_modules/@base-ui/react/floating-ui-react/hooks/useClientPoint.mjs
3147 var React17 = __toESM(require_react(), 1);
3148 function createVirtualElement(domElement, data) {
3149 let offsetX = null;
3150 let offsetY = null;
3151 let isAutoUpdateEvent = false;
3152 return {
3153 contextElement: domElement || void 0,
3154 getBoundingClientRect() {
3155 const domRect = domElement?.getBoundingClientRect() || {
3156 width: 0,
3157 height: 0,
3158 x: 0,
3159 y: 0
3160 };
3161 const isXAxis = data.axis === "x" || data.axis === "both";
3162 const isYAxis = data.axis === "y" || data.axis === "both";
3163 const canTrackCursorOnAutoUpdate = ["mouseenter", "mousemove"].includes(data.dataRef.current.openEvent?.type || "") && data.pointerType !== "touch";
3164 let width = domRect.width;
3165 let height = domRect.height;
3166 let x2 = domRect.x;
3167 let y2 = domRect.y;
3168 if (offsetX == null && data.x && isXAxis) {
3169 offsetX = domRect.x - data.x;
3170 }
3171 if (offsetY == null && data.y && isYAxis) {
3172 offsetY = domRect.y - data.y;
3173 }
3174 x2 -= offsetX || 0;
3175 y2 -= offsetY || 0;
3176 width = 0;
3177 height = 0;
3178 if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {
3179 width = data.axis === "y" ? domRect.width : 0;
3180 height = data.axis === "x" ? domRect.height : 0;
3181 x2 = isXAxis && data.x != null ? data.x : x2;
3182 y2 = isYAxis && data.y != null ? data.y : y2;
3183 } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {
3184 height = data.axis === "x" ? domRect.height : height;
3185 width = data.axis === "y" ? domRect.width : width;
3186 }
3187 isAutoUpdateEvent = true;
3188 return {
3189 width,
3190 height,
3191 x: x2,
3192 y: y2,
3193 top: y2,
3194 right: x2 + width,
3195 bottom: y2 + height,
3196 left: x2
3197 };
3198 }
3199 };
3200 }
3201 function isMouseBasedEvent(event) {
3202 return event != null && event.clientX != null;
3203 }
3204 function useClientPoint(context, props = {}) {
3205 const {
3206 enabled = true,
3207 axis = "both"
3208 } = props;
3209 const store = "rootStore" in context ? context.rootStore : context;
3210 const open = store.useState("open");
3211 const floating = store.useState("floatingElement");
3212 const domReference = store.useState("domReferenceElement");
3213 const dataRef = store.context.dataRef;
3214 const initialRef = React17.useRef(false);
3215 const cleanupListenerRef = React17.useRef(null);
3216 const [pointerType, setPointerType] = React17.useState();
3217 const [reactive, setReactive] = React17.useState([]);
3218 const resetReference = useStableCallback((reference2) => {
3219 store.set("positionReference", reference2);
3220 });
3221 const setReference = useStableCallback((newX, newY, referenceElement) => {
3222 if (initialRef.current) {
3223 return;
3224 }
3225 if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {
3226 return;
3227 }
3228 store.set("positionReference", createVirtualElement(referenceElement ?? domReference, {
3229 x: newX,
3230 y: newY,
3231 axis,
3232 dataRef,
3233 pointerType
3234 }));
3235 });
3236 const handleReferenceEnterOrMove = useStableCallback((event) => {
3237 if (!open) {
3238 setReference(event.clientX, event.clientY, event.currentTarget);
3239 } else if (!cleanupListenerRef.current) {
3240 setReference(event.clientX, event.clientY, event.currentTarget);
3241 setReactive([]);
3242 }
3243 });
3244 const openCheck = isMouseLikePointerType(pointerType) ? floating : open;
3245 React17.useEffect(() => {
3246 if (!enabled) {
3247 resetReference(domReference);
3248 return void 0;
3249 }
3250 if (!openCheck) {
3251 return void 0;
3252 }
3253 function cleanupListener() {
3254 cleanupListenerRef.current?.();
3255 cleanupListenerRef.current = null;
3256 }
3257 const win = getWindow(floating);
3258 function handleMouseMove(event) {
3259 const target = getTarget(event);
3260 if (!contains(floating, target)) {
3261 setReference(event.clientX, event.clientY);
3262 } else {
3263 cleanupListener();
3264 }
3265 }
3266 if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {
3267 cleanupListenerRef.current = addEventListener(win, "mousemove", handleMouseMove);
3268 } else {
3269 resetReference(domReference);
3270 }
3271 return cleanupListener;
3272 }, [openCheck, enabled, floating, dataRef, domReference, store, setReference, resetReference, reactive]);
3273 React17.useEffect(() => () => {
3274 store.set("positionReference", null);
3275 }, [store]);
3276 React17.useEffect(() => {
3277 if (enabled && !floating) {
3278 initialRef.current = false;
3279 }
3280 }, [enabled, floating]);
3281 React17.useEffect(() => {
3282 if (!enabled && open) {
3283 initialRef.current = true;
3284 }
3285 }, [enabled, open]);
3286 const reference = React17.useMemo(() => {
3287 function setPointerTypeRef(event) {
3288 setPointerType(event.pointerType);
3289 }
3290 return {
3291 onPointerDown: setPointerTypeRef,
3292 onPointerEnter: setPointerTypeRef,
3293 onMouseMove: handleReferenceEnterOrMove,
3294 onMouseEnter: handleReferenceEnterOrMove
3295 };
3296 }, [handleReferenceEnterOrMove]);
3297 return React17.useMemo(() => enabled ? {
3298 reference,
3299 trigger: reference
3300 } : {}, [enabled, reference]);
3301 }
3302
3303 // node_modules/@base-ui/react/floating-ui-react/hooks/useDismiss.mjs
3304 var React18 = __toESM(require_react(), 1);
3305 function alwaysFalse() {
3306 return false;
3307 }
3308 function normalizeProp(normalizable) {
3309 return {
3310 escapeKey: typeof normalizable === "boolean" ? normalizable : normalizable?.escapeKey ?? false,
3311 outsidePress: typeof normalizable === "boolean" ? normalizable : normalizable?.outsidePress ?? true
3312 };
3313 }
3314 function useDismiss(context, props = {}) {
3315 const {
3316 enabled = true,
3317 escapeKey: escapeKey2 = true,
3318 outsidePress: outsidePressProp = true,
3319 outsidePressEvent = "sloppy",
3320 referencePress = alwaysFalse,
3321 bubbles,
3322 externalTree
3323 } = props;
3324 const store = "rootStore" in context ? context.rootStore : context;
3325 const open = store.useState("open");
3326 const floatingElement = store.useState("floatingElement");
3327 const {
3328 dataRef
3329 } = store.context;
3330 const tree = useFloatingTree(externalTree);
3331 const outsidePressFn = useStableCallback(typeof outsidePressProp === "function" ? outsidePressProp : () => false);
3332 const outsidePress2 = typeof outsidePressProp === "function" ? outsidePressFn : outsidePressProp;
3333 const outsidePressEnabled = outsidePress2 !== false;
3334 const getOutsidePressEventProp = useStableCallback(() => outsidePressEvent);
3335 const {
3336 escapeKey: escapeKeyBubbles,
3337 outsidePress: outsidePressBubbles
3338 } = normalizeProp(bubbles);
3339 const pressStartedInsideRef = React18.useRef(false);
3340 const pressStartPreventedRef = React18.useRef(false);
3341 const suppressNextOutsideClickRef = React18.useRef(false);
3342 const isComposingRef = React18.useRef(false);
3343 const currentPointerTypeRef = React18.useRef("");
3344 const touchStateRef = React18.useRef(null);
3345 const cancelDismissOnEndTimeout = useTimeout();
3346 const clearInsideReactTreeTimeout = useTimeout();
3347 const clearInsideReactTree = useStableCallback(() => {
3348 clearInsideReactTreeTimeout.clear();
3349 dataRef.current.insideReactTree = false;
3350 });
3351 const hasBlockingChild = useStableCallback((bubbleKey) => {
3352 const nodeId = dataRef.current.floatingContext?.nodeId;
3353 const children = tree ? getNodeChildren(tree.nodesRef.current, nodeId) : [];
3354 return children.some((child) => child.context?.open && !child.context.dataRef.current[bubbleKey]);
3355 });
3356 const isEventWithinOwnElements = useStableCallback((event) => {
3357 return isEventTargetWithin(event, store.select("floatingElement")) || isEventTargetWithin(event, store.select("domReferenceElement"));
3358 });
3359 const closeOnReferencePress = useStableCallback((event) => {
3360 if (!referencePress()) {
3361 return;
3362 }
3363 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerPress, event.nativeEvent));
3364 });
3365 const closeOnEscapeKeyDown = useStableCallback((event) => {
3366 if (!open || !enabled || !escapeKey2 || event.key !== "Escape") {
3367 return;
3368 }
3369 if (isComposingRef.current) {
3370 return;
3371 }
3372 if (!escapeKeyBubbles && hasBlockingChild("__escapeKeyBubbles")) {
3373 return;
3374 }
3375 const native = isReactEvent(event) ? event.nativeEvent : event;
3376 const eventDetails = createChangeEventDetails(reason_parts_exports.escapeKey, native);
3377 store.setOpen(false, eventDetails);
3378 if (!eventDetails.isCanceled) {
3379 event.preventDefault();
3380 }
3381 if (!escapeKeyBubbles && !eventDetails.isPropagationAllowed) {
3382 event.stopPropagation();
3383 }
3384 });
3385 const markInsideReactTree = useStableCallback(() => {
3386 dataRef.current.insideReactTree = true;
3387 clearInsideReactTreeTimeout.start(0, clearInsideReactTree);
3388 });
3389 const markPressStartedInsideReactTree = useStableCallback((event) => {
3390 if (!open || !enabled || event.button !== 0) {
3391 return;
3392 }
3393 const target = getTarget(event.nativeEvent);
3394 if (!contains(store.select("floatingElement"), target)) {
3395 return;
3396 }
3397 if (!pressStartedInsideRef.current) {
3398 pressStartedInsideRef.current = true;
3399 pressStartPreventedRef.current = false;
3400 }
3401 });
3402 const markInsidePressStartPrevented = useStableCallback((event) => {
3403 if (!open || !enabled) {
3404 return;
3405 }
3406 if (!(event.defaultPrevented || event.nativeEvent.defaultPrevented)) {
3407 return;
3408 }
3409 if (pressStartedInsideRef.current) {
3410 pressStartPreventedRef.current = true;
3411 }
3412 });
3413 React18.useEffect(() => {
3414 if (!open || !enabled) {
3415 return void 0;
3416 }
3417 dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;
3418 dataRef.current.__outsidePressBubbles = outsidePressBubbles;
3419 const compositionTimeout = new Timeout();
3420 const preventedPressSuppressionTimeout = new Timeout();
3421 function handleCompositionStart() {
3422 compositionTimeout.clear();
3423 isComposingRef.current = true;
3424 }
3425 function handleCompositionEnd() {
3426 compositionTimeout.start(
3427 // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.
3428 // Only apply to WebKit for the test to remain 0ms.
3429 parts_exports.engine.webkit ? 5 : 0,
3430 () => {
3431 isComposingRef.current = false;
3432 }
3433 );
3434 }
3435 function suppressImmediateOutsideClickAfterPreventedStart() {
3436 suppressNextOutsideClickRef.current = true;
3437 preventedPressSuppressionTimeout.start(0, () => {
3438 suppressNextOutsideClickRef.current = false;
3439 });
3440 }
3441 function resetPressStartState() {
3442 pressStartedInsideRef.current = false;
3443 pressStartPreventedRef.current = false;
3444 }
3445 function getOutsidePressEvent() {
3446 const type = currentPointerTypeRef.current;
3447 const computedType = type === "pen" || !type ? "mouse" : type;
3448 const outsidePressEventValue = getOutsidePressEventProp();
3449 const resolved = typeof outsidePressEventValue === "function" ? outsidePressEventValue() : outsidePressEventValue;
3450 if (typeof resolved === "string") {
3451 return resolved;
3452 }
3453 return resolved[computedType];
3454 }
3455 function shouldIgnoreEvent(event) {
3456 const computedOutsidePressEvent = getOutsidePressEvent();
3457 return computedOutsidePressEvent === "intentional" && event.type !== "click" || computedOutsidePressEvent === "sloppy" && event.type === "click";
3458 }
3459 function isEventWithinFloatingTree(event) {
3460 const nodeId = dataRef.current.floatingContext?.nodeId;
3461 const targetIsInsideChildren = tree && getNodeChildren(tree.nodesRef.current, nodeId).some((node) => isEventTargetWithin(event, node.context?.elements.floating));
3462 return isEventWithinOwnElements(event) || targetIsInsideChildren;
3463 }
3464 function closeOnPressOutside(event) {
3465 if (shouldIgnoreEvent(event)) {
3466 if (event.type !== "click" && !isEventWithinOwnElements(event)) {
3467 preventedPressSuppressionTimeout.clear();
3468 suppressNextOutsideClickRef.current = false;
3469 }
3470 clearInsideReactTree();
3471 return;
3472 }
3473 if (dataRef.current.insideReactTree) {
3474 clearInsideReactTree();
3475 return;
3476 }
3477 const target = getTarget(event);
3478 const inertSelector = `[${createAttribute("inert")}]`;
3479 const targetRoot = isElement(target) ? target.getRootNode() : null;
3480 const markers = Array.from((isShadowRoot(targetRoot) ? targetRoot : ownerDocument(store.select("floatingElement"))).querySelectorAll(inertSelector));
3481 const triggers = store.context.triggerElements;
3482 if (target && (triggers.hasElement(target) || triggers.hasMatchingElement((trigger) => contains(trigger, target)))) {
3483 return;
3484 }
3485 let targetRootAncestor = isElement(target) ? target : null;
3486 while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {
3487 const nextParent = getParentNode(targetRootAncestor);
3488 if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {
3489 break;
3490 }
3491 targetRootAncestor = nextParent;
3492 }
3493 if (markers.length && isElement(target) && !isRootElement(target) && // Clicked on a direct ancestor (e.g. FloatingOverlay).
3494 !contains(target, store.select("floatingElement")) && // If the target root element contains none of the markers, then the
3495 // element was injected after the floating element rendered.
3496 markers.every((marker) => !contains(targetRootAncestor, marker))) {
3497 return;
3498 }
3499 if (isHTMLElement(target) && !("touches" in event)) {
3500 const lastTraversableNode = isLastTraversableNode(target);
3501 const style = getComputedStyle2(target);
3502 const scrollRe = /auto|scroll/;
3503 const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX);
3504 const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY);
3505 const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth;
3506 const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight;
3507 const isRTL7 = style.direction === "rtl";
3508 const pressedVerticalScrollbar = canScrollY && (isRTL7 ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth);
3509 const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight;
3510 if (pressedVerticalScrollbar || pressedHorizontalScrollbar) {
3511 return;
3512 }
3513 }
3514 if (isEventWithinFloatingTree(event)) {
3515 return;
3516 }
3517 if (getOutsidePressEvent() === "intentional" && suppressNextOutsideClickRef.current) {
3518 preventedPressSuppressionTimeout.clear();
3519 suppressNextOutsideClickRef.current = false;
3520 return;
3521 }
3522 if (typeof outsidePress2 === "function" && !outsidePress2(event)) {
3523 return;
3524 }
3525 if (hasBlockingChild("__outsidePressBubbles")) {
3526 return;
3527 }
3528 store.setOpen(false, createChangeEventDetails(reason_parts_exports.outsidePress, event));
3529 clearInsideReactTree();
3530 }
3531 function handlePointerDown(event) {
3532 if (getOutsidePressEvent() !== "sloppy" || event.pointerType === "touch" || !store.select("open") || !enabled || isEventWithinOwnElements(event)) {
3533 return;
3534 }
3535 closeOnPressOutside(event);
3536 }
3537 function handleTouchStart(event) {
3538 if (getOutsidePressEvent() !== "sloppy" || !store.select("open") || !enabled || isEventWithinOwnElements(event)) {
3539 return;
3540 }
3541 const touch = event.touches[0];
3542 if (touch) {
3543 touchStateRef.current = {
3544 startTime: Date.now(),
3545 startX: touch.clientX,
3546 startY: touch.clientY,
3547 dismissOnTouchEnd: false,
3548 dismissOnMouseDown: true
3549 };
3550 cancelDismissOnEndTimeout.start(1e3, () => {
3551 if (touchStateRef.current) {
3552 touchStateRef.current.dismissOnTouchEnd = false;
3553 touchStateRef.current.dismissOnMouseDown = false;
3554 }
3555 });
3556 }
3557 }
3558 function addTargetEventListenerOnce(event, listener) {
3559 const target = getTarget(event);
3560 if (!target) {
3561 return;
3562 }
3563 const unsubscribe2 = addEventListener(target, event.type, () => {
3564 listener(event);
3565 unsubscribe2();
3566 });
3567 }
3568 function handleTouchStartCapture(event) {
3569 currentPointerTypeRef.current = "touch";
3570 addTargetEventListenerOnce(event, handleTouchStart);
3571 }
3572 function closeOnPressOutsideCapture(event) {
3573 cancelDismissOnEndTimeout.clear();
3574 if (event.type === "pointerdown") {
3575 currentPointerTypeRef.current = event.pointerType;
3576 }
3577 if (event.type === "mousedown" && touchStateRef.current && !touchStateRef.current.dismissOnMouseDown) {
3578 return;
3579 }
3580 addTargetEventListenerOnce(event, (targetEvent) => {
3581 if (targetEvent.type === "pointerdown") {
3582 handlePointerDown(targetEvent);
3583 } else {
3584 closeOnPressOutside(targetEvent);
3585 }
3586 });
3587 }
3588 function handlePressEndCapture(event) {
3589 if (!pressStartedInsideRef.current) {
3590 return;
3591 }
3592 const pressStartedInsideDefaultPrevented = pressStartPreventedRef.current;
3593 resetPressStartState();
3594 if (getOutsidePressEvent() !== "intentional") {
3595 return;
3596 }
3597 if (event.type === "pointercancel") {
3598 if (pressStartedInsideDefaultPrevented) {
3599 suppressImmediateOutsideClickAfterPreventedStart();
3600 }
3601 return;
3602 }
3603 if (isEventWithinFloatingTree(event)) {
3604 return;
3605 }
3606 if (pressStartedInsideDefaultPrevented) {
3607 suppressImmediateOutsideClickAfterPreventedStart();
3608 return;
3609 }
3610 if (typeof outsidePress2 === "function" && !outsidePress2(event)) {
3611 return;
3612 }
3613 preventedPressSuppressionTimeout.clear();
3614 suppressNextOutsideClickRef.current = true;
3615 clearInsideReactTree();
3616 }
3617 function handleTouchMove(event) {
3618 if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) {
3619 return;
3620 }
3621 const touch = event.touches[0];
3622 if (!touch) {
3623 return;
3624 }
3625 const deltaX = Math.abs(touch.clientX - touchStateRef.current.startX);
3626 const deltaY = Math.abs(touch.clientY - touchStateRef.current.startY);
3627 const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
3628 if (distance > 5) {
3629 touchStateRef.current.dismissOnTouchEnd = true;
3630 }
3631 if (distance > 10) {
3632 closeOnPressOutside(event);
3633 cancelDismissOnEndTimeout.clear();
3634 touchStateRef.current = null;
3635 }
3636 }
3637 function handleTouchMoveCapture(event) {
3638 addTargetEventListenerOnce(event, handleTouchMove);
3639 }
3640 function handleTouchEnd(event) {
3641 if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) {
3642 return;
3643 }
3644 if (touchStateRef.current.dismissOnTouchEnd) {
3645 closeOnPressOutside(event);
3646 }
3647 cancelDismissOnEndTimeout.clear();
3648 touchStateRef.current = null;
3649 }
3650 function handleTouchEndCapture(event) {
3651 addTargetEventListenerOnce(event, handleTouchEnd);
3652 }
3653 const doc = ownerDocument(floatingElement);
3654 const unsubscribe = mergeCleanups(escapeKey2 && mergeCleanups(addEventListener(doc, "keydown", closeOnEscapeKeyDown), addEventListener(doc, "compositionstart", handleCompositionStart), addEventListener(doc, "compositionend", handleCompositionEnd)), outsidePressEnabled && mergeCleanups(addEventListener(doc, "click", closeOnPressOutsideCapture, true), addEventListener(doc, "pointerdown", closeOnPressOutsideCapture, true), addEventListener(doc, "pointerup", handlePressEndCapture, true), addEventListener(doc, "pointercancel", handlePressEndCapture, true), addEventListener(doc, "mousedown", closeOnPressOutsideCapture, true), addEventListener(doc, "mouseup", handlePressEndCapture, true), addEventListener(doc, "touchstart", handleTouchStartCapture, true), addEventListener(doc, "touchmove", handleTouchMoveCapture, true), addEventListener(doc, "touchend", handleTouchEndCapture, true)));
3655 return () => {
3656 unsubscribe();
3657 compositionTimeout.clear();
3658 preventedPressSuppressionTimeout.clear();
3659 resetPressStartState();
3660 suppressNextOutsideClickRef.current = false;
3661 };
3662 }, [dataRef, floatingElement, escapeKey2, outsidePressEnabled, outsidePress2, open, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, clearInsideReactTree, getOutsidePressEventProp, hasBlockingChild, isEventWithinOwnElements, tree, store, cancelDismissOnEndTimeout]);
3663 React18.useEffect(clearInsideReactTree, [outsidePress2, clearInsideReactTree]);
3664 const reference = React18.useMemo(() => ({
3665 onKeyDown: closeOnEscapeKeyDown,
3666 onPointerDown: closeOnReferencePress,
3667 onClick: closeOnReferencePress
3668 }), [closeOnEscapeKeyDown, closeOnReferencePress]);
3669 const floating = React18.useMemo(() => ({
3670 onKeyDown: closeOnEscapeKeyDown,
3671 // `onMouseDown` may be blocked if `event.preventDefault()` is called in
3672 // `onPointerDown`, such as with <NumberField.ScrubArea>.
3673 // See https://github.com/mui/base-ui/pull/3379
3674 onPointerDown: markInsidePressStartPrevented,
3675 onMouseDown: markInsidePressStartPrevented,
3676 onClickCapture: markInsideReactTree,
3677 onMouseDownCapture(event) {
3678 markInsideReactTree();
3679 markPressStartedInsideReactTree(event);
3680 },
3681 onPointerDownCapture(event) {
3682 markInsideReactTree();
3683 markPressStartedInsideReactTree(event);
3684 },
3685 onMouseUpCapture: markInsideReactTree,
3686 onTouchEndCapture: markInsideReactTree,
3687 onTouchMoveCapture: markInsideReactTree
3688 }), [closeOnEscapeKeyDown, markInsideReactTree, markPressStartedInsideReactTree, markInsidePressStartPrevented]);
3689 return React18.useMemo(() => enabled ? {
3690 reference,
3691 floating,
3692 trigger: reference
3693 } : {}, [enabled, reference, floating]);
3694 }
3695
3696 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloating.mjs
3697 var React25 = __toESM(require_react(), 1);
3698
3699 // node_modules/@floating-ui/core/dist/floating-ui.core.mjs
3700 function computeCoordsFromPlacement(_ref, placement, rtl) {
3701 let {
3702 reference,
3703 floating
3704 } = _ref;
3705 const sideAxis = getSideAxis(placement);
3706 const alignmentAxis = getAlignmentAxis(placement);
3707 const alignLength = getAxisLength(alignmentAxis);
3708 const side = getSide(placement);
3709 const isVertical = sideAxis === "y";
3710 const commonX = reference.x + reference.width / 2 - floating.width / 2;
3711 const commonY = reference.y + reference.height / 2 - floating.height / 2;
3712 const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;
3713 let coords;
3714 switch (side) {
3715 case "top":
3716 coords = {
3717 x: commonX,
3718 y: reference.y - floating.height
3719 };
3720 break;
3721 case "bottom":
3722 coords = {
3723 x: commonX,
3724 y: reference.y + reference.height
3725 };
3726 break;
3727 case "right":
3728 coords = {
3729 x: reference.x + reference.width,
3730 y: commonY
3731 };
3732 break;
3733 case "left":
3734 coords = {
3735 x: reference.x - floating.width,
3736 y: commonY
3737 };
3738 break;
3739 default:
3740 coords = {
3741 x: reference.x,
3742 y: reference.y
3743 };
3744 }
3745 switch (getAlignment(placement)) {
3746 case "start":
3747 coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);
3748 break;
3749 case "end":
3750 coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);
3751 break;
3752 }
3753 return coords;
3754 }
3755 async function detectOverflow(state, options) {
3756 var _await$platform$isEle;
3757 if (options === void 0) {
3758 options = {};
3759 }
3760 const {
3761 x: x2,
3762 y: y2,
3763 platform: platform3,
3764 rects,
3765 elements,
3766 strategy
3767 } = state;
3768 const {
3769 boundary = "clippingAncestors",
3770 rootBoundary = "viewport",
3771 elementContext = "floating",
3772 altBoundary = false,
3773 padding = 0
3774 } = evaluate(options, state);
3775 const paddingObject = getPaddingObject(padding);
3776 const altContext = elementContext === "floating" ? "reference" : "floating";
3777 const element = elements[altBoundary ? altContext : elementContext];
3778 const clippingClientRect = rectToClientRect(await platform3.getClippingRect({
3779 element: ((_await$platform$isEle = await (platform3.isElement == null ? void 0 : platform3.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform3.getDocumentElement == null ? void 0 : platform3.getDocumentElement(elements.floating)),
3780 boundary,
3781 rootBoundary,
3782 strategy
3783 }));
3784 const rect = elementContext === "floating" ? {
3785 x: x2,
3786 y: y2,
3787 width: rects.floating.width,
3788 height: rects.floating.height
3789 } : rects.reference;
3790 const offsetParent = await (platform3.getOffsetParent == null ? void 0 : platform3.getOffsetParent(elements.floating));
3791 const offsetScale = await (platform3.isElement == null ? void 0 : platform3.isElement(offsetParent)) ? await (platform3.getScale == null ? void 0 : platform3.getScale(offsetParent)) || {
3792 x: 1,
3793 y: 1
3794 } : {
3795 x: 1,
3796 y: 1
3797 };
3798 const elementClientRect = rectToClientRect(platform3.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform3.convertOffsetParentRelativeRectToViewportRelativeRect({
3799 elements,
3800 rect,
3801 offsetParent,
3802 strategy
3803 }) : rect);
3804 return {
3805 top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,
3806 bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,
3807 left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,
3808 right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x
3809 };
3810 }
3811 var MAX_RESET_COUNT = 50;
3812 var computePosition = async (reference, floating, config) => {
3813 const {
3814 placement = "bottom",
3815 strategy = "absolute",
3816 middleware = [],
3817 platform: platform3
3818 } = config;
3819 const platformWithDetectOverflow = platform3.detectOverflow ? platform3 : {
3820 ...platform3,
3821 detectOverflow
3822 };
3823 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(floating));
3824 let rects = await platform3.getElementRects({
3825 reference,
3826 floating,
3827 strategy
3828 });
3829 let {
3830 x: x2,
3831 y: y2
3832 } = computeCoordsFromPlacement(rects, placement, rtl);
3833 let statefulPlacement = placement;
3834 let resetCount = 0;
3835 const middlewareData = {};
3836 for (let i2 = 0; i2 < middleware.length; i2++) {
3837 const currentMiddleware = middleware[i2];
3838 if (!currentMiddleware) {
3839 continue;
3840 }
3841 const {
3842 name,
3843 fn
3844 } = currentMiddleware;
3845 const {
3846 x: nextX,
3847 y: nextY,
3848 data,
3849 reset
3850 } = await fn({
3851 x: x2,
3852 y: y2,
3853 initialPlacement: placement,
3854 placement: statefulPlacement,
3855 strategy,
3856 middlewareData,
3857 rects,
3858 platform: platformWithDetectOverflow,
3859 elements: {
3860 reference,
3861 floating
3862 }
3863 });
3864 x2 = nextX != null ? nextX : x2;
3865 y2 = nextY != null ? nextY : y2;
3866 middlewareData[name] = {
3867 ...middlewareData[name],
3868 ...data
3869 };
3870 if (reset && resetCount < MAX_RESET_COUNT) {
3871 resetCount++;
3872 if (typeof reset === "object") {
3873 if (reset.placement) {
3874 statefulPlacement = reset.placement;
3875 }
3876 if (reset.rects) {
3877 rects = reset.rects === true ? await platform3.getElementRects({
3878 reference,
3879 floating,
3880 strategy
3881 }) : reset.rects;
3882 }
3883 ({
3884 x: x2,
3885 y: y2
3886 } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));
3887 }
3888 i2 = -1;
3889 }
3890 }
3891 return {
3892 x: x2,
3893 y: y2,
3894 placement: statefulPlacement,
3895 strategy,
3896 middlewareData
3897 };
3898 };
3899 var flip = function(options) {
3900 if (options === void 0) {
3901 options = {};
3902 }
3903 return {
3904 name: "flip",
3905 options,
3906 async fn(state) {
3907 var _middlewareData$arrow, _middlewareData$flip;
3908 const {
3909 placement,
3910 middlewareData,
3911 rects,
3912 initialPlacement,
3913 platform: platform3,
3914 elements
3915 } = state;
3916 const {
3917 mainAxis: checkMainAxis = true,
3918 crossAxis: checkCrossAxis = true,
3919 fallbackPlacements: specifiedFallbackPlacements,
3920 fallbackStrategy = "bestFit",
3921 fallbackAxisSideDirection = "none",
3922 flipAlignment = true,
3923 ...detectOverflowOptions
3924 } = evaluate(options, state);
3925 if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
3926 return {};
3927 }
3928 const side = getSide(placement);
3929 const initialSideAxis = getSideAxis(initialPlacement);
3930 const isBasePlacement = getSide(initialPlacement) === initialPlacement;
3931 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating));
3932 const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));
3933 const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none";
3934 if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {
3935 fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));
3936 }
3937 const placements2 = [initialPlacement, ...fallbackPlacements];
3938 const overflow = await platform3.detectOverflow(state, detectOverflowOptions);
3939 const overflows = [];
3940 let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];
3941 if (checkMainAxis) {
3942 overflows.push(overflow[side]);
3943 }
3944 if (checkCrossAxis) {
3945 const sides2 = getAlignmentSides(placement, rects, rtl);
3946 overflows.push(overflow[sides2[0]], overflow[sides2[1]]);
3947 }
3948 overflowsData = [...overflowsData, {
3949 placement,
3950 overflows
3951 }];
3952 if (!overflows.every((side2) => side2 <= 0)) {
3953 var _middlewareData$flip2, _overflowsData$filter;
3954 const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;
3955 const nextPlacement = placements2[nextIndex];
3956 if (nextPlacement) {
3957 const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false;
3958 if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis
3959 // overflows the main axis.
3960 overflowsData.every((d2) => getSideAxis(d2.placement) === initialSideAxis ? d2.overflows[0] > 0 : true)) {
3961 return {
3962 data: {
3963 index: nextIndex,
3964 overflows: overflowsData
3965 },
3966 reset: {
3967 placement: nextPlacement
3968 }
3969 };
3970 }
3971 }
3972 let resetPlacement = (_overflowsData$filter = overflowsData.filter((d2) => d2.overflows[0] <= 0).sort((a2, b2) => a2.overflows[1] - b2.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;
3973 if (!resetPlacement) {
3974 switch (fallbackStrategy) {
3975 case "bestFit": {
3976 var _overflowsData$filter2;
3977 const placement2 = (_overflowsData$filter2 = overflowsData.filter((d2) => {
3978 if (hasFallbackAxisSideDirection) {
3979 const currentSideAxis = getSideAxis(d2.placement);
3980 return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal
3981 // reading directions favoring greater width.
3982 currentSideAxis === "y";
3983 }
3984 return true;
3985 }).map((d2) => [d2.placement, d2.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a2, b2) => a2[1] - b2[1])[0]) == null ? void 0 : _overflowsData$filter2[0];
3986 if (placement2) {
3987 resetPlacement = placement2;
3988 }
3989 break;
3990 }
3991 case "initialPlacement":
3992 resetPlacement = initialPlacement;
3993 break;
3994 }
3995 }
3996 if (placement !== resetPlacement) {
3997 return {
3998 reset: {
3999 placement: resetPlacement
4000 }
4001 };
4002 }
4003 }
4004 return {};
4005 }
4006 };
4007 };
4008 function getSideOffsets(overflow, rect) {
4009 return {
4010 top: overflow.top - rect.height,
4011 right: overflow.right - rect.width,
4012 bottom: overflow.bottom - rect.height,
4013 left: overflow.left - rect.width
4014 };
4015 }
4016 function isAnySideFullyClipped(overflow) {
4017 return sides.some((side) => overflow[side] >= 0);
4018 }
4019 var hide = function(options) {
4020 if (options === void 0) {
4021 options = {};
4022 }
4023 return {
4024 name: "hide",
4025 options,
4026 async fn(state) {
4027 const {
4028 rects,
4029 platform: platform3
4030 } = state;
4031 const {
4032 strategy = "referenceHidden",
4033 ...detectOverflowOptions
4034 } = evaluate(options, state);
4035 switch (strategy) {
4036 case "referenceHidden": {
4037 const overflow = await platform3.detectOverflow(state, {
4038 ...detectOverflowOptions,
4039 elementContext: "reference"
4040 });
4041 const offsets = getSideOffsets(overflow, rects.reference);
4042 return {
4043 data: {
4044 referenceHiddenOffsets: offsets,
4045 referenceHidden: isAnySideFullyClipped(offsets)
4046 }
4047 };
4048 }
4049 case "escaped": {
4050 const overflow = await platform3.detectOverflow(state, {
4051 ...detectOverflowOptions,
4052 altBoundary: true
4053 });
4054 const offsets = getSideOffsets(overflow, rects.floating);
4055 return {
4056 data: {
4057 escapedOffsets: offsets,
4058 escaped: isAnySideFullyClipped(offsets)
4059 }
4060 };
4061 }
4062 default: {
4063 return {};
4064 }
4065 }
4066 }
4067 };
4068 };
4069 var originSides = /* @__PURE__ */ new Set(["left", "top"]);
4070 async function convertValueToCoords(state, options) {
4071 const {
4072 placement,
4073 platform: platform3,
4074 elements
4075 } = state;
4076 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating));
4077 const side = getSide(placement);
4078 const alignment = getAlignment(placement);
4079 const isVertical = getSideAxis(placement) === "y";
4080 const mainAxisMulti = originSides.has(side) ? -1 : 1;
4081 const crossAxisMulti = rtl && isVertical ? -1 : 1;
4082 const rawValue = evaluate(options, state);
4083 let {
4084 mainAxis,
4085 crossAxis,
4086 alignmentAxis
4087 } = typeof rawValue === "number" ? {
4088 mainAxis: rawValue,
4089 crossAxis: 0,
4090 alignmentAxis: null
4091 } : {
4092 mainAxis: rawValue.mainAxis || 0,
4093 crossAxis: rawValue.crossAxis || 0,
4094 alignmentAxis: rawValue.alignmentAxis
4095 };
4096 if (alignment && typeof alignmentAxis === "number") {
4097 crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis;
4098 }
4099 return isVertical ? {
4100 x: crossAxis * crossAxisMulti,
4101 y: mainAxis * mainAxisMulti
4102 } : {
4103 x: mainAxis * mainAxisMulti,
4104 y: crossAxis * crossAxisMulti
4105 };
4106 }
4107 var offset = function(options) {
4108 if (options === void 0) {
4109 options = 0;
4110 }
4111 return {
4112 name: "offset",
4113 options,
4114 async fn(state) {
4115 var _middlewareData$offse, _middlewareData$arrow;
4116 const {
4117 x: x2,
4118 y: y2,
4119 placement,
4120 middlewareData
4121 } = state;
4122 const diffCoords = await convertValueToCoords(state, options);
4123 if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
4124 return {};
4125 }
4126 return {
4127 x: x2 + diffCoords.x,
4128 y: y2 + diffCoords.y,
4129 data: {
4130 ...diffCoords,
4131 placement
4132 }
4133 };
4134 }
4135 };
4136 };
4137 var shift = function(options) {
4138 if (options === void 0) {
4139 options = {};
4140 }
4141 return {
4142 name: "shift",
4143 options,
4144 async fn(state) {
4145 const {
4146 x: x2,
4147 y: y2,
4148 placement,
4149 platform: platform3
4150 } = state;
4151 const {
4152 mainAxis: checkMainAxis = true,
4153 crossAxis: checkCrossAxis = false,
4154 limiter = {
4155 fn: (_ref) => {
4156 let {
4157 x: x3,
4158 y: y3
4159 } = _ref;
4160 return {
4161 x: x3,
4162 y: y3
4163 };
4164 }
4165 },
4166 ...detectOverflowOptions
4167 } = evaluate(options, state);
4168 const coords = {
4169 x: x2,
4170 y: y2
4171 };
4172 const overflow = await platform3.detectOverflow(state, detectOverflowOptions);
4173 const crossAxis = getSideAxis(getSide(placement));
4174 const mainAxis = getOppositeAxis(crossAxis);
4175 let mainAxisCoord = coords[mainAxis];
4176 let crossAxisCoord = coords[crossAxis];
4177 if (checkMainAxis) {
4178 const minSide = mainAxis === "y" ? "top" : "left";
4179 const maxSide = mainAxis === "y" ? "bottom" : "right";
4180 const min2 = mainAxisCoord + overflow[minSide];
4181 const max2 = mainAxisCoord - overflow[maxSide];
4182 mainAxisCoord = clamp(min2, mainAxisCoord, max2);
4183 }
4184 if (checkCrossAxis) {
4185 const minSide = crossAxis === "y" ? "top" : "left";
4186 const maxSide = crossAxis === "y" ? "bottom" : "right";
4187 const min2 = crossAxisCoord + overflow[minSide];
4188 const max2 = crossAxisCoord - overflow[maxSide];
4189 crossAxisCoord = clamp(min2, crossAxisCoord, max2);
4190 }
4191 const limitedCoords = limiter.fn({
4192 ...state,
4193 [mainAxis]: mainAxisCoord,
4194 [crossAxis]: crossAxisCoord
4195 });
4196 return {
4197 ...limitedCoords,
4198 data: {
4199 x: limitedCoords.x - x2,
4200 y: limitedCoords.y - y2,
4201 enabled: {
4202 [mainAxis]: checkMainAxis,
4203 [crossAxis]: checkCrossAxis
4204 }
4205 }
4206 };
4207 }
4208 };
4209 };
4210 var limitShift = function(options) {
4211 if (options === void 0) {
4212 options = {};
4213 }
4214 return {
4215 options,
4216 fn(state) {
4217 const {
4218 x: x2,
4219 y: y2,
4220 placement,
4221 rects,
4222 middlewareData
4223 } = state;
4224 const {
4225 offset: offset4 = 0,
4226 mainAxis: checkMainAxis = true,
4227 crossAxis: checkCrossAxis = true
4228 } = evaluate(options, state);
4229 const coords = {
4230 x: x2,
4231 y: y2
4232 };
4233 const crossAxis = getSideAxis(placement);
4234 const mainAxis = getOppositeAxis(crossAxis);
4235 let mainAxisCoord = coords[mainAxis];
4236 let crossAxisCoord = coords[crossAxis];
4237 const rawOffset = evaluate(offset4, state);
4238 const computedOffset = typeof rawOffset === "number" ? {
4239 mainAxis: rawOffset,
4240 crossAxis: 0
4241 } : {
4242 mainAxis: 0,
4243 crossAxis: 0,
4244 ...rawOffset
4245 };
4246 if (checkMainAxis) {
4247 const len = mainAxis === "y" ? "height" : "width";
4248 const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;
4249 const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;
4250 if (mainAxisCoord < limitMin) {
4251 mainAxisCoord = limitMin;
4252 } else if (mainAxisCoord > limitMax) {
4253 mainAxisCoord = limitMax;
4254 }
4255 }
4256 if (checkCrossAxis) {
4257 var _middlewareData$offse, _middlewareData$offse2;
4258 const len = mainAxis === "y" ? "width" : "height";
4259 const isOriginSide = originSides.has(getSide(placement));
4260 const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);
4261 const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);
4262 if (crossAxisCoord < limitMin) {
4263 crossAxisCoord = limitMin;
4264 } else if (crossAxisCoord > limitMax) {
4265 crossAxisCoord = limitMax;
4266 }
4267 }
4268 return {
4269 [mainAxis]: mainAxisCoord,
4270 [crossAxis]: crossAxisCoord
4271 };
4272 }
4273 };
4274 };
4275 var size = function(options) {
4276 if (options === void 0) {
4277 options = {};
4278 }
4279 return {
4280 name: "size",
4281 options,
4282 async fn(state) {
4283 var _state$middlewareData, _state$middlewareData2;
4284 const {
4285 placement,
4286 rects,
4287 platform: platform3,
4288 elements
4289 } = state;
4290 const {
4291 apply = () => {
4292 },
4293 ...detectOverflowOptions
4294 } = evaluate(options, state);
4295 const overflow = await platform3.detectOverflow(state, detectOverflowOptions);
4296 const side = getSide(placement);
4297 const alignment = getAlignment(placement);
4298 const isYAxis = getSideAxis(placement) === "y";
4299 const {
4300 width,
4301 height
4302 } = rects.floating;
4303 let heightSide;
4304 let widthSide;
4305 if (side === "top" || side === "bottom") {
4306 heightSide = side;
4307 widthSide = alignment === (await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right";
4308 } else {
4309 widthSide = side;
4310 heightSide = alignment === "end" ? "top" : "bottom";
4311 }
4312 const maximumClippingHeight = height - overflow.top - overflow.bottom;
4313 const maximumClippingWidth = width - overflow.left - overflow.right;
4314 const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);
4315 const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);
4316 const noShift = !state.middlewareData.shift;
4317 let availableHeight = overflowAvailableHeight;
4318 let availableWidth = overflowAvailableWidth;
4319 if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {
4320 availableWidth = maximumClippingWidth;
4321 }
4322 if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {
4323 availableHeight = maximumClippingHeight;
4324 }
4325 if (noShift && !alignment) {
4326 const xMin = max(overflow.left, 0);
4327 const xMax = max(overflow.right, 0);
4328 const yMin = max(overflow.top, 0);
4329 const yMax = max(overflow.bottom, 0);
4330 if (isYAxis) {
4331 availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));
4332 } else {
4333 availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));
4334 }
4335 }
4336 await apply({
4337 ...state,
4338 availableWidth,
4339 availableHeight
4340 });
4341 const nextDimensions = await platform3.getDimensions(elements.floating);
4342 if (width !== nextDimensions.width || height !== nextDimensions.height) {
4343 return {
4344 reset: {
4345 rects: true
4346 }
4347 };
4348 }
4349 return {};
4350 }
4351 };
4352 };
4353
4354 // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
4355 function getCssDimensions(element) {
4356 const css = getComputedStyle2(element);
4357 let width = parseFloat(css.width) || 0;
4358 let height = parseFloat(css.height) || 0;
4359 const hasOffset = isHTMLElement(element);
4360 const offsetWidth = hasOffset ? element.offsetWidth : width;
4361 const offsetHeight = hasOffset ? element.offsetHeight : height;
4362 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
4363 if (shouldFallback) {
4364 width = offsetWidth;
4365 height = offsetHeight;
4366 }
4367 return {
4368 width,
4369 height,
4370 $: shouldFallback
4371 };
4372 }
4373 function unwrapElement(element) {
4374 return !isElement(element) ? element.contextElement : element;
4375 }
4376 function getScale(element) {
4377 const domElement = unwrapElement(element);
4378 if (!isHTMLElement(domElement)) {
4379 return createCoords(1);
4380 }
4381 const rect = domElement.getBoundingClientRect();
4382 const {
4383 width,
4384 height,
4385 $: $2
4386 } = getCssDimensions(domElement);
4387 let x2 = ($2 ? round(rect.width) : rect.width) / width;
4388 let y2 = ($2 ? round(rect.height) : rect.height) / height;
4389 if (!x2 || !Number.isFinite(x2)) {
4390 x2 = 1;
4391 }
4392 if (!y2 || !Number.isFinite(y2)) {
4393 y2 = 1;
4394 }
4395 return {
4396 x: x2,
4397 y: y2
4398 };
4399 }
4400 var noOffsets = /* @__PURE__ */ createCoords(0);
4401 function getVisualOffsets(element) {
4402 const win = getWindow(element);
4403 if (!isWebKit() || !win.visualViewport) {
4404 return noOffsets;
4405 }
4406 return {
4407 x: win.visualViewport.offsetLeft,
4408 y: win.visualViewport.offsetTop
4409 };
4410 }
4411 function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {
4412 if (isFixed === void 0) {
4413 isFixed = false;
4414 }
4415 if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {
4416 return false;
4417 }
4418 return isFixed;
4419 }
4420 function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {
4421 if (includeScale === void 0) {
4422 includeScale = false;
4423 }
4424 if (isFixedStrategy === void 0) {
4425 isFixedStrategy = false;
4426 }
4427 const clientRect = element.getBoundingClientRect();
4428 const domElement = unwrapElement(element);
4429 let scale = createCoords(1);
4430 if (includeScale) {
4431 if (offsetParent) {
4432 if (isElement(offsetParent)) {
4433 scale = getScale(offsetParent);
4434 }
4435 } else {
4436 scale = getScale(element);
4437 }
4438 }
4439 const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
4440 let x2 = (clientRect.left + visualOffsets.x) / scale.x;
4441 let y2 = (clientRect.top + visualOffsets.y) / scale.y;
4442 let width = clientRect.width / scale.x;
4443 let height = clientRect.height / scale.y;
4444 if (domElement) {
4445 const win = getWindow(domElement);
4446 const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
4447 let currentWin = win;
4448 let currentIFrame = getFrameElement(currentWin);
4449 while (currentIFrame && offsetParent && offsetWin !== currentWin) {
4450 const iframeScale = getScale(currentIFrame);
4451 const iframeRect = currentIFrame.getBoundingClientRect();
4452 const css = getComputedStyle2(currentIFrame);
4453 const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;
4454 const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;
4455 x2 *= iframeScale.x;
4456 y2 *= iframeScale.y;
4457 width *= iframeScale.x;
4458 height *= iframeScale.y;
4459 x2 += left;
4460 y2 += top;
4461 currentWin = getWindow(currentIFrame);
4462 currentIFrame = getFrameElement(currentWin);
4463 }
4464 }
4465 return rectToClientRect({
4466 width,
4467 height,
4468 x: x2,
4469 y: y2
4470 });
4471 }
4472 function getWindowScrollBarX(element, rect) {
4473 const leftScroll = getNodeScroll(element).scrollLeft;
4474 if (!rect) {
4475 return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;
4476 }
4477 return rect.left + leftScroll;
4478 }
4479 function getHTMLOffset(documentElement, scroll) {
4480 const htmlRect = documentElement.getBoundingClientRect();
4481 const x2 = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);
4482 const y2 = htmlRect.top + scroll.scrollTop;
4483 return {
4484 x: x2,
4485 y: y2
4486 };
4487 }
4488 function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
4489 let {
4490 elements,
4491 rect,
4492 offsetParent,
4493 strategy
4494 } = _ref;
4495 const isFixed = strategy === "fixed";
4496 const documentElement = getDocumentElement(offsetParent);
4497 const topLayer = elements ? isTopLayer(elements.floating) : false;
4498 if (offsetParent === documentElement || topLayer && isFixed) {
4499 return rect;
4500 }
4501 let scroll = {
4502 scrollLeft: 0,
4503 scrollTop: 0
4504 };
4505 let scale = createCoords(1);
4506 const offsets = createCoords(0);
4507 const isOffsetParentAnElement = isHTMLElement(offsetParent);
4508 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
4509 if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) {
4510 scroll = getNodeScroll(offsetParent);
4511 }
4512 if (isOffsetParentAnElement) {
4513 const offsetRect = getBoundingClientRect(offsetParent);
4514 scale = getScale(offsetParent);
4515 offsets.x = offsetRect.x + offsetParent.clientLeft;
4516 offsets.y = offsetRect.y + offsetParent.clientTop;
4517 }
4518 }
4519 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
4520 return {
4521 width: rect.width * scale.x,
4522 height: rect.height * scale.y,
4523 x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,
4524 y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y
4525 };
4526 }
4527 function getClientRects(element) {
4528 return Array.from(element.getClientRects());
4529 }
4530 function getDocumentRect(element) {
4531 const html = getDocumentElement(element);
4532 const scroll = getNodeScroll(element);
4533 const body = element.ownerDocument.body;
4534 const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);
4535 const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);
4536 let x2 = -scroll.scrollLeft + getWindowScrollBarX(element);
4537 const y2 = -scroll.scrollTop;
4538 if (getComputedStyle2(body).direction === "rtl") {
4539 x2 += max(html.clientWidth, body.clientWidth) - width;
4540 }
4541 return {
4542 width,
4543 height,
4544 x: x2,
4545 y: y2
4546 };
4547 }
4548 var SCROLLBAR_MAX = 25;
4549 function getViewportRect(element, strategy) {
4550 const win = getWindow(element);
4551 const html = getDocumentElement(element);
4552 const visualViewport = win.visualViewport;
4553 let width = html.clientWidth;
4554 let height = html.clientHeight;
4555 let x2 = 0;
4556 let y2 = 0;
4557 if (visualViewport) {
4558 width = visualViewport.width;
4559 height = visualViewport.height;
4560 const visualViewportBased = isWebKit();
4561 if (!visualViewportBased || visualViewportBased && strategy === "fixed") {
4562 x2 = visualViewport.offsetLeft;
4563 y2 = visualViewport.offsetTop;
4564 }
4565 }
4566 const windowScrollbarX = getWindowScrollBarX(html);
4567 if (windowScrollbarX <= 0) {
4568 const doc = html.ownerDocument;
4569 const body = doc.body;
4570 const bodyStyles = getComputedStyle(body);
4571 const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;
4572 const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);
4573 if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {
4574 width -= clippingStableScrollbarWidth;
4575 }
4576 } else if (windowScrollbarX <= SCROLLBAR_MAX) {
4577 width += windowScrollbarX;
4578 }
4579 return {
4580 width,
4581 height,
4582 x: x2,
4583 y: y2
4584 };
4585 }
4586 function getInnerBoundingClientRect(element, strategy) {
4587 const clientRect = getBoundingClientRect(element, true, strategy === "fixed");
4588 const top = clientRect.top + element.clientTop;
4589 const left = clientRect.left + element.clientLeft;
4590 const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);
4591 const width = element.clientWidth * scale.x;
4592 const height = element.clientHeight * scale.y;
4593 const x2 = left * scale.x;
4594 const y2 = top * scale.y;
4595 return {
4596 width,
4597 height,
4598 x: x2,
4599 y: y2
4600 };
4601 }
4602 function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {
4603 let rect;
4604 if (clippingAncestor === "viewport") {
4605 rect = getViewportRect(element, strategy);
4606 } else if (clippingAncestor === "document") {
4607 rect = getDocumentRect(getDocumentElement(element));
4608 } else if (isElement(clippingAncestor)) {
4609 rect = getInnerBoundingClientRect(clippingAncestor, strategy);
4610 } else {
4611 const visualOffsets = getVisualOffsets(element);
4612 rect = {
4613 x: clippingAncestor.x - visualOffsets.x,
4614 y: clippingAncestor.y - visualOffsets.y,
4615 width: clippingAncestor.width,
4616 height: clippingAncestor.height
4617 };
4618 }
4619 return rectToClientRect(rect);
4620 }
4621 function hasFixedPositionAncestor(element, stopNode) {
4622 const parentNode = getParentNode(element);
4623 if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {
4624 return false;
4625 }
4626 return getComputedStyle2(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode);
4627 }
4628 function getClippingElementAncestors(element, cache) {
4629 const cachedResult = cache.get(element);
4630 if (cachedResult) {
4631 return cachedResult;
4632 }
4633 let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body");
4634 let currentContainingBlockComputedStyle = null;
4635 const elementIsFixed = getComputedStyle2(element).position === "fixed";
4636 let currentNode = elementIsFixed ? getParentNode(element) : element;
4637 while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {
4638 const computedStyle = getComputedStyle2(currentNode);
4639 const currentNodeIsContaining = isContainingBlock(currentNode);
4640 if (!currentNodeIsContaining && computedStyle.position === "fixed") {
4641 currentContainingBlockComputedStyle = null;
4642 }
4643 const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === "absolute" || currentContainingBlockComputedStyle.position === "fixed") || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);
4644 if (shouldDropCurrentNode) {
4645 result = result.filter((ancestor) => ancestor !== currentNode);
4646 } else {
4647 currentContainingBlockComputedStyle = computedStyle;
4648 }
4649 currentNode = getParentNode(currentNode);
4650 }
4651 cache.set(element, result);
4652 return result;
4653 }
4654 function getClippingRect(_ref) {
4655 let {
4656 element,
4657 boundary,
4658 rootBoundary,
4659 strategy
4660 } = _ref;
4661 const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);
4662 const clippingAncestors = [...elementClippingAncestors, rootBoundary];
4663 const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);
4664 let top = firstRect.top;
4665 let right = firstRect.right;
4666 let bottom = firstRect.bottom;
4667 let left = firstRect.left;
4668 for (let i2 = 1; i2 < clippingAncestors.length; i2++) {
4669 const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i2], strategy);
4670 top = max(rect.top, top);
4671 right = min(rect.right, right);
4672 bottom = min(rect.bottom, bottom);
4673 left = max(rect.left, left);
4674 }
4675 return {
4676 width: right - left,
4677 height: bottom - top,
4678 x: left,
4679 y: top
4680 };
4681 }
4682 function getDimensions(element) {
4683 const {
4684 width,
4685 height
4686 } = getCssDimensions(element);
4687 return {
4688 width,
4689 height
4690 };
4691 }
4692 function getRectRelativeToOffsetParent(element, offsetParent, strategy) {
4693 const isOffsetParentAnElement = isHTMLElement(offsetParent);
4694 const documentElement = getDocumentElement(offsetParent);
4695 const isFixed = strategy === "fixed";
4696 const rect = getBoundingClientRect(element, true, isFixed, offsetParent);
4697 let scroll = {
4698 scrollLeft: 0,
4699 scrollTop: 0
4700 };
4701 const offsets = createCoords(0);
4702 function setLeftRTLScrollbarOffset() {
4703 offsets.x = getWindowScrollBarX(documentElement);
4704 }
4705 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
4706 if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) {
4707 scroll = getNodeScroll(offsetParent);
4708 }
4709 if (isOffsetParentAnElement) {
4710 const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);
4711 offsets.x = offsetRect.x + offsetParent.clientLeft;
4712 offsets.y = offsetRect.y + offsetParent.clientTop;
4713 } else if (documentElement) {
4714 setLeftRTLScrollbarOffset();
4715 }
4716 }
4717 if (isFixed && !isOffsetParentAnElement && documentElement) {
4718 setLeftRTLScrollbarOffset();
4719 }
4720 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
4721 const x2 = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;
4722 const y2 = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;
4723 return {
4724 x: x2,
4725 y: y2,
4726 width: rect.width,
4727 height: rect.height
4728 };
4729 }
4730 function isStaticPositioned(element) {
4731 return getComputedStyle2(element).position === "static";
4732 }
4733 function getTrueOffsetParent(element, polyfill) {
4734 if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") {
4735 return null;
4736 }
4737 if (polyfill) {
4738 return polyfill(element);
4739 }
4740 let rawOffsetParent = element.offsetParent;
4741 if (getDocumentElement(element) === rawOffsetParent) {
4742 rawOffsetParent = rawOffsetParent.ownerDocument.body;
4743 }
4744 return rawOffsetParent;
4745 }
4746 function getOffsetParent(element, polyfill) {
4747 const win = getWindow(element);
4748 if (isTopLayer(element)) {
4749 return win;
4750 }
4751 if (!isHTMLElement(element)) {
4752 let svgOffsetParent = getParentNode(element);
4753 while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {
4754 if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {
4755 return svgOffsetParent;
4756 }
4757 svgOffsetParent = getParentNode(svgOffsetParent);
4758 }
4759 return win;
4760 }
4761 let offsetParent = getTrueOffsetParent(element, polyfill);
4762 while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {
4763 offsetParent = getTrueOffsetParent(offsetParent, polyfill);
4764 }
4765 if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {
4766 return win;
4767 }
4768 return offsetParent || getContainingBlock(element) || win;
4769 }
4770 var getElementRects = async function(data) {
4771 const getOffsetParentFn = this.getOffsetParent || getOffsetParent;
4772 const getDimensionsFn = this.getDimensions;
4773 const floatingDimensions = await getDimensionsFn(data.floating);
4774 return {
4775 reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),
4776 floating: {
4777 x: 0,
4778 y: 0,
4779 width: floatingDimensions.width,
4780 height: floatingDimensions.height
4781 }
4782 };
4783 };
4784 function isRTL(element) {
4785 return getComputedStyle2(element).direction === "rtl";
4786 }
4787 var platform2 = {
4788 convertOffsetParentRelativeRectToViewportRelativeRect,
4789 getDocumentElement,
4790 getClippingRect,
4791 getOffsetParent,
4792 getElementRects,
4793 getClientRects,
4794 getDimensions,
4795 getScale,
4796 isElement,
4797 isRTL
4798 };
4799 function rectsAreEqual(a2, b2) {
4800 return a2.x === b2.x && a2.y === b2.y && a2.width === b2.width && a2.height === b2.height;
4801 }
4802 function observeMove(element, onMove) {
4803 let io = null;
4804 let timeoutId;
4805 const root = getDocumentElement(element);
4806 function cleanup() {
4807 var _io;
4808 clearTimeout(timeoutId);
4809 (_io = io) == null || _io.disconnect();
4810 io = null;
4811 }
4812 function refresh(skip, threshold) {
4813 if (skip === void 0) {
4814 skip = false;
4815 }
4816 if (threshold === void 0) {
4817 threshold = 1;
4818 }
4819 cleanup();
4820 const elementRectForRootMargin = element.getBoundingClientRect();
4821 const {
4822 left,
4823 top,
4824 width,
4825 height
4826 } = elementRectForRootMargin;
4827 if (!skip) {
4828 onMove();
4829 }
4830 if (!width || !height) {
4831 return;
4832 }
4833 const insetTop = floor(top);
4834 const insetRight = floor(root.clientWidth - (left + width));
4835 const insetBottom = floor(root.clientHeight - (top + height));
4836 const insetLeft = floor(left);
4837 const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px";
4838 const options = {
4839 rootMargin,
4840 threshold: max(0, min(1, threshold)) || 1
4841 };
4842 let isFirstUpdate = true;
4843 function handleObserve(entries) {
4844 const ratio = entries[0].intersectionRatio;
4845 if (ratio !== threshold) {
4846 if (!isFirstUpdate) {
4847 return refresh();
4848 }
4849 if (!ratio) {
4850 timeoutId = setTimeout(() => {
4851 refresh(false, 1e-7);
4852 }, 1e3);
4853 } else {
4854 refresh(false, ratio);
4855 }
4856 }
4857 if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {
4858 refresh();
4859 }
4860 isFirstUpdate = false;
4861 }
4862 try {
4863 io = new IntersectionObserver(handleObserve, {
4864 ...options,
4865 // Handle <iframe>s
4866 root: root.ownerDocument
4867 });
4868 } catch (_e) {
4869 io = new IntersectionObserver(handleObserve, options);
4870 }
4871 io.observe(element);
4872 }
4873 refresh(true);
4874 return cleanup;
4875 }
4876 function autoUpdate(reference, floating, update2, options) {
4877 if (options === void 0) {
4878 options = {};
4879 }
4880 const {
4881 ancestorScroll = true,
4882 ancestorResize = true,
4883 elementResize = typeof ResizeObserver === "function",
4884 layoutShift = typeof IntersectionObserver === "function",
4885 animationFrame = false
4886 } = options;
4887 const referenceEl = unwrapElement(reference);
4888 const ancestors = ancestorScroll || ancestorResize ? [...referenceEl ? getOverflowAncestors(referenceEl) : [], ...floating ? getOverflowAncestors(floating) : []] : [];
4889 ancestors.forEach((ancestor) => {
4890 ancestorScroll && ancestor.addEventListener("scroll", update2, {
4891 passive: true
4892 });
4893 ancestorResize && ancestor.addEventListener("resize", update2);
4894 });
4895 const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update2) : null;
4896 let reobserveFrame = -1;
4897 let resizeObserver = null;
4898 if (elementResize) {
4899 resizeObserver = new ResizeObserver((_ref) => {
4900 let [firstEntry] = _ref;
4901 if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {
4902 resizeObserver.unobserve(floating);
4903 cancelAnimationFrame(reobserveFrame);
4904 reobserveFrame = requestAnimationFrame(() => {
4905 var _resizeObserver;
4906 (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);
4907 });
4908 }
4909 update2();
4910 });
4911 if (referenceEl && !animationFrame) {
4912 resizeObserver.observe(referenceEl);
4913 }
4914 if (floating) {
4915 resizeObserver.observe(floating);
4916 }
4917 }
4918 let frameId;
4919 let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;
4920 if (animationFrame) {
4921 frameLoop();
4922 }
4923 function frameLoop() {
4924 const nextRefRect = getBoundingClientRect(reference);
4925 if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {
4926 update2();
4927 }
4928 prevRefRect = nextRefRect;
4929 frameId = requestAnimationFrame(frameLoop);
4930 }
4931 update2();
4932 return () => {
4933 var _resizeObserver2;
4934 ancestors.forEach((ancestor) => {
4935 ancestorScroll && ancestor.removeEventListener("scroll", update2);
4936 ancestorResize && ancestor.removeEventListener("resize", update2);
4937 });
4938 cleanupIo == null || cleanupIo();
4939 (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();
4940 resizeObserver = null;
4941 if (animationFrame) {
4942 cancelAnimationFrame(frameId);
4943 }
4944 };
4945 }
4946 var offset2 = offset;
4947 var shift2 = shift;
4948 var flip2 = flip;
4949 var size2 = size;
4950 var hide2 = hide;
4951 var limitShift2 = limitShift;
4952 var computePosition2 = (reference, floating, options) => {
4953 const cache = /* @__PURE__ */ new Map();
4954 const mergedOptions = {
4955 platform: platform2,
4956 ...options
4957 };
4958 const platformWithCache = {
4959 ...mergedOptions.platform,
4960 _c: cache
4961 };
4962 return computePosition(reference, floating, {
4963 ...mergedOptions,
4964 platform: platformWithCache
4965 });
4966 };
4967
4968 // node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs
4969 var React19 = __toESM(require_react(), 1);
4970 var import_react2 = __toESM(require_react(), 1);
4971 var ReactDOM3 = __toESM(require_react_dom(), 1);
4972 var isClient = typeof document !== "undefined";
4973 var noop2 = function noop3() {
4974 };
4975 var index = isClient ? import_react2.useLayoutEffect : noop2;
4976 function deepEqual(a2, b2) {
4977 if (a2 === b2) {
4978 return true;
4979 }
4980 if (typeof a2 !== typeof b2) {
4981 return false;
4982 }
4983 if (typeof a2 === "function" && a2.toString() === b2.toString()) {
4984 return true;
4985 }
4986 let length;
4987 let i2;
4988 let keys;
4989 if (a2 && b2 && typeof a2 === "object") {
4990 if (Array.isArray(a2)) {
4991 length = a2.length;
4992 if (length !== b2.length) return false;
4993 for (i2 = length; i2-- !== 0; ) {
4994 if (!deepEqual(a2[i2], b2[i2])) {
4995 return false;
4996 }
4997 }
4998 return true;
4999 }
5000 keys = Object.keys(a2);
5001 length = keys.length;
5002 if (length !== Object.keys(b2).length) {
5003 return false;
5004 }
5005 for (i2 = length; i2-- !== 0; ) {
5006 if (!{}.hasOwnProperty.call(b2, keys[i2])) {
5007 return false;
5008 }
5009 }
5010 for (i2 = length; i2-- !== 0; ) {
5011 const key = keys[i2];
5012 if (key === "_owner" && a2.$$typeof) {
5013 continue;
5014 }
5015 if (!deepEqual(a2[key], b2[key])) {
5016 return false;
5017 }
5018 }
5019 return true;
5020 }
5021 return a2 !== a2 && b2 !== b2;
5022 }
5023 function getDPR(element) {
5024 if (typeof window === "undefined") {
5025 return 1;
5026 }
5027 const win = element.ownerDocument.defaultView || window;
5028 return win.devicePixelRatio || 1;
5029 }
5030 function roundByDPR(element, value) {
5031 const dpr = getDPR(element);
5032 return Math.round(value * dpr) / dpr;
5033 }
5034 function useLatestRef(value) {
5035 const ref = React19.useRef(value);
5036 index(() => {
5037 ref.current = value;
5038 });
5039 return ref;
5040 }
5041 function useFloating(options) {
5042 if (options === void 0) {
5043 options = {};
5044 }
5045 const {
5046 placement = "bottom",
5047 strategy = "absolute",
5048 middleware = [],
5049 platform: platform3,
5050 elements: {
5051 reference: externalReference,
5052 floating: externalFloating
5053 } = {},
5054 transform = true,
5055 whileElementsMounted,
5056 open
5057 } = options;
5058 const [data, setData] = React19.useState({
5059 x: 0,
5060 y: 0,
5061 strategy,
5062 placement,
5063 middlewareData: {},
5064 isPositioned: false
5065 });
5066 const [latestMiddleware, setLatestMiddleware] = React19.useState(middleware);
5067 if (!deepEqual(latestMiddleware, middleware)) {
5068 setLatestMiddleware(middleware);
5069 }
5070 const [_reference, _setReference] = React19.useState(null);
5071 const [_floating, _setFloating] = React19.useState(null);
5072 const setReference = React19.useCallback((node) => {
5073 if (node !== referenceRef.current) {
5074 referenceRef.current = node;
5075 _setReference(node);
5076 }
5077 }, []);
5078 const setFloating = React19.useCallback((node) => {
5079 if (node !== floatingRef.current) {
5080 floatingRef.current = node;
5081 _setFloating(node);
5082 }
5083 }, []);
5084 const referenceEl = externalReference || _reference;
5085 const floatingEl = externalFloating || _floating;
5086 const referenceRef = React19.useRef(null);
5087 const floatingRef = React19.useRef(null);
5088 const dataRef = React19.useRef(data);
5089 const hasWhileElementsMounted = whileElementsMounted != null;
5090 const whileElementsMountedRef = useLatestRef(whileElementsMounted);
5091 const platformRef = useLatestRef(platform3);
5092 const openRef = useLatestRef(open);
5093 const update2 = React19.useCallback(() => {
5094 if (!referenceRef.current || !floatingRef.current) {
5095 return;
5096 }
5097 const config = {
5098 placement,
5099 strategy,
5100 middleware: latestMiddleware
5101 };
5102 if (platformRef.current) {
5103 config.platform = platformRef.current;
5104 }
5105 computePosition2(referenceRef.current, floatingRef.current, config).then((data2) => {
5106 const fullData = {
5107 ...data2,
5108 // The floating element's position may be recomputed while it's closed
5109 // but still mounted (such as when transitioning out). To ensure
5110 // `isPositioned` will be `false` initially on the next open, avoid
5111 // setting it to `true` when `open === false` (must be specified).
5112 isPositioned: openRef.current !== false
5113 };
5114 if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {
5115 dataRef.current = fullData;
5116 ReactDOM3.flushSync(() => {
5117 setData(fullData);
5118 });
5119 }
5120 });
5121 }, [latestMiddleware, placement, strategy, platformRef, openRef]);
5122 index(() => {
5123 if (open === false && dataRef.current.isPositioned) {
5124 dataRef.current.isPositioned = false;
5125 setData((data2) => ({
5126 ...data2,
5127 isPositioned: false
5128 }));
5129 }
5130 }, [open]);
5131 const isMountedRef = React19.useRef(false);
5132 index(() => {
5133 isMountedRef.current = true;
5134 return () => {
5135 isMountedRef.current = false;
5136 };
5137 }, []);
5138 index(() => {
5139 if (referenceEl) referenceRef.current = referenceEl;
5140 if (floatingEl) floatingRef.current = floatingEl;
5141 if (referenceEl && floatingEl) {
5142 if (whileElementsMountedRef.current) {
5143 return whileElementsMountedRef.current(referenceEl, floatingEl, update2);
5144 }
5145 update2();
5146 }
5147 }, [referenceEl, floatingEl, update2, whileElementsMountedRef, hasWhileElementsMounted]);
5148 const refs = React19.useMemo(() => ({
5149 reference: referenceRef,
5150 floating: floatingRef,
5151 setReference,
5152 setFloating
5153 }), [setReference, setFloating]);
5154 const elements = React19.useMemo(() => ({
5155 reference: referenceEl,
5156 floating: floatingEl
5157 }), [referenceEl, floatingEl]);
5158 const floatingStyles = React19.useMemo(() => {
5159 const initialStyles = {
5160 position: strategy,
5161 left: 0,
5162 top: 0
5163 };
5164 if (!elements.floating) {
5165 return initialStyles;
5166 }
5167 const x2 = roundByDPR(elements.floating, data.x);
5168 const y2 = roundByDPR(elements.floating, data.y);
5169 if (transform) {
5170 return {
5171 ...initialStyles,
5172 transform: "translate(" + x2 + "px, " + y2 + "px)",
5173 ...getDPR(elements.floating) >= 1.5 && {
5174 willChange: "transform"
5175 }
5176 };
5177 }
5178 return {
5179 position: strategy,
5180 left: x2,
5181 top: y2
5182 };
5183 }, [strategy, transform, elements.floating, data.x, data.y]);
5184 return React19.useMemo(() => ({
5185 ...data,
5186 update: update2,
5187 refs,
5188 elements,
5189 floatingStyles
5190 }), [data, update2, refs, elements, floatingStyles]);
5191 }
5192 var offset3 = (options, deps) => {
5193 const result = offset2(options);
5194 return {
5195 name: result.name,
5196 fn: result.fn,
5197 options: [options, deps]
5198 };
5199 };
5200 var shift3 = (options, deps) => {
5201 const result = shift2(options);
5202 return {
5203 name: result.name,
5204 fn: result.fn,
5205 options: [options, deps]
5206 };
5207 };
5208 var limitShift3 = (options, deps) => {
5209 const result = limitShift2(options);
5210 return {
5211 fn: result.fn,
5212 options: [options, deps]
5213 };
5214 };
5215 var flip3 = (options, deps) => {
5216 const result = flip2(options);
5217 return {
5218 name: result.name,
5219 fn: result.fn,
5220 options: [options, deps]
5221 };
5222 };
5223 var size3 = (options, deps) => {
5224 const result = size2(options);
5225 return {
5226 name: result.name,
5227 fn: result.fn,
5228 options: [options, deps]
5229 };
5230 };
5231 var hide3 = (options, deps) => {
5232 const result = hide2(options);
5233 return {
5234 name: result.name,
5235 fn: result.fn,
5236 options: [options, deps]
5237 };
5238 };
5239
5240 // node_modules/@base-ui/react/utils/popups/popupStoreUtils.mjs
5241 var React24 = __toESM(require_react(), 1);
5242 var ReactDOM4 = __toESM(require_react_dom(), 1);
5243
5244 // node_modules/@base-ui/react/floating-ui-react/hooks/useSyncedFloatingRootContext.mjs
5245 var React23 = __toESM(require_react(), 1);
5246
5247 // node_modules/@base-ui/utils/store/createSelector.mjs
5248 var createSelector = (a2, b2, c2, d2, e2, f2, ...other) => {
5249 if (other.length > 0) {
5250 throw new Error(true ? "Unsupported number of selectors" : formatErrorMessage_default(1));
5251 }
5252 let selector2;
5253 if (a2 && b2 && c2 && d2 && e2 && f2) {
5254 selector2 = (state, a1, a22, a3) => {
5255 const va = a2(state, a1, a22, a3);
5256 const vb = b2(state, a1, a22, a3);
5257 const vc = c2(state, a1, a22, a3);
5258 const vd = d2(state, a1, a22, a3);
5259 const ve = e2(state, a1, a22, a3);
5260 return f2(va, vb, vc, vd, ve, a1, a22, a3);
5261 };
5262 } else if (a2 && b2 && c2 && d2 && e2) {
5263 selector2 = (state, a1, a22, a3) => {
5264 const va = a2(state, a1, a22, a3);
5265 const vb = b2(state, a1, a22, a3);
5266 const vc = c2(state, a1, a22, a3);
5267 const vd = d2(state, a1, a22, a3);
5268 return e2(va, vb, vc, vd, a1, a22, a3);
5269 };
5270 } else if (a2 && b2 && c2 && d2) {
5271 selector2 = (state, a1, a22, a3) => {
5272 const va = a2(state, a1, a22, a3);
5273 const vb = b2(state, a1, a22, a3);
5274 const vc = c2(state, a1, a22, a3);
5275 return d2(va, vb, vc, a1, a22, a3);
5276 };
5277 } else if (a2 && b2 && c2) {
5278 selector2 = (state, a1, a22, a3) => {
5279 const va = a2(state, a1, a22, a3);
5280 const vb = b2(state, a1, a22, a3);
5281 return c2(va, vb, a1, a22, a3);
5282 };
5283 } else if (a2 && b2) {
5284 selector2 = (state, a1, a22, a3) => {
5285 const va = a2(state, a1, a22, a3);
5286 return b2(va, a1, a22, a3);
5287 };
5288 } else if (a2) {
5289 selector2 = a2;
5290 } else {
5291 throw (
5292 /* minify-error-disabled */
5293 new Error("Missing arguments")
5294 );
5295 }
5296 return selector2;
5297 };
5298
5299 // node_modules/@base-ui/utils/store/useStore.mjs
5300 var React21 = __toESM(require_react(), 1);
5301 var import_shim = __toESM(require_shim(), 1);
5302 var import_with_selector = __toESM(require_with_selector(), 1);
5303
5304 // node_modules/@base-ui/utils/fastHooks.mjs
5305 var React20 = __toESM(require_react(), 1);
5306 var hooks = [];
5307 var currentInstance = void 0;
5308 function getInstance() {
5309 return currentInstance;
5310 }
5311 function register(hook) {
5312 hooks.push(hook);
5313 }
5314 function fastComponent(fn) {
5315 const FastComponent = (props, forwardedRef) => {
5316 const instance = useRefWithInit(createInstance).current;
5317 let result;
5318 try {
5319 currentInstance = instance;
5320 for (const hook of hooks) {
5321 hook.before(instance);
5322 }
5323 result = fn(props, forwardedRef);
5324 for (const hook of hooks) {
5325 hook.after(instance);
5326 }
5327 instance.didInitialize = true;
5328 } finally {
5329 currentInstance = void 0;
5330 }
5331 return result;
5332 };
5333 FastComponent.displayName = fn.displayName || fn.name;
5334 return FastComponent;
5335 }
5336 function fastComponentRef(fn) {
5337 return /* @__PURE__ */ React20.forwardRef(fastComponent(fn));
5338 }
5339 function createInstance() {
5340 return {
5341 didInitialize: false
5342 };
5343 }
5344
5345 // node_modules/@base-ui/utils/store/useStore.mjs
5346 var canUseRawUseSyncExternalStore = isReactVersionAtLeast(19);
5347 var useStoreImplementation = canUseRawUseSyncExternalStore ? useStoreFast : useStoreLegacy;
5348 function useStore(store, selector2, a1, a2, a3) {
5349 return useStoreImplementation(store, selector2, a1, a2, a3);
5350 }
5351 function useStoreR19(store, selector2, a1, a2, a3) {
5352 const getSelection = React21.useCallback(() => selector2(store.getSnapshot(), a1, a2, a3), [store, selector2, a1, a2, a3]);
5353 return (0, import_shim.useSyncExternalStore)(store.subscribe, getSelection, getSelection);
5354 }
5355 register({
5356 before(instance) {
5357 instance.syncIndex = 0;
5358 if (!instance.didInitialize) {
5359 instance.syncTick = 1;
5360 instance.syncHooks = [];
5361 instance.didChangeStore = true;
5362 instance.getSnapshot = () => {
5363 let didChange2 = false;
5364 for (let i2 = 0; i2 < instance.syncHooks.length; i2 += 1) {
5365 const hook = instance.syncHooks[i2];
5366 const value = hook.selector(hook.store.state, hook.a1, hook.a2, hook.a3);
5367 if (!Object.is(hook.value, value)) {
5368 didChange2 = true;
5369 hook.value = value;
5370 }
5371 }
5372 if (didChange2) {
5373 instance.syncTick += 1;
5374 }
5375 return instance.syncTick;
5376 };
5377 }
5378 },
5379 after(instance) {
5380 if (instance.syncHooks.length > 0) {
5381 if (instance.didChangeStore) {
5382 instance.didChangeStore = false;
5383 instance.subscribe = (onStoreChange) => {
5384 const stores = /* @__PURE__ */ new Set();
5385 for (const hook of instance.syncHooks) {
5386 stores.add(hook.store);
5387 }
5388 const unsubscribes = [];
5389 for (const store of stores) {
5390 unsubscribes.push(store.subscribe(onStoreChange));
5391 }
5392 return () => {
5393 for (const unsubscribe of unsubscribes) {
5394 unsubscribe();
5395 }
5396 };
5397 };
5398 }
5399 (0, import_shim.useSyncExternalStore)(instance.subscribe, instance.getSnapshot, instance.getSnapshot);
5400 }
5401 }
5402 });
5403 function useStoreFast(store, selector2, a1, a2, a3) {
5404 const instance = getInstance();
5405 if (!instance) {
5406 return useStoreR19(store, selector2, a1, a2, a3);
5407 }
5408 const index2 = instance.syncIndex;
5409 instance.syncIndex += 1;
5410 let hook;
5411 if (!instance.didInitialize) {
5412 hook = {
5413 store,
5414 selector: selector2,
5415 a1,
5416 a2,
5417 a3,
5418 value: selector2(store.getSnapshot(), a1, a2, a3)
5419 };
5420 instance.syncHooks.push(hook);
5421 } else {
5422 hook = instance.syncHooks[index2];
5423 if (hook.store !== store || hook.selector !== selector2 || !Object.is(hook.a1, a1) || !Object.is(hook.a2, a2) || !Object.is(hook.a3, a3)) {
5424 if (hook.store !== store) {
5425 instance.didChangeStore = true;
5426 }
5427 hook.store = store;
5428 hook.selector = selector2;
5429 hook.a1 = a1;
5430 hook.a2 = a2;
5431 hook.a3 = a3;
5432 hook.value = selector2(store.getSnapshot(), a1, a2, a3);
5433 }
5434 }
5435 return hook.value;
5436 }
5437 function useStoreLegacy(store, selector2, a1, a2, a3) {
5438 return (0, import_with_selector.useSyncExternalStoreWithSelector)(store.subscribe, store.getSnapshot, store.getSnapshot, (state) => selector2(state, a1, a2, a3));
5439 }
5440
5441 // node_modules/@base-ui/utils/store/Store.mjs
5442 var Store = class {
5443 /**
5444 * The current state of the store.
5445 * This property is updated immediately when the state changes as a result of calling {@link setState}, {@link update}, or {@link set}.
5446 * To subscribe to state changes, use the {@link useState} method. The value returned by {@link useState} is updated after the component renders (similarly to React's useState).
5447 * The values can be used directly (to avoid subscribing to the store) in effects or event handlers.
5448 *
5449 * Do not modify properties in state directly. Instead, use the provided methods to ensure proper state management and listener notification.
5450 */
5451 // Internal state to handle recursive `setState()` calls
5452 constructor(state) {
5453 this.state = state;
5454 this.listeners = /* @__PURE__ */ new Set();
5455 this.updateTick = 0;
5456 }
5457 /**
5458 * Registers a listener that will be called whenever the store's state changes.
5459 *
5460 * @param fn The listener function to be called on state changes.
5461 * @returns A function to unsubscribe the listener.
5462 */
5463 subscribe = (fn) => {
5464 this.listeners.add(fn);
5465 return () => {
5466 this.listeners.delete(fn);
5467 };
5468 };
5469 /**
5470 * Returns the current state of the store.
5471 */
5472 getSnapshot = () => {
5473 return this.state;
5474 };
5475 /**
5476 * Updates the entire store's state and notifies all registered listeners.
5477 *
5478 * @param newState The new state to set for the store.
5479 */
5480 setState(newState) {
5481 if (this.state === newState) {
5482 return;
5483 }
5484 this.state = newState;
5485 this.updateTick += 1;
5486 const currentTick = this.updateTick;
5487 for (const listener of this.listeners) {
5488 if (currentTick !== this.updateTick) {
5489 return;
5490 }
5491 listener(newState);
5492 }
5493 }
5494 /**
5495 * Merges the provided changes into the current state and notifies listeners if there are changes.
5496 *
5497 * @param changes An object containing the changes to apply to the current state.
5498 */
5499 update(changes) {
5500 for (const key in changes) {
5501 if (!Object.is(this.state[key], changes[key])) {
5502 this.setState({
5503 ...this.state,
5504 ...changes
5505 });
5506 return;
5507 }
5508 }
5509 }
5510 /**
5511 * Sets a specific key in the store's state to a new value and notifies listeners if the value has changed.
5512 *
5513 * @param key The key in the store's state to update.
5514 * @param value The new value to set for the specified key.
5515 */
5516 set(key, value) {
5517 if (!Object.is(this.state[key], value)) {
5518 this.setState({
5519 ...this.state,
5520 [key]: value
5521 });
5522 }
5523 }
5524 /**
5525 * Gives the state a new reference and updates all registered listeners.
5526 */
5527 notifyAll() {
5528 const newState = {
5529 ...this.state
5530 };
5531 this.setState(newState);
5532 }
5533 use(selector2, a1, a2, a3) {
5534 return useStore(this, selector2, a1, a2, a3);
5535 }
5536 };
5537
5538 // node_modules/@base-ui/utils/store/ReactStore.mjs
5539 var React22 = __toESM(require_react(), 1);
5540 var ReactStore = class extends Store {
5541 /**
5542 * Creates a new ReactStore instance.
5543 *
5544 * @param state Initial state of the store.
5545 * @param context Non-reactive context values.
5546 * @param selectors Optional selectors for use with `useState`.
5547 */
5548 constructor(state, context = {}, selectors3) {
5549 super(state);
5550 this.context = context;
5551 this.selectors = selectors3;
5552 }
5553 /**
5554 * Non-reactive values such as refs, callbacks, etc.
5555 */
5556 /**
5557 * Synchronizes a single external value into the store.
5558 *
5559 * Note that the while the value in `state` is updated immediately, the value returned
5560 * by `useState` is updated before the next render (similarly to React's `useState`).
5561 */
5562 useSyncedValue(key, value) {
5563 React22.useDebugValue(key);
5564 const store = this;
5565 useIsoLayoutEffect(() => {
5566 if (store.state[key] !== value) {
5567 store.set(key, value);
5568 }
5569 }, [store, key, value]);
5570 }
5571 /**
5572 * Synchronizes a single external value into the store and
5573 * cleans it up (sets to `undefined`) on unmount.
5574 *
5575 * Note that the while the value in `state` is updated immediately, the value returned
5576 * by `useState` is updated before the next render (similarly to React's `useState`).
5577 */
5578 useSyncedValueWithCleanup(key, value) {
5579 const store = this;
5580 useIsoLayoutEffect(() => {
5581 if (store.state[key] !== value) {
5582 store.set(key, value);
5583 }
5584 return () => {
5585 store.set(key, void 0);
5586 };
5587 }, [store, key, value]);
5588 }
5589 /**
5590 * Synchronizes multiple external values into the store.
5591 *
5592 * Note that the while the values in `state` are updated immediately, the values returned
5593 * by `useState` are updated before the next render (similarly to React's `useState`).
5594 */
5595 useSyncedValues(statePart) {
5596 const store = this;
5597 if (true) {
5598 React22.useDebugValue(statePart, (p2) => Object.keys(p2));
5599 const keys = React22.useRef(Object.keys(statePart)).current;
5600 const nextKeys = Object.keys(statePart);
5601 if (keys.length !== nextKeys.length || keys.some((key, index2) => key !== nextKeys[index2])) {
5602 console.error("ReactStore.useSyncedValues expects the same prop keys on every render. Keys should be stable.");
5603 }
5604 }
5605 const dependencies = Object.values(statePart);
5606 useIsoLayoutEffect(() => {
5607 store.update(statePart);
5608 }, [store, ...dependencies]);
5609 }
5610 /**
5611 * Registers a controllable prop pair (`controlled`, `defaultValue`) for a specific key. If `controlled`
5612 * is non-undefined, the store's state at `key` is updated to match `controlled`.
5613 */
5614 useControlledProp(key, controlled) {
5615 React22.useDebugValue(key);
5616 const store = this;
5617 const isControlled = controlled !== void 0;
5618 useIsoLayoutEffect(() => {
5619 if (isControlled && !Object.is(store.state[key], controlled)) {
5620 store.setState({
5621 ...store.state,
5622 [key]: controlled
5623 });
5624 }
5625 }, [store, key, controlled, isControlled]);
5626 if (true) {
5627 const cache = this.controlledValues ??= /* @__PURE__ */ new Map();
5628 if (!cache.has(key)) {
5629 cache.set(key, isControlled);
5630 }
5631 const previouslyControlled = cache.get(key);
5632 if (previouslyControlled !== void 0 && previouslyControlled !== isControlled) {
5633 console.error(`A component is changing the ${isControlled ? "" : "un"}controlled state of ${key.toString()} to be ${isControlled ? "un" : ""}controlled. Elements should not switch from uncontrolled to controlled (or vice versa).`);
5634 }
5635 }
5636 }
5637 /** Gets the current value from the store using a selector with the provided key.
5638 *
5639 * @param key Key of the selector to use.
5640 */
5641 select(key, a1, a2, a3) {
5642 const selector2 = this.selectors[key];
5643 return selector2(this.state, a1, a2, a3);
5644 }
5645 /**
5646 * Returns a value from the store's state using a selector function.
5647 * Used to subscribe to specific parts of the state.
5648 * This methods causes a rerender whenever the selected state changes.
5649 *
5650 * @param key Key of the selector to use.
5651 */
5652 useState(key, a1, a2, a3) {
5653 React22.useDebugValue(key);
5654 return useStore(this, this.selectors[key], a1, a2, a3);
5655 }
5656 /**
5657 * Wraps a function with `useStableCallback` to ensure it has a stable reference
5658 * and assigns it to the context.
5659 *
5660 * @param key Key of the event callback. Must be a function in the context.
5661 * @param fn Function to assign.
5662 */
5663 useContextCallback(key, fn) {
5664 React22.useDebugValue(key);
5665 const stableFunction = useStableCallback(fn ?? NOOP);
5666 this.context[key] = stableFunction;
5667 }
5668 /**
5669 * Returns a stable setter function for a specific key in the store's state.
5670 * It's commonly used to pass as a ref callback to React elements.
5671 *
5672 * @param key Key of the state to set.
5673 */
5674 useStateSetter(key) {
5675 const ref = React22.useRef(void 0);
5676 if (ref.current === void 0) {
5677 ref.current = (value) => {
5678 this.set(key, value);
5679 };
5680 }
5681 return ref.current;
5682 }
5683 /**
5684 * Observes changes derived from the store's selectors and calls the listener when the selected value changes.
5685 *
5686 * @param key Key of the selector to observe.
5687 * @param listener Listener function called when the selector result changes.
5688 */
5689 observe(selector2, listener) {
5690 let selectFn;
5691 if (typeof selector2 === "function") {
5692 selectFn = selector2;
5693 } else {
5694 selectFn = this.selectors[selector2];
5695 }
5696 let prevValue = selectFn(this.state);
5697 listener(prevValue, prevValue, this);
5698 return this.subscribe((nextState) => {
5699 const nextValue = selectFn(nextState);
5700 if (!Object.is(prevValue, nextValue)) {
5701 const oldValue = prevValue;
5702 prevValue = nextValue;
5703 listener(nextValue, oldValue, this);
5704 }
5705 });
5706 }
5707 };
5708
5709 // node_modules/@base-ui/react/floating-ui-react/components/FloatingRootStore.mjs
5710 var selectors = {
5711 open: createSelector((state) => state.open),
5712 transitionStatus: createSelector((state) => state.transitionStatus),
5713 domReferenceElement: createSelector((state) => state.domReferenceElement),
5714 referenceElement: createSelector((state) => state.positionReference ?? state.referenceElement),
5715 floatingElement: createSelector((state) => state.floatingElement),
5716 floatingId: createSelector((state) => state.floatingId)
5717 };
5718 var FloatingRootStore = class extends ReactStore {
5719 constructor(options) {
5720 const {
5721 syncOnly,
5722 nested,
5723 onOpenChange,
5724 triggerElements,
5725 ...initialState
5726 } = options;
5727 super({
5728 ...initialState,
5729 positionReference: initialState.referenceElement,
5730 domReferenceElement: initialState.referenceElement
5731 }, {
5732 onOpenChange,
5733 dataRef: {
5734 current: {}
5735 },
5736 events: createEventEmitter(),
5737 nested,
5738 triggerElements
5739 }, selectors);
5740 this.syncOnly = syncOnly;
5741 }
5742 /**
5743 * Syncs the event used by hover logic to distinguish hover-open from click-like interaction.
5744 */
5745 syncOpenEvent = (newOpen, event) => {
5746 if (!newOpen || !this.state.open || // Prevent a pending hover-open from overwriting a click-open event, while allowing
5747 // click events to upgrade a hover-open.
5748 event != null && isClickLikeEvent(event)) {
5749 this.context.dataRef.current.openEvent = newOpen ? event : void 0;
5750 }
5751 };
5752 /**
5753 * Runs the root-owned side effects for an open state change.
5754 */
5755 dispatchOpenChange = (newOpen, eventDetails) => {
5756 this.syncOpenEvent(newOpen, eventDetails.event);
5757 const details = {
5758 open: newOpen,
5759 reason: eventDetails.reason,
5760 nativeEvent: eventDetails.event,
5761 nested: this.context.nested,
5762 triggerElement: eventDetails.trigger
5763 };
5764 this.context.events.emit("openchange", details);
5765 };
5766 /**
5767 * Emits the `openchange` event through the internal event emitter and calls the `onOpenChange` handler with the provided arguments.
5768 *
5769 * @param newOpen The new open state.
5770 * @param eventDetails Details about the event that triggered the open state change.
5771 */
5772 setOpen = (newOpen, eventDetails) => {
5773 if (this.syncOnly) {
5774 this.context.onOpenChange?.(newOpen, eventDetails);
5775 return;
5776 }
5777 this.dispatchOpenChange(newOpen, eventDetails);
5778 this.context.onOpenChange?.(newOpen, eventDetails);
5779 };
5780 };
5781
5782 // node_modules/@base-ui/react/floating-ui-react/hooks/useSyncedFloatingRootContext.mjs
5783 function useSyncedFloatingRootContext(options) {
5784 const {
5785 popupStore,
5786 treatPopupAsFloatingElement = false,
5787 floatingRootContext: floatingRootContextProp,
5788 floatingId,
5789 nested,
5790 onOpenChange
5791 } = options;
5792 const open = popupStore.useState("open");
5793 const referenceElement = popupStore.useState("activeTriggerElement");
5794 const floatingElement = popupStore.useState(treatPopupAsFloatingElement ? "popupElement" : "positionerElement");
5795 const triggerElements = popupStore.context.triggerElements;
5796 const handleOpenChange = onOpenChange;
5797 const internalStoreRef = React23.useRef(null);
5798 if (floatingRootContextProp === void 0 && internalStoreRef.current === null) {
5799 internalStoreRef.current = new FloatingRootStore({
5800 open,
5801 transitionStatus: void 0,
5802 referenceElement,
5803 floatingElement,
5804 triggerElements,
5805 onOpenChange: handleOpenChange,
5806 floatingId,
5807 syncOnly: true,
5808 nested
5809 });
5810 }
5811 const store = floatingRootContextProp ?? internalStoreRef.current;
5812 popupStore.useSyncedValue("floatingId", floatingId);
5813 useIsoLayoutEffect(() => {
5814 const valuesToSync = {
5815 open,
5816 floatingId,
5817 referenceElement,
5818 floatingElement
5819 };
5820 if (isElement(referenceElement)) {
5821 valuesToSync.domReferenceElement = referenceElement;
5822 }
5823 if (store.state.positionReference === store.state.referenceElement) {
5824 valuesToSync.positionReference = referenceElement;
5825 }
5826 store.update(valuesToSync);
5827 }, [open, floatingId, referenceElement, floatingElement, store]);
5828 store.context.onOpenChange = handleOpenChange;
5829 store.context.nested = nested;
5830 return store;
5831 }
5832
5833 // node_modules/@base-ui/react/utils/popups/popupStoreUtils.mjs
5834 var FOCUSABLE_POPUP_PROPS = {
5835 tabIndex: -1,
5836 [FOCUSABLE_ATTRIBUTE]: ""
5837 };
5838 function usePopupStore(externalStore, createStore2, treatPopupAsFloatingElement = false) {
5839 const floatingId = useId();
5840 const nested = useFloatingParentNodeId() != null;
5841 const internalStoreRef = React24.useRef(null);
5842 if (externalStore === void 0 && internalStoreRef.current === null) {
5843 internalStoreRef.current = createStore2(floatingId, nested);
5844 }
5845 const store = externalStore ?? internalStoreRef.current;
5846 useSyncedFloatingRootContext({
5847 popupStore: store,
5848 treatPopupAsFloatingElement,
5849 floatingRootContext: store.state.floatingRootContext,
5850 floatingId,
5851 nested,
5852 onOpenChange: store.setOpen
5853 });
5854 return {
5855 store,
5856 internalStore: internalStoreRef.current
5857 };
5858 }
5859 function useTriggerRegistration(id, store) {
5860 const registeredElementIdRef = React24.useRef(null);
5861 const registeredElementRef = React24.useRef(null);
5862 return React24.useCallback((element) => {
5863 if (id === void 0) {
5864 return;
5865 }
5866 let shouldSyncTriggerCount = false;
5867 if (registeredElementIdRef.current !== null) {
5868 const registeredId = registeredElementIdRef.current;
5869 const registeredElement = registeredElementRef.current;
5870 const currentElement = store.context.triggerElements.getById(registeredId);
5871 if (registeredElement && currentElement === registeredElement) {
5872 store.context.triggerElements.delete(registeredId);
5873 shouldSyncTriggerCount = true;
5874 }
5875 registeredElementIdRef.current = null;
5876 registeredElementRef.current = null;
5877 }
5878 if (element !== null) {
5879 registeredElementIdRef.current = id;
5880 registeredElementRef.current = element;
5881 store.context.triggerElements.add(id, element);
5882 shouldSyncTriggerCount = true;
5883 }
5884 if (shouldSyncTriggerCount) {
5885 const triggerCount = store.context.triggerElements.size;
5886 if (store.select("open") && store.state.triggerCount !== triggerCount) {
5887 store.set("triggerCount", triggerCount);
5888 }
5889 }
5890 }, [store, id]);
5891 }
5892 function setPopupOpenState(state, open, trigger, preventUnmountOnClose = false) {
5893 if (open) {
5894 state.preventUnmountingOnClose = false;
5895 } else if (preventUnmountOnClose) {
5896 state.preventUnmountingOnClose = true;
5897 }
5898 const triggerId = trigger?.id ?? null;
5899 if (triggerId || open) {
5900 state.activeTriggerId = triggerId;
5901 state.activeTriggerElement = trigger ?? null;
5902 }
5903 }
5904 function attachPreventUnmountOnClose(eventDetails) {
5905 let preventUnmountOnClose = false;
5906 eventDetails.preventUnmountOnClose = () => {
5907 preventUnmountOnClose = true;
5908 };
5909 return () => preventUnmountOnClose;
5910 }
5911 function applyPopupOpenChange(store, nextOpen, eventDetails, options = {}) {
5912 const reason = eventDetails.reason;
5913 const isHover = reason === reason_parts_exports.triggerHover;
5914 const isFocusOpen = nextOpen && reason === reason_parts_exports.triggerFocus;
5915 const isDismissClose = !nextOpen && (reason === reason_parts_exports.triggerPress || reason === reason_parts_exports.escapeKey);
5916 const shouldPreventUnmountOnClose = attachPreventUnmountOnClose(eventDetails);
5917 store.context.onOpenChange?.(nextOpen, eventDetails);
5918 if (eventDetails.isCanceled) {
5919 return;
5920 }
5921 options.onBeforeDispatch?.();
5922 store.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);
5923 const changeState = () => {
5924 const updatedState = {
5925 ...options.extraState,
5926 open: nextOpen
5927 };
5928 if (isFocusOpen) {
5929 updatedState.instantType = "focus";
5930 } else if (isDismissClose) {
5931 updatedState.instantType = "dismiss";
5932 } else if (isHover) {
5933 updatedState.instantType = void 0;
5934 }
5935 setPopupOpenState(updatedState, nextOpen, eventDetails.trigger, shouldPreventUnmountOnClose());
5936 store.update(updatedState);
5937 };
5938 if (isHover) {
5939 ReactDOM4.flushSync(changeState);
5940 } else {
5941 changeState();
5942 }
5943 }
5944 function useInitialOpenSync(store, openProp, defaultOpen, defaultTriggerId) {
5945 useOnFirstRender(() => {
5946 if (openProp === void 0 && store.state.open === false && defaultOpen) {
5947 store.state = {
5948 ...store.state,
5949 open: true,
5950 activeTriggerId: defaultTriggerId,
5951 preventUnmountingOnClose: false
5952 };
5953 }
5954 });
5955 }
5956 function useTriggerDataForwarding(triggerId, triggerElementRef, store, stateUpdates) {
5957 const isMountedByThisTrigger = store.useState("isMountedByTrigger", triggerId);
5958 const baseRegisterTrigger = useTriggerRegistration(triggerId, store);
5959 const registerTrigger = useStableCallback((element) => {
5960 baseRegisterTrigger(element);
5961 if (!element) {
5962 return;
5963 }
5964 const open = store.select("open");
5965 const activeTriggerId = store.select("activeTriggerId");
5966 if (activeTriggerId === triggerId) {
5967 store.update({
5968 activeTriggerElement: element,
5969 ...open ? stateUpdates : null
5970 });
5971 return;
5972 }
5973 if (activeTriggerId == null && open) {
5974 store.update({
5975 activeTriggerId: triggerId,
5976 activeTriggerElement: element,
5977 ...stateUpdates
5978 });
5979 }
5980 });
5981 useIsoLayoutEffect(() => {
5982 if (isMountedByThisTrigger) {
5983 store.update({
5984 activeTriggerElement: triggerElementRef.current,
5985 ...stateUpdates
5986 });
5987 }
5988 }, [isMountedByThisTrigger, store, triggerElementRef, ...Object.values(stateUpdates)]);
5989 return {
5990 registerTrigger,
5991 isMountedByThisTrigger
5992 };
5993 }
5994 function useImplicitActiveTrigger(store, options = {}) {
5995 const {
5996 closeOnActiveTriggerUnmount = false
5997 } = options;
5998 const open = store.useState("open");
5999 const reactiveTriggerCount = store.useState("triggerCount");
6000 useIsoLayoutEffect(() => {
6001 if (!open) {
6002 if (store.state.triggerCount !== 0) {
6003 store.set("triggerCount", 0);
6004 }
6005 return;
6006 }
6007 const triggerCount = store.context.triggerElements.size;
6008 const stateUpdates = {};
6009 if (store.state.triggerCount !== triggerCount) {
6010 stateUpdates.triggerCount = triggerCount;
6011 }
6012 const activeTriggerId = store.select("activeTriggerId");
6013 let lostActiveTriggerId = null;
6014 if (activeTriggerId) {
6015 const activeTriggerElement = store.context.triggerElements.getById(activeTriggerId);
6016 if (!activeTriggerElement) {
6017 lostActiveTriggerId = activeTriggerId;
6018 } else if (activeTriggerElement !== store.state.activeTriggerElement) {
6019 stateUpdates.activeTriggerElement = activeTriggerElement;
6020 }
6021 }
6022 if (!lostActiveTriggerId && !activeTriggerId && triggerCount === 1) {
6023 const iteratorResult = store.context.triggerElements.entries().next();
6024 if (!iteratorResult.done) {
6025 const [implicitTriggerId, implicitTriggerElement] = iteratorResult.value;
6026 stateUpdates.activeTriggerId = implicitTriggerId;
6027 stateUpdates.activeTriggerElement = implicitTriggerElement;
6028 }
6029 }
6030 if (stateUpdates.triggerCount !== void 0 || stateUpdates.activeTriggerId !== void 0 || stateUpdates.activeTriggerElement !== void 0) {
6031 store.update(stateUpdates);
6032 }
6033 if (lostActiveTriggerId) {
6034 if (closeOnActiveTriggerUnmount) {
6035 queueMicrotask(() => {
6036 if (store.select("open") && store.select("activeTriggerId") === lostActiveTriggerId && !store.context.triggerElements.getById(lostActiveTriggerId)) {
6037 const eventDetails = createChangeEventDetails(reason_parts_exports.none);
6038 store.setOpen(false, eventDetails);
6039 if (!eventDetails.isCanceled) {
6040 store.update({
6041 activeTriggerId: null,
6042 activeTriggerElement: null
6043 });
6044 }
6045 }
6046 });
6047 }
6048 }
6049 }, [open, store, reactiveTriggerCount, closeOnActiveTriggerUnmount]);
6050 }
6051 function useOpenStateTransitions(open, store, onUnmount) {
6052 const {
6053 mounted,
6054 setMounted,
6055 transitionStatus
6056 } = useTransitionStatus(open);
6057 const preventUnmountingOnClose = store.useState("preventUnmountingOnClose");
6058 const syncedPreventUnmountingOnClose = open ? false : preventUnmountingOnClose;
6059 store.useSyncedValues({
6060 mounted,
6061 transitionStatus,
6062 preventUnmountingOnClose: syncedPreventUnmountingOnClose
6063 });
6064 const forceUnmount = useStableCallback(() => {
6065 setMounted(false);
6066 store.update({
6067 activeTriggerId: null,
6068 activeTriggerElement: null,
6069 mounted: false,
6070 preventUnmountingOnClose: false
6071 });
6072 onUnmount?.();
6073 store.context.onOpenChangeComplete?.(false);
6074 });
6075 useOpenChangeComplete({
6076 enabled: mounted && !open && !syncedPreventUnmountingOnClose,
6077 open,
6078 ref: store.context.popupRef,
6079 onComplete() {
6080 if (!open) {
6081 forceUnmount();
6082 }
6083 }
6084 });
6085 return {
6086 forceUnmount,
6087 transitionStatus
6088 };
6089 }
6090 function usePopupInteractionProps(store, statePart) {
6091 store.useSyncedValues(statePart);
6092 useIsoLayoutEffect(() => () => {
6093 store.update({
6094 activeTriggerProps: EMPTY_OBJECT,
6095 inactiveTriggerProps: EMPTY_OBJECT,
6096 popupProps: EMPTY_OBJECT
6097 });
6098 }, [store]);
6099 }
6100
6101 // node_modules/@base-ui/react/utils/popups/popupTriggerMap.mjs
6102 var PopupTriggerMap = class {
6103 constructor() {
6104 this.elementsSet = /* @__PURE__ */ new Set();
6105 this.idMap = /* @__PURE__ */ new Map();
6106 }
6107 /**
6108 * Adds a trigger element with the given ID.
6109 *
6110 * Note: The provided element is assumed to not be registered under multiple IDs.
6111 */
6112 add(id, element) {
6113 const existingElement = this.idMap.get(id);
6114 if (existingElement === element) {
6115 return;
6116 }
6117 if (existingElement !== void 0) {
6118 this.elementsSet.delete(existingElement);
6119 }
6120 this.elementsSet.add(element);
6121 this.idMap.set(id, element);
6122 if (true) {
6123 if (this.elementsSet.size !== this.idMap.size) {
6124 throw new Error("Base UI: A trigger element cannot be registered under multiple IDs in PopupTriggerMap.");
6125 }
6126 }
6127 }
6128 /**
6129 * Removes the trigger element with the given ID.
6130 */
6131 delete(id) {
6132 const element = this.idMap.get(id);
6133 if (element) {
6134 this.elementsSet.delete(element);
6135 this.idMap.delete(id);
6136 }
6137 }
6138 /**
6139 * Whether the given element is registered as a trigger.
6140 */
6141 hasElement(element) {
6142 return this.elementsSet.has(element);
6143 }
6144 /**
6145 * Whether there is a registered trigger element matching the given predicate.
6146 */
6147 hasMatchingElement(predicate) {
6148 for (const element of this.elementsSet) {
6149 if (predicate(element)) {
6150 return true;
6151 }
6152 }
6153 return false;
6154 }
6155 /**
6156 * Returns the trigger element associated with the given ID, or undefined if no such element exists.
6157 */
6158 getById(id) {
6159 return this.idMap.get(id);
6160 }
6161 /**
6162 * Returns an iterable of all registered trigger entries, where each entry is a tuple of [id, element].
6163 */
6164 entries() {
6165 return this.idMap.entries();
6166 }
6167 /**
6168 * Returns an iterable of all registered trigger elements.
6169 */
6170 elements() {
6171 return this.elementsSet.values();
6172 }
6173 /**
6174 * Returns the number of registered trigger elements.
6175 */
6176 get size() {
6177 return this.idMap.size;
6178 }
6179 };
6180
6181 // node_modules/@base-ui/react/floating-ui-react/utils/getEmptyRootContext.mjs
6182 function getEmptyRootContext() {
6183 return new FloatingRootStore({
6184 open: false,
6185 transitionStatus: void 0,
6186 floatingElement: null,
6187 referenceElement: null,
6188 triggerElements: new PopupTriggerMap(),
6189 floatingId: void 0,
6190 syncOnly: false,
6191 nested: false,
6192 onOpenChange: void 0
6193 });
6194 }
6195
6196 // node_modules/@base-ui/react/utils/popups/store.mjs
6197 function createInitialPopupStoreState() {
6198 return {
6199 open: false,
6200 openProp: void 0,
6201 mounted: false,
6202 transitionStatus: void 0,
6203 floatingRootContext: getEmptyRootContext(),
6204 floatingId: void 0,
6205 triggerCount: 0,
6206 preventUnmountingOnClose: false,
6207 payload: void 0,
6208 activeTriggerId: null,
6209 activeTriggerElement: null,
6210 triggerIdProp: void 0,
6211 popupElement: null,
6212 positionerElement: null,
6213 activeTriggerProps: EMPTY_OBJECT,
6214 inactiveTriggerProps: EMPTY_OBJECT,
6215 popupProps: EMPTY_OBJECT
6216 };
6217 }
6218 function createPopupFloatingRootContext(triggerElements, floatingId, nested = false) {
6219 return new FloatingRootStore({
6220 open: false,
6221 transitionStatus: void 0,
6222 floatingElement: null,
6223 referenceElement: null,
6224 triggerElements,
6225 floatingId,
6226 syncOnly: true,
6227 nested,
6228 onOpenChange: void 0
6229 });
6230 }
6231 var activeTriggerIdSelector = createSelector((state) => state.triggerIdProp ?? state.activeTriggerId);
6232 var openSelector = createSelector((state) => state.openProp ?? state.open);
6233 var popupIdSelector = createSelector((state) => {
6234 const popupId = state.popupElement?.id ?? state.floatingId;
6235 return popupId || void 0;
6236 });
6237 function triggerOwnsOpenPopup(state, triggerId) {
6238 return triggerId !== void 0 && openSelector(state) && activeTriggerIdSelector(state) === triggerId;
6239 }
6240 function triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) {
6241 if (triggerOwnsOpenPopup(state, triggerId)) {
6242 return true;
6243 }
6244 return triggerId !== void 0 && openSelector(state) && activeTriggerIdSelector(state) == null && state.triggerCount === 1;
6245 }
6246 var popupStoreSelectors = {
6247 open: openSelector,
6248 mounted: createSelector((state) => state.mounted),
6249 transitionStatus: createSelector((state) => state.transitionStatus),
6250 floatingRootContext: createSelector((state) => state.floatingRootContext),
6251 triggerCount: createSelector((state) => state.triggerCount),
6252 preventUnmountingOnClose: createSelector((state) => state.preventUnmountingOnClose),
6253 payload: createSelector((state) => state.payload),
6254 activeTriggerId: activeTriggerIdSelector,
6255 activeTriggerElement: createSelector((state) => state.mounted ? state.activeTriggerElement : null),
6256 popupId: popupIdSelector,
6257 /**
6258 * Whether the trigger with the given ID was used to open the popup.
6259 */
6260 isTriggerActive: createSelector((state, triggerId) => triggerId !== void 0 && activeTriggerIdSelector(state) === triggerId),
6261 /**
6262 * Whether the popup is open and was activated by a trigger with the given ID.
6263 */
6264 isOpenedByTrigger: createSelector((state, triggerId) => triggerOwnsOpenPopup(state, triggerId)),
6265 /**
6266 * Whether the popup is mounted and was activated by a trigger with the given ID.
6267 */
6268 isMountedByTrigger: createSelector((state, triggerId) => triggerId !== void 0 && activeTriggerIdSelector(state) === triggerId && state.mounted),
6269 triggerProps: createSelector((state, isActive) => isActive ? state.activeTriggerProps : state.inactiveTriggerProps),
6270 /**
6271 * Popup id for the trigger that currently owns the open popup.
6272 */
6273 triggerPopupId: createSelector((state, triggerId) => triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) ? popupIdSelector(state) : void 0),
6274 popupProps: createSelector((state) => state.popupProps),
6275 popupElement: createSelector((state) => state.popupElement),
6276 positionerElement: createSelector((state) => state.positionerElement)
6277 };
6278
6279 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloatingRootContext.mjs
6280 function useFloatingRootContext(options) {
6281 const {
6282 open = false,
6283 onOpenChange,
6284 elements = {}
6285 } = options;
6286 const floatingId = useId();
6287 const nested = useFloatingParentNodeId() != null;
6288 if (true) {
6289 const optionDomReference = elements.reference;
6290 if (optionDomReference && !isElement(optionDomReference)) {
6291 console.error("Cannot pass a virtual element to the `elements.reference` option,", "as it must be a real DOM element. Use `context.setPositionReference()`", "instead.");
6292 }
6293 }
6294 const store = useRefWithInit(() => new FloatingRootStore({
6295 open,
6296 transitionStatus: void 0,
6297 onOpenChange,
6298 referenceElement: elements.reference ?? null,
6299 floatingElement: elements.floating ?? null,
6300 triggerElements: new PopupTriggerMap(),
6301 floatingId,
6302 syncOnly: false,
6303 nested
6304 })).current;
6305 useIsoLayoutEffect(() => {
6306 const valuesToSync = {
6307 open,
6308 floatingId
6309 };
6310 if (elements.reference !== void 0) {
6311 valuesToSync.referenceElement = elements.reference;
6312 valuesToSync.domReferenceElement = isElement(elements.reference) ? elements.reference : null;
6313 }
6314 if (elements.floating !== void 0) {
6315 valuesToSync.floatingElement = elements.floating;
6316 }
6317 store.update(valuesToSync);
6318 }, [open, floatingId, elements.reference, elements.floating, store]);
6319 store.context.onOpenChange = onOpenChange;
6320 store.context.nested = nested;
6321 return store;
6322 }
6323
6324 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloating.mjs
6325 function useFloating2(options = {}) {
6326 const {
6327 nodeId,
6328 externalTree
6329 } = options;
6330 const internalStore = useFloatingRootContext(options);
6331 const store = options.rootContext || internalStore;
6332 const referenceElement = store.useState("referenceElement");
6333 const floatingElement = store.useState("floatingElement");
6334 const domReferenceElement = store.useState("domReferenceElement");
6335 const open = store.useState("open");
6336 const floatingId = store.useState("floatingId");
6337 const [positionReference, setPositionReferenceRaw] = React25.useState(null);
6338 const [localDomReference, setLocalDomReference] = React25.useState(void 0);
6339 const [localFloatingElement, setLocalFloatingElement] = React25.useState(void 0);
6340 const domReferenceRef = React25.useRef(null);
6341 const tree = useFloatingTree(externalTree);
6342 const storeElements = React25.useMemo(() => ({
6343 reference: referenceElement,
6344 floating: floatingElement,
6345 domReference: domReferenceElement
6346 }), [referenceElement, floatingElement, domReferenceElement]);
6347 const position = useFloating({
6348 ...options,
6349 elements: {
6350 ...storeElements,
6351 ...positionReference && {
6352 reference: positionReference
6353 }
6354 }
6355 });
6356 const localDomReferenceElement = isElement(localDomReference) ? localDomReference : null;
6357 const syncedFloatingElement = localFloatingElement === void 0 ? store.state.floatingElement : localFloatingElement;
6358 store.useSyncedValue("referenceElement", localDomReference ?? null);
6359 store.useSyncedValue("domReferenceElement", localDomReference === void 0 ? domReferenceElement : localDomReferenceElement);
6360 store.useSyncedValue("floatingElement", syncedFloatingElement);
6361 const setPositionReference = React25.useCallback((node) => {
6362 const computedPositionReference = isElement(node) ? {
6363 getBoundingClientRect: () => node.getBoundingClientRect(),
6364 getClientRects: () => node.getClientRects(),
6365 contextElement: node
6366 } : node;
6367 setPositionReferenceRaw(computedPositionReference);
6368 position.refs.setReference(computedPositionReference);
6369 }, [position.refs]);
6370 const setReference = React25.useCallback((node) => {
6371 if (isElement(node) || node === null) {
6372 domReferenceRef.current = node;
6373 setLocalDomReference(node);
6374 }
6375 if (isElement(position.refs.reference.current) || position.refs.reference.current === null || // Don't allow setting virtual elements using the old technique back to
6376 // `null` to support `positionReference` + an unstable `reference`
6377 // callback ref.
6378 node !== null && !isElement(node)) {
6379 position.refs.setReference(node);
6380 }
6381 }, [position.refs, setLocalDomReference]);
6382 const setFloating = React25.useCallback((node) => {
6383 setLocalFloatingElement(node);
6384 position.refs.setFloating(node);
6385 }, [position.refs]);
6386 const refs = React25.useMemo(() => ({
6387 ...position.refs,
6388 setReference,
6389 setFloating,
6390 setPositionReference,
6391 domReference: domReferenceRef
6392 }), [position.refs, setReference, setFloating, setPositionReference]);
6393 const elements = React25.useMemo(() => ({
6394 ...position.elements,
6395 domReference: domReferenceElement
6396 }), [position.elements, domReferenceElement]);
6397 const context = React25.useMemo(() => ({
6398 ...position,
6399 dataRef: store.context.dataRef,
6400 open,
6401 onOpenChange: store.setOpen,
6402 events: store.context.events,
6403 floatingId,
6404 refs,
6405 elements,
6406 nodeId,
6407 rootStore: store
6408 }), [position, refs, elements, nodeId, store, open, floatingId]);
6409 useIsoLayoutEffect(() => {
6410 if (domReferenceElement) {
6411 domReferenceRef.current = domReferenceElement;
6412 }
6413 }, [domReferenceElement]);
6414 useIsoLayoutEffect(() => {
6415 store.context.dataRef.current.floatingContext = context;
6416 const node = tree?.nodesRef.current.find((n2) => n2.id === nodeId);
6417 if (node) {
6418 node.context = context;
6419 }
6420 });
6421 return React25.useMemo(() => ({
6422 ...position,
6423 context,
6424 refs,
6425 elements,
6426 rootStore: store
6427 }), [position, refs, elements, context, store]);
6428 }
6429
6430 // node_modules/@base-ui/react/floating-ui-react/hooks/useFocus.mjs
6431 var React26 = __toESM(require_react(), 1);
6432 var isMacSafari = parts_exports.os.mac && parts_exports.engine.webkit;
6433 function useFocus(context, props = {}) {
6434 const {
6435 enabled = true,
6436 delay
6437 } = props;
6438 const store = "rootStore" in context ? context.rootStore : context;
6439 const {
6440 events,
6441 dataRef
6442 } = store.context;
6443 const blockFocusRef = React26.useRef(false);
6444 const blockedReferenceRef = React26.useRef(null);
6445 const keyboardModalityRef = React26.useRef(true);
6446 const timeout = useTimeout();
6447 React26.useEffect(() => {
6448 const domReference = store.select("domReferenceElement");
6449 if (!enabled) {
6450 return void 0;
6451 }
6452 const win = getWindow(domReference);
6453 function onBlur() {
6454 const currentDomReference = store.select("domReferenceElement");
6455 if (!store.select("open") && isHTMLElement(currentDomReference) && currentDomReference === activeElement(ownerDocument(currentDomReference))) {
6456 blockFocusRef.current = true;
6457 }
6458 }
6459 function onKeyDown() {
6460 keyboardModalityRef.current = true;
6461 }
6462 function onPointerDown() {
6463 keyboardModalityRef.current = false;
6464 }
6465 return mergeCleanups(addEventListener(win, "blur", onBlur), isMacSafari && addEventListener(win, "keydown", onKeyDown, true), isMacSafari && addEventListener(win, "pointerdown", onPointerDown, true));
6466 }, [store, enabled]);
6467 React26.useEffect(() => {
6468 if (!enabled) {
6469 return void 0;
6470 }
6471 function onOpenChangeLocal(details) {
6472 if (details.reason === reason_parts_exports.triggerPress || details.reason === reason_parts_exports.escapeKey) {
6473 const referenceElement = store.select("domReferenceElement");
6474 if (isElement(referenceElement)) {
6475 blockedReferenceRef.current = referenceElement;
6476 blockFocusRef.current = true;
6477 }
6478 }
6479 }
6480 events.on("openchange", onOpenChangeLocal);
6481 return () => {
6482 events.off("openchange", onOpenChangeLocal);
6483 };
6484 }, [events, enabled, store]);
6485 const reference = React26.useMemo(() => {
6486 function resetBlockedFocus() {
6487 blockFocusRef.current = false;
6488 blockedReferenceRef.current = null;
6489 }
6490 return {
6491 onMouseLeave() {
6492 resetBlockedFocus();
6493 },
6494 onFocus(event) {
6495 const focusTarget = event.currentTarget;
6496 if (blockFocusRef.current) {
6497 if (blockedReferenceRef.current === focusTarget) {
6498 return;
6499 }
6500 resetBlockedFocus();
6501 }
6502 const target = getTarget(event.nativeEvent);
6503 if (isElement(target)) {
6504 if (isMacSafari && !event.relatedTarget) {
6505 if (!keyboardModalityRef.current && !isTypeableElement(target)) {
6506 return;
6507 }
6508 } else if (!matchesFocusVisible(target)) {
6509 return;
6510 }
6511 }
6512 const movedFromOtherEnabledTrigger = isTargetInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements);
6513 const {
6514 nativeEvent,
6515 currentTarget
6516 } = event;
6517 const delayValue = typeof delay === "function" ? delay() : delay;
6518 if (store.select("open") && movedFromOtherEnabledTrigger || delayValue === 0 || delayValue === void 0) {
6519 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent, currentTarget));
6520 return;
6521 }
6522 timeout.start(delayValue, () => {
6523 if (blockFocusRef.current) {
6524 return;
6525 }
6526 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent, currentTarget));
6527 });
6528 },
6529 onBlur(event) {
6530 resetBlockedFocus();
6531 const relatedTarget = event.relatedTarget;
6532 const nativeEvent = event.nativeEvent;
6533 const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute("focus-guard")) && relatedTarget.getAttribute("data-type") === "outside";
6534 timeout.start(0, () => {
6535 const domReference = store.select("domReferenceElement");
6536 const activeEl = activeElement(ownerDocument(domReference));
6537 if (!relatedTarget && activeEl === domReference) {
6538 return;
6539 }
6540 if (contains(dataRef.current.floatingContext?.refs.floating.current, activeEl) || contains(domReference, activeEl) || movedToFocusGuard) {
6541 return;
6542 }
6543 const nextFocusedElement = relatedTarget ?? activeEl;
6544 if (isTargetInsideEnabledTrigger(nextFocusedElement, store.context.triggerElements)) {
6545 return;
6546 }
6547 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent));
6548 });
6549 }
6550 };
6551 }, [dataRef, delay, store, timeout]);
6552 return React26.useMemo(() => enabled ? {
6553 reference,
6554 trigger: reference
6555 } : {}, [enabled, reference]);
6556 }
6557
6558 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverFloatingInteraction.mjs
6559 var React27 = __toESM(require_react(), 1);
6560
6561 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverInteractionSharedState.mjs
6562 var HoverInteraction = class _HoverInteraction {
6563 constructor() {
6564 this.pointerType = void 0;
6565 this.interactedInside = false;
6566 this.handler = void 0;
6567 this.blockMouseMove = true;
6568 this.performedPointerEventsMutation = false;
6569 this.pointerEventsScopeElement = null;
6570 this.pointerEventsReferenceElement = null;
6571 this.pointerEventsFloatingElement = null;
6572 this.restTimeoutPending = false;
6573 this.openChangeTimeout = new Timeout();
6574 this.restTimeout = new Timeout();
6575 this.handleCloseOptions = void 0;
6576 }
6577 static create() {
6578 return new _HoverInteraction();
6579 }
6580 dispose = () => {
6581 this.openChangeTimeout.clear();
6582 this.restTimeout.clear();
6583 };
6584 disposeEffect = () => {
6585 return this.dispose;
6586 };
6587 };
6588 var pointerEventsMutationOwnerByScopeElement = /* @__PURE__ */ new WeakMap();
6589 function clearSafePolygonPointerEventsMutation(instance) {
6590 if (!instance.performedPointerEventsMutation) {
6591 return;
6592 }
6593 const scopeElement = instance.pointerEventsScopeElement;
6594 if (scopeElement && pointerEventsMutationOwnerByScopeElement.get(scopeElement) === instance) {
6595 instance.pointerEventsScopeElement?.style.removeProperty("pointer-events");
6596 instance.pointerEventsReferenceElement?.style.removeProperty("pointer-events");
6597 instance.pointerEventsFloatingElement?.style.removeProperty("pointer-events");
6598 pointerEventsMutationOwnerByScopeElement.delete(scopeElement);
6599 }
6600 instance.performedPointerEventsMutation = false;
6601 instance.pointerEventsScopeElement = null;
6602 instance.pointerEventsReferenceElement = null;
6603 instance.pointerEventsFloatingElement = null;
6604 }
6605 function applySafePolygonPointerEventsMutation(instance, options) {
6606 const {
6607 scopeElement,
6608 referenceElement,
6609 floatingElement
6610 } = options;
6611 const existingOwner = pointerEventsMutationOwnerByScopeElement.get(scopeElement);
6612 if (existingOwner && existingOwner !== instance) {
6613 clearSafePolygonPointerEventsMutation(existingOwner);
6614 }
6615 clearSafePolygonPointerEventsMutation(instance);
6616 instance.performedPointerEventsMutation = true;
6617 instance.pointerEventsScopeElement = scopeElement;
6618 instance.pointerEventsReferenceElement = referenceElement;
6619 instance.pointerEventsFloatingElement = floatingElement;
6620 pointerEventsMutationOwnerByScopeElement.set(scopeElement, instance);
6621 scopeElement.style.pointerEvents = "none";
6622 referenceElement.style.pointerEvents = "auto";
6623 floatingElement.style.pointerEvents = "auto";
6624 }
6625 function useHoverInteractionSharedState(store) {
6626 const data = store.context.dataRef.current;
6627 const instance = useRefWithInit(() => data.hoverInteractionState ?? HoverInteraction.create()).current;
6628 if (!data.hoverInteractionState) {
6629 data.hoverInteractionState = instance;
6630 }
6631 useOnMount(data.hoverInteractionState.disposeEffect);
6632 return data.hoverInteractionState;
6633 }
6634
6635 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverFloatingInteraction.mjs
6636 function useHoverFloatingInteraction(context, parameters = {}) {
6637 const {
6638 enabled = true,
6639 closeDelay: closeDelayProp = 0,
6640 nodeId: nodeIdProp
6641 } = parameters;
6642 const store = "rootStore" in context ? context.rootStore : context;
6643 const open = store.useState("open");
6644 const floatingElement = store.useState("floatingElement");
6645 const domReferenceElement = store.useState("domReferenceElement");
6646 const {
6647 dataRef
6648 } = store.context;
6649 const tree = useFloatingTree();
6650 const parentId = useFloatingParentNodeId();
6651 const instance = useHoverInteractionSharedState(store);
6652 const childClosedTimeout = useTimeout();
6653 const isClickLikeOpenEvent2 = useStableCallback(() => {
6654 return isClickLikeOpenEvent(dataRef.current.openEvent?.type, instance.interactedInside);
6655 });
6656 const isHoverOpen = useStableCallback(() => {
6657 return isHoverOpenEvent(dataRef.current.openEvent?.type);
6658 });
6659 const clearPointerEvents = useStableCallback(() => {
6660 clearSafePolygonPointerEventsMutation(instance);
6661 });
6662 useIsoLayoutEffect(() => {
6663 if (!open) {
6664 instance.pointerType = void 0;
6665 instance.restTimeoutPending = false;
6666 instance.interactedInside = false;
6667 clearPointerEvents();
6668 }
6669 }, [open, instance, clearPointerEvents]);
6670 React27.useEffect(() => {
6671 return clearPointerEvents;
6672 }, [clearPointerEvents]);
6673 useIsoLayoutEffect(() => {
6674 if (!enabled) {
6675 return void 0;
6676 }
6677 if (open && instance.handleCloseOptions?.blockPointerEvents && isHoverOpen() && isElement(domReferenceElement) && floatingElement) {
6678 const ref = domReferenceElement;
6679 const floatingEl = floatingElement;
6680 const doc = ownerDocument(floatingElement);
6681 const parentFloating = tree?.nodesRef.current.find((node) => node.id === parentId)?.context?.elements.floating;
6682 if (parentFloating) {
6683 parentFloating.style.pointerEvents = "";
6684 }
6685 const cachedScopeElement = instance.pointerEventsScopeElement !== floatingEl ? instance.pointerEventsScopeElement : null;
6686 const parentScopeElement = parentFloating !== floatingEl ? parentFloating : null;
6687 const scopeElement = instance.handleCloseOptions?.getScope?.() ?? cachedScopeElement ?? parentScopeElement ?? ref.closest("[data-rootownerid]") ?? doc.body;
6688 applySafePolygonPointerEventsMutation(instance, {
6689 scopeElement,
6690 referenceElement: ref,
6691 floatingElement: floatingEl
6692 });
6693 return () => {
6694 clearPointerEvents();
6695 };
6696 }
6697 return void 0;
6698 }, [enabled, open, domReferenceElement, floatingElement, instance, isHoverOpen, tree, parentId, clearPointerEvents]);
6699 React27.useEffect(() => {
6700 if (!enabled) {
6701 return void 0;
6702 }
6703 function hasParentChildren() {
6704 return !!(tree && parentId && getNodeChildren(tree.nodesRef.current, parentId).length > 0);
6705 }
6706 function closeWithDelay(event) {
6707 const closeDelay = getDelay(closeDelayProp, "close", instance.pointerType);
6708 const close = () => {
6709 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6710 tree?.events.emit("floating.closed", event);
6711 };
6712 if (closeDelay) {
6713 instance.openChangeTimeout.start(closeDelay, close);
6714 } else {
6715 instance.openChangeTimeout.clear();
6716 close();
6717 }
6718 }
6719 function handleInteractInside(event) {
6720 const target = getTarget(event);
6721 if (!isInteractiveElement(target)) {
6722 instance.interactedInside = false;
6723 return;
6724 }
6725 instance.interactedInside = target?.closest("[aria-haspopup]") != null;
6726 }
6727 function onFloatingMouseEnter() {
6728 instance.openChangeTimeout.clear();
6729 childClosedTimeout.clear();
6730 tree?.events.off("floating.closed", onNodeClosed);
6731 clearPointerEvents();
6732 }
6733 function onFloatingMouseLeave(event) {
6734 if (hasParentChildren() && tree) {
6735 tree.events.on("floating.closed", onNodeClosed);
6736 return;
6737 }
6738 if (isTargetInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements)) {
6739 return;
6740 }
6741 const currentNodeId = dataRef.current.floatingContext?.nodeId ?? nodeIdProp;
6742 const relatedTarget = event.relatedTarget;
6743 const isMovingIntoDescendantFloating = tree && currentNodeId && isElement(relatedTarget) && getNodeChildren(tree.nodesRef.current, currentNodeId, false).some((node) => contains(node.context?.elements.floating, relatedTarget));
6744 if (isMovingIntoDescendantFloating) {
6745 return;
6746 }
6747 if (instance.handler) {
6748 instance.handler(event);
6749 return;
6750 }
6751 clearPointerEvents();
6752 if (isHoverOpen() && !isClickLikeOpenEvent2()) {
6753 closeWithDelay(event);
6754 }
6755 }
6756 function onNodeClosed(event) {
6757 if (!tree || !parentId || hasParentChildren()) {
6758 return;
6759 }
6760 childClosedTimeout.start(0, () => {
6761 tree.events.off("floating.closed", onNodeClosed);
6762 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6763 tree.events.emit("floating.closed", event);
6764 });
6765 }
6766 const floating = floatingElement;
6767 return mergeCleanups(floating && addEventListener(floating, "mouseenter", onFloatingMouseEnter), floating && addEventListener(floating, "mouseleave", onFloatingMouseLeave), floating && addEventListener(floating, "pointerdown", handleInteractInside, true), () => {
6768 tree?.events.off("floating.closed", onNodeClosed);
6769 });
6770 }, [enabled, floatingElement, store, dataRef, closeDelayProp, nodeIdProp, isHoverOpen, isClickLikeOpenEvent2, clearPointerEvents, instance, tree, parentId, childClosedTimeout]);
6771 }
6772
6773 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverReferenceInteraction.mjs
6774 var React28 = __toESM(require_react(), 1);
6775 var ReactDOM5 = __toESM(require_react_dom(), 1);
6776 var EMPTY_REF = {
6777 current: null
6778 };
6779 function useHoverReferenceInteraction(context, props = {}) {
6780 const {
6781 enabled = true,
6782 delay = 0,
6783 handleClose = null,
6784 mouseOnly = false,
6785 restMs = 0,
6786 move = true,
6787 triggerElementRef = EMPTY_REF,
6788 externalTree,
6789 isActiveTrigger = true,
6790 getHandleCloseContext,
6791 isClosing,
6792 shouldOpen: shouldOpenProp
6793 } = props;
6794 const store = "rootStore" in context ? context.rootStore : context;
6795 const {
6796 dataRef,
6797 events
6798 } = store.context;
6799 const tree = useFloatingTree(externalTree);
6800 const instance = useHoverInteractionSharedState(store);
6801 const isHoverCloseActiveRef = React28.useRef(false);
6802 const handleCloseRef = useValueAsRef(handleClose);
6803 const delayRef = useValueAsRef(delay);
6804 const restMsRef = useValueAsRef(restMs);
6805 const enabledRef = useValueAsRef(enabled);
6806 const shouldOpenRef = useValueAsRef(shouldOpenProp);
6807 const isClosingRef = useValueAsRef(isClosing);
6808 const isClickLikeOpenEvent2 = useStableCallback(() => {
6809 return isClickLikeOpenEvent(dataRef.current.openEvent?.type, instance.interactedInside);
6810 });
6811 const checkShouldOpen = useStableCallback(() => {
6812 return shouldOpenRef.current?.() !== false;
6813 });
6814 const isOverInactiveTrigger = useStableCallback((currentDomReference, currentTarget, target) => {
6815 const allTriggers = store.context.triggerElements;
6816 if (allTriggers.hasElement(currentTarget)) {
6817 return !currentDomReference || !contains(currentDomReference, currentTarget);
6818 }
6819 if (!isElement(target)) {
6820 return false;
6821 }
6822 const targetElement = target;
6823 return allTriggers.hasMatchingElement((trigger) => contains(trigger, targetElement)) && (!currentDomReference || !contains(currentDomReference, targetElement));
6824 });
6825 const cleanupMouseMoveHandler = useStableCallback(() => {
6826 if (!instance.handler) {
6827 return;
6828 }
6829 const doc = ownerDocument(store.select("domReferenceElement"));
6830 doc.removeEventListener("mousemove", instance.handler);
6831 instance.handler = void 0;
6832 });
6833 const clearPointerEvents = useStableCallback(() => {
6834 clearSafePolygonPointerEventsMutation(instance);
6835 });
6836 if (isActiveTrigger) {
6837 instance.handleCloseOptions = handleCloseRef.current?.__options;
6838 }
6839 React28.useEffect(() => cleanupMouseMoveHandler, [cleanupMouseMoveHandler]);
6840 React28.useEffect(() => {
6841 if (!enabled) {
6842 return void 0;
6843 }
6844 function onOpenChangeLocal(details) {
6845 if (!details.open) {
6846 isHoverCloseActiveRef.current = details.reason === reason_parts_exports.triggerHover;
6847 cleanupMouseMoveHandler();
6848 instance.openChangeTimeout.clear();
6849 instance.restTimeout.clear();
6850 instance.blockMouseMove = true;
6851 instance.restTimeoutPending = false;
6852 } else {
6853 isHoverCloseActiveRef.current = false;
6854 }
6855 }
6856 events.on("openchange", onOpenChangeLocal);
6857 return () => {
6858 events.off("openchange", onOpenChangeLocal);
6859 };
6860 }, [enabled, events, instance, cleanupMouseMoveHandler]);
6861 React28.useEffect(() => {
6862 if (!enabled) {
6863 return void 0;
6864 }
6865 function closeWithDelay(event, runElseBranch = true) {
6866 const closeDelay = getDelay(delayRef.current, "close", instance.pointerType);
6867 if (closeDelay) {
6868 instance.openChangeTimeout.start(closeDelay, () => {
6869 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6870 tree?.events.emit("floating.closed", event);
6871 });
6872 } else if (runElseBranch) {
6873 instance.openChangeTimeout.clear();
6874 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6875 tree?.events.emit("floating.closed", event);
6876 }
6877 }
6878 const trigger = triggerElementRef.current ?? (isActiveTrigger ? store.select("domReferenceElement") : null);
6879 if (!isElement(trigger)) {
6880 return void 0;
6881 }
6882 function onMouseEnter(event) {
6883 instance.openChangeTimeout.clear();
6884 instance.blockMouseMove = false;
6885 if (mouseOnly && !isMouseLikePointerType(instance.pointerType)) {
6886 return;
6887 }
6888 const restMsValue = getRestMs(restMsRef.current);
6889 const openDelay = getDelay(delayRef.current, "open", instance.pointerType);
6890 const eventTarget = getTarget(event);
6891 const currentTarget = event.currentTarget ?? null;
6892 const currentDomReference = store.select("domReferenceElement");
6893 let triggerNode = currentTarget;
6894 if (isElement(eventTarget) && !store.context.triggerElements.hasElement(eventTarget)) {
6895 for (const triggerElement of store.context.triggerElements.elements()) {
6896 if (contains(triggerElement, eventTarget)) {
6897 triggerNode = triggerElement;
6898 break;
6899 }
6900 }
6901 }
6902 if (isElement(currentTarget) && isElement(currentDomReference) && !store.context.triggerElements.hasElement(currentTarget) && contains(currentTarget, currentDomReference)) {
6903 triggerNode = currentDomReference;
6904 }
6905 const isOverInactive = triggerNode == null ? false : isOverInactiveTrigger(currentDomReference, triggerNode, eventTarget);
6906 const isOpen = store.select("open");
6907 const isInClosingTransition = isClosingRef.current?.() ?? store.select("transitionStatus") === "ending";
6908 const isHoverCloseTransition = !isOpen && isInClosingTransition && isHoverCloseActiveRef.current;
6909 const isReenteringSameTriggerDuringCloseTransition = !isOverInactive && isElement(triggerNode) && isElement(currentDomReference) && contains(currentDomReference, triggerNode) && isHoverCloseTransition;
6910 const isRestOnlyDelay = restMsValue > 0 && !openDelay;
6911 const shouldOpenImmediately = isOverInactive && (isOpen || isHoverCloseTransition) || isReenteringSameTriggerDuringCloseTransition;
6912 const shouldOpen = !isOpen || isOverInactive;
6913 if (shouldOpenImmediately) {
6914 if (checkShouldOpen()) {
6915 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode));
6916 }
6917 return;
6918 }
6919 if (isRestOnlyDelay) {
6920 return;
6921 }
6922 if (openDelay) {
6923 instance.openChangeTimeout.start(openDelay, () => {
6924 if (shouldOpen && checkShouldOpen()) {
6925 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode));
6926 }
6927 });
6928 } else if (shouldOpen) {
6929 if (checkShouldOpen()) {
6930 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode));
6931 }
6932 }
6933 }
6934 function onMouseLeave(event) {
6935 if (isClickLikeOpenEvent2()) {
6936 clearPointerEvents();
6937 return;
6938 }
6939 cleanupMouseMoveHandler();
6940 const domReferenceElement = store.select("domReferenceElement");
6941 const doc = ownerDocument(domReferenceElement);
6942 instance.restTimeout.clear();
6943 instance.restTimeoutPending = false;
6944 const handleCloseContextBase = dataRef.current.floatingContext ?? getHandleCloseContext?.();
6945 if (isTargetInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements)) {
6946 return;
6947 }
6948 if (handleCloseRef.current && handleCloseContextBase) {
6949 if (!store.select("open")) {
6950 instance.openChangeTimeout.clear();
6951 }
6952 const currentTrigger = triggerElementRef.current;
6953 instance.handler = handleCloseRef.current({
6954 ...handleCloseContextBase,
6955 tree,
6956 x: event.clientX,
6957 y: event.clientY,
6958 onClose() {
6959 clearPointerEvents();
6960 cleanupMouseMoveHandler();
6961 if (enabledRef.current && !isClickLikeOpenEvent2() && currentTrigger === store.select("domReferenceElement")) {
6962 closeWithDelay(event, true);
6963 }
6964 }
6965 });
6966 doc.addEventListener("mousemove", instance.handler);
6967 instance.handler(event);
6968 return;
6969 }
6970 const shouldClose = instance.pointerType === "touch" ? !contains(store.select("floatingElement"), event.relatedTarget) : true;
6971 if (shouldClose) {
6972 closeWithDelay(event);
6973 }
6974 }
6975 if (move) {
6976 return mergeCleanups(addEventListener(trigger, "mousemove", onMouseEnter, {
6977 once: true
6978 }), addEventListener(trigger, "mouseenter", onMouseEnter), addEventListener(trigger, "mouseleave", onMouseLeave));
6979 }
6980 return mergeCleanups(addEventListener(trigger, "mouseenter", onMouseEnter), addEventListener(trigger, "mouseleave", onMouseLeave));
6981 }, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef, store, enabled, handleCloseRef, instance, isActiveTrigger, isOverInactiveTrigger, isClickLikeOpenEvent2, mouseOnly, move, restMsRef, triggerElementRef, tree, enabledRef, getHandleCloseContext, isClosingRef, checkShouldOpen]);
6982 return React28.useMemo(() => {
6983 if (!enabled) {
6984 return void 0;
6985 }
6986 function setPointerRef(event) {
6987 instance.pointerType = event.pointerType;
6988 }
6989 return {
6990 onPointerDown: setPointerRef,
6991 onPointerEnter: setPointerRef,
6992 onMouseMove(event) {
6993 const {
6994 nativeEvent
6995 } = event;
6996 const trigger = event.currentTarget;
6997 const currentDomReference = store.select("domReferenceElement");
6998 const currentOpen = store.select("open");
6999 const isOverInactive = isOverInactiveTrigger(currentDomReference, trigger, event.target);
7000 if (mouseOnly && !isMouseLikePointerType(instance.pointerType)) {
7001 return;
7002 }
7003 if (currentOpen && isOverInactive && instance.handleCloseOptions?.blockPointerEvents) {
7004 const floatingElement = store.select("floatingElement");
7005 if (floatingElement) {
7006 const scopeElement = instance.handleCloseOptions?.getScope?.() ?? trigger.ownerDocument.body;
7007 applySafePolygonPointerEventsMutation(instance, {
7008 scopeElement,
7009 referenceElement: trigger,
7010 floatingElement
7011 });
7012 }
7013 }
7014 const restMsValue = getRestMs(restMsRef.current);
7015 if (currentOpen && !isOverInactive || restMsValue === 0) {
7016 return;
7017 }
7018 if (!isOverInactive && instance.restTimeoutPending && event.movementX ** 2 + event.movementY ** 2 < 2) {
7019 return;
7020 }
7021 instance.restTimeout.clear();
7022 function handleMouseMove() {
7023 instance.restTimeoutPending = false;
7024 if (isClickLikeOpenEvent2()) {
7025 return;
7026 }
7027 const latestOpen = store.select("open");
7028 if (!instance.blockMouseMove && (!latestOpen || isOverInactive) && checkShouldOpen()) {
7029 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, nativeEvent, trigger));
7030 }
7031 }
7032 if (instance.pointerType === "touch") {
7033 ReactDOM5.flushSync(() => {
7034 handleMouseMove();
7035 });
7036 } else if (isOverInactive && currentOpen) {
7037 handleMouseMove();
7038 } else {
7039 instance.restTimeoutPending = true;
7040 instance.restTimeout.start(restMsValue, handleMouseMove);
7041 }
7042 }
7043 };
7044 }, [enabled, instance, isClickLikeOpenEvent2, isOverInactiveTrigger, mouseOnly, store, restMsRef, checkShouldOpen]);
7045 }
7046
7047 // node_modules/@base-ui/react/floating-ui-react/safePolygon.mjs
7048 var CURSOR_SPEED_THRESHOLD = 0.1;
7049 var CURSOR_SPEED_THRESHOLD_SQUARED = CURSOR_SPEED_THRESHOLD * CURSOR_SPEED_THRESHOLD;
7050 var POLYGON_BUFFER = 0.5;
7051 function hasIntersectingEdge(pointX, pointY, xi, yi, xj, yj) {
7052 return yi >= pointY !== yj >= pointY && pointX <= (xj - xi) * (pointY - yi) / (yj - yi) + xi;
7053 }
7054 function isPointInQuadrilateral(pointX, pointY, x1, y1, x2, y2, x3, y3, x4, y4) {
7055 let isInsideValue = false;
7056 if (hasIntersectingEdge(pointX, pointY, x1, y1, x2, y2)) {
7057 isInsideValue = !isInsideValue;
7058 }
7059 if (hasIntersectingEdge(pointX, pointY, x2, y2, x3, y3)) {
7060 isInsideValue = !isInsideValue;
7061 }
7062 if (hasIntersectingEdge(pointX, pointY, x3, y3, x4, y4)) {
7063 isInsideValue = !isInsideValue;
7064 }
7065 if (hasIntersectingEdge(pointX, pointY, x4, y4, x1, y1)) {
7066 isInsideValue = !isInsideValue;
7067 }
7068 return isInsideValue;
7069 }
7070 function isInsideRect(pointX, pointY, rect) {
7071 return pointX >= rect.x && pointX <= rect.x + rect.width && pointY >= rect.y && pointY <= rect.y + rect.height;
7072 }
7073 function isInsideAxisAlignedRect(pointX, pointY, x1, y1, x2, y2) {
7074 const minX = Math.min(x1, x2);
7075 const maxX = Math.max(x1, x2);
7076 const minY = Math.min(y1, y2);
7077 const maxY = Math.max(y1, y2);
7078 return pointX >= minX && pointX <= maxX && pointY >= minY && pointY <= maxY;
7079 }
7080 function safePolygon(options = {}) {
7081 const {
7082 blockPointerEvents = false
7083 } = options;
7084 const timeout = new Timeout();
7085 const fn = ({
7086 x: x2,
7087 y: y2,
7088 placement,
7089 elements,
7090 onClose,
7091 nodeId,
7092 tree
7093 }) => {
7094 const side = placement?.split("-")[0];
7095 let hasLanded = false;
7096 let lastX = null;
7097 let lastY = null;
7098 let lastCursorTime = typeof performance !== "undefined" ? performance.now() : 0;
7099 function isCursorMovingSlowly(nextX, nextY) {
7100 const currentTime = performance.now();
7101 const elapsedTime = currentTime - lastCursorTime;
7102 if (lastX === null || lastY === null || elapsedTime === 0) {
7103 lastX = nextX;
7104 lastY = nextY;
7105 lastCursorTime = currentTime;
7106 return false;
7107 }
7108 const deltaX = nextX - lastX;
7109 const deltaY = nextY - lastY;
7110 const distanceSquared = deltaX * deltaX + deltaY * deltaY;
7111 const thresholdSquared = elapsedTime * elapsedTime * CURSOR_SPEED_THRESHOLD_SQUARED;
7112 lastX = nextX;
7113 lastY = nextY;
7114 lastCursorTime = currentTime;
7115 return distanceSquared < thresholdSquared;
7116 }
7117 function close() {
7118 timeout.clear();
7119 onClose();
7120 }
7121 return function onMouseMove(event) {
7122 timeout.clear();
7123 const domReference = elements.domReference;
7124 const floating = elements.floating;
7125 if (!domReference || !floating || side == null || x2 == null || y2 == null) {
7126 return void 0;
7127 }
7128 const {
7129 clientX,
7130 clientY
7131 } = event;
7132 const target = getTarget(event);
7133 const isLeave = event.type === "mouseleave";
7134 const isOverFloatingEl = contains(floating, target);
7135 const isOverReferenceEl = contains(domReference, target);
7136 if (isOverFloatingEl) {
7137 hasLanded = true;
7138 if (!isLeave) {
7139 return void 0;
7140 }
7141 }
7142 if (isOverReferenceEl) {
7143 hasLanded = false;
7144 if (!isLeave) {
7145 hasLanded = true;
7146 return void 0;
7147 }
7148 }
7149 if (isLeave && isElement(event.relatedTarget) && contains(floating, event.relatedTarget)) {
7150 return void 0;
7151 }
7152 function hasOpenChildNode() {
7153 return Boolean(tree && getNodeChildren(tree.nodesRef.current, nodeId).length > 0);
7154 }
7155 function closeIfNoOpenChild() {
7156 if (!hasOpenChildNode()) {
7157 close();
7158 }
7159 }
7160 if (hasOpenChildNode()) {
7161 return void 0;
7162 }
7163 const refRect = domReference.getBoundingClientRect();
7164 const rect = floating.getBoundingClientRect();
7165 const cursorLeaveFromRight = x2 > rect.right - rect.width / 2;
7166 const cursorLeaveFromBottom = y2 > rect.bottom - rect.height / 2;
7167 const isFloatingWider = rect.width > refRect.width;
7168 const isFloatingTaller = rect.height > refRect.height;
7169 const left = (isFloatingWider ? refRect : rect).left;
7170 const right = (isFloatingWider ? refRect : rect).right;
7171 const top = (isFloatingTaller ? refRect : rect).top;
7172 const bottom = (isFloatingTaller ? refRect : rect).bottom;
7173 if (side === "top" && y2 >= refRect.bottom - 1 || side === "bottom" && y2 <= refRect.top + 1 || side === "left" && x2 >= refRect.right - 1 || side === "right" && x2 <= refRect.left + 1) {
7174 closeIfNoOpenChild();
7175 return void 0;
7176 }
7177 let isInsideTroughRect = false;
7178 switch (side) {
7179 case "top":
7180 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, left, refRect.top + 1, right, rect.bottom - 1);
7181 break;
7182 case "bottom":
7183 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, left, rect.top + 1, right, refRect.bottom - 1);
7184 break;
7185 case "left":
7186 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, rect.right - 1, bottom, refRect.left + 1, top);
7187 break;
7188 case "right":
7189 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, refRect.right - 1, bottom, rect.left + 1, top);
7190 break;
7191 default:
7192 }
7193 if (isInsideTroughRect) {
7194 return void 0;
7195 }
7196 if (hasLanded && !isInsideRect(clientX, clientY, refRect)) {
7197 closeIfNoOpenChild();
7198 return void 0;
7199 }
7200 if (!isLeave && isCursorMovingSlowly(clientX, clientY)) {
7201 closeIfNoOpenChild();
7202 return void 0;
7203 }
7204 let isInsidePolygon = false;
7205 switch (side) {
7206 case "top": {
7207 const cursorXOffset = isFloatingWider ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7208 const cursorPointOneX = isFloatingWider ? x2 + cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7209 const cursorPointTwoX = isFloatingWider ? x2 - cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7210 const cursorPointY = y2 + POLYGON_BUFFER + 1;
7211 const commonYLeft = cursorLeaveFromRight ? rect.bottom - POLYGON_BUFFER : isFloatingWider ? rect.bottom - POLYGON_BUFFER : rect.top;
7212 const commonYRight = cursorLeaveFromRight ? isFloatingWider ? rect.bottom - POLYGON_BUFFER : rect.top : rect.bottom - POLYGON_BUFFER;
7213 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointOneX, cursorPointY, cursorPointTwoX, cursorPointY, rect.left, commonYLeft, rect.right, commonYRight);
7214 break;
7215 }
7216 case "bottom": {
7217 const cursorXOffset = isFloatingWider ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7218 const cursorPointOneX = isFloatingWider ? x2 + cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7219 const cursorPointTwoX = isFloatingWider ? x2 - cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7220 const cursorPointY = y2 - POLYGON_BUFFER;
7221 const commonYLeft = cursorLeaveFromRight ? rect.top + POLYGON_BUFFER : isFloatingWider ? rect.top + POLYGON_BUFFER : rect.bottom;
7222 const commonYRight = cursorLeaveFromRight ? isFloatingWider ? rect.top + POLYGON_BUFFER : rect.bottom : rect.top + POLYGON_BUFFER;
7223 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointOneX, cursorPointY, cursorPointTwoX, cursorPointY, rect.left, commonYLeft, rect.right, commonYRight);
7224 break;
7225 }
7226 case "left": {
7227 const cursorYOffset = isFloatingTaller ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7228 const cursorPointOneY = isFloatingTaller ? y2 + cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7229 const cursorPointTwoY = isFloatingTaller ? y2 - cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7230 const cursorPointX = x2 + POLYGON_BUFFER + 1;
7231 const commonXTop = cursorLeaveFromBottom ? rect.right - POLYGON_BUFFER : isFloatingTaller ? rect.right - POLYGON_BUFFER : rect.left;
7232 const commonXBottom = cursorLeaveFromBottom ? isFloatingTaller ? rect.right - POLYGON_BUFFER : rect.left : rect.right - POLYGON_BUFFER;
7233 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, commonXTop, rect.top, commonXBottom, rect.bottom, cursorPointX, cursorPointOneY, cursorPointX, cursorPointTwoY);
7234 break;
7235 }
7236 case "right": {
7237 const cursorYOffset = isFloatingTaller ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7238 const cursorPointOneY = isFloatingTaller ? y2 + cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7239 const cursorPointTwoY = isFloatingTaller ? y2 - cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7240 const cursorPointX = x2 - POLYGON_BUFFER;
7241 const commonXTop = cursorLeaveFromBottom ? rect.left + POLYGON_BUFFER : isFloatingTaller ? rect.left + POLYGON_BUFFER : rect.right;
7242 const commonXBottom = cursorLeaveFromBottom ? isFloatingTaller ? rect.left + POLYGON_BUFFER : rect.right : rect.left + POLYGON_BUFFER;
7243 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointX, cursorPointOneY, cursorPointX, cursorPointTwoY, commonXTop, rect.top, commonXBottom, rect.bottom);
7244 break;
7245 }
7246 default:
7247 }
7248 if (!isInsidePolygon) {
7249 closeIfNoOpenChild();
7250 } else if (!hasLanded) {
7251 timeout.start(40, closeIfNoOpenChild);
7252 }
7253 return void 0;
7254 };
7255 };
7256 fn.__options = {
7257 ...options,
7258 blockPointerEvents
7259 };
7260 return fn;
7261 }
7262
7263 // node_modules/@base-ui/react/utils/popupStateMapping.mjs
7264 var CommonPopupDataAttributes = (function(CommonPopupDataAttributes2) {
7265 CommonPopupDataAttributes2["open"] = "data-open";
7266 CommonPopupDataAttributes2["closed"] = "data-closed";
7267 CommonPopupDataAttributes2[CommonPopupDataAttributes2["startingStyle"] = TransitionStatusDataAttributes.startingStyle] = "startingStyle";
7268 CommonPopupDataAttributes2[CommonPopupDataAttributes2["endingStyle"] = TransitionStatusDataAttributes.endingStyle] = "endingStyle";
7269 CommonPopupDataAttributes2["anchorHidden"] = "data-anchor-hidden";
7270 CommonPopupDataAttributes2["side"] = "data-side";
7271 CommonPopupDataAttributes2["align"] = "data-align";
7272 return CommonPopupDataAttributes2;
7273 })({});
7274 var CommonTriggerDataAttributes = /* @__PURE__ */ (function(CommonTriggerDataAttributes2) {
7275 CommonTriggerDataAttributes2["popupOpen"] = "data-popup-open";
7276 CommonTriggerDataAttributes2["pressed"] = "data-pressed";
7277 return CommonTriggerDataAttributes2;
7278 })({});
7279 var TRIGGER_HOOK = {
7280 [CommonTriggerDataAttributes.popupOpen]: ""
7281 };
7282 var PRESSABLE_TRIGGER_HOOK = {
7283 [CommonTriggerDataAttributes.popupOpen]: "",
7284 [CommonTriggerDataAttributes.pressed]: ""
7285 };
7286 var POPUP_OPEN_HOOK = {
7287 [CommonPopupDataAttributes.open]: ""
7288 };
7289 var POPUP_CLOSED_HOOK = {
7290 [CommonPopupDataAttributes.closed]: ""
7291 };
7292 var ANCHOR_HIDDEN_HOOK = {
7293 [CommonPopupDataAttributes.anchorHidden]: ""
7294 };
7295 var triggerOpenStateMapping = {
7296 open(value) {
7297 if (value) {
7298 return TRIGGER_HOOK;
7299 }
7300 return null;
7301 }
7302 };
7303 var popupStateMapping = {
7304 open(value) {
7305 if (value) {
7306 return POPUP_OPEN_HOOK;
7307 }
7308 return POPUP_CLOSED_HOOK;
7309 },
7310 anchorHidden(value) {
7311 if (value) {
7312 return ANCHOR_HIDDEN_HOOK;
7313 }
7314 return null;
7315 }
7316 };
7317
7318 // node_modules/@base-ui/utils/inertValue.mjs
7319 function inertValue(value) {
7320 if (isReactVersionAtLeast(19)) {
7321 return value;
7322 }
7323 return value ? "true" : void 0;
7324 }
7325
7326 // node_modules/@base-ui/react/utils/useAnchorPositioning.mjs
7327 var React29 = __toESM(require_react(), 1);
7328
7329 // node_modules/@base-ui/react/floating-ui-react/middleware/arrow.mjs
7330 var baseArrow = (options) => ({
7331 name: "arrow",
7332 options,
7333 async fn(state) {
7334 const {
7335 x: x2,
7336 y: y2,
7337 placement,
7338 rects,
7339 platform: platform3,
7340 elements,
7341 middlewareData
7342 } = state;
7343 const {
7344 element,
7345 padding = 0,
7346 offsetParent = "real"
7347 } = evaluate(options, state) || {};
7348 if (element == null) {
7349 return {};
7350 }
7351 const paddingObject = getPaddingObject(padding);
7352 const coords = {
7353 x: x2,
7354 y: y2
7355 };
7356 const axis = getAlignmentAxis(placement);
7357 const length = getAxisLength(axis);
7358 const arrowDimensions = await platform3.getDimensions(element);
7359 const isYAxis = axis === "y";
7360 const minProp = isYAxis ? "top" : "left";
7361 const maxProp = isYAxis ? "bottom" : "right";
7362 const clientProp = isYAxis ? "clientHeight" : "clientWidth";
7363 const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];
7364 const startDiff = coords[axis] - rects.reference[axis];
7365 const arrowOffsetParent = offsetParent === "real" ? await platform3.getOffsetParent?.(element) : elements.floating;
7366 let clientSize = elements.floating[clientProp] || rects.floating[length];
7367 if (!clientSize || !await platform3.isElement?.(arrowOffsetParent)) {
7368 clientSize = elements.floating[clientProp] || rects.floating[length];
7369 }
7370 const centerToReference = endDiff / 2 - startDiff / 2;
7371 const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;
7372 const minPadding = Math.min(paddingObject[minProp], largestPossiblePadding);
7373 const maxPadding = Math.min(paddingObject[maxProp], largestPossiblePadding);
7374 const min2 = minPadding;
7375 const max2 = clientSize - arrowDimensions[length] - maxPadding;
7376 const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;
7377 const offset4 = clamp(min2, center, max2);
7378 const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset4 && rects.reference[length] / 2 - (center < min2 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;
7379 const alignmentOffset = shouldAddOffset ? center < min2 ? center - min2 : center - max2 : 0;
7380 return {
7381 [axis]: coords[axis] + alignmentOffset,
7382 data: {
7383 [axis]: offset4,
7384 centerOffset: center - offset4 - alignmentOffset,
7385 ...shouldAddOffset && {
7386 alignmentOffset
7387 }
7388 },
7389 reset: shouldAddOffset
7390 };
7391 }
7392 });
7393 var arrow4 = (options, deps) => ({
7394 ...baseArrow(options),
7395 options: [options, deps]
7396 });
7397
7398 // node_modules/@base-ui/react/utils/hideMiddleware.mjs
7399 var nativeHideFn = hide3().fn;
7400 var hide4 = {
7401 name: "hide",
7402 async fn(state) {
7403 const {
7404 width,
7405 height,
7406 x: x2,
7407 y: y2
7408 } = state.rects.reference;
7409 const anchorHidden = width === 0 && height === 0 && x2 === 0 && y2 === 0;
7410 const nativeHideResult = await nativeHideFn(state);
7411 return {
7412 data: {
7413 referenceHidden: nativeHideResult.data?.referenceHidden || anchorHidden
7414 }
7415 };
7416 }
7417 };
7418
7419 // node_modules/@base-ui/react/utils/adaptiveOriginMiddleware.mjs
7420 var DEFAULT_SIDES = {
7421 sideX: "left",
7422 sideY: "top"
7423 };
7424 var adaptiveOrigin = {
7425 name: "adaptiveOrigin",
7426 async fn(state) {
7427 const {
7428 x: rawX,
7429 y: rawY,
7430 rects: {
7431 floating: floatRect
7432 },
7433 elements: {
7434 floating
7435 },
7436 platform: platform3,
7437 strategy,
7438 placement
7439 } = state;
7440 const win = getWindow(floating);
7441 const styles = win.getComputedStyle(floating);
7442 const hasTransition = styles.transitionDuration !== "0s" && styles.transitionDuration !== "";
7443 if (!hasTransition) {
7444 return {
7445 x: rawX,
7446 y: rawY,
7447 data: DEFAULT_SIDES
7448 };
7449 }
7450 const offsetParent = await platform3.getOffsetParent?.(floating);
7451 let offsetDimensions = {
7452 width: 0,
7453 height: 0
7454 };
7455 if (strategy === "fixed" && win?.visualViewport) {
7456 offsetDimensions = {
7457 width: win.visualViewport.width,
7458 height: win.visualViewport.height
7459 };
7460 } else if (offsetParent === win) {
7461 const doc = ownerDocument(floating);
7462 offsetDimensions = {
7463 width: doc.documentElement.clientWidth,
7464 height: doc.documentElement.clientHeight
7465 };
7466 } else if (await platform3.isElement?.(offsetParent)) {
7467 offsetDimensions = await platform3.getDimensions(offsetParent);
7468 }
7469 const currentSide = getSide(placement);
7470 let x2 = rawX;
7471 let y2 = rawY;
7472 if (currentSide === "left") {
7473 x2 = offsetDimensions.width - (rawX + floatRect.width);
7474 }
7475 if (currentSide === "top") {
7476 y2 = offsetDimensions.height - (rawY + floatRect.height);
7477 }
7478 const sideX = currentSide === "left" ? "right" : DEFAULT_SIDES.sideX;
7479 const sideY = currentSide === "top" ? "bottom" : DEFAULT_SIDES.sideY;
7480 return {
7481 x: x2,
7482 y: y2,
7483 data: {
7484 sideX,
7485 sideY
7486 }
7487 };
7488 }
7489 };
7490
7491 // node_modules/@base-ui/react/utils/useAnchorPositioning.mjs
7492 function getLogicalSide(sideParam, renderedSide, isRtl) {
7493 const isLogicalSideParam = sideParam === "inline-start" || sideParam === "inline-end";
7494 const logicalRight = isRtl ? "inline-start" : "inline-end";
7495 const logicalLeft = isRtl ? "inline-end" : "inline-start";
7496 return {
7497 top: "top",
7498 right: isLogicalSideParam ? logicalRight : "right",
7499 bottom: "bottom",
7500 left: isLogicalSideParam ? logicalLeft : "left"
7501 }[renderedSide];
7502 }
7503 function getOffsetData(state, sideParam, isRtl) {
7504 const {
7505 rects,
7506 placement
7507 } = state;
7508 const data = {
7509 side: getLogicalSide(sideParam, getSide(placement), isRtl),
7510 align: getAlignment(placement) || "center",
7511 anchor: {
7512 width: rects.reference.width,
7513 height: rects.reference.height
7514 },
7515 positioner: {
7516 width: rects.floating.width,
7517 height: rects.floating.height
7518 }
7519 };
7520 return data;
7521 }
7522 function useAnchorPositioning(params) {
7523 const {
7524 // Public parameters
7525 anchor,
7526 positionMethod = "absolute",
7527 side: sideParam = "bottom",
7528 sideOffset = 0,
7529 align = "center",
7530 alignOffset = 0,
7531 collisionBoundary,
7532 collisionPadding: collisionPaddingParam = 5,
7533 sticky = false,
7534 arrowPadding = 5,
7535 disableAnchorTracking = false,
7536 inline: inlineMiddleware,
7537 // Private parameters
7538 keepMounted = false,
7539 floatingRootContext,
7540 mounted,
7541 collisionAvoidance,
7542 shiftCrossAxis = false,
7543 nodeId,
7544 adaptiveOrigin: adaptiveOrigin2,
7545 lazyFlip = false,
7546 externalTree
7547 } = params;
7548 const [mountSide, setMountSide] = React29.useState(null);
7549 if (!mounted && mountSide !== null) {
7550 setMountSide(null);
7551 }
7552 const collisionAvoidanceSide = collisionAvoidance.side || "flip";
7553 const collisionAvoidanceAlign = collisionAvoidance.align || "flip";
7554 const collisionAvoidanceFallbackAxisSide = collisionAvoidance.fallbackAxisSide || "end";
7555 const anchorFn = typeof anchor === "function" ? anchor : void 0;
7556 const anchorFnCallback = useStableCallback(anchorFn);
7557 const anchorDep = anchorFn ? anchorFnCallback : anchor;
7558 const anchorValueRef = useValueAsRef(anchor);
7559 const mountedRef = useValueAsRef(mounted);
7560 const direction = useDirection();
7561 const isRtl = direction === "rtl";
7562 const side = mountSide || {
7563 top: "top",
7564 right: "right",
7565 bottom: "bottom",
7566 left: "left",
7567 "inline-end": isRtl ? "left" : "right",
7568 "inline-start": isRtl ? "right" : "left"
7569 }[sideParam];
7570 const placement = align === "center" ? side : `${side}-${align}`;
7571 let collisionPadding = collisionPaddingParam;
7572 const bias = 1;
7573 const biasTop = sideParam === "bottom" ? bias : 0;
7574 const biasBottom = sideParam === "top" ? bias : 0;
7575 const biasLeft = sideParam === "right" ? bias : 0;
7576 const biasRight = sideParam === "left" ? bias : 0;
7577 if (typeof collisionPadding === "number") {
7578 collisionPadding = {
7579 top: collisionPadding + biasTop,
7580 right: collisionPadding + biasRight,
7581 bottom: collisionPadding + biasBottom,
7582 left: collisionPadding + biasLeft
7583 };
7584 } else if (collisionPadding) {
7585 collisionPadding = {
7586 top: (collisionPadding.top || 0) + biasTop,
7587 right: (collisionPadding.right || 0) + biasRight,
7588 bottom: (collisionPadding.bottom || 0) + biasBottom,
7589 left: (collisionPadding.left || 0) + biasLeft
7590 };
7591 }
7592 const commonCollisionProps = {
7593 boundary: collisionBoundary === "clipping-ancestors" ? "clippingAncestors" : collisionBoundary,
7594 padding: collisionPadding
7595 };
7596 const arrowRef = React29.useRef(null);
7597 const sideOffsetRef = useValueAsRef(sideOffset);
7598 const alignOffsetRef = useValueAsRef(alignOffset);
7599 const sideOffsetDep = typeof sideOffset !== "function" ? sideOffset : 0;
7600 const alignOffsetDep = typeof alignOffset !== "function" ? alignOffset : 0;
7601 const middleware = [];
7602 if (inlineMiddleware) {
7603 middleware.push(inlineMiddleware);
7604 }
7605 middleware.push(offset3((state) => {
7606 const data = getOffsetData(state, sideParam, isRtl);
7607 const sideAxis = typeof sideOffsetRef.current === "function" ? sideOffsetRef.current(data) : sideOffsetRef.current;
7608 const alignAxis = typeof alignOffsetRef.current === "function" ? alignOffsetRef.current(data) : alignOffsetRef.current;
7609 return {
7610 mainAxis: sideAxis,
7611 crossAxis: alignAxis,
7612 alignmentAxis: alignAxis
7613 };
7614 }, [sideOffsetDep, alignOffsetDep, isRtl, sideParam]));
7615 const shiftDisabled = collisionAvoidanceAlign === "none" && collisionAvoidanceSide !== "shift";
7616 const crossAxisShiftEnabled = !shiftDisabled && (sticky || shiftCrossAxis || collisionAvoidanceSide === "shift");
7617 const flipMiddleware = collisionAvoidanceSide === "none" ? null : flip3({
7618 ...commonCollisionProps,
7619 // Ensure the popup flips if it's been limited by its --available-height and it resizes.
7620 // Since the size() padding is smaller than the flip() padding, flip() will take precedence.
7621 padding: {
7622 top: collisionPadding.top + bias,
7623 right: collisionPadding.right + bias,
7624 bottom: collisionPadding.bottom + bias,
7625 left: collisionPadding.left + bias
7626 },
7627 mainAxis: !shiftCrossAxis && collisionAvoidanceSide === "flip",
7628 crossAxis: collisionAvoidanceAlign === "flip" ? "alignment" : false,
7629 fallbackAxisSideDirection: collisionAvoidanceFallbackAxisSide
7630 });
7631 const shiftMiddleware = shiftDisabled ? null : shift3((data) => {
7632 const html = ownerDocument(data.elements.floating).documentElement;
7633 return {
7634 ...commonCollisionProps,
7635 // Use the Layout Viewport to avoid shifting around when pinch-zooming
7636 // for context menus.
7637 rootBoundary: shiftCrossAxis ? {
7638 x: 0,
7639 y: 0,
7640 width: html.clientWidth,
7641 height: html.clientHeight
7642 } : void 0,
7643 mainAxis: collisionAvoidanceAlign !== "none",
7644 crossAxis: crossAxisShiftEnabled,
7645 limiter: sticky || shiftCrossAxis ? void 0 : limitShift3((limitData) => {
7646 if (!arrowRef.current) {
7647 return {};
7648 }
7649 const {
7650 width,
7651 height
7652 } = arrowRef.current.getBoundingClientRect();
7653 const sideAxis = getSideAxis(getSide(limitData.placement));
7654 const arrowSize = sideAxis === "y" ? width : height;
7655 const offsetAmount = sideAxis === "y" ? collisionPadding.left + collisionPadding.right : collisionPadding.top + collisionPadding.bottom;
7656 return {
7657 offset: arrowSize / 2 + offsetAmount / 2
7658 };
7659 })
7660 };
7661 }, [commonCollisionProps, sticky, shiftCrossAxis, collisionPadding, collisionAvoidanceAlign]);
7662 if (collisionAvoidanceSide === "shift" || collisionAvoidanceAlign === "shift" || align === "center") {
7663 middleware.push(shiftMiddleware, flipMiddleware);
7664 } else {
7665 middleware.push(flipMiddleware, shiftMiddleware);
7666 }
7667 middleware.push(size3({
7668 ...commonCollisionProps,
7669 apply({
7670 elements: {
7671 floating
7672 },
7673 availableWidth,
7674 availableHeight,
7675 rects
7676 }) {
7677 if (!mountedRef.current) {
7678 return;
7679 }
7680 const floatingStyle = floating.style;
7681 floatingStyle.setProperty("--available-width", `${availableWidth}px`);
7682 floatingStyle.setProperty("--available-height", `${availableHeight}px`);
7683 const dpr = getWindow(floating).devicePixelRatio || 1;
7684 const {
7685 x: x3,
7686 y: y3,
7687 width,
7688 height
7689 } = rects.reference;
7690 const anchorWidth = (Math.round((x3 + width) * dpr) - Math.round(x3 * dpr)) / dpr;
7691 const anchorHeight = (Math.round((y3 + height) * dpr) - Math.round(y3 * dpr)) / dpr;
7692 floatingStyle.setProperty("--anchor-width", `${anchorWidth}px`);
7693 floatingStyle.setProperty("--anchor-height", `${anchorHeight}px`);
7694 }
7695 }), arrow4((state) => ({
7696 // `transform-origin` calculations rely on an element existing. If the arrow hasn't been set,
7697 // we'll create a fake element.
7698 element: arrowRef.current || ownerDocument(state.elements.floating).createElement("div"),
7699 padding: arrowPadding,
7700 offsetParent: "floating"
7701 }), [arrowPadding]), {
7702 name: "transformOrigin",
7703 fn(state) {
7704 const {
7705 elements: elements2,
7706 middlewareData: middlewareData2,
7707 placement: renderedPlacement2,
7708 rects,
7709 y: y3
7710 } = state;
7711 const currentRenderedSide = getSide(renderedPlacement2);
7712 const currentRenderedAxis = getSideAxis(currentRenderedSide);
7713 const arrowEl = arrowRef.current;
7714 const arrowX = middlewareData2.arrow?.x || 0;
7715 const arrowY = middlewareData2.arrow?.y || 0;
7716 const arrowWidth = arrowEl?.clientWidth || 0;
7717 const arrowHeight = arrowEl?.clientHeight || 0;
7718 const transformX = arrowX + arrowWidth / 2;
7719 const transformY = arrowY + arrowHeight / 2;
7720 const shiftY = Math.abs(middlewareData2.shift?.y || 0);
7721 const halfAnchorHeight = rects.reference.height / 2;
7722 const sideOffsetValue = typeof sideOffset === "function" ? sideOffset(getOffsetData(state, sideParam, isRtl)) : sideOffset;
7723 const isOverlappingAnchor = shiftY > sideOffsetValue;
7724 const adjacentTransformOrigin = {
7725 top: `${transformX}px calc(100% + ${sideOffsetValue}px)`,
7726 bottom: `${transformX}px ${-sideOffsetValue}px`,
7727 left: `calc(100% + ${sideOffsetValue}px) ${transformY}px`,
7728 right: `${-sideOffsetValue}px ${transformY}px`
7729 }[currentRenderedSide];
7730 const overlapTransformOrigin = `${transformX}px ${rects.reference.y + halfAnchorHeight - y3}px`;
7731 elements2.floating.style.setProperty("--transform-origin", crossAxisShiftEnabled && currentRenderedAxis === "y" && isOverlappingAnchor ? overlapTransformOrigin : adjacentTransformOrigin);
7732 return {};
7733 }
7734 }, hide4, adaptiveOrigin2);
7735 useIsoLayoutEffect(() => {
7736 if (!mounted && floatingRootContext) {
7737 floatingRootContext.update({
7738 referenceElement: null,
7739 floatingElement: null,
7740 domReferenceElement: null,
7741 positionReference: null
7742 });
7743 }
7744 }, [mounted, floatingRootContext]);
7745 const autoUpdateOptions = React29.useMemo(() => ({
7746 elementResize: !disableAnchorTracking && typeof ResizeObserver !== "undefined",
7747 layoutShift: !disableAnchorTracking && typeof IntersectionObserver !== "undefined"
7748 }), [disableAnchorTracking]);
7749 const {
7750 refs,
7751 elements,
7752 x: x2,
7753 y: y2,
7754 middlewareData,
7755 update: update2,
7756 placement: renderedPlacement,
7757 context,
7758 isPositioned,
7759 floatingStyles: originalFloatingStyles
7760 } = useFloating2({
7761 rootContext: floatingRootContext,
7762 open: keepMounted ? mounted : void 0,
7763 placement,
7764 middleware,
7765 strategy: positionMethod,
7766 whileElementsMounted: keepMounted ? void 0 : (...args) => autoUpdate(...args, autoUpdateOptions),
7767 nodeId,
7768 externalTree
7769 });
7770 const {
7771 sideX,
7772 sideY
7773 } = middlewareData.adaptiveOrigin || DEFAULT_SIDES;
7774 const resolvedPosition = isPositioned ? positionMethod : "fixed";
7775 const floatingStyles = React29.useMemo(() => {
7776 const base = adaptiveOrigin2 ? {
7777 position: resolvedPosition,
7778 [sideX]: x2,
7779 [sideY]: y2
7780 } : {
7781 position: resolvedPosition,
7782 ...originalFloatingStyles
7783 };
7784 if (!isPositioned) {
7785 base.opacity = 0;
7786 }
7787 return base;
7788 }, [adaptiveOrigin2, resolvedPosition, sideX, x2, sideY, y2, originalFloatingStyles, isPositioned]);
7789 const registeredPositionReferenceRef = React29.useRef(null);
7790 useIsoLayoutEffect(() => {
7791 if (!mounted) {
7792 return;
7793 }
7794 const anchorValue = anchorValueRef.current;
7795 const resolvedAnchor = typeof anchorValue === "function" ? anchorValue() : anchorValue;
7796 const unwrappedElement = (isRef(resolvedAnchor) ? resolvedAnchor.current : resolvedAnchor) || null;
7797 const finalAnchor = unwrappedElement || null;
7798 if (finalAnchor !== registeredPositionReferenceRef.current) {
7799 refs.setPositionReference(finalAnchor);
7800 registeredPositionReferenceRef.current = finalAnchor;
7801 }
7802 }, [mounted, refs, anchorDep, anchorValueRef]);
7803 React29.useEffect(() => {
7804 if (!mounted) {
7805 return;
7806 }
7807 const anchorValue = anchorValueRef.current;
7808 if (typeof anchorValue === "function") {
7809 return;
7810 }
7811 if (isRef(anchorValue) && anchorValue.current !== registeredPositionReferenceRef.current) {
7812 refs.setPositionReference(anchorValue.current);
7813 registeredPositionReferenceRef.current = anchorValue.current;
7814 }
7815 }, [mounted, refs, anchorDep, anchorValueRef]);
7816 React29.useEffect(() => {
7817 if (keepMounted && mounted && elements.reference && elements.floating) {
7818 return autoUpdate(elements.reference, elements.floating, update2, autoUpdateOptions);
7819 }
7820 return void 0;
7821 }, [keepMounted, mounted, elements, update2, autoUpdateOptions]);
7822 const renderedSide = getSide(renderedPlacement);
7823 const logicalRenderedSide = getLogicalSide(sideParam, renderedSide, isRtl);
7824 const renderedAlign = getAlignment(renderedPlacement) || "center";
7825 const anchorHidden = Boolean(middlewareData.hide?.referenceHidden);
7826 useIsoLayoutEffect(() => {
7827 if (lazyFlip && mounted && isPositioned) {
7828 setMountSide(renderedSide);
7829 }
7830 }, [lazyFlip, mounted, isPositioned, renderedSide]);
7831 const arrowStyles = React29.useMemo(() => ({
7832 position: "absolute",
7833 top: middlewareData.arrow?.y,
7834 left: middlewareData.arrow?.x
7835 }), [middlewareData.arrow]);
7836 const arrowUncentered = middlewareData.arrow?.centerOffset !== 0;
7837 return React29.useMemo(() => ({
7838 positionerStyles: floatingStyles,
7839 arrowStyles,
7840 arrowRef,
7841 arrowUncentered,
7842 side: logicalRenderedSide,
7843 align: renderedAlign,
7844 physicalSide: renderedSide,
7845 anchorHidden,
7846 refs,
7847 context,
7848 isPositioned,
7849 update: update2
7850 }), [floatingStyles, arrowStyles, arrowRef, arrowUncentered, logicalRenderedSide, renderedAlign, renderedSide, anchorHidden, refs, context, isPositioned, update2]);
7851 }
7852 function isRef(param) {
7853 return param != null && "current" in param;
7854 }
7855
7856 // node_modules/@base-ui/react/utils/getDisabledMountTransitionStyles.mjs
7857 function getDisabledMountTransitionStyles(transitionStatus) {
7858 return transitionStatus === "starting" ? DISABLED_TRANSITIONS_STYLE : EMPTY_OBJECT;
7859 }
7860
7861 // node_modules/@base-ui/react/utils/usePositioner.mjs
7862 function usePositioner(componentProps, state, {
7863 styles,
7864 transitionStatus,
7865 props,
7866 refs,
7867 hidden,
7868 inert = false
7869 }) {
7870 const style = {
7871 ...styles
7872 };
7873 if (inert) {
7874 style.pointerEvents = "none";
7875 }
7876 return useRenderElement("div", componentProps, {
7877 state,
7878 ref: refs,
7879 props: [{
7880 role: "presentation",
7881 hidden,
7882 style
7883 }, getDisabledMountTransitionStyles(transitionStatus), props],
7884 stateAttributesMapping: popupStateMapping
7885 });
7886 }
7887
7888 // node_modules/@base-ui/react/utils/usePopupViewport.mjs
7889 var React32 = __toESM(require_react(), 1);
7890 var ReactDOM6 = __toESM(require_react_dom(), 1);
7891
7892 // node_modules/@base-ui/utils/usePreviousValue.mjs
7893 var React30 = __toESM(require_react(), 1);
7894 function usePreviousValue(value) {
7895 const [state, setState] = React30.useState({
7896 current: value,
7897 previous: null
7898 });
7899 if (value !== state.current) {
7900 setState({
7901 current: value,
7902 previous: state.current
7903 });
7904 }
7905 return state.previous;
7906 }
7907
7908 // node_modules/@base-ui/react/utils/usePopupAutoResize.mjs
7909 var React31 = __toESM(require_react(), 1);
7910
7911 // node_modules/@base-ui/react/utils/getCssDimensions.mjs
7912 function getCssDimensions2(element) {
7913 const css = getComputedStyle2(element);
7914 let width = parseFloat(css.width) || 0;
7915 let height = parseFloat(css.height) || 0;
7916 const hasOffset = isHTMLElement(element);
7917 const offsetWidth = hasOffset ? element.offsetWidth : width;
7918 const offsetHeight = hasOffset ? element.offsetHeight : height;
7919 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
7920 if (shouldFallback) {
7921 width = offsetWidth;
7922 height = offsetHeight;
7923 }
7924 return {
7925 width,
7926 height
7927 };
7928 }
7929
7930 // node_modules/@base-ui/react/utils/usePopupAutoResize.mjs
7931 function usePopupAutoResize(parameters) {
7932 const {
7933 popupElement,
7934 positionerElement,
7935 content,
7936 mounted,
7937 onMeasureLayout: onMeasureLayoutParam,
7938 onMeasureLayoutComplete: onMeasureLayoutCompleteParam,
7939 side,
7940 direction
7941 } = parameters;
7942 const runOnceAnimationsFinish = useAnimationsFinished(popupElement, true, false);
7943 const animationFrame = useAnimationFrame();
7944 const committedDimensionsRef = React31.useRef(null);
7945 const isInitialRenderRef = React31.useRef(true);
7946 const restoreAnchoringStylesRef = React31.useRef(NOOP);
7947 const onMeasureLayout = useStableCallback(onMeasureLayoutParam);
7948 const onMeasureLayoutComplete = useStableCallback(onMeasureLayoutCompleteParam);
7949 const anchoringStyles = React31.useMemo(() => {
7950 let isOriginSide = side === "top";
7951 let isPhysicalLeft = side === "left";
7952 if (direction === "rtl") {
7953 isOriginSide = isOriginSide || side === "inline-end";
7954 isPhysicalLeft = isPhysicalLeft || side === "inline-end";
7955 } else {
7956 isOriginSide = isOriginSide || side === "inline-start";
7957 isPhysicalLeft = isPhysicalLeft || side === "inline-start";
7958 }
7959 return isOriginSide ? {
7960 position: "absolute",
7961 [side === "top" ? "bottom" : "top"]: "0",
7962 [isPhysicalLeft ? "right" : "left"]: "0"
7963 } : EMPTY_OBJECT;
7964 }, [side, direction]);
7965 useIsoLayoutEffect(() => {
7966 if (!mounted) {
7967 restoreAnchoringStylesRef.current = NOOP;
7968 isInitialRenderRef.current = true;
7969 committedDimensionsRef.current = null;
7970 return void 0;
7971 }
7972 if (!popupElement || !positionerElement) {
7973 return void 0;
7974 }
7975 restoreAnchoringStylesRef.current = applyElementStyles(popupElement, anchoringStyles);
7976 setPopupCssSize(popupElement, "auto");
7977 const restorePopupPosition = overrideElementStyle(popupElement, "position", "static");
7978 const restorePopupTransform = overrideElementStyle(popupElement, "transform", "none");
7979 const restorePopupScale = overrideElementStyle(popupElement, "scale", "1");
7980 const restorePositionerAvailableSize = applyElementStyles(positionerElement, {
7981 "--available-width": "max-content",
7982 "--available-height": "max-content"
7983 });
7984 function restoreMeasurementOverrides() {
7985 restorePopupPosition();
7986 restorePopupTransform();
7987 restorePositionerAvailableSize();
7988 }
7989 function restoreMeasurementOverridesIncludingScale() {
7990 restoreMeasurementOverrides();
7991 restorePopupScale();
7992 }
7993 onMeasureLayout?.();
7994 if (isInitialRenderRef.current || committedDimensionsRef.current === null) {
7995 setPositionerCssSize(positionerElement, "max-content");
7996 const dimensions = getCssDimensions2(popupElement);
7997 committedDimensionsRef.current = dimensions;
7998 setPositionerCssSize(positionerElement, dimensions);
7999 restoreMeasurementOverridesIncludingScale();
8000 onMeasureLayoutComplete?.(null, dimensions);
8001 isInitialRenderRef.current = false;
8002 return () => {
8003 restoreAnchoringStylesRef.current();
8004 restoreAnchoringStylesRef.current = NOOP;
8005 };
8006 }
8007 setPositionerCssSize(positionerElement, "max-content");
8008 const previousDimensions = committedDimensionsRef.current;
8009 const newDimensions = getCssDimensions2(popupElement);
8010 committedDimensionsRef.current = newDimensions;
8011 setPopupCssSize(popupElement, previousDimensions);
8012 restoreMeasurementOverridesIncludingScale();
8013 onMeasureLayoutComplete?.(previousDimensions, newDimensions);
8014 setPositionerCssSize(positionerElement, newDimensions);
8015 const abortController = new AbortController();
8016 animationFrame.request(() => {
8017 setPopupCssSize(popupElement, newDimensions);
8018 runOnceAnimationsFinish(() => {
8019 popupElement.style.setProperty("--popup-width", "auto");
8020 popupElement.style.setProperty("--popup-height", "auto");
8021 }, abortController.signal);
8022 });
8023 return () => {
8024 abortController.abort();
8025 animationFrame.cancel();
8026 restoreAnchoringStylesRef.current();
8027 restoreAnchoringStylesRef.current = NOOP;
8028 };
8029 }, [content, popupElement, positionerElement, runOnceAnimationsFinish, animationFrame, mounted, onMeasureLayout, onMeasureLayoutComplete, anchoringStyles]);
8030 }
8031 function overrideElementStyle(element, property, value) {
8032 const originalValue = element.style.getPropertyValue(property);
8033 element.style.setProperty(property, value);
8034 return () => {
8035 element.style.setProperty(property, originalValue);
8036 };
8037 }
8038 function applyElementStyles(element, styles) {
8039 const restorers = [];
8040 for (const [key, value] of Object.entries(styles)) {
8041 restorers.push(overrideElementStyle(element, key, value));
8042 }
8043 return restorers.length ? () => {
8044 restorers.forEach((restore) => restore());
8045 } : NOOP;
8046 }
8047 function setPopupCssSize(popupElement, size4) {
8048 const width = size4 === "auto" ? "auto" : `${size4.width}px`;
8049 const height = size4 === "auto" ? "auto" : `${size4.height}px`;
8050 popupElement.style.setProperty("--popup-width", width);
8051 popupElement.style.setProperty("--popup-height", height);
8052 }
8053 function setPositionerCssSize(positionerElement, size4) {
8054 const width = size4 === "max-content" ? "max-content" : `${size4.width}px`;
8055 const height = size4 === "max-content" ? "max-content" : `${size4.height}px`;
8056 positionerElement.style.setProperty("--positioner-width", width);
8057 positionerElement.style.setProperty("--positioner-height", height);
8058 }
8059
8060 // node_modules/@base-ui/react/utils/usePopupViewport.mjs
8061 var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
8062 function usePopupViewport(parameters) {
8063 const {
8064 store,
8065 side,
8066 cssVars,
8067 children
8068 } = parameters;
8069 const direction = useDirection();
8070 const activeTrigger = store.useState("activeTriggerElement");
8071 const activeTriggerId = store.useState("activeTriggerId");
8072 const open = store.useState("open");
8073 const payload = store.useState("payload");
8074 const mounted = store.useState("mounted");
8075 const popupElement = store.useState("popupElement");
8076 const positionerElement = store.useState("positionerElement");
8077 const previousActiveTrigger = usePreviousValue(open ? activeTrigger : null);
8078 const currentContentKey = usePopupContentKey(activeTriggerId, payload);
8079 const capturedNodeRef = React32.useRef(null);
8080 const [previousContentNode, setPreviousContentNode] = React32.useState(null);
8081 const [newTriggerOffset, setNewTriggerOffset] = React32.useState(null);
8082 const currentContainerRef = React32.useRef(null);
8083 const previousContainerRef = React32.useRef(null);
8084 const onAnimationsFinished = useAnimationsFinished(currentContainerRef, true, false);
8085 const cleanupFrame = useAnimationFrame();
8086 const [previousContentDimensions, setPreviousContentDimensions] = React32.useState(null);
8087 const [showStartingStyleAttribute, setShowStartingStyleAttribute] = React32.useState(false);
8088 useIsoLayoutEffect(() => {
8089 store.set("hasViewport", true);
8090 return () => {
8091 store.set("hasViewport", false);
8092 };
8093 }, [store]);
8094 const handleMeasureLayout = useStableCallback(() => {
8095 currentContainerRef.current?.style.setProperty("animation", "none");
8096 currentContainerRef.current?.style.setProperty("transition", "none");
8097 previousContainerRef.current?.style.setProperty("display", "none");
8098 });
8099 const handleMeasureLayoutComplete = useStableCallback((previousDimensions) => {
8100 currentContainerRef.current?.style.removeProperty("animation");
8101 currentContainerRef.current?.style.removeProperty("transition");
8102 previousContainerRef.current?.style.removeProperty("display");
8103 if (previousDimensions) {
8104 setPreviousContentDimensions(previousDimensions);
8105 }
8106 });
8107 const lastHandledTriggerRef = React32.useRef(null);
8108 useIsoLayoutEffect(() => {
8109 if (!open || !mounted) {
8110 lastHandledTriggerRef.current = null;
8111 }
8112 }, [open, mounted]);
8113 useIsoLayoutEffect(() => {
8114 if (activeTrigger && previousActiveTrigger && activeTrigger !== previousActiveTrigger && lastHandledTriggerRef.current !== activeTrigger && capturedNodeRef.current) {
8115 setPreviousContentNode(capturedNodeRef.current);
8116 setShowStartingStyleAttribute(true);
8117 const offset4 = calculateRelativePosition(previousActiveTrigger, activeTrigger);
8118 setNewTriggerOffset(offset4);
8119 cleanupFrame.request(() => {
8120 ReactDOM6.flushSync(() => {
8121 setShowStartingStyleAttribute(false);
8122 });
8123 onAnimationsFinished(() => {
8124 setPreviousContentNode(null);
8125 setPreviousContentDimensions(null);
8126 capturedNodeRef.current = null;
8127 });
8128 });
8129 lastHandledTriggerRef.current = activeTrigger;
8130 }
8131 }, [activeTrigger, previousActiveTrigger, previousContentNode, onAnimationsFinished, cleanupFrame]);
8132 useIsoLayoutEffect(() => {
8133 const source = currentContainerRef.current;
8134 if (!source) {
8135 return;
8136 }
8137 const wrapper = ownerDocument(source).createElement("div");
8138 for (const child of Array.from(source.childNodes)) {
8139 wrapper.appendChild(child.cloneNode(true));
8140 }
8141 capturedNodeRef.current = wrapper;
8142 });
8143 const isTransitioning = previousContentNode != null;
8144 let childrenToRender;
8145 if (!isTransitioning) {
8146 childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", {
8147 "data-current": true,
8148 ref: currentContainerRef,
8149 children
8150 }, currentContentKey);
8151 } else {
8152 childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(React32.Fragment, {
8153 children: [/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", {
8154 "data-previous": true,
8155 inert: inertValue(true),
8156 ref: previousContainerRef,
8157 style: {
8158 ...previousContentDimensions ? {
8159 [cssVars.popupWidth]: `${previousContentDimensions.width}px`,
8160 [cssVars.popupHeight]: `${previousContentDimensions.height}px`
8161 } : null,
8162 position: "absolute"
8163 },
8164 "data-ending-style": showStartingStyleAttribute ? void 0 : ""
8165 }, "previous"), /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", {
8166 "data-current": true,
8167 ref: currentContainerRef,
8168 "data-starting-style": showStartingStyleAttribute ? "" : void 0,
8169 children
8170 }, currentContentKey)]
8171 });
8172 }
8173 useIsoLayoutEffect(() => {
8174 const container = previousContainerRef.current;
8175 if (!container || !previousContentNode) {
8176 return;
8177 }
8178 container.replaceChildren(...Array.from(previousContentNode.childNodes));
8179 }, [previousContentNode]);
8180 usePopupAutoResize({
8181 popupElement,
8182 positionerElement,
8183 mounted,
8184 content: payload,
8185 onMeasureLayout: handleMeasureLayout,
8186 onMeasureLayoutComplete: handleMeasureLayoutComplete,
8187 side,
8188 direction
8189 });
8190 const state = {
8191 activationDirection: getActivationDirection(newTriggerOffset),
8192 transitioning: isTransitioning
8193 };
8194 return {
8195 children: childrenToRender,
8196 state
8197 };
8198 }
8199 function getActivationDirection(offset4) {
8200 if (!offset4) {
8201 return void 0;
8202 }
8203 return `${getValueWithTolerance(offset4.horizontal, 5, "right", "left")} ${getValueWithTolerance(offset4.vertical, 5, "down", "up")}`;
8204 }
8205 function getValueWithTolerance(value, tolerance, positiveLabel, negativeLabel) {
8206 if (value > tolerance) {
8207 return positiveLabel;
8208 }
8209 if (value < -tolerance) {
8210 return negativeLabel;
8211 }
8212 return "";
8213 }
8214 function calculateRelativePosition(from, to) {
8215 const fromRect = from.getBoundingClientRect();
8216 const toRect = to.getBoundingClientRect();
8217 const fromCenter = {
8218 x: fromRect.left + fromRect.width / 2,
8219 y: fromRect.top + fromRect.height / 2
8220 };
8221 const toCenter = {
8222 x: toRect.left + toRect.width / 2,
8223 y: toRect.top + toRect.height / 2
8224 };
8225 return {
8226 horizontal: toCenter.x - fromCenter.x,
8227 vertical: toCenter.y - fromCenter.y
8228 };
8229 }
8230 function usePopupContentKey(activeTriggerId, payload) {
8231 const [contentKey, setContentKey] = React32.useState(0);
8232 const previousActiveTriggerIdRef = React32.useRef(activeTriggerId);
8233 const previousPayloadRef = React32.useRef(payload);
8234 const pendingPayloadUpdateRef = React32.useRef(false);
8235 useIsoLayoutEffect(() => {
8236 const previousActiveTriggerId = previousActiveTriggerIdRef.current;
8237 const previousPayload = previousPayloadRef.current;
8238 const triggerIdChanged = activeTriggerId !== previousActiveTriggerId;
8239 const payloadChanged = payload !== previousPayload;
8240 if (triggerIdChanged) {
8241 setContentKey((value) => value + 1);
8242 pendingPayloadUpdateRef.current = !payloadChanged;
8243 } else if (pendingPayloadUpdateRef.current && payloadChanged) {
8244 setContentKey((value) => value + 1);
8245 pendingPayloadUpdateRef.current = false;
8246 }
8247 previousActiveTriggerIdRef.current = activeTriggerId;
8248 previousPayloadRef.current = payload;
8249 }, [activeTriggerId, payload]);
8250 return `${activeTriggerId ?? "current"}-${contentKey}`;
8251 }
8252
8253 // node_modules/@base-ui/react/utils/FloatingPortalLite.mjs
8254 var React33 = __toESM(require_react(), 1);
8255 var ReactDOM7 = __toESM(require_react_dom(), 1);
8256 var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1);
8257 var FloatingPortalLite = /* @__PURE__ */ React33.forwardRef(function FloatingPortalLite2(componentProps, forwardedRef) {
8258 const {
8259 children,
8260 container,
8261 className,
8262 render: render4,
8263 style,
8264 ...elementProps
8265 } = componentProps;
8266 const {
8267 portalNode,
8268 portalSubtree
8269 } = useFloatingPortalNode({
8270 container,
8271 ref: forwardedRef,
8272 componentProps,
8273 elementProps
8274 });
8275 if (!portalSubtree && !portalNode) {
8276 return null;
8277 }
8278 return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(React33.Fragment, {
8279 children: [portalSubtree, portalNode && /* @__PURE__ */ ReactDOM7.createPortal(children, portalNode)]
8280 });
8281 });
8282 if (true) FloatingPortalLite.displayName = "FloatingPortalLite";
8283
8284 // node_modules/@base-ui/react/tooltip/index.parts.mjs
8285 var index_parts_exports = {};
8286 __export(index_parts_exports, {
8287 Arrow: () => TooltipArrow,
8288 Handle: () => TooltipHandle,
8289 Popup: () => TooltipPopup,
8290 Portal: () => TooltipPortal,
8291 Positioner: () => TooltipPositioner,
8292 Provider: () => TooltipProvider,
8293 Root: () => TooltipRoot,
8294 Trigger: () => TooltipTrigger,
8295 Viewport: () => TooltipViewport,
8296 createHandle: () => createTooltipHandle
8297 });
8298
8299 // node_modules/@base-ui/react/tooltip/root/TooltipRoot.mjs
8300 var React36 = __toESM(require_react(), 1);
8301
8302 // node_modules/@base-ui/react/tooltip/root/TooltipRootContext.mjs
8303 var React34 = __toESM(require_react(), 1);
8304 var TooltipRootContext = /* @__PURE__ */ React34.createContext(void 0);
8305 if (true) TooltipRootContext.displayName = "TooltipRootContext";
8306 function useTooltipRootContext(optional) {
8307 const context = React34.useContext(TooltipRootContext);
8308 if (context === void 0 && !optional) {
8309 throw new Error(true ? "Base UI: TooltipRootContext is missing. Tooltip parts must be placed within <Tooltip.Root>." : formatErrorMessage_default(72));
8310 }
8311 return context;
8312 }
8313
8314 // node_modules/@base-ui/react/tooltip/store/TooltipStore.mjs
8315 var React35 = __toESM(require_react(), 1);
8316 var selectors2 = {
8317 ...popupStoreSelectors,
8318 disabled: createSelector((state) => state.disabled),
8319 instantType: createSelector((state) => state.instantType),
8320 isInstantPhase: createSelector((state) => state.isInstantPhase),
8321 trackCursorAxis: createSelector((state) => state.trackCursorAxis),
8322 disableHoverablePopup: createSelector((state) => state.disableHoverablePopup),
8323 lastOpenChangeReason: createSelector((state) => state.openChangeReason),
8324 closeOnClick: createSelector((state) => state.closeOnClick),
8325 closeDelay: createSelector((state) => state.closeDelay),
8326 hasViewport: createSelector((state) => state.hasViewport)
8327 };
8328 var TooltipStore = class _TooltipStore extends ReactStore {
8329 constructor(initialState, floatingId, nested = false) {
8330 const triggerElements = new PopupTriggerMap();
8331 const state = {
8332 ...createInitialState(),
8333 ...initialState
8334 };
8335 state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
8336 super(state, {
8337 popupRef: /* @__PURE__ */ React35.createRef(),
8338 onOpenChange: void 0,
8339 onOpenChangeComplete: void 0,
8340 triggerElements
8341 }, selectors2);
8342 }
8343 setOpen = (nextOpen, eventDetails) => {
8344 applyPopupOpenChange(this, nextOpen, eventDetails, {
8345 extraState: {
8346 openChangeReason: eventDetails.reason
8347 }
8348 });
8349 };
8350 // Used by trigger clicks to clear a delayed hover open without reporting a public open-state change.
8351 cancelPendingOpen(event) {
8352 this.state.floatingRootContext.dispatchOpenChange(false, createChangeEventDetails(reason_parts_exports.triggerPress, event));
8353 }
8354 static useStore(externalStore, initialState) {
8355 const store = usePopupStore(externalStore, (floatingId, nested) => new _TooltipStore(initialState, floatingId, nested)).store;
8356 return store;
8357 }
8358 };
8359 function createInitialState() {
8360 return {
8361 ...createInitialPopupStoreState(),
8362 disabled: false,
8363 instantType: void 0,
8364 isInstantPhase: false,
8365 trackCursorAxis: "none",
8366 disableHoverablePopup: false,
8367 openChangeReason: null,
8368 closeOnClick: true,
8369 closeDelay: 0,
8370 hasViewport: false
8371 };
8372 }
8373
8374 // node_modules/@base-ui/react/tooltip/root/TooltipRoot.mjs
8375 var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1);
8376 var TooltipRoot = fastComponent(function TooltipRoot2(props) {
8377 const {
8378 disabled: disabled2 = false,
8379 defaultOpen = false,
8380 open: openProp,
8381 disableHoverablePopup = false,
8382 trackCursorAxis = "none",
8383 actionsRef,
8384 onOpenChange,
8385 onOpenChangeComplete,
8386 handle,
8387 triggerId: triggerIdProp,
8388 defaultTriggerId: defaultTriggerIdProp = null,
8389 children
8390 } = props;
8391 const store = TooltipStore.useStore(handle?.store, {
8392 open: defaultOpen,
8393 openProp,
8394 activeTriggerId: defaultTriggerIdProp,
8395 triggerIdProp
8396 });
8397 useInitialOpenSync(store, openProp, defaultOpen, defaultTriggerIdProp);
8398 store.useControlledProp("openProp", openProp);
8399 store.useControlledProp("triggerIdProp", triggerIdProp);
8400 store.useContextCallback("onOpenChange", onOpenChange);
8401 store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete);
8402 const openState = store.useState("open");
8403 const open = !disabled2 && openState;
8404 const activeTriggerId = store.useState("activeTriggerId");
8405 const mounted = store.useState("mounted");
8406 const payload = store.useState("payload");
8407 store.useSyncedValues({
8408 trackCursorAxis,
8409 disableHoverablePopup
8410 });
8411 store.useSyncedValue("disabled", disabled2);
8412 useImplicitActiveTrigger(store, {
8413 closeOnActiveTriggerUnmount: true
8414 });
8415 const {
8416 forceUnmount,
8417 transitionStatus
8418 } = useOpenStateTransitions(open, store);
8419 const isInstantPhase = store.useState("isInstantPhase");
8420 const instantType = store.useState("instantType");
8421 const lastOpenChangeReason = store.useState("lastOpenChangeReason");
8422 const previousInstantTypeRef = React36.useRef(null);
8423 useIsoLayoutEffect(() => {
8424 if (openState && disabled2) {
8425 store.setOpen(false, createChangeEventDetails(reason_parts_exports.disabled));
8426 }
8427 }, [openState, disabled2, store]);
8428 useIsoLayoutEffect(() => {
8429 if (transitionStatus === "ending" && lastOpenChangeReason === reason_parts_exports.none || transitionStatus !== "ending" && isInstantPhase) {
8430 if (instantType !== "delay") {
8431 previousInstantTypeRef.current = instantType;
8432 }
8433 store.set("instantType", "delay");
8434 } else if (previousInstantTypeRef.current !== null) {
8435 store.set("instantType", previousInstantTypeRef.current);
8436 previousInstantTypeRef.current = null;
8437 }
8438 }, [transitionStatus, isInstantPhase, lastOpenChangeReason, instantType, store]);
8439 useIsoLayoutEffect(() => {
8440 if (open) {
8441 if (activeTriggerId == null) {
8442 store.set("payload", void 0);
8443 }
8444 }
8445 }, [store, activeTriggerId, open]);
8446 const handleImperativeClose = React36.useCallback(() => {
8447 store.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction));
8448 }, [store]);
8449 React36.useImperativeHandle(actionsRef, () => ({
8450 unmount: forceUnmount,
8451 close: handleImperativeClose
8452 }), [forceUnmount, handleImperativeClose]);
8453 const shouldRenderInteractions = open || mounted || !disabled2 && trackCursorAxis !== "none";
8454 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(TooltipRootContext.Provider, {
8455 value: store,
8456 children: [shouldRenderInteractions && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TooltipInteractions, {
8457 store,
8458 disabled: disabled2,
8459 trackCursorAxis
8460 }), typeof children === "function" ? children({
8461 payload
8462 }) : children]
8463 });
8464 });
8465 if (true) TooltipRoot.displayName = "TooltipRoot";
8466 function TooltipInteractions({
8467 store,
8468 disabled: disabled2,
8469 trackCursorAxis
8470 }) {
8471 const floatingRootContext = store.useState("floatingRootContext");
8472 const dismiss = useDismiss(floatingRootContext, {
8473 enabled: !disabled2,
8474 referencePress: () => store.select("closeOnClick")
8475 });
8476 const clientPoint = useClientPoint(floatingRootContext, {
8477 enabled: !disabled2 && trackCursorAxis !== "none",
8478 axis: trackCursorAxis === "none" ? void 0 : trackCursorAxis
8479 });
8480 const activeTriggerProps = React36.useMemo(() => mergeProps(clientPoint.reference, dismiss.reference), [clientPoint.reference, dismiss.reference]);
8481 const inactiveTriggerProps = React36.useMemo(() => mergeProps(clientPoint.trigger, dismiss.trigger), [clientPoint.trigger, dismiss.trigger]);
8482 const popupProps = React36.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, clientPoint.floating, dismiss.floating), [clientPoint.floating, dismiss.floating]);
8483 usePopupInteractionProps(store, {
8484 activeTriggerProps,
8485 inactiveTriggerProps,
8486 popupProps
8487 });
8488 return null;
8489 }
8490
8491 // node_modules/@base-ui/react/tooltip/trigger/TooltipTrigger.mjs
8492 var React38 = __toESM(require_react(), 1);
8493
8494 // node_modules/@base-ui/react/tooltip/provider/TooltipProviderContext.mjs
8495 var React37 = __toESM(require_react(), 1);
8496 var TooltipProviderContext = /* @__PURE__ */ React37.createContext(void 0);
8497 if (true) TooltipProviderContext.displayName = "TooltipProviderContext";
8498 function useTooltipProviderContext() {
8499 return React37.useContext(TooltipProviderContext);
8500 }
8501
8502 // node_modules/@base-ui/react/tooltip/trigger/TooltipTriggerDataAttributes.mjs
8503 var TooltipTriggerDataAttributes = (function(TooltipTriggerDataAttributes2) {
8504 TooltipTriggerDataAttributes2[TooltipTriggerDataAttributes2["popupOpen"] = CommonTriggerDataAttributes.popupOpen] = "popupOpen";
8505 TooltipTriggerDataAttributes2["triggerDisabled"] = "data-trigger-disabled";
8506 return TooltipTriggerDataAttributes2;
8507 })({});
8508
8509 // node_modules/@base-ui/react/tooltip/utils/constants.mjs
8510 var OPEN_DELAY = 600;
8511
8512 // node_modules/@base-ui/react/tooltip/trigger/TooltipTrigger.mjs
8513 var TOOLTIP_TRIGGER_IDENTIFIER = "data-base-ui-tooltip-trigger";
8514 function getTargetElement(event) {
8515 if ("composedPath" in event) {
8516 const path = event.composedPath();
8517 for (let i2 = 0; i2 < path.length; i2 += 1) {
8518 const element = path[i2];
8519 if (isElement(element)) {
8520 return element;
8521 }
8522 }
8523 }
8524 const target = event.target;
8525 if (isElement(target)) {
8526 return target;
8527 }
8528 return null;
8529 }
8530 function closestEnabledTooltipTrigger(element) {
8531 let current = element;
8532 while (current) {
8533 if (current.hasAttribute(TOOLTIP_TRIGGER_IDENTIFIER)) {
8534 return current;
8535 }
8536 const parentElement = current.parentElement;
8537 if (parentElement) {
8538 current = parentElement;
8539 continue;
8540 }
8541 const root = current.getRootNode();
8542 current = "host" in root && isElement(root.host) ? root.host : null;
8543 }
8544 return null;
8545 }
8546 var TooltipTrigger = fastComponentRef(function TooltipTrigger2(componentProps, forwardedRef) {
8547 const {
8548 render: render4,
8549 className,
8550 style,
8551 handle,
8552 payload,
8553 disabled: disabledProp,
8554 delay,
8555 closeOnClick = true,
8556 closeDelay,
8557 id: idProp,
8558 ...elementProps
8559 } = componentProps;
8560 const rootContext = useTooltipRootContext(true);
8561 const store = handle?.store ?? rootContext;
8562 if (!store) {
8563 throw new Error(true ? "Base UI: <Tooltip.Trigger> must be either used within a <Tooltip.Root> component or provided with a handle." : formatErrorMessage_default(82));
8564 }
8565 const thisTriggerId = useBaseUiId(idProp);
8566 const isTriggerActive = store.useState("isTriggerActive", thisTriggerId);
8567 const isOpenedByThisTrigger = store.useState("isOpenedByTrigger", thisTriggerId);
8568 const floatingRootContext = store.useState("floatingRootContext");
8569 const triggerElementRef = React38.useRef(null);
8570 const delayWithDefault = delay ?? OPEN_DELAY;
8571 const closeDelayWithDefault = closeDelay ?? 0;
8572 const {
8573 registerTrigger,
8574 isMountedByThisTrigger
8575 } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {
8576 payload,
8577 closeOnClick,
8578 closeDelay: closeDelayWithDefault
8579 });
8580 const providerContext = useTooltipProviderContext();
8581 const {
8582 delayRef,
8583 isInstantPhase,
8584 hasProvider
8585 } = useDelayGroup(floatingRootContext, {
8586 open: isOpenedByThisTrigger
8587 });
8588 const hoverInteraction = useHoverInteractionSharedState(floatingRootContext);
8589 store.useSyncedValue("isInstantPhase", isInstantPhase);
8590 const rootDisabled = store.useState("disabled");
8591 const disabled2 = disabledProp ?? rootDisabled;
8592 const disabledRef = useValueAsRef(disabled2);
8593 const trackCursorAxis = store.useState("trackCursorAxis");
8594 const disableHoverablePopup = store.useState("disableHoverablePopup");
8595 const isNestedTriggerHoveredRef = React38.useRef(false);
8596 const nestedTriggerOpenTimeout = useTimeout();
8597 const pointerTypeRef = React38.useRef(void 0);
8598 function getOpenDelay() {
8599 const providerDelay = providerContext?.delay;
8600 const groupOpenValue = typeof delayRef.current === "object" ? delayRef.current.open : void 0;
8601 let computedOpenDelay = delayWithDefault;
8602 if (hasProvider) {
8603 if (groupOpenValue !== 0) {
8604 computedOpenDelay = delay ?? providerDelay ?? delayWithDefault;
8605 } else {
8606 computedOpenDelay = 0;
8607 }
8608 }
8609 return computedOpenDelay;
8610 }
8611 function isEnabledNestedTriggerTarget(target) {
8612 const triggerEl = triggerElementRef.current;
8613 if (!triggerEl || !target) {
8614 return false;
8615 }
8616 const nearestTrigger = closestEnabledTooltipTrigger(target);
8617 return nearestTrigger !== null && nearestTrigger !== triggerEl && contains(triggerEl, nearestTrigger);
8618 }
8619 function detectNestedTriggerHover(target) {
8620 const nestedTriggerHovered = isEnabledNestedTriggerTarget(target);
8621 isNestedTriggerHoveredRef.current = nestedTriggerHovered;
8622 if (nestedTriggerHovered) {
8623 hoverInteraction.openChangeTimeout.clear();
8624 hoverInteraction.restTimeout.clear();
8625 hoverInteraction.restTimeoutPending = false;
8626 nestedTriggerOpenTimeout.clear();
8627 }
8628 return nestedTriggerHovered;
8629 }
8630 const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
8631 enabled: !disabled2,
8632 mouseOnly: true,
8633 move: false,
8634 handleClose: !disableHoverablePopup && trackCursorAxis !== "both" ? safePolygon() : null,
8635 restMs: getOpenDelay,
8636 delay() {
8637 const closeValue = typeof delayRef.current === "object" ? delayRef.current.close : void 0;
8638 let computedCloseDelay = closeDelayWithDefault;
8639 if (closeDelay == null && hasProvider) {
8640 computedCloseDelay = closeValue;
8641 }
8642 return {
8643 close: computedCloseDelay
8644 };
8645 },
8646 triggerElementRef,
8647 isActiveTrigger: isTriggerActive,
8648 isClosing: () => store.select("transitionStatus") === "ending",
8649 shouldOpen() {
8650 return !isNestedTriggerHoveredRef.current;
8651 }
8652 });
8653 const focusProps = useFocus(floatingRootContext, {
8654 enabled: !disabled2
8655 }).reference;
8656 const handleNestedTriggerHover = (event) => {
8657 const wasNestedTriggerHovered = isNestedTriggerHoveredRef.current;
8658 const target = getTargetElement(event);
8659 const nestedTriggerHovered = detectNestedTriggerHover(target);
8660 const triggerEl = triggerElementRef.current;
8661 const targetInsideTrigger = triggerEl && target && contains(triggerEl, target);
8662 if (nestedTriggerHovered && store.select("open") && store.select("lastOpenChangeReason") === reason_parts_exports.triggerHover) {
8663 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
8664 return;
8665 }
8666 if (wasNestedTriggerHovered && !nestedTriggerHovered && targetInsideTrigger && !disabledRef.current && !store.select("open") && triggerEl && // Match the hover hook's non-strict mouse fallback for mouse-only event sequences.
8667 isMouseLikePointerType(pointerTypeRef.current)) {
8668 const open = () => {
8669 if (!isNestedTriggerHoveredRef.current && !disabledRef.current && !store.select("open")) {
8670 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerEl));
8671 }
8672 };
8673 const openDelay = getOpenDelay();
8674 if (openDelay === 0) {
8675 nestedTriggerOpenTimeout.clear();
8676 open();
8677 } else {
8678 nestedTriggerOpenTimeout.start(openDelay, open);
8679 }
8680 }
8681 };
8682 const rootTriggerProps = store.useState("triggerProps", isMountedByThisTrigger);
8683 const shouldApplyRootTriggerProps = isMountedByThisTrigger || trackCursorAxis !== "none";
8684 const state = {
8685 open: isOpenedByThisTrigger
8686 };
8687 const element = useRenderElement("button", componentProps, {
8688 state,
8689 ref: [forwardedRef, registerTrigger, triggerElementRef],
8690 props: [hoverProps, focusProps, shouldApplyRootTriggerProps ? rootTriggerProps : void 0, {
8691 onMouseOver(event) {
8692 handleNestedTriggerHover(event.nativeEvent);
8693 },
8694 onFocus(event) {
8695 if (isEnabledNestedTriggerTarget(getTargetElement(event.nativeEvent))) {
8696 event.preventBaseUIHandler();
8697 }
8698 },
8699 onMouseLeave() {
8700 isNestedTriggerHoveredRef.current = false;
8701 nestedTriggerOpenTimeout.clear();
8702 pointerTypeRef.current = void 0;
8703 },
8704 onPointerEnter(event) {
8705 pointerTypeRef.current = event.pointerType;
8706 },
8707 onPointerDown(event) {
8708 pointerTypeRef.current = event.pointerType;
8709 store.set("closeOnClick", closeOnClick);
8710 if (closeOnClick && !store.select("open")) {
8711 store.cancelPendingOpen(event.nativeEvent);
8712 }
8713 },
8714 onClick(event) {
8715 if (closeOnClick && !store.select("open")) {
8716 store.cancelPendingOpen(event.nativeEvent);
8717 }
8718 },
8719 id: thisTriggerId,
8720 [TooltipTriggerDataAttributes.triggerDisabled]: disabled2 ? "" : void 0,
8721 [TOOLTIP_TRIGGER_IDENTIFIER]: disabled2 ? void 0 : ""
8722 }, elementProps],
8723 stateAttributesMapping: triggerOpenStateMapping
8724 });
8725 return element;
8726 });
8727 if (true) TooltipTrigger.displayName = "TooltipTrigger";
8728
8729 // node_modules/@base-ui/react/tooltip/portal/TooltipPortal.mjs
8730 var React40 = __toESM(require_react(), 1);
8731
8732 // node_modules/@base-ui/react/tooltip/portal/TooltipPortalContext.mjs
8733 var React39 = __toESM(require_react(), 1);
8734 var TooltipPortalContext = /* @__PURE__ */ React39.createContext(void 0);
8735 if (true) TooltipPortalContext.displayName = "TooltipPortalContext";
8736 function useTooltipPortalContext() {
8737 const value = React39.useContext(TooltipPortalContext);
8738 if (value === void 0) {
8739 throw new Error(true ? "Base UI: <Tooltip.Portal> is missing." : formatErrorMessage_default(70));
8740 }
8741 return value;
8742 }
8743
8744 // node_modules/@base-ui/react/tooltip/portal/TooltipPortal.mjs
8745 var import_jsx_runtime35 = __toESM(require_jsx_runtime(), 1);
8746 var TooltipPortal = /* @__PURE__ */ React40.forwardRef(function TooltipPortal2(props, forwardedRef) {
8747 const {
8748 keepMounted = false,
8749 ...portalProps
8750 } = props;
8751 const store = useTooltipRootContext();
8752 const mounted = store.useState("mounted");
8753 const shouldRender = mounted || keepMounted;
8754 if (!shouldRender) {
8755 return null;
8756 }
8757 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TooltipPortalContext.Provider, {
8758 value: keepMounted,
8759 children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(FloatingPortalLite, {
8760 ref: forwardedRef,
8761 ...portalProps
8762 })
8763 });
8764 });
8765 if (true) TooltipPortal.displayName = "TooltipPortal";
8766
8767 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositioner.mjs
8768 var React42 = __toESM(require_react(), 1);
8769
8770 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositionerContext.mjs
8771 var React41 = __toESM(require_react(), 1);
8772 var TooltipPositionerContext = /* @__PURE__ */ React41.createContext(void 0);
8773 if (true) TooltipPositionerContext.displayName = "TooltipPositionerContext";
8774 function useTooltipPositionerContext() {
8775 const context = React41.useContext(TooltipPositionerContext);
8776 if (context === void 0) {
8777 throw new Error(true ? "Base UI: TooltipPositionerContext is missing. TooltipPositioner parts must be placed within <Tooltip.Positioner>." : formatErrorMessage_default(71));
8778 }
8779 return context;
8780 }
8781
8782 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositioner.mjs
8783 var import_jsx_runtime36 = __toESM(require_jsx_runtime(), 1);
8784 var TooltipPositioner = /* @__PURE__ */ React42.forwardRef(function TooltipPositioner2(componentProps, forwardedRef) {
8785 const {
8786 render: render4,
8787 className,
8788 anchor,
8789 positionMethod = "absolute",
8790 side = "top",
8791 align = "center",
8792 sideOffset = 0,
8793 alignOffset = 0,
8794 collisionBoundary = "clipping-ancestors",
8795 collisionPadding = 5,
8796 arrowPadding = 5,
8797 sticky = false,
8798 disableAnchorTracking = false,
8799 collisionAvoidance = POPUP_COLLISION_AVOIDANCE,
8800 style,
8801 ...elementProps
8802 } = componentProps;
8803 const store = useTooltipRootContext();
8804 const keepMounted = useTooltipPortalContext();
8805 const open = store.useState("open");
8806 const mounted = store.useState("mounted");
8807 const trackCursorAxis = store.useState("trackCursorAxis");
8808 const disableHoverablePopup = store.useState("disableHoverablePopup");
8809 const floatingRootContext = store.useState("floatingRootContext");
8810 const instantType = store.useState("instantType");
8811 const transitionStatus = store.useState("transitionStatus");
8812 const hasViewport = store.useState("hasViewport");
8813 const positioning = useAnchorPositioning({
8814 anchor,
8815 positionMethod,
8816 floatingRootContext,
8817 mounted,
8818 side,
8819 sideOffset,
8820 align,
8821 alignOffset,
8822 collisionBoundary,
8823 collisionPadding,
8824 sticky,
8825 arrowPadding,
8826 disableAnchorTracking,
8827 keepMounted,
8828 collisionAvoidance,
8829 adaptiveOrigin: hasViewport ? adaptiveOrigin : void 0
8830 });
8831 const state = React42.useMemo(() => ({
8832 open,
8833 side: positioning.side,
8834 align: positioning.align,
8835 anchorHidden: positioning.anchorHidden,
8836 instant: trackCursorAxis !== "none" ? "tracking-cursor" : instantType
8837 }), [open, positioning.side, positioning.align, positioning.anchorHidden, trackCursorAxis, instantType]);
8838 const element = usePositioner(componentProps, state, {
8839 styles: positioning.positionerStyles,
8840 transitionStatus,
8841 props: elementProps,
8842 refs: [forwardedRef, store.useStateSetter("positionerElement")],
8843 hidden: !mounted,
8844 inert: !open || trackCursorAxis === "both" || disableHoverablePopup
8845 });
8846 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TooltipPositionerContext.Provider, {
8847 value: positioning,
8848 children: element
8849 });
8850 });
8851 if (true) TooltipPositioner.displayName = "TooltipPositioner";
8852
8853 // node_modules/@base-ui/react/tooltip/popup/TooltipPopup.mjs
8854 var React43 = __toESM(require_react(), 1);
8855 var stateAttributesMapping = {
8856 ...popupStateMapping,
8857 ...transitionStatusMapping
8858 };
8859 var TooltipPopup = /* @__PURE__ */ React43.forwardRef(function TooltipPopup2(componentProps, forwardedRef) {
8860 const {
8861 render: render4,
8862 className,
8863 style,
8864 ...elementProps
8865 } = componentProps;
8866 const store = useTooltipRootContext();
8867 const {
8868 side,
8869 align
8870 } = useTooltipPositionerContext();
8871 const open = store.useState("open");
8872 const instantType = store.useState("instantType");
8873 const transitionStatus = store.useState("transitionStatus");
8874 const popupProps = store.useState("popupProps");
8875 const floatingContext = store.useState("floatingRootContext");
8876 const disabled2 = store.useState("disabled");
8877 const closeDelay = store.useState("closeDelay");
8878 useOpenChangeComplete({
8879 open,
8880 ref: store.context.popupRef,
8881 onComplete() {
8882 if (open) {
8883 store.context.onOpenChangeComplete?.(true);
8884 }
8885 }
8886 });
8887 useHoverFloatingInteraction(floatingContext, {
8888 enabled: !disabled2,
8889 closeDelay
8890 });
8891 const setPopupElement = store.useStateSetter("popupElement");
8892 const state = {
8893 open,
8894 side,
8895 align,
8896 instant: instantType,
8897 transitionStatus
8898 };
8899 const element = useRenderElement("div", componentProps, {
8900 state,
8901 ref: [forwardedRef, store.context.popupRef, setPopupElement],
8902 props: [popupProps, getDisabledMountTransitionStyles(transitionStatus), elementProps],
8903 stateAttributesMapping
8904 });
8905 return element;
8906 });
8907 if (true) TooltipPopup.displayName = "TooltipPopup";
8908
8909 // node_modules/@base-ui/react/tooltip/arrow/TooltipArrow.mjs
8910 var React44 = __toESM(require_react(), 1);
8911 var TooltipArrow = /* @__PURE__ */ React44.forwardRef(function TooltipArrow2(componentProps, forwardedRef) {
8912 const {
8913 render: render4,
8914 className,
8915 style,
8916 ...elementProps
8917 } = componentProps;
8918 const store = useTooltipRootContext();
8919 const {
8920 arrowRef,
8921 side,
8922 align,
8923 arrowUncentered,
8924 arrowStyles
8925 } = useTooltipPositionerContext();
8926 const open = store.useState("open");
8927 const instantType = store.useState("instantType");
8928 const state = {
8929 open,
8930 side,
8931 align,
8932 uncentered: arrowUncentered,
8933 instant: instantType
8934 };
8935 const element = useRenderElement("div", componentProps, {
8936 state,
8937 ref: [forwardedRef, arrowRef],
8938 props: [{
8939 style: arrowStyles,
8940 "aria-hidden": true
8941 }, elementProps],
8942 stateAttributesMapping: popupStateMapping
8943 });
8944 return element;
8945 });
8946 if (true) TooltipArrow.displayName = "TooltipArrow";
8947
8948 // node_modules/@base-ui/react/tooltip/provider/TooltipProvider.mjs
8949 var React45 = __toESM(require_react(), 1);
8950 var import_jsx_runtime37 = __toESM(require_jsx_runtime(), 1);
8951 var TooltipProvider = function TooltipProvider2(props) {
8952 const {
8953 delay,
8954 closeDelay,
8955 timeout = 400
8956 } = props;
8957 const contextValue = React45.useMemo(() => ({
8958 delay,
8959 closeDelay
8960 }), [delay, closeDelay]);
8961 const delayValue = React45.useMemo(() => ({
8962 open: delay,
8963 close: closeDelay
8964 }), [delay, closeDelay]);
8965 return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TooltipProviderContext.Provider, {
8966 value: contextValue,
8967 children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(FloatingDelayGroup, {
8968 delay: delayValue,
8969 timeoutMs: timeout,
8970 children: props.children
8971 })
8972 });
8973 };
8974 if (true) TooltipProvider.displayName = "TooltipProvider";
8975
8976 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewport.mjs
8977 var React46 = __toESM(require_react(), 1);
8978
8979 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewportCssVars.mjs
8980 var TooltipViewportCssVars = /* @__PURE__ */ (function(TooltipViewportCssVars2) {
8981 TooltipViewportCssVars2["popupWidth"] = "--popup-width";
8982 TooltipViewportCssVars2["popupHeight"] = "--popup-height";
8983 return TooltipViewportCssVars2;
8984 })({});
8985
8986 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewport.mjs
8987 var stateAttributesMapping2 = {
8988 activationDirection: (value) => value ? {
8989 "data-activation-direction": value
8990 } : null
8991 };
8992 var TooltipViewport = /* @__PURE__ */ React46.forwardRef(function TooltipViewport2(componentProps, forwardedRef) {
8993 const {
8994 render: render4,
8995 className,
8996 style,
8997 children,
8998 ...elementProps
8999 } = componentProps;
9000 const store = useTooltipRootContext();
9001 const positioner = useTooltipPositionerContext();
9002 const instantType = store.useState("instantType");
9003 const {
9004 children: childrenToRender,
9005 state: viewportState
9006 } = usePopupViewport({
9007 store,
9008 side: positioner.side,
9009 cssVars: TooltipViewportCssVars,
9010 children
9011 });
9012 const state = {
9013 activationDirection: viewportState.activationDirection,
9014 transitioning: viewportState.transitioning,
9015 instant: instantType
9016 };
9017 return useRenderElement("div", componentProps, {
9018 state,
9019 ref: forwardedRef,
9020 props: [elementProps, {
9021 children: childrenToRender
9022 }],
9023 stateAttributesMapping: stateAttributesMapping2
9024 });
9025 });
9026 if (true) TooltipViewport.displayName = "TooltipViewport";
9027
9028 // node_modules/@base-ui/react/tooltip/store/TooltipHandle.mjs
9029 var TooltipHandle = class {
9030 /**
9031 * Internal store holding the tooltip state.
9032 * @internal
9033 */
9034 constructor() {
9035 this.store = new TooltipStore();
9036 }
9037 /**
9038 * Opens the tooltip and associates it with the trigger with the given ID.
9039 * The trigger must be a Tooltip.Trigger component with this handle passed as a prop.
9040 *
9041 * This method should only be called in an event handler or an effect (not during rendering).
9042 *
9043 * @param triggerId ID of the trigger to associate with the tooltip.
9044 */
9045 open(triggerId) {
9046 const triggerElement = triggerId ? this.store.context.triggerElements.getById(triggerId) : void 0;
9047 if (triggerId && !triggerElement) {
9048 throw new Error(true ? `Base UI: TooltipHandle.open: No trigger found with id "${triggerId}".` : formatErrorMessage_default(81, triggerId));
9049 }
9050 this.store.setOpen(true, createChangeEventDetails(reason_parts_exports.imperativeAction, void 0, triggerElement));
9051 }
9052 /**
9053 * Closes the tooltip.
9054 */
9055 close() {
9056 this.store.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction, void 0, void 0));
9057 }
9058 /**
9059 * Indicates whether the tooltip is currently open.
9060 */
9061 get isOpen() {
9062 return this.store.select("open");
9063 }
9064 };
9065 function createTooltipHandle() {
9066 return new TooltipHandle();
9067 }
9068
9069 // node_modules/@base-ui/react/use-render/useRender.mjs
9070 function useRender(params) {
9071 return useRenderElement(params.defaultTagName ?? "div", params, params);
9072 }
9073
9074 // packages/ui/build-module/text/text.mjs
9075 var import_element10 = __toESM(require_element(), 1);
9076 var STYLE_HASH_ATTRIBUTE = "data-wp-hash";
9077 function getRuntime() {
9078 const globalScope = globalThis;
9079 if (globalScope.__wpStyleRuntime) {
9080 return globalScope.__wpStyleRuntime;
9081 }
9082 globalScope.__wpStyleRuntime = {
9083 documents: /* @__PURE__ */ new Map(),
9084 styles: /* @__PURE__ */ new Map(),
9085 injectedStyles: /* @__PURE__ */ new WeakMap()
9086 };
9087 if (typeof document !== "undefined") {
9088 registerDocument(document);
9089 }
9090 return globalScope.__wpStyleRuntime;
9091 }
9092 function documentContainsStyleHash(targetDocument, hash) {
9093 if (!targetDocument.head) {
9094 return false;
9095 }
9096 for (const style of targetDocument.head.querySelectorAll(
9097 `style[${STYLE_HASH_ATTRIBUTE}]`
9098 )) {
9099 if (style.getAttribute(STYLE_HASH_ATTRIBUTE) === hash) {
9100 return true;
9101 }
9102 }
9103 return false;
9104 }
9105 function injectStyle(targetDocument, hash, css) {
9106 if (!targetDocument.head) {
9107 return;
9108 }
9109 const runtime = getRuntime();
9110 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9111 if (!injectedStyles) {
9112 injectedStyles = /* @__PURE__ */ new Set();
9113 runtime.injectedStyles.set(targetDocument, injectedStyles);
9114 }
9115 if (injectedStyles.has(hash)) {
9116 return;
9117 }
9118 if (documentContainsStyleHash(targetDocument, hash)) {
9119 injectedStyles.add(hash);
9120 return;
9121 }
9122 const style = targetDocument.createElement("style");
9123 style.setAttribute(STYLE_HASH_ATTRIBUTE, hash);
9124 style.appendChild(targetDocument.createTextNode(css));
9125 targetDocument.head.appendChild(style);
9126 injectedStyles.add(hash);
9127 }
9128 function registerDocument(targetDocument) {
9129 const runtime = getRuntime();
9130 runtime.documents.set(
9131 targetDocument,
9132 (runtime.documents.get(targetDocument) ?? 0) + 1
9133 );
9134 for (const [hash, css] of runtime.styles) {
9135 injectStyle(targetDocument, hash, css);
9136 }
9137 return () => {
9138 const count = runtime.documents.get(targetDocument);
9139 if (count === void 0) {
9140 return;
9141 }
9142 if (count <= 1) {
9143 runtime.documents.delete(targetDocument);
9144 return;
9145 }
9146 runtime.documents.set(targetDocument, count - 1);
9147 };
9148 }
9149 function registerStyle(hash, css) {
9150 const runtime = getRuntime();
9151 runtime.styles.set(hash, css);
9152 for (const targetDocument of runtime.documents.keys()) {
9153 injectStyle(targetDocument, hash, css);
9154 }
9155 }
9156 if (typeof process === "undefined" || true) {
9157 registerStyle("a495f9d138", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._83ed8a8da5dd50ea__text{margin:0}._14437cfb77831647__heading-2xl{--_gcd-heading-font-size:var(--wpds-typography-font-size-2xl,32px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-2xl,32px);--_gcd-p-line-height:var(--wpds-typography-line-height-2xl,40px);font-size:var(--wpds-typography-font-size-2xl,32px);line-height:var(--wpds-typography-line-height-2xl,40px)}._14437cfb77831647__heading-2xl,._3c78b7fa9b4072dd__heading-xl{font-family:var(--wpds-typography-font-family-heading,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-emphasis,600)}._3c78b7fa9b4072dd__heading-xl{--_gcd-heading-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-p-line-height:var(--wpds-typography-line-height-md,24px);font-size:var(--wpds-typography-font-size-xl,20px);line-height:var(--wpds-typography-line-height-md,24px)}.aa58f227716bcde2__heading-lg{--_gcd-heading-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-p-line-height:var(--wpds-typography-line-height-sm,20px);font-size:var(--wpds-typography-font-size-lg,15px)}.aa58f227716bcde2__heading-lg,.fc4da56d8dfe52c4__heading-md{font-family:var(--wpds-typography-font-family-heading,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-emphasis,600);line-height:var(--wpds-typography-line-height-sm,20px)}.fc4da56d8dfe52c4__heading-md{--_gcd-heading-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-p-line-height:var(--wpds-typography-line-height-sm,20px);font-size:var(--wpds-typography-font-size-md,13px)}.a9b78c7c82e8dff7__heading-sm{--_gcd-heading-font-size:var(--wpds-typography-font-size-xs,11px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-emphasis,600);--_gcd-p-font-size:var(--wpds-typography-font-size-xs,11px);--_gcd-p-line-height:var(--wpds-typography-line-height-xs,16px);font-family:var(--wpds-typography-font-family-heading,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-size:var(--wpds-typography-font-size-xs,11px);font-weight:var(--wpds-typography-font-weight-emphasis,600);line-height:var(--wpds-typography-line-height-xs,16px);text-transform:uppercase}._305ff559e52180d5__body-xl{--_gcd-heading-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-xl,20px);--_gcd-p-line-height:var(--wpds-typography-line-height-xl,32px);font-size:var(--wpds-typography-font-size-xl,20px);line-height:var(--wpds-typography-line-height-xl,32px)}._305ff559e52180d5__body-xl,.ca1aa3fc2029e958__body-lg{font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-default,400)}.ca1aa3fc2029e958__body-lg{--_gcd-heading-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-lg,15px);--_gcd-p-line-height:var(--wpds-typography-line-height-md,24px);font-size:var(--wpds-typography-font-size-lg,15px);line-height:var(--wpds-typography-line-height-md,24px)}._131101940be12424__body-md{--_gcd-heading-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-md,13px);--_gcd-p-line-height:var(--wpds-typography-line-height-sm,20px);font-size:var(--wpds-typography-font-size-md,13px);line-height:var(--wpds-typography-line-height-sm,20px)}._0e8d87a42c1f75fa__body-sm,._131101940be12424__body-md{font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-weight:var(--wpds-typography-font-weight-default,400)}._0e8d87a42c1f75fa__body-sm{--_gcd-heading-font-size:var(--wpds-typography-font-size-sm,12px);--_gcd-heading-font-weight:var(--wpds-typography-font-weight-default,400);--_gcd-p-font-size:var(--wpds-typography-font-size-sm,12px);--_gcd-p-line-height:var(--wpds-typography-line-height-xs,16px);font-size:var(--wpds-typography-font-size-sm,12px);line-height:var(--wpds-typography-line-height-xs,16px)}}}');
9158 }
9159 var style_default = { "text": "_83ed8a8da5dd50ea__text", "heading-2xl": "_14437cfb77831647__heading-2xl", "heading-xl": "_3c78b7fa9b4072dd__heading-xl", "heading-lg": "aa58f227716bcde2__heading-lg", "heading-md": "fc4da56d8dfe52c4__heading-md", "heading-sm": "a9b78c7c82e8dff7__heading-sm", "body-xl": "_305ff559e52180d5__body-xl", "body-lg": "ca1aa3fc2029e958__body-lg", "body-md": "_131101940be12424__body-md", "body-sm": "_0e8d87a42c1f75fa__body-sm" };
9160 if (typeof process === "undefined" || true) {
9161 registerStyle("af6d9984a6", "._6defc79820e382c6__button{box-sizing:var(--_gcd-button-box-sizing,border-box);font-family:var(--_gcd-button-font-family,inherit);font-size:var(--_gcd-button-font-size,inherit);font-weight:var(--_gcd-button-font-weight,inherit)}.d2cff2e5dea83bd1__input{box-sizing:var(--_gcd-input-box-sizing,border-box);font-family:var(--_gcd-input-font-family,inherit);font-size:var(--_gcd-input-font-size,inherit);font-weight:var(--_gcd-input-font-weight,inherit);margin:var(--_gcd-input-margin,0);&:is(textarea,[type=text],[type=password],[type=color],[type=date],[type=datetime],[type=datetime-local],[type=email],[type=month],[type=number],[type=search],[type=tel],[type=time],[type=url],[type=week]){background-color:var(--_gcd-input-background-color,transparent);border:var(--_gcd-input-border,none);border-radius:var(--_gcd-input-border-radius,0);box-shadow:var(--_gcd-input-box-shadow,0 0 0 transparent);color:var(--_gcd-input-color,var(--wpds-color-foreground-interactive-neutral,#1e1e1e));&:focus{border-color:var(--_gcd-input-border-color-focus,var(--wp-admin-theme-color));box-shadow:var(--_gcd-input-box-shadow-focus,none);outline:var(--_gcd-input-outline-focus,none)}&:disabled{background:var(--_gcd-input-background-disabled,transparent);border-color:var(--_gcd-input-border-color-disabled,transparent);box-shadow:var(--_gcd-input-box-shadow-disabled,none);color:var(--_gcd-input-color-disabled,var(--wpds-color-foreground-interactive-neutral-disabled,#8d8d8d))}&::placeholder{color:var(--_gcd-input-placeholder-color,var(--wpds-color-foreground-interactive-neutral-disabled,#8d8d8d))}}&:is(textarea,[type=text],[type=password],[type=date],[type=datetime],[type=datetime-local],[type=email],[type=month],[type=number],[type=search],[type=tel],[type=time],[type=url],[type=week]){line-height:var(--_gcd-input-line-height,inherit);min-height:var(--_gcd-input-min-height,auto);padding:var(--_gcd-input-padding,0)}}._547d86373d02e108__textarea{box-sizing:var(--_gcd-textarea-box-sizing,border-box);overflow:var(--_gcd-textarea-overflow,auto);resize:var(--_gcd-textarea-resize,block)}._8c15fd0ed9f28ba4__div{outline:var(--_gcd-div-outline,0 solid transparent)}p._43cec3e1eec1066d__p{font-size:var(--_gcd-p-font-size,13px);line-height:var(--_gcd-p-line-height,1.5);margin:var(--_gcd-p-margin,0)}:is(h1,h2,h3,h4,h5,h6).e97669c6d9a38497__heading{color:var(--_gcd-heading-color,var(--wpds-color-foreground-content-neutral,#1e1e1e));font-size:var(--_gcd-heading-font-size,inherit);font-weight:var(--_gcd-heading-font-weight,var(--wpds-typography-font-weight-emphasis,600));margin:var(--_gcd-heading-margin,0)}._2c0831b0499dbd6e__a,._2c0831b0499dbd6e__a:is(:hover,:focus,:active){border-radius:var(--_gcd-a-border-radius,0);box-shadow:var(--_gcd-a-box-shadow,none);color:var(--_gcd-a-color,inherit);outline:var(--_gcd-a-outline,0 solid transparent);transition:var(--_gcd-a-transition,none)}");
9162 }
9163 var global_css_defense_default = { "button": "_6defc79820e382c6__button", "input": "d2cff2e5dea83bd1__input", "textarea": "_547d86373d02e108__textarea", "div": "_8c15fd0ed9f28ba4__div", "p": "_43cec3e1eec1066d__p", "heading": "e97669c6d9a38497__heading", "a": "_2c0831b0499dbd6e__a" };
9164 var Text = (0, import_element10.forwardRef)(function Text2({ variant = "body-md", render: render4, className, ...props }, ref) {
9165 const element = useRender({
9166 render: render4,
9167 defaultTagName: "span",
9168 ref,
9169 props: mergeProps(props, {
9170 className: clsx_default(
9171 style_default.text,
9172 global_css_defense_default.heading,
9173 global_css_defense_default.p,
9174 style_default[variant],
9175 className
9176 )
9177 })
9178 });
9179 return element;
9180 });
9181
9182 // packages/ui/build-module/icon/icon.mjs
9183 var import_element11 = __toESM(require_element(), 1);
9184 var import_primitives28 = __toESM(require_primitives(), 1);
9185 var import_jsx_runtime38 = __toESM(require_jsx_runtime(), 1);
9186 var Icon = (0, import_element11.forwardRef)(function Icon2({ icon, size: size4 = 24, ...restProps }, ref) {
9187 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
9188 import_primitives28.SVG,
9189 {
9190 ref,
9191 ...icon.props,
9192 ...restProps,
9193 width: size4,
9194 height: size4
9195 }
9196 );
9197 });
9198
9199 // packages/ui/build-module/utils/render-slot-with-children.mjs
9200 var import_element12 = __toESM(require_element(), 1);
9201 function renderSlotWithChildren(slot, defaultSlot, children) {
9202 return (0, import_element12.cloneElement)(slot ?? defaultSlot, { children });
9203 }
9204
9205 // packages/ui/build-module/utils/theme-provider.mjs
9206 var theme = __toESM(require_theme(), 1);
9207
9208 // packages/ui/build-module/lock-unlock.mjs
9209 var import_private_apis = __toESM(require_private_apis(), 1);
9210 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
9211 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
9212 "@wordpress/ui"
9213 );
9214
9215 // packages/ui/build-module/utils/theme-provider.mjs
9216 function getThemeProvider() {
9217 const themePackage = theme;
9218 if (themePackage.ThemeProvider) {
9219 return themePackage.ThemeProvider;
9220 }
9221 if (!themePackage.privateApis) {
9222 throw new Error(
9223 "@wordpress/ui: @wordpress/theme must expose `ThemeProvider` or `privateApis.ThemeProvider`."
9224 );
9225 }
9226 return unlock(
9227 themePackage.privateApis
9228 ).ThemeProvider;
9229 }
9230 var ThemeProvider = getThemeProvider();
9231
9232 // packages/ui/build-module/stack/stack.mjs
9233 var import_element13 = __toESM(require_element(), 1);
9234 var STYLE_HASH_ATTRIBUTE2 = "data-wp-hash";
9235 function getRuntime2() {
9236 const globalScope = globalThis;
9237 if (globalScope.__wpStyleRuntime) {
9238 return globalScope.__wpStyleRuntime;
9239 }
9240 globalScope.__wpStyleRuntime = {
9241 documents: /* @__PURE__ */ new Map(),
9242 styles: /* @__PURE__ */ new Map(),
9243 injectedStyles: /* @__PURE__ */ new WeakMap()
9244 };
9245 if (typeof document !== "undefined") {
9246 registerDocument2(document);
9247 }
9248 return globalScope.__wpStyleRuntime;
9249 }
9250 function documentContainsStyleHash2(targetDocument, hash) {
9251 if (!targetDocument.head) {
9252 return false;
9253 }
9254 for (const style of targetDocument.head.querySelectorAll(
9255 `style[${STYLE_HASH_ATTRIBUTE2}]`
9256 )) {
9257 if (style.getAttribute(STYLE_HASH_ATTRIBUTE2) === hash) {
9258 return true;
9259 }
9260 }
9261 return false;
9262 }
9263 function injectStyle2(targetDocument, hash, css) {
9264 if (!targetDocument.head) {
9265 return;
9266 }
9267 const runtime = getRuntime2();
9268 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9269 if (!injectedStyles) {
9270 injectedStyles = /* @__PURE__ */ new Set();
9271 runtime.injectedStyles.set(targetDocument, injectedStyles);
9272 }
9273 if (injectedStyles.has(hash)) {
9274 return;
9275 }
9276 if (documentContainsStyleHash2(targetDocument, hash)) {
9277 injectedStyles.add(hash);
9278 return;
9279 }
9280 const style = targetDocument.createElement("style");
9281 style.setAttribute(STYLE_HASH_ATTRIBUTE2, hash);
9282 style.appendChild(targetDocument.createTextNode(css));
9283 targetDocument.head.appendChild(style);
9284 injectedStyles.add(hash);
9285 }
9286 function registerDocument2(targetDocument) {
9287 const runtime = getRuntime2();
9288 runtime.documents.set(
9289 targetDocument,
9290 (runtime.documents.get(targetDocument) ?? 0) + 1
9291 );
9292 for (const [hash, css] of runtime.styles) {
9293 injectStyle2(targetDocument, hash, css);
9294 }
9295 return () => {
9296 const count = runtime.documents.get(targetDocument);
9297 if (count === void 0) {
9298 return;
9299 }
9300 if (count <= 1) {
9301 runtime.documents.delete(targetDocument);
9302 return;
9303 }
9304 runtime.documents.set(targetDocument, count - 1);
9305 };
9306 }
9307 function registerStyle2(hash, css) {
9308 const runtime = getRuntime2();
9309 runtime.styles.set(hash, css);
9310 for (const targetDocument of runtime.documents.keys()) {
9311 injectStyle2(targetDocument, hash, css);
9312 }
9313 }
9314 if (typeof process === "undefined" || true) {
9315 registerStyle2("32aba35fe1", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._19ce0419607e1896__stack{display:flex}}}");
9316 }
9317 var style_default2 = { "stack": "_19ce0419607e1896__stack" };
9318 var gapTokens = {
9319 xs: "var(--wpds-dimension-gap-xs, 4px)",
9320 sm: "var(--wpds-dimension-gap-sm, 8px)",
9321 md: "var(--wpds-dimension-gap-md, 12px)",
9322 lg: "var(--wpds-dimension-gap-lg, 16px)",
9323 xl: "var(--wpds-dimension-gap-xl, 24px)",
9324 "2xl": "var(--wpds-dimension-gap-2xl, 32px)",
9325 "3xl": "var(--wpds-dimension-gap-3xl, 40px)"
9326 };
9327 var Stack = (0, import_element13.forwardRef)(function Stack2({ direction, gap, align, justify, wrap, render: render4, ...props }, ref) {
9328 const style = {
9329 gap: gap && gapTokens[gap],
9330 alignItems: align,
9331 justifyContent: justify,
9332 flexDirection: direction,
9333 flexWrap: wrap
9334 };
9335 const element = useRender({
9336 render: render4,
9337 ref,
9338 props: mergeProps(props, { style, className: style_default2.stack })
9339 });
9340 return element;
9341 });
9342
9343 // packages/ui/build-module/tooltip/index.mjs
9344 var tooltip_exports = {};
9345 __export(tooltip_exports, {
9346 Popup: () => Popup,
9347 Portal: () => Portal,
9348 Positioner: () => Positioner,
9349 Provider: () => Provider,
9350 Root: () => Root,
9351 Trigger: () => Trigger
9352 });
9353
9354 // packages/ui/build-module/tooltip/popup.mjs
9355 var import_element16 = __toESM(require_element(), 1);
9356
9357 // packages/ui/build-module/tooltip/portal.mjs
9358 var import_element14 = __toESM(require_element(), 1);
9359
9360 // packages/ui/build-module/utils/wp-compat-overlay-slot.mjs
9361 var STYLE_HASH_ATTRIBUTE3 = "data-wp-hash";
9362 function getRuntime3() {
9363 const globalScope = globalThis;
9364 if (globalScope.__wpStyleRuntime) {
9365 return globalScope.__wpStyleRuntime;
9366 }
9367 globalScope.__wpStyleRuntime = {
9368 documents: /* @__PURE__ */ new Map(),
9369 styles: /* @__PURE__ */ new Map(),
9370 injectedStyles: /* @__PURE__ */ new WeakMap()
9371 };
9372 if (typeof document !== "undefined") {
9373 registerDocument3(document);
9374 }
9375 return globalScope.__wpStyleRuntime;
9376 }
9377 function documentContainsStyleHash3(targetDocument, hash) {
9378 if (!targetDocument.head) {
9379 return false;
9380 }
9381 for (const style of targetDocument.head.querySelectorAll(
9382 `style[${STYLE_HASH_ATTRIBUTE3}]`
9383 )) {
9384 if (style.getAttribute(STYLE_HASH_ATTRIBUTE3) === hash) {
9385 return true;
9386 }
9387 }
9388 return false;
9389 }
9390 function injectStyle3(targetDocument, hash, css) {
9391 if (!targetDocument.head) {
9392 return;
9393 }
9394 const runtime = getRuntime3();
9395 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9396 if (!injectedStyles) {
9397 injectedStyles = /* @__PURE__ */ new Set();
9398 runtime.injectedStyles.set(targetDocument, injectedStyles);
9399 }
9400 if (injectedStyles.has(hash)) {
9401 return;
9402 }
9403 if (documentContainsStyleHash3(targetDocument, hash)) {
9404 injectedStyles.add(hash);
9405 return;
9406 }
9407 const style = targetDocument.createElement("style");
9408 style.setAttribute(STYLE_HASH_ATTRIBUTE3, hash);
9409 style.appendChild(targetDocument.createTextNode(css));
9410 targetDocument.head.appendChild(style);
9411 injectedStyles.add(hash);
9412 }
9413 function registerDocument3(targetDocument) {
9414 const runtime = getRuntime3();
9415 runtime.documents.set(
9416 targetDocument,
9417 (runtime.documents.get(targetDocument) ?? 0) + 1
9418 );
9419 for (const [hash, css] of runtime.styles) {
9420 injectStyle3(targetDocument, hash, css);
9421 }
9422 return () => {
9423 const count = runtime.documents.get(targetDocument);
9424 if (count === void 0) {
9425 return;
9426 }
9427 if (count <= 1) {
9428 runtime.documents.delete(targetDocument);
9429 return;
9430 }
9431 runtime.documents.set(targetDocument, count - 1);
9432 };
9433 }
9434 function registerStyle3(hash, css) {
9435 const runtime = getRuntime3();
9436 runtime.styles.set(hash, css);
9437 for (const targetDocument of runtime.documents.keys()) {
9438 injectStyle3(targetDocument, hash, css);
9439 }
9440 }
9441 if (typeof process === "undefined" || true) {
9442 registerStyle3("be37f31c1e", "._11fc52b637ff8a7e__slot{inset:0;isolation:isolate;pointer-events:none;position:fixed;z-index:1000000003}@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._11fc52b637ff8a7e__slot>*{pointer-events:auto}}}");
9443 }
9444 var wp_compat_overlay_slot_default = { "slot": "_11fc52b637ff8a7e__slot" };
9445 var WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE = "data-wp-compat-overlay-slot";
9446 function resolveOwnerDocument() {
9447 return typeof document === "undefined" ? null : document;
9448 }
9449 function isInWordPressEnvironment() {
9450 let topWp;
9451 try {
9452 topWp = window.top?.wp;
9453 } catch {
9454 }
9455 const wp = topWp ?? window.wp;
9456 return typeof wp?.components === "object" && wp.components !== null;
9457 }
9458 var cachedSlot = null;
9459 function ensureSlotIsAccessible(element) {
9460 element.setAttribute("aria-hidden", "false");
9461 return element;
9462 }
9463 function createSlot(ownerDocument2) {
9464 const element = ownerDocument2.createElement("div");
9465 element.setAttribute(WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE, "");
9466 if (wp_compat_overlay_slot_default.slot) {
9467 element.classList.add(wp_compat_overlay_slot_default.slot);
9468 }
9469 ownerDocument2.body.appendChild(element);
9470 return element;
9471 }
9472 function getWpCompatOverlaySlot() {
9473 if (typeof window === "undefined") {
9474 return void 0;
9475 }
9476 if (!isInWordPressEnvironment() && window.__wpUiCompatOverlaySlotEnabled !== true) {
9477 return void 0;
9478 }
9479 const ownerDocument2 = resolveOwnerDocument();
9480 if (!ownerDocument2 || !ownerDocument2.body) {
9481 return void 0;
9482 }
9483 if (cachedSlot && cachedSlot.ownerDocument === ownerDocument2 && cachedSlot.isConnected) {
9484 return ensureSlotIsAccessible(cachedSlot);
9485 }
9486 const existing = ownerDocument2.querySelector(
9487 `[${WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE}]`
9488 );
9489 if (existing instanceof HTMLDivElement) {
9490 cachedSlot = ensureSlotIsAccessible(existing);
9491 return cachedSlot;
9492 }
9493 if (cachedSlot?.isConnected) {
9494 cachedSlot.remove();
9495 }
9496 cachedSlot = ensureSlotIsAccessible(createSlot(ownerDocument2));
9497 return cachedSlot;
9498 }
9499
9500 // packages/ui/build-module/tooltip/portal.mjs
9501 var import_jsx_runtime39 = __toESM(require_jsx_runtime(), 1);
9502 var Portal = (0, import_element14.forwardRef)(
9503 function TooltipPortal3({ container, ...restProps }, ref) {
9504 return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
9505 index_parts_exports.Portal,
9506 {
9507 container: container ?? getWpCompatOverlaySlot(),
9508 ...restProps,
9509 ref
9510 }
9511 );
9512 }
9513 );
9514
9515 // packages/ui/build-module/tooltip/positioner.mjs
9516 var import_element15 = __toESM(require_element(), 1);
9517 var import_jsx_runtime40 = __toESM(require_jsx_runtime(), 1);
9518 var STYLE_HASH_ATTRIBUTE4 = "data-wp-hash";
9519 function getRuntime4() {
9520 const globalScope = globalThis;
9521 if (globalScope.__wpStyleRuntime) {
9522 return globalScope.__wpStyleRuntime;
9523 }
9524 globalScope.__wpStyleRuntime = {
9525 documents: /* @__PURE__ */ new Map(),
9526 styles: /* @__PURE__ */ new Map(),
9527 injectedStyles: /* @__PURE__ */ new WeakMap()
9528 };
9529 if (typeof document !== "undefined") {
9530 registerDocument4(document);
9531 }
9532 return globalScope.__wpStyleRuntime;
9533 }
9534 function documentContainsStyleHash4(targetDocument, hash) {
9535 if (!targetDocument.head) {
9536 return false;
9537 }
9538 for (const style of targetDocument.head.querySelectorAll(
9539 `style[${STYLE_HASH_ATTRIBUTE4}]`
9540 )) {
9541 if (style.getAttribute(STYLE_HASH_ATTRIBUTE4) === hash) {
9542 return true;
9543 }
9544 }
9545 return false;
9546 }
9547 function injectStyle4(targetDocument, hash, css) {
9548 if (!targetDocument.head) {
9549 return;
9550 }
9551 const runtime = getRuntime4();
9552 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9553 if (!injectedStyles) {
9554 injectedStyles = /* @__PURE__ */ new Set();
9555 runtime.injectedStyles.set(targetDocument, injectedStyles);
9556 }
9557 if (injectedStyles.has(hash)) {
9558 return;
9559 }
9560 if (documentContainsStyleHash4(targetDocument, hash)) {
9561 injectedStyles.add(hash);
9562 return;
9563 }
9564 const style = targetDocument.createElement("style");
9565 style.setAttribute(STYLE_HASH_ATTRIBUTE4, hash);
9566 style.appendChild(targetDocument.createTextNode(css));
9567 targetDocument.head.appendChild(style);
9568 injectedStyles.add(hash);
9569 }
9570 function registerDocument4(targetDocument) {
9571 const runtime = getRuntime4();
9572 runtime.documents.set(
9573 targetDocument,
9574 (runtime.documents.get(targetDocument) ?? 0) + 1
9575 );
9576 for (const [hash, css] of runtime.styles) {
9577 injectStyle4(targetDocument, hash, css);
9578 }
9579 return () => {
9580 const count = runtime.documents.get(targetDocument);
9581 if (count === void 0) {
9582 return;
9583 }
9584 if (count <= 1) {
9585 runtime.documents.delete(targetDocument);
9586 return;
9587 }
9588 runtime.documents.set(targetDocument, count - 1);
9589 };
9590 }
9591 function registerStyle4(hash, css) {
9592 const runtime = getRuntime4();
9593 runtime.styles.set(hash, css);
9594 for (const targetDocument of runtime.documents.keys()) {
9595 injectStyle4(targetDocument, hash, css);
9596 }
9597 }
9598 if (typeof process === "undefined" || true) {
9599 registerStyle4("10f3806643", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._336cd3e4e743482f__box-sizing{box-sizing:border-box;*,:after,:before{box-sizing:inherit}}}}");
9600 }
9601 var resets_default = { "box-sizing": "_336cd3e4e743482f__box-sizing" };
9602 if (typeof process === "undefined" || true) {
9603 registerStyle4("19fcc06039", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._480b748dd3510e64__positioner{z-index:var(--wp-ui-tooltip-z-index,initial)}._50096b232db7709d__popup{--_wp-ui-elevation-sm:0 1px 2px rgba(0,0,0,.05),0 2px 3px rgba(0,0,0,.04),0 6px 6px rgba(0,0,0,.03),0 8px 8px rgba(0,0,0,.02);background-color:var(--wpds-color-background-surface-neutral-strong,#fff);border-radius:var(--wpds-border-radius-md,4px);box-shadow:var(--_wp-ui-elevation-sm);color:var(--wpds-color-foreground-content-neutral,#1e1e1e);font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-size:var(--wpds-typography-font-size-sm,12px);line-height:1.4;padding:var(--wpds-dimension-padding-xs,4px) var(--wpds-dimension-padding-sm,8px);@media (forced-colors:active){border-bottom-color:CanvasText;border-bottom-style:solid;border-bottom-width:1px;border-left-color:CanvasText;border-left-style:solid;border-left-width:1px;border-right-color:CanvasText;border-right-style:solid;border-right-width:1px;border-top-color:CanvasText;border-top-style:solid;border-top-width:1px}}}}');
9604 }
9605 var style_default3 = { "positioner": "_480b748dd3510e64__positioner", "popup": "_50096b232db7709d__popup" };
9606 var Positioner = (0, import_element15.forwardRef)(
9607 function TooltipPositioner3({ align = "center", className, side = "top", sideOffset = 4, ...props }, ref) {
9608 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
9609 index_parts_exports.Positioner,
9610 {
9611 ref,
9612 align,
9613 side,
9614 sideOffset,
9615 ...props,
9616 className: clsx_default(
9617 resets_default["box-sizing"],
9618 style_default3.positioner,
9619 className
9620 )
9621 }
9622 );
9623 }
9624 );
9625
9626 // packages/ui/build-module/tooltip/popup.mjs
9627 var import_jsx_runtime41 = __toESM(require_jsx_runtime(), 1);
9628 var STYLE_HASH_ATTRIBUTE5 = "data-wp-hash";
9629 function getRuntime5() {
9630 const globalScope = globalThis;
9631 if (globalScope.__wpStyleRuntime) {
9632 return globalScope.__wpStyleRuntime;
9633 }
9634 globalScope.__wpStyleRuntime = {
9635 documents: /* @__PURE__ */ new Map(),
9636 styles: /* @__PURE__ */ new Map(),
9637 injectedStyles: /* @__PURE__ */ new WeakMap()
9638 };
9639 if (typeof document !== "undefined") {
9640 registerDocument5(document);
9641 }
9642 return globalScope.__wpStyleRuntime;
9643 }
9644 function documentContainsStyleHash5(targetDocument, hash) {
9645 if (!targetDocument.head) {
9646 return false;
9647 }
9648 for (const style of targetDocument.head.querySelectorAll(
9649 `style[${STYLE_HASH_ATTRIBUTE5}]`
9650 )) {
9651 if (style.getAttribute(STYLE_HASH_ATTRIBUTE5) === hash) {
9652 return true;
9653 }
9654 }
9655 return false;
9656 }
9657 function injectStyle5(targetDocument, hash, css) {
9658 if (!targetDocument.head) {
9659 return;
9660 }
9661 const runtime = getRuntime5();
9662 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9663 if (!injectedStyles) {
9664 injectedStyles = /* @__PURE__ */ new Set();
9665 runtime.injectedStyles.set(targetDocument, injectedStyles);
9666 }
9667 if (injectedStyles.has(hash)) {
9668 return;
9669 }
9670 if (documentContainsStyleHash5(targetDocument, hash)) {
9671 injectedStyles.add(hash);
9672 return;
9673 }
9674 const style = targetDocument.createElement("style");
9675 style.setAttribute(STYLE_HASH_ATTRIBUTE5, hash);
9676 style.appendChild(targetDocument.createTextNode(css));
9677 targetDocument.head.appendChild(style);
9678 injectedStyles.add(hash);
9679 }
9680 function registerDocument5(targetDocument) {
9681 const runtime = getRuntime5();
9682 runtime.documents.set(
9683 targetDocument,
9684 (runtime.documents.get(targetDocument) ?? 0) + 1
9685 );
9686 for (const [hash, css] of runtime.styles) {
9687 injectStyle5(targetDocument, hash, css);
9688 }
9689 return () => {
9690 const count = runtime.documents.get(targetDocument);
9691 if (count === void 0) {
9692 return;
9693 }
9694 if (count <= 1) {
9695 runtime.documents.delete(targetDocument);
9696 return;
9697 }
9698 runtime.documents.set(targetDocument, count - 1);
9699 };
9700 }
9701 function registerStyle5(hash, css) {
9702 const runtime = getRuntime5();
9703 runtime.styles.set(hash, css);
9704 for (const targetDocument of runtime.documents.keys()) {
9705 injectStyle5(targetDocument, hash, css);
9706 }
9707 }
9708 if (typeof process === "undefined" || true) {
9709 registerStyle5("19fcc06039", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._480b748dd3510e64__positioner{z-index:var(--wp-ui-tooltip-z-index,initial)}._50096b232db7709d__popup{--_wp-ui-elevation-sm:0 1px 2px rgba(0,0,0,.05),0 2px 3px rgba(0,0,0,.04),0 6px 6px rgba(0,0,0,.03),0 8px 8px rgba(0,0,0,.02);background-color:var(--wpds-color-background-surface-neutral-strong,#fff);border-radius:var(--wpds-border-radius-md,4px);box-shadow:var(--_wp-ui-elevation-sm);color:var(--wpds-color-foreground-content-neutral,#1e1e1e);font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-size:var(--wpds-typography-font-size-sm,12px);line-height:1.4;padding:var(--wpds-dimension-padding-xs,4px) var(--wpds-dimension-padding-sm,8px);@media (forced-colors:active){border-bottom-color:CanvasText;border-bottom-style:solid;border-bottom-width:1px;border-left-color:CanvasText;border-left-style:solid;border-left-width:1px;border-right-color:CanvasText;border-right-style:solid;border-right-width:1px;border-top-color:CanvasText;border-top-style:solid;border-top-width:1px}}}}');
9710 }
9711 var style_default4 = { "positioner": "_480b748dd3510e64__positioner", "popup": "_50096b232db7709d__popup" };
9712 var POPUP_COLOR = { background: "#1e1e1e" };
9713 var Popup = (0, import_element16.forwardRef)(function TooltipPopup3({ portal, positioner, children, className, ...props }, ref) {
9714 const popupContent = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ThemeProvider, { color: POPUP_COLOR, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
9715 index_parts_exports.Popup,
9716 {
9717 ref,
9718 className: clsx_default(style_default4.popup, className),
9719 ...props,
9720 children
9721 }
9722 ) });
9723 const positionedPopup = renderSlotWithChildren(
9724 positioner,
9725 /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Positioner, {}),
9726 popupContent
9727 );
9728 return renderSlotWithChildren(portal, /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Portal, {}), positionedPopup);
9729 });
9730
9731 // packages/ui/build-module/tooltip/trigger.mjs
9732 var import_element17 = __toESM(require_element(), 1);
9733 var import_jsx_runtime42 = __toESM(require_jsx_runtime(), 1);
9734 var Trigger = (0, import_element17.forwardRef)(
9735 function TooltipTrigger3(props, ref) {
9736 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(index_parts_exports.Trigger, { ref, ...props });
9737 }
9738 );
9739
9740 // packages/ui/build-module/tooltip/root.mjs
9741 var import_jsx_runtime43 = __toESM(require_jsx_runtime(), 1);
9742 function Root(props) {
9743 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(index_parts_exports.Root, { ...props });
9744 }
9745
9746 // packages/ui/build-module/tooltip/provider.mjs
9747 var import_jsx_runtime44 = __toESM(require_jsx_runtime(), 1);
9748 function Provider({ ...props }) {
9749 return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(index_parts_exports.Provider, { ...props });
9750 }
9751
9752 // packages/ui/build-module/empty-state/index.mjs
9753 var empty_state_exports = {};
9754 __export(empty_state_exports, {
9755 Actions: () => Actions,
9756 Description: () => Description,
9757 Icon: () => Icon3,
9758 Root: () => Root2,
9759 Title: () => Title,
9760 Visual: () => Visual
9761 });
9762
9763 // packages/ui/build-module/empty-state/root.mjs
9764 var import_element18 = __toESM(require_element(), 1);
9765 var STYLE_HASH_ATTRIBUTE6 = "data-wp-hash";
9766 function getRuntime6() {
9767 const globalScope = globalThis;
9768 if (globalScope.__wpStyleRuntime) {
9769 return globalScope.__wpStyleRuntime;
9770 }
9771 globalScope.__wpStyleRuntime = {
9772 documents: /* @__PURE__ */ new Map(),
9773 styles: /* @__PURE__ */ new Map(),
9774 injectedStyles: /* @__PURE__ */ new WeakMap()
9775 };
9776 if (typeof document !== "undefined") {
9777 registerDocument6(document);
9778 }
9779 return globalScope.__wpStyleRuntime;
9780 }
9781 function documentContainsStyleHash6(targetDocument, hash) {
9782 if (!targetDocument.head) {
9783 return false;
9784 }
9785 for (const style of targetDocument.head.querySelectorAll(
9786 `style[${STYLE_HASH_ATTRIBUTE6}]`
9787 )) {
9788 if (style.getAttribute(STYLE_HASH_ATTRIBUTE6) === hash) {
9789 return true;
9790 }
9791 }
9792 return false;
9793 }
9794 function injectStyle6(targetDocument, hash, css) {
9795 if (!targetDocument.head) {
9796 return;
9797 }
9798 const runtime = getRuntime6();
9799 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9800 if (!injectedStyles) {
9801 injectedStyles = /* @__PURE__ */ new Set();
9802 runtime.injectedStyles.set(targetDocument, injectedStyles);
9803 }
9804 if (injectedStyles.has(hash)) {
9805 return;
9806 }
9807 if (documentContainsStyleHash6(targetDocument, hash)) {
9808 injectedStyles.add(hash);
9809 return;
9810 }
9811 const style = targetDocument.createElement("style");
9812 style.setAttribute(STYLE_HASH_ATTRIBUTE6, hash);
9813 style.appendChild(targetDocument.createTextNode(css));
9814 targetDocument.head.appendChild(style);
9815 injectedStyles.add(hash);
9816 }
9817 function registerDocument6(targetDocument) {
9818 const runtime = getRuntime6();
9819 runtime.documents.set(
9820 targetDocument,
9821 (runtime.documents.get(targetDocument) ?? 0) + 1
9822 );
9823 for (const [hash, css] of runtime.styles) {
9824 injectStyle6(targetDocument, hash, css);
9825 }
9826 return () => {
9827 const count = runtime.documents.get(targetDocument);
9828 if (count === void 0) {
9829 return;
9830 }
9831 if (count <= 1) {
9832 runtime.documents.delete(targetDocument);
9833 return;
9834 }
9835 runtime.documents.set(targetDocument, count - 1);
9836 };
9837 }
9838 function registerStyle6(hash, css) {
9839 const runtime = getRuntime6();
9840 runtime.styles.set(hash, css);
9841 for (const targetDocument of runtime.documents.keys()) {
9842 injectStyle6(targetDocument, hash, css);
9843 }
9844 }
9845 if (typeof process === "undefined" || true) {
9846 registerStyle6("7b60a246cc", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.a23e08e65c8e62e5__root{text-wrap:balance;align-items:center;color:var(--wpds-color-foreground-content-neutral,#1e1e1e);display:flex;flex-direction:column;font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);gap:var(--wpds-dimension-gap-xs,4px);max-width:var(--wpds-dimension-surface-width-sm,320px);text-align:center}._01303b3680eaa216__visual{align-items:center;color:var(--wpds-color-foreground-content-neutral-weak,#707070);display:flex;justify-content:center;line-height:1;margin-block-end:var(--wpds-dimension-gap-xs,4px)}._58c8e351db225608__icon{background-color:var(--wpds-color-background-surface-neutral-weak,#f4f4f4);border:1px solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);border-radius:50%;padding:var(--wpds-dimension-padding-xs,4px)}.b8b96f70820333a1__title{margin:0}._70f1dd22bad55b18__description{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0}._89ac025fd8e2bc52__actions{align-items:center;display:flex;flex-direction:column;gap:var(--wpds-dimension-gap-xs,4px);margin-block-start:var(--wpds-dimension-gap-md,12px);@media (min-width:480px){flex-direction:row;justify-content:center}}}}');
9847 }
9848 var style_default5 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
9849 var Root2 = (0, import_element18.forwardRef)(
9850 function EmptyStateRoot({ render: render4, ...props }, ref) {
9851 const className = clsx_default(style_default5.root);
9852 const element = useRender({
9853 defaultTagName: "div",
9854 render: render4,
9855 ref,
9856 props: mergeProps({ className }, props)
9857 });
9858 return element;
9859 }
9860 );
9861
9862 // packages/ui/build-module/empty-state/visual.mjs
9863 var import_element19 = __toESM(require_element(), 1);
9864 var STYLE_HASH_ATTRIBUTE7 = "data-wp-hash";
9865 function getRuntime7() {
9866 const globalScope = globalThis;
9867 if (globalScope.__wpStyleRuntime) {
9868 return globalScope.__wpStyleRuntime;
9869 }
9870 globalScope.__wpStyleRuntime = {
9871 documents: /* @__PURE__ */ new Map(),
9872 styles: /* @__PURE__ */ new Map(),
9873 injectedStyles: /* @__PURE__ */ new WeakMap()
9874 };
9875 if (typeof document !== "undefined") {
9876 registerDocument7(document);
9877 }
9878 return globalScope.__wpStyleRuntime;
9879 }
9880 function documentContainsStyleHash7(targetDocument, hash) {
9881 if (!targetDocument.head) {
9882 return false;
9883 }
9884 for (const style of targetDocument.head.querySelectorAll(
9885 `style[${STYLE_HASH_ATTRIBUTE7}]`
9886 )) {
9887 if (style.getAttribute(STYLE_HASH_ATTRIBUTE7) === hash) {
9888 return true;
9889 }
9890 }
9891 return false;
9892 }
9893 function injectStyle7(targetDocument, hash, css) {
9894 if (!targetDocument.head) {
9895 return;
9896 }
9897 const runtime = getRuntime7();
9898 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9899 if (!injectedStyles) {
9900 injectedStyles = /* @__PURE__ */ new Set();
9901 runtime.injectedStyles.set(targetDocument, injectedStyles);
9902 }
9903 if (injectedStyles.has(hash)) {
9904 return;
9905 }
9906 if (documentContainsStyleHash7(targetDocument, hash)) {
9907 injectedStyles.add(hash);
9908 return;
9909 }
9910 const style = targetDocument.createElement("style");
9911 style.setAttribute(STYLE_HASH_ATTRIBUTE7, hash);
9912 style.appendChild(targetDocument.createTextNode(css));
9913 targetDocument.head.appendChild(style);
9914 injectedStyles.add(hash);
9915 }
9916 function registerDocument7(targetDocument) {
9917 const runtime = getRuntime7();
9918 runtime.documents.set(
9919 targetDocument,
9920 (runtime.documents.get(targetDocument) ?? 0) + 1
9921 );
9922 for (const [hash, css] of runtime.styles) {
9923 injectStyle7(targetDocument, hash, css);
9924 }
9925 return () => {
9926 const count = runtime.documents.get(targetDocument);
9927 if (count === void 0) {
9928 return;
9929 }
9930 if (count <= 1) {
9931 runtime.documents.delete(targetDocument);
9932 return;
9933 }
9934 runtime.documents.set(targetDocument, count - 1);
9935 };
9936 }
9937 function registerStyle7(hash, css) {
9938 const runtime = getRuntime7();
9939 runtime.styles.set(hash, css);
9940 for (const targetDocument of runtime.documents.keys()) {
9941 injectStyle7(targetDocument, hash, css);
9942 }
9943 }
9944 if (typeof process === "undefined" || true) {
9945 registerStyle7("7b60a246cc", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.a23e08e65c8e62e5__root{text-wrap:balance;align-items:center;color:var(--wpds-color-foreground-content-neutral,#1e1e1e);display:flex;flex-direction:column;font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);gap:var(--wpds-dimension-gap-xs,4px);max-width:var(--wpds-dimension-surface-width-sm,320px);text-align:center}._01303b3680eaa216__visual{align-items:center;color:var(--wpds-color-foreground-content-neutral-weak,#707070);display:flex;justify-content:center;line-height:1;margin-block-end:var(--wpds-dimension-gap-xs,4px)}._58c8e351db225608__icon{background-color:var(--wpds-color-background-surface-neutral-weak,#f4f4f4);border:1px solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);border-radius:50%;padding:var(--wpds-dimension-padding-xs,4px)}.b8b96f70820333a1__title{margin:0}._70f1dd22bad55b18__description{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0}._89ac025fd8e2bc52__actions{align-items:center;display:flex;flex-direction:column;gap:var(--wpds-dimension-gap-xs,4px);margin-block-start:var(--wpds-dimension-gap-md,12px);@media (min-width:480px){flex-direction:row;justify-content:center}}}}');
9946 }
9947 var style_default6 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
9948 var Visual = (0, import_element19.forwardRef)(
9949 function EmptyStateVisual({ render: render4, ...props }, ref) {
9950 const className = clsx_default(style_default6.visual);
9951 const element = useRender({
9952 defaultTagName: "div",
9953 render: render4,
9954 ref,
9955 props: mergeProps({ className }, props)
9956 });
9957 return element;
9958 }
9959 );
9960
9961 // packages/ui/build-module/empty-state/icon.mjs
9962 var import_element20 = __toESM(require_element(), 1);
9963 var import_jsx_runtime45 = __toESM(require_jsx_runtime(), 1);
9964 var STYLE_HASH_ATTRIBUTE8 = "data-wp-hash";
9965 function getRuntime8() {
9966 const globalScope = globalThis;
9967 if (globalScope.__wpStyleRuntime) {
9968 return globalScope.__wpStyleRuntime;
9969 }
9970 globalScope.__wpStyleRuntime = {
9971 documents: /* @__PURE__ */ new Map(),
9972 styles: /* @__PURE__ */ new Map(),
9973 injectedStyles: /* @__PURE__ */ new WeakMap()
9974 };
9975 if (typeof document !== "undefined") {
9976 registerDocument8(document);
9977 }
9978 return globalScope.__wpStyleRuntime;
9979 }
9980 function documentContainsStyleHash8(targetDocument, hash) {
9981 if (!targetDocument.head) {
9982 return false;
9983 }
9984 for (const style of targetDocument.head.querySelectorAll(
9985 `style[${STYLE_HASH_ATTRIBUTE8}]`
9986 )) {
9987 if (style.getAttribute(STYLE_HASH_ATTRIBUTE8) === hash) {
9988 return true;
9989 }
9990 }
9991 return false;
9992 }
9993 function injectStyle8(targetDocument, hash, css) {
9994 if (!targetDocument.head) {
9995 return;
9996 }
9997 const runtime = getRuntime8();
9998 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9999 if (!injectedStyles) {
10000 injectedStyles = /* @__PURE__ */ new Set();
10001 runtime.injectedStyles.set(targetDocument, injectedStyles);
10002 }
10003 if (injectedStyles.has(hash)) {
10004 return;
10005 }
10006 if (documentContainsStyleHash8(targetDocument, hash)) {
10007 injectedStyles.add(hash);
10008 return;
10009 }
10010 const style = targetDocument.createElement("style");
10011 style.setAttribute(STYLE_HASH_ATTRIBUTE8, hash);
10012 style.appendChild(targetDocument.createTextNode(css));
10013 targetDocument.head.appendChild(style);
10014 injectedStyles.add(hash);
10015 }
10016 function registerDocument8(targetDocument) {
10017 const runtime = getRuntime8();
10018 runtime.documents.set(
10019 targetDocument,
10020 (runtime.documents.get(targetDocument) ?? 0) + 1
10021 );
10022 for (const [hash, css] of runtime.styles) {
10023 injectStyle8(targetDocument, hash, css);
10024 }
10025 return () => {
10026 const count = runtime.documents.get(targetDocument);
10027 if (count === void 0) {
10028 return;
10029 }
10030 if (count <= 1) {
10031 runtime.documents.delete(targetDocument);
10032 return;
10033 }
10034 runtime.documents.set(targetDocument, count - 1);
10035 };
10036 }
10037 function registerStyle8(hash, css) {
10038 const runtime = getRuntime8();
10039 runtime.styles.set(hash, css);
10040 for (const targetDocument of runtime.documents.keys()) {
10041 injectStyle8(targetDocument, hash, css);
10042 }
10043 }
10044 if (typeof process === "undefined" || true) {
10045 registerStyle8("7b60a246cc", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.a23e08e65c8e62e5__root{text-wrap:balance;align-items:center;color:var(--wpds-color-foreground-content-neutral,#1e1e1e);display:flex;flex-direction:column;font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);gap:var(--wpds-dimension-gap-xs,4px);max-width:var(--wpds-dimension-surface-width-sm,320px);text-align:center}._01303b3680eaa216__visual{align-items:center;color:var(--wpds-color-foreground-content-neutral-weak,#707070);display:flex;justify-content:center;line-height:1;margin-block-end:var(--wpds-dimension-gap-xs,4px)}._58c8e351db225608__icon{background-color:var(--wpds-color-background-surface-neutral-weak,#f4f4f4);border:1px solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);border-radius:50%;padding:var(--wpds-dimension-padding-xs,4px)}.b8b96f70820333a1__title{margin:0}._70f1dd22bad55b18__description{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0}._89ac025fd8e2bc52__actions{align-items:center;display:flex;flex-direction:column;gap:var(--wpds-dimension-gap-xs,4px);margin-block-start:var(--wpds-dimension-gap-md,12px);@media (min-width:480px){flex-direction:row;justify-content:center}}}}');
10046 }
10047 var style_default7 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10048 var Icon3 = (0, import_element20.forwardRef)(
10049 function EmptyStateIcon({ icon, className, ...restProps }, ref) {
10050 return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
10051 Visual,
10052 {
10053 ref,
10054 className: clsx_default(style_default7.icon, className),
10055 ...restProps,
10056 children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Icon, { icon })
10057 }
10058 );
10059 }
10060 );
10061
10062 // packages/ui/build-module/empty-state/title.mjs
10063 var import_element21 = __toESM(require_element(), 1);
10064 var import_jsx_runtime46 = __toESM(require_jsx_runtime(), 1);
10065 var STYLE_HASH_ATTRIBUTE9 = "data-wp-hash";
10066 function getRuntime9() {
10067 const globalScope = globalThis;
10068 if (globalScope.__wpStyleRuntime) {
10069 return globalScope.__wpStyleRuntime;
10070 }
10071 globalScope.__wpStyleRuntime = {
10072 documents: /* @__PURE__ */ new Map(),
10073 styles: /* @__PURE__ */ new Map(),
10074 injectedStyles: /* @__PURE__ */ new WeakMap()
10075 };
10076 if (typeof document !== "undefined") {
10077 registerDocument9(document);
10078 }
10079 return globalScope.__wpStyleRuntime;
10080 }
10081 function documentContainsStyleHash9(targetDocument, hash) {
10082 if (!targetDocument.head) {
10083 return false;
10084 }
10085 for (const style of targetDocument.head.querySelectorAll(
10086 `style[${STYLE_HASH_ATTRIBUTE9}]`
10087 )) {
10088 if (style.getAttribute(STYLE_HASH_ATTRIBUTE9) === hash) {
10089 return true;
10090 }
10091 }
10092 return false;
10093 }
10094 function injectStyle9(targetDocument, hash, css) {
10095 if (!targetDocument.head) {
10096 return;
10097 }
10098 const runtime = getRuntime9();
10099 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10100 if (!injectedStyles) {
10101 injectedStyles = /* @__PURE__ */ new Set();
10102 runtime.injectedStyles.set(targetDocument, injectedStyles);
10103 }
10104 if (injectedStyles.has(hash)) {
10105 return;
10106 }
10107 if (documentContainsStyleHash9(targetDocument, hash)) {
10108 injectedStyles.add(hash);
10109 return;
10110 }
10111 const style = targetDocument.createElement("style");
10112 style.setAttribute(STYLE_HASH_ATTRIBUTE9, hash);
10113 style.appendChild(targetDocument.createTextNode(css));
10114 targetDocument.head.appendChild(style);
10115 injectedStyles.add(hash);
10116 }
10117 function registerDocument9(targetDocument) {
10118 const runtime = getRuntime9();
10119 runtime.documents.set(
10120 targetDocument,
10121 (runtime.documents.get(targetDocument) ?? 0) + 1
10122 );
10123 for (const [hash, css] of runtime.styles) {
10124 injectStyle9(targetDocument, hash, css);
10125 }
10126 return () => {
10127 const count = runtime.documents.get(targetDocument);
10128 if (count === void 0) {
10129 return;
10130 }
10131 if (count <= 1) {
10132 runtime.documents.delete(targetDocument);
10133 return;
10134 }
10135 runtime.documents.set(targetDocument, count - 1);
10136 };
10137 }
10138 function registerStyle9(hash, css) {
10139 const runtime = getRuntime9();
10140 runtime.styles.set(hash, css);
10141 for (const targetDocument of runtime.documents.keys()) {
10142 injectStyle9(targetDocument, hash, css);
10143 }
10144 }
10145 if (typeof process === "undefined" || true) {
10146 registerStyle9("7b60a246cc", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.a23e08e65c8e62e5__root{text-wrap:balance;align-items:center;color:var(--wpds-color-foreground-content-neutral,#1e1e1e);display:flex;flex-direction:column;font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);gap:var(--wpds-dimension-gap-xs,4px);max-width:var(--wpds-dimension-surface-width-sm,320px);text-align:center}._01303b3680eaa216__visual{align-items:center;color:var(--wpds-color-foreground-content-neutral-weak,#707070);display:flex;justify-content:center;line-height:1;margin-block-end:var(--wpds-dimension-gap-xs,4px)}._58c8e351db225608__icon{background-color:var(--wpds-color-background-surface-neutral-weak,#f4f4f4);border:1px solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);border-radius:50%;padding:var(--wpds-dimension-padding-xs,4px)}.b8b96f70820333a1__title{margin:0}._70f1dd22bad55b18__description{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0}._89ac025fd8e2bc52__actions{align-items:center;display:flex;flex-direction:column;gap:var(--wpds-dimension-gap-xs,4px);margin-block-start:var(--wpds-dimension-gap-md,12px);@media (min-width:480px){flex-direction:row;justify-content:center}}}}');
10147 }
10148 var style_default8 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10149 var DEFAULT_TAG = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("h2", {});
10150 var Title = (0, import_element21.forwardRef)(
10151 function EmptyStateTitle({ render: render4 = DEFAULT_TAG, className, children, ...props }, ref) {
10152 return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
10153 Text,
10154 {
10155 ref,
10156 variant: "heading-lg",
10157 render: render4,
10158 className: clsx_default(style_default8.title, className),
10159 ...props,
10160 children
10161 }
10162 );
10163 }
10164 );
10165
10166 // packages/ui/build-module/empty-state/description.mjs
10167 var import_element22 = __toESM(require_element(), 1);
10168 var import_jsx_runtime47 = __toESM(require_jsx_runtime(), 1);
10169 var STYLE_HASH_ATTRIBUTE10 = "data-wp-hash";
10170 function getRuntime10() {
10171 const globalScope = globalThis;
10172 if (globalScope.__wpStyleRuntime) {
10173 return globalScope.__wpStyleRuntime;
10174 }
10175 globalScope.__wpStyleRuntime = {
10176 documents: /* @__PURE__ */ new Map(),
10177 styles: /* @__PURE__ */ new Map(),
10178 injectedStyles: /* @__PURE__ */ new WeakMap()
10179 };
10180 if (typeof document !== "undefined") {
10181 registerDocument10(document);
10182 }
10183 return globalScope.__wpStyleRuntime;
10184 }
10185 function documentContainsStyleHash10(targetDocument, hash) {
10186 if (!targetDocument.head) {
10187 return false;
10188 }
10189 for (const style of targetDocument.head.querySelectorAll(
10190 `style[${STYLE_HASH_ATTRIBUTE10}]`
10191 )) {
10192 if (style.getAttribute(STYLE_HASH_ATTRIBUTE10) === hash) {
10193 return true;
10194 }
10195 }
10196 return false;
10197 }
10198 function injectStyle10(targetDocument, hash, css) {
10199 if (!targetDocument.head) {
10200 return;
10201 }
10202 const runtime = getRuntime10();
10203 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10204 if (!injectedStyles) {
10205 injectedStyles = /* @__PURE__ */ new Set();
10206 runtime.injectedStyles.set(targetDocument, injectedStyles);
10207 }
10208 if (injectedStyles.has(hash)) {
10209 return;
10210 }
10211 if (documentContainsStyleHash10(targetDocument, hash)) {
10212 injectedStyles.add(hash);
10213 return;
10214 }
10215 const style = targetDocument.createElement("style");
10216 style.setAttribute(STYLE_HASH_ATTRIBUTE10, hash);
10217 style.appendChild(targetDocument.createTextNode(css));
10218 targetDocument.head.appendChild(style);
10219 injectedStyles.add(hash);
10220 }
10221 function registerDocument10(targetDocument) {
10222 const runtime = getRuntime10();
10223 runtime.documents.set(
10224 targetDocument,
10225 (runtime.documents.get(targetDocument) ?? 0) + 1
10226 );
10227 for (const [hash, css] of runtime.styles) {
10228 injectStyle10(targetDocument, hash, css);
10229 }
10230 return () => {
10231 const count = runtime.documents.get(targetDocument);
10232 if (count === void 0) {
10233 return;
10234 }
10235 if (count <= 1) {
10236 runtime.documents.delete(targetDocument);
10237 return;
10238 }
10239 runtime.documents.set(targetDocument, count - 1);
10240 };
10241 }
10242 function registerStyle10(hash, css) {
10243 const runtime = getRuntime10();
10244 runtime.styles.set(hash, css);
10245 for (const targetDocument of runtime.documents.keys()) {
10246 injectStyle10(targetDocument, hash, css);
10247 }
10248 }
10249 if (typeof process === "undefined" || true) {
10250 registerStyle10("7b60a246cc", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.a23e08e65c8e62e5__root{text-wrap:balance;align-items:center;color:var(--wpds-color-foreground-content-neutral,#1e1e1e);display:flex;flex-direction:column;font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);gap:var(--wpds-dimension-gap-xs,4px);max-width:var(--wpds-dimension-surface-width-sm,320px);text-align:center}._01303b3680eaa216__visual{align-items:center;color:var(--wpds-color-foreground-content-neutral-weak,#707070);display:flex;justify-content:center;line-height:1;margin-block-end:var(--wpds-dimension-gap-xs,4px)}._58c8e351db225608__icon{background-color:var(--wpds-color-background-surface-neutral-weak,#f4f4f4);border:1px solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);border-radius:50%;padding:var(--wpds-dimension-padding-xs,4px)}.b8b96f70820333a1__title{margin:0}._70f1dd22bad55b18__description{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0}._89ac025fd8e2bc52__actions{align-items:center;display:flex;flex-direction:column;gap:var(--wpds-dimension-gap-xs,4px);margin-block-start:var(--wpds-dimension-gap-md,12px);@media (min-width:480px){flex-direction:row;justify-content:center}}}}');
10251 }
10252 var style_default9 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10253 var DEFAULT_TAG2 = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", {});
10254 var Description = (0, import_element22.forwardRef)(function EmptyStateDescription({ render: render4 = DEFAULT_TAG2, className, children, ...props }, ref) {
10255 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
10256 Text,
10257 {
10258 ref,
10259 variant: "body-md",
10260 render: render4,
10261 className: clsx_default(style_default9.description, className),
10262 ...props,
10263 children
10264 }
10265 );
10266 });
10267
10268 // packages/ui/build-module/empty-state/actions.mjs
10269 var import_element23 = __toESM(require_element(), 1);
10270 var STYLE_HASH_ATTRIBUTE11 = "data-wp-hash";
10271 function getRuntime11() {
10272 const globalScope = globalThis;
10273 if (globalScope.__wpStyleRuntime) {
10274 return globalScope.__wpStyleRuntime;
10275 }
10276 globalScope.__wpStyleRuntime = {
10277 documents: /* @__PURE__ */ new Map(),
10278 styles: /* @__PURE__ */ new Map(),
10279 injectedStyles: /* @__PURE__ */ new WeakMap()
10280 };
10281 if (typeof document !== "undefined") {
10282 registerDocument11(document);
10283 }
10284 return globalScope.__wpStyleRuntime;
10285 }
10286 function documentContainsStyleHash11(targetDocument, hash) {
10287 if (!targetDocument.head) {
10288 return false;
10289 }
10290 for (const style of targetDocument.head.querySelectorAll(
10291 `style[${STYLE_HASH_ATTRIBUTE11}]`
10292 )) {
10293 if (style.getAttribute(STYLE_HASH_ATTRIBUTE11) === hash) {
10294 return true;
10295 }
10296 }
10297 return false;
10298 }
10299 function injectStyle11(targetDocument, hash, css) {
10300 if (!targetDocument.head) {
10301 return;
10302 }
10303 const runtime = getRuntime11();
10304 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10305 if (!injectedStyles) {
10306 injectedStyles = /* @__PURE__ */ new Set();
10307 runtime.injectedStyles.set(targetDocument, injectedStyles);
10308 }
10309 if (injectedStyles.has(hash)) {
10310 return;
10311 }
10312 if (documentContainsStyleHash11(targetDocument, hash)) {
10313 injectedStyles.add(hash);
10314 return;
10315 }
10316 const style = targetDocument.createElement("style");
10317 style.setAttribute(STYLE_HASH_ATTRIBUTE11, hash);
10318 style.appendChild(targetDocument.createTextNode(css));
10319 targetDocument.head.appendChild(style);
10320 injectedStyles.add(hash);
10321 }
10322 function registerDocument11(targetDocument) {
10323 const runtime = getRuntime11();
10324 runtime.documents.set(
10325 targetDocument,
10326 (runtime.documents.get(targetDocument) ?? 0) + 1
10327 );
10328 for (const [hash, css] of runtime.styles) {
10329 injectStyle11(targetDocument, hash, css);
10330 }
10331 return () => {
10332 const count = runtime.documents.get(targetDocument);
10333 if (count === void 0) {
10334 return;
10335 }
10336 if (count <= 1) {
10337 runtime.documents.delete(targetDocument);
10338 return;
10339 }
10340 runtime.documents.set(targetDocument, count - 1);
10341 };
10342 }
10343 function registerStyle11(hash, css) {
10344 const runtime = getRuntime11();
10345 runtime.styles.set(hash, css);
10346 for (const targetDocument of runtime.documents.keys()) {
10347 injectStyle11(targetDocument, hash, css);
10348 }
10349 }
10350 if (typeof process === "undefined" || true) {
10351 registerStyle11("7b60a246cc", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.a23e08e65c8e62e5__root{text-wrap:balance;align-items:center;color:var(--wpds-color-foreground-content-neutral,#1e1e1e);display:flex;flex-direction:column;font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);gap:var(--wpds-dimension-gap-xs,4px);max-width:var(--wpds-dimension-surface-width-sm,320px);text-align:center}._01303b3680eaa216__visual{align-items:center;color:var(--wpds-color-foreground-content-neutral-weak,#707070);display:flex;justify-content:center;line-height:1;margin-block-end:var(--wpds-dimension-gap-xs,4px)}._58c8e351db225608__icon{background-color:var(--wpds-color-background-surface-neutral-weak,#f4f4f4);border:1px solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);border-radius:50%;padding:var(--wpds-dimension-padding-xs,4px)}.b8b96f70820333a1__title{margin:0}._70f1dd22bad55b18__description{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0}._89ac025fd8e2bc52__actions{align-items:center;display:flex;flex-direction:column;gap:var(--wpds-dimension-gap-xs,4px);margin-block-start:var(--wpds-dimension-gap-md,12px);@media (min-width:480px){flex-direction:row;justify-content:center}}}}');
10352 }
10353 var style_default10 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10354 var Actions = (0, import_element23.forwardRef)(
10355 function EmptyStateActions({ render: render4, ...props }, ref) {
10356 const className = clsx_default(style_default10.actions);
10357 const element = useRender({
10358 defaultTagName: "div",
10359 render: render4,
10360 ref,
10361 props: mergeProps({ className }, props)
10362 });
10363 return element;
10364 }
10365 );
10366
10367 // packages/ui/build-module/visually-hidden/visually-hidden.mjs
10368 var import_element24 = __toESM(require_element(), 1);
10369 var STYLE_HASH_ATTRIBUTE12 = "data-wp-hash";
10370 function getRuntime12() {
10371 const globalScope = globalThis;
10372 if (globalScope.__wpStyleRuntime) {
10373 return globalScope.__wpStyleRuntime;
10374 }
10375 globalScope.__wpStyleRuntime = {
10376 documents: /* @__PURE__ */ new Map(),
10377 styles: /* @__PURE__ */ new Map(),
10378 injectedStyles: /* @__PURE__ */ new WeakMap()
10379 };
10380 if (typeof document !== "undefined") {
10381 registerDocument12(document);
10382 }
10383 return globalScope.__wpStyleRuntime;
10384 }
10385 function documentContainsStyleHash12(targetDocument, hash) {
10386 if (!targetDocument.head) {
10387 return false;
10388 }
10389 for (const style of targetDocument.head.querySelectorAll(
10390 `style[${STYLE_HASH_ATTRIBUTE12}]`
10391 )) {
10392 if (style.getAttribute(STYLE_HASH_ATTRIBUTE12) === hash) {
10393 return true;
10394 }
10395 }
10396 return false;
10397 }
10398 function injectStyle12(targetDocument, hash, css) {
10399 if (!targetDocument.head) {
10400 return;
10401 }
10402 const runtime = getRuntime12();
10403 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10404 if (!injectedStyles) {
10405 injectedStyles = /* @__PURE__ */ new Set();
10406 runtime.injectedStyles.set(targetDocument, injectedStyles);
10407 }
10408 if (injectedStyles.has(hash)) {
10409 return;
10410 }
10411 if (documentContainsStyleHash12(targetDocument, hash)) {
10412 injectedStyles.add(hash);
10413 return;
10414 }
10415 const style = targetDocument.createElement("style");
10416 style.setAttribute(STYLE_HASH_ATTRIBUTE12, hash);
10417 style.appendChild(targetDocument.createTextNode(css));
10418 targetDocument.head.appendChild(style);
10419 injectedStyles.add(hash);
10420 }
10421 function registerDocument12(targetDocument) {
10422 const runtime = getRuntime12();
10423 runtime.documents.set(
10424 targetDocument,
10425 (runtime.documents.get(targetDocument) ?? 0) + 1
10426 );
10427 for (const [hash, css] of runtime.styles) {
10428 injectStyle12(targetDocument, hash, css);
10429 }
10430 return () => {
10431 const count = runtime.documents.get(targetDocument);
10432 if (count === void 0) {
10433 return;
10434 }
10435 if (count <= 1) {
10436 runtime.documents.delete(targetDocument);
10437 return;
10438 }
10439 runtime.documents.set(targetDocument, count - 1);
10440 };
10441 }
10442 function registerStyle12(hash, css) {
10443 const runtime = getRuntime12();
10444 runtime.styles.set(hash, css);
10445 for (const targetDocument of runtime.documents.keys()) {
10446 injectStyle12(targetDocument, hash, css);
10447 }
10448 }
10449 if (typeof process === "undefined" || true) {
10450 registerStyle12("fa606a57ae", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.f37b9e2e191ebd66__visually-hidden{word-wrap:normal;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal}}}");
10451 }
10452 var style_default11 = { "visually-hidden": "f37b9e2e191ebd66__visually-hidden" };
10453 var VisuallyHidden = (0, import_element24.forwardRef)(
10454 function VisuallyHidden2({ render: render4, ...restProps }, ref) {
10455 const element = useRender({
10456 render: render4,
10457 ref,
10458 props: mergeProps(
10459 { className: style_default11["visually-hidden"] },
10460 restProps,
10461 {
10462 // @ts-expect-error Arbitrary data-* attributes aren't indexable on the typed div props. Kept hardcoded so consumers can't change or remove it.
10463 "data-visually-hidden": ""
10464 }
10465 )
10466 });
10467 return element;
10468 }
10469 );
10470
10471 // packages/ui/build-module/link/link.mjs
10472 var import_element25 = __toESM(require_element(), 1);
10473 var import_i18n = __toESM(require_i18n(), 1);
10474 var import_jsx_runtime48 = __toESM(require_jsx_runtime(), 1);
10475 var STYLE_HASH_ATTRIBUTE13 = "data-wp-hash";
10476 function getRuntime13() {
10477 const globalScope = globalThis;
10478 if (globalScope.__wpStyleRuntime) {
10479 return globalScope.__wpStyleRuntime;
10480 }
10481 globalScope.__wpStyleRuntime = {
10482 documents: /* @__PURE__ */ new Map(),
10483 styles: /* @__PURE__ */ new Map(),
10484 injectedStyles: /* @__PURE__ */ new WeakMap()
10485 };
10486 if (typeof document !== "undefined") {
10487 registerDocument13(document);
10488 }
10489 return globalScope.__wpStyleRuntime;
10490 }
10491 function documentContainsStyleHash13(targetDocument, hash) {
10492 if (!targetDocument.head) {
10493 return false;
10494 }
10495 for (const style of targetDocument.head.querySelectorAll(
10496 `style[${STYLE_HASH_ATTRIBUTE13}]`
10497 )) {
10498 if (style.getAttribute(STYLE_HASH_ATTRIBUTE13) === hash) {
10499 return true;
10500 }
10501 }
10502 return false;
10503 }
10504 function injectStyle13(targetDocument, hash, css) {
10505 if (!targetDocument.head) {
10506 return;
10507 }
10508 const runtime = getRuntime13();
10509 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10510 if (!injectedStyles) {
10511 injectedStyles = /* @__PURE__ */ new Set();
10512 runtime.injectedStyles.set(targetDocument, injectedStyles);
10513 }
10514 if (injectedStyles.has(hash)) {
10515 return;
10516 }
10517 if (documentContainsStyleHash13(targetDocument, hash)) {
10518 injectedStyles.add(hash);
10519 return;
10520 }
10521 const style = targetDocument.createElement("style");
10522 style.setAttribute(STYLE_HASH_ATTRIBUTE13, hash);
10523 style.appendChild(targetDocument.createTextNode(css));
10524 targetDocument.head.appendChild(style);
10525 injectedStyles.add(hash);
10526 }
10527 function registerDocument13(targetDocument) {
10528 const runtime = getRuntime13();
10529 runtime.documents.set(
10530 targetDocument,
10531 (runtime.documents.get(targetDocument) ?? 0) + 1
10532 );
10533 for (const [hash, css] of runtime.styles) {
10534 injectStyle13(targetDocument, hash, css);
10535 }
10536 return () => {
10537 const count = runtime.documents.get(targetDocument);
10538 if (count === void 0) {
10539 return;
10540 }
10541 if (count <= 1) {
10542 runtime.documents.delete(targetDocument);
10543 return;
10544 }
10545 runtime.documents.set(targetDocument, count - 1);
10546 };
10547 }
10548 function registerStyle13(hash, css) {
10549 const runtime = getRuntime13();
10550 runtime.styles.set(hash, css);
10551 for (const targetDocument of runtime.documents.keys()) {
10552 injectStyle13(targetDocument, hash, css);
10553 }
10554 }
10555 if (typeof process === "undefined" || true) {
10556 registerStyle13("10f3806643", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._336cd3e4e743482f__box-sizing{box-sizing:border-box;*,:after,:before{box-sizing:inherit}}}}");
10557 }
10558 var resets_default2 = { "box-sizing": "_336cd3e4e743482f__box-sizing" };
10559 if (typeof process === "undefined" || true) {
10560 registerStyle13("5f8e7aa0bc", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._08e8a2e44959f892__outset-ring--focus:focus,._970d04df7376df67__outset-ring--focus-within-except-active:focus-within:not(:has(:active)),.c5cb3ee4bddaa8e4__outset-ring--focus-within-visible:focus-within:has(:focus-visible),.cd83dfc2126a0846__outset-ring--focus-within:focus-within,.d0541bc9dd9dc7b6__outset-ring--focus-visible:focus-visible,.e25b2bdd7aa21721__outset-ring--focus-except-active:focus:not(:active),:focus-visible .ecadb9e080e2dfa5__outset-ring--focus-parent-visible{--_gcd-a-outline:var(--wpds-border-width-focus,var(--wp-admin-border-width-focus,2px)) solid var(--wpds-color-stroke-focus,var(--wp-admin-theme-color,#3858e9));--_gcd-div-outline:var(--wpds-border-width-focus,var(--wp-admin-border-width-focus,2px)) solid var(--wpds-color-stroke-focus,var(--wp-admin-theme-color,#3858e9));outline:var(--wpds-border-width-focus,var(--wp-admin-border-width-focus,2px)) solid var(--wpds-color-stroke-focus,var(--wp-admin-theme-color,#3858e9));outline-offset:var(--wpds-border-width-focus,var(--wp-admin-border-width-focus,2px))}}}");
10561 }
10562 var focus_default = { "outset-ring--focus": "_08e8a2e44959f892__outset-ring--focus", "outset-ring--focus-except-active": "e25b2bdd7aa21721__outset-ring--focus-except-active", "outset-ring--focus-visible": "d0541bc9dd9dc7b6__outset-ring--focus-visible", "outset-ring--focus-within": "cd83dfc2126a0846__outset-ring--focus-within", "outset-ring--focus-within-except-active": "_970d04df7376df67__outset-ring--focus-within-except-active", "outset-ring--focus-within-visible": "c5cb3ee4bddaa8e4__outset-ring--focus-within-visible", "outset-ring--focus-parent-visible": "ecadb9e080e2dfa5__outset-ring--focus-parent-visible" };
10563 if (typeof process === "undefined" || true) {
10564 registerStyle13("e8e6a9be37", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.d4250949359b05ce__link{text-decoration-thickness:from-font;text-underline-offset:.2em}.c6055659b8e2cd2c__is-brand,.c6055659b8e2cd2c__is-brand:visited{--_gcd-a-color:var(--wpds-color-foreground-interactive-brand,var(--wp-admin-theme-color,#3858e9));color:var(--wpds-color-foreground-interactive-brand,var(--wp-admin-theme-color,#3858e9))}.c6055659b8e2cd2c__is-brand:active,.c6055659b8e2cd2c__is-brand:hover{--_gcd-a-color:var(--wpds-color-foreground-interactive-brand-active,color-mix(in oklch,var(--wp-admin-theme-color,#3858e9) 52%,#000));color:var(--wpds-color-foreground-interactive-brand-active,color-mix(in oklch,var(--wp-admin-theme-color,#3858e9) 52%,#000))}._92e0dfcaeee15b88__is-neutral,._92e0dfcaeee15b88__is-neutral:visited{--_gcd-a-color:var(--wpds-color-foreground-interactive-neutral,#1e1e1e);color:var(--wpds-color-foreground-interactive-neutral,#1e1e1e);text-decoration-color:var(--wpds-color-stroke-interactive-neutral,#8d8d8d)}._92e0dfcaeee15b88__is-neutral:active,._92e0dfcaeee15b88__is-neutral:hover{--_gcd-a-color:var(--wpds-color-foreground-interactive-neutral-active,#1e1e1e);color:var(--wpds-color-foreground-interactive-neutral-active,#1e1e1e)}.cf122a9bf1035d42__is-unstyled{--_gcd-a-color:inherit;color:inherit;text-decoration:none}._0cb411afac4c86c7__link-icon{display:inline-block;font-weight:var(--wpds-typography-font-weight-default,400);line-height:1;margin-inline-start:var(--wpds-dimension-padding-xs,4px);text-decoration:none}._0cb411afac4c86c7__link-icon:after{content:"\\2197"}._0cb411afac4c86c7__link-icon:dir(rtl):after{content:"\\2196"}}}');
10565 }
10566 var style_default12 = { "link": "d4250949359b05ce__link", "is-brand": "c6055659b8e2cd2c__is-brand", "is-neutral": "_92e0dfcaeee15b88__is-neutral", "is-unstyled": "cf122a9bf1035d42__is-unstyled", "link-icon": "_0cb411afac4c86c7__link-icon" };
10567 if (typeof process === "undefined" || true) {
10568 registerStyle13("af6d9984a6", "._6defc79820e382c6__button{box-sizing:var(--_gcd-button-box-sizing,border-box);font-family:var(--_gcd-button-font-family,inherit);font-size:var(--_gcd-button-font-size,inherit);font-weight:var(--_gcd-button-font-weight,inherit)}.d2cff2e5dea83bd1__input{box-sizing:var(--_gcd-input-box-sizing,border-box);font-family:var(--_gcd-input-font-family,inherit);font-size:var(--_gcd-input-font-size,inherit);font-weight:var(--_gcd-input-font-weight,inherit);margin:var(--_gcd-input-margin,0);&:is(textarea,[type=text],[type=password],[type=color],[type=date],[type=datetime],[type=datetime-local],[type=email],[type=month],[type=number],[type=search],[type=tel],[type=time],[type=url],[type=week]){background-color:var(--_gcd-input-background-color,transparent);border:var(--_gcd-input-border,none);border-radius:var(--_gcd-input-border-radius,0);box-shadow:var(--_gcd-input-box-shadow,0 0 0 transparent);color:var(--_gcd-input-color,var(--wpds-color-foreground-interactive-neutral,#1e1e1e));&:focus{border-color:var(--_gcd-input-border-color-focus,var(--wp-admin-theme-color));box-shadow:var(--_gcd-input-box-shadow-focus,none);outline:var(--_gcd-input-outline-focus,none)}&:disabled{background:var(--_gcd-input-background-disabled,transparent);border-color:var(--_gcd-input-border-color-disabled,transparent);box-shadow:var(--_gcd-input-box-shadow-disabled,none);color:var(--_gcd-input-color-disabled,var(--wpds-color-foreground-interactive-neutral-disabled,#8d8d8d))}&::placeholder{color:var(--_gcd-input-placeholder-color,var(--wpds-color-foreground-interactive-neutral-disabled,#8d8d8d))}}&:is(textarea,[type=text],[type=password],[type=date],[type=datetime],[type=datetime-local],[type=email],[type=month],[type=number],[type=search],[type=tel],[type=time],[type=url],[type=week]){line-height:var(--_gcd-input-line-height,inherit);min-height:var(--_gcd-input-min-height,auto);padding:var(--_gcd-input-padding,0)}}._547d86373d02e108__textarea{box-sizing:var(--_gcd-textarea-box-sizing,border-box);overflow:var(--_gcd-textarea-overflow,auto);resize:var(--_gcd-textarea-resize,block)}._8c15fd0ed9f28ba4__div{outline:var(--_gcd-div-outline,0 solid transparent)}p._43cec3e1eec1066d__p{font-size:var(--_gcd-p-font-size,13px);line-height:var(--_gcd-p-line-height,1.5);margin:var(--_gcd-p-margin,0)}:is(h1,h2,h3,h4,h5,h6).e97669c6d9a38497__heading{color:var(--_gcd-heading-color,var(--wpds-color-foreground-content-neutral,#1e1e1e));font-size:var(--_gcd-heading-font-size,inherit);font-weight:var(--_gcd-heading-font-weight,var(--wpds-typography-font-weight-emphasis,600));margin:var(--_gcd-heading-margin,0)}._2c0831b0499dbd6e__a,._2c0831b0499dbd6e__a:is(:hover,:focus,:active){border-radius:var(--_gcd-a-border-radius,0);box-shadow:var(--_gcd-a-box-shadow,none);color:var(--_gcd-a-color,inherit);outline:var(--_gcd-a-outline,0 solid transparent);transition:var(--_gcd-a-transition,none)}");
10569 }
10570 var global_css_defense_default2 = { "button": "_6defc79820e382c6__button", "input": "d2cff2e5dea83bd1__input", "textarea": "_547d86373d02e108__textarea", "div": "_8c15fd0ed9f28ba4__div", "p": "_43cec3e1eec1066d__p", "heading": "e97669c6d9a38497__heading", "a": "_2c0831b0499dbd6e__a" };
10571 var Link = (0, import_element25.forwardRef)(function Link2({
10572 children,
10573 variant = "default",
10574 tone = "brand",
10575 openInNewTab = false,
10576 render: render4,
10577 className,
10578 ...props
10579 }, ref) {
10580 const element = useRender({
10581 render: render4,
10582 defaultTagName: "a",
10583 ref,
10584 props: mergeProps(props, {
10585 className: clsx_default(
10586 global_css_defense_default2.a,
10587 resets_default2["box-sizing"],
10588 focus_default["outset-ring--focus-except-active"],
10589 variant !== "unstyled" && style_default12.link,
10590 variant !== "unstyled" && style_default12[`is-${tone}`],
10591 variant === "unstyled" && style_default12["is-unstyled"],
10592 className
10593 ),
10594 target: openInNewTab ? "_blank" : void 0,
10595 children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [
10596 children,
10597 openInNewTab && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10598 "span",
10599 {
10600 className: style_default12["link-icon"],
10601 role: "img",
10602 "aria-label": (
10603 /* translators: accessibility text appended to link text */
10604 (0, import_i18n.__)("(opens in a new tab)")
10605 )
10606 }
10607 )
10608 ] })
10609 })
10610 });
10611 return element;
10612 });
10613
10614 // packages/dataviews/build-module/dataviews/index.mjs
10615 var import_element85 = __toESM(require_element(), 1);
10616 var import_compose14 = __toESM(require_compose(), 1);
10617
10618 // packages/dataviews/build-module/components/dataviews-context/index.mjs
10619 var import_element26 = __toESM(require_element(), 1);
10620
10621 // packages/dataviews/build-module/constants.mjs
10622 var import_i18n2 = __toESM(require_i18n(), 1);
10623 var OPERATOR_IS_ANY = "isAny";
10624 var OPERATOR_IS_NONE = "isNone";
10625 var OPERATOR_IS_ALL = "isAll";
10626 var OPERATOR_IS_NOT_ALL = "isNotAll";
10627 var OPERATOR_BETWEEN = "between";
10628 var OPERATOR_IN_THE_PAST = "inThePast";
10629 var OPERATOR_OVER = "over";
10630 var OPERATOR_IS = "is";
10631 var OPERATOR_IS_NOT = "isNot";
10632 var OPERATOR_LESS_THAN = "lessThan";
10633 var OPERATOR_GREATER_THAN = "greaterThan";
10634 var OPERATOR_LESS_THAN_OR_EQUAL = "lessThanOrEqual";
10635 var OPERATOR_GREATER_THAN_OR_EQUAL = "greaterThanOrEqual";
10636 var OPERATOR_BEFORE = "before";
10637 var OPERATOR_AFTER = "after";
10638 var OPERATOR_BEFORE_INC = "beforeInc";
10639 var OPERATOR_AFTER_INC = "afterInc";
10640 var OPERATOR_CONTAINS = "contains";
10641 var OPERATOR_NOT_CONTAINS = "notContains";
10642 var OPERATOR_STARTS_WITH = "startsWith";
10643 var OPERATOR_ON = "on";
10644 var OPERATOR_NOT_ON = "notOn";
10645 var SORTING_DIRECTIONS = ["asc", "desc"];
10646 var sortArrows = { asc: "\u2191", desc: "\u2193" };
10647 var sortValues = { asc: "ascending", desc: "descending" };
10648 var sortLabels = {
10649 asc: (0, import_i18n2.__)("Sort ascending"),
10650 desc: (0, import_i18n2.__)("Sort descending")
10651 };
10652 var sortIcons = {
10653 asc: arrow_up_default,
10654 desc: arrow_down_default
10655 };
10656 var LAYOUT_TABLE = "table";
10657 var LAYOUT_GRID = "grid";
10658 var LAYOUT_LIST = "list";
10659 var LAYOUT_ACTIVITY = "activity";
10660 var LAYOUT_PICKER_GRID = "pickerGrid";
10661 var LAYOUT_PICKER_TABLE = "pickerTable";
10662 var LAYOUT_PICKER_ACTIVITY = "pickerActivity";
10663
10664 // packages/dataviews/build-module/components/dataviews-context/index.mjs
10665 var DataViewsContext = (0, import_element26.createContext)({
10666 view: { type: LAYOUT_TABLE },
10667 onChangeView: () => {
10668 },
10669 fields: [],
10670 data: [],
10671 paginationInfo: {
10672 totalItems: 0,
10673 totalPages: 0
10674 },
10675 selection: [],
10676 onChangeSelection: () => {
10677 },
10678 setOpenedFilter: () => {
10679 },
10680 openedFilter: null,
10681 getItemId: (item) => item.id,
10682 isItemClickable: () => true,
10683 renderItemLink: void 0,
10684 containerWidth: 0,
10685 containerRef: (0, import_element26.createRef)(),
10686 resizeObserverRef: () => {
10687 },
10688 defaultLayouts: { list: {}, grid: {}, table: {} },
10689 filters: [],
10690 isShowingFilter: false,
10691 setIsShowingFilter: () => {
10692 },
10693 hasInitiallyLoaded: false,
10694 config: {
10695 perPageSizes: []
10696 },
10697 intersectionObserver: null
10698 });
10699 DataViewsContext.displayName = "DataViewsContext";
10700 var dataviews_context_default = DataViewsContext;
10701
10702 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
10703 var import_i18n23 = __toESM(require_i18n(), 1);
10704
10705 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
10706 var import_i18n10 = __toESM(require_i18n(), 1);
10707 var import_components6 = __toESM(require_components(), 1);
10708 var import_element35 = __toESM(require_element(), 1);
10709 var import_keycodes2 = __toESM(require_keycodes(), 1);
10710
10711 // packages/dataviews/build-module/components/dataviews-selection-checkbox/index.mjs
10712 var import_components = __toESM(require_components(), 1);
10713 var import_i18n3 = __toESM(require_i18n(), 1);
10714 var import_jsx_runtime49 = __toESM(require_jsx_runtime(), 1);
10715 var SELECTION_CHECKBOX_CLASS = "dataviews-selection-checkbox";
10716 function DataViewsSelectionCheckbox({
10717 selection,
10718 onChangeSelection,
10719 item,
10720 getItemId,
10721 titleField,
10722 disabled: disabled2,
10723 ...extraProps
10724 }) {
10725 const id = getItemId(item);
10726 const isInSelectionArray = selection.includes(id);
10727 const checked = !disabled2 && isInSelectionArray;
10728 const selectionLabel = titleField?.getValue?.({ item }) || (0, import_i18n3.__)("(no title)");
10729 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
10730 import_components.CheckboxControl,
10731 {
10732 className: SELECTION_CHECKBOX_CLASS,
10733 "aria-label": selectionLabel,
10734 "aria-disabled": disabled2,
10735 checked,
10736 onChange: () => {
10737 if (disabled2) {
10738 return;
10739 }
10740 onChangeSelection(
10741 isInSelectionArray ? selection.filter((itemId) => id !== itemId) : [...selection, id]
10742 );
10743 },
10744 ...extraProps
10745 }
10746 );
10747 }
10748
10749 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
10750 var import_components2 = __toESM(require_components(), 1);
10751 var import_i18n4 = __toESM(require_i18n(), 1);
10752 var import_element27 = __toESM(require_element(), 1);
10753 var import_data = __toESM(require_data(), 1);
10754 var import_compose = __toESM(require_compose(), 1);
10755
10756 // packages/dataviews/build-module/lock-unlock.mjs
10757 var import_private_apis2 = __toESM(require_private_apis(), 1);
10758 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
10759 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
10760 "@wordpress/dataviews"
10761 );
10762
10763 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
10764 var import_jsx_runtime50 = __toESM(require_jsx_runtime(), 1);
10765 var { Menu, kebabCase } = unlock2(import_components2.privateApis);
10766 function ButtonTrigger({
10767 action,
10768 onClick,
10769 items,
10770 variant
10771 }) {
10772 const label = typeof action.label === "string" ? action.label : action.label(items);
10773 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10774 import_components2.Button,
10775 {
10776 disabled: !!action.disabled,
10777 accessibleWhenDisabled: true,
10778 size: "compact",
10779 variant,
10780 onClick,
10781 children: label
10782 }
10783 );
10784 }
10785 function MenuItemTrigger({
10786 action,
10787 onClick,
10788 items
10789 }) {
10790 const label = typeof action.label === "string" ? action.label : action.label(items);
10791 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu.Item, { disabled: action.disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu.ItemLabel, { children: label }) });
10792 }
10793 function ActionModal({
10794 action,
10795 items,
10796 closeModal
10797 }) {
10798 const label = typeof action.label === "string" ? action.label : action.label(items);
10799 const modalHeader = typeof action.modalHeader === "function" ? action.modalHeader(items) : action.modalHeader;
10800 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10801 import_components2.Modal,
10802 {
10803 title: modalHeader || label,
10804 __experimentalHideHeader: !!action.hideModalHeader,
10805 onRequestClose: closeModal,
10806 focusOnMount: action.modalFocusOnMount ?? true,
10807 size: action.modalSize || "medium",
10808 overlayClassName: `dataviews-action-modal dataviews-action-modal__${kebabCase(
10809 action.id
10810 )}`,
10811 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(action.RenderModal, { items, closeModal })
10812 }
10813 );
10814 }
10815 function ActionsMenuGroup({
10816 actions,
10817 item,
10818 registry,
10819 setActiveModalAction
10820 }) {
10821 const { primaryActions, regularActions } = (0, import_element27.useMemo)(() => {
10822 return actions.reduce(
10823 (acc, action) => {
10824 (action.isPrimary ? acc.primaryActions : acc.regularActions).push(action);
10825 return acc;
10826 },
10827 {
10828 primaryActions: [],
10829 regularActions: []
10830 }
10831 );
10832 }, [actions]);
10833 const renderActionGroup = (actionList) => actionList.map((action) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10834 MenuItemTrigger,
10835 {
10836 action,
10837 onClick: () => {
10838 if ("RenderModal" in action) {
10839 setActiveModalAction(action);
10840 return;
10841 }
10842 action.callback([item], { registry });
10843 },
10844 items: [item]
10845 },
10846 action.id
10847 ));
10848 return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Menu.Group, { children: [
10849 renderActionGroup(primaryActions),
10850 renderActionGroup(regularActions)
10851 ] });
10852 }
10853 function ItemActions({
10854 item,
10855 actions,
10856 isCompact
10857 }) {
10858 const registry = (0, import_data.useRegistry)();
10859 const { primaryActions, eligibleActions } = (0, import_element27.useMemo)(() => {
10860 const _eligibleActions = actions.filter(
10861 (action) => !action.isEligible || action.isEligible(item)
10862 );
10863 const _primaryActions = _eligibleActions.filter(
10864 (action) => action.isPrimary
10865 );
10866 return {
10867 primaryActions: _primaryActions,
10868 eligibleActions: _eligibleActions
10869 };
10870 }, [actions, item]);
10871 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
10872 if (isCompact) {
10873 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10874 CompactItemActions,
10875 {
10876 item,
10877 actions: eligibleActions,
10878 isSmall: true,
10879 registry
10880 }
10881 );
10882 }
10883 return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
10884 Stack,
10885 {
10886 direction: "row",
10887 justify: "flex-end",
10888 className: "dataviews-item-actions",
10889 style: {
10890 flexShrink: 0,
10891 width: "auto"
10892 },
10893 children: [
10894 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10895 PrimaryActions,
10896 {
10897 item,
10898 actions: primaryActions,
10899 registry
10900 }
10901 ),
10902 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
10903 // there if there are any actions at all.
10904 isMobileViewport) && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10905 CompactItemActions,
10906 {
10907 item,
10908 actions: eligibleActions,
10909 registry
10910 }
10911 )
10912 ]
10913 }
10914 );
10915 }
10916 function CompactItemActions({
10917 item,
10918 actions,
10919 isSmall,
10920 registry
10921 }) {
10922 const [activeModalAction, setActiveModalAction] = (0, import_element27.useState)(
10923 null
10924 );
10925 return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_jsx_runtime50.Fragment, { children: [
10926 /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Menu, { placement: "bottom-end", children: [
10927 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10928 Menu.TriggerButton,
10929 {
10930 render: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10931 import_components2.Button,
10932 {
10933 size: isSmall ? "small" : "compact",
10934 icon: more_vertical_default,
10935 label: (0, import_i18n4.__)("Actions"),
10936 accessibleWhenDisabled: true,
10937 disabled: !actions.length,
10938 className: "dataviews-all-actions-button"
10939 }
10940 )
10941 }
10942 ),
10943 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10944 ActionsMenuGroup,
10945 {
10946 actions,
10947 item,
10948 registry,
10949 setActiveModalAction
10950 }
10951 ) })
10952 ] }),
10953 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10954 ActionModal,
10955 {
10956 action: activeModalAction,
10957 items: [item],
10958 closeModal: () => setActiveModalAction(null)
10959 }
10960 )
10961 ] });
10962 }
10963 function PrimaryActions({
10964 item,
10965 actions,
10966 registry,
10967 buttonVariant
10968 }) {
10969 const [activeModalAction, setActiveModalAction] = (0, import_element27.useState)(null);
10970 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
10971 if (isMobileViewport) {
10972 return null;
10973 }
10974 if (!Array.isArray(actions) || actions.length === 0) {
10975 return null;
10976 }
10977 return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_jsx_runtime50.Fragment, { children: [
10978 actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10979 ButtonTrigger,
10980 {
10981 action,
10982 onClick: () => {
10983 if ("RenderModal" in action) {
10984 setActiveModalAction(action);
10985 return;
10986 }
10987 action.callback([item], { registry });
10988 },
10989 items: [item],
10990 variant: buttonVariant
10991 },
10992 action.id
10993 )),
10994 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
10995 ActionModal,
10996 {
10997 action: activeModalAction,
10998 items: [item],
10999 closeModal: () => setActiveModalAction(null)
11000 }
11001 )
11002 ] });
11003 }
11004
11005 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
11006 var import_components3 = __toESM(require_components(), 1);
11007 var import_i18n6 = __toESM(require_i18n(), 1);
11008 var import_element28 = __toESM(require_element(), 1);
11009 var import_data2 = __toESM(require_data(), 1);
11010 var import_compose2 = __toESM(require_compose(), 1);
11011
11012 // packages/dataviews/build-module/utils/get-footer-message.mjs
11013 var import_i18n5 = __toESM(require_i18n(), 1);
11014 function getFooterMessage(selectionCount, itemsCount, totalItems, onlyTotalCount = false) {
11015 if (selectionCount > 0) {
11016 return (0, import_i18n5.sprintf)(
11017 /* translators: %d: number of items. */
11018 (0, import_i18n5._n)("%d Item selected", "%d Items selected", selectionCount),
11019 selectionCount
11020 );
11021 }
11022 if (onlyTotalCount || totalItems <= itemsCount) {
11023 return (0, import_i18n5.sprintf)(
11024 /* translators: %d: number of items. */
11025 (0, import_i18n5._n)("%d Item", "%d Items", totalItems),
11026 totalItems
11027 );
11028 }
11029 return (0, import_i18n5.sprintf)(
11030 /* translators: %1$d: number of items. %2$d: total number of items. */
11031 (0, import_i18n5._n)("%1$d of %2$d Item", "%1$d of %2$d Items", totalItems),
11032 itemsCount,
11033 totalItems
11034 );
11035 }
11036
11037 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
11038 var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1);
11039 function ActionWithModal({
11040 action,
11041 items,
11042 ActionTriggerComponent
11043 }) {
11044 const [isModalOpen, setIsModalOpen] = (0, import_element28.useState)(false);
11045 const actionTriggerProps = {
11046 action,
11047 onClick: () => {
11048 setIsModalOpen(true);
11049 },
11050 items
11051 };
11052 return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { children: [
11053 /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ActionTriggerComponent, { ...actionTriggerProps }),
11054 isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11055 ActionModal,
11056 {
11057 action,
11058 items,
11059 closeModal: () => setIsModalOpen(false)
11060 }
11061 )
11062 ] });
11063 }
11064 function hasAPossibleBulkAction(actions, item) {
11065 return actions.some(
11066 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item))
11067 );
11068 }
11069 function useHasAPossibleBulkAction(actions, item) {
11070 return (0, import_element28.useMemo)(
11071 () => hasAPossibleBulkAction(actions, item),
11072 [actions, item]
11073 );
11074 }
11075 function useSomeItemHasAPossibleBulkAction(actions, data) {
11076 return (0, import_element28.useMemo)(
11077 () => data.some((item) => hasAPossibleBulkAction(actions, item)),
11078 [actions, data]
11079 );
11080 }
11081 function BulkSelectionCheckbox({
11082 selection,
11083 onChangeSelection,
11084 data,
11085 actions,
11086 getItemId,
11087 disableSelectAll = false
11088 }) {
11089 const selectableItems = (0, import_element28.useMemo)(() => {
11090 return data.filter((item) => {
11091 return actions.some(
11092 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item))
11093 );
11094 });
11095 }, [data, actions]);
11096 const selectedItems = data.filter(
11097 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
11098 );
11099 const hasSelection = selection.length > 0;
11100 const areAllSelected = selectedItems.length === selectableItems.length;
11101 if (disableSelectAll) {
11102 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11103 import_components3.CheckboxControl,
11104 {
11105 className: "dataviews-view-table-selection-checkbox",
11106 checked: hasSelection,
11107 disabled: !hasSelection,
11108 onChange: () => {
11109 onChangeSelection([]);
11110 },
11111 "aria-label": (0, import_i18n6.__)("Deselect all")
11112 }
11113 );
11114 }
11115 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11116 import_components3.CheckboxControl,
11117 {
11118 className: "dataviews-view-table-selection-checkbox",
11119 checked: areAllSelected,
11120 indeterminate: !areAllSelected && !!selectedItems.length,
11121 onChange: () => {
11122 if (areAllSelected) {
11123 onChangeSelection([]);
11124 } else {
11125 onChangeSelection(
11126 selectableItems.map((item) => getItemId(item))
11127 );
11128 }
11129 },
11130 "aria-label": areAllSelected ? (0, import_i18n6.__)("Deselect all") : (0, import_i18n6.__)("Select all")
11131 }
11132 );
11133 }
11134 function ActionTrigger({
11135 action,
11136 onClick,
11137 isBusy,
11138 items
11139 }) {
11140 const label = typeof action.label === "string" ? action.label : action.label(items);
11141 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
11142 if (isMobile) {
11143 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11144 import_components3.Button,
11145 {
11146 disabled: isBusy,
11147 accessibleWhenDisabled: true,
11148 label,
11149 icon: action.icon,
11150 size: "compact",
11151 onClick,
11152 isBusy
11153 }
11154 );
11155 }
11156 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11157 import_components3.Button,
11158 {
11159 disabled: isBusy,
11160 accessibleWhenDisabled: true,
11161 size: "compact",
11162 onClick,
11163 isBusy,
11164 children: label
11165 }
11166 );
11167 }
11168 var EMPTY_ARRAY2 = [];
11169 function ActionButton({
11170 action,
11171 selectedItems,
11172 actionInProgress,
11173 setActionInProgress
11174 }) {
11175 const registry = (0, import_data2.useRegistry)();
11176 const selectedEligibleItems = (0, import_element28.useMemo)(() => {
11177 return selectedItems.filter((item) => {
11178 return !action.isEligible || action.isEligible(item);
11179 });
11180 }, [action, selectedItems]);
11181 if ("RenderModal" in action) {
11182 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11183 ActionWithModal,
11184 {
11185 action,
11186 items: selectedEligibleItems,
11187 ActionTriggerComponent: ActionTrigger
11188 },
11189 action.id
11190 );
11191 }
11192 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11193 ActionTrigger,
11194 {
11195 action,
11196 onClick: async () => {
11197 setActionInProgress(action.id);
11198 await action.callback(selectedItems, {
11199 registry
11200 });
11201 setActionInProgress(null);
11202 },
11203 items: selectedEligibleItems,
11204 isBusy: actionInProgress === action.id
11205 },
11206 action.id
11207 );
11208 }
11209 function renderFooterContent(data, actions, getItemId, isInfiniteScroll, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection, paginationInfo) {
11210 const message2 = getFooterMessage(
11211 selection.length,
11212 data.length,
11213 paginationInfo.totalItems,
11214 isInfiniteScroll
11215 );
11216 return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
11217 Stack,
11218 {
11219 direction: "row",
11220 className: "dataviews-bulk-actions-footer__container",
11221 gap: "md",
11222 align: "center",
11223 children: [
11224 /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11225 BulkSelectionCheckbox,
11226 {
11227 selection,
11228 onChangeSelection,
11229 data,
11230 actions,
11231 getItemId,
11232 disableSelectAll: isInfiniteScroll
11233 }
11234 ),
11235 /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "dataviews-bulk-actions-footer__item-count", children: message2 }),
11236 /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
11237 Stack,
11238 {
11239 direction: "row",
11240 className: "dataviews-bulk-actions-footer__action-buttons",
11241 gap: "xs",
11242 children: [
11243 actionsToShow.map((action) => {
11244 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11245 ActionButton,
11246 {
11247 action,
11248 selectedItems,
11249 actionInProgress,
11250 setActionInProgress
11251 },
11252 action.id
11253 );
11254 }),
11255 selectedItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11256 import_components3.Button,
11257 {
11258 icon: close_small_default,
11259 showTooltip: true,
11260 tooltipPosition: "top",
11261 size: "compact",
11262 label: (0, import_i18n6.__)("Cancel"),
11263 disabled: !!actionInProgress,
11264 accessibleWhenDisabled: false,
11265 onClick: () => {
11266 onChangeSelection(EMPTY_ARRAY2);
11267 }
11268 }
11269 )
11270 ]
11271 }
11272 )
11273 ]
11274 }
11275 );
11276 }
11277 function FooterContent({
11278 selection,
11279 actions,
11280 onChangeSelection,
11281 data,
11282 getItemId,
11283 isInfiniteScroll,
11284 paginationInfo
11285 }) {
11286 const [actionInProgress, setActionInProgress] = (0, import_element28.useState)(
11287 null
11288 );
11289 const footerContentRef = (0, import_element28.useRef)(void 0);
11290 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
11291 const bulkActions = (0, import_element28.useMemo)(
11292 () => actions.filter((action) => action.supportsBulk),
11293 [actions]
11294 );
11295 const selectableItems = (0, import_element28.useMemo)(() => {
11296 return data.filter((item) => {
11297 return bulkActions.some(
11298 (action) => !action.isEligible || action.isEligible(item)
11299 );
11300 });
11301 }, [data, bulkActions]);
11302 const selectedItems = (0, import_element28.useMemo)(() => {
11303 return data.filter(
11304 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
11305 );
11306 }, [selection, data, getItemId, selectableItems]);
11307 const actionsToShow = (0, import_element28.useMemo)(
11308 () => actions.filter((action) => {
11309 return action.supportsBulk && (!isMobile || action.icon) && selectedItems.some(
11310 (item) => !action.isEligible || action.isEligible(item)
11311 );
11312 }),
11313 [actions, selectedItems, isMobile]
11314 );
11315 if (!actionInProgress) {
11316 if (footerContentRef.current) {
11317 footerContentRef.current = void 0;
11318 }
11319 return renderFooterContent(
11320 data,
11321 actions,
11322 getItemId,
11323 isInfiniteScroll,
11324 selection,
11325 actionsToShow,
11326 selectedItems,
11327 actionInProgress,
11328 setActionInProgress,
11329 onChangeSelection,
11330 paginationInfo
11331 );
11332 } else if (!footerContentRef.current) {
11333 footerContentRef.current = renderFooterContent(
11334 data,
11335 actions,
11336 getItemId,
11337 isInfiniteScroll,
11338 selection,
11339 actionsToShow,
11340 selectedItems,
11341 actionInProgress,
11342 setActionInProgress,
11343 onChangeSelection,
11344 paginationInfo
11345 );
11346 }
11347 return footerContentRef.current;
11348 }
11349 function BulkActionsFooter() {
11350 const {
11351 data,
11352 selection,
11353 actions = EMPTY_ARRAY2,
11354 onChangeSelection,
11355 getItemId,
11356 paginationInfo,
11357 view
11358 } = (0, import_element28.useContext)(dataviews_context_default);
11359 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
11360 FooterContent,
11361 {
11362 selection,
11363 onChangeSelection,
11364 data,
11365 actions,
11366 getItemId,
11367 isInfiniteScroll: !!view.infiniteScrollEnabled,
11368 paginationInfo
11369 }
11370 );
11371 }
11372
11373 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
11374 var import_i18n7 = __toESM(require_i18n(), 1);
11375 var import_components4 = __toESM(require_components(), 1);
11376 var import_element29 = __toESM(require_element(), 1);
11377
11378 // packages/dataviews/build-module/utils/get-hideable-fields.mjs
11379 function getHideableFields(view, fields) {
11380 const togglableFields = [
11381 view?.titleField,
11382 view?.mediaField,
11383 view?.descriptionField
11384 ].filter(Boolean);
11385 return fields.filter(
11386 (f2) => !togglableFields.includes(f2.id) && f2.type !== "media" && f2.enableHiding !== false
11387 );
11388 }
11389
11390 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
11391 var import_jsx_runtime52 = __toESM(require_jsx_runtime(), 1);
11392 var { Menu: Menu2 } = unlock2(import_components4.privateApis);
11393 function WithMenuSeparators({ children }) {
11394 return import_element29.Children.toArray(children).filter(Boolean).map((child, i2) => /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_element29.Fragment, { children: [
11395 i2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.Separator, {}),
11396 child
11397 ] }, i2));
11398 }
11399 var _HeaderMenu = (0, import_element29.forwardRef)(function HeaderMenu({
11400 fieldId,
11401 view,
11402 fields,
11403 onChangeView,
11404 onHide,
11405 setOpenedFilter,
11406 canMove = true,
11407 canInsertLeft = true,
11408 canInsertRight = true
11409 }, ref) {
11410 const visibleFieldIds = view.fields ?? [];
11411 const index2 = visibleFieldIds?.indexOf(fieldId);
11412 const isSorted = view.sort?.field === fieldId;
11413 let isHidable = false;
11414 let isSortable = false;
11415 let canAddFilter = false;
11416 let operators = [];
11417 const field = fields.find((f2) => f2.id === fieldId);
11418 const { setIsShowingFilter } = (0, import_element29.useContext)(dataviews_context_default);
11419 if (!field) {
11420 return null;
11421 }
11422 isHidable = field.enableHiding !== false;
11423 isSortable = field.enableSorting !== false;
11424 const header = field.header;
11425 operators = !!field.filterBy && field.filterBy?.operators || [];
11426 canAddFilter = !view.filters?.some((_filter) => fieldId === _filter.field) && !!(field.hasElements || field.Edit) && field.filterBy !== false && !field.filterBy?.isPrimary;
11427 if (!isSortable && !canMove && !isHidable && !canAddFilter) {
11428 return header;
11429 }
11430 const hiddenFields = getHideableFields(view, fields).filter(
11431 (f2) => !visibleFieldIds.includes(f2.id)
11432 );
11433 const canInsert = (canInsertLeft || canInsertRight) && !!hiddenFields.length;
11434 const isRtl = (0, import_i18n7.isRTL)();
11435 return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(Menu2, { children: [
11436 /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
11437 Menu2.TriggerButton,
11438 {
11439 render: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11440 import_components4.Button,
11441 {
11442 size: "compact",
11443 className: "dataviews-view-table-header-button",
11444 ref,
11445 variant: "tertiary"
11446 }
11447 ),
11448 children: [
11449 header,
11450 view.sort && isSorted && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { "aria-hidden": "true", children: sortArrows[view.sort.direction] })
11451 ]
11452 }
11453 ),
11454 /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.Popover, { style: { minWidth: "240px" }, children: /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(WithMenuSeparators, { children: [
11455 isSortable && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.Group, { children: SORTING_DIRECTIONS.map(
11456 (direction) => {
11457 const isChecked = view.sort && isSorted && view.sort.direction === direction;
11458 const value = `${fieldId}-${direction}`;
11459 return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11460 Menu2.RadioItem,
11461 {
11462 name: "view-table-sorting",
11463 value,
11464 checked: isChecked,
11465 onChange: () => {
11466 onChangeView({
11467 ...view,
11468 sort: {
11469 field: fieldId,
11470 direction
11471 },
11472 showLevels: false
11473 });
11474 },
11475 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: sortLabels[direction] })
11476 },
11477 value
11478 );
11479 }
11480 ) }),
11481 canAddFilter && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11482 Menu2.Item,
11483 {
11484 prefix: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_components4.Icon, { icon: funnel_default }),
11485 onClick: () => {
11486 setOpenedFilter(fieldId);
11487 setIsShowingFilter(true);
11488 onChangeView({
11489 ...view,
11490 page: 1,
11491 filters: [
11492 ...view.filters || [],
11493 {
11494 field: fieldId,
11495 value: void 0,
11496 operator: operators[0]
11497 }
11498 ]
11499 });
11500 },
11501 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Add filter") })
11502 }
11503 ) }),
11504 (canMove || isHidable || canInsert) && field && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(Menu2.Group, { children: [
11505 canMove && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11506 Menu2.Item,
11507 {
11508 prefix: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_components4.Icon, { icon: arrow_left_default }),
11509 disabled: isRtl ? index2 >= visibleFieldIds.length - 1 : index2 < 1,
11510 onClick: () => {
11511 const targetIndex = isRtl ? index2 + 1 : index2 - 1;
11512 const newFields = [
11513 ...visibleFieldIds
11514 ];
11515 newFields.splice(index2, 1);
11516 newFields.splice(
11517 targetIndex,
11518 0,
11519 fieldId
11520 );
11521 onChangeView({
11522 ...view,
11523 fields: newFields
11524 });
11525 },
11526 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Move left") })
11527 }
11528 ),
11529 canMove && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11530 Menu2.Item,
11531 {
11532 prefix: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_components4.Icon, { icon: arrow_right_default }),
11533 disabled: isRtl ? index2 < 1 : index2 >= visibleFieldIds.length - 1,
11534 onClick: () => {
11535 const targetIndex = isRtl ? index2 - 1 : index2 + 1;
11536 const newFields = [
11537 ...visibleFieldIds
11538 ];
11539 newFields.splice(index2, 1);
11540 newFields.splice(
11541 targetIndex,
11542 0,
11543 fieldId
11544 );
11545 onChangeView({
11546 ...view,
11547 fields: newFields
11548 });
11549 },
11550 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Move right") })
11551 }
11552 ),
11553 canInsertLeft && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(Menu2, { children: [
11554 /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Insert left") }) }),
11555 /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
11556 const insertIndex = isRtl ? index2 + 1 : index2;
11557 return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11558 Menu2.Item,
11559 {
11560 onClick: () => {
11561 onChangeView({
11562 ...view,
11563 fields: [
11564 ...visibleFieldIds.slice(
11565 0,
11566 insertIndex
11567 ),
11568 hiddenField.id,
11569 ...visibleFieldIds.slice(
11570 insertIndex
11571 )
11572 ]
11573 });
11574 },
11575 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
11576 },
11577 hiddenField.id
11578 );
11579 }) })
11580 ] }),
11581 canInsertRight && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(Menu2, { children: [
11582 /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Insert right") }) }),
11583 /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
11584 const insertIndex = isRtl ? index2 : index2 + 1;
11585 return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11586 Menu2.Item,
11587 {
11588 onClick: () => {
11589 onChangeView({
11590 ...view,
11591 fields: [
11592 ...visibleFieldIds.slice(
11593 0,
11594 insertIndex
11595 ),
11596 hiddenField.id,
11597 ...visibleFieldIds.slice(
11598 insertIndex
11599 )
11600 ]
11601 });
11602 },
11603 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
11604 },
11605 hiddenField.id
11606 );
11607 }) })
11608 ] }),
11609 isHidable && field && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11610 Menu2.Item,
11611 {
11612 prefix: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_components4.Icon, { icon: unseen_default }),
11613 onClick: () => {
11614 onHide(field);
11615 onChangeView({
11616 ...view,
11617 fields: visibleFieldIds.filter(
11618 (id) => id !== fieldId
11619 )
11620 });
11621 },
11622 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Hide column") })
11623 }
11624 )
11625 ] })
11626 ] }) })
11627 ] });
11628 });
11629 var ColumnHeaderMenu = _HeaderMenu;
11630 var column_header_menu_default = ColumnHeaderMenu;
11631
11632 // packages/dataviews/build-module/components/dataviews-layouts/utils/item-click-wrapper.mjs
11633 var import_element30 = __toESM(require_element(), 1);
11634 var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1);
11635 function getClickableItemProps({
11636 item,
11637 isItemClickable,
11638 onClickItem,
11639 className
11640 }) {
11641 if (!isItemClickable(item) || !onClickItem) {
11642 return { className };
11643 }
11644 return {
11645 className: className ? `${className} ${className}--clickable` : void 0,
11646 role: "button",
11647 tabIndex: 0,
11648 onClick: (event) => {
11649 event.stopPropagation();
11650 onClickItem(item);
11651 },
11652 onKeyDown: (event) => {
11653 if (event.key === "Enter" || event.key === "" || event.key === " ") {
11654 event.stopPropagation();
11655 onClickItem(item);
11656 }
11657 }
11658 };
11659 }
11660 function ItemClickWrapper({
11661 item,
11662 isItemClickable,
11663 onClickItem,
11664 renderItemLink,
11665 className,
11666 children,
11667 ...extraProps
11668 }) {
11669 if (!isItemClickable(item)) {
11670 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className, ...extraProps, children });
11671 }
11672 if (renderItemLink) {
11673 const renderedElement = renderItemLink({
11674 item,
11675 className: `${className} ${className}--clickable`,
11676 ...extraProps,
11677 children
11678 });
11679 return (0, import_element30.cloneElement)(renderedElement, {
11680 onClick: (event) => {
11681 event.stopPropagation();
11682 if (renderedElement.props.onClick) {
11683 renderedElement.props.onClick(event);
11684 }
11685 },
11686 onKeyDown: (event) => {
11687 if (event.key === "Enter" || event.key === "" || event.key === " ") {
11688 event.stopPropagation();
11689 if (renderedElement.props.onKeyDown) {
11690 renderedElement.props.onKeyDown(event);
11691 }
11692 }
11693 }
11694 });
11695 }
11696 const clickProps = getClickableItemProps({
11697 item,
11698 isItemClickable,
11699 onClickItem,
11700 className
11701 });
11702 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { ...clickProps, ...extraProps, children });
11703 }
11704
11705 // packages/dataviews/build-module/components/dataviews-layouts/table/column-primary.mjs
11706 var import_jsx_runtime54 = __toESM(require_jsx_runtime(), 1);
11707 function ColumnPrimary({
11708 item,
11709 level,
11710 titleField,
11711 mediaField,
11712 descriptionField,
11713 onClickItem,
11714 renderItemLink,
11715 isItemClickable
11716 }) {
11717 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(Stack, { direction: "row", gap: "md", align: "flex-start", justify: "flex-start", children: [
11718 mediaField && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
11719 ItemClickWrapper,
11720 {
11721 item,
11722 isItemClickable,
11723 onClickItem,
11724 renderItemLink,
11725 className: "dataviews-view-table__cell-content-wrapper dataviews-column-primary__media",
11726 "aria-label": isItemClickable(item) && (!!onClickItem || !!renderItemLink) && !!titleField ? titleField.getValue?.({ item }) : void 0,
11727 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
11728 mediaField.render,
11729 {
11730 item,
11731 field: mediaField,
11732 config: { sizes: "32px" }
11733 }
11734 )
11735 }
11736 ),
11737 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
11738 Stack,
11739 {
11740 direction: "column",
11741 align: "flex-start",
11742 className: "dataviews-view-table__primary-column-content",
11743 children: [
11744 titleField && /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
11745 ItemClickWrapper,
11746 {
11747 item,
11748 isItemClickable,
11749 onClickItem,
11750 renderItemLink,
11751 className: "dataviews-view-table__cell-content-wrapper dataviews-title-field",
11752 children: [
11753 level !== void 0 && level > 0 && /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("span", { className: "dataviews-view-table__level", children: [
11754 Array(level).fill("\u2014").join(" "),
11755 "\xA0"
11756 ] }),
11757 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(titleField.render, { item, field: titleField })
11758 ]
11759 }
11760 ),
11761 descriptionField && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
11762 descriptionField.render,
11763 {
11764 item,
11765 field: descriptionField
11766 }
11767 )
11768 ]
11769 }
11770 )
11771 ] });
11772 }
11773 var column_primary_default = ColumnPrimary;
11774
11775 // packages/dataviews/build-module/components/dataviews-layouts/table/use-scroll-state.mjs
11776 var import_element31 = __toESM(require_element(), 1);
11777 var import_i18n8 = __toESM(require_i18n(), 1);
11778 var isScrolledToEnd = (element) => {
11779 if ((0, import_i18n8.isRTL)()) {
11780 const scrollLeft = Math.abs(element.scrollLeft);
11781 return scrollLeft <= 1;
11782 }
11783 return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
11784 };
11785 function useScrollState({
11786 scrollContainerRef,
11787 enabledHorizontal = false
11788 }) {
11789 const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = (0, import_element31.useState)(false);
11790 const [isVerticallyScrolled, setIsVerticallyScrolled] = (0, import_element31.useState)(false);
11791 const handleScroll = (0, import_element31.useCallback)(() => {
11792 const scrollContainer = scrollContainerRef.current;
11793 if (!scrollContainer) {
11794 return;
11795 }
11796 if (enabledHorizontal) {
11797 setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer));
11798 }
11799 setIsVerticallyScrolled(scrollContainer.scrollTop > 0);
11800 }, [scrollContainerRef, enabledHorizontal]);
11801 (0, import_element31.useEffect)(() => {
11802 if (typeof window === "undefined" || !scrollContainerRef.current) {
11803 return () => {
11804 };
11805 }
11806 const scrollContainer = scrollContainerRef.current;
11807 handleScroll();
11808 scrollContainer.addEventListener("scroll", handleScroll);
11809 window.addEventListener("resize", handleScroll);
11810 return () => {
11811 scrollContainer.removeEventListener("scroll", handleScroll);
11812 window.removeEventListener("resize", handleScroll);
11813 };
11814 }, [scrollContainerRef, enabledHorizontal, handleScroll]);
11815 return { isHorizontalScrollEnd, isVerticallyScrolled };
11816 }
11817
11818 // packages/dataviews/build-module/components/dataviews-layouts/utils/get-data-by-group.mjs
11819 function getDataByGroup(data, groupByField) {
11820 return data.reduce((groups, item) => {
11821 const groupName = groupByField.getValue({ item });
11822 if (!groups.has(groupName)) {
11823 groups.set(groupName, []);
11824 }
11825 groups.get(groupName)?.push(item);
11826 return groups;
11827 }, /* @__PURE__ */ new Map());
11828 }
11829
11830 // packages/dataviews/build-module/components/dataviews-layouts/utils/use-selection-props.mjs
11831 var import_element32 = __toESM(require_element(), 1);
11832 var import_keycodes = __toESM(require_keycodes(), 1);
11833 function getRange(orderedIds, fromIndex, toIndex) {
11834 return orderedIds.slice(
11835 Math.min(fromIndex, toIndex),
11836 Math.max(fromIndex, toIndex) + 1
11837 );
11838 }
11839 function getRangeSelection({
11840 anchorId,
11841 targetId,
11842 lastTargetId,
11843 orderedIds,
11844 selection
11845 }) {
11846 const targetIndex = orderedIds.indexOf(targetId);
11847 if (targetIndex === -1) {
11848 return selection;
11849 }
11850 const anchorIndex = anchorId === null ? -1 : orderedIds.indexOf(anchorId);
11851 const hasAnchor = anchorIndex !== -1;
11852 const rangeStart = hasAnchor ? anchorIndex : targetIndex;
11853 const lastTargetIndex = hasAnchor && lastTargetId !== null ? orderedIds.indexOf(lastTargetId) : -1;
11854 const lastRange = lastTargetIndex === -1 ? [] : getRange(orderedIds, rangeStart, lastTargetIndex);
11855 const base = selection.filter((id) => !lastRange.includes(id));
11856 return [
11857 .../* @__PURE__ */ new Set([
11858 ...base,
11859 ...getRange(orderedIds, rangeStart, targetIndex)
11860 ])
11861 ];
11862 }
11863 function getClosestSelectedId({
11864 targetId,
11865 orderedIds,
11866 selection
11867 }) {
11868 const targetIndex = orderedIds.indexOf(targetId);
11869 if (targetIndex === -1) {
11870 return null;
11871 }
11872 const selectedIds = new Set(selection);
11873 let closestId = null;
11874 let closestDistance = Infinity;
11875 orderedIds.forEach((id, index2) => {
11876 if (!selectedIds.has(id)) {
11877 return;
11878 }
11879 const distance = Math.abs(index2 - targetIndex);
11880 if (distance < closestDistance) {
11881 closestDistance = distance;
11882 closestId = id;
11883 }
11884 });
11885 return closestId;
11886 }
11887 function useSelectionProps({
11888 data,
11889 actions,
11890 getItemId,
11891 selection,
11892 onChangeSelection
11893 }) {
11894 const gestureRef = (0, import_element32.useRef)(null);
11895 const isTouchDeviceRef = (0, import_element32.useRef)(false);
11896 (0, import_element32.useEffect)(() => {
11897 const markTouchDevice = () => {
11898 isTouchDeviceRef.current = true;
11899 };
11900 document.addEventListener("touchstart", markTouchDevice, {
11901 once: true
11902 });
11903 return () => document.removeEventListener("touchstart", markTouchDevice);
11904 }, []);
11905 const selectableIds = data.filter((item) => hasAPossibleBulkAction(actions, item)).map(getItemId);
11906 const selectableIdSet = new Set(selectableIds);
11907 const hasSelectableItems = selectableIds.length > 0;
11908 const getSelectionProps = (id) => {
11909 const isSelectable = selectableIdSet.has(id);
11910 return {
11911 onMouseDown: (event) => {
11912 if (event.button === 0 && event.shiftKey && hasSelectableItems) {
11913 event.preventDefault();
11914 }
11915 },
11916 onClickCapture: (event) => {
11917 if (!hasSelectableItems) {
11918 return;
11919 }
11920 const isModifierKeyPressed = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey;
11921 const isSelectionCheckboxClick = event.target instanceof Element && !!event.target.closest(`.${SELECTION_CHECKBOX_CLASS}`);
11922 if (!isModifierKeyPressed && !event.shiftKey) {
11923 if (isSelectable && isSelectionCheckboxClick) {
11924 gestureRef.current = {
11925 anchorId: id,
11926 lastTargetId: null
11927 };
11928 }
11929 return;
11930 }
11931 if (isTouchDeviceRef.current || document.getSelection()?.type === "Range") {
11932 return;
11933 }
11934 event.stopPropagation();
11935 if (!isSelectionCheckboxClick) {
11936 event.preventDefault();
11937 }
11938 if (!isSelectable) {
11939 return;
11940 }
11941 if (event.shiftKey) {
11942 let gesture = gestureRef.current;
11943 if (!gesture || !selectableIdSet.has(gesture.anchorId)) {
11944 gesture = {
11945 anchorId: getClosestSelectedId({
11946 targetId: id,
11947 orderedIds: selectableIds,
11948 selection
11949 }) ?? id,
11950 lastTargetId: null
11951 };
11952 }
11953 onChangeSelection(
11954 getRangeSelection({
11955 anchorId: gesture.anchorId,
11956 targetId: id,
11957 lastTargetId: gesture.lastTargetId,
11958 orderedIds: selectableIds,
11959 selection
11960 })
11961 );
11962 gestureRef.current = {
11963 anchorId: gesture.anchorId,
11964 lastTargetId: id
11965 };
11966 } else {
11967 onChangeSelection(
11968 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
11969 );
11970 gestureRef.current = { anchorId: id, lastTargetId: null };
11971 }
11972 }
11973 };
11974 };
11975 return { getSelectionProps };
11976 }
11977
11978 // packages/dataviews/build-module/components/dataviews-view-config/properties-section.mjs
11979 var import_components5 = __toESM(require_components(), 1);
11980 var import_i18n9 = __toESM(require_i18n(), 1);
11981 var import_element33 = __toESM(require_element(), 1);
11982 var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1);
11983 function FieldItem({
11984 field,
11985 isVisible: isVisible2,
11986 onToggleVisibility
11987 }) {
11988 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components5.__experimentalItem, { onClick: field.enableHiding ? onToggleVisibility : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(Stack, { direction: "row", gap: "sm", justify: "flex-start", align: "center", children: [
11989 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { style: { height: 24, width: 24 }, children: isVisible2 && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components5.Icon, { icon: check_default }) }),
11990 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "dataviews-view-config__label", children: field.label })
11991 ] }) });
11992 }
11993 function isDefined(item) {
11994 return !!item;
11995 }
11996 function PropertiesSection({
11997 showLabel = true
11998 }) {
11999 const { view, fields, onChangeView } = (0, import_element33.useContext)(dataviews_context_default);
12000 const regularFields = getHideableFields(view, fields);
12001 if (!regularFields?.length) {
12002 return null;
12003 }
12004 const titleField = fields.find((f2) => f2.id === view.titleField);
12005 const previewField = fields.find((f2) => f2.id === view.mediaField);
12006 const descriptionField = fields.find(
12007 (f2) => f2.id === view.descriptionField
12008 );
12009 const lockedFields = [
12010 {
12011 field: titleField,
12012 isVisibleFlag: "showTitle"
12013 },
12014 {
12015 field: previewField,
12016 isVisibleFlag: "showMedia"
12017 },
12018 {
12019 field: descriptionField,
12020 isVisibleFlag: "showDescription"
12021 }
12022 ].filter(({ field }) => isDefined(field));
12023 const visibleFieldIds = view.fields ?? [];
12024 const visibleRegularFieldsCount = regularFields.filter(
12025 (f2) => visibleFieldIds.includes(f2.id)
12026 ).length;
12027 const visibleLockedFields = lockedFields.filter(
12028 ({ isVisibleFlag }) => (
12029 // @ts-expect-error
12030 view[isVisibleFlag] ?? true
12031 )
12032 );
12033 const totalVisibleFields = visibleLockedFields.length + visibleRegularFieldsCount;
12034 const isSingleVisibleLockedField = totalVisibleFields === 1 && visibleLockedFields.length === 1;
12035 return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(Stack, { direction: "column", className: "dataviews-field-control", children: [
12036 showLabel && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components5.BaseControl.VisualLabel, { children: (0, import_i18n9.__)("Properties") }),
12037 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
12038 Stack,
12039 {
12040 direction: "column",
12041 className: "dataviews-view-config__properties",
12042 children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_components5.__experimentalItemGroup, { isBordered: true, isSeparated: true, size: "medium", children: [
12043 lockedFields.map(({ field, isVisibleFlag }) => {
12044 const isVisible2 = view[isVisibleFlag] ?? true;
12045 const fieldToRender = isSingleVisibleLockedField && isVisible2 ? { ...field, enableHiding: false } : field;
12046 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
12047 FieldItem,
12048 {
12049 field: fieldToRender,
12050 isVisible: isVisible2,
12051 onToggleVisibility: () => {
12052 onChangeView({
12053 ...view,
12054 [isVisibleFlag]: !isVisible2
12055 });
12056 }
12057 },
12058 field.id
12059 );
12060 }),
12061 regularFields.map((field) => {
12062 const isVisible2 = visibleFieldIds.includes(field.id);
12063 const fieldToRender = totalVisibleFields === 1 && isVisible2 ? { ...field, enableHiding: false } : field;
12064 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
12065 FieldItem,
12066 {
12067 field: fieldToRender,
12068 isVisible: isVisible2,
12069 onToggleVisibility: () => {
12070 onChangeView({
12071 ...view,
12072 fields: isVisible2 ? visibleFieldIds.filter(
12073 (fieldId) => fieldId !== field.id
12074 ) : [...visibleFieldIds, field.id]
12075 });
12076 }
12077 },
12078 field.id
12079 );
12080 })
12081 ] })
12082 }
12083 )
12084 ] });
12085 }
12086
12087 // packages/dataviews/build-module/hooks/use-delayed-loading.mjs
12088 var import_element34 = __toESM(require_element(), 1);
12089 function useDelayedLoading(isLoading, options = { delay: 400 }) {
12090 const [showLoader, setShowLoader] = (0, import_element34.useState)(false);
12091 (0, import_element34.useEffect)(() => {
12092 if (!isLoading) {
12093 return;
12094 }
12095 const timeout = setTimeout(() => {
12096 setShowLoader(true);
12097 }, options.delay);
12098 return () => {
12099 clearTimeout(timeout);
12100 setShowLoader(false);
12101 };
12102 }, [isLoading, options.delay]);
12103 return showLoader;
12104 }
12105
12106 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
12107 var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1);
12108 function getEffectiveAlign(explicitAlign, fieldType) {
12109 if (explicitAlign) {
12110 return explicitAlign;
12111 }
12112 if (fieldType === "integer" || fieldType === "number") {
12113 return "end";
12114 }
12115 return void 0;
12116 }
12117 function TableColumnField({
12118 item,
12119 fields,
12120 column,
12121 align
12122 }) {
12123 const field = fields.find((f2) => f2.id === column);
12124 if (!field) {
12125 return null;
12126 }
12127 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
12128 "dataviews-view-table__cell-align-end": align === "end",
12129 "dataviews-view-table__cell-align-center": align === "center"
12130 });
12131 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(field.render, { item, field }) });
12132 }
12133 function TableRow({
12134 hasBulkActions,
12135 item,
12136 level,
12137 actions,
12138 fields,
12139 id,
12140 view,
12141 titleField,
12142 mediaField,
12143 descriptionField,
12144 selection,
12145 getItemId,
12146 isItemClickable,
12147 onClickItem,
12148 renderItemLink,
12149 onChangeSelection,
12150 onMouseDown,
12151 onClickCapture,
12152 isActionsColumnSticky,
12153 posinset
12154 }) {
12155 const { paginationInfo } = (0, import_element35.useContext)(dataviews_context_default);
12156 const hasPossibleBulkAction = useHasAPossibleBulkAction(actions, item);
12157 const isSelected2 = hasPossibleBulkAction && selection.includes(id);
12158 const {
12159 showTitle = true,
12160 showMedia = true,
12161 showDescription = true,
12162 infiniteScrollEnabled
12163 } = view;
12164 const columns = view.fields ?? [];
12165 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
12166 return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
12167 "tr",
12168 {
12169 className: clsx_default("dataviews-view-table__row", {
12170 "is-selected": hasPossibleBulkAction && isSelected2,
12171 "has-bulk-actions": hasPossibleBulkAction
12172 }),
12173 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
12174 "aria-posinset": posinset,
12175 role: infiniteScrollEnabled ? "article" : void 0,
12176 onClickCapture,
12177 onMouseDown: (event) => {
12178 const isMetaClick = (0, import_keycodes2.isAppleOS)() ? event.metaKey : event.ctrlKey;
12179 if (event.button === 0 && isMetaClick && window.navigator.userAgent.toLowerCase().includes("firefox")) {
12180 event.preventDefault();
12181 }
12182 onMouseDown(event);
12183 },
12184 children: [
12185 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("td", { className: "dataviews-view-table__checkbox-column", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12186 DataViewsSelectionCheckbox,
12187 {
12188 item,
12189 selection,
12190 onChangeSelection,
12191 getItemId,
12192 titleField,
12193 disabled: !hasPossibleBulkAction
12194 }
12195 ) }) }),
12196 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12197 column_primary_default,
12198 {
12199 item,
12200 level,
12201 titleField: showTitle ? titleField : void 0,
12202 mediaField: showMedia ? mediaField : void 0,
12203 descriptionField: showDescription ? descriptionField : void 0,
12204 isItemClickable,
12205 onClickItem,
12206 renderItemLink
12207 }
12208 ) }),
12209 columns.map((column) => {
12210 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
12211 const field = fields.find((f2) => f2.id === column);
12212 const effectiveAlign = getEffectiveAlign(align, field?.type);
12213 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12214 "td",
12215 {
12216 style: {
12217 width,
12218 maxWidth,
12219 minWidth
12220 },
12221 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12222 TableColumnField,
12223 {
12224 fields,
12225 item,
12226 column,
12227 align: effectiveAlign
12228 }
12229 )
12230 },
12231 column
12232 );
12233 }),
12234 !!actions?.length && // Disable reason: we are not making the element interactive,
12235 // but preventing any click events from bubbling up to the
12236 // table row. This allows us to add a click handler to the row
12237 // itself (to toggle row selection) without erroneously
12238 // intercepting click events from ItemActions.
12239 /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12240 "td",
12241 {
12242 className: clsx_default("dataviews-view-table__actions-column", {
12243 "dataviews-view-table__actions-column--sticky": true,
12244 "dataviews-view-table__actions-column--stuck": isActionsColumnSticky
12245 }),
12246 onClick: (e2) => e2.stopPropagation(),
12247 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(ItemActions, { item, actions })
12248 }
12249 )
12250 ]
12251 }
12252 );
12253 }
12254 function ViewTable({
12255 actions,
12256 data,
12257 fields,
12258 getItemId,
12259 getItemLevel,
12260 isLoading = false,
12261 onChangeView,
12262 onChangeSelection,
12263 selection,
12264 setOpenedFilter,
12265 onClickItem,
12266 isItemClickable,
12267 renderItemLink,
12268 view,
12269 className,
12270 empty
12271 }) {
12272 const { containerRef } = (0, import_element35.useContext)(dataviews_context_default);
12273 const isDelayedLoading = useDelayedLoading(isLoading);
12274 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
12275 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
12276 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
12277 const { getSelectionProps } = useSelectionProps({
12278 data: orderedData,
12279 actions,
12280 getItemId,
12281 selection,
12282 onChangeSelection
12283 });
12284 const headerMenuRefs = (0, import_element35.useRef)(/* @__PURE__ */ new Map());
12285 const headerMenuToFocusRef = (0, import_element35.useRef)(void 0);
12286 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element35.useState)();
12287 const [contextMenuAnchor, setContextMenuAnchor] = (0, import_element35.useState)(null);
12288 (0, import_element35.useEffect)(() => {
12289 if (headerMenuToFocusRef.current) {
12290 headerMenuToFocusRef.current.focus();
12291 headerMenuToFocusRef.current = void 0;
12292 }
12293 });
12294 const tableNoticeId = (0, import_element35.useId)();
12295 const { isHorizontalScrollEnd, isVerticallyScrolled } = useScrollState({
12296 scrollContainerRef: containerRef,
12297 enabledHorizontal: !!actions?.length
12298 });
12299 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
12300 if (nextHeaderMenuToFocus) {
12301 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
12302 setNextHeaderMenuToFocus(void 0);
12303 return;
12304 }
12305 const onHide = (field) => {
12306 const hidden = headerMenuRefs.current.get(field.id);
12307 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
12308 setNextHeaderMenuToFocus(fallback?.node);
12309 };
12310 const handleHeaderContextMenu = (event) => {
12311 event.preventDefault();
12312 event.stopPropagation();
12313 const virtualAnchor = {
12314 getBoundingClientRect: () => ({
12315 x: event.clientX,
12316 y: event.clientY,
12317 top: event.clientY,
12318 left: event.clientX,
12319 right: event.clientX,
12320 bottom: event.clientY,
12321 width: 0,
12322 height: 0,
12323 toJSON: () => ({})
12324 })
12325 };
12326 window.requestAnimationFrame(() => {
12327 setContextMenuAnchor(virtualAnchor);
12328 });
12329 };
12330 const hasData = !!data?.length;
12331 const titleField = fields.find((field) => field.id === view.titleField);
12332 const mediaField = fields.find((field) => field.id === view.mediaField);
12333 const descriptionField = fields.find(
12334 (field) => field.id === view.descriptionField
12335 );
12336 const { showTitle = true, showMedia = true, showDescription = true } = view;
12337 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
12338 const columns = view.fields ?? [];
12339 const headerMenuRef = (column, index2) => (node) => {
12340 if (node) {
12341 headerMenuRefs.current.set(column, {
12342 node,
12343 fallback: columns[index2 > 0 ? index2 - 1 : 1]
12344 });
12345 } else {
12346 headerMenuRefs.current.delete(column);
12347 }
12348 };
12349 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
12350 const isRtl = (0, import_i18n10.isRTL)();
12351 if (!hasData) {
12352 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12353 "div",
12354 {
12355 className: clsx_default("dataviews-no-results", {
12356 "is-refreshing": isDelayedLoading
12357 }),
12358 id: tableNoticeId,
12359 children: empty
12360 }
12361 );
12362 }
12363 return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_jsx_runtime56.Fragment, { children: [
12364 /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
12365 "table",
12366 {
12367 className: clsx_default("dataviews-view-table", className, {
12368 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
12369 view.layout.density
12370 ),
12371 "has-bulk-actions": hasBulkActions,
12372 "is-refreshing": !isInfiniteScroll && isDelayedLoading
12373 }),
12374 "aria-busy": isLoading,
12375 "aria-describedby": tableNoticeId,
12376 role: isInfiniteScroll ? "feed" : void 0,
12377 inert: !isInfiniteScroll && isLoading ? "true" : void 0,
12378 children: [
12379 /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("colgroup", { children: [
12380 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("col", { className: "dataviews-view-table__col-checkbox" }),
12381 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("col", { className: "dataviews-view-table__col-first-data" }),
12382 columns.map((column, index2) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12383 "col",
12384 {
12385 className: clsx_default(
12386 `dataviews-view-table__col-${column}`,
12387 {
12388 "dataviews-view-table__col-expand": !hasPrimaryColumn && index2 === columns.length - 1
12389 }
12390 )
12391 },
12392 `col-${column}`
12393 )),
12394 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("col", { className: "dataviews-view-table__col-actions" })
12395 ] }),
12396 contextMenuAnchor && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12397 import_components6.Popover,
12398 {
12399 anchor: contextMenuAnchor,
12400 onClose: () => setContextMenuAnchor(null),
12401 placement: "bottom-start",
12402 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PropertiesSection, { showLabel: false })
12403 }
12404 ),
12405 /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12406 "thead",
12407 {
12408 className: clsx_default({
12409 "dataviews-view-table__thead--stuck": isVerticallyScrolled
12410 }),
12411 onContextMenu: handleHeaderContextMenu,
12412 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("tr", { className: "dataviews-view-table__row", children: [
12413 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12414 "th",
12415 {
12416 className: "dataviews-view-table__checkbox-column",
12417 scope: "col",
12418 onContextMenu: handleHeaderContextMenu,
12419 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12420 BulkSelectionCheckbox,
12421 {
12422 selection,
12423 onChangeSelection,
12424 data,
12425 actions,
12426 getItemId
12427 }
12428 )
12429 }
12430 ),
12431 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("th", { scope: "col", children: titleField && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12432 column_header_menu_default,
12433 {
12434 ref: headerMenuRef(
12435 titleField.id,
12436 0
12437 ),
12438 fieldId: titleField.id,
12439 view,
12440 fields,
12441 onChangeView,
12442 onHide,
12443 setOpenedFilter,
12444 canMove: false,
12445 canInsertLeft: isRtl ? view.layout?.enableMoving ?? true : false,
12446 canInsertRight: isRtl ? false : view.layout?.enableMoving ?? true
12447 }
12448 ) }),
12449 columns.map((column, index2) => {
12450 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
12451 const field = fields.find(
12452 (f2) => f2.id === column
12453 );
12454 const effectiveAlign = getEffectiveAlign(
12455 align,
12456 field?.type
12457 );
12458 const canInsertOrMove = view.layout?.enableMoving ?? true;
12459 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12460 "th",
12461 {
12462 style: {
12463 width,
12464 maxWidth,
12465 minWidth,
12466 textAlign: effectiveAlign
12467 },
12468 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
12469 scope: "col",
12470 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12471 column_header_menu_default,
12472 {
12473 ref: headerMenuRef(column, index2),
12474 fieldId: column,
12475 view,
12476 fields,
12477 onChangeView,
12478 onHide,
12479 setOpenedFilter,
12480 canMove: canInsertOrMove,
12481 canInsertLeft: canInsertOrMove,
12482 canInsertRight: canInsertOrMove
12483 }
12484 )
12485 },
12486 column
12487 );
12488 }),
12489 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12490 "th",
12491 {
12492 className: clsx_default(
12493 "dataviews-view-table__actions-column",
12494 {
12495 "dataviews-view-table__actions-column--sticky": true,
12496 "dataviews-view-table__actions-column--stuck": !isHorizontalScrollEnd
12497 }
12498 ),
12499 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "dataviews-view-table-header", children: (0, import_i18n10.__)("Actions") })
12500 }
12501 )
12502 ] })
12503 }
12504 ),
12505 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
12506 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("tbody", { children: [
12507 /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("tr", { className: "dataviews-view-table__group-header-row", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12508 "td",
12509 {
12510 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + (hasBulkActions ? 1 : 0) + (actions?.length ? 1 : 0),
12511 className: "dataviews-view-table__group-header-cell",
12512 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n10.sprintf)(
12513 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
12514 (0, import_i18n10.__)("%1$s: %2$s"),
12515 groupField.label,
12516 groupName
12517 )
12518 }
12519 ) }),
12520 groupItems.map((item, index2) => {
12521 const id = getItemId(item) || index2.toString();
12522 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12523 TableRow,
12524 {
12525 item,
12526 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
12527 hasBulkActions,
12528 actions,
12529 fields,
12530 id,
12531 view,
12532 titleField,
12533 mediaField,
12534 descriptionField,
12535 selection,
12536 getItemId,
12537 onChangeSelection,
12538 ...getSelectionProps(id),
12539 onClickItem,
12540 renderItemLink,
12541 isItemClickable,
12542 isActionsColumnSticky: !isHorizontalScrollEnd
12543 },
12544 getItemId(item)
12545 );
12546 })
12547 ] }, `group-${groupName}`)
12548 ) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("tbody", { children: hasData && data.map((item, index2) => {
12549 const id = getItemId(item) || index2.toString();
12550 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12551 TableRow,
12552 {
12553 item,
12554 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
12555 hasBulkActions,
12556 actions,
12557 fields,
12558 id,
12559 view,
12560 titleField,
12561 mediaField,
12562 descriptionField,
12563 selection,
12564 getItemId,
12565 onChangeSelection,
12566 ...getSelectionProps(id),
12567 onClickItem,
12568 renderItemLink,
12569 isItemClickable,
12570 isActionsColumnSticky: !isHorizontalScrollEnd,
12571 posinset: isInfiniteScroll ? index2 + 1 : void 0
12572 },
12573 getItemId(item)
12574 );
12575 }) })
12576 ]
12577 }
12578 ),
12579 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: "dataviews-loading", id: tableNoticeId, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_components6.Spinner, {}) }) })
12580 ] });
12581 }
12582 var table_default = ViewTable;
12583
12584 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
12585 var import_components9 = __toESM(require_components(), 1);
12586 var import_i18n13 = __toESM(require_i18n(), 1);
12587
12588 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
12589 var import_components8 = __toESM(require_components(), 1);
12590 var import_i18n12 = __toESM(require_i18n(), 1);
12591 var import_compose3 = __toESM(require_compose(), 1);
12592 var import_element39 = __toESM(require_element(), 1);
12593
12594 // packages/dataviews/build-module/components/dataviews-layouts/grid/preview-size-picker.mjs
12595 var import_components7 = __toESM(require_components(), 1);
12596 var import_i18n11 = __toESM(require_i18n(), 1);
12597 var import_element36 = __toESM(require_element(), 1);
12598 var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1);
12599 var imageSizes = [
12600 {
12601 value: 120,
12602 breakpoint: 1
12603 },
12604 {
12605 value: 170,
12606 breakpoint: 1
12607 },
12608 {
12609 value: 230,
12610 breakpoint: 1
12611 },
12612 {
12613 value: 290,
12614 breakpoint: 1112
12615 // at minimum image width, 4 images display at this container size
12616 },
12617 {
12618 value: 350,
12619 breakpoint: 1636
12620 // at minimum image width, 6 images display at this container size
12621 },
12622 {
12623 value: 430,
12624 breakpoint: 588
12625 // at minimum image width, 2 images display at this container size
12626 }
12627 ];
12628 var DEFAULT_PREVIEW_SIZE = imageSizes[2].value;
12629 function useGridColumns() {
12630 const context = (0, import_element36.useContext)(dataviews_context_default);
12631 const view = context.view;
12632 return (0, import_element36.useMemo)(() => {
12633 const containerWidth = context.containerWidth;
12634 const gap = 32;
12635 const previewSize = view.layout?.previewSize ?? DEFAULT_PREVIEW_SIZE;
12636 const columns = Math.floor(
12637 (containerWidth + gap) / (previewSize + gap)
12638 );
12639 return Math.max(1, columns);
12640 }, [context.containerWidth, view.layout?.previewSize]);
12641 }
12642
12643 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-items.mjs
12644 var import_element37 = __toESM(require_element(), 1);
12645 var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1);
12646 var GridItems = (0, import_element37.forwardRef)(({ className, previewSize, ...props }, ref) => {
12647 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12648 "div",
12649 {
12650 ref,
12651 className: clsx_default("dataviews-view-grid-items", className),
12652 style: {
12653 gridTemplateColumns: previewSize && `repeat(auto-fill, minmax(${previewSize}px, 1fr))`
12654 },
12655 ...props
12656 }
12657 );
12658 });
12659
12660 // packages/dataviews/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs
12661 var import_element38 = __toESM(require_element(), 1);
12662 function useIntersectionObserver(elementRef, posinset) {
12663 const { intersectionObserver } = (0, import_element38.useContext)(dataviews_context_default);
12664 (0, import_element38.useEffect)(() => {
12665 const element = elementRef.current;
12666 if (!element || posinset === void 0 || !intersectionObserver) {
12667 return;
12668 }
12669 intersectionObserver.observe(element);
12670 return () => {
12671 intersectionObserver.unobserve(element);
12672 };
12673 }, [elementRef, intersectionObserver, posinset]);
12674 }
12675 function usePlaceholdersNeeded(data, isInfiniteScroll, gridColumns) {
12676 const hasData = !!data?.length;
12677 const firstItemPosition = hasData && isInfiniteScroll ? data[0].position : void 0;
12678 return firstItemPosition && gridColumns ? (firstItemPosition - 1) % gridColumns : 0;
12679 }
12680
12681 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
12682 var import_jsx_runtime59 = __toESM(require_jsx_runtime(), 1);
12683 var { Badge: WCBadge } = unlock2(import_components8.privateApis);
12684 function chunk(array, size4) {
12685 const chunks = [];
12686 for (let i2 = 0, j2 = array.length; i2 < j2; i2 += size4) {
12687 chunks.push(array.slice(i2, i2 + size4));
12688 }
12689 return chunks;
12690 }
12691 var GridItem = (0, import_element39.forwardRef)(
12692 function GridItem2({
12693 view,
12694 selection,
12695 onChangeSelection,
12696 onClickItem,
12697 isItemClickable,
12698 renderItemLink,
12699 getItemId,
12700 item,
12701 actions,
12702 mediaField,
12703 titleField,
12704 descriptionField,
12705 regularFields,
12706 badgeFields,
12707 hasBulkActions,
12708 config,
12709 posinset,
12710 setsize,
12711 ...props
12712 }, forwardedRef) {
12713 const {
12714 showTitle = true,
12715 showMedia = true,
12716 showDescription = true
12717 } = view;
12718 const hasBulkAction = useHasAPossibleBulkAction(actions, item);
12719 const id = getItemId(item);
12720 const elementRef = (0, import_element39.useRef)(null);
12721 const setRefs = (0, import_element39.useCallback)(
12722 (node) => {
12723 elementRef.current = node;
12724 if (typeof forwardedRef === "function") {
12725 forwardedRef(node);
12726 } else if (forwardedRef) {
12727 forwardedRef.current = node;
12728 }
12729 },
12730 [forwardedRef]
12731 );
12732 useIntersectionObserver(elementRef, posinset);
12733 const instanceId = (0, import_compose3.useInstanceId)(GridItem2);
12734 const isSelected2 = selection.includes(id);
12735 const mediaPlaceholder = /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "dataviews-view-grid__media-placeholder" });
12736 const rendersMediaField = showMedia && mediaField?.render;
12737 const renderedMediaField = rendersMediaField ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12738 mediaField.render,
12739 {
12740 item,
12741 field: mediaField,
12742 config
12743 }
12744 ) : mediaPlaceholder;
12745 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(titleField.render, { item, field: titleField }) : null;
12746 let mediaA11yProps;
12747 let titleA11yProps;
12748 if (isItemClickable(item) && onClickItem) {
12749 if (renderedTitleField) {
12750 mediaA11yProps = {
12751 "aria-labelledby": `dataviews-view-grid__title-field-${instanceId}`
12752 };
12753 titleA11yProps = {
12754 id: `dataviews-view-grid__title-field-${instanceId}`
12755 };
12756 } else {
12757 mediaA11yProps = {
12758 "aria-label": (0, import_i18n12.__)("Navigate to item")
12759 };
12760 }
12761 }
12762 return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
12763 Stack,
12764 {
12765 direction: "column",
12766 ...props,
12767 ref: setRefs,
12768 "aria-setsize": setsize,
12769 "aria-posinset": posinset,
12770 className: clsx_default(
12771 props.className,
12772 "dataviews-view-grid__row__gridcell",
12773 "dataviews-view-grid__card",
12774 {
12775 "is-selected": hasBulkAction && isSelected2
12776 }
12777 ),
12778 children: [
12779 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12780 ItemClickWrapper,
12781 {
12782 item,
12783 isItemClickable,
12784 onClickItem,
12785 renderItemLink,
12786 className: clsx_default("dataviews-view-grid__media", {
12787 "dataviews-view-grid__media--placeholder": !rendersMediaField
12788 }),
12789 ...mediaA11yProps,
12790 children: renderedMediaField
12791 }
12792 ),
12793 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12794 DataViewsSelectionCheckbox,
12795 {
12796 item,
12797 selection,
12798 onChangeSelection,
12799 getItemId,
12800 titleField,
12801 disabled: !hasBulkAction
12802 }
12803 ),
12804 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12805 ItemActions,
12806 {
12807 item,
12808 actions,
12809 isCompact: true
12810 }
12811 ) }),
12812 showTitle && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-view-grid__title-actions", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12813 ItemClickWrapper,
12814 {
12815 item,
12816 isItemClickable,
12817 onClickItem,
12818 renderItemLink,
12819 className: "dataviews-view-grid__title-field dataviews-title-field",
12820 ...titleA11yProps,
12821 title: titleField?.getValueFormatted({
12822 item,
12823 field: titleField
12824 }) || void 0,
12825 children: renderedTitleField
12826 }
12827 ) }),
12828 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Stack, { direction: "column", gap: "xs", children: [
12829 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12830 descriptionField.render,
12831 {
12832 item,
12833 field: descriptionField
12834 }
12835 ),
12836 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12837 Stack,
12838 {
12839 direction: "row",
12840 className: "dataviews-view-grid__badge-fields",
12841 gap: "sm",
12842 wrap: "wrap",
12843 align: "top",
12844 justify: "flex-start",
12845 children: badgeFields.map((field) => {
12846 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12847 WCBadge,
12848 {
12849 className: "dataviews-view-grid__field-value",
12850 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12851 field.render,
12852 {
12853 item,
12854 field
12855 }
12856 )
12857 },
12858 field.id
12859 );
12860 })
12861 }
12862 ),
12863 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12864 Stack,
12865 {
12866 direction: "column",
12867 className: "dataviews-view-grid__fields",
12868 gap: "xs",
12869 children: regularFields.map((field) => {
12870 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12871 import_components8.Flex,
12872 {
12873 className: "dataviews-view-grid__field",
12874 gap: 1,
12875 justify: "flex-start",
12876 expanded: true,
12877 style: { height: "auto" },
12878 direction: "row",
12879 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_jsx_runtime59.Fragment, { children: [
12880 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(tooltip_exports.Root, { children: [
12881 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12882 tooltip_exports.Trigger,
12883 {
12884 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components8.FlexItem, { className: "dataviews-view-grid__field-name", children: field.header })
12885 }
12886 ),
12887 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(tooltip_exports.Popup, { children: field.label })
12888 ] }),
12889 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12890 import_components8.FlexItem,
12891 {
12892 className: "dataviews-view-grid__field-value",
12893 style: { maxHeight: "none" },
12894 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12895 field.render,
12896 {
12897 item,
12898 field
12899 }
12900 )
12901 }
12902 )
12903 ] })
12904 },
12905 field.id
12906 );
12907 })
12908 }
12909 )
12910 ] })
12911 ]
12912 }
12913 );
12914 }
12915 );
12916 function CompositeGrid({
12917 data,
12918 isInfiniteScroll,
12919 className,
12920 inert,
12921 isLoading,
12922 view,
12923 fields,
12924 selection,
12925 onChangeSelection,
12926 onClickItem,
12927 isItemClickable,
12928 renderItemLink,
12929 getItemId,
12930 actions,
12931 getSelectionProps
12932 }) {
12933 const { paginationInfo, resizeObserverRef } = (0, import_element39.useContext)(dataviews_context_default);
12934 const gridColumns = useGridColumns();
12935 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
12936 const titleField = fields.find(
12937 (field) => field.id === view?.titleField
12938 );
12939 const mediaField = fields.find(
12940 (field) => field.id === view?.mediaField
12941 );
12942 const descriptionField = fields.find(
12943 (field) => field.id === view?.descriptionField
12944 );
12945 const otherFields = view.fields ?? [];
12946 const { regularFields, badgeFields } = otherFields.reduce(
12947 (accumulator, fieldId) => {
12948 const field = fields.find((f2) => f2.id === fieldId);
12949 if (!field) {
12950 return accumulator;
12951 }
12952 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
12953 accumulator[key].push(field);
12954 return accumulator;
12955 },
12956 { regularFields: [], badgeFields: [] }
12957 );
12958 const size4 = "900px";
12959 const totalRows = Math.ceil(data.length / gridColumns);
12960 const placeholdersNeeded = usePlaceholdersNeeded(
12961 data,
12962 isInfiniteScroll,
12963 gridColumns
12964 );
12965 return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_jsx_runtime59.Fragment, {
12966 // Render infinite scroll layout (no rows, feed semantics)
12967 children: [
12968 isInfiniteScroll && /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
12969 import_components8.Composite,
12970 {
12971 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12972 GridItems,
12973 {
12974 className: clsx_default(
12975 "dataviews-view-grid-infinite-scroll",
12976 className,
12977 {
12978 [`has-${view.layout?.density}-density`]: view.layout?.density && [
12979 "compact",
12980 "comfortable"
12981 ].includes(view.layout.density)
12982 }
12983 ),
12984 previewSize: view.layout?.previewSize,
12985 "aria-busy": isLoading,
12986 ref: resizeObserverRef
12987 }
12988 ),
12989 role: "feed",
12990 focusWrap: true,
12991 inert,
12992 children: [
12993 Array.from({ length: placeholdersNeeded }).map(
12994 (_, index2) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12995 import_components8.Composite.Item,
12996 {
12997 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12998 Stack,
12999 {
13000 ...props,
13001 direction: "column",
13002 role: "article",
13003 className: "dataviews-view-grid__row__gridcell dataviews-view-grid__card dataviews-view-grid__placeholder"
13004 }
13005 ),
13006 "aria-hidden": true,
13007 tabIndex: -1
13008 },
13009 `placeholder-${index2}`
13010 )
13011 ),
13012 data.map((item) => {
13013 const itemId = getItemId(item);
13014 const selectionProps = getSelectionProps(itemId);
13015 const stablePosition = item.position;
13016 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13017 import_components8.Composite.Item,
13018 {
13019 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13020 GridItem,
13021 {
13022 ...props,
13023 id: itemId,
13024 role: "article",
13025 view,
13026 selection,
13027 onChangeSelection,
13028 onClickItem,
13029 isItemClickable,
13030 renderItemLink,
13031 getItemId,
13032 item,
13033 actions,
13034 onMouseDown: (event) => {
13035 props.onMouseDown?.(event);
13036 selectionProps.onMouseDown(
13037 event
13038 );
13039 },
13040 onClickCapture: (event) => {
13041 props.onClickCapture?.(event);
13042 selectionProps.onClickCapture(
13043 event
13044 );
13045 },
13046 mediaField,
13047 titleField,
13048 descriptionField,
13049 regularFields,
13050 badgeFields,
13051 hasBulkActions,
13052 posinset: stablePosition,
13053 setsize: paginationInfo.totalItems,
13054 config: {
13055 sizes: size4
13056 }
13057 }
13058 )
13059 },
13060 itemId
13061 );
13062 })
13063 ]
13064 }
13065 ),
13066 // Render standard grid layout (with rows, grid semantics)
13067 !isInfiniteScroll && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13068 import_components8.Composite,
13069 {
13070 role: "grid",
13071 className: clsx_default("dataviews-view-grid", className, {
13072 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
13073 view.layout.density
13074 )
13075 }),
13076 focusWrap: true,
13077 "aria-busy": isLoading,
13078 "aria-rowcount": totalRows,
13079 ref: resizeObserverRef,
13080 inert,
13081 children: chunk(data, gridColumns).map((row, i2) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13082 import_components8.Composite.Row,
13083 {
13084 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13085 "div",
13086 {
13087 role: "row",
13088 "aria-rowindex": i2 + 1,
13089 "aria-label": (0, import_i18n12.sprintf)(
13090 /* translators: %d: The row number in the grid */
13091 (0, import_i18n12.__)("Row %d"),
13092 i2 + 1
13093 ),
13094 className: "dataviews-view-grid__row",
13095 style: {
13096 gridTemplateColumns: `repeat( ${gridColumns}, minmax(0, 1fr) )`
13097 }
13098 }
13099 ),
13100 children: row.map((item) => {
13101 const itemId = getItemId(item);
13102 const selectionProps = getSelectionProps(itemId);
13103 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13104 import_components8.Composite.Item,
13105 {
13106 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13107 GridItem,
13108 {
13109 ...props,
13110 id: itemId,
13111 role: "gridcell",
13112 view,
13113 selection,
13114 onChangeSelection,
13115 onClickItem,
13116 isItemClickable,
13117 renderItemLink,
13118 getItemId,
13119 item,
13120 actions,
13121 onMouseDown: (event) => {
13122 props.onMouseDown?.(
13123 event
13124 );
13125 selectionProps.onMouseDown(
13126 event
13127 );
13128 },
13129 onClickCapture: (event) => {
13130 props.onClickCapture?.(
13131 event
13132 );
13133 selectionProps.onClickCapture(
13134 event
13135 );
13136 },
13137 mediaField,
13138 titleField,
13139 descriptionField,
13140 regularFields,
13141 badgeFields,
13142 hasBulkActions,
13143 config: {
13144 sizes: size4
13145 }
13146 }
13147 )
13148 },
13149 itemId
13150 );
13151 })
13152 },
13153 i2
13154 ))
13155 }
13156 )
13157 ]
13158 });
13159 }
13160
13161 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
13162 var import_jsx_runtime60 = __toESM(require_jsx_runtime(), 1);
13163 function ViewGrid({
13164 actions,
13165 data,
13166 fields,
13167 getItemId,
13168 isLoading,
13169 onChangeSelection,
13170 onClickItem,
13171 isItemClickable,
13172 renderItemLink,
13173 selection,
13174 view,
13175 className,
13176 empty
13177 }) {
13178 const isDelayedLoading = useDelayedLoading(!!isLoading);
13179 const hasData = !!data?.length;
13180 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
13181 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
13182 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
13183 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
13184 const { getSelectionProps } = useSelectionProps({
13185 data: orderedData,
13186 actions,
13187 getItemId,
13188 selection,
13189 onChangeSelection
13190 });
13191 if (!hasData) {
13192 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
13193 "div",
13194 {
13195 className: clsx_default("dataviews-no-results", {
13196 "is-refreshing": isDelayedLoading
13197 }),
13198 children: empty
13199 }
13200 );
13201 }
13202 const gridProps = {
13203 className: clsx_default(className, {
13204 "is-refreshing": !isInfiniteScroll && isDelayedLoading
13205 }),
13206 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0,
13207 isLoading,
13208 view,
13209 fields,
13210 selection,
13211 onChangeSelection,
13212 onClickItem,
13213 isItemClickable,
13214 renderItemLink,
13215 getItemId,
13216 actions,
13217 getSelectionProps
13218 };
13219 return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_jsx_runtime60.Fragment, {
13220 // Render multiple groups.
13221 children: [
13222 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Stack, { direction: "column", gap: "lg", children: Array.from(dataByGroup.entries()).map(
13223 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
13224 Stack,
13225 {
13226 direction: "column",
13227 gap: "sm",
13228 children: [
13229 /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("h3", { className: "dataviews-view-grid__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n13.sprintf)(
13230 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
13231 (0, import_i18n13.__)("%1$s: %2$s"),
13232 groupField.label,
13233 groupName
13234 ) }),
13235 /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
13236 CompositeGrid,
13237 {
13238 ...gridProps,
13239 data: groupItems,
13240 isInfiniteScroll: false
13241 }
13242 )
13243 ]
13244 },
13245 groupName
13246 )
13247 ) }),
13248 // Render a single grid with all data.
13249 !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
13250 CompositeGrid,
13251 {
13252 ...gridProps,
13253 data,
13254 isInfiniteScroll: !!isInfiniteScroll
13255 }
13256 ),
13257 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_components9.Spinner, {}) })
13258 ]
13259 });
13260 }
13261 var grid_default = ViewGrid;
13262
13263 // packages/dataviews/build-module/components/dataviews-layouts/list/index.mjs
13264 var import_compose4 = __toESM(require_compose(), 1);
13265 var import_components10 = __toESM(require_components(), 1);
13266 var import_element40 = __toESM(require_element(), 1);
13267 var import_i18n14 = __toESM(require_i18n(), 1);
13268 var import_data3 = __toESM(require_data(), 1);
13269 var import_jsx_runtime61 = __toESM(require_jsx_runtime(), 1);
13270 var { Menu: Menu3 } = unlock2(import_components10.privateApis);
13271 function generateItemWrapperCompositeId(idPrefix) {
13272 return `${idPrefix}-item-wrapper`;
13273 }
13274 function generatePrimaryActionCompositeId(idPrefix, primaryActionId) {
13275 return `${idPrefix}-primary-action-${primaryActionId}`;
13276 }
13277 function generateDropdownTriggerCompositeId(idPrefix) {
13278 return `${idPrefix}-dropdown`;
13279 }
13280 function PrimaryActionGridCell({
13281 idPrefix,
13282 primaryAction,
13283 item
13284 }) {
13285 const registry = (0, import_data3.useRegistry)();
13286 const [isModalOpen, setIsModalOpen] = (0, import_element40.useState)(false);
13287 const compositeItemId = generatePrimaryActionCompositeId(
13288 idPrefix,
13289 primaryAction.id
13290 );
13291 const label = typeof primaryAction.label === "string" ? primaryAction.label : primaryAction.label([item]);
13292 return "RenderModal" in primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13293 import_components10.Composite.Item,
13294 {
13295 id: compositeItemId,
13296 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13297 import_components10.Button,
13298 {
13299 disabled: !!primaryAction.disabled,
13300 accessibleWhenDisabled: true,
13301 text: label,
13302 size: "small",
13303 onClick: () => setIsModalOpen(true)
13304 }
13305 ),
13306 children: isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13307 ActionModal,
13308 {
13309 action: primaryAction,
13310 items: [item],
13311 closeModal: () => setIsModalOpen(false)
13312 }
13313 )
13314 }
13315 ) }, primaryAction.id) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13316 import_components10.Composite.Item,
13317 {
13318 id: compositeItemId,
13319 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13320 import_components10.Button,
13321 {
13322 disabled: !!primaryAction.disabled,
13323 accessibleWhenDisabled: true,
13324 size: "small",
13325 onClick: () => {
13326 primaryAction.callback([item], { registry });
13327 },
13328 children: label
13329 }
13330 )
13331 }
13332 ) }, primaryAction.id);
13333 }
13334 function ListItem({
13335 view,
13336 actions,
13337 idPrefix,
13338 isSelected: isSelected2,
13339 item,
13340 titleField,
13341 mediaField,
13342 descriptionField,
13343 onSelect,
13344 otherFields,
13345 onDropdownTriggerKeyDown,
13346 posinset
13347 }) {
13348 const {
13349 showTitle = true,
13350 showMedia = true,
13351 showDescription = true,
13352 infiniteScrollEnabled
13353 } = view;
13354 const itemRef = (0, import_element40.useRef)(null);
13355 const labelId = `${idPrefix}-label`;
13356 const descriptionId = `${idPrefix}-description`;
13357 const registry = (0, import_data3.useRegistry)();
13358 const [isHovered, setIsHovered] = (0, import_element40.useState)(false);
13359 const [activeModalAction, setActiveModalAction] = (0, import_element40.useState)(
13360 null
13361 );
13362 const handleHover = ({ type }) => {
13363 const isHover = type === "mouseenter";
13364 setIsHovered(isHover);
13365 };
13366 const { paginationInfo } = (0, import_element40.useContext)(dataviews_context_default);
13367 (0, import_element40.useEffect)(() => {
13368 if (isSelected2) {
13369 itemRef.current?.scrollIntoView({
13370 behavior: "auto",
13371 block: "nearest",
13372 inline: "nearest"
13373 });
13374 }
13375 }, [isSelected2]);
13376 const { primaryAction, eligibleActions } = (0, import_element40.useMemo)(() => {
13377 const _eligibleActions = actions.filter(
13378 (action) => !action.isEligible || action.isEligible(item)
13379 );
13380 const _primaryActions = _eligibleActions.filter(
13381 (action) => action.isPrimary
13382 );
13383 return {
13384 primaryAction: _primaryActions[0],
13385 eligibleActions: _eligibleActions
13386 };
13387 }, [actions, item]);
13388 const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1;
13389 const renderedMediaField = showMedia && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-view-list__media-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13390 mediaField.render,
13391 {
13392 item,
13393 field: mediaField,
13394 config: { sizes: "52px" }
13395 }
13396 ) }) : null;
13397 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(titleField.render, { item, field: titleField }) : null;
13398 const renderDescription = showDescription && descriptionField?.render;
13399 const hasOnlyMediaAndTitle = !!renderedMediaField && !renderDescription && !otherFields.length;
13400 const usedActions = eligibleActions?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
13401 Stack,
13402 {
13403 direction: "row",
13404 gap: "md",
13405 className: "dataviews-view-list__item-actions",
13406 children: [
13407 primaryAction && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13408 PrimaryActionGridCell,
13409 {
13410 idPrefix,
13411 primaryAction,
13412 item
13413 }
13414 ),
13415 !hasOnlyOnePrimaryAction && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { role: "gridcell", children: [
13416 /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(Menu3, { placement: "bottom-end", children: [
13417 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13418 Menu3.TriggerButton,
13419 {
13420 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13421 import_components10.Composite.Item,
13422 {
13423 id: generateDropdownTriggerCompositeId(
13424 idPrefix
13425 ),
13426 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13427 import_components10.Button,
13428 {
13429 size: "small",
13430 icon: more_vertical_default,
13431 label: (0, import_i18n14.__)("Actions"),
13432 accessibleWhenDisabled: true,
13433 disabled: !actions.length,
13434 onKeyDown: onDropdownTriggerKeyDown
13435 }
13436 )
13437 }
13438 )
13439 }
13440 ),
13441 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(Menu3.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13442 ActionsMenuGroup,
13443 {
13444 actions: eligibleActions,
13445 item,
13446 registry,
13447 setActiveModalAction
13448 }
13449 ) })
13450 ] }),
13451 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13452 ActionModal,
13453 {
13454 action: activeModalAction,
13455 items: [item],
13456 closeModal: () => setActiveModalAction(null)
13457 }
13458 )
13459 ] })
13460 ]
13461 }
13462 );
13463 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13464 import_components10.Composite.Row,
13465 {
13466 ref: itemRef,
13467 render: (
13468 /* aria-posinset breaks Composite.Row if passed to it directly. */
13469 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13470 "div",
13471 {
13472 "aria-posinset": posinset,
13473 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0
13474 }
13475 )
13476 ),
13477 role: infiniteScrollEnabled ? "article" : "row",
13478 className: clsx_default({
13479 "is-selected": isSelected2,
13480 "is-hovered": isHovered
13481 }),
13482 onMouseEnter: handleHover,
13483 onMouseLeave: handleHover,
13484 children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
13485 Stack,
13486 {
13487 direction: "row",
13488 className: "dataviews-view-list__item-wrapper",
13489 children: [
13490 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13491 import_components10.Composite.Item,
13492 {
13493 id: generateItemWrapperCompositeId(idPrefix),
13494 "aria-pressed": isSelected2,
13495 "aria-labelledby": labelId,
13496 "aria-describedby": descriptionId,
13497 className: "dataviews-view-list__item",
13498 onClick: () => onSelect(item)
13499 }
13500 ) }),
13501 /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
13502 Stack,
13503 {
13504 direction: "row",
13505 gap: "md",
13506 justify: "start",
13507 align: hasOnlyMediaAndTitle ? "center" : "flex-start",
13508 style: { flex: 1, minWidth: 0 },
13509 children: [
13510 renderedMediaField,
13511 /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
13512 Stack,
13513 {
13514 direction: "column",
13515 gap: "xs",
13516 className: "dataviews-view-list__field-wrapper",
13517 children: [
13518 /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(Stack, { direction: "row", align: "center", children: [
13519 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13520 "div",
13521 {
13522 className: "dataviews-title-field dataviews-view-list__title-field",
13523 id: labelId,
13524 children: renderedTitleField
13525 }
13526 ),
13527 usedActions
13528 ] }),
13529 renderDescription && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-view-list__field", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13530 descriptionField.render,
13531 {
13532 item,
13533 field: descriptionField
13534 }
13535 ) }),
13536 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13537 "div",
13538 {
13539 className: "dataviews-view-list__fields",
13540 id: descriptionId,
13541 children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
13542 "div",
13543 {
13544 className: "dataviews-view-list__field",
13545 children: [
13546 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13547 VisuallyHidden,
13548 {
13549 className: "dataviews-view-list__field-label",
13550 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", {}),
13551 children: field.label
13552 }
13553 ),
13554 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "dataviews-view-list__field-value", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13555 field.render,
13556 {
13557 item,
13558 field
13559 }
13560 ) })
13561 ]
13562 },
13563 field.id
13564 ))
13565 }
13566 )
13567 ]
13568 }
13569 )
13570 ]
13571 }
13572 )
13573 ]
13574 }
13575 )
13576 }
13577 );
13578 }
13579 function isDefined2(item) {
13580 return !!item;
13581 }
13582 function ViewList(props) {
13583 const {
13584 actions,
13585 data,
13586 fields,
13587 getItemId,
13588 isLoading,
13589 onChangeSelection,
13590 selection,
13591 view,
13592 className,
13593 empty
13594 } = props;
13595 const baseId = (0, import_compose4.useInstanceId)(ViewList, "view-list");
13596 const isDelayedLoading = useDelayedLoading(!!isLoading);
13597 const { paginationInfo } = (0, import_element40.useContext)(dataviews_context_default);
13598 const selectedItem = data?.findLast(
13599 (item) => selection.includes(getItemId(item))
13600 );
13601 const titleField = fields.find((field) => field.id === view.titleField);
13602 const mediaField = fields.find((field) => field.id === view.mediaField);
13603 const descriptionField = fields.find(
13604 (field) => field.id === view.descriptionField
13605 );
13606 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined2);
13607 const onSelect = (item) => onChangeSelection([getItemId(item)]);
13608 const generateCompositeItemIdPrefix = (0, import_element40.useCallback)(
13609 (item) => `${baseId}-${getItemId(item)}`,
13610 [baseId, getItemId]
13611 );
13612 const isActiveCompositeItem = (0, import_element40.useCallback)(
13613 (item, idToCheck) => {
13614 return idToCheck.startsWith(
13615 generateCompositeItemIdPrefix(item)
13616 );
13617 },
13618 [generateCompositeItemIdPrefix]
13619 );
13620 const [activeCompositeId, setActiveCompositeId] = (0, import_element40.useState)(void 0);
13621 const compositeRef = (0, import_element40.useRef)(null);
13622 (0, import_element40.useEffect)(() => {
13623 if (selectedItem) {
13624 setActiveCompositeId(
13625 generateItemWrapperCompositeId(
13626 generateCompositeItemIdPrefix(selectedItem)
13627 )
13628 );
13629 }
13630 }, [selectedItem, generateCompositeItemIdPrefix]);
13631 const activeItemIndex = data.findIndex(
13632 (item) => isActiveCompositeItem(item, activeCompositeId ?? "")
13633 );
13634 const previousActiveItemIndex = (0, import_compose4.usePrevious)(activeItemIndex);
13635 const isActiveIdInList = activeItemIndex !== -1;
13636 const selectCompositeItem = (0, import_element40.useCallback)(
13637 (targetIndex, generateCompositeId) => {
13638 const clampedIndex = Math.min(
13639 data.length - 1,
13640 Math.max(0, targetIndex)
13641 );
13642 if (!data[clampedIndex]) {
13643 return;
13644 }
13645 const itemIdPrefix = generateCompositeItemIdPrefix(
13646 data[clampedIndex]
13647 );
13648 const targetCompositeItemId = generateCompositeId(itemIdPrefix);
13649 setActiveCompositeId(targetCompositeItemId);
13650 if (compositeRef.current?.contains(
13651 compositeRef.current.ownerDocument.activeElement
13652 )) {
13653 document.getElementById(targetCompositeItemId)?.focus();
13654 }
13655 },
13656 [data, generateCompositeItemIdPrefix]
13657 );
13658 (0, import_element40.useEffect)(() => {
13659 const wasActiveIdInList = previousActiveItemIndex !== void 0 && previousActiveItemIndex !== -1;
13660 if (!isActiveIdInList && wasActiveIdInList) {
13661 selectCompositeItem(
13662 previousActiveItemIndex,
13663 generateItemWrapperCompositeId
13664 );
13665 }
13666 }, [isActiveIdInList, selectCompositeItem, previousActiveItemIndex]);
13667 const onDropdownTriggerKeyDown = (0, import_element40.useCallback)(
13668 (event) => {
13669 if (event.key === "ArrowDown") {
13670 event.preventDefault();
13671 selectCompositeItem(
13672 activeItemIndex + 1,
13673 generateDropdownTriggerCompositeId
13674 );
13675 }
13676 if (event.key === "ArrowUp") {
13677 event.preventDefault();
13678 selectCompositeItem(
13679 activeItemIndex - 1,
13680 generateDropdownTriggerCompositeId
13681 );
13682 }
13683 },
13684 [selectCompositeItem, activeItemIndex]
13685 );
13686 const hasData = !!data?.length;
13687 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
13688 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
13689 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
13690 const hasMoreItems = isInfiniteScroll && (view.startPosition ?? 1) + (view.perPage ?? 0) < paginationInfo.totalItems;
13691 const listClassName = clsx_default("dataviews-view-list", className, {
13692 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(view.layout.density),
13693 "is-refreshing": !isInfiniteScroll && isDelayedLoading
13694 });
13695 const compositeProps = {
13696 ref: compositeRef,
13697 id: baseId,
13698 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", {}),
13699 activeId: activeCompositeId,
13700 setActiveId: setActiveCompositeId,
13701 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0
13702 };
13703 if (!hasData) {
13704 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13705 "div",
13706 {
13707 className: clsx_default("dataviews-no-results", {
13708 "is-refreshing": isDelayedLoading
13709 }),
13710 children: empty
13711 }
13712 );
13713 }
13714 if (hasData && groupField && dataByGroup) {
13715 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13716 import_components10.Composite,
13717 {
13718 ...compositeProps,
13719 className: "dataviews-view-list__group",
13720 role: "grid",
13721 children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(Stack, { direction: "column", gap: "lg", className: listClassName, children: Array.from(dataByGroup.entries()).map(
13722 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(Stack, { direction: "column", children: [
13723 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("h3", { className: "dataviews-view-list__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n14.sprintf)(
13724 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
13725 (0, import_i18n14.__)("%1$s: %2$s"),
13726 groupField.label,
13727 groupName
13728 ) }),
13729 groupItems.map((item) => {
13730 const id = generateCompositeItemIdPrefix(item);
13731 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13732 ListItem,
13733 {
13734 view,
13735 idPrefix: id,
13736 actions,
13737 item,
13738 isSelected: item === selectedItem,
13739 onSelect,
13740 mediaField,
13741 titleField,
13742 descriptionField,
13743 otherFields,
13744 onDropdownTriggerKeyDown
13745 },
13746 id
13747 );
13748 })
13749 ] }, groupName)
13750 ) })
13751 }
13752 );
13753 }
13754 return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
13755 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13756 import_components10.Composite,
13757 {
13758 ...compositeProps,
13759 className: listClassName,
13760 role: view.infiniteScrollEnabled ? "feed" : "grid",
13761 children: data.map((item, index2) => {
13762 const id = generateCompositeItemIdPrefix(item);
13763 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13764 ListItem,
13765 {
13766 view,
13767 idPrefix: id,
13768 actions,
13769 item,
13770 isSelected: item === selectedItem,
13771 onSelect,
13772 mediaField,
13773 titleField,
13774 descriptionField,
13775 otherFields,
13776 onDropdownTriggerKeyDown,
13777 posinset: view.infiniteScrollEnabled ? index2 + 1 : void 0
13778 },
13779 id
13780 );
13781 })
13782 }
13783 ),
13784 (hasMoreItems || isInfiniteScroll && isLoading) && // Keep the spinner's height reserved while loading more so the
13785 // scroll position doesn't bounce. Hidden, and silent to a11y,
13786 // while idle.
13787 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13788 "p",
13789 {
13790 className: "dataviews-loading-more",
13791 "aria-hidden": !isLoading,
13792 children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_components10.Spinner, {})
13793 }
13794 )
13795 ] });
13796 }
13797
13798 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
13799 var import_components11 = __toESM(require_components(), 1);
13800
13801 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-group.mjs
13802 var import_i18n15 = __toESM(require_i18n(), 1);
13803 var import_element41 = __toESM(require_element(), 1);
13804 var import_jsx_runtime62 = __toESM(require_jsx_runtime(), 1);
13805 function ActivityGroup({
13806 groupName,
13807 groupData,
13808 groupField,
13809 showLabel = true,
13810 children
13811 }) {
13812 const groupHeader = showLabel ? (0, import_element41.createInterpolateElement)(
13813 // translators: %s: The label of the field e.g. "Status".
13814 (0, import_i18n15.sprintf)((0, import_i18n15.__)("%s: <groupName />"), groupField.label).trim(),
13815 {
13816 groupName: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
13817 groupField.render,
13818 {
13819 item: groupData[0],
13820 field: groupField
13821 }
13822 )
13823 }
13824 ) : /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(groupField.render, { item: groupData[0], field: groupField });
13825 return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
13826 Stack,
13827 {
13828 direction: "column",
13829 className: "dataviews-view-activity__group",
13830 children: [
13831 /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("h3", { className: "dataviews-view-activity__group-header", children: groupHeader }),
13832 children
13833 ]
13834 },
13835 groupName
13836 );
13837 }
13838
13839 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-item.mjs
13840 var import_element42 = __toESM(require_element(), 1);
13841 var import_data4 = __toESM(require_data(), 1);
13842 var import_compose5 = __toESM(require_compose(), 1);
13843 var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
13844 function ActivityItem(props) {
13845 const {
13846 view,
13847 actions,
13848 item,
13849 titleField,
13850 mediaField,
13851 descriptionField,
13852 otherFields,
13853 posinset,
13854 onClickItem,
13855 renderItemLink,
13856 isItemClickable
13857 } = props;
13858 const {
13859 showTitle = true,
13860 showMedia = true,
13861 showDescription = true,
13862 infiniteScrollEnabled
13863 } = view;
13864 const itemRef = (0, import_element42.useRef)(null);
13865 const registry = (0, import_data4.useRegistry)();
13866 const { paginationInfo } = (0, import_element42.useContext)(dataviews_context_default);
13867 const { primaryActions, eligibleActions } = (0, import_element42.useMemo)(() => {
13868 const _eligibleActions = actions.filter(
13869 (action) => !action.isEligible || action.isEligible(item)
13870 );
13871 const _primaryActions = _eligibleActions.filter(
13872 (action) => action.isPrimary
13873 );
13874 return {
13875 primaryActions: _primaryActions,
13876 eligibleActions: _eligibleActions
13877 };
13878 }, [actions, item]);
13879 const isMobileViewport = (0, import_compose5.useViewportMatch)("medium", "<");
13880 const density = view.layout?.density ?? "balanced";
13881 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13882 mediaField.render,
13883 {
13884 item,
13885 field: mediaField,
13886 config: {
13887 sizes: density === "comfortable" ? "32px" : "24px"
13888 }
13889 }
13890 ) : null;
13891 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "dataviews-view-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13892 "span",
13893 {
13894 className: "dataviews-view-activity__item-bullet",
13895 "aria-hidden": "true"
13896 }
13897 ) });
13898 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(titleField.render, { item, field: titleField }) : null;
13899 const verticalGap = (0, import_element42.useMemo)(() => {
13900 switch (density) {
13901 case "comfortable":
13902 return "md";
13903 default:
13904 return "sm";
13905 }
13906 }, [density]);
13907 return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13908 "div",
13909 {
13910 ref: itemRef,
13911 role: infiniteScrollEnabled ? "article" : void 0,
13912 "aria-posinset": posinset,
13913 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
13914 className: clsx_default(
13915 "dataviews-view-activity__item",
13916 density === "compact" && "is-compact",
13917 density === "balanced" && "is-balanced",
13918 density === "comfortable" && "is-comfortable"
13919 ),
13920 children: /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(Stack, { direction: "row", gap: "lg", justify: "start", align: "flex-start", children: [
13921 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13922 Stack,
13923 {
13924 direction: "column",
13925 gap: "xs",
13926 align: "center",
13927 className: "dataviews-view-activity__item-type",
13928 children: renderedMediaField
13929 }
13930 ),
13931 /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
13932 Stack,
13933 {
13934 direction: "column",
13935 gap: verticalGap,
13936 align: "flex-start",
13937 className: "dataviews-view-activity__item-content",
13938 children: [
13939 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13940 ItemClickWrapper,
13941 {
13942 item,
13943 isItemClickable,
13944 onClickItem,
13945 renderItemLink,
13946 className: "dataviews-view-activity__item-title",
13947 children: renderedTitleField
13948 }
13949 ),
13950 showDescription && descriptionField && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "dataviews-view-activity__item-description", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13951 descriptionField.render,
13952 {
13953 item,
13954 field: descriptionField
13955 }
13956 ) }),
13957 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "dataviews-view-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
13958 "div",
13959 {
13960 className: "dataviews-view-activity__item-field",
13961 children: [
13962 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13963 VisuallyHidden,
13964 {
13965 className: "dataviews-view-activity__item-field-label",
13966 render: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", {}),
13967 children: field.label
13968 }
13969 ),
13970 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "dataviews-view-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13971 field.render,
13972 {
13973 item,
13974 field
13975 }
13976 ) })
13977 ]
13978 },
13979 field.id
13980 )) }),
13981 !!primaryActions?.length && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13982 PrimaryActions,
13983 {
13984 item,
13985 actions: primaryActions,
13986 registry,
13987 buttonVariant: "secondary"
13988 }
13989 )
13990 ]
13991 }
13992 ),
13993 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
13994 // there if there are any actions at all.
13995 isMobileViewport && // At the same time, only show the menu if there are actions to show.
13996 eligibleActions.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "dataviews-view-activity__item-actions", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13997 ItemActions,
13998 {
13999 item,
14000 actions: eligibleActions,
14001 isCompact: true
14002 }
14003 ) })
14004 ] })
14005 }
14006 );
14007 }
14008 var activity_item_default = ActivityItem;
14009
14010 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-items.mjs
14011 var import_react10 = __toESM(require_react(), 1);
14012 function isDefined3(item) {
14013 return !!item;
14014 }
14015 function ActivityItems(props) {
14016 const { data, fields, getItemId, view } = props;
14017 const titleField = fields.find((field) => field.id === view.titleField);
14018 const mediaField = fields.find((field) => field.id === view.mediaField);
14019 const descriptionField = fields.find(
14020 (field) => field.id === view.descriptionField
14021 );
14022 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined3);
14023 return data.map((item, index2) => {
14024 return /* @__PURE__ */ (0, import_react10.createElement)(
14025 activity_item_default,
14026 {
14027 ...props,
14028 key: getItemId(item),
14029 item,
14030 mediaField,
14031 titleField,
14032 descriptionField,
14033 otherFields,
14034 posinset: view.infiniteScrollEnabled ? index2 + 1 : void 0
14035 }
14036 );
14037 });
14038 }
14039
14040 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
14041 var import_jsx_runtime64 = __toESM(require_jsx_runtime(), 1);
14042 function ViewActivity(props) {
14043 const { empty, data, fields, isLoading, view, className } = props;
14044 const isDelayedLoading = useDelayedLoading(!!isLoading);
14045 const hasData = !!data?.length;
14046 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
14047 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
14048 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
14049 if (!hasData) {
14050 return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
14051 "div",
14052 {
14053 className: clsx_default("dataviews-no-results", {
14054 "is-refreshing": isDelayedLoading
14055 }),
14056 children: empty
14057 }
14058 );
14059 }
14060 const isInert = !isInfiniteScroll && !!isLoading;
14061 const wrapperClassName = clsx_default("dataviews-view-activity", className, {
14062 "is-refreshing": !isInfiniteScroll && isDelayedLoading
14063 });
14064 const groupedEntries = dataByGroup ? Array.from(dataByGroup.entries()) : [];
14065 if (hasData && groupField && dataByGroup) {
14066 return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
14067 Stack,
14068 {
14069 direction: "column",
14070 gap: "sm",
14071 className: wrapperClassName,
14072 inert: isInert ? "true" : void 0,
14073 children: groupedEntries.map(
14074 ([groupName, groupData]) => /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
14075 ActivityGroup,
14076 {
14077 groupName,
14078 groupData,
14079 groupField,
14080 showLabel: view.groupBy?.showLabel !== false,
14081 children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
14082 ActivityItems,
14083 {
14084 ...props,
14085 data: groupData
14086 }
14087 )
14088 },
14089 groupName
14090 )
14091 )
14092 }
14093 );
14094 }
14095 return /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(import_jsx_runtime64.Fragment, { children: [
14096 /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
14097 "div",
14098 {
14099 className: wrapperClassName,
14100 role: view.infiniteScrollEnabled ? "feed" : void 0,
14101 inert: isInert ? "true" : void 0,
14102 children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(ActivityItems, { ...props })
14103 }
14104 ),
14105 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_components11.Spinner, {}) })
14106 ] });
14107 }
14108
14109 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
14110 var import_components14 = __toESM(require_components(), 1);
14111 var import_i18n18 = __toESM(require_i18n(), 1);
14112 var import_compose6 = __toESM(require_compose(), 1);
14113 var import_element45 = __toESM(require_element(), 1);
14114
14115 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
14116 var import_components13 = __toESM(require_components(), 1);
14117 var import_data5 = __toESM(require_data(), 1);
14118 var import_element44 = __toESM(require_element(), 1);
14119 var import_i18n17 = __toESM(require_i18n(), 1);
14120
14121 // packages/dataviews/build-module/components/dataviews-pagination/index.mjs
14122 var import_components12 = __toESM(require_components(), 1);
14123 var import_element43 = __toESM(require_element(), 1);
14124 var import_i18n16 = __toESM(require_i18n(), 1);
14125 var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
14126 function hasPaginationControls(view, paginationInfo) {
14127 return !view.infiniteScrollEnabled && paginationInfo.totalItems > 0 && paginationInfo.totalPages > 1;
14128 }
14129 function DataViewsPagination() {
14130 const { view, onChangeView, paginationInfo } = (0, import_element43.useContext)(dataviews_context_default);
14131 if (!hasPaginationControls(view, paginationInfo)) {
14132 return null;
14133 }
14134 const { totalPages } = paginationInfo;
14135 const currentPage = view.page ?? 1;
14136 const pageSelectOptions = Array.from(Array(totalPages)).map(
14137 (_, i2) => {
14138 const page = i2 + 1;
14139 return {
14140 value: page.toString(),
14141 label: page.toString(),
14142 "aria-label": currentPage === page ? (0, import_i18n16.sprintf)(
14143 // translators: 1: current page number. 2: total number of pages.
14144 (0, import_i18n16.__)("Page %1$d of %2$d"),
14145 currentPage,
14146 totalPages
14147 ) : page.toString()
14148 };
14149 }
14150 );
14151 return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
14152 Stack,
14153 {
14154 direction: "row",
14155 className: "dataviews-pagination",
14156 justify: "end",
14157 align: "center",
14158 gap: "xl",
14159 children: [
14160 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14161 Stack,
14162 {
14163 direction: "row",
14164 justify: "flex-start",
14165 align: "center",
14166 gap: "xs",
14167 className: "dataviews-pagination__page-select",
14168 children: (0, import_element43.createInterpolateElement)(
14169 (0, import_i18n16.sprintf)(
14170 // translators: 1: Current page number, 2: Total number of pages.
14171 (0, import_i18n16._x)("<div>Page</div>%1$s<div>of %2$d</div>", "paging"),
14172 "<CurrentPage />",
14173 totalPages
14174 ),
14175 {
14176 div: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { "aria-hidden": true }),
14177 // @ts-expect-error — Tag injected via sprintf argument, not visible in format string.
14178 CurrentPage: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14179 import_components12.SelectControl,
14180 {
14181 "aria-label": (0, import_i18n16.__)("Current page"),
14182 value: currentPage.toString(),
14183 options: pageSelectOptions,
14184 onChange: (newValue) => {
14185 onChangeView({
14186 ...view,
14187 page: +newValue
14188 });
14189 },
14190 size: "small",
14191 variant: "minimal"
14192 }
14193 )
14194 }
14195 )
14196 }
14197 ),
14198 /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(Stack, { direction: "row", gap: "xs", align: "center", children: [
14199 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14200 import_components12.Button,
14201 {
14202 onClick: () => onChangeView({
14203 ...view,
14204 page: currentPage - 1
14205 }),
14206 disabled: currentPage === 1,
14207 accessibleWhenDisabled: true,
14208 label: (0, import_i18n16.__)("Previous page"),
14209 icon: (0, import_i18n16.isRTL)() ? next_default : previous_default,
14210 showTooltip: true,
14211 size: "compact",
14212 tooltipPosition: "top"
14213 }
14214 ),
14215 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14216 import_components12.Button,
14217 {
14218 onClick: () => onChangeView({ ...view, page: currentPage + 1 }),
14219 disabled: currentPage >= totalPages,
14220 accessibleWhenDisabled: true,
14221 label: (0, import_i18n16.__)("Next page"),
14222 icon: (0, import_i18n16.isRTL)() ? previous_default : next_default,
14223 showTooltip: true,
14224 size: "compact",
14225 tooltipPosition: "top"
14226 }
14227 )
14228 ] })
14229 ]
14230 }
14231 );
14232 }
14233 var dataviews_pagination_default = (0, import_element43.memo)(DataViewsPagination);
14234
14235 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
14236 var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
14237 function useIsMultiselectPicker(actions) {
14238 return (0, import_element44.useMemo)(() => {
14239 return !!actions?.length && actions?.every((action) => action.supportsBulk);
14240 }, [actions]);
14241 }
14242
14243 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
14244 var import_jsx_runtime67 = __toESM(require_jsx_runtime(), 1);
14245 var { Badge: WCBadge2 } = unlock2(import_components14.privateApis);
14246 function GridItem3({
14247 view,
14248 multiselect,
14249 selection,
14250 onChangeSelection,
14251 getItemId,
14252 item,
14253 mediaField,
14254 titleField,
14255 descriptionField,
14256 regularFields,
14257 badgeFields,
14258 config,
14259 posinset,
14260 setsize
14261 }) {
14262 const { showTitle = true, showMedia = true, showDescription = true } = view;
14263 const id = getItemId(item);
14264 const elementRef = (0, import_element45.useRef)(null);
14265 const isSelected2 = selection.includes(id);
14266 useIntersectionObserver(elementRef, posinset);
14267 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14268 mediaField.render,
14269 {
14270 item,
14271 field: mediaField,
14272 config
14273 }
14274 ) : null;
14275 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(titleField.render, { item, field: titleField }) : null;
14276 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
14277 import_components14.Composite.Item,
14278 {
14279 ref: elementRef,
14280 "aria-label": titleField ? titleField.getValue({ item }) || (0, import_i18n18.__)("(no title)") : void 0,
14281 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Stack, { direction: "column", children, ...props }),
14282 role: "option",
14283 "aria-posinset": posinset,
14284 "aria-setsize": setsize,
14285 className: clsx_default("dataviews-view-picker-grid__card", {
14286 "is-selected": isSelected2
14287 }),
14288 "aria-selected": isSelected2,
14289 onClick: () => {
14290 if (isSelected2) {
14291 onChangeSelection(
14292 selection.filter((itemId) => id !== itemId)
14293 );
14294 } else {
14295 const newSelection = multiselect ? [...selection, id] : [id];
14296 onChangeSelection(newSelection);
14297 }
14298 },
14299 children: [
14300 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "dataviews-view-picker-grid__media", children: renderedMediaField }),
14301 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14302 DataViewsSelectionCheckbox,
14303 {
14304 item,
14305 selection,
14306 onChangeSelection,
14307 getItemId,
14308 titleField,
14309 disabled: false,
14310 "aria-hidden": true,
14311 tabIndex: -1
14312 }
14313 ),
14314 showTitle && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14315 Stack,
14316 {
14317 direction: "row",
14318 justify: "space-between",
14319 className: "dataviews-view-picker-grid__title-actions",
14320 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "dataviews-view-picker-grid__title-field dataviews-title-field", children: renderedTitleField })
14321 }
14322 ),
14323 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Stack, { direction: "column", gap: "xs", children: [
14324 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14325 descriptionField.render,
14326 {
14327 item,
14328 field: descriptionField
14329 }
14330 ),
14331 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14332 Stack,
14333 {
14334 direction: "row",
14335 className: "dataviews-view-picker-grid__badge-fields",
14336 gap: "sm",
14337 wrap: "wrap",
14338 align: "top",
14339 justify: "flex-start",
14340 children: badgeFields.map((field) => {
14341 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14342 WCBadge2,
14343 {
14344 className: "dataviews-view-picker-grid__field-value",
14345 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14346 field.render,
14347 {
14348 item,
14349 field
14350 }
14351 )
14352 },
14353 field.id
14354 );
14355 })
14356 }
14357 ),
14358 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14359 Stack,
14360 {
14361 direction: "column",
14362 className: "dataviews-view-picker-grid__fields",
14363 gap: "xs",
14364 children: regularFields.map((field) => {
14365 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14366 import_components14.Flex,
14367 {
14368 className: "dataviews-view-picker-grid__field",
14369 gap: 1,
14370 justify: "flex-start",
14371 expanded: true,
14372 style: { height: "auto" },
14373 direction: "row",
14374 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
14375 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_components14.FlexItem, { className: "dataviews-view-picker-grid__field-name", children: field.header }),
14376 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14377 import_components14.FlexItem,
14378 {
14379 className: "dataviews-view-picker-grid__field-value",
14380 style: { maxHeight: "none" },
14381 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14382 field.render,
14383 {
14384 item,
14385 field
14386 }
14387 )
14388 }
14389 )
14390 ] })
14391 },
14392 field.id
14393 );
14394 })
14395 }
14396 )
14397 ] })
14398 ]
14399 },
14400 id
14401 );
14402 }
14403 function GridGroup({
14404 groupName,
14405 groupField,
14406 showLabel = true,
14407 children
14408 }) {
14409 const headerId = (0, import_compose6.useInstanceId)(
14410 GridGroup,
14411 "dataviews-view-picker-grid-group__header"
14412 );
14413 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
14414 Stack,
14415 {
14416 direction: "column",
14417 gap: "sm",
14418 role: "group",
14419 "aria-labelledby": headerId,
14420 children: [
14421 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14422 "h3",
14423 {
14424 className: "dataviews-view-picker-grid-group__header",
14425 id: headerId,
14426 children: showLabel ? (0, import_i18n18.sprintf)(
14427 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
14428 (0, import_i18n18.__)("%1$s: %2$s"),
14429 groupField.label,
14430 groupName
14431 ) : groupName
14432 }
14433 ),
14434 children
14435 ]
14436 },
14437 groupName
14438 );
14439 }
14440 function ViewPickerGrid({
14441 actions,
14442 data,
14443 fields,
14444 getItemId,
14445 isLoading,
14446 onChangeSelection,
14447 selection,
14448 view,
14449 className,
14450 empty
14451 }) {
14452 const { resizeObserverRef, paginationInfo, itemListLabel } = (0, import_element45.useContext)(dataviews_context_default);
14453 const titleField = fields.find(
14454 (field) => field.id === view?.titleField
14455 );
14456 const mediaField = fields.find(
14457 (field) => field.id === view?.mediaField
14458 );
14459 const descriptionField = fields.find(
14460 (field) => field.id === view?.descriptionField
14461 );
14462 const otherFields = view.fields ?? [];
14463 const { regularFields, badgeFields } = otherFields.reduce(
14464 (accumulator, fieldId) => {
14465 const field = fields.find((f2) => f2.id === fieldId);
14466 if (!field) {
14467 return accumulator;
14468 }
14469 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
14470 accumulator[key].push(field);
14471 return accumulator;
14472 },
14473 { regularFields: [], badgeFields: [] }
14474 );
14475 const hasData = !!data?.length;
14476 const usedPreviewSize = view.layout?.previewSize;
14477 const isMultiselect = useIsMultiselectPicker(actions);
14478 const size4 = "900px";
14479 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
14480 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
14481 const isInfiniteScroll = (view.infiniteScrollEnabled && !dataByGroup) ?? false;
14482 const currentPage = view?.page ?? 1;
14483 const perPage = view?.perPage ?? 0;
14484 const setSize = isInfiniteScroll ? paginationInfo?.totalItems : void 0;
14485 const gridColumns = useGridColumns();
14486 const placeholdersNeeded = usePlaceholdersNeeded(
14487 data,
14488 isInfiniteScroll,
14489 gridColumns
14490 );
14491 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, {
14492 // Render multiple groups.
14493 children: [
14494 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14495 import_components14.Composite,
14496 {
14497 virtualFocus: true,
14498 orientation: "horizontal",
14499 role: "listbox",
14500 "aria-multiselectable": isMultiselect,
14501 className: clsx_default(
14502 "dataviews-view-picker-grid",
14503 className,
14504 {
14505 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
14506 view.layout.density
14507 )
14508 }
14509 ),
14510 "aria-label": itemListLabel,
14511 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14512 Stack,
14513 {
14514 direction: "column",
14515 gap: "lg",
14516 children,
14517 ...props
14518 }
14519 ),
14520 children: Array.from(dataByGroup.entries()).map(
14521 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14522 GridGroup,
14523 {
14524 groupName,
14525 groupField,
14526 showLabel: view.groupBy?.showLabel !== false,
14527 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14528 GridItems,
14529 {
14530 previewSize: usedPreviewSize,
14531 style: {
14532 gridTemplateColumns: usedPreviewSize && `repeat(auto-fill, minmax(${usedPreviewSize}px, 1fr))`
14533 },
14534 "aria-busy": isLoading,
14535 ref: resizeObserverRef,
14536 children: groupItems.map((item) => {
14537 const posInSet = item.position ?? (currentPage - 1) * perPage + data.indexOf(item) + 1;
14538 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14539 GridItem3,
14540 {
14541 view,
14542 multiselect: isMultiselect,
14543 selection,
14544 onChangeSelection,
14545 getItemId,
14546 item,
14547 mediaField,
14548 titleField,
14549 descriptionField,
14550 regularFields,
14551 badgeFields,
14552 config: {
14553 sizes: size4
14554 },
14555 posinset: posInSet,
14556 setsize: setSize
14557 },
14558 getItemId(item)
14559 );
14560 })
14561 }
14562 )
14563 },
14564 groupName
14565 )
14566 )
14567 }
14568 ),
14569 // Render a single grid with all data.
14570 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
14571 import_components14.Composite,
14572 {
14573 render: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14574 GridItems,
14575 {
14576 className: clsx_default(
14577 "dataviews-view-picker-grid",
14578 className,
14579 {
14580 [`has-${view.layout?.density}-density`]: view.layout?.density && [
14581 "compact",
14582 "comfortable"
14583 ].includes(view.layout.density)
14584 }
14585 ),
14586 previewSize: usedPreviewSize,
14587 "aria-busy": isLoading,
14588 ref: resizeObserverRef
14589 }
14590 ),
14591 virtualFocus: true,
14592 orientation: "horizontal",
14593 role: "listbox",
14594 "aria-multiselectable": isMultiselect,
14595 "aria-label": itemListLabel,
14596 children: [
14597 Array.from({ length: placeholdersNeeded }).map(
14598 (_, index2) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14599 import_components14.Composite.Item,
14600 {
14601 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14602 Stack,
14603 {
14604 direction: "column",
14605 children,
14606 ...props
14607 }
14608 ),
14609 role: "option",
14610 "aria-hidden": true,
14611 tabIndex: -1,
14612 className: "dataviews-view-picker-grid__card dataviews-view-picker-grid__placeholder"
14613 },
14614 `placeholder-${index2}`
14615 )
14616 ),
14617 data.map((item) => {
14618 const posinset = item.position;
14619 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14620 GridItem3,
14621 {
14622 view,
14623 multiselect: isMultiselect,
14624 selection,
14625 onChangeSelection,
14626 getItemId,
14627 item,
14628 mediaField,
14629 titleField,
14630 descriptionField,
14631 regularFields,
14632 badgeFields,
14633 config: {
14634 sizes: size4
14635 },
14636 posinset,
14637 setsize: setSize
14638 },
14639 getItemId(item)
14640 );
14641 })
14642 ]
14643 }
14644 ),
14645 // Render empty state.
14646 !hasData && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
14647 "div",
14648 {
14649 className: clsx_default({
14650 "dataviews-loading": isLoading,
14651 "dataviews-no-results": !isLoading
14652 }),
14653 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_components14.Spinner, {}) }) : empty
14654 }
14655 ),
14656 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_components14.Spinner, {}) })
14657 ]
14658 });
14659 }
14660 var picker_grid_default = ViewPickerGrid;
14661
14662 // packages/dataviews/build-module/components/dataviews-layouts/picker-table/index.mjs
14663 var import_i18n19 = __toESM(require_i18n(), 1);
14664 var import_components15 = __toESM(require_components(), 1);
14665 var import_element46 = __toESM(require_element(), 1);
14666 var import_jsx_runtime68 = __toESM(require_jsx_runtime(), 1);
14667 function TableColumnField2({
14668 item,
14669 fields,
14670 column,
14671 align
14672 }) {
14673 const field = fields.find((f2) => f2.id === column);
14674 if (!field) {
14675 return null;
14676 }
14677 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
14678 "dataviews-view-table__cell-align-end": align === "end",
14679 "dataviews-view-table__cell-align-center": align === "center"
14680 });
14681 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(field.render, { item, field }) });
14682 }
14683 function TableRow2({
14684 item,
14685 fields,
14686 id,
14687 view,
14688 titleField,
14689 mediaField,
14690 descriptionField,
14691 selection,
14692 getItemId,
14693 onChangeSelection,
14694 multiselect,
14695 posinset
14696 }) {
14697 const { paginationInfo } = (0, import_element46.useContext)(dataviews_context_default);
14698 const isSelected2 = selection.includes(id);
14699 const [isHovered, setIsHovered] = (0, import_element46.useState)(false);
14700 const elementRef = (0, import_element46.useRef)(null);
14701 useIntersectionObserver(elementRef, posinset);
14702 const {
14703 showTitle = true,
14704 showMedia = true,
14705 showDescription = true,
14706 infiniteScrollEnabled
14707 } = view;
14708 const handleMouseEnter = () => {
14709 setIsHovered(true);
14710 };
14711 const handleMouseLeave = () => {
14712 setIsHovered(false);
14713 };
14714 const columns = view.fields ?? [];
14715 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
14716 return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
14717 import_components15.Composite.Item,
14718 {
14719 ref: elementRef,
14720 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14721 "tr",
14722 {
14723 className: clsx_default("dataviews-view-table__row", {
14724 "is-selected": isSelected2,
14725 "is-hovered": isHovered
14726 }),
14727 onMouseEnter: handleMouseEnter,
14728 onMouseLeave: handleMouseLeave,
14729 children,
14730 ...props
14731 }
14732 ),
14733 "aria-selected": isSelected2,
14734 "aria-setsize": paginationInfo.totalItems || void 0,
14735 "aria-posinset": posinset,
14736 role: infiniteScrollEnabled ? "article" : "option",
14737 onMouseDown: (event) => {
14738 if (event.button !== 0) {
14739 return;
14740 }
14741 event.currentTarget.parentElement?.focus({
14742 preventScroll: true
14743 });
14744 },
14745 onClick: () => {
14746 if (isSelected2) {
14747 onChangeSelection(
14748 selection.filter((itemId) => id !== itemId)
14749 );
14750 } else {
14751 const newSelection = multiselect ? [...selection, id] : [id];
14752 onChangeSelection(newSelection);
14753 }
14754 },
14755 children: [
14756 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14757 "td",
14758 {
14759 className: "dataviews-view-table__checkbox-column",
14760 role: "presentation",
14761 children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14762 DataViewsSelectionCheckbox,
14763 {
14764 item,
14765 selection,
14766 onChangeSelection,
14767 getItemId,
14768 titleField,
14769 disabled: false,
14770 "aria-hidden": true,
14771 tabIndex: -1
14772 }
14773 ) })
14774 }
14775 ),
14776 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14777 "td",
14778 {
14779 role: "presentation",
14780 children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14781 column_primary_default,
14782 {
14783 item,
14784 titleField: showTitle ? titleField : void 0,
14785 mediaField: showMedia ? mediaField : void 0,
14786 descriptionField: showDescription ? descriptionField : void 0,
14787 isItemClickable: () => false
14788 }
14789 )
14790 }
14791 ),
14792 columns.map((column) => {
14793 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
14794 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14795 "td",
14796 {
14797 style: {
14798 width,
14799 maxWidth,
14800 minWidth
14801 },
14802 role: "presentation",
14803 children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14804 TableColumnField2,
14805 {
14806 fields,
14807 item,
14808 column,
14809 align
14810 }
14811 )
14812 },
14813 column
14814 );
14815 })
14816 ]
14817 },
14818 id
14819 );
14820 }
14821 function ViewPickerTable({
14822 actions,
14823 data,
14824 fields,
14825 getItemId,
14826 isLoading = false,
14827 onChangeView,
14828 onChangeSelection,
14829 selection,
14830 setOpenedFilter,
14831 view,
14832 className,
14833 empty
14834 }) {
14835 const headerMenuRefs = (0, import_element46.useRef)(/* @__PURE__ */ new Map());
14836 const headerMenuToFocusRef = (0, import_element46.useRef)(void 0);
14837 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element46.useState)();
14838 const isMultiselect = useIsMultiselectPicker(actions) ?? false;
14839 (0, import_element46.useEffect)(() => {
14840 if (headerMenuToFocusRef.current) {
14841 headerMenuToFocusRef.current.focus();
14842 headerMenuToFocusRef.current = void 0;
14843 }
14844 });
14845 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
14846 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
14847 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
14848 const tableNoticeId = (0, import_element46.useId)();
14849 if (nextHeaderMenuToFocus) {
14850 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
14851 setNextHeaderMenuToFocus(void 0);
14852 return;
14853 }
14854 const onHide = (field) => {
14855 const hidden = headerMenuRefs.current.get(field.id);
14856 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
14857 setNextHeaderMenuToFocus(fallback?.node);
14858 };
14859 const hasData = !!data?.length;
14860 const titleField = fields.find((field) => field.id === view.titleField);
14861 const mediaField = fields.find((field) => field.id === view.mediaField);
14862 const descriptionField = fields.find(
14863 (field) => field.id === view.descriptionField
14864 );
14865 const { showTitle = true, showMedia = true, showDescription = true } = view;
14866 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
14867 const columns = view.fields ?? [];
14868 const headerMenuRef = (column, index2) => (node) => {
14869 if (node) {
14870 headerMenuRefs.current.set(column, {
14871 node,
14872 fallback: columns[index2 > 0 ? index2 - 1 : 1]
14873 });
14874 } else {
14875 headerMenuRefs.current.delete(column);
14876 }
14877 };
14878 return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
14879 /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
14880 "table",
14881 {
14882 className: clsx_default(
14883 "dataviews-view-table",
14884 "dataviews-view-picker-table",
14885 className,
14886 {
14887 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
14888 view.layout.density
14889 )
14890 }
14891 ),
14892 "aria-busy": isLoading,
14893 "aria-describedby": tableNoticeId,
14894 role: isInfiniteScroll ? "feed" : "listbox",
14895 children: [
14896 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("thead", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
14897 "tr",
14898 {
14899 className: "dataviews-view-table__row",
14900 role: "presentation",
14901 children: [
14902 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("th", { className: "dataviews-view-table__checkbox-column", children: isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14903 BulkSelectionCheckbox,
14904 {
14905 selection,
14906 onChangeSelection,
14907 data,
14908 actions,
14909 getItemId,
14910 disableSelectAll: isInfiniteScroll
14911 }
14912 ) }),
14913 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("th", { children: titleField && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14914 column_header_menu_default,
14915 {
14916 ref: headerMenuRef(
14917 titleField.id,
14918 0
14919 ),
14920 fieldId: titleField.id,
14921 view,
14922 fields,
14923 onChangeView,
14924 onHide,
14925 setOpenedFilter,
14926 canMove: false
14927 }
14928 ) }),
14929 columns.map((column, index2) => {
14930 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
14931 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14932 "th",
14933 {
14934 style: {
14935 width,
14936 maxWidth,
14937 minWidth,
14938 textAlign: align
14939 },
14940 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
14941 scope: "col",
14942 children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14943 column_header_menu_default,
14944 {
14945 ref: headerMenuRef(column, index2),
14946 fieldId: column,
14947 view,
14948 fields,
14949 onChangeView,
14950 onHide,
14951 setOpenedFilter,
14952 canMove: view.layout?.enableMoving ?? true
14953 }
14954 )
14955 },
14956 column
14957 );
14958 })
14959 ]
14960 }
14961 ) }),
14962 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
14963 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
14964 import_components15.Composite,
14965 {
14966 virtualFocus: true,
14967 orientation: "vertical",
14968 render: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("tbody", { role: "group" }),
14969 children: [
14970 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14971 "tr",
14972 {
14973 className: "dataviews-view-table__group-header-row",
14974 role: "presentation",
14975 children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14976 "td",
14977 {
14978 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + 1,
14979 className: "dataviews-view-table__group-header-cell",
14980 role: "presentation",
14981 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n19.sprintf)(
14982 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
14983 (0, import_i18n19.__)("%1$s: %2$s"),
14984 groupField.label,
14985 groupName
14986 )
14987 }
14988 )
14989 }
14990 ),
14991 groupItems.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
14992 TableRow2,
14993 {
14994 item,
14995 fields,
14996 id: getItemId(item) || index2.toString(),
14997 view,
14998 titleField,
14999 mediaField,
15000 descriptionField,
15001 selection,
15002 getItemId,
15003 onChangeSelection,
15004 multiselect: isMultiselect
15005 },
15006 getItemId(item)
15007 ))
15008 ]
15009 },
15010 `group-${groupName}`
15011 )
15012 ) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15013 import_components15.Composite,
15014 {
15015 render: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("tbody", { role: "presentation" }),
15016 virtualFocus: true,
15017 orientation: "vertical",
15018 children: hasData && data.map((item, index2) => {
15019 const itemId = getItemId(item);
15020 const posinset = item.position;
15021 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15022 TableRow2,
15023 {
15024 item,
15025 fields,
15026 id: itemId || index2.toString(),
15027 view,
15028 titleField,
15029 mediaField,
15030 descriptionField,
15031 selection,
15032 getItemId,
15033 onChangeSelection,
15034 multiselect: isMultiselect,
15035 posinset
15036 },
15037 itemId
15038 );
15039 })
15040 }
15041 )
15042 ]
15043 }
15044 ),
15045 /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
15046 "div",
15047 {
15048 className: clsx_default({
15049 "dataviews-loading": isLoading,
15050 "dataviews-no-results": !hasData && !isLoading
15051 }),
15052 id: tableNoticeId,
15053 children: [
15054 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_components15.Spinner, {}) }) : empty),
15055 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_components15.Spinner, {}) })
15056 ]
15057 }
15058 )
15059 ] });
15060 }
15061 var picker_table_default = ViewPickerTable;
15062
15063 // packages/dataviews/build-module/components/dataviews-layouts/picker-activity/index.mjs
15064 var import_components16 = __toESM(require_components(), 1);
15065 var import_element47 = __toESM(require_element(), 1);
15066 var import_compose7 = __toESM(require_compose(), 1);
15067 var import_i18n20 = __toESM(require_i18n(), 1);
15068 var import_jsx_runtime69 = __toESM(require_jsx_runtime(), 1);
15069 function isDefined4(item) {
15070 return !!item;
15071 }
15072 function PickerActivityItem({
15073 view,
15074 multiselect,
15075 selection,
15076 onChangeSelection,
15077 getItemId,
15078 item,
15079 titleField,
15080 mediaField,
15081 descriptionField,
15082 otherFields,
15083 posinset,
15084 setsize
15085 }) {
15086 const elementRef = (0, import_element47.useRef)(null);
15087 useIntersectionObserver(elementRef, posinset);
15088 const { showTitle = true, showMedia = true, showDescription = true } = view;
15089 const id = getItemId(item);
15090 const isSelected2 = selection.includes(id);
15091 const density = view.layout?.density ?? "balanced";
15092 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15093 mediaField.render,
15094 {
15095 item,
15096 field: mediaField,
15097 config: {
15098 sizes: density === "comfortable" ? "32px" : "24px"
15099 }
15100 }
15101 ) : null;
15102 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "dataviews-view-picker-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15103 "span",
15104 {
15105 className: "dataviews-view-picker-activity__item-bullet",
15106 "aria-hidden": "true"
15107 }
15108 ) });
15109 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(titleField.render, { item, field: titleField }) : null;
15110 const renderedDescriptionField = showDescription && descriptionField?.render ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(descriptionField.render, { item, field: descriptionField }) : null;
15111 const verticalGap = (0, import_element47.useMemo)(() => {
15112 switch (density) {
15113 case "comfortable":
15114 return "md";
15115 default:
15116 return "sm";
15117 }
15118 }, [density]);
15119 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15120 import_components16.Composite.Item,
15121 {
15122 ref: elementRef,
15123 role: "option",
15124 "aria-label": titleField ? titleField.getValue({ item }) || void 0 : void 0,
15125 "aria-posinset": posinset,
15126 "aria-setsize": setsize,
15127 "aria-selected": isSelected2,
15128 className: clsx_default(
15129 "dataviews-view-picker-activity__item",
15130 density === "compact" && "is-compact",
15131 density === "balanced" && "is-balanced",
15132 density === "comfortable" && "is-comfortable",
15133 isSelected2 && "is-selected"
15134 ),
15135 onClick: () => {
15136 if (isSelected2) {
15137 onChangeSelection(
15138 selection.filter((itemId) => id !== itemId)
15139 );
15140 } else {
15141 const newSelection = multiselect ? [...selection, id] : [id];
15142 onChangeSelection(newSelection);
15143 }
15144 },
15145 render: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", {}),
15146 children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Stack, { direction: "row", gap: "lg", justify: "start", align: "flex-start", children: [
15147 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15148 Stack,
15149 {
15150 direction: "column",
15151 gap: "xs",
15152 align: "center",
15153 className: "dataviews-view-picker-activity__item-type",
15154 children: renderedMediaField
15155 }
15156 ),
15157 /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
15158 Stack,
15159 {
15160 direction: "column",
15161 gap: verticalGap,
15162 align: "flex-start",
15163 className: "dataviews-view-picker-activity__item-content",
15164 children: [
15165 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "dataviews-view-picker-activity__item-title", children: renderedTitleField }),
15166 renderedDescriptionField && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "dataviews-view-picker-activity__item-description", children: renderedDescriptionField }),
15167 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "dataviews-view-picker-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
15168 "div",
15169 {
15170 className: "dataviews-view-picker-activity__item-field",
15171 children: [
15172 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15173 VisuallyHidden,
15174 {
15175 render: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", {}),
15176 className: "dataviews-view-picker-activity__item-field-label",
15177 children: field.label
15178 }
15179 ),
15180 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "dataviews-view-picker-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15181 field.render,
15182 {
15183 item,
15184 field
15185 }
15186 ) })
15187 ]
15188 },
15189 field.id
15190 )) })
15191 ]
15192 }
15193 )
15194 ] })
15195 }
15196 );
15197 }
15198 function PickerActivityGroup({
15199 groupName,
15200 groupField,
15201 showLabel = true,
15202 children
15203 }) {
15204 const headerId = (0, import_compose7.useInstanceId)(
15205 PickerActivityGroup,
15206 "dataviews-view-picker-activity-group__header"
15207 );
15208 return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
15209 Stack,
15210 {
15211 direction: "column",
15212 role: "group",
15213 "aria-labelledby": headerId,
15214 className: "dataviews-view-picker-activity-group",
15215 children: [
15216 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15217 "h3",
15218 {
15219 className: "dataviews-view-picker-activity-group__header",
15220 id: headerId,
15221 children: showLabel ? (0, import_i18n20.sprintf)(
15222 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
15223 (0, import_i18n20.__)("%1$s: %2$s"),
15224 groupField.label,
15225 groupName
15226 ) : groupName
15227 }
15228 ),
15229 children
15230 ]
15231 }
15232 );
15233 }
15234 function ViewPickerActivity({
15235 data,
15236 fields,
15237 getItemId,
15238 isLoading,
15239 onChangeSelection,
15240 selection,
15241 view,
15242 actions,
15243 className,
15244 empty
15245 }) {
15246 const { itemListLabel, paginationInfo } = (0, import_element47.useContext)(dataviews_context_default);
15247 const isMultiselect = useIsMultiselectPicker(actions);
15248 const titleField = fields.find(
15249 (field) => field.id === view?.titleField
15250 );
15251 const mediaField = fields.find(
15252 (field) => field.id === view?.mediaField
15253 );
15254 const descriptionField = fields.find(
15255 (field) => field.id === view?.descriptionField
15256 );
15257 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined4);
15258 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
15259 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
15260 const isInfiniteScroll = (view.infiniteScrollEnabled && !dataByGroup) ?? false;
15261 const setsize = isInfiniteScroll ? paginationInfo?.totalItems : void 0;
15262 const hasData = !!data?.length;
15263 const isGrouped = !!(groupField && dataByGroup);
15264 const renderItem = (item) => /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15265 PickerActivityItem,
15266 {
15267 view,
15268 multiselect: isMultiselect,
15269 selection,
15270 onChangeSelection,
15271 getItemId,
15272 item,
15273 titleField,
15274 mediaField,
15275 descriptionField,
15276 otherFields,
15277 posinset: item.position,
15278 setsize
15279 },
15280 getItemId(item)
15281 );
15282 if (!hasData) {
15283 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15284 "div",
15285 {
15286 className: clsx_default({
15287 "dataviews-loading": isLoading,
15288 "dataviews-no-results": !isLoading
15289 }),
15290 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_components16.Spinner, {}) }) : empty
15291 }
15292 );
15293 }
15294 return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
15295 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15296 import_components16.Composite,
15297 {
15298 virtualFocus: true,
15299 orientation: "vertical",
15300 role: "listbox",
15301 "aria-multiselectable": isMultiselect,
15302 "aria-label": itemListLabel,
15303 "aria-busy": isLoading,
15304 render: isGrouped ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Stack, { direction: "column", gap: "sm" }) : void 0,
15305 className: clsx_default(
15306 "dataviews-view-picker-activity",
15307 className
15308 ),
15309 children: isGrouped && dataByGroup ? Array.from(dataByGroup.entries()).map(
15310 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15311 PickerActivityGroup,
15312 {
15313 groupName,
15314 groupField,
15315 showLabel: view.groupBy?.showLabel !== false,
15316 children: groupItems.map(renderItem)
15317 },
15318 groupName
15319 )
15320 ) : data.map(renderItem)
15321 }
15322 ),
15323 isLoading && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_components16.Spinner, {}) })
15324 ] });
15325 }
15326
15327 // packages/dataviews/build-module/components/dataviews-layouts/utils/density-picker.mjs
15328 var import_components17 = __toESM(require_components(), 1);
15329 var import_i18n21 = __toESM(require_i18n(), 1);
15330 var import_element48 = __toESM(require_element(), 1);
15331 var import_jsx_runtime70 = __toESM(require_jsx_runtime(), 1);
15332 function DensityPicker() {
15333 const context = (0, import_element48.useContext)(dataviews_context_default);
15334 const view = context.view;
15335 return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(
15336 import_components17.__experimentalToggleGroupControl,
15337 {
15338 label: (0, import_i18n21.__)("Density"),
15339 value: view.layout?.density || "balanced",
15340 onChange: (value) => {
15341 context.onChangeView({
15342 ...view,
15343 layout: {
15344 ...view.layout,
15345 density: value
15346 }
15347 });
15348 },
15349 isBlock: true,
15350 children: [
15351 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
15352 import_components17.__experimentalToggleGroupControlOption,
15353 {
15354 value: "comfortable",
15355 label: (0, import_i18n21._x)(
15356 "Comfortable",
15357 "Density option for DataView layout"
15358 )
15359 },
15360 "comfortable"
15361 ),
15362 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
15363 import_components17.__experimentalToggleGroupControlOption,
15364 {
15365 value: "balanced",
15366 label: (0, import_i18n21._x)("Balanced", "Density option for DataView layout")
15367 },
15368 "balanced"
15369 ),
15370 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
15371 import_components17.__experimentalToggleGroupControlOption,
15372 {
15373 value: "compact",
15374 label: (0, import_i18n21._x)("Compact", "Density option for DataView layout")
15375 },
15376 "compact"
15377 )
15378 ]
15379 }
15380 );
15381 }
15382
15383 // packages/dataviews/build-module/components/dataviews-layouts/utils/preview-size-picker.mjs
15384 var import_components18 = __toESM(require_components(), 1);
15385 var import_i18n22 = __toESM(require_i18n(), 1);
15386 var import_element49 = __toESM(require_element(), 1);
15387 var import_jsx_runtime71 = __toESM(require_jsx_runtime(), 1);
15388 var imageSizes2 = [
15389 {
15390 value: 120,
15391 breakpoint: 1
15392 },
15393 {
15394 value: 170,
15395 breakpoint: 1
15396 },
15397 {
15398 value: 230,
15399 breakpoint: 1
15400 },
15401 {
15402 value: 290,
15403 breakpoint: 1112
15404 // at minimum image width, 4 images display at this container size
15405 },
15406 {
15407 value: 350,
15408 breakpoint: 1636
15409 // at minimum image width, 6 images display at this container size
15410 },
15411 {
15412 value: 430,
15413 breakpoint: 588
15414 // at minimum image width, 2 images display at this container size
15415 }
15416 ];
15417 function PreviewSizePicker() {
15418 const context = (0, import_element49.useContext)(dataviews_context_default);
15419 const view = context.view;
15420 const breakValues = imageSizes2.filter((size4) => {
15421 return context.containerWidth >= size4.breakpoint;
15422 });
15423 const layoutPreviewSize = view.layout?.previewSize ?? 230;
15424 const previewSizeToUse = breakValues.map((size4, index2) => ({ ...size4, index: index2 })).filter((size4) => size4.value <= layoutPreviewSize).sort((a2, b2) => b2.value - a2.value)[0]?.index ?? 0;
15425 const marks = breakValues.map((size4, index2) => {
15426 return {
15427 value: index2
15428 };
15429 });
15430 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
15431 import_components18.RangeControl,
15432 {
15433 showTooltip: false,
15434 label: (0, import_i18n22.__)("Preview size"),
15435 value: previewSizeToUse,
15436 min: 0,
15437 max: breakValues.length - 1,
15438 withInputField: false,
15439 onChange: (value = 0) => {
15440 context.onChangeView({
15441 ...view,
15442 layout: {
15443 ...view.layout,
15444 previewSize: breakValues[value].value
15445 }
15446 });
15447 },
15448 step: 1,
15449 marks
15450 }
15451 );
15452 }
15453
15454 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-config-options.mjs
15455 var import_jsx_runtime72 = __toESM(require_jsx_runtime(), 1);
15456 function GridConfigOptions() {
15457 return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
15458 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(DensityPicker, {}),
15459 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(PreviewSizePicker, {})
15460 ] });
15461 }
15462
15463 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
15464 var VIEW_LAYOUTS = [
15465 {
15466 type: LAYOUT_TABLE,
15467 label: (0, import_i18n23.__)("Table"),
15468 component: table_default,
15469 icon: block_table_default,
15470 viewConfigOptions: DensityPicker
15471 },
15472 {
15473 type: LAYOUT_GRID,
15474 label: (0, import_i18n23.__)("Grid"),
15475 component: grid_default,
15476 icon: category_default,
15477 viewConfigOptions: GridConfigOptions
15478 },
15479 {
15480 type: LAYOUT_LIST,
15481 label: (0, import_i18n23.__)("List"),
15482 component: ViewList,
15483 icon: (0, import_i18n23.isRTL)() ? format_list_bullets_rtl_default : format_list_bullets_default,
15484 viewConfigOptions: DensityPicker
15485 },
15486 {
15487 type: LAYOUT_ACTIVITY,
15488 label: (0, import_i18n23.__)("Activity"),
15489 component: ViewActivity,
15490 icon: scheduled_default,
15491 viewConfigOptions: DensityPicker
15492 },
15493 {
15494 type: LAYOUT_PICKER_GRID,
15495 label: (0, import_i18n23.__)("Grid"),
15496 component: picker_grid_default,
15497 icon: category_default,
15498 viewConfigOptions: GridConfigOptions,
15499 isPicker: true
15500 },
15501 {
15502 type: LAYOUT_PICKER_TABLE,
15503 label: (0, import_i18n23.__)("Table"),
15504 component: picker_table_default,
15505 icon: block_table_default,
15506 viewConfigOptions: DensityPicker,
15507 isPicker: true
15508 },
15509 {
15510 type: LAYOUT_PICKER_ACTIVITY,
15511 label: (0, import_i18n23.__)("Activity"),
15512 component: ViewPickerActivity,
15513 icon: scheduled_default,
15514 viewConfigOptions: DensityPicker,
15515 isPicker: true
15516 }
15517 ];
15518
15519 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
15520 var import_element57 = __toESM(require_element(), 1);
15521
15522 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
15523 var import_components21 = __toESM(require_components(), 1);
15524 var import_i18n26 = __toESM(require_i18n(), 1);
15525 var import_element54 = __toESM(require_element(), 1);
15526
15527 // node_modules/@ariakit/react-components/dist/focusable/focusable-context.js
15528 var import_react11 = __toESM(require_react(), 1);
15529 var FocusableContext = (0, import_react11.createContext)(true);
15530
15531 // node_modules/@ariakit/utils/dist/index.js
15532 function toArray(arg) {
15533 if (Array.isArray(arg)) return arg;
15534 return typeof arg !== "undefined" ? [arg] : [];
15535 }
15536 function flatten2DArray(array) {
15537 const flattened = [];
15538 for (const row of array) flattened.push(...row);
15539 return flattened;
15540 }
15541 function reverseArray(array) {
15542 return array.slice().reverse();
15543 }
15544 function noop4(..._) {
15545 }
15546 function hasOwnProperty(object, prop) {
15547 if (typeof Object.hasOwn === "function") return Object.hasOwn(object, prop);
15548 return Object.prototype.hasOwnProperty.call(object, prop);
15549 }
15550 function chain(...fns) {
15551 return (...args) => {
15552 for (const fn of fns) if (typeof fn === "function") fn(...args);
15553 };
15554 }
15555 function normalizeString(str) {
15556 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
15557 }
15558 function omit(object, keys) {
15559 const result = { ...object };
15560 for (const key of keys) if (hasOwnProperty(result, key)) delete result[key];
15561 return result;
15562 }
15563 function pick(object, paths) {
15564 const result = {};
15565 for (const key of paths) if (hasOwnProperty(object, key)) result[key] = object[key];
15566 return result;
15567 }
15568 function identity(value) {
15569 return value;
15570 }
15571 function afterPaint(cb = noop4) {
15572 let raf = requestAnimationFrame(() => {
15573 raf = requestAnimationFrame(cb);
15574 });
15575 return () => cancelAnimationFrame(raf);
15576 }
15577 function invariant(condition, message2) {
15578 if (condition) return;
15579 if (typeof message2 !== "string") throw new Error("Invariant failed");
15580 throw new Error(message2);
15581 }
15582 function getKeys(obj) {
15583 return Object.keys(obj);
15584 }
15585 function isFalsyBooleanCallback(booleanOrCallback, ...args) {
15586 const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback;
15587 if (result == null) return false;
15588 return !result;
15589 }
15590 function disabledFromProps(props) {
15591 return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true";
15592 }
15593 function removeUndefinedValues(obj) {
15594 const result = {};
15595 for (const key in obj) if (obj[key] !== void 0) result[key] = obj[key];
15596 return result;
15597 }
15598 function defaultValue(...values) {
15599 for (const value of values) if (value !== void 0) return value;
15600 }
15601 var canUseDOM = checkIsBrowser();
15602 function checkIsBrowser() {
15603 return typeof window !== "undefined" && !!window.document?.createElement;
15604 }
15605 function getDocument(node) {
15606 if (!node) return document;
15607 if ("self" in node) return node.document;
15608 return node.ownerDocument || document;
15609 }
15610 function getActiveElement(node, activeDescendant = false) {
15611 const { activeElement: activeElement2 } = getDocument(node);
15612 if (!activeElement2?.nodeName) return null;
15613 if (isFrame(activeElement2) && activeElement2.contentDocument?.body) return getActiveElement(activeElement2.contentDocument.body, activeDescendant);
15614 if (activeDescendant) {
15615 const id = activeElement2.getAttribute("aria-activedescendant");
15616 if (id) {
15617 const element = getDocument(activeElement2).getElementById(id);
15618 if (element) return element;
15619 }
15620 }
15621 return activeElement2;
15622 }
15623 function contains2(parent, child) {
15624 return parent === child || parent.contains(child);
15625 }
15626 function isElement2(target) {
15627 return target?.nodeType === 1;
15628 }
15629 function isNode2(target) {
15630 return typeof target?.nodeType === "number";
15631 }
15632 function isFrame(element) {
15633 return element.tagName === "IFRAME";
15634 }
15635 function isButton(element) {
15636 const tagName = element.tagName.toLowerCase();
15637 if (tagName === "button") return true;
15638 if (tagName === "input" && element.type) return buttonInputTypes.indexOf(element.type) !== -1;
15639 return false;
15640 }
15641 var buttonInputTypes = [
15642 "button",
15643 "color",
15644 "file",
15645 "image",
15646 "reset",
15647 "submit"
15648 ];
15649 function isVisible(element) {
15650 if (typeof element.checkVisibility === "function") return element.checkVisibility();
15651 const htmlElement = element;
15652 return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0;
15653 }
15654 function isTextField(element) {
15655 try {
15656 if (element.tagName === "TEXTAREA") return true;
15657 if (element.tagName !== "INPUT") return false;
15658 return element.selectionStart !== null;
15659 } catch (_error) {
15660 return false;
15661 }
15662 }
15663 function isTextbox(element) {
15664 return element.isContentEditable || isTextField(element);
15665 }
15666 function getTextboxValue(element) {
15667 if (isTextField(element)) return element.value;
15668 if (element.isContentEditable) {
15669 const range = getDocument(element).createRange();
15670 range.selectNodeContents(element);
15671 return range.toString();
15672 }
15673 return "";
15674 }
15675 function getTextboxSelection(element) {
15676 let start = 0;
15677 let end = 0;
15678 if (isTextField(element)) {
15679 start = element.selectionStart || 0;
15680 end = element.selectionEnd || 0;
15681 } else if (element.isContentEditable) {
15682 const selection = getDocument(element).getSelection();
15683 if (selection?.rangeCount && selection.anchorNode && contains2(element, selection.anchorNode) && selection.focusNode && contains2(element, selection.focusNode)) {
15684 const range = selection.getRangeAt(0);
15685 const nextRange = range.cloneRange();
15686 nextRange.selectNodeContents(element);
15687 nextRange.setEnd(range.startContainer, range.startOffset);
15688 start = nextRange.toString().length;
15689 nextRange.setEnd(range.endContainer, range.endOffset);
15690 end = nextRange.toString().length;
15691 }
15692 }
15693 return {
15694 start,
15695 end
15696 };
15697 }
15698 var allowedPopupRoles = [
15699 "dialog",
15700 "menu",
15701 "listbox",
15702 "tree",
15703 "grid"
15704 ];
15705 var itemRoleByPopupRole = {
15706 menu: "menuitem",
15707 listbox: "option",
15708 tree: "treeitem"
15709 };
15710 function getPopupRole(element, fallback) {
15711 const role = element?.getAttribute("role");
15712 if (role && allowedPopupRoles.indexOf(role) !== -1) return role;
15713 return fallback;
15714 }
15715 function getItemRoleByPopupRole(popupRole) {
15716 if (popupRole == null) return;
15717 if (!hasOwnProperty(itemRoleByPopupRole, popupRole)) return;
15718 return itemRoleByPopupRole[popupRole];
15719 }
15720 function getScrollingElement(element) {
15721 if (!element) return null;
15722 const isScrollableOverflow = (overflow) => {
15723 if (overflow === "auto") return true;
15724 if (overflow === "scroll") return true;
15725 return false;
15726 };
15727 if (element.clientHeight && element.scrollHeight > element.clientHeight) {
15728 const { overflowY } = getComputedStyle(element);
15729 if (isScrollableOverflow(overflowY)) return element;
15730 } else if (element.clientWidth && element.scrollWidth > element.clientWidth) {
15731 const { overflowX } = getComputedStyle(element);
15732 if (isScrollableOverflow(overflowX)) return element;
15733 }
15734 const doc = getDocument(element);
15735 return getScrollingElement(element.parentElement) || doc.scrollingElement || doc.body;
15736 }
15737 function setSelectionRange(element, ...args) {
15738 if (/text|search|password|tel|url/i.test(element.type)) element.setSelectionRange(...args);
15739 }
15740 function sortBasedOnDOMPosition(items, getElement) {
15741 const pairs = items.map((item, index2) => [index2, item]);
15742 let isOrderDifferent = false;
15743 pairs.sort(([indexA, a2], [indexB, b2]) => {
15744 const elementA = getElement(a2);
15745 const elementB = getElement(b2);
15746 if (elementA === elementB) return 0;
15747 if (!elementA || !elementB) return 0;
15748 if (isElementPreceding(elementA, elementB)) {
15749 if (indexA > indexB) isOrderDifferent = true;
15750 return -1;
15751 }
15752 if (indexA < indexB) isOrderDifferent = true;
15753 return 1;
15754 });
15755 if (isOrderDifferent) return pairs.map(([_, item]) => item);
15756 return items;
15757 }
15758 function isElementPreceding(a2, b2) {
15759 return Boolean(b2.compareDocumentPosition(a2) & Node.DOCUMENT_POSITION_PRECEDING);
15760 }
15761 function isTouchDevice() {
15762 return canUseDOM && !!navigator.maxTouchPoints;
15763 }
15764 function isApple() {
15765 if (!canUseDOM) return false;
15766 return /mac|iphone|ipad|ipod/i.test(navigator.platform);
15767 }
15768 function isSafari() {
15769 return canUseDOM && isApple() && /apple/i.test(navigator.vendor);
15770 }
15771 function isFirefox() {
15772 return canUseDOM && /firefox\//i.test(navigator.userAgent);
15773 }
15774 function isPortalEvent(event) {
15775 const { currentTarget, target } = event;
15776 if (!currentTarget) return false;
15777 if (!isNode2(target)) return true;
15778 return !contains2(currentTarget, target);
15779 }
15780 function isSelfTarget(event) {
15781 return event.target === event.currentTarget;
15782 }
15783 function isActivatableNavigationTarget(element) {
15784 if (!isElement2(element)) return false;
15785 const target = element;
15786 const tagName = target.tagName.toLowerCase();
15787 if (tagName === "a") return true;
15788 if (tagName === "button" && target.type === "submit") return true;
15789 if (tagName === "input" && target.type === "submit") return true;
15790 return false;
15791 }
15792 function isOpeningInNewTab(event) {
15793 const isAppleDevice = isApple();
15794 if (isAppleDevice && !event.metaKey) return false;
15795 if (!isAppleDevice && !event.ctrlKey) return false;
15796 return isActivatableNavigationTarget(event.currentTarget);
15797 }
15798 function isDownloading(event) {
15799 if (!event.altKey) return false;
15800 return isActivatableNavigationTarget(event.currentTarget);
15801 }
15802 function fireBlurEvent(element, eventInit) {
15803 const event = new FocusEvent("blur", eventInit);
15804 const defaultAllowed = element.dispatchEvent(event);
15805 const bubbleInit = {
15806 ...eventInit,
15807 bubbles: true
15808 };
15809 element.dispatchEvent(new FocusEvent("focusout", bubbleInit));
15810 return defaultAllowed;
15811 }
15812 function fireKeyboardEvent(element, type, eventInit) {
15813 const event = new KeyboardEvent(type, eventInit);
15814 return element.dispatchEvent(event);
15815 }
15816 function fireClickEvent(element, eventInit) {
15817 const event = new MouseEvent("click", eventInit);
15818 return element.dispatchEvent(event);
15819 }
15820 function isFocusEventOutside(event, container) {
15821 const containerElement = container || event.currentTarget;
15822 const relatedTarget = event.relatedTarget;
15823 return !isNode2(relatedTarget) || !contains2(containerElement, relatedTarget);
15824 }
15825 function isInputEvent(event) {
15826 return event.type === "input";
15827 }
15828 function queueBeforeEvent(element, type, callback, timeout) {
15829 const createTimer = (callback2) => {
15830 if (timeout) {
15831 const timerId2 = setTimeout(callback2, timeout);
15832 return () => clearTimeout(timerId2);
15833 }
15834 const timerId = requestAnimationFrame(callback2);
15835 return () => cancelAnimationFrame(timerId);
15836 };
15837 const cancelTimer = createTimer(() => {
15838 element.removeEventListener(type, callSync, true);
15839 callback();
15840 });
15841 const callSync = () => {
15842 cancelTimer();
15843 callback();
15844 };
15845 element.addEventListener(type, callSync, {
15846 once: true,
15847 capture: true
15848 });
15849 return () => {
15850 cancelTimer();
15851 element.removeEventListener(type, callSync, true);
15852 };
15853 }
15854 function addGlobalEventListener(type, listener, options, scope = window) {
15855 const children = [];
15856 try {
15857 scope.document.addEventListener(type, listener, options);
15858 for (const frame of Array.from(scope.frames)) children.push(addGlobalEventListener(type, listener, options, frame));
15859 } catch {
15860 }
15861 const removeEventListener = () => {
15862 try {
15863 scope.document.removeEventListener(type, listener, options);
15864 } catch {
15865 }
15866 for (const remove of children) remove();
15867 };
15868 return removeEventListener;
15869 }
15870 var selector = "input:not([type='hidden']):not([disabled]), select:not([disabled]), textarea:not([disabled]), a[href], button:not([disabled]), [tabindex], summary, iframe, object, embed, area[href], audio[controls], video[controls], [contenteditable]:not([contenteditable='false'])";
15871 function isFocusable(element) {
15872 if (!element.matches(selector)) return false;
15873 if (!isVisible(element)) return false;
15874 if (element.closest("[inert]")) return false;
15875 return true;
15876 }
15877 function hasFocus(element) {
15878 const activeElement2 = getActiveElement(element);
15879 if (!activeElement2) return false;
15880 if (activeElement2 === element) return true;
15881 const activeDescendant = activeElement2.getAttribute("aria-activedescendant");
15882 if (!activeDescendant) return false;
15883 return activeDescendant === element.id;
15884 }
15885 function hasFocusWithin(element) {
15886 const activeElement2 = getActiveElement(element);
15887 if (!activeElement2) return false;
15888 if (contains2(element, activeElement2)) return true;
15889 const activeDescendant = activeElement2.getAttribute("aria-activedescendant");
15890 if (!activeDescendant) return false;
15891 if (!("id" in element)) return false;
15892 if (activeDescendant === element.id) return true;
15893 return !!element.querySelector(`#${CSS.escape(activeDescendant)}`);
15894 }
15895 function focusIntoView(element, options) {
15896 if (!("scrollIntoView" in element)) element.focus();
15897 else {
15898 element.focus({ preventScroll: true });
15899 element.scrollIntoView({
15900 block: "nearest",
15901 inline: "nearest",
15902 ...options
15903 });
15904 }
15905 }
15906 function createUndoCallback(callback) {
15907 return async () => {
15908 const redo = await callback?.();
15909 return createUndoCallback(async () => {
15910 await redo?.();
15911 return callback;
15912 });
15913 };
15914 }
15915 var UndoManager = createUndoManager();
15916 function createUndoManager({ limit = 100 } = {}) {
15917 const undoStack = [];
15918 let redoStack = [];
15919 let currentGroup = null;
15920 const canUndo = () => undoStack.length > 0;
15921 const canRedo = () => redoStack.length > 0;
15922 const undo = async () => {
15923 if (!canUndo()) return;
15924 currentGroup = null;
15925 redoStack.push(await undoStack.pop()?.());
15926 };
15927 const redo = async () => {
15928 if (!canRedo()) return;
15929 currentGroup = null;
15930 undoStack.push(await redoStack.pop()?.());
15931 };
15932 const execute = async (callback, group) => {
15933 if (!callback) return;
15934 const sameGroup = group === currentGroup;
15935 currentGroup = group ?? null;
15936 const nextIndex = sameGroup ? Math.max(0, undoStack.length - 1) : undoStack.length;
15937 const undoCallback = await callback();
15938 if (!undoCallback) return;
15939 redoStack = [];
15940 const currentUndo = undoStack[nextIndex];
15941 undoStack[nextIndex] = createUndoCallback(async () => {
15942 await undoCallback?.();
15943 const currentRedo = await currentUndo?.();
15944 return async () => {
15945 await currentRedo?.();
15946 await callback?.();
15947 };
15948 });
15949 while (undoStack.length > limit) undoStack.shift();
15950 };
15951 return {
15952 canUndo,
15953 canRedo,
15954 undo,
15955 redo,
15956 execute
15957 };
15958 }
15959
15960 // node_modules/@ariakit/react-utils/dist/index.js
15961 var React47 = __toESM(require_react(), 1);
15962 var import_react12 = __toESM(require_react(), 1);
15963 var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
15964 function setRef(ref, value) {
15965 if (typeof ref === "function") {
15966 const cleanup = ref(value);
15967 if (typeof cleanup === "function") return cleanup;
15968 } else if (ref) ref.current = value;
15969 }
15970 function isValidElementWithRef(element) {
15971 if (!element) return false;
15972 if (!(0, import_react12.isValidElement)(element)) return false;
15973 if ("ref" in element.props) return true;
15974 if ("ref" in element) return true;
15975 return false;
15976 }
15977 function getRefProperty(element) {
15978 if (!isValidElementWithRef(element)) return null;
15979 return { ...element.props }.ref || element.ref;
15980 }
15981 function mergeProps2(base, overrides) {
15982 const props = { ...base };
15983 for (const key in overrides) {
15984 if (!hasOwnProperty(overrides, key)) continue;
15985 if (key === "className") {
15986 const prop = "className";
15987 const baseClass = base[prop];
15988 const overrideClass = overrides[prop];
15989 if (baseClass && overrideClass) props[prop] = `${baseClass} ${overrideClass}`;
15990 else props[prop] = overrideClass || baseClass;
15991 continue;
15992 }
15993 if (key === "style") {
15994 const prop = "style";
15995 props[prop] = base[prop] ? {
15996 ...base[prop],
15997 ...overrides[prop]
15998 } : overrides[prop];
15999 continue;
16000 }
16001 const overrideValue = overrides[key];
16002 if (key.startsWith("on")) {
16003 if (typeof overrideValue !== "function") continue;
16004 const baseValue = base[key];
16005 if (typeof baseValue === "function") {
16006 props[key] = (...args) => {
16007 overrideValue(...args);
16008 baseValue(...args);
16009 };
16010 continue;
16011 }
16012 }
16013 props[key] = overrideValue;
16014 }
16015 return props;
16016 }
16017 var _React = { ...React47 };
16018 var useReactId = _React.useId;
16019 var useReactDeferredValue = _React.useDeferredValue;
16020 var useReactInsertionEffect = _React.useInsertionEffect;
16021 var useSafeLayoutEffect = canUseDOM ? import_react12.useLayoutEffect : import_react12.useEffect;
16022 function useInitialValue(value) {
16023 const [initialValue] = (0, import_react12.useState)(value);
16024 return initialValue;
16025 }
16026 function useLiveRef(value) {
16027 const ref = (0, import_react12.useRef)(value);
16028 useSafeLayoutEffect(() => {
16029 ref.current = value;
16030 });
16031 return ref;
16032 }
16033 function useEvent(callback) {
16034 const ref = (0, import_react12.useRef)(() => {
16035 throw new Error("Cannot call an event handler while rendering.");
16036 });
16037 if (useReactInsertionEffect) useReactInsertionEffect(() => {
16038 ref.current = callback;
16039 });
16040 else ref.current = callback;
16041 return (0, import_react12.useCallback)((...args) => ref.current?.(...args), []);
16042 }
16043 function useTransactionState(callback) {
16044 const [state, setState] = (0, import_react12.useState)(null);
16045 useSafeLayoutEffect(() => {
16046 if (state == null) return;
16047 if (!callback) return;
16048 let prevState = null;
16049 callback((prev) => {
16050 prevState = prev;
16051 return state;
16052 });
16053 return () => {
16054 callback(prevState);
16055 };
16056 }, [state, callback]);
16057 return [state, setState];
16058 }
16059 function useMergeRefs(...refs) {
16060 return (0, import_react12.useMemo)(() => {
16061 if (!refs.some(Boolean)) return;
16062 return (value) => {
16063 const refEffects = [];
16064 for (const ref of refs) {
16065 if (!ref) continue;
16066 const cleanup = setRef(ref, value);
16067 refEffects.push({
16068 ref,
16069 cleanup: typeof cleanup === "function" ? cleanup : void 0
16070 });
16071 }
16072 if (!refEffects.some((effect) => effect.cleanup)) return;
16073 return () => {
16074 for (const { ref, cleanup } of refEffects) if (cleanup) cleanup();
16075 else setRef(ref, null);
16076 };
16077 };
16078 }, refs);
16079 }
16080 function useId4(defaultId) {
16081 if (useReactId) {
16082 const reactId = useReactId();
16083 if (defaultId) return defaultId;
16084 return reactId;
16085 }
16086 const [id, setId] = (0, import_react12.useState)(defaultId);
16087 useSafeLayoutEffect(() => {
16088 if (defaultId || id) return;
16089 setId(`id-${Math.random().toString(36).slice(2, 8)}`);
16090 }, [defaultId, id]);
16091 return defaultId || id;
16092 }
16093 function useTagName(refOrElement, type) {
16094 const stringOrUndefined = (type2) => {
16095 if (typeof type2 !== "string") return;
16096 return type2;
16097 };
16098 const [tagName, setTagName] = (0, import_react12.useState)(() => stringOrUndefined(type));
16099 useSafeLayoutEffect(() => {
16100 setTagName((refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement)?.tagName.toLowerCase() || stringOrUndefined(type));
16101 }, [refOrElement, type]);
16102 return tagName;
16103 }
16104 function useAttribute(refOrElement, attributeName, defaultValue2) {
16105 const initialValue = useInitialValue(defaultValue2);
16106 const [attribute, setAttribute] = (0, import_react12.useState)(initialValue);
16107 (0, import_react12.useEffect)(() => {
16108 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement;
16109 if (!element) return;
16110 const callback = () => {
16111 const value = element.getAttribute(attributeName);
16112 setAttribute(value == null ? initialValue : value);
16113 };
16114 const observer = new MutationObserver(callback);
16115 observer.observe(element, { attributeFilter: [attributeName] });
16116 callback();
16117 return () => observer.disconnect();
16118 }, [
16119 refOrElement,
16120 attributeName,
16121 initialValue
16122 ]);
16123 return attribute;
16124 }
16125 function useUpdateEffect(effect, deps) {
16126 const mounted = (0, import_react12.useRef)(false);
16127 (0, import_react12.useEffect)(() => {
16128 if (mounted.current) return effect();
16129 mounted.current = true;
16130 }, deps);
16131 (0, import_react12.useEffect)(() => () => {
16132 mounted.current = false;
16133 }, []);
16134 }
16135 function useUpdateLayoutEffect(effect, deps) {
16136 const mounted = (0, import_react12.useRef)(false);
16137 useSafeLayoutEffect(() => {
16138 if (mounted.current) return effect();
16139 mounted.current = true;
16140 }, deps);
16141 useSafeLayoutEffect(() => () => {
16142 mounted.current = false;
16143 }, []);
16144 }
16145 function useForceUpdate() {
16146 return (0, import_react12.useReducer)(() => [], []);
16147 }
16148 function useBooleanEvent(booleanOrCallback) {
16149 return useEvent(typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback);
16150 }
16151 function useWrapElement(props, callback, deps = []) {
16152 const wrapElement = (0, import_react12.useCallback)((element) => {
16153 if (props.wrapElement) element = props.wrapElement(element);
16154 return callback(element);
16155 }, [...deps, props.wrapElement]);
16156 return {
16157 ...props,
16158 wrapElement
16159 };
16160 }
16161 function useMetadataProps(props, key, value) {
16162 const parent = props.onLoadedMetadataCapture;
16163 const onLoadedMetadataCapture = (0, import_react12.useMemo)(() => {
16164 return Object.assign(() => {
16165 }, parent, ...value !== void 0 ? [{ [key]: value }] : []);
16166 }, [
16167 parent,
16168 key,
16169 value
16170 ]);
16171 return [parent?.[key], { onLoadedMetadataCapture }];
16172 }
16173 var hasInstalledGlobalEventListeners = false;
16174 function useIsMouseMoving() {
16175 (0, import_react12.useEffect)(() => {
16176 if (hasInstalledGlobalEventListeners) return;
16177 addGlobalEventListener("mousemove", setMouseMoving, true);
16178 addGlobalEventListener("mousedown", resetMouseMoving, true);
16179 addGlobalEventListener("mouseup", resetMouseMoving, true);
16180 addGlobalEventListener("keydown", resetMouseMoving, true);
16181 addGlobalEventListener("scroll", resetMouseMoving, true);
16182 hasInstalledGlobalEventListeners = true;
16183 }, []);
16184 return useEvent(() => mouseMoving);
16185 }
16186 var mouseMoving = false;
16187 var previousScreenX = 0;
16188 var previousScreenY = 0;
16189 function hasMouseMovement(event) {
16190 const movementX = event.movementX || event.screenX - previousScreenX;
16191 const movementY = event.movementY || event.screenY - previousScreenY;
16192 previousScreenX = event.screenX;
16193 previousScreenY = event.screenY;
16194 return movementX || movementY || false;
16195 }
16196 function setMouseMoving(event) {
16197 if (!hasMouseMovement(event)) return;
16198 mouseMoving = true;
16199 }
16200 function resetMouseMoving() {
16201 mouseMoving = false;
16202 }
16203 function forwardRef29(render4) {
16204 const Role = React47.forwardRef((props, ref) => render4({
16205 ...props,
16206 ref
16207 }));
16208 Role.displayName = render4.displayName || render4.name;
16209 return Role;
16210 }
16211 function memo3(Component, propsAreEqual) {
16212 return React47.memo(Component, propsAreEqual);
16213 }
16214 function createElement3(Type, props) {
16215 const { wrapElement, render: render4, ...rest } = props;
16216 const mergedRef = useMergeRefs(props.ref, getRefProperty(render4));
16217 let element;
16218 if (React47.isValidElement(render4)) {
16219 const renderProps = {
16220 ...render4.props,
16221 ref: mergedRef
16222 };
16223 element = React47.cloneElement(render4, mergeProps2(rest, renderProps));
16224 } else if (render4) element = render4(rest);
16225 else element = /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Type, { ...rest });
16226 if (wrapElement) return wrapElement(element);
16227 return element;
16228 }
16229 function createHook(useProps) {
16230 const useRole = (props = {}) => {
16231 return useProps(props);
16232 };
16233 useRole.displayName = useProps.name;
16234 return useRole;
16235 }
16236 function createStoreContext(providers = [], scopedProviders = []) {
16237 const context = React47.createContext(void 0);
16238 const scopedContext = React47.createContext(void 0);
16239 const useContext38 = () => React47.useContext(context);
16240 const useScopedContext = (onlyScoped = false) => {
16241 const scoped = React47.useContext(scopedContext);
16242 const store = useContext38();
16243 if (onlyScoped) return scoped;
16244 return scoped || store;
16245 };
16246 const useProviderContext = () => {
16247 const scoped = React47.useContext(scopedContext);
16248 const store = useContext38();
16249 if (scoped && scoped === store) return;
16250 return store;
16251 };
16252 const ContextProvider = (props) => {
16253 return providers.reduceRight((children, Provider2) => /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Provider2, {
16254 ...props,
16255 children
16256 }), /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(context.Provider, { ...props }));
16257 };
16258 const ScopedContextProvider = (props) => {
16259 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(ContextProvider, {
16260 ...props,
16261 children: scopedProviders.reduceRight((children, Provider2) => /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Provider2, {
16262 ...props,
16263 children
16264 }), /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(scopedContext.Provider, { ...props }))
16265 });
16266 };
16267 return {
16268 context,
16269 scopedContext,
16270 useContext: useContext38,
16271 useScopedContext,
16272 useProviderContext,
16273 ContextProvider,
16274 ScopedContextProvider
16275 };
16276 }
16277
16278 // node_modules/@ariakit/react-components/dist/focusable/focusable.js
16279 var import_react13 = __toESM(require_react(), 1);
16280 var TagName = "div";
16281 var accessibleWhenDisabledSymbol = /* @__PURE__ */ Symbol("accessibleWhenDisabled");
16282 var isSafariBrowser = isSafari();
16283 var alwaysFocusVisibleInputTypes = [
16284 "text",
16285 "search",
16286 "url",
16287 "tel",
16288 "email",
16289 "password",
16290 "number",
16291 "date",
16292 "month",
16293 "week",
16294 "time",
16295 "datetime",
16296 "datetime-local"
16297 ];
16298 function isAlwaysFocusVisible(element) {
16299 const { tagName, readOnly, type } = element;
16300 if (tagName === "TEXTAREA" && !readOnly) return true;
16301 if (tagName === "SELECT" && !readOnly) return true;
16302 if (tagName === "INPUT" && !readOnly) return alwaysFocusVisibleInputTypes.includes(type);
16303 if (element.isContentEditable) return true;
16304 if (element.getAttribute("role") === "combobox" && element.dataset.name) return true;
16305 return false;
16306 }
16307 function isNativeTabbable(tagName) {
16308 if (!tagName) return true;
16309 return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a";
16310 }
16311 function supportsDisabledAttribute(tagName) {
16312 if (!tagName) return true;
16313 return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea";
16314 }
16315 function isNativeSubmitControl(element) {
16316 if (element.tagName === "BUTTON") {
16317 const { type } = element;
16318 return type === "submit";
16319 }
16320 if (element.tagName === "INPUT") {
16321 const { type } = element;
16322 return type === "submit" || type === "image";
16323 }
16324 return false;
16325 }
16326 function getTabIndex2({ focusable: focusable2, trulyDisabled, nativeTabbable, supportsDisabled, safariTabIndex, tabIndexProp }) {
16327 if (!focusable2) return tabIndexProp;
16328 if (trulyDisabled) {
16329 if (nativeTabbable && !supportsDisabled) return -1;
16330 return;
16331 }
16332 if (nativeTabbable) {
16333 if (safariTabIndex && tabIndexProp == null) return 0;
16334 return tabIndexProp;
16335 }
16336 return tabIndexProp ?? 0;
16337 }
16338 function useDisableEvent(onEvent, disabled2) {
16339 return useEvent((event) => {
16340 onEvent?.(event);
16341 if (event.defaultPrevented) return;
16342 if (disabled2) {
16343 event.stopPropagation();
16344 event.preventDefault();
16345 }
16346 });
16347 }
16348 var hasInstalledGlobalEventListeners2 = false;
16349 var isKeyboardModality = true;
16350 function onGlobalMouseDown(event) {
16351 const target = event.target;
16352 if (isElement2(target) && !target.hasAttribute("data-focus-visible")) isKeyboardModality = false;
16353 }
16354 function onGlobalKeyDown(event) {
16355 if (event.metaKey) return;
16356 if (event.ctrlKey) return;
16357 if (event.altKey) return;
16358 isKeyboardModality = true;
16359 }
16360 var useFocusable = createHook(function useFocusable2({ focusable: focusable2 = true, accessibleWhenDisabled, autoFocus, onFocusVisible, ...props }) {
16361 const ref = (0, import_react13.useRef)(null);
16362 const [parentAccessibleWhenDisabled, metadataProps] = useMetadataProps(props, accessibleWhenDisabledSymbol, accessibleWhenDisabled);
16363 accessibleWhenDisabled ??= parentAccessibleWhenDisabled;
16364 (0, import_react13.useEffect)(() => {
16365 if (!focusable2) return;
16366 if (hasInstalledGlobalEventListeners2) return;
16367 addGlobalEventListener("mousedown", onGlobalMouseDown, true);
16368 addGlobalEventListener("keydown", onGlobalKeyDown, true);
16369 hasInstalledGlobalEventListeners2 = true;
16370 }, [focusable2]);
16371 const disabled2 = focusable2 && disabledFromProps(props);
16372 const trulyDisabled = disabled2 && !accessibleWhenDisabled;
16373 const [focusVisible, setFocusVisible] = (0, import_react13.useState)(false);
16374 const focusVisibleRef = (0, import_react13.useRef)(false);
16375 const nativeSubmitObserverCleanupRef = (0, import_react13.useRef)(null);
16376 const cleanupFocusVisible = useEvent((element) => {
16377 nativeSubmitObserverCleanupRef.current?.();
16378 nativeSubmitObserverCleanupRef.current = null;
16379 focusVisibleRef.current = false;
16380 element?.removeAttribute("data-focus-visible");
16381 });
16382 (0, import_react13.useEffect)(() => {
16383 if (!focusable2) return;
16384 if (!trulyDisabled) return;
16385 cleanupFocusVisible(ref.current);
16386 if (focusVisible) setFocusVisible(false);
16387 }, [
16388 focusable2,
16389 trulyDisabled,
16390 focusVisible,
16391 cleanupFocusVisible
16392 ]);
16393 (0, import_react13.useEffect)(() => {
16394 if (!focusable2) return;
16395 if (!focusVisible) return;
16396 const element = ref.current;
16397 if (!element) return;
16398 if (typeof IntersectionObserver === "undefined") return;
16399 const observer = new IntersectionObserver(() => {
16400 if (!isFocusable(element)) {
16401 focusVisibleRef.current = false;
16402 setFocusVisible(false);
16403 }
16404 });
16405 observer.observe(element);
16406 return () => observer.disconnect();
16407 }, [focusable2, focusVisible]);
16408 (0, import_react13.useEffect)(() => {
16409 return () => nativeSubmitObserverCleanupRef.current?.();
16410 }, []);
16411 const onKeyPressCapture = useDisableEvent(props.onKeyPressCapture, disabled2);
16412 const onMouseDownCapture = useDisableEvent(props.onMouseDownCapture, disabled2);
16413 const onClickCapture = useDisableEvent(props.onClickCapture, disabled2);
16414 const handleFocusVisible = (event, currentTarget) => {
16415 if (currentTarget) event.currentTarget = currentTarget;
16416 if (!focusable2) return;
16417 const element = event.currentTarget;
16418 if (!element) return;
16419 if (!hasFocus(element)) return;
16420 onFocusVisible?.(event);
16421 if (event.defaultPrevented) return;
16422 element.dataset.focusVisible = "true";
16423 focusVisibleRef.current = true;
16424 if (isNativeSubmitControl(element)) {
16425 nativeSubmitObserverCleanupRef.current?.();
16426 nativeSubmitObserverCleanupRef.current = null;
16427 if (typeof IntersectionObserver !== "undefined") {
16428 const observer = new IntersectionObserver(() => {
16429 if (isFocusable(element)) return;
16430 cleanupFocusVisible(element);
16431 });
16432 observer.observe(element);
16433 nativeSubmitObserverCleanupRef.current = () => observer.disconnect();
16434 }
16435 return;
16436 }
16437 setFocusVisible(true);
16438 };
16439 const onKeyDownCaptureProp = props.onKeyDownCapture;
16440 const onKeyDownCapture = useEvent((event) => {
16441 onKeyDownCaptureProp?.(event);
16442 if (event.defaultPrevented) return;
16443 if (!focusable2) return;
16444 if (focusVisible) return;
16445 if (focusVisibleRef.current) return;
16446 if (event.metaKey) return;
16447 if (event.altKey) return;
16448 if (event.ctrlKey) return;
16449 if (!isSelfTarget(event)) return;
16450 const element = event.currentTarget;
16451 const applyFocusVisible = () => handleFocusVisible(event, element);
16452 queueBeforeEvent(element, "focusout", applyFocusVisible);
16453 });
16454 const onFocusCaptureProp = props.onFocusCapture;
16455 const onFocusCapture = useEvent((event) => {
16456 onFocusCaptureProp?.(event);
16457 if (event.defaultPrevented) return;
16458 if (!focusable2) return;
16459 if (!isSelfTarget(event)) {
16460 setFocusVisible(false);
16461 return;
16462 }
16463 const element = event.currentTarget;
16464 const applyFocusVisible = () => handleFocusVisible(event, element);
16465 if (isKeyboardModality || isAlwaysFocusVisible(event.target)) queueBeforeEvent(event.target, "focusout", applyFocusVisible);
16466 else setFocusVisible(false);
16467 });
16468 const onBlurProp = props.onBlur;
16469 const onBlur = useEvent((event) => {
16470 onBlurProp?.(event);
16471 if (!focusable2) return;
16472 if (!isFocusEventOutside(event)) return;
16473 cleanupFocusVisible(event.currentTarget);
16474 setFocusVisible(false);
16475 });
16476 const autoFocusOnShow = (0, import_react13.useContext)(FocusableContext);
16477 const autoFocusRef = useEvent((element) => {
16478 if (!focusable2) return;
16479 if (!autoFocus) return;
16480 if (!element) return;
16481 if (!autoFocusOnShow) return;
16482 queueMicrotask(() => {
16483 if (hasFocus(element)) return;
16484 if (!isFocusable(element)) return;
16485 element.focus();
16486 });
16487 });
16488 const tagName = useTagName(ref);
16489 const nativeTabbable = focusable2 && isNativeTabbable(tagName);
16490 const supportsDisabled = focusable2 && supportsDisabledAttribute(tagName);
16491 const [safariTabIndex, setSafariTabIndex] = (0, import_react13.useState)(false);
16492 if (isSafariBrowser) (0, import_react13.useEffect)(() => {
16493 if (!focusable2) return;
16494 const element = ref.current;
16495 if (!element) return;
16496 const { type } = element;
16497 const isNativeCheckboxOrRadio = element.tagName === "INPUT" && (type === "checkbox" || type === "radio");
16498 setSafariTabIndex(isButton(element) || isNativeCheckboxOrRadio);
16499 }, [focusable2]);
16500 const styleProp = props.style;
16501 const style = (0, import_react13.useMemo)(() => {
16502 if (trulyDisabled) return {
16503 pointerEvents: "none",
16504 ...styleProp
16505 };
16506 return styleProp;
16507 }, [trulyDisabled, styleProp]);
16508 props = {
16509 "data-focus-visible": focusable2 && focusVisible || void 0,
16510 "data-autofocus": autoFocus || void 0,
16511 "aria-disabled": disabled2 || void 0,
16512 ...props,
16513 ...metadataProps,
16514 ref: useMergeRefs(ref, autoFocusRef, props.ref),
16515 style,
16516 tabIndex: getTabIndex2({
16517 focusable: focusable2,
16518 trulyDisabled,
16519 nativeTabbable,
16520 supportsDisabled,
16521 safariTabIndex,
16522 tabIndexProp: props.tabIndex
16523 }),
16524 disabled: supportsDisabled && trulyDisabled ? true : void 0,
16525 contentEditable: disabled2 ? void 0 : props.contentEditable,
16526 onKeyPressCapture,
16527 onClickCapture,
16528 onMouseDownCapture,
16529 onKeyDownCapture,
16530 onFocusCapture,
16531 onBlur
16532 };
16533 return removeUndefinedValues(props);
16534 });
16535 var Focusable = forwardRef29(function Focusable2(props) {
16536 return createElement3(TagName, useFocusable(props));
16537 });
16538
16539 // node_modules/@ariakit/react-components/dist/command/command.js
16540 var import_react14 = __toESM(require_react(), 1);
16541 var TagName2 = "button";
16542 function isNativeClick(event) {
16543 if (!event.isTrusted) return false;
16544 const element = event.currentTarget;
16545 if (event.key === "Enter") return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A";
16546 if (event.key === " ") return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT";
16547 return false;
16548 }
16549 var symbol = /* @__PURE__ */ Symbol("command");
16550 var useCommand = createHook(function useCommand2({ clickOnEnter = true, clickOnSpace = true, ...props }) {
16551 const ref = (0, import_react14.useRef)(null);
16552 const [isNativeButton, setIsNativeButton] = (0, import_react14.useState)(false);
16553 (0, import_react14.useEffect)(() => {
16554 if (!ref.current) return;
16555 setIsNativeButton(isButton(ref.current));
16556 }, []);
16557 const [active, setActive] = (0, import_react14.useState)(false);
16558 const activeRef = (0, import_react14.useRef)(false);
16559 const disabled2 = disabledFromProps(props);
16560 const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true);
16561 useSafeLayoutEffect(() => {
16562 if (!disabled2) return;
16563 activeRef.current = false;
16564 setActive(false);
16565 }, [disabled2]);
16566 const onKeyDownProp = props.onKeyDown;
16567 const onKeyDown = useEvent((event) => {
16568 onKeyDownProp?.(event);
16569 const element = event.currentTarget;
16570 if (event.defaultPrevented) return;
16571 if (isDuplicate) return;
16572 if (disabled2) return;
16573 if (!isSelfTarget(event)) return;
16574 if (isTextField(element)) return;
16575 if (element.isContentEditable) return;
16576 const isEnter = clickOnEnter && event.key === "Enter";
16577 const isSpace = clickOnSpace && event.key === " ";
16578 const shouldPreventEnter = event.key === "Enter" && !clickOnEnter;
16579 const shouldPreventSpace = event.key === " " && !clickOnSpace;
16580 if (shouldPreventEnter || shouldPreventSpace) {
16581 event.preventDefault();
16582 return;
16583 }
16584 if (isEnter || isSpace) {
16585 const nativeClick = isNativeClick(event);
16586 if (isEnter) {
16587 if (!nativeClick) {
16588 event.preventDefault();
16589 const { view, ...eventInit } = event;
16590 const click = () => fireClickEvent(element, eventInit);
16591 if (isFirefox()) queueBeforeEvent(element, "keyup", click);
16592 else queueMicrotask(click);
16593 }
16594 } else if (isSpace) {
16595 activeRef.current = true;
16596 if (!nativeClick) {
16597 event.preventDefault();
16598 setActive(true);
16599 }
16600 }
16601 }
16602 });
16603 const onKeyUpProp = props.onKeyUp;
16604 const onKeyUp = useEvent((event) => {
16605 onKeyUpProp?.(event);
16606 if (isDuplicate) return;
16607 const isSpace = clickOnSpace && event.key === " ";
16608 if (!activeRef.current || !isSpace) return;
16609 const nativeClick = isNativeClick(event);
16610 activeRef.current = false;
16611 if (!nativeClick) setActive(false);
16612 if (event.defaultPrevented) return;
16613 if (!isSelfTarget(event)) return;
16614 if (disabled2) return;
16615 if (event.metaKey) return;
16616 if (nativeClick) return;
16617 event.preventDefault();
16618 const element = event.currentTarget;
16619 const { view, ...eventInit } = event;
16620 queueMicrotask(() => fireClickEvent(element, eventInit));
16621 });
16622 const onBlurProp = props.onBlur;
16623 const onBlur = useEvent((event) => {
16624 onBlurProp?.(event);
16625 if (!activeRef.current) return;
16626 activeRef.current = false;
16627 setActive(false);
16628 });
16629 props = {
16630 "data-active": active || void 0,
16631 type: isNativeButton ? "button" : void 0,
16632 ...metadataProps,
16633 ...props,
16634 ref: useMergeRefs(ref, props.ref),
16635 onKeyDown,
16636 onKeyUp,
16637 onBlur
16638 };
16639 props = useFocusable(props);
16640 return props;
16641 });
16642 var Command = forwardRef29(function Command2(props) {
16643 return createElement3(TagName2, useCommand(props));
16644 });
16645
16646 // node_modules/@ariakit/react-components/dist/collection/collection-context.js
16647 var ctx = createStoreContext();
16648 var useCollectionContext = ctx.useContext;
16649 var useCollectionScopedContext = ctx.useScopedContext;
16650 var useCollectionProviderContext = ctx.useProviderContext;
16651 var CollectionContextProvider = ctx.ContextProvider;
16652 var CollectionScopedContextProvider = ctx.ScopedContextProvider;
16653
16654 // node_modules/@ariakit/react-components/dist/collection/collection-item.js
16655 var import_react15 = __toESM(require_react(), 1);
16656 var TagName3 = "div";
16657 var useCollectionItem = createHook(function useCollectionItem2({ store, shouldRegisterItem = true, getItem = identity, element, ...props }) {
16658 const context = useCollectionContext();
16659 store = store || context;
16660 const id = useId4(props.id);
16661 const ref = (0, import_react15.useRef)(element);
16662 (0, import_react15.useEffect)(() => {
16663 const element2 = ref.current;
16664 if (!id) return;
16665 if (!element2) return;
16666 if (!shouldRegisterItem) return;
16667 const item = getItem({
16668 id,
16669 element: element2
16670 });
16671 return store?.renderItem(item);
16672 }, [
16673 id,
16674 shouldRegisterItem,
16675 getItem,
16676 store
16677 ]);
16678 props = {
16679 ...props,
16680 ref: useMergeRefs(ref, props.ref)
16681 };
16682 return removeUndefinedValues(props);
16683 });
16684 var CollectionItem = forwardRef29(function CollectionItem2(props) {
16685 return createElement3(TagName3, useCollectionItem(props));
16686 });
16687
16688 // node_modules/@ariakit/react-components/dist/composite/composite-context.js
16689 var import_react16 = __toESM(require_react(), 1);
16690 var ctx2 = createStoreContext([CollectionContextProvider], [CollectionScopedContextProvider]);
16691 var useCompositeContext = ctx2.useContext;
16692 var useCompositeScopedContext = ctx2.useScopedContext;
16693 var useCompositeProviderContext = ctx2.useProviderContext;
16694 var CompositeContextProvider = ctx2.ContextProvider;
16695 var CompositeScopedContextProvider = ctx2.ScopedContextProvider;
16696 var CompositeItemContext = (0, import_react16.createContext)(void 0);
16697 var CompositeRowContext = (0, import_react16.createContext)(void 0);
16698
16699 // node_modules/@ariakit/store/dist/index.js
16700 function getInternal(store, key) {
16701 const internals = store.__unstableInternals;
16702 invariant(internals, "Invalid store");
16703 return internals[key];
16704 }
16705 function hasUpdatedKey(keys, updatedKey) {
16706 if (!keys) return true;
16707 for (const currentKey of keys) if (updatedKey instanceof Set) {
16708 if (updatedKey.has(currentKey)) return true;
16709 } else if (currentKey === updatedKey) return true;
16710 return false;
16711 }
16712 function isSameValue(value, other) {
16713 return value === other || value !== value && other !== other;
16714 }
16715 function getCleanupPrevState(prevState, state, stateBeforeCleanup, updatedKey) {
16716 let cleanupPrevState;
16717 for (const key of getKeys(state)) {
16718 if (isSameValue(state[key], stateBeforeCleanup[key])) continue;
16719 if (updatedKey !== void 0 && hasUpdatedKey([key], updatedKey)) continue;
16720 cleanupPrevState ??= { ...prevState };
16721 cleanupPrevState[key] = state[key];
16722 }
16723 return cleanupPrevState;
16724 }
16725 var MAX_REPAIR_PASSES = 100;
16726 function addKeyedListener(map, keys, listener) {
16727 if (!keys) return;
16728 for (const key of keys) {
16729 let listeners = map.get(key);
16730 if (!listeners) {
16731 listeners = /* @__PURE__ */ new Set();
16732 map.set(key, listeners);
16733 }
16734 listeners.add(listener);
16735 }
16736 }
16737 function deleteKeyedListener(map, keys, listener) {
16738 if (!map) return;
16739 if (!keys) return;
16740 for (const key of keys) {
16741 const listeners = map.get(key);
16742 if (!listeners) continue;
16743 listeners.delete(listener);
16744 if (!listeners.size) map.delete(key);
16745 }
16746 }
16747 function getFastPathNotifiedListeners(frame) {
16748 const notifiedListeners = /* @__PURE__ */ new Set();
16749 const currentListener = frame.currentListener;
16750 if (!currentListener) return notifiedListeners;
16751 for (const listener of frame.keyedListeners) {
16752 notifiedListeners.add(listener);
16753 if (listener === currentListener) return notifiedListeners;
16754 }
16755 notifiedListeners.clear();
16756 notifiedListeners.add(currentListener);
16757 return notifiedListeners;
16758 }
16759 function preserveFastPathNotifiedListeners(frame) {
16760 frame.notifiedListeners ??= getFastPathNotifiedListeners(frame);
16761 }
16762 function hasFastPathPassedListener(frame, listener) {
16763 if (!frame.currentListener) return false;
16764 let foundCurrentKeyedListener = false;
16765 for (const currentListener of frame.keyedListeners) {
16766 if (currentListener === frame.currentListener) {
16767 foundCurrentKeyedListener = true;
16768 continue;
16769 }
16770 if (!foundCurrentKeyedListener) continue;
16771 if (currentListener === listener) return false;
16772 }
16773 let foundListener = false;
16774 for (const currentListener of frame.group.listeners) {
16775 if (currentListener === frame.currentListener) return foundListener;
16776 if (currentListener === listener) foundListener = true;
16777 }
16778 return false;
16779 }
16780 function preserveFastPathFrames(fastPathFrames, group, listener) {
16781 for (const frame of fastPathFrames) {
16782 if (frame.group !== group) continue;
16783 if (frame.recovering) continue;
16784 if (listener && !frame.keyedListeners.has(listener)) continue;
16785 preserveFastPathNotifiedListeners(frame);
16786 for (const currentListener of frame.group.listeners) {
16787 if (currentListener === frame.currentListener) break;
16788 if (!hasFastPathPassedListener(frame, currentListener)) continue;
16789 frame.notifiedListeners?.add(currentListener);
16790 }
16791 }
16792 }
16793 function preserveFastPathPassedListeners(fastPathFrames, group, listener) {
16794 for (const frame of fastPathFrames) {
16795 if (frame.group !== group) continue;
16796 if (frame.recovering) continue;
16797 if (!hasFastPathPassedListener(frame, listener)) continue;
16798 preserveFastPathNotifiedListeners(frame);
16799 frame.notifiedListeners?.add(listener);
16800 }
16801 }
16802 function preserveFastPathPassedKeyedListeners({ fastPathFrames, group, keys, listener }) {
16803 const wasRegistered = group.listeners.has(listener);
16804 for (const frame of fastPathFrames) {
16805 if (frame.group !== group) continue;
16806 if (frame.recovering) continue;
16807 if (!keys.includes(frame.updatedKey)) continue;
16808 if (hasFastPathPassedListener(frame, listener)) {
16809 preserveFastPathNotifiedListeners(frame);
16810 frame.notifiedListeners?.add(listener);
16811 } else if (wasRegistered) {
16812 preserveFastPathNotifiedListeners(frame);
16813 frame.recoverToLive = true;
16814 }
16815 }
16816 }
16817 function clearFastPathNotifiedListener(fastPathFrames, group, listener) {
16818 for (const frame of fastPathFrames) {
16819 if (frame.group !== group) continue;
16820 frame.notifiedListeners?.delete(listener);
16821 }
16822 }
16823 function addFastPathKeyedListener({ fastPathFrames, group, keys, listener }) {
16824 for (const frame of fastPathFrames) {
16825 if (frame.group !== group) continue;
16826 if (frame.recovering) continue;
16827 if (!keys.includes(frame.updatedKey)) continue;
16828 frame.keyedListeners.add(listener);
16829 }
16830 }
16831 function runPendingCleanup(group, listener) {
16832 if (!group.disposables.size) return;
16833 const cleanup = group.disposables.get(listener);
16834 if (!cleanup) return;
16835 group.disposables.delete(listener);
16836 cleanup();
16837 }
16838 function setListenerCleanup(group, listener, cleanup) {
16839 const currentCleanup = group.disposables.get(listener);
16840 if (!currentCleanup) {
16841 group.disposables.set(listener, cleanup);
16842 return;
16843 }
16844 group.disposables.set(listener, () => {
16845 currentCleanup();
16846 cleanup();
16847 });
16848 }
16849 function notifyStoreListener(group, listener, state, prevState, getState, updatedKey) {
16850 if (group.suspendCounts?.has(listener)) return;
16851 const { disposables } = group;
16852 const cleanup = disposables.size ? disposables.get(listener) : void 0;
16853 if (cleanup) {
16854 disposables.delete(listener);
16855 const stateBeforeCleanup = state;
16856 cleanup();
16857 state = getState?.() ?? state;
16858 if (state !== stateBeforeCleanup) prevState = getCleanupPrevState(prevState, state, stateBeforeCleanup, updatedKey) ?? prevState;
16859 }
16860 const result = listener(state, prevState);
16861 if (result) setListenerCleanup(group, listener, result);
16862 }
16863 function runLiveListeners({ group, getState, prevState, updatedKey, notifiedListeners }) {
16864 const allKeysListeners = group.allKeysListeners;
16865 for (const listener of group.listeners) {
16866 if (notifiedListeners?.has(listener)) continue;
16867 if (!allKeysListeners?.has(listener)) {
16868 if (!hasUpdatedKey(group.listenerKeys.get(listener), updatedKey)) continue;
16869 }
16870 notifiedListeners?.add(listener);
16871 notifyStoreListener(group, listener, getState(), prevState, getState, updatedKey);
16872 }
16873 }
16874 function createStore(initialState, ...stores) {
16875 let state = initialState;
16876 let prevStateBatch = state;
16877 let destroy = noop4;
16878 let batchPending = false;
16879 let inDispatch = false;
16880 let updatedKeys = /* @__PURE__ */ new Set();
16881 const instances = /* @__PURE__ */ new Set();
16882 const setups = /* @__PURE__ */ new Set();
16883 const syncListenerGroup = {
16884 listeners: /* @__PURE__ */ new Set(),
16885 disposables: /* @__PURE__ */ new Map(),
16886 listenerKeys: /* @__PURE__ */ new WeakMap()
16887 };
16888 const batchListenerGroup = {
16889 listeners: /* @__PURE__ */ new Set(),
16890 disposables: /* @__PURE__ */ new Map(),
16891 listenerKeys: /* @__PURE__ */ new WeakMap()
16892 };
16893 const storeSetup = (callback) => {
16894 setups.add(callback);
16895 return () => setups.delete(callback);
16896 };
16897 const storeInit = () => {
16898 const initializedInstances = instances.size;
16899 const instance = /* @__PURE__ */ Symbol();
16900 instances.add(instance);
16901 const maybeDestroy = () => {
16902 if (!instances.delete(instance)) return;
16903 if (instances.size) return;
16904 destroy();
16905 };
16906 if (initializedInstances) return maybeDestroy;
16907 const stateKeys = getKeys(state);
16908 const desyncs = [];
16909 for (const store of stores) {
16910 const storeState = store?.getState?.();
16911 if (!storeState) continue;
16912 const keys = stateKeys.filter((key) => hasOwnProperty(storeState, key));
16913 if (!keys.length) continue;
16914 if (stores.length === 1 || keys.length === stateKeys.length) {
16915 for (const key of keys) desyncs.push(sync(store, [key], (state2) => {
16916 setState(key, state2[key], true);
16917 }));
16918 continue;
16919 }
16920 desyncs.push(subscribe(store, keys, (state2, prevState) => {
16921 for (const key of keys) {
16922 if (state2[key] === prevState[key]) continue;
16923 setState(key, state2[key], true);
16924 }
16925 }));
16926 for (const key of keys) {
16927 const liveState = store?.getState?.();
16928 if (!liveState) continue;
16929 setState(key, liveState[key], true);
16930 }
16931 }
16932 const teardowns = [];
16933 for (const setup2 of setups) teardowns.push(setup2());
16934 const cleanups = stores.map(init);
16935 destroy = chain(...desyncs, ...teardowns, ...cleanups);
16936 return maybeDestroy;
16937 };
16938 const deleteListenerIndexes = (group, listener, keys) => {
16939 if (keys === void 0) return;
16940 if (keys) deleteKeyedListener(group.listenersByKey, keys, listener);
16941 else group.allKeysListeners?.delete(listener);
16942 };
16943 const fastPathFrames = [];
16944 const registerListener = (keys, listener, group = syncListenerGroup) => {
16945 const listenerKeysValue = keys ? [...keys] : null;
16946 const wasRegistered = group.listeners.has(listener);
16947 if (!wasRegistered) clearFastPathNotifiedListener(fastPathFrames, group, listener);
16948 if (!listenerKeysValue) {
16949 if (wasRegistered) preserveFastPathFrames(fastPathFrames, group);
16950 preserveFastPathPassedListeners(fastPathFrames, group, listener);
16951 } else preserveFastPathPassedKeyedListeners({
16952 fastPathFrames,
16953 group,
16954 keys: listenerKeysValue,
16955 listener
16956 });
16957 if (wasRegistered) {
16958 preserveFastPathFrames(fastPathFrames, group, listener);
16959 deleteListenerIndexes(group, listener, group.listenerKeys.get(listener));
16960 }
16961 group.listeners.add(listener);
16962 if (listenerKeysValue) {
16963 group.listenersByKey ??= /* @__PURE__ */ new Map();
16964 addKeyedListener(group.listenersByKey, listenerKeysValue, listener);
16965 addFastPathKeyedListener({
16966 fastPathFrames,
16967 group,
16968 keys: listenerKeysValue,
16969 listener
16970 });
16971 } else {
16972 group.allKeysListeners ??= /* @__PURE__ */ new Set();
16973 group.allKeysListeners.add(listener);
16974 }
16975 group.listenerKeys.set(listener, listenerKeysValue);
16976 return () => {
16977 const cleanup = group.disposables.get(listener);
16978 group.disposables.delete(listener);
16979 preserveFastPathFrames(fastPathFrames, group, listener);
16980 const currentKeys = group.listenerKeys.get(listener);
16981 deleteListenerIndexes(group, listener, listenerKeysValue);
16982 if (currentKeys !== listenerKeysValue) deleteListenerIndexes(group, listener, currentKeys);
16983 group.listenerKeys.delete(listener);
16984 group.listeners.delete(listener);
16985 cleanup?.();
16986 };
16987 };
16988 const storeSubscribe = (keys, listener) => registerListener(keys, listener);
16989 const runInitialListener = (group, listener, prevState) => {
16990 const shouldSuspend = group.listeners.has(listener);
16991 if (shouldSuspend) {
16992 group.suspendCounts ??= /* @__PURE__ */ new Map();
16993 const count = group.suspendCounts.get(listener) ?? 0;
16994 group.suspendCounts.set(listener, count + 1);
16995 }
16996 let cleanupPrevState;
16997 try {
16998 const stateBeforeCleanups = state;
16999 runPendingCleanup(group, listener);
17000 if (state !== stateBeforeCleanups) cleanupPrevState = getCleanupPrevState(prevState, state, stateBeforeCleanups);
17001 const cleanup = listener(state, cleanupPrevState ?? prevState);
17002 if (cleanup) setListenerCleanup(group, listener, cleanup);
17003 } finally {
17004 if (shouldSuspend) {
17005 const suspendCounts = group.suspendCounts;
17006 const count = suspendCounts?.get(listener);
17007 if (count && count > 1) suspendCounts?.set(listener, count - 1);
17008 else suspendCounts?.delete(listener);
17009 if (!suspendCounts?.size) delete group.suspendCounts;
17010 }
17011 }
17012 };
17013 const storeSync = (keys, listener) => {
17014 runInitialListener(syncListenerGroup, listener, state);
17015 return registerListener(keys, listener);
17016 };
17017 const storeBatch = (keys, listener) => {
17018 if (!batchListenerGroup.listeners.size && !inDispatch) prevStateBatch = state;
17019 runInitialListener(batchListenerGroup, listener, prevStateBatch);
17020 return registerListener(keys, listener, batchListenerGroup);
17021 };
17022 const storePick = (keys) => createStore(pick(state, keys), finalStore);
17023 const storeOmit = (keys) => createStore(omit(state, keys), finalStore);
17024 const getState = () => state;
17025 const runListeners = (group, prevState, updatedKey) => {
17026 if (!(updatedKey instanceof Set) && !group.allKeysListeners?.size) {
17027 const keyedListeners = group.listenersByKey?.get(updatedKey);
17028 if (!keyedListeners) return;
17029 const frame = {
17030 group,
17031 keyedListeners,
17032 updatedKey,
17033 currentListener: null
17034 };
17035 fastPathFrames.push(frame);
17036 try {
17037 for (const listener of keyedListeners) {
17038 if (frame.notifiedListeners?.has(listener)) continue;
17039 frame.currentListener = listener;
17040 frame.notifiedListeners?.add(listener);
17041 notifyStoreListener(group, listener, state, prevState, getState, updatedKey);
17042 if (!group.allKeysListeners?.size && !frame.recoverToLive) continue;
17043 const notifiedListeners = frame.notifiedListeners ?? getFastPathNotifiedListeners(frame);
17044 frame.notifiedListeners = notifiedListeners;
17045 frame.recovering = true;
17046 runLiveListeners({
17047 group,
17048 getState,
17049 prevState,
17050 updatedKey,
17051 notifiedListeners
17052 });
17053 return;
17054 }
17055 } finally {
17056 fastPathFrames.pop();
17057 }
17058 return;
17059 }
17060 runLiveListeners({
17061 group,
17062 getState,
17063 prevState,
17064 updatedKey
17065 });
17066 };
17067 const setState = (key, value, fromStores = false) => {
17068 if (!hasOwnProperty(state, key)) return;
17069 const currentValue = state[key];
17070 const nextValue = typeof value === "function" ? value(currentValue) : value;
17071 if (isSameValue(nextValue, currentValue)) return;
17072 const wasInDispatch = inDispatch;
17073 inDispatch = true;
17074 const prevState = state;
17075 const nextState = {
17076 ...state,
17077 [key]: nextValue
17078 };
17079 state = nextState;
17080 let superseded = false;
17081 try {
17082 if (!fromStores && stores.length) {
17083 for (const store of stores) {
17084 store?.setState?.(key, nextValue);
17085 if (isSameValue(state[key], nextValue)) continue;
17086 superseded = true;
17087 break;
17088 }
17089 if (superseded) {
17090 let pass = 0;
17091 for (; pass < MAX_REPAIR_PASSES; pass += 1) {
17092 let changed = false;
17093 for (const store of stores) {
17094 const previousValue = state[key];
17095 store?.setState?.(key, previousValue);
17096 if (!isSameValue(state[key], previousValue)) changed = true;
17097 }
17098 if (!changed) break;
17099 }
17100 if (pass === MAX_REPAIR_PASSES) console.warn("Parent stores did not converge after a superseded fan-out; a parent listener may be rewriting this key in a cycle.");
17101 }
17102 }
17103 if (!superseded) runListeners(syncListenerGroup, state === nextState ? prevState : {
17104 ...state,
17105 [key]: prevState[key]
17106 }, key);
17107 } finally {
17108 inDispatch = wasInDispatch;
17109 }
17110 if (!batchListenerGroup.listeners.size) {
17111 if (!inDispatch) prevStateBatch = state;
17112 return;
17113 }
17114 updatedKeys.add(key);
17115 if (batchPending) return;
17116 batchPending = true;
17117 queueMicrotask(() => {
17118 batchPending = false;
17119 const snapshot = state;
17120 const updatedKeysSnapshot = updatedKeys;
17121 updatedKeys = /* @__PURE__ */ new Set();
17122 const prevStateBatchBefore = prevStateBatch;
17123 runListeners(batchListenerGroup, prevStateBatchBefore, updatedKeysSnapshot);
17124 if (prevStateBatch === prevStateBatchBefore) prevStateBatch = snapshot;
17125 });
17126 };
17127 const finalStore = {
17128 getState,
17129 setState,
17130 __unstableInternals: {
17131 setup: storeSetup,
17132 init: storeInit,
17133 subscribe: storeSubscribe,
17134 sync: storeSync,
17135 batch: storeBatch,
17136 pick: storePick,
17137 omit: storeOmit
17138 }
17139 };
17140 return finalStore;
17141 }
17142 function setup(store, ...args) {
17143 if (!store) return;
17144 return getInternal(store, "setup")(...args);
17145 }
17146 function init(store, ...args) {
17147 if (!store) return;
17148 return getInternal(store, "init")(...args);
17149 }
17150 function subscribe(store, ...args) {
17151 if (!store) return;
17152 return getInternal(store, "subscribe")(...args);
17153 }
17154 function sync(store, ...args) {
17155 if (!store) return;
17156 return getInternal(store, "sync")(...args);
17157 }
17158 function batch(store, ...args) {
17159 if (!store) return;
17160 return getInternal(store, "batch")(...args);
17161 }
17162 function omit2(store, ...args) {
17163 if (!store) return;
17164 return getInternal(store, "omit")(...args);
17165 }
17166 function pick2(store, ...args) {
17167 if (!store) return;
17168 return getInternal(store, "pick")(...args);
17169 }
17170 function mergeStore(...stores) {
17171 const initialState = {};
17172 for (const store2 of stores) {
17173 const nextState = store2?.getState?.();
17174 if (nextState) Object.assign(initialState, nextState);
17175 }
17176 const store = createStore(initialState, ...stores);
17177 return Object.assign({}, ...stores, store);
17178 }
17179 function throwOnConflictingProps(props, store) {
17180 if (false) return;
17181 if (!store) return;
17182 const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => {
17183 const stateKey = key.replace("default", "");
17184 return `${stateKey[0]?.toLowerCase() || ""}${stateKey.slice(1)}`;
17185 });
17186 if (!defaultKeys.length) return;
17187 const storeState = store.getState();
17188 if (!defaultKeys.filter((key) => hasOwnProperty(storeState, key)).length) return;
17189 throw new Error(`Passing a store prop in conjunction with a default state is not supported.
17190
17191 const store = useSelectStore();
17192 <SelectProvider store={store} defaultValue="Apple" />
17193 ^ ^
17194
17195 Instead, pass the default state to the topmost store:
17196
17197 const store = useSelectStore({ defaultValue: "Apple" });
17198 <SelectProvider store={store} />
17199
17200 See https://github.com/ariakit/ariakit/pull/2745 for more details.
17201
17202 If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit
17203 `);
17204 }
17205
17206 // node_modules/@ariakit/components/dist/collection/collection-store.js
17207 function getCommonParent(items) {
17208 const firstItem = items.find((item) => !!item.element);
17209 const lastElement = [...items].reverse().find((item) => !!item.element)?.element;
17210 let parentElement = firstItem?.element?.parentElement;
17211 if (!lastElement) return getDocument(parentElement).body;
17212 while (parentElement) {
17213 if (parentElement.contains(lastElement)) return parentElement;
17214 parentElement = parentElement.parentElement;
17215 }
17216 return getDocument(parentElement).body;
17217 }
17218 function getPrivateStore(store) {
17219 return store?.__unstablePrivateStore;
17220 }
17221 function createCollectionStore(props = {}) {
17222 throwOnConflictingProps(props, props.store);
17223 const syncState = props.store?.getState();
17224 const items = defaultValue(props.items, syncState?.items, props.defaultItems, []);
17225 const itemsMap = new Map(items.map((item) => [item.id, item]));
17226 const initialState = {
17227 items,
17228 renderedItems: defaultValue(syncState?.renderedItems, [])
17229 };
17230 const syncPrivateStore = getPrivateStore(props.store);
17231 const privateStore = createStore({
17232 items,
17233 renderedItems: initialState.renderedItems
17234 }, syncPrivateStore);
17235 const collection = createStore(initialState, props.store);
17236 const sortItems = (renderedItems) => {
17237 const sortedItems = sortBasedOnDOMPosition(renderedItems, (i2) => i2.element);
17238 privateStore.setState("renderedItems", sortedItems);
17239 collection.setState("renderedItems", sortedItems);
17240 };
17241 setup(collection, () => init(privateStore));
17242 setup(privateStore, () => {
17243 return batch(privateStore, ["items"], (state) => {
17244 collection.setState("items", state.items);
17245 });
17246 });
17247 setup(privateStore, () => {
17248 return batch(privateStore, ["renderedItems"], (state) => {
17249 let firstRun = true;
17250 let raf = requestAnimationFrame(() => {
17251 const { renderedItems } = collection.getState();
17252 if (state.renderedItems === renderedItems) return;
17253 sortItems(state.renderedItems);
17254 });
17255 if (typeof IntersectionObserver !== "function") return () => cancelAnimationFrame(raf);
17256 const ioCallback = () => {
17257 if (firstRun) {
17258 firstRun = false;
17259 return;
17260 }
17261 cancelAnimationFrame(raf);
17262 raf = requestAnimationFrame(() => sortItems(state.renderedItems));
17263 };
17264 const root = getCommonParent(state.renderedItems);
17265 const observer = new IntersectionObserver(ioCallback, { root });
17266 for (const item of state.renderedItems) {
17267 if (!item.element) continue;
17268 observer.observe(item.element);
17269 }
17270 return () => {
17271 cancelAnimationFrame(raf);
17272 observer.disconnect();
17273 };
17274 });
17275 });
17276 const mergeItem = (item, setItems, canDeleteFromMap = false) => {
17277 let prevItem;
17278 setItems((items2) => {
17279 const index2 = items2.findIndex(({ id }) => id === item.id);
17280 const nextItems = items2.slice();
17281 if (index2 !== -1) {
17282 prevItem = items2[index2];
17283 const nextItem = {
17284 ...prevItem,
17285 ...item
17286 };
17287 nextItems[index2] = nextItem;
17288 itemsMap.set(item.id, nextItem);
17289 } else {
17290 nextItems.push(item);
17291 itemsMap.set(item.id, item);
17292 }
17293 return nextItems;
17294 });
17295 const unmergeItem = () => {
17296 setItems((items2) => {
17297 if (!prevItem) {
17298 if (canDeleteFromMap) itemsMap.delete(item.id);
17299 return items2.filter(({ id }) => id !== item.id);
17300 }
17301 const index2 = items2.findIndex(({ id }) => id === item.id);
17302 if (index2 === -1) return items2;
17303 const nextItems = items2.slice();
17304 nextItems[index2] = prevItem;
17305 itemsMap.set(item.id, prevItem);
17306 return nextItems;
17307 });
17308 };
17309 return unmergeItem;
17310 };
17311 const registerItem = (item) => mergeItem(item, (getItems) => privateStore.setState("items", getItems), true);
17312 return {
17313 ...collection,
17314 registerItem,
17315 renderItem: (item) => chain(registerItem(item), mergeItem(item, (getItems) => privateStore.setState("renderedItems", getItems))),
17316 item: (id) => {
17317 if (!id) return null;
17318 let item = itemsMap.get(id);
17319 if (!item) {
17320 const { items: items2 } = privateStore.getState();
17321 item = items2.find((item2) => item2.id === id);
17322 if (item) itemsMap.set(id, item);
17323 }
17324 return item || null;
17325 },
17326 __unstablePrivateStore: privateStore
17327 };
17328 }
17329
17330 // node_modules/@ariakit/components/dist/composite/composite-store.js
17331 var NULL_ITEM = { id: null };
17332 function findFirstEnabledItem(items, excludeId) {
17333 return items.find((item) => {
17334 if (excludeId) return !item.disabled && item.id !== excludeId;
17335 return !item.disabled;
17336 });
17337 }
17338 function getEnabledItems(items, excludeId) {
17339 return items.filter((item) => {
17340 if (excludeId) return !item.disabled && item.id !== excludeId;
17341 return !item.disabled;
17342 });
17343 }
17344 function getItemsInRow(items, rowId) {
17345 return items.filter((item) => item.rowId === rowId);
17346 }
17347 function findEnabledItemId({ items, fromIndex, step, rowId, excludeId }) {
17348 for (let i2 = fromIndex; i2 >= 0 && i2 < items.length; i2 += step) {
17349 const item = items[i2];
17350 if (!item) continue;
17351 if (item.rowId !== rowId) continue;
17352 if (item.disabled) continue;
17353 if (excludeId != null && item.id === excludeId) continue;
17354 return item.id;
17355 }
17356 }
17357 function flipItems(items, activeId, shouldInsertNullItem = false) {
17358 const index2 = items.findIndex((item) => item.id === activeId);
17359 return [
17360 ...items.slice(index2 + 1),
17361 ...shouldInsertNullItem ? [NULL_ITEM] : [],
17362 ...items.slice(0, index2)
17363 ];
17364 }
17365 function groupItemsByRows(items) {
17366 const rows = [];
17367 for (const item of items) {
17368 const row = rows.find((currentRow) => currentRow[0]?.rowId === item.rowId);
17369 if (row) row.push(item);
17370 else rows.push([item]);
17371 }
17372 return rows;
17373 }
17374 function getMaxRowLength(array) {
17375 let maxLength = 0;
17376 for (const { length } of array) if (length > maxLength) maxLength = length;
17377 return maxLength;
17378 }
17379 function createEmptyItem(rowId) {
17380 return {
17381 id: "__EMPTY_ITEM__",
17382 disabled: true,
17383 rowId
17384 };
17385 }
17386 function normalizeRows(rows, activeId, focusShift) {
17387 const maxLength = getMaxRowLength(rows);
17388 for (const row of rows) for (let i2 = 0; i2 < maxLength; i2 += 1) {
17389 const item = row[i2];
17390 if (!item || focusShift && item.disabled) {
17391 const previousItem = i2 === 0 && focusShift ? findFirstEnabledItem(row) : row[i2 - 1];
17392 row[i2] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem?.rowId);
17393 }
17394 }
17395 return rows;
17396 }
17397 function verticalizeItems(items) {
17398 const rows = groupItemsByRows(items);
17399 const maxLength = getMaxRowLength(rows);
17400 const verticalized = [];
17401 for (let i2 = 0; i2 < maxLength; i2 += 1) for (const row of rows) {
17402 const item = row[i2];
17403 if (item) verticalized.push({
17404 ...item,
17405 rowId: item.rowId ? `${i2}` : void 0
17406 });
17407 }
17408 return verticalized;
17409 }
17410 function createCompositeStore(props = {}) {
17411 const syncState = props.store?.getState();
17412 const collection = createCollectionStore(props);
17413 const activeId = defaultValue(props.activeId, syncState?.activeId, props.defaultActiveId);
17414 const composite = createStore({
17415 ...collection.getState(),
17416 id: defaultValue(props.id, syncState?.id) ?? `id-${Math.random().toString(36).slice(2, 8)}`,
17417 activeId,
17418 baseElement: defaultValue(syncState?.baseElement, null),
17419 includesBaseElement: defaultValue(props.includesBaseElement, syncState?.includesBaseElement, activeId === null),
17420 moves: defaultValue(syncState?.moves, 0),
17421 orientation: defaultValue(props.orientation, syncState?.orientation, "both"),
17422 rtl: defaultValue(props.rtl, syncState?.rtl, false),
17423 virtualFocus: defaultValue(props.virtualFocus, syncState?.virtualFocus, false),
17424 focusLoop: defaultValue(props.focusLoop, syncState?.focusLoop, false),
17425 focusWrap: defaultValue(props.focusWrap, syncState?.focusWrap, false),
17426 focusShift: defaultValue(props.focusShift, syncState?.focusShift, false)
17427 }, collection, props.store);
17428 setup(composite, () => sync(composite, ["renderedItems", "activeId"], (state) => {
17429 composite.setState("activeId", (activeId2) => {
17430 if (activeId2 !== void 0) return activeId2;
17431 return findFirstEnabledItem(state.renderedItems)?.id;
17432 });
17433 }));
17434 const getNextId = (direction = "next", options = {}) => {
17435 const defaultState = composite.getState();
17436 const { skip = 0, activeId: activeId2 = defaultState.activeId, focusShift = defaultState.focusShift, focusLoop = defaultState.focusLoop, focusWrap = defaultState.focusWrap, includesBaseElement = defaultState.includesBaseElement, renderedItems = defaultState.renderedItems, rtl = defaultState.rtl } = options;
17437 const isVerticalDirection = direction === "up" || direction === "down";
17438 const isNextDirection = direction === "next" || direction === "down";
17439 const canReverse = isNextDirection ? rtl && !isVerticalDirection : !rtl || isVerticalDirection;
17440 const canShift = focusShift && !skip;
17441 if (!skip && !focusWrap && !includesBaseElement && activeId2 != null) {
17442 if (!isVerticalDirection ? true : !canShift && !renderedItems.some((item) => item.rowId != null)) {
17443 const activeIndex2 = renderedItems.findIndex((item) => item.id === activeId2);
17444 const activeItem2 = renderedItems[activeIndex2];
17445 if (activeItem2) {
17446 const step = canReverse ? -1 : 1;
17447 const nextId = findEnabledItemId({
17448 items: renderedItems,
17449 fromIndex: activeIndex2 + step,
17450 step,
17451 rowId: activeItem2.rowId,
17452 excludeId: activeId2
17453 });
17454 if (nextId !== void 0) return nextId;
17455 if (!(focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical"))) return void 0;
17456 return findEnabledItemId({
17457 items: renderedItems,
17458 fromIndex: step === 1 ? 0 : renderedItems.length - 1,
17459 step,
17460 rowId: activeItem2.rowId,
17461 excludeId: activeId2
17462 });
17463 }
17464 }
17465 }
17466 let items = !isVerticalDirection ? renderedItems : flatten2DArray(normalizeRows(groupItemsByRows(renderedItems), activeId2, canShift));
17467 items = canReverse ? reverseArray(items) : items;
17468 items = isVerticalDirection ? verticalizeItems(items) : items;
17469 if (activeId2 == null) return findFirstEnabledItem(items)?.id;
17470 const activeItem = items.find((item) => item.id === activeId2);
17471 if (!activeItem) return findFirstEnabledItem(items)?.id;
17472 const isGrid2 = items.some((item) => item.rowId);
17473 const activeIndex = items.indexOf(activeItem);
17474 const nextItems = items.slice(activeIndex + 1);
17475 const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId);
17476 if (skip) {
17477 const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2);
17478 return (nextEnabledItemsInRow.slice(skip)[0] || nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1])?.id;
17479 }
17480 const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical");
17481 const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical");
17482 const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false;
17483 if (canLoop) return findFirstEnabledItem(flipItems(canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId), activeId2, hasNullItem), activeId2)?.id;
17484 if (canWrap) {
17485 const nextItem2 = findFirstEnabledItem(hasNullItem ? nextItemsInRow : nextItems, activeId2);
17486 return hasNullItem ? nextItem2?.id || null : nextItem2?.id;
17487 }
17488 const nextItem = findFirstEnabledItem(nextItemsInRow, activeId2);
17489 if (!nextItem && hasNullItem) return null;
17490 return nextItem?.id;
17491 };
17492 const getNextIdFromOptions = (direction, options) => {
17493 if (typeof options === "number") return getNextId(direction, { skip: options });
17494 return getNextId(direction, options);
17495 };
17496 return {
17497 ...collection,
17498 ...composite,
17499 setBaseElement: (element) => composite.setState("baseElement", element),
17500 setActiveId: (id) => composite.setState("activeId", id),
17501 move: (id) => {
17502 if (id === void 0) return;
17503 composite.setState("activeId", id);
17504 composite.setState("moves", (moves) => moves + 1);
17505 },
17506 first: () => findFirstEnabledItem(composite.getState().renderedItems)?.id,
17507 last: () => findFirstEnabledItem(reverseArray(composite.getState().renderedItems))?.id,
17508 next: (options) => getNextIdFromOptions("next", options),
17509 previous: (options) => getNextIdFromOptions("previous", options),
17510 down: (options) => getNextIdFromOptions("down", options),
17511 up: (options) => getNextIdFromOptions("up", options)
17512 };
17513 }
17514
17515 // node_modules/@ariakit/react-components/dist/composite/utils.js
17516 var findFirstEnabledItem2 = findFirstEnabledItem;
17517 var groupItemsByRows2 = groupItemsByRows;
17518 function getEnabledItem(store, id) {
17519 if (!id) return null;
17520 return store.item(id) || null;
17521 }
17522 function selectTextField(element, collapseToEnd = false) {
17523 if (isTextField(element)) element.setSelectionRange(collapseToEnd ? element.value.length : 0, element.value.length);
17524 else if (element.isContentEditable) {
17525 const selection = getDocument(element).getSelection();
17526 selection?.selectAllChildren(element);
17527 if (collapseToEnd) selection?.collapseToEnd();
17528 }
17529 }
17530 var FOCUS_SILENTLY = /* @__PURE__ */ Symbol("FOCUS_SILENTLY");
17531 function focusSilently(element) {
17532 element[FOCUS_SILENTLY] = true;
17533 element.focus({ preventScroll: true });
17534 }
17535 function silentlyFocused(element) {
17536 const isSilentlyFocused = element[FOCUS_SILENTLY];
17537 delete element[FOCUS_SILENTLY];
17538 return isSilentlyFocused;
17539 }
17540 function isItem(store, element, exclude) {
17541 if (!element) return false;
17542 if (element === exclude) return false;
17543 const item = store.item(element.id);
17544 if (!item) return false;
17545 if (exclude && item.element === exclude) return false;
17546 return true;
17547 }
17548
17549 // node_modules/@ariakit/react-components/dist/composite/composite-item.js
17550 var import_react17 = __toESM(require_react(), 1);
17551 var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
17552
17553 // node_modules/@ariakit/react-store/dist/index.js
17554 var React48 = __toESM(require_react(), 1);
17555 var import_shim2 = __toESM(require_shim(), 1);
17556 var noopSubscribe = () => () => {
17557 };
17558 function useStoreState(store, keyOrSelector = identity) {
17559 const storeSubscribe = React48.useCallback((callback) => {
17560 if (!store) return noopSubscribe();
17561 return subscribe(store, null, callback);
17562 }, [store]);
17563 const getSnapshot = () => {
17564 const key = typeof keyOrSelector === "string" ? keyOrSelector : null;
17565 const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null;
17566 const state = store?.getState();
17567 if (selector2) return selector2(state);
17568 if (!state) return;
17569 if (!key) return;
17570 if (!hasOwnProperty(state, key)) return;
17571 return state[key];
17572 };
17573 return (0, import_shim2.useSyncExternalStore)(storeSubscribe, getSnapshot, getSnapshot);
17574 }
17575 function useStoreStateObject(store, object) {
17576 const objRef = React48.useRef({});
17577 const storeSubscribe = React48.useCallback((callback) => {
17578 if (!store) return noopSubscribe();
17579 return subscribe(store, null, callback);
17580 }, [store]);
17581 const getSnapshot = () => {
17582 const state = store?.getState();
17583 let updated = false;
17584 const obj = objRef.current;
17585 for (const prop in object) {
17586 const keyOrSelector = object[prop];
17587 if (typeof keyOrSelector === "function") {
17588 const value = keyOrSelector(state);
17589 if (!Object.is(value, obj[prop])) {
17590 obj[prop] = value;
17591 updated = true;
17592 }
17593 }
17594 if (typeof keyOrSelector === "string") {
17595 if (!state) continue;
17596 if (!hasOwnProperty(state, keyOrSelector)) continue;
17597 const value = state[keyOrSelector];
17598 if (!Object.is(value, obj[prop])) {
17599 obj[prop] = value;
17600 updated = true;
17601 }
17602 }
17603 }
17604 if (updated) objRef.current = { ...obj };
17605 return objRef.current;
17606 };
17607 return (0, import_shim2.useSyncExternalStore)(storeSubscribe, getSnapshot, getSnapshot);
17608 }
17609 function useStoreProps(store, props, key, setKey) {
17610 const value = hasOwnProperty(props, key) ? props[key] : void 0;
17611 const propsRef = useLiveRef({
17612 value,
17613 setValue: setKey ? props[setKey] : void 0
17614 });
17615 useSafeLayoutEffect(() => {
17616 return sync(store, [key], (state, prev) => {
17617 const { value: value2, setValue } = propsRef.current;
17618 if (!setValue) return;
17619 if (state[key] === prev[key]) return;
17620 if (state[key] === value2) return;
17621 setValue(state[key]);
17622 });
17623 }, [store, key]);
17624 useSafeLayoutEffect(() => {
17625 if (value === void 0) return;
17626 store.setState(key, value);
17627 return batch(store, [key], () => {
17628 if (value === void 0) return;
17629 store.setState(key, value);
17630 });
17631 });
17632 }
17633 function useStore2(createStore2, props) {
17634 const [store, setStore] = React48.useState(() => createStore2(props));
17635 useSafeLayoutEffect(() => init(store), [store]);
17636 const useState38 = React48.useCallback((keyOrSelector) => useStoreState(store, keyOrSelector), [store]);
17637 return [React48.useMemo(() => ({
17638 ...store,
17639 useState: useState38
17640 }), [store, useState38]), useEvent(() => {
17641 setStore((store2) => createStore2({
17642 ...props,
17643 ...store2.getState()
17644 }));
17645 })];
17646 }
17647
17648 // node_modules/@ariakit/react-components/dist/composite/composite-item.js
17649 var TagName4 = "button";
17650 function isEditableElement(element) {
17651 if (isTextbox(element)) return true;
17652 return element.tagName === "INPUT" && !isButton(element);
17653 }
17654 function getNextPageOffset(scrollingElement, pageUp = false) {
17655 const height = scrollingElement.clientHeight;
17656 const { top } = scrollingElement.getBoundingClientRect();
17657 const pageSize = Math.max(height * 0.875, height - 40) * 1.5;
17658 const pageOffset = pageUp ? height - pageSize + top : pageSize + top;
17659 if (scrollingElement.tagName === "HTML") return pageOffset + scrollingElement.scrollTop;
17660 return pageOffset;
17661 }
17662 function getItemOffset(itemElement, pageUp = false) {
17663 const { top } = itemElement.getBoundingClientRect();
17664 if (pageUp) return top + itemElement.clientHeight;
17665 return top;
17666 }
17667 function findNextPageItemId(element, store, next, pageUp = false) {
17668 if (!store) return;
17669 if (!next) return;
17670 const { renderedItems } = store.getState();
17671 const scrollingElement = getScrollingElement(element);
17672 if (!scrollingElement) return;
17673 const nextPageOffset = getNextPageOffset(scrollingElement, pageUp);
17674 let id;
17675 let prevDifference;
17676 for (let i2 = 0; i2 < renderedItems.length; i2 += 1) {
17677 const previousId = id;
17678 id = next(i2);
17679 if (!id) break;
17680 if (id === previousId) continue;
17681 const itemElement = getEnabledItem(store, id)?.element;
17682 if (!itemElement) continue;
17683 const difference = getItemOffset(itemElement, pageUp) - nextPageOffset;
17684 const absDifference = Math.abs(difference);
17685 if (pageUp && difference <= 0 || !pageUp && difference >= 0) {
17686 if (prevDifference !== void 0 && prevDifference < absDifference) id = previousId;
17687 break;
17688 }
17689 prevDifference = absDifference;
17690 }
17691 return id;
17692 }
17693 function targetIsAnotherItem(event, store) {
17694 if (isSelfTarget(event)) return false;
17695 return isItem(store, event.target);
17696 }
17697 var useCompositeItem = createHook(function useCompositeItem2({ store, rowId: rowIdProp, preventScrollOnKeyDown = false, moveOnKeyPress = true, tabbable: tabbable2 = false, getItem: getItemProp, "aria-setsize": ariaSetSizeProp, "aria-posinset": ariaPosInSetProp, ...props }) {
17698 const context = useCompositeScopedContext();
17699 store = store || context;
17700 const id = useId4(props.id);
17701 const ref = (0, import_react17.useRef)(null);
17702 const row = (0, import_react17.useContext)(CompositeRowContext);
17703 const trulyDisabled = disabledFromProps(props) && !props.accessibleWhenDisabled;
17704 const shouldRegisterItem = props.shouldRegisterItem;
17705 const getRowId = (state) => {
17706 if (rowIdProp) return rowIdProp;
17707 if (!state) return;
17708 if (!row?.baseElement) return;
17709 if (row.baseElement !== state.baseElement) return;
17710 return row.id;
17711 };
17712 const { rowId, baseElement, isActiveItem, ariaSetSize, ariaPosInSet, isTabbable } = useStoreStateObject(store, {
17713 rowId: getRowId,
17714 baseElement(state) {
17715 return state?.baseElement || void 0;
17716 },
17717 isActiveItem(state) {
17718 return !!state && state.activeId === id;
17719 },
17720 ariaSetSize(state) {
17721 if (ariaSetSizeProp != null) return ariaSetSizeProp;
17722 if (!state) return;
17723 if (!row?.ariaSetSize) return;
17724 if (row.baseElement !== state.baseElement) return;
17725 return row.ariaSetSize;
17726 },
17727 ariaPosInSet(state) {
17728 if (ariaPosInSetProp != null) return ariaPosInSetProp;
17729 if (!state) return;
17730 if (!row?.ariaPosInSet) return;
17731 if (row.baseElement !== state.baseElement) return;
17732 const rowId2 = getRowId(state);
17733 const itemsInRow = state.renderedItems.filter((item) => item.rowId === rowId2);
17734 return row.ariaPosInSet + itemsInRow.findIndex((item) => item.id === id);
17735 },
17736 isTabbable(state) {
17737 if (!state?.renderedItems.length) return true;
17738 if (state.virtualFocus) return false;
17739 if (tabbable2) return true;
17740 if (state.activeId === null) return false;
17741 const item = store?.item(state.activeId);
17742 if (item?.disabled) return true;
17743 if (!item?.element) return true;
17744 return state.activeId === id;
17745 }
17746 });
17747 const getItem = (0, import_react17.useCallback)((item) => {
17748 const nextItem = {
17749 ...item,
17750 id: id || item.id,
17751 rowId,
17752 disabled: trulyDisabled,
17753 children: item.element?.textContent
17754 };
17755 if (getItemProp) return getItemProp(nextItem);
17756 return nextItem;
17757 }, [
17758 id,
17759 rowId,
17760 trulyDisabled,
17761 getItemProp
17762 ]);
17763 const onFocusProp = props.onFocus;
17764 const hasFocusedComposite = (0, import_react17.useRef)(false);
17765 const cancelScheduledFocusRedirectRef = (0, import_react17.useRef)(null);
17766 const onFocus = useEvent((event) => {
17767 onFocusProp?.(event);
17768 if (event.defaultPrevented) return;
17769 if (isPortalEvent(event)) return;
17770 if (!id) return;
17771 if (!store) return;
17772 if (targetIsAnotherItem(event, store)) return;
17773 const { virtualFocus, baseElement: baseElement2 } = store.getState();
17774 store.setActiveId(id);
17775 if (isTextbox(event.currentTarget)) selectTextField(event.currentTarget);
17776 if (!virtualFocus) return;
17777 if (!isSelfTarget(event)) return;
17778 if (isEditableElement(event.currentTarget)) return;
17779 const redirectFocusToBaseElement = (currentTarget2, relatedTarget2, baseElement3) => {
17780 if (isSafari() && currentTarget2.hasAttribute("data-autofocus")) currentTarget2.scrollIntoView({
17781 block: "nearest",
17782 inline: "nearest"
17783 });
17784 hasFocusedComposite.current = true;
17785 if (relatedTarget2 === baseElement3 || isItem(store, relatedTarget2)) focusSilently(baseElement3);
17786 else baseElement3.focus();
17787 };
17788 if (baseElement2?.isConnected) {
17789 redirectFocusToBaseElement(event.currentTarget, event.relatedTarget, baseElement2);
17790 return;
17791 }
17792 if (shouldRegisterItem === false) return;
17793 const { currentTarget, relatedTarget } = event;
17794 const cancelScheduledFocusRedirect = () => {
17795 cancelScheduledFocusRedirectRef.current?.();
17796 cancelScheduledFocusRedirectRef.current = null;
17797 };
17798 cancelScheduledFocusRedirect();
17799 cancelScheduledFocusRedirectRef.current = subscribe(store, null, () => {
17800 if (getActiveElement(currentTarget) !== currentTarget) {
17801 cancelScheduledFocusRedirect();
17802 return;
17803 }
17804 const state = store.getState();
17805 const nextBaseElement = state.baseElement;
17806 if (!nextBaseElement?.isConnected) return;
17807 cancelScheduledFocusRedirect();
17808 if (!state.virtualFocus) return;
17809 redirectFocusToBaseElement(currentTarget, relatedTarget, nextBaseElement);
17810 });
17811 });
17812 const onBlurCaptureProp = props.onBlurCapture;
17813 const onBlurCapture = useEvent((event) => {
17814 onBlurCaptureProp?.(event);
17815 if (event.defaultPrevented) return;
17816 if (store?.getState()?.virtualFocus && hasFocusedComposite.current) {
17817 hasFocusedComposite.current = false;
17818 event.preventDefault();
17819 event.stopPropagation();
17820 }
17821 });
17822 const onKeyDownProp = props.onKeyDown;
17823 const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown);
17824 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
17825 const onKeyDown = useEvent((event) => {
17826 onKeyDownProp?.(event);
17827 if (event.defaultPrevented) return;
17828 if (!isSelfTarget(event)) return;
17829 if (!store) return;
17830 const { currentTarget } = event;
17831 const state = store.getState();
17832 const isGrid2 = !!store.item(id)?.rowId;
17833 const isVertical = state.orientation !== "horizontal";
17834 const isHorizontal = state.orientation !== "vertical";
17835 const canHomeEnd = () => {
17836 if (isGrid2) return true;
17837 if (isHorizontal) return true;
17838 if (!state.baseElement) return true;
17839 if (!isTextField(state.baseElement)) return true;
17840 return false;
17841 };
17842 const action = {
17843 ArrowUp: (isGrid2 || isVertical) && store.up,
17844 ArrowRight: (isGrid2 || isHorizontal) && store.next,
17845 ArrowDown: (isGrid2 || isVertical) && store.down,
17846 ArrowLeft: (isGrid2 || isHorizontal) && store.previous,
17847 Home: () => {
17848 if (!canHomeEnd()) return;
17849 if (!isGrid2 || event.ctrlKey) return store?.first();
17850 return store?.previous(-1);
17851 },
17852 End: () => {
17853 if (!canHomeEnd()) return;
17854 if (!isGrid2 || event.ctrlKey) return store?.last();
17855 return store?.next(-1);
17856 },
17857 PageUp: () => {
17858 return findNextPageItemId(currentTarget, store, store?.up, true);
17859 },
17860 PageDown: () => {
17861 return findNextPageItemId(currentTarget, store, store?.down);
17862 }
17863 }[event.key];
17864 if (action) {
17865 if (isTextbox(currentTarget)) {
17866 const selection = getTextboxSelection(currentTarget);
17867 const isLeft = isHorizontal && event.key === "ArrowLeft";
17868 const isRight = isHorizontal && event.key === "ArrowRight";
17869 const isUp = isVertical && event.key === "ArrowUp";
17870 const isDown = isVertical && event.key === "ArrowDown";
17871 if (isRight || isDown) {
17872 const { length: valueLength } = getTextboxValue(currentTarget);
17873 if (selection.end !== valueLength) return;
17874 } else if ((isLeft || isUp) && selection.start !== 0) return;
17875 }
17876 const nextId = action();
17877 if (preventScrollOnKeyDownProp(event) || nextId !== void 0) {
17878 if (!moveOnKeyPressProp(event)) return;
17879 event.preventDefault();
17880 store.move(nextId);
17881 }
17882 }
17883 });
17884 const providerValue = (0, import_react17.useMemo)(() => ({
17885 id,
17886 baseElement
17887 }), [id, baseElement]);
17888 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CompositeItemContext.Provider, {
17889 value: providerValue,
17890 children: element
17891 }), [providerValue]);
17892 props = {
17893 "data-active-item": isActiveItem || void 0,
17894 ...props,
17895 id,
17896 ref: useMergeRefs(ref, props.ref),
17897 tabIndex: isTabbable ? props.tabIndex : -1,
17898 onFocus,
17899 onBlurCapture,
17900 onKeyDown
17901 };
17902 props = useCommand(props);
17903 props = useCollectionItem({
17904 store,
17905 ...props,
17906 getItem,
17907 shouldRegisterItem: id ? shouldRegisterItem : false
17908 });
17909 return removeUndefinedValues({
17910 ...props,
17911 "aria-setsize": ariaSetSize,
17912 "aria-posinset": ariaPosInSet
17913 });
17914 });
17915 var CompositeItem = memo3(forwardRef29(function CompositeItem2(props) {
17916 return createElement3(TagName4, useCompositeItem(props));
17917 }));
17918
17919 // node_modules/@ariakit/react-components/dist/composite/composite.js
17920 var import_react18 = __toESM(require_react(), 1);
17921 var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
17922 var TagName5 = "div";
17923 function isGrid(items) {
17924 return items.some((item) => !!item.rowId);
17925 }
17926 function isPrintableKey(event) {
17927 const target = event.target;
17928 if (target && !isTextField(target)) return false;
17929 return event.key.length === 1 && !event.ctrlKey && !event.metaKey;
17930 }
17931 function isModifierKey(event) {
17932 return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta";
17933 }
17934 function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) {
17935 return useEvent((event) => {
17936 onKeyboardEvent?.(event);
17937 if (event.defaultPrevented) return;
17938 if (event.isPropagationStopped()) return;
17939 if (!isSelfTarget(event)) return;
17940 if (isModifierKey(event)) return;
17941 if (isPrintableKey(event)) return;
17942 const activeElement2 = getEnabledItem(store, store.getState().activeId)?.element;
17943 if (!activeElement2) return;
17944 const { view, ...eventInit } = event;
17945 if (activeElement2 !== previousElementRef?.current) activeElement2.focus();
17946 if (!fireKeyboardEvent(activeElement2, event.type, eventInit)) event.preventDefault();
17947 if (event.currentTarget.contains(activeElement2)) event.stopPropagation();
17948 });
17949 }
17950 function findFirstEnabledItemInTheLastRow(items) {
17951 return findFirstEnabledItem2(flatten2DArray(reverseArray(groupItemsByRows2(items))));
17952 }
17953 function withBaseScrollPreserved(store, callback) {
17954 const { virtualFocus, baseElement } = store.getState();
17955 if (!virtualFocus || !baseElement || !isTextField(baseElement)) {
17956 callback();
17957 return;
17958 }
17959 const savedScrollLeft = baseElement.scrollLeft;
17960 const savedScrollTop = baseElement.scrollTop;
17961 callback();
17962 baseElement.scrollLeft = savedScrollLeft;
17963 baseElement.scrollTop = savedScrollTop;
17964 }
17965 function useScheduleFocus(store) {
17966 const [scheduled, setScheduled] = (0, import_react18.useState)(false);
17967 const schedule = (0, import_react18.useCallback)(() => setScheduled(true), []);
17968 const activeItem = useStoreState(store, (state) => scheduled ? getEnabledItem(store, state.activeId) : null);
17969 (0, import_react18.useEffect)(() => {
17970 const activeElement2 = activeItem?.element;
17971 if (!scheduled) return;
17972 if (!activeElement2) return;
17973 setScheduled(false);
17974 withBaseScrollPreserved(store, () => {
17975 activeElement2.focus({ preventScroll: true });
17976 });
17977 }, [
17978 store,
17979 activeItem,
17980 scheduled
17981 ]);
17982 return schedule;
17983 }
17984 var CompositeFocusOnMove = memo3(function CompositeFocusOnMove2({ store, focusOnMove, previousElementRef }) {
17985 const moves = useStoreState(store, "moves");
17986 const baseElement = useStoreState(store, "baseElement");
17987 (0, import_react18.useEffect)(() => {
17988 if (!moves) return;
17989 if (!focusOnMove) return;
17990 const { activeId } = store.getState();
17991 const itemElement = getEnabledItem(store, activeId)?.element;
17992 if (!itemElement) return;
17993 withBaseScrollPreserved(store, () => focusIntoView(itemElement));
17994 }, [
17995 store,
17996 moves,
17997 focusOnMove
17998 ]);
17999 useSafeLayoutEffect(() => {
18000 if (!moves) return;
18001 if (!baseElement) return;
18002 const { activeId } = store.getState();
18003 if (!(activeId === null)) return;
18004 const previousElement = previousElementRef.current;
18005 previousElementRef.current = null;
18006 if (previousElement) fireBlurEvent(previousElement, { relatedTarget: baseElement });
18007 if (!hasFocus(baseElement)) baseElement.focus();
18008 }, [
18009 store,
18010 moves,
18011 baseElement
18012 ]);
18013 return null;
18014 });
18015 var useComposite = createHook(function useComposite2({ store, composite = true, focusOnMove = composite, moveOnKeyPress = true, ...props }) {
18016 const context = useCompositeProviderContext();
18017 store = store || context;
18018 invariant(store, "Composite must receive a `store` prop or be wrapped in a CompositeProvider component.");
18019 const ref = (0, import_react18.useRef)(null);
18020 const previousElementRef = (0, import_react18.useRef)(null);
18021 const scheduleFocus = useScheduleFocus(store);
18022 const [, setBaseElement] = useTransactionState(composite ? store.setBaseElement : null);
18023 const virtualFocus = useStoreState(store, "virtualFocus");
18024 const activeId = useStoreState(store, (state) => state.virtualFocus ? state.activeId : null);
18025 useSafeLayoutEffect(() => {
18026 if (!store) return;
18027 if (!composite) return;
18028 if (!virtualFocus) return;
18029 const previousElement = previousElementRef.current;
18030 previousElementRef.current = null;
18031 if (!previousElement) return;
18032 const relatedTarget = getEnabledItem(store, activeId)?.element || getActiveElement(previousElement);
18033 if (relatedTarget === previousElement) return;
18034 fireBlurEvent(previousElement, { relatedTarget });
18035 }, [
18036 store,
18037 activeId,
18038 virtualFocus,
18039 composite
18040 ]);
18041 const onKeyDownCapture = useKeyboardEventProxy(store, props.onKeyDownCapture, previousElementRef);
18042 const onKeyUpCapture = useKeyboardEventProxy(store, props.onKeyUpCapture, previousElementRef);
18043 const onFocusCaptureProp = props.onFocusCapture;
18044 const onFocusCapture = useEvent((event) => {
18045 onFocusCaptureProp?.(event);
18046 if (event.defaultPrevented) return;
18047 if (!store) return;
18048 const { virtualFocus: virtualFocus2 } = store.getState();
18049 if (!virtualFocus2) return;
18050 const previousActiveElement = event.relatedTarget;
18051 const isSilentlyFocused = silentlyFocused(event.currentTarget);
18052 if (isSelfTarget(event) && isSilentlyFocused) {
18053 event.stopPropagation();
18054 previousElementRef.current = previousActiveElement;
18055 }
18056 });
18057 const onFocusProp = props.onFocus;
18058 const onFocus = useEvent((event) => {
18059 onFocusProp?.(event);
18060 if (event.defaultPrevented) return;
18061 if (!composite) return;
18062 if (!store) return;
18063 const { relatedTarget } = event;
18064 const { virtualFocus: virtualFocus2 } = store.getState();
18065 if (virtualFocus2) {
18066 if (isSelfTarget(event) && !isItem(store, relatedTarget)) queueMicrotask(scheduleFocus);
18067 } else if (isSelfTarget(event)) store.setActiveId(null);
18068 });
18069 const onBlurCaptureProp = props.onBlurCapture;
18070 const onBlurCapture = useEvent((event) => {
18071 onBlurCaptureProp?.(event);
18072 if (event.defaultPrevented) return;
18073 if (!store) return;
18074 const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState();
18075 if (!virtualFocus2) return;
18076 const activeElement2 = getEnabledItem(store, activeId2)?.element;
18077 const nextActiveElement = event.relatedTarget;
18078 const nextActiveElementIsItem = isItem(store, nextActiveElement);
18079 const previousElement = previousElementRef.current;
18080 previousElementRef.current = null;
18081 if (isSelfTarget(event) && nextActiveElementIsItem) {
18082 if (nextActiveElement === activeElement2) {
18083 if (previousElement && previousElement !== nextActiveElement) fireBlurEvent(previousElement, event);
18084 } else if (activeElement2) fireBlurEvent(activeElement2, event);
18085 else if (previousElement) fireBlurEvent(previousElement, event);
18086 event.stopPropagation();
18087 } else if (!isItem(store, event.target) && activeElement2) fireBlurEvent(activeElement2, event);
18088 });
18089 const onKeyDownProp = props.onKeyDown;
18090 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
18091 const onKeyDown = useEvent((event) => {
18092 onKeyDownProp?.(event);
18093 if (event.nativeEvent.isComposing) return;
18094 if (event.defaultPrevented) return;
18095 if (!store) return;
18096 if (!isSelfTarget(event)) return;
18097 const { orientation, renderedItems, activeId: activeId2, rtl } = store.getState();
18098 if (getEnabledItem(store, activeId2)?.element?.isConnected) return;
18099 const isVertical = orientation !== "horizontal";
18100 const isHorizontal = orientation !== "vertical";
18101 const grid = isGrid(renderedItems);
18102 if ((event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End") && isTextField(event.currentTarget)) return;
18103 const up = () => {
18104 if (grid) return findFirstEnabledItemInTheLastRow(renderedItems)?.id;
18105 return store?.last();
18106 };
18107 const action = {
18108 ArrowUp: (grid || isVertical) && up,
18109 ArrowRight: (grid || isHorizontal) && (rtl ? store.last : store.first),
18110 ArrowDown: (grid || isVertical) && store.first,
18111 ArrowLeft: (grid || isHorizontal) && (rtl ? store.first : store.last),
18112 Home: store.first,
18113 End: store.last,
18114 PageUp: store.first,
18115 PageDown: store.last
18116 }[event.key];
18117 if (action) {
18118 const id = action();
18119 if (id !== void 0) {
18120 if (!moveOnKeyPressProp(event)) return;
18121 event.preventDefault();
18122 store.move(id);
18123 }
18124 }
18125 });
18126 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(CompositeScopedContextProvider, {
18127 value: store,
18128 children: [element, composite && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CompositeFocusOnMove, {
18129 store,
18130 focusOnMove,
18131 previousElementRef
18132 })]
18133 }), [
18134 store,
18135 composite,
18136 focusOnMove
18137 ]);
18138 props = {
18139 "aria-activedescendant": useStoreState(store, (state) => {
18140 if (!store) return;
18141 if (!composite) return;
18142 if (!state.virtualFocus) return;
18143 return getEnabledItem(store, state.activeId)?.id;
18144 }),
18145 ...props,
18146 ref: useMergeRefs(ref, setBaseElement, props.ref),
18147 onKeyDownCapture,
18148 onKeyUpCapture,
18149 onFocusCapture,
18150 onFocus,
18151 onBlurCapture,
18152 onKeyDown
18153 };
18154 props = useFocusable({
18155 focusable: useStoreState(store, (state) => composite && (state.virtualFocus || state.activeId === null)),
18156 ...props
18157 });
18158 return props;
18159 });
18160 var Composite6 = forwardRef29(function Composite7(props) {
18161 return createElement3(TagName5, useComposite(props));
18162 });
18163
18164 // node_modules/@ariakit/react-components/dist/disclosure/disclosure-context.js
18165 var ctx3 = createStoreContext();
18166 var useDisclosureContext = ctx3.useContext;
18167 var useDisclosureScopedContext = ctx3.useScopedContext;
18168 var useDisclosureProviderContext = ctx3.useProviderContext;
18169 var DisclosureContextProvider = ctx3.ContextProvider;
18170 var DisclosureScopedContextProvider = ctx3.ScopedContextProvider;
18171
18172 // node_modules/@ariakit/react-components/dist/dialog/dialog-context.js
18173 var import_react19 = __toESM(require_react(), 1);
18174 var ctx4 = createStoreContext([DisclosureContextProvider], [DisclosureScopedContextProvider]);
18175 var useDialogContext = ctx4.useContext;
18176 var useDialogScopedContext = ctx4.useScopedContext;
18177 var useDialogProviderContext = ctx4.useProviderContext;
18178 var DialogContextProvider = ctx4.ContextProvider;
18179 var DialogScopedContextProvider = ctx4.ScopedContextProvider;
18180 var DialogHeadingContext = (0, import_react19.createContext)(void 0);
18181 var DialogDescriptionContext = (0, import_react19.createContext)(void 0);
18182
18183 // node_modules/@ariakit/react-components/dist/disclosure/disclosure-content.js
18184 var import_react20 = __toESM(require_react(), 1);
18185 var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
18186 var import_react_dom4 = __toESM(require_react_dom(), 1);
18187 var TagName6 = "div";
18188 function afterTimeout(timeoutMs, cb) {
18189 const timeoutId = setTimeout(cb, timeoutMs);
18190 return () => clearTimeout(timeoutId);
18191 }
18192 function parseCSSTime(time) {
18193 const value = time?.trim() || "0s";
18194 const multiplier = value.endsWith("ms") ? 1 : 1e3;
18195 const parsed = Number.parseFloat(value) * multiplier;
18196 return Number.isNaN(parsed) ? 0 : parsed;
18197 }
18198 function getEndTime(names, delays, durations) {
18199 const nameList = names.split(",");
18200 const delayList = delays.split(",");
18201 const durationList = durations.split(",");
18202 let endTime = 0;
18203 for (const [index2, name] of nameList.entries()) {
18204 if (name.trim() === "none") continue;
18205 const delay = parseCSSTime(delayList[index2 % delayList.length]);
18206 const duration = parseCSSTime(durationList[index2 % durationList.length]);
18207 endTime = Math.max(endTime, delay + duration);
18208 }
18209 return endTime;
18210 }
18211 function getElementEndTime(element) {
18212 const { transitionProperty, transitionDuration, transitionDelay, animationName, animationDuration, animationDelay } = getComputedStyle(element);
18213 return Math.max(getEndTime(transitionProperty, transitionDelay, transitionDuration), getEndTime(animationName, animationDelay, animationDuration));
18214 }
18215 function isHidden(mounted, hidden, alwaysVisible) {
18216 return !alwaysVisible && hidden !== false && (!mounted || !!hidden);
18217 }
18218 var useDisclosureContent = createHook(function useDisclosureContent2({ store, alwaysVisible, unstable_otherElementRef: otherElementRef, ...props }) {
18219 const context = useDisclosureProviderContext();
18220 store = store || context;
18221 invariant(store, "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component.");
18222 const ref = (0, import_react20.useRef)(null);
18223 const id = useId4(props.id);
18224 const [transition, setTransition] = (0, import_react20.useState)(null);
18225 const open = useStoreState(store, "open");
18226 const mounted = useStoreState(store, "mounted");
18227 const animated = useStoreState(store, "animated");
18228 const contentElement = useStoreState(store, "contentElement");
18229 const otherElement = useStoreState(store.disclosure, "contentElement");
18230 const hasClosedRef = (0, import_react20.useRef)(false);
18231 useSafeLayoutEffect(() => {
18232 if (!ref.current) return;
18233 store?.setContentElement(ref.current);
18234 }, [store]);
18235 useSafeLayoutEffect(() => {
18236 let previousAnimated;
18237 store?.setState("animated", (animated2) => {
18238 previousAnimated = animated2;
18239 return true;
18240 });
18241 return () => {
18242 if (previousAnimated === void 0) return;
18243 store?.setState("animated", previousAnimated);
18244 };
18245 }, [store]);
18246 useSafeLayoutEffect(() => {
18247 if (!animated) {
18248 if (!open) {
18249 hasClosedRef.current = true;
18250 setTransition(null);
18251 } else if (hasClosedRef.current) {
18252 hasClosedRef.current = false;
18253 setTransition("enter");
18254 }
18255 return;
18256 }
18257 if (!contentElement?.isConnected) {
18258 setTransition(null);
18259 return;
18260 }
18261 return afterPaint(() => {
18262 setTransition(open ? "enter" : mounted ? "leave" : null);
18263 });
18264 }, [
18265 animated,
18266 contentElement,
18267 open,
18268 mounted
18269 ]);
18270 useSafeLayoutEffect(() => {
18271 if (!store) return;
18272 if (!animated) return;
18273 if (!transition) return;
18274 if (!contentElement) return;
18275 const stopAnimation = () => store?.setState("animating", false);
18276 const stopAnimationSync = () => (0, import_react_dom4.flushSync)(stopAnimation);
18277 if (transition === "leave" && open) return;
18278 if (transition === "enter" && !open) return;
18279 if (typeof animated === "number") return afterTimeout(animated, stopAnimationSync);
18280 const elements = [contentElement];
18281 if (otherElement) elements.push(otherElement);
18282 const relatedElement = otherElementRef?.current;
18283 if (relatedElement) elements.push(relatedElement);
18284 const timeout = Math.max(...elements.map(getElementEndTime));
18285 if (!timeout) {
18286 if (transition === "enter") store.setState("animated", false);
18287 stopAnimation();
18288 return;
18289 }
18290 return afterTimeout(Math.max(timeout - 1e3 / 60, 0), stopAnimationSync);
18291 }, [
18292 store,
18293 animated,
18294 contentElement,
18295 otherElement,
18296 otherElementRef,
18297 open,
18298 transition
18299 ]);
18300 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(DialogScopedContextProvider, {
18301 value: store,
18302 children: element
18303 }), [store]);
18304 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
18305 const styleProp = props.style;
18306 const style = (0, import_react20.useMemo)(() => {
18307 if (hidden) return {
18308 ...styleProp,
18309 display: "none"
18310 };
18311 return styleProp;
18312 }, [hidden, styleProp]);
18313 props = {
18314 "data-open": open || void 0,
18315 "data-enter": transition === "enter" || void 0,
18316 "data-leave": transition === "leave" || void 0,
18317 hidden,
18318 ...props,
18319 id,
18320 ref: useMergeRefs(id ? store.setContentElement : null, ref, props.ref),
18321 style
18322 };
18323 return removeUndefinedValues(props);
18324 });
18325 var DisclosureContentImpl = forwardRef29(function DisclosureContentImpl2(props) {
18326 return createElement3(TagName6, useDisclosureContent(props));
18327 });
18328 var DisclosureContent = forwardRef29(function DisclosureContent2({ unmountOnHide, ...props }) {
18329 const context = useDisclosureProviderContext();
18330 if (useStoreState(props.store || context, (state) => !unmountOnHide || state?.mounted) === false) return null;
18331 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(DisclosureContentImpl, { ...props });
18332 });
18333
18334 // node_modules/@ariakit/components/dist/disclosure/disclosure-store.js
18335 function createDisclosureStore(props = {}) {
18336 const store = mergeStore(props.store, omit2(props.disclosure, ["contentElement", "disclosureElement"]));
18337 throwOnConflictingProps(props, store);
18338 const syncState = store?.getState();
18339 const open = defaultValue(props.open, syncState?.open, props.defaultOpen, false);
18340 const animated = defaultValue(props.animated, syncState?.animated, false);
18341 const disclosure = createStore({
18342 open,
18343 animated,
18344 animating: !!animated && open,
18345 mounted: open,
18346 contentElement: defaultValue(syncState?.contentElement, null),
18347 disclosureElement: defaultValue(syncState?.disclosureElement, null)
18348 }, store);
18349 setup(disclosure, () => sync(disclosure, ["animated", "animating"], (state) => {
18350 if (state.animated) return;
18351 disclosure.setState("animating", false);
18352 }));
18353 setup(disclosure, () => subscribe(disclosure, ["open"], () => {
18354 if (!disclosure.getState().animated) return;
18355 disclosure.setState("animating", true);
18356 }));
18357 setup(disclosure, () => sync(disclosure, ["open", "animating"], (state) => {
18358 disclosure.setState("mounted", state.open || state.animating);
18359 }));
18360 return {
18361 ...disclosure,
18362 disclosure: props.disclosure,
18363 setOpen: (value) => disclosure.setState("open", value),
18364 show: () => disclosure.setState("open", true),
18365 hide: () => disclosure.setState("open", false),
18366 toggle: () => disclosure.setState("open", (open2) => !open2),
18367 stopAnimation: () => disclosure.setState("animating", false),
18368 setContentElement: (value) => disclosure.setState("contentElement", value),
18369 setDisclosureElement: (value) => disclosure.setState("disclosureElement", value)
18370 };
18371 }
18372
18373 // node_modules/@ariakit/react-components/dist/disclosure/disclosure-store.js
18374 function useDisclosureStoreProps(store, update2, props) {
18375 useUpdateEffect(update2, [props.store, props.disclosure]);
18376 useStoreProps(store, props, "open", "setOpen");
18377 useStoreProps(store, props, "mounted", "setMounted");
18378 useStoreProps(store, props, "animated");
18379 return Object.assign(store, { disclosure: props.disclosure });
18380 }
18381
18382 // node_modules/@ariakit/react-components/dist/popover/popover-context.js
18383 var ctx5 = createStoreContext([DialogContextProvider], [DialogScopedContextProvider]);
18384 var usePopoverContext = ctx5.useContext;
18385 var usePopoverScopedContext = ctx5.useScopedContext;
18386 var usePopoverProviderContext = ctx5.useProviderContext;
18387 var PopoverContextProvider = ctx5.ContextProvider;
18388 var PopoverScopedContextProvider = ctx5.ScopedContextProvider;
18389
18390 // node_modules/@ariakit/react-components/dist/combobox/combobox-context.js
18391 var import_react21 = __toESM(require_react(), 1);
18392 var ComboboxListRoleContext = (0, import_react21.createContext)(void 0);
18393 var ctx6 = createStoreContext([PopoverContextProvider, CompositeContextProvider], [PopoverScopedContextProvider, CompositeScopedContextProvider]);
18394 var useComboboxContext = ctx6.useContext;
18395 var useComboboxScopedContext = ctx6.useScopedContext;
18396 var useComboboxProviderContext = ctx6.useProviderContext;
18397 var ComboboxContextProvider = ctx6.ContextProvider;
18398 var ComboboxScopedContextProvider = ctx6.ScopedContextProvider;
18399 var ComboboxItemValueContext = (0, import_react21.createContext)(void 0);
18400 var ComboboxItemCheckedContext = (0, import_react21.createContext)(false);
18401
18402 // node_modules/@ariakit/react-components/dist/collection/collection-store.js
18403 function useCollectionStoreProps(store, update2, props) {
18404 useUpdateEffect(update2, [props.store]);
18405 useStoreProps(store, props, "items", "setItems");
18406 return store;
18407 }
18408
18409 // node_modules/@ariakit/react-components/dist/composite/composite-store.js
18410 function useCompositeStoreOptions(props) {
18411 return {
18412 id: useId4(props.id),
18413 ...props
18414 };
18415 }
18416 function useCompositeStoreProps(store, update2, props) {
18417 store = useCollectionStoreProps(store, update2, props);
18418 useStoreProps(store, props, "activeId", "setActiveId");
18419 useStoreProps(store, props, "includesBaseElement");
18420 useStoreProps(store, props, "virtualFocus");
18421 useStoreProps(store, props, "orientation");
18422 useStoreProps(store, props, "rtl");
18423 useStoreProps(store, props, "focusLoop");
18424 useStoreProps(store, props, "focusWrap");
18425 useStoreProps(store, props, "focusShift");
18426 return store;
18427 }
18428
18429 // node_modules/@ariakit/components/dist/dialog/dialog-store.js
18430 function createDialogStore(props = {}) {
18431 return createDisclosureStore(props);
18432 }
18433
18434 // node_modules/@ariakit/react-components/dist/dialog/dialog-store.js
18435 function useDialogStoreProps(store, update2, props) {
18436 return useDisclosureStoreProps(store, update2, props);
18437 }
18438
18439 // node_modules/@ariakit/components/dist/popover/popover-store.js
18440 function createPopoverStore({ popover: otherPopover, ...props } = {}) {
18441 const store = mergeStore(props.store, omit2(otherPopover, [
18442 "arrowElement",
18443 "anchorElement",
18444 "contentElement",
18445 "popoverElement",
18446 "disclosureElement"
18447 ]));
18448 throwOnConflictingProps(props, store);
18449 const syncState = store?.getState();
18450 const dialog = createDialogStore({
18451 ...props,
18452 store
18453 });
18454 const placement = defaultValue(props.placement, syncState?.placement, "bottom");
18455 const popover = createStore({
18456 ...dialog.getState(),
18457 placement,
18458 currentPlacement: placement,
18459 anchorElement: defaultValue(syncState?.anchorElement, null),
18460 popoverElement: defaultValue(syncState?.popoverElement, null),
18461 arrowElement: defaultValue(syncState?.arrowElement, null),
18462 rendered: /* @__PURE__ */ Symbol("rendered")
18463 }, dialog, store);
18464 return {
18465 ...dialog,
18466 ...popover,
18467 setAnchorElement: (element) => popover.setState("anchorElement", element),
18468 setPopoverElement: (element) => popover.setState("popoverElement", element),
18469 setArrowElement: (element) => popover.setState("arrowElement", element),
18470 render: () => popover.setState("rendered", /* @__PURE__ */ Symbol("rendered"))
18471 };
18472 }
18473
18474 // node_modules/@ariakit/react-components/dist/popover/popover-store.js
18475 function usePopoverStoreProps(store, update2, props) {
18476 useUpdateEffect(update2, [props.popover]);
18477 useStoreProps(store, props, "placement");
18478 return useDialogStoreProps(store, update2, props);
18479 }
18480
18481 // node_modules/@ariakit/react-components/dist/popover/popover-anchor.js
18482 var TagName7 = "div";
18483 var usePopoverAnchor = createHook(function usePopoverAnchor2({ store, ...props }) {
18484 const context = usePopoverProviderContext();
18485 store = store || context;
18486 props = {
18487 ...props,
18488 ref: useMergeRefs(store?.setAnchorElement, props.ref)
18489 };
18490 return props;
18491 });
18492 var PopoverAnchor = forwardRef29(function PopoverAnchor2(props) {
18493 return createElement3(TagName7, usePopoverAnchor(props));
18494 });
18495
18496 // node_modules/@ariakit/react-components/dist/composite/composite-hover.js
18497 var import_react22 = __toESM(require_react(), 1);
18498 var TagName8 = "div";
18499 function hoveringInside(event) {
18500 const nextElement = event.relatedTarget;
18501 if (!isElement2(nextElement)) return false;
18502 return contains2(event.currentTarget, nextElement);
18503 }
18504 var symbol2 = /* @__PURE__ */ Symbol("composite-hover");
18505 function movingToAnotherItem(event) {
18506 const { relatedTarget } = event;
18507 if (!isElement2(relatedTarget)) return false;
18508 let dest = relatedTarget;
18509 do {
18510 if (hasOwnProperty(dest, symbol2) && dest[symbol2]) return true;
18511 dest = dest.parentElement;
18512 } while (dest);
18513 return false;
18514 }
18515 var useCompositeHover = createHook(function useCompositeHover2({ store, focusOnHover = true, blurOnHoverEnd = !!focusOnHover, ...props }) {
18516 const context = useCompositeScopedContext();
18517 store = store || context;
18518 invariant(store, "CompositeHover must be wrapped in a Composite component.");
18519 const isMouseMoving = useIsMouseMoving();
18520 const onMouseMoveProp = props.onMouseMove;
18521 const focusOnHoverProp = useBooleanEvent(focusOnHover);
18522 const onMouseMove = useEvent((event) => {
18523 onMouseMoveProp?.(event);
18524 if (event.defaultPrevented) return;
18525 if (!isMouseMoving()) return;
18526 if (!focusOnHoverProp(event)) return;
18527 if (!hasFocusWithin(event.currentTarget)) {
18528 const baseElement = store?.getState().baseElement;
18529 if (baseElement && !hasFocus(baseElement)) baseElement.focus();
18530 }
18531 store?.setActiveId(event.currentTarget.id);
18532 });
18533 const onMouseLeaveProp = props.onMouseLeave;
18534 const blurOnHoverEndProp = useBooleanEvent(blurOnHoverEnd);
18535 const onMouseLeave = useEvent((event) => {
18536 onMouseLeaveProp?.(event);
18537 if (event.defaultPrevented) return;
18538 if (!isMouseMoving()) return;
18539 if (hoveringInside(event)) return;
18540 if (movingToAnotherItem(event)) return;
18541 if (!focusOnHoverProp(event)) return;
18542 if (!blurOnHoverEndProp(event)) return;
18543 store?.setActiveId(null);
18544 store?.getState().baseElement?.focus();
18545 });
18546 const ref = (0, import_react22.useCallback)((element) => {
18547 if (!element) return;
18548 element[symbol2] = true;
18549 }, []);
18550 props = {
18551 ...props,
18552 ref: useMergeRefs(ref, props.ref),
18553 onMouseMove,
18554 onMouseLeave
18555 };
18556 return removeUndefinedValues(props);
18557 });
18558 var CompositeHover = memo3(forwardRef29(function CompositeHover2(props) {
18559 return createElement3(TagName8, useCompositeHover(props));
18560 }));
18561
18562 // node_modules/@ariakit/react-components/dist/combobox/combobox.js
18563 var import_react23 = __toESM(require_react(), 1);
18564 var TagName9 = "input";
18565 function isFirstItemAutoSelected(items, activeValue, autoSelect) {
18566 if (!autoSelect) return false;
18567 return items.find((item) => !item.disabled && item.value)?.value === activeValue;
18568 }
18569 function hasCompletionString(value, activeValue) {
18570 if (!activeValue) return false;
18571 if (value == null) return false;
18572 const normalizedValue = normalizeString(value);
18573 const normalizedActiveValue = normalizeString(activeValue);
18574 if (normalizedValue.length !== value.length) return false;
18575 if (normalizedActiveValue.length !== activeValue.length) return false;
18576 return normalizedActiveValue.length > normalizedValue.length && normalizedActiveValue.toLowerCase().startsWith(normalizedValue.toLowerCase());
18577 }
18578 function isAriaAutoCompleteValue(value) {
18579 return value === "inline" || value === "list" || value === "both" || value === "none";
18580 }
18581 function getDefaultAutoSelectId(items) {
18582 return items.find((item) => {
18583 if (item.disabled) return false;
18584 return item.element?.getAttribute("role") !== "tab";
18585 })?.id;
18586 }
18587 var useCombobox = createHook(function useCombobox2({ store, focusable: focusable2 = true, autoSelect: autoSelectProp = false, getAutoSelectId, setValueOnChange, showMinLength = 0, showOnChange, showOnMouseDown, showOnClick = showOnMouseDown, showOnKeyDown, showOnKeyPress = showOnKeyDown, blurActiveItemOnClick, setValueOnClick = true, moveOnKeyPress = true, autoComplete = "list", ...props }) {
18588 const context = useComboboxProviderContext();
18589 store = store || context;
18590 invariant(store, "Combobox must receive a `store` prop or be wrapped in a ComboboxProvider component.");
18591 const ref = (0, import_react23.useRef)(null);
18592 const [valueUpdated, forceValueUpdate] = useForceUpdate();
18593 const canAutoSelectRef = (0, import_react23.useRef)(false);
18594 const composingRef = (0, import_react23.useRef)(false);
18595 const autoSelect = useStoreState(store, (state) => state.virtualFocus && autoSelectProp);
18596 const inline4 = autoComplete === "inline" || autoComplete === "both";
18597 const [canInline, setCanInline] = (0, import_react23.useState)(inline4);
18598 useUpdateLayoutEffect(() => {
18599 if (!inline4) return;
18600 setCanInline(true);
18601 }, [inline4]);
18602 const storeValue = useStoreState(store, "value");
18603 const prevSelectedValueRef = (0, import_react23.useRef)(void 0);
18604 (0, import_react23.useEffect)(() => {
18605 return sync(store, ["selectedValue", "activeId"], (_, prev) => {
18606 prevSelectedValueRef.current = prev.selectedValue;
18607 });
18608 }, [store]);
18609 const inlineActiveValue = useStoreState(store, (state) => {
18610 if (!inline4) return;
18611 if (!canInline) return;
18612 if (state.activeValue && Array.isArray(state.selectedValue)) {
18613 if (state.selectedValue.includes(state.activeValue)) return;
18614 if (prevSelectedValueRef.current?.includes(state.activeValue)) return;
18615 }
18616 return state.activeValue;
18617 });
18618 const items = useStoreState(store, "renderedItems");
18619 const open = useStoreState(store, "open");
18620 const contentElement = useStoreState(store, "contentElement");
18621 const value = (0, import_react23.useMemo)(() => {
18622 if (!inline4) return storeValue;
18623 if (!canInline) return storeValue;
18624 if (isFirstItemAutoSelected(items, inlineActiveValue, autoSelect)) {
18625 if (hasCompletionString(storeValue, inlineActiveValue)) return storeValue + (inlineActiveValue?.slice(storeValue.length) || "");
18626 return storeValue;
18627 }
18628 return inlineActiveValue || storeValue;
18629 }, [
18630 inline4,
18631 canInline,
18632 items,
18633 inlineActiveValue,
18634 autoSelect,
18635 storeValue
18636 ]);
18637 (0, import_react23.useEffect)(() => {
18638 const element = ref.current;
18639 if (!element) return;
18640 const onCompositeItemMove = () => setCanInline(true);
18641 element.addEventListener("combobox-item-move", onCompositeItemMove);
18642 return () => {
18643 element.removeEventListener("combobox-item-move", onCompositeItemMove);
18644 };
18645 }, []);
18646 (0, import_react23.useEffect)(() => {
18647 if (!inline4) return;
18648 if (!canInline) return;
18649 if (!inlineActiveValue) return;
18650 if (!isFirstItemAutoSelected(items, inlineActiveValue, autoSelect)) return;
18651 if (!hasCompletionString(storeValue, inlineActiveValue)) return;
18652 let cleanup = noop4;
18653 queueMicrotask(() => {
18654 const element = ref.current;
18655 if (!element) return;
18656 const { start: prevStart, end: prevEnd } = getTextboxSelection(element);
18657 const nextStart = storeValue.length;
18658 const nextEnd = inlineActiveValue.length;
18659 setSelectionRange(element, nextStart, nextEnd);
18660 cleanup = () => {
18661 if (!hasFocus(element)) return;
18662 const { start, end } = getTextboxSelection(element);
18663 if (start !== nextStart) return;
18664 if (end !== nextEnd) return;
18665 setSelectionRange(element, prevStart, prevEnd);
18666 };
18667 });
18668 return () => cleanup();
18669 }, [
18670 valueUpdated,
18671 inline4,
18672 canInline,
18673 inlineActiveValue,
18674 items,
18675 autoSelect,
18676 storeValue
18677 ]);
18678 const getAutoSelectIdProp = useEvent(getAutoSelectId);
18679 const autoSelectIdRef = (0, import_react23.useRef)(null);
18680 const autoSelectMovedRef = (0, import_react23.useRef)(void 0);
18681 const userScrolledRef = (0, import_react23.useRef)(false);
18682 const isAutoScrollingRef = (0, import_react23.useRef)(false);
18683 (0, import_react23.useEffect)(() => {
18684 if (!open) return;
18685 if (!contentElement) return;
18686 const scrollingElement = getScrollingElement(contentElement);
18687 if (!scrollingElement) return;
18688 const onUserScroll = () => {
18689 canAutoSelectRef.current = false;
18690 userScrolledRef.current = true;
18691 };
18692 const onScroll = () => {
18693 if (!isAutoScrollingRef.current) userScrolledRef.current = true;
18694 if (!store) return;
18695 if (!canAutoSelectRef.current) return;
18696 const { activeId } = store.getState();
18697 if (activeId === null) return;
18698 if (activeId === autoSelectIdRef.current) return;
18699 canAutoSelectRef.current = false;
18700 };
18701 const options = {
18702 passive: true,
18703 capture: true
18704 };
18705 scrollingElement.addEventListener("wheel", onUserScroll, options);
18706 scrollingElement.addEventListener("touchmove", onUserScroll, options);
18707 scrollingElement.addEventListener("scroll", onScroll, options);
18708 return () => {
18709 scrollingElement.removeEventListener("wheel", onUserScroll, true);
18710 scrollingElement.removeEventListener("touchmove", onUserScroll, true);
18711 scrollingElement.removeEventListener("scroll", onScroll, true);
18712 };
18713 }, [
18714 open,
18715 contentElement,
18716 store
18717 ]);
18718 useSafeLayoutEffect(() => {
18719 userScrolledRef.current = false;
18720 if (!storeValue) return;
18721 if (composingRef.current) return;
18722 canAutoSelectRef.current = true;
18723 }, [storeValue]);
18724 useSafeLayoutEffect(() => {
18725 if (autoSelect !== "always" && open) return;
18726 canAutoSelectRef.current = open;
18727 }, [autoSelect, open]);
18728 useSafeLayoutEffect(() => {
18729 if (open) return;
18730 autoSelectMovedRef.current = void 0;
18731 }, [open]);
18732 const resetValueOnSelect = useStoreState(store, "resetValueOnSelect");
18733 useUpdateEffect(() => {
18734 const canAutoSelect = canAutoSelectRef.current;
18735 if (!store) return;
18736 if (!open) return;
18737 if (!canAutoSelect && (!resetValueOnSelect || userScrolledRef.current)) return;
18738 const { baseElement, contentElement: contentElement2, activeId } = store.getState();
18739 if (baseElement && !hasFocus(baseElement)) return;
18740 if (contentElement2?.hasAttribute("data-placing")) {
18741 const observer = new MutationObserver(forceValueUpdate);
18742 observer.observe(contentElement2, { attributeFilter: ["data-placing"] });
18743 return () => observer.disconnect();
18744 }
18745 if (autoSelect && canAutoSelect) {
18746 const userAutoSelectId = getAutoSelectIdProp(items);
18747 const autoSelectId = userAutoSelectId !== void 0 ? userAutoSelectId : getDefaultAutoSelectId(items) ?? store.first();
18748 autoSelectIdRef.current = autoSelectId;
18749 const nextActiveId = autoSelectId ?? null;
18750 const nextActiveValue = store.item(nextActiveId)?.value;
18751 const moved = autoSelectMovedRef.current;
18752 if (nextActiveId !== activeId || moved?.id !== nextActiveId || moved?.value !== nextActiveValue) {
18753 autoSelectMovedRef.current = {
18754 id: nextActiveId,
18755 value: nextActiveValue
18756 };
18757 store.move(nextActiveId);
18758 } else store.setState("activeValue", nextActiveValue);
18759 } else {
18760 const element = store.item(activeId || store.first())?.element;
18761 if (element && "scrollIntoView" in element) {
18762 isAutoScrollingRef.current = true;
18763 element.scrollIntoView({
18764 block: "nearest",
18765 inline: "nearest"
18766 });
18767 requestAnimationFrame(() => {
18768 isAutoScrollingRef.current = false;
18769 });
18770 }
18771 }
18772 }, [
18773 store,
18774 open,
18775 valueUpdated,
18776 storeValue,
18777 autoSelect,
18778 resetValueOnSelect,
18779 getAutoSelectIdProp,
18780 items
18781 ]);
18782 (0, import_react23.useEffect)(() => {
18783 if (!inline4) return;
18784 const combobox = ref.current;
18785 if (!combobox) return;
18786 const elements = [combobox, contentElement].filter((value2) => !!value2);
18787 const onBlur2 = (event) => {
18788 if (elements.every((el) => isFocusEventOutside(event, el))) store?.setValue(value);
18789 };
18790 for (const element of elements) element.addEventListener("focusout", onBlur2);
18791 return () => {
18792 for (const element of elements) element.removeEventListener("focusout", onBlur2);
18793 };
18794 }, [
18795 inline4,
18796 contentElement,
18797 store,
18798 value
18799 ]);
18800 const canShow = (event) => {
18801 return event.currentTarget.value.length >= showMinLength;
18802 };
18803 const onChangeProp = props.onChange;
18804 const showOnChangeProp = useBooleanEvent(showOnChange ?? canShow);
18805 const setValueOnChangeProp = useBooleanEvent(setValueOnChange ?? !store.tag);
18806 const onChange = useEvent((event) => {
18807 onChangeProp?.(event);
18808 if (event.defaultPrevented) return;
18809 if (!store) return;
18810 const currentTarget = event.currentTarget;
18811 const { value: value2, selectionStart, selectionEnd } = currentTarget;
18812 const nativeEvent = event.nativeEvent;
18813 canAutoSelectRef.current = true;
18814 if (isInputEvent(nativeEvent)) {
18815 if (nativeEvent.isComposing) {
18816 canAutoSelectRef.current = false;
18817 composingRef.current = true;
18818 }
18819 if (inline4) {
18820 const textInserted = nativeEvent.inputType === "insertText" || nativeEvent.inputType === "insertCompositionText";
18821 const caretAtEnd = selectionStart === value2.length;
18822 setCanInline(textInserted && caretAtEnd);
18823 }
18824 }
18825 if (setValueOnChangeProp(event)) {
18826 const isSameValue2 = value2 === store.getState().value;
18827 store.setValue(value2);
18828 queueMicrotask(() => {
18829 setSelectionRange(currentTarget, selectionStart, selectionEnd);
18830 });
18831 if (inline4 && autoSelect && isSameValue2) forceValueUpdate();
18832 }
18833 if (showOnChangeProp(event)) store.show();
18834 if (!autoSelect || !canAutoSelectRef.current) store.setActiveId(null);
18835 });
18836 const onCompositionEndProp = props.onCompositionEnd;
18837 const onCompositionEnd = useEvent((event) => {
18838 canAutoSelectRef.current = true;
18839 composingRef.current = false;
18840 onCompositionEndProp?.(event);
18841 if (event.defaultPrevented) return;
18842 if (!autoSelect) return;
18843 forceValueUpdate();
18844 });
18845 const onMouseDownProp = props.onMouseDown;
18846 const blurActiveItemOnClickProp = useBooleanEvent(blurActiveItemOnClick ?? (() => store.getState().includesBaseElement));
18847 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
18848 const showOnClickProp = useBooleanEvent(showOnClick ?? canShow);
18849 const onMouseDown = useEvent((event) => {
18850 onMouseDownProp?.(event);
18851 if (event.defaultPrevented) return;
18852 if (event.button) return;
18853 if (event.ctrlKey) return;
18854 if (!store) return;
18855 if (blurActiveItemOnClickProp(event)) store.setActiveId(null);
18856 if (setValueOnClickProp(event)) store.setValue(value);
18857 if (showOnClickProp(event)) queueBeforeEvent(event.currentTarget, "mouseup", store.show);
18858 });
18859 const onKeyDownProp = props.onKeyDown;
18860 const showOnKeyPressProp = useBooleanEvent(showOnKeyPress ?? canShow);
18861 const onKeyDown = useEvent((event) => {
18862 onKeyDownProp?.(event);
18863 if (!event.repeat) canAutoSelectRef.current = false;
18864 if (event.defaultPrevented) return;
18865 if (!store) return;
18866 const { open: open2 } = store.getState();
18867 if (open2 && event.key === "Enter") {
18868 event.preventDefault();
18869 return;
18870 }
18871 if (event.ctrlKey) return;
18872 if (event.altKey) return;
18873 if (event.shiftKey) return;
18874 if (event.metaKey) return;
18875 if (open2) return;
18876 if (event.key === "ArrowUp" || event.key === "ArrowDown") {
18877 if (showOnKeyPressProp(event)) {
18878 event.preventDefault();
18879 store.show();
18880 }
18881 }
18882 });
18883 const onBlurProp = props.onBlur;
18884 const onBlur = useEvent((event) => {
18885 canAutoSelectRef.current = false;
18886 onBlurProp?.(event);
18887 });
18888 const id = useId4(props.id);
18889 const ariaAutoComplete = isAriaAutoCompleteValue(autoComplete) ? autoComplete : void 0;
18890 const isActiveItem = useStoreState(store, (state) => state.activeId === null);
18891 props = {
18892 role: "combobox",
18893 "aria-autocomplete": ariaAutoComplete,
18894 "aria-haspopup": getPopupRole(contentElement, "listbox"),
18895 "aria-expanded": open,
18896 "aria-controls": contentElement?.id,
18897 "data-active-item": isActiveItem || void 0,
18898 value,
18899 ...props,
18900 id,
18901 ref: useMergeRefs(ref, props.ref),
18902 onChange,
18903 onCompositionEnd,
18904 onMouseDown,
18905 onKeyDown,
18906 onBlur
18907 };
18908 props = useComposite({
18909 store,
18910 focusable: focusable2,
18911 ...props,
18912 moveOnKeyPress: (event) => {
18913 if (isFalsyBooleanCallback(moveOnKeyPress, event)) return false;
18914 if (inline4) setCanInline(true);
18915 return true;
18916 }
18917 });
18918 props = usePopoverAnchor({
18919 store,
18920 ...props
18921 });
18922 return {
18923 autoComplete: "off",
18924 ...props
18925 };
18926 });
18927 var Combobox = forwardRef29(function Combobox2(props) {
18928 return createElement3(TagName9, useCombobox(props));
18929 });
18930
18931 // node_modules/@ariakit/react-components/dist/combobox/combobox-item.js
18932 var import_react24 = __toESM(require_react(), 1);
18933 var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
18934 var TagName10 = "div";
18935 function isSelected(storeValue, itemValue) {
18936 if (itemValue == null) return;
18937 if (storeValue == null) return false;
18938 if (Array.isArray(storeValue)) return storeValue.includes(itemValue);
18939 return storeValue === itemValue;
18940 }
18941 function getItemRole(popupRole) {
18942 return getItemRoleByPopupRole(popupRole) ?? "option";
18943 }
18944 var useComboboxItem = createHook(function useComboboxItem2({ store, value, hideOnClick, setValueOnClick, selectValueOnClick = true, resetValueOnSelect, focusOnHover = false, moveOnKeyPress = true, getItem: getItemProp, ...props }) {
18945 const context = useComboboxScopedContext();
18946 store = store || context;
18947 invariant(store, "ComboboxItem must be wrapped in a ComboboxList or ComboboxPopover component.");
18948 const { resetValueOnSelectState, multiSelectable, selected } = useStoreStateObject(store, {
18949 resetValueOnSelectState: "resetValueOnSelect",
18950 multiSelectable(state) {
18951 return Array.isArray(state.selectedValue);
18952 },
18953 selected(state) {
18954 return isSelected(state.selectedValue, value);
18955 }
18956 });
18957 const getItem = (0, import_react24.useCallback)((item) => {
18958 const nextItem = {
18959 ...item,
18960 value
18961 };
18962 if (getItemProp) return getItemProp(nextItem);
18963 return nextItem;
18964 }, [value, getItemProp]);
18965 setValueOnClick = setValueOnClick ?? !multiSelectable;
18966 hideOnClick = hideOnClick ?? (value != null && !multiSelectable);
18967 const onClickProp = props.onClick;
18968 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
18969 const selectValueOnClickProp = useBooleanEvent(selectValueOnClick);
18970 const resetValueOnSelectProp = useBooleanEvent(resetValueOnSelect ?? resetValueOnSelectState ?? multiSelectable);
18971 const hideOnClickProp = useBooleanEvent(hideOnClick);
18972 const onClick = useEvent((event) => {
18973 onClickProp?.(event);
18974 if (event.defaultPrevented) return;
18975 if (isDownloading(event)) return;
18976 if (isOpeningInNewTab(event)) return;
18977 if (value != null) {
18978 if (selectValueOnClickProp(event)) {
18979 if (resetValueOnSelectProp(event)) store?.resetValue();
18980 store?.setSelectedValue((prevValue) => {
18981 if (!Array.isArray(prevValue)) return value;
18982 if (prevValue.includes(value)) return prevValue.filter((v2) => v2 !== value);
18983 return [...prevValue, value];
18984 });
18985 }
18986 if (setValueOnClickProp(event)) store?.setValue(value);
18987 }
18988 if (hideOnClickProp(event)) store?.hide();
18989 });
18990 const onKeyDownProp = props.onKeyDown;
18991 const onKeyDown = useEvent((event) => {
18992 onKeyDownProp?.(event);
18993 if (event.defaultPrevented) return;
18994 const baseElement = store?.getState().baseElement;
18995 if (!baseElement) return;
18996 if (hasFocus(baseElement)) return;
18997 const printable = event.key.length === 1 && !event.ctrlKey && !event.metaKey;
18998 const paste = (!isApple() ? event.ctrlKey : event.metaKey) && event.key.toLowerCase() === "v";
18999 const deleteKey = event.key === "Backspace" || event.key === "Delete";
19000 if (printable || paste || deleteKey) {
19001 queueMicrotask(() => baseElement.focus());
19002 if (isTextField(baseElement)) store?.setValue(baseElement.value);
19003 }
19004 });
19005 if (multiSelectable && selected != null) props = {
19006 "aria-selected": selected,
19007 ...props
19008 };
19009 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(ComboboxItemValueContext.Provider, {
19010 value,
19011 children: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(ComboboxItemCheckedContext.Provider, {
19012 value: selected ?? false,
19013 children: element
19014 })
19015 }), [value, selected]);
19016 props = {
19017 role: getItemRole((0, import_react24.useContext)(ComboboxListRoleContext)),
19018 children: value,
19019 ...props,
19020 onClick,
19021 onKeyDown
19022 };
19023 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
19024 props = useCompositeItem({
19025 store,
19026 ...props,
19027 getItem,
19028 moveOnKeyPress: (event) => {
19029 if (!moveOnKeyPressProp(event)) return false;
19030 const moveEvent = new Event("combobox-item-move");
19031 store?.getState().baseElement?.dispatchEvent(moveEvent);
19032 return true;
19033 }
19034 });
19035 props = useCompositeHover({
19036 store,
19037 focusOnHover,
19038 ...props
19039 });
19040 return props;
19041 });
19042 var ComboboxItem = memo3(forwardRef29(function ComboboxItem2(props) {
19043 return createElement3(TagName10, useComboboxItem(props));
19044 }));
19045
19046 // node_modules/@ariakit/react-components/dist/combobox/combobox-item-value.js
19047 var import_react25 = __toESM(require_react(), 1);
19048 var import_jsx_runtime78 = __toESM(require_jsx_runtime(), 1);
19049 var TagName11 = "span";
19050 function normalizeValue(value) {
19051 return normalizeString(value).toLowerCase();
19052 }
19053 function getOffsets(string, values) {
19054 const offsets = [];
19055 for (const value of values) {
19056 if (!value) continue;
19057 let pos = 0;
19058 const length = value.length;
19059 let index2 = string.indexOf(value, pos);
19060 while (index2 !== -1) {
19061 offsets.push([index2, length]);
19062 pos = index2 + 1;
19063 index2 = string.indexOf(value, pos);
19064 }
19065 }
19066 return offsets;
19067 }
19068 function mergeOverlappingOffsets(offsets) {
19069 offsets.sort(([a2], [b2]) => a2 - b2);
19070 const merged = [];
19071 for (const [offset4, length] of offsets) {
19072 const last = merged[merged.length - 1];
19073 if (last && offset4 < last[0] + last[1]) last[1] = Math.max(last[1], offset4 + length - last[0]);
19074 else merged.push([offset4, length]);
19075 }
19076 return merged;
19077 }
19078 function getNormalizedIndexes(itemValue) {
19079 const starts = [];
19080 const ends = [];
19081 let index2 = 0;
19082 for (const char of itemValue) {
19083 const normalizedLength = normalizeValue(char).length;
19084 for (let i2 = 0; i2 < normalizedLength; i2 += 1) {
19085 starts.push(i2 === 0 ? index2 : -1);
19086 ends.push(index2);
19087 }
19088 index2 += char.length;
19089 }
19090 starts.push(itemValue.length);
19091 ends.push(itemValue.length);
19092 let nextBoundary = itemValue.length;
19093 for (let i2 = starts.length - 1; i2 >= 0; i2 -= 1) {
19094 const start = starts[i2];
19095 if (start == null) continue;
19096 if (start === -1) starts[i2] = nextBoundary;
19097 else nextBoundary = start;
19098 }
19099 return {
19100 starts,
19101 ends
19102 };
19103 }
19104 function toOriginalOffsets(itemValue, normalizedOffsets) {
19105 if (!normalizedOffsets.length) return normalizedOffsets;
19106 const { starts, ends } = getNormalizedIndexes(itemValue);
19107 const offsets = [];
19108 for (const [normalizedOffset, normalizedLength] of normalizedOffsets) {
19109 const start = starts[normalizedOffset];
19110 const end = ends[normalizedOffset + normalizedLength];
19111 if (start == null || end == null) continue;
19112 if (end <= start) continue;
19113 offsets.push([start, end - start]);
19114 }
19115 return offsets;
19116 }
19117 function splitValue(itemValue, userValue) {
19118 if (!itemValue) return itemValue;
19119 if (!userValue) return itemValue;
19120 const userValues = toArray(userValue).map(normalizeValue);
19121 const parts = [];
19122 const span = (value, autocomplete = false) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", {
19123 "data-autocomplete-value": autocomplete ? "" : void 0,
19124 "data-user-value": autocomplete ? void 0 : "",
19125 children: value
19126 }, parts.length);
19127 const offsets = toOriginalOffsets(itemValue, mergeOverlappingOffsets(getOffsets(normalizeValue(itemValue), new Set(userValues))));
19128 const firstEntry = offsets[0];
19129 if (!firstEntry) {
19130 parts.push(span(itemValue, true));
19131 return parts;
19132 }
19133 const [firstOffset] = firstEntry;
19134 [itemValue.slice(0, firstOffset), ...offsets.flatMap(([offset4, length], i2) => {
19135 const value = itemValue.slice(offset4, offset4 + length);
19136 const nextOffset = offsets[i2 + 1]?.[0];
19137 return [value, itemValue.slice(offset4 + length, nextOffset)];
19138 })].forEach((value, i2) => {
19139 if (!value) return;
19140 parts.push(span(value, i2 % 2 === 0));
19141 });
19142 return parts;
19143 }
19144 var useComboboxItemValue = createHook(function useComboboxItemValue2({ store, value, userValue, ...props }) {
19145 const context = useComboboxScopedContext();
19146 store = store || context;
19147 const itemContext = (0, import_react25.useContext)(ComboboxItemValueContext);
19148 const itemValue = value ?? itemContext;
19149 const inputValue = useStoreState(store, (state) => userValue ?? state?.value);
19150 props = {
19151 children: (0, import_react25.useMemo)(() => {
19152 if (!itemValue) return;
19153 if (!inputValue) return itemValue;
19154 return splitValue(itemValue, inputValue);
19155 }, [itemValue, inputValue]),
19156 ...props
19157 };
19158 return removeUndefinedValues(props);
19159 });
19160 var ComboboxItemValue = forwardRef29(function ComboboxItemValue2(props) {
19161 return createElement3(TagName11, useComboboxItemValue(props));
19162 });
19163
19164 // node_modules/@ariakit/react-components/dist/combobox/combobox-label.js
19165 var TagName12 = "label";
19166 var useComboboxLabel = createHook(function useComboboxLabel2({ store, ...props }) {
19167 const context = useComboboxProviderContext();
19168 store = store || context;
19169 invariant(store, "ComboboxLabel must receive a `store` prop or be wrapped in a ComboboxProvider component.");
19170 props = {
19171 htmlFor: useStoreState(store, (state) => state.baseElement?.id),
19172 ...props
19173 };
19174 return removeUndefinedValues(props);
19175 });
19176 var ComboboxLabel = memo3(forwardRef29(function ComboboxLabel2(props) {
19177 return createElement3(TagName12, useComboboxLabel(props));
19178 }));
19179
19180 // node_modules/@ariakit/react-components/dist/combobox/combobox-list.js
19181 var import_react26 = __toESM(require_react(), 1);
19182 var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
19183 var TagName13 = "div";
19184 var useComboboxList = createHook(function useComboboxList2({ store, alwaysVisible, ...props }) {
19185 const scopedContext = useComboboxScopedContext(true);
19186 const context = useComboboxContext();
19187 store = store || context;
19188 const scopedContextSameStore = !!store && store === scopedContext;
19189 invariant(store, "ComboboxList must receive a `store` prop or be wrapped in a ComboboxProvider component.");
19190 const ref = (0, import_react26.useRef)(null);
19191 const id = useId4(props.id);
19192 const mounted = useStoreState(store, "mounted");
19193 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
19194 const style = hidden ? {
19195 ...props.style,
19196 display: "none"
19197 } : props.style;
19198 const multiSelectable = useStoreState(store, (state) => Array.isArray(state.selectedValue));
19199 const role = useAttribute(ref, "role", props.role);
19200 const ariaMultiSelectable = role === "listbox" || role === "tree" || role === "grid" ? multiSelectable || void 0 : void 0;
19201 const [hasListboxInside, setHasListboxInside] = (0, import_react26.useState)(false);
19202 const contentElement = useStoreState(store, "contentElement");
19203 useSafeLayoutEffect(() => {
19204 if (!mounted) return;
19205 const element = ref.current;
19206 if (!element) return;
19207 if (contentElement !== element) return;
19208 const callback = () => {
19209 setHasListboxInside(!!element.querySelector("[role='listbox']"));
19210 };
19211 const observer = new MutationObserver(callback);
19212 observer.observe(element, {
19213 subtree: true,
19214 childList: true,
19215 attributeFilter: ["role"]
19216 });
19217 callback();
19218 return () => observer.disconnect();
19219 }, [mounted, contentElement]);
19220 if (!hasListboxInside) props = {
19221 role: "listbox",
19222 "aria-multiselectable": ariaMultiSelectable,
19223 ...props
19224 };
19225 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(ComboboxScopedContextProvider, {
19226 value: store,
19227 children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(ComboboxListRoleContext.Provider, {
19228 value: role,
19229 children: element
19230 })
19231 }), [store, role]);
19232 const setContentElement = id && (!scopedContext || !scopedContextSameStore) ? store.setContentElement : null;
19233 props = {
19234 hidden,
19235 ...props,
19236 id,
19237 ref: useMergeRefs(setContentElement, ref, props.ref),
19238 style
19239 };
19240 return removeUndefinedValues(props);
19241 });
19242 var ComboboxList = forwardRef29(function ComboboxList2(props) {
19243 return createElement3(TagName13, useComboboxList(props));
19244 });
19245
19246 // node_modules/@ariakit/react-components/dist/tag/tag-context.js
19247 var import_react27 = __toESM(require_react(), 1);
19248 var TagValueContext = (0, import_react27.createContext)(null);
19249 var TagRemoveIdContext = (0, import_react27.createContext)(null);
19250 var ctx7 = createStoreContext([CompositeContextProvider], [CompositeScopedContextProvider]);
19251 var useTagContext = ctx7.useContext;
19252 var useTagScopedContext = ctx7.useScopedContext;
19253 var useTagProviderContext = ctx7.useProviderContext;
19254 var TagContextProvider = ctx7.ContextProvider;
19255 var TagScopedContextProvider = ctx7.ScopedContextProvider;
19256
19257 // node_modules/@ariakit/components/dist/combobox/combobox-store.js
19258 var isTouchSafari = isSafari() && isTouchDevice();
19259 function createComboboxStore({ tag, ...props } = {}) {
19260 const store = mergeStore(props.store, pick2(tag, ["value", "rtl"]));
19261 throwOnConflictingProps(props, store);
19262 const tagState = tag?.getState();
19263 const syncState = store?.getState();
19264 const activeId = defaultValue(props.activeId, syncState?.activeId, props.defaultActiveId, null);
19265 const composite = createCompositeStore({
19266 ...props,
19267 activeId,
19268 includesBaseElement: defaultValue(props.includesBaseElement, syncState?.includesBaseElement, true),
19269 orientation: defaultValue(props.orientation, syncState?.orientation, "vertical"),
19270 focusLoop: defaultValue(props.focusLoop, syncState?.focusLoop, true),
19271 focusWrap: defaultValue(props.focusWrap, syncState?.focusWrap, true),
19272 virtualFocus: defaultValue(props.virtualFocus, syncState?.virtualFocus, true)
19273 });
19274 const popover = createPopoverStore({
19275 ...props,
19276 placement: defaultValue(props.placement, syncState?.placement, "bottom-start")
19277 });
19278 const value = defaultValue(props.value, syncState?.value, props.defaultValue, "");
19279 const selectedValue = defaultValue(props.selectedValue, syncState?.selectedValue, tagState?.values, props.defaultSelectedValue, "");
19280 const multiSelectable = Array.isArray(selectedValue);
19281 const initialState = {
19282 ...composite.getState(),
19283 ...popover.getState(),
19284 value,
19285 selectedValue,
19286 resetValueOnSelect: defaultValue(props.resetValueOnSelect, syncState?.resetValueOnSelect, multiSelectable),
19287 resetValueOnHide: defaultValue(props.resetValueOnHide, syncState?.resetValueOnHide, multiSelectable && !tag),
19288 activeValue: syncState?.activeValue
19289 };
19290 const combobox = createStore(initialState, composite, popover, store);
19291 if (isTouchSafari) setup(combobox, () => sync(combobox, ["virtualFocus"], () => {
19292 combobox.setState("virtualFocus", false);
19293 }));
19294 setup(combobox, () => {
19295 if (!tag) return;
19296 return chain(sync(combobox, ["selectedValue"], (state) => {
19297 if (!Array.isArray(state.selectedValue)) return;
19298 tag.setValues(state.selectedValue);
19299 }), sync(tag, ["values"], (state) => {
19300 combobox.setState("selectedValue", state.values);
19301 }));
19302 });
19303 setup(combobox, () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => {
19304 if (!state.resetValueOnHide) return;
19305 if (state.mounted) return;
19306 combobox.setState("value", value);
19307 }));
19308 setup(combobox, () => sync(combobox, ["open"], (state) => {
19309 if (state.open) return;
19310 combobox.setState("activeId", activeId);
19311 combobox.setState("moves", 0);
19312 }));
19313 setup(combobox, () => sync(combobox, ["moves", "activeId"], (state, prevState) => {
19314 if (state.moves === prevState.moves) combobox.setState("activeValue", void 0);
19315 }));
19316 setup(combobox, () => batch(combobox, ["moves", "renderedItems"], (state, prev) => {
19317 if (state.moves === prev.moves) return;
19318 const { activeId: activeId2 } = combobox.getState();
19319 const activeItem = composite.item(activeId2);
19320 combobox.setState("activeValue", activeItem?.value);
19321 }));
19322 return {
19323 ...popover,
19324 ...composite,
19325 ...combobox,
19326 tag,
19327 setValue: (value2) => combobox.setState("value", value2),
19328 resetValue: () => combobox.setState("value", initialState.value),
19329 setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2)
19330 };
19331 }
19332
19333 // node_modules/@ariakit/react-components/dist/combobox/combobox-store.js
19334 function useComboboxStoreOptions(props) {
19335 const tag = useTagContext();
19336 props = {
19337 ...props,
19338 tag: props.tag !== void 0 ? props.tag : tag
19339 };
19340 return useCompositeStoreOptions(props);
19341 }
19342 function useComboboxStoreProps(store, update2, props) {
19343 useUpdateEffect(update2, [props.tag]);
19344 useStoreProps(store, props, "value", "setValue");
19345 useStoreProps(store, props, "selectedValue", "setSelectedValue");
19346 useStoreProps(store, props, "resetValueOnHide");
19347 useStoreProps(store, props, "resetValueOnSelect");
19348 return Object.assign(useCompositeStoreProps(usePopoverStoreProps(store, update2, props), update2, props), { tag: props.tag });
19349 }
19350 function useComboboxStore(props = {}) {
19351 props = useComboboxStoreOptions(props);
19352 const [store, update2] = useStore2(createComboboxStore, props);
19353 return useComboboxStoreProps(store, update2, props);
19354 }
19355
19356 // node_modules/@ariakit/react-components/dist/combobox/combobox-provider.js
19357 var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
19358 function ComboboxProvider(props = {}) {
19359 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(ComboboxContextProvider, {
19360 value: useComboboxStore(props),
19361 children: props.children
19362 });
19363 }
19364
19365 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
19366 var import_remove_accents = __toESM(require_remove_accents(), 1);
19367 var import_compose8 = __toESM(require_compose(), 1);
19368 var import_i18n24 = __toESM(require_i18n(), 1);
19369 var import_element51 = __toESM(require_element(), 1);
19370 var import_components19 = __toESM(require_components(), 1);
19371
19372 // packages/dataviews/build-module/components/dataviews-filters/utils.mjs
19373 var EMPTY_ARRAY3 = [];
19374 var getCurrentValue = (filterDefinition, currentFilter) => {
19375 if (filterDefinition.singleSelection) {
19376 return currentFilter?.value;
19377 }
19378 if (Array.isArray(currentFilter?.value)) {
19379 return currentFilter.value;
19380 }
19381 if (!Array.isArray(currentFilter?.value) && !!currentFilter?.value) {
19382 return [currentFilter.value];
19383 }
19384 return EMPTY_ARRAY3;
19385 };
19386
19387 // packages/dataviews/build-module/hooks/use-elements.mjs
19388 var import_element50 = __toESM(require_element(), 1);
19389 var EMPTY_ARRAY4 = [];
19390 function useElements({
19391 elements,
19392 getElements
19393 }) {
19394 const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY4;
19395 const [records, setRecords] = (0, import_element50.useState)(staticElements);
19396 const [isLoading, setIsLoading] = (0, import_element50.useState)(false);
19397 (0, import_element50.useEffect)(() => {
19398 if (!getElements) {
19399 setRecords(staticElements);
19400 return;
19401 }
19402 let cancelled = false;
19403 setIsLoading(true);
19404 getElements().then((fetchedElements) => {
19405 if (!cancelled) {
19406 const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements;
19407 setRecords(dynamicElements);
19408 }
19409 }).catch(() => {
19410 if (!cancelled) {
19411 setRecords(staticElements);
19412 }
19413 }).finally(() => {
19414 if (!cancelled) {
19415 setIsLoading(false);
19416 }
19417 });
19418 return () => {
19419 cancelled = true;
19420 };
19421 }, [getElements, staticElements]);
19422 return {
19423 elements: records,
19424 isLoading
19425 };
19426 }
19427
19428 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
19429 var import_jsx_runtime81 = __toESM(require_jsx_runtime(), 1);
19430 function normalizeSearchInput(input = "") {
19431 return (0, import_remove_accents.default)(input.trim().toLowerCase());
19432 }
19433 var getNewValue = (filterDefinition, currentFilter, value) => {
19434 if (filterDefinition.singleSelection) {
19435 return value;
19436 }
19437 if (Array.isArray(currentFilter?.value)) {
19438 return currentFilter.value.includes(value) ? currentFilter.value.filter((v2) => v2 !== value) : [...currentFilter.value, value];
19439 }
19440 return [value];
19441 };
19442 function generateFilterElementCompositeItemId(prefix, filterElementValue) {
19443 return `${prefix}-${filterElementValue}`;
19444 }
19445 var MultiSelectionOption = ({ selected }) => {
19446 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19447 "span",
19448 {
19449 className: clsx_default(
19450 "dataviews-filters__search-widget-listitem-multi-selection",
19451 { "is-selected": selected }
19452 ),
19453 children: selected && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_components19.Icon, { icon: check_default })
19454 }
19455 );
19456 };
19457 var SingleSelectionOption = ({ selected }) => {
19458 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19459 "span",
19460 {
19461 className: clsx_default(
19462 "dataviews-filters__search-widget-listitem-single-selection",
19463 { "is-selected": selected }
19464 )
19465 }
19466 );
19467 };
19468 function ListBox({ view, filter, onChangeView }) {
19469 const baseId = (0, import_compose8.useInstanceId)(ListBox, "dataviews-filter-list-box");
19470 const [activeCompositeId, setActiveCompositeId] = (0, import_element51.useState)(
19471 // When there are one or less operators, the first item is set as active
19472 // (by setting the initial `activeId` to `undefined`).
19473 // With 2 or more operators, the focus is moved on the operators control
19474 // (by setting the initial `activeId` to `null`), meaning that there won't
19475 // be an active item initially. Focus is then managed via the
19476 // `onFocusVisible` callback.
19477 filter.operators?.length === 1 ? void 0 : null
19478 );
19479 const currentFilter = view.filters?.find(
19480 (f2) => f2.field === filter.field
19481 );
19482 const currentValue = getCurrentValue(filter, currentFilter);
19483 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19484 import_components19.Composite,
19485 {
19486 virtualFocus: true,
19487 focusLoop: true,
19488 activeId: activeCompositeId,
19489 setActiveId: setActiveCompositeId,
19490 role: "listbox",
19491 className: "dataviews-filters__search-widget-listbox",
19492 "aria-label": (0, import_i18n24.sprintf)(
19493 /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */
19494 (0, import_i18n24.__)("List of: %1$s"),
19495 filter.name
19496 ),
19497 onFocusVisible: () => {
19498 if (!activeCompositeId && filter.elements.length) {
19499 setActiveCompositeId(
19500 generateFilterElementCompositeItemId(
19501 baseId,
19502 filter.elements[0].value
19503 )
19504 );
19505 }
19506 },
19507 render: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_components19.Composite.Typeahead, {}),
19508 children: filter.elements.map((element) => /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
19509 import_components19.Composite.Hover,
19510 {
19511 render: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19512 import_components19.Composite.Item,
19513 {
19514 id: generateFilterElementCompositeItemId(
19515 baseId,
19516 element.value
19517 ),
19518 render: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19519 "div",
19520 {
19521 "aria-label": element.label,
19522 role: "option",
19523 className: "dataviews-filters__search-widget-listitem"
19524 }
19525 ),
19526 onClick: () => {
19527 const newFilters = currentFilter ? [
19528 ...(view.filters ?? []).map(
19529 (_filter) => {
19530 if (_filter.field === filter.field) {
19531 return {
19532 ..._filter,
19533 operator: currentFilter.operator || filter.operators[0],
19534 value: getNewValue(
19535 filter,
19536 currentFilter,
19537 element.value
19538 )
19539 };
19540 }
19541 return _filter;
19542 }
19543 )
19544 ] : [
19545 ...view.filters ?? [],
19546 {
19547 field: filter.field,
19548 operator: filter.operators[0],
19549 value: getNewValue(
19550 filter,
19551 currentFilter,
19552 element.value
19553 )
19554 }
19555 ];
19556 onChangeView({
19557 ...view,
19558 page: 1,
19559 filters: newFilters
19560 });
19561 }
19562 }
19563 ),
19564 children: [
19565 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19566 SingleSelectionOption,
19567 {
19568 selected: currentValue === element.value
19569 }
19570 ),
19571 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19572 MultiSelectionOption,
19573 {
19574 selected: currentValue.includes(element.value)
19575 }
19576 ),
19577 /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19578 "span",
19579 {
19580 className: "dataviews-filters__search-widget-listitem-value",
19581 title: element.label,
19582 children: element.label
19583 }
19584 )
19585 ]
19586 },
19587 element.value
19588 ))
19589 }
19590 );
19591 }
19592 function ComboboxList22({ view, filter, onChangeView }) {
19593 const [searchValue, setSearchValue] = (0, import_element51.useState)("");
19594 const deferredSearchValue = (0, import_element51.useDeferredValue)(searchValue);
19595 const currentFilter = view.filters?.find(
19596 (_filter) => _filter.field === filter.field
19597 );
19598 const currentValue = getCurrentValue(filter, currentFilter);
19599 const matches = (0, import_element51.useMemo)(() => {
19600 const normalizedSearch = normalizeSearchInput(deferredSearchValue);
19601 return filter.elements.filter(
19602 (item) => normalizeSearchInput(item.label).includes(normalizedSearch)
19603 );
19604 }, [filter.elements, deferredSearchValue]);
19605 return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
19606 ComboboxProvider,
19607 {
19608 selectedValue: currentValue,
19609 setSelectedValue: (value) => {
19610 const newFilters = currentFilter ? [
19611 ...(view.filters ?? []).map((_filter) => {
19612 if (_filter.field === filter.field) {
19613 return {
19614 ..._filter,
19615 operator: currentFilter.operator || filter.operators[0],
19616 value
19617 };
19618 }
19619 return _filter;
19620 })
19621 ] : [
19622 ...view.filters ?? [],
19623 {
19624 field: filter.field,
19625 operator: filter.operators[0],
19626 value
19627 }
19628 ];
19629 onChangeView({
19630 ...view,
19631 page: 1,
19632 filters: newFilters
19633 });
19634 },
19635 setValue: setSearchValue,
19636 children: [
19637 /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)("div", { className: "dataviews-filters__search-widget-filter-combobox__wrapper", children: [
19638 /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(VisuallyHidden, { render: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ComboboxLabel, {}), children: (0, import_i18n24.__)("Search items") }),
19639 /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19640 Combobox,
19641 {
19642 autoSelect: "always",
19643 placeholder: (0, import_i18n24.__)("Search"),
19644 className: "dataviews-filters__search-widget-filter-combobox__input"
19645 }
19646 ),
19647 /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "dataviews-filters__search-widget-filter-combobox__icon", children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_components19.Icon, { icon: search_default }) })
19648 ] }),
19649 /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
19650 ComboboxList,
19651 {
19652 className: "dataviews-filters__search-widget-filter-combobox-list",
19653 alwaysVisible: true,
19654 children: [
19655 matches.map((element) => {
19656 return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
19657 ComboboxItem,
19658 {
19659 resetValueOnSelect: false,
19660 value: element.value,
19661 className: "dataviews-filters__search-widget-listitem",
19662 hideOnClick: false,
19663 setValueOnClick: false,
19664 focusOnHover: true,
19665 children: [
19666 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19667 SingleSelectionOption,
19668 {
19669 selected: currentValue === element.value
19670 }
19671 ),
19672 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19673 MultiSelectionOption,
19674 {
19675 selected: currentValue.includes(
19676 element.value
19677 )
19678 }
19679 ),
19680 /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
19681 "span",
19682 {
19683 className: "dataviews-filters__search-widget-listitem-value",
19684 title: element.label,
19685 children: [
19686 /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
19687 ComboboxItemValue,
19688 {
19689 className: "dataviews-filters__search-widget-filter-combobox-item-value",
19690 value: element.label
19691 }
19692 ),
19693 !!element.description && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { className: "dataviews-filters__search-widget-listitem-description", children: element.description })
19694 ]
19695 }
19696 )
19697 ]
19698 },
19699 element.value
19700 );
19701 }),
19702 !matches.length && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("p", { children: (0, import_i18n24.__)("No results found") })
19703 ]
19704 }
19705 )
19706 ]
19707 }
19708 );
19709 }
19710 function SearchWidget(props) {
19711 const { elements, isLoading } = useElements({
19712 elements: props.filter.elements,
19713 getElements: props.filter.getElements
19714 });
19715 if (isLoading) {
19716 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_components19.Spinner, {}) });
19717 }
19718 if (elements.length === 0) {
19719 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: (0, import_i18n24.__)("No elements found") });
19720 }
19721 const Widget = elements.length > 10 ? ComboboxList22 : ListBox;
19722 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Widget, { ...props, filter: { ...props.filter, elements } });
19723 }
19724
19725 // packages/dataviews/build-module/components/dataviews-filters/input-widget.mjs
19726 var import_es6 = __toESM(require_es6(), 1);
19727 var import_compose9 = __toESM(require_compose(), 1);
19728 var import_element52 = __toESM(require_element(), 1);
19729 var import_components20 = __toESM(require_components(), 1);
19730 var import_jsx_runtime82 = __toESM(require_jsx_runtime(), 1);
19731 function InputWidget({
19732 filter,
19733 view,
19734 onChangeView,
19735 fields
19736 }) {
19737 const currentFilter = view.filters?.find(
19738 (f2) => f2.field === filter.field
19739 );
19740 const currentValue = getCurrentValue(filter, currentFilter);
19741 const field = (0, import_element52.useMemo)(() => {
19742 const currentField = fields.find((f2) => f2.id === filter.field);
19743 if (currentField) {
19744 return {
19745 ...currentField,
19746 // Deactivate validation for filters.
19747 isValid: {},
19748 // Filter controls are always enabled.
19749 isDisabled: () => false,
19750 // Filter controls are always visible.
19751 isVisible: () => true,
19752 // Configure getValue/setValue as if Item was a plain object.
19753 getValue: ({ item }) => item[currentField.id],
19754 setValue: ({ value }) => ({
19755 [currentField.id]: value
19756 })
19757 };
19758 }
19759 return currentField;
19760 }, [fields, filter.field]);
19761 const data = (0, import_element52.useMemo)(() => {
19762 return (view.filters ?? []).reduce(
19763 (acc, activeFilter) => {
19764 acc[activeFilter.field] = activeFilter.value;
19765 return acc;
19766 },
19767 {}
19768 );
19769 }, [view.filters]);
19770 const handleChange = (0, import_compose9.useEvent)((updatedData) => {
19771 if (!field || !currentFilter) {
19772 return;
19773 }
19774 const nextValue = field.getValue({ item: updatedData });
19775 if ((0, import_es6.default)(nextValue, currentValue)) {
19776 return;
19777 }
19778 onChangeView({
19779 ...view,
19780 filters: (view.filters ?? []).map(
19781 (_filter) => _filter.field === filter.field ? {
19782 ..._filter,
19783 operator: currentFilter.operator || filter.operators[0],
19784 // Consider empty strings as undefined:
19785 //
19786 // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records
19787 // - empty string as value means "search empty string": returns only the records that have an empty string as value
19788 //
19789 // In practice, this means the filter will not be able to find an empty string as the value.
19790 value: nextValue === "" ? void 0 : nextValue
19791 } : _filter
19792 )
19793 });
19794 });
19795 if (!field || !field.Edit || !currentFilter) {
19796 return null;
19797 }
19798 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
19799 import_components20.Flex,
19800 {
19801 className: "dataviews-filters__user-input-widget",
19802 gap: 2.5,
19803 direction: "column",
19804 children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
19805 field.Edit,
19806 {
19807 hideLabelFromVision: true,
19808 data,
19809 field,
19810 operator: currentFilter.operator,
19811 onChange: handleChange
19812 }
19813 )
19814 }
19815 );
19816 }
19817
19818 // node_modules/date-fns/constants.js
19819 var daysInYear = 365.2425;
19820 var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3;
19821 var minTime = -maxTime;
19822 var millisecondsInWeek = 6048e5;
19823 var millisecondsInDay = 864e5;
19824 var secondsInHour = 3600;
19825 var secondsInDay = secondsInHour * 24;
19826 var secondsInWeek = secondsInDay * 7;
19827 var secondsInYear = secondsInDay * daysInYear;
19828 var secondsInMonth = secondsInYear / 12;
19829 var secondsInQuarter = secondsInMonth * 3;
19830 var constructFromSymbol = /* @__PURE__ */ Symbol.for("constructDateFrom");
19831
19832 // node_modules/date-fns/constructFrom.js
19833 function constructFrom(date, value) {
19834 if (typeof date === "function") return date(value);
19835 if (date && typeof date === "object" && constructFromSymbol in date)
19836 return date[constructFromSymbol](value);
19837 if (date instanceof Date) return new date.constructor(value);
19838 return new Date(value);
19839 }
19840
19841 // node_modules/date-fns/toDate.js
19842 function toDate(argument, context) {
19843 return constructFrom(context || argument, argument);
19844 }
19845
19846 // node_modules/date-fns/addDays.js
19847 function addDays(date, amount, options) {
19848 const _date = toDate(date, options?.in);
19849 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
19850 if (!amount) return _date;
19851 _date.setDate(_date.getDate() + amount);
19852 return _date;
19853 }
19854
19855 // node_modules/date-fns/addMonths.js
19856 function addMonths(date, amount, options) {
19857 const _date = toDate(date, options?.in);
19858 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
19859 if (!amount) {
19860 return _date;
19861 }
19862 const dayOfMonth = _date.getDate();
19863 const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());
19864 endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
19865 const daysInMonth = endOfDesiredMonth.getDate();
19866 if (dayOfMonth >= daysInMonth) {
19867 return endOfDesiredMonth;
19868 } else {
19869 _date.setFullYear(
19870 endOfDesiredMonth.getFullYear(),
19871 endOfDesiredMonth.getMonth(),
19872 dayOfMonth
19873 );
19874 return _date;
19875 }
19876 }
19877
19878 // node_modules/date-fns/_lib/defaultOptions.js
19879 var defaultOptions = {};
19880 function getDefaultOptions() {
19881 return defaultOptions;
19882 }
19883
19884 // node_modules/date-fns/startOfWeek.js
19885 function startOfWeek(date, options) {
19886 const defaultOptions2 = getDefaultOptions();
19887 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
19888 const _date = toDate(date, options?.in);
19889 const day = _date.getDay();
19890 const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
19891 _date.setDate(_date.getDate() - diff);
19892 _date.setHours(0, 0, 0, 0);
19893 return _date;
19894 }
19895
19896 // node_modules/date-fns/startOfISOWeek.js
19897 function startOfISOWeek(date, options) {
19898 return startOfWeek(date, { ...options, weekStartsOn: 1 });
19899 }
19900
19901 // node_modules/date-fns/getISOWeekYear.js
19902 function getISOWeekYear(date, options) {
19903 const _date = toDate(date, options?.in);
19904 const year = _date.getFullYear();
19905 const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);
19906 fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
19907 fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
19908 const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
19909 const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);
19910 fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
19911 fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
19912 const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
19913 if (_date.getTime() >= startOfNextYear.getTime()) {
19914 return year + 1;
19915 } else if (_date.getTime() >= startOfThisYear.getTime()) {
19916 return year;
19917 } else {
19918 return year - 1;
19919 }
19920 }
19921
19922 // node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js
19923 function getTimezoneOffsetInMilliseconds(date) {
19924 const _date = toDate(date);
19925 const utcDate = new Date(
19926 Date.UTC(
19927 _date.getFullYear(),
19928 _date.getMonth(),
19929 _date.getDate(),
19930 _date.getHours(),
19931 _date.getMinutes(),
19932 _date.getSeconds(),
19933 _date.getMilliseconds()
19934 )
19935 );
19936 utcDate.setUTCFullYear(_date.getFullYear());
19937 return +date - +utcDate;
19938 }
19939
19940 // node_modules/date-fns/_lib/normalizeDates.js
19941 function normalizeDates(context, ...dates) {
19942 const normalize = constructFrom.bind(
19943 null,
19944 context || dates.find((date) => typeof date === "object")
19945 );
19946 return dates.map(normalize);
19947 }
19948
19949 // node_modules/date-fns/startOfDay.js
19950 function startOfDay(date, options) {
19951 const _date = toDate(date, options?.in);
19952 _date.setHours(0, 0, 0, 0);
19953 return _date;
19954 }
19955
19956 // node_modules/date-fns/differenceInCalendarDays.js
19957 function differenceInCalendarDays(laterDate, earlierDate, options) {
19958 const [laterDate_, earlierDate_] = normalizeDates(
19959 options?.in,
19960 laterDate,
19961 earlierDate
19962 );
19963 const laterStartOfDay = startOfDay(laterDate_);
19964 const earlierStartOfDay = startOfDay(earlierDate_);
19965 const laterTimestamp = +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);
19966 const earlierTimestamp = +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);
19967 return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);
19968 }
19969
19970 // node_modules/date-fns/startOfISOWeekYear.js
19971 function startOfISOWeekYear(date, options) {
19972 const year = getISOWeekYear(date, options);
19973 const fourthOfJanuary = constructFrom(options?.in || date, 0);
19974 fourthOfJanuary.setFullYear(year, 0, 4);
19975 fourthOfJanuary.setHours(0, 0, 0, 0);
19976 return startOfISOWeek(fourthOfJanuary);
19977 }
19978
19979 // node_modules/date-fns/addWeeks.js
19980 function addWeeks(date, amount, options) {
19981 return addDays(date, amount * 7, options);
19982 }
19983
19984 // node_modules/date-fns/addYears.js
19985 function addYears(date, amount, options) {
19986 return addMonths(date, amount * 12, options);
19987 }
19988
19989 // node_modules/date-fns/isDate.js
19990 function isDate(value) {
19991 return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
19992 }
19993
19994 // node_modules/date-fns/isValid.js
19995 function isValid(date) {
19996 return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date)));
19997 }
19998
19999 // node_modules/date-fns/startOfMonth.js
20000 function startOfMonth(date, options) {
20001 const _date = toDate(date, options?.in);
20002 _date.setDate(1);
20003 _date.setHours(0, 0, 0, 0);
20004 return _date;
20005 }
20006
20007 // node_modules/date-fns/startOfYear.js
20008 function startOfYear(date, options) {
20009 const date_ = toDate(date, options?.in);
20010 date_.setFullYear(date_.getFullYear(), 0, 1);
20011 date_.setHours(0, 0, 0, 0);
20012 return date_;
20013 }
20014
20015 // node_modules/date-fns/locale/en-US/_lib/formatDistance.js
20016 var formatDistanceLocale = {
20017 lessThanXSeconds: {
20018 one: "less than a second",
20019 other: "less than {{count}} seconds"
20020 },
20021 xSeconds: {
20022 one: "1 second",
20023 other: "{{count}} seconds"
20024 },
20025 halfAMinute: "half a minute",
20026 lessThanXMinutes: {
20027 one: "less than a minute",
20028 other: "less than {{count}} minutes"
20029 },
20030 xMinutes: {
20031 one: "1 minute",
20032 other: "{{count}} minutes"
20033 },
20034 aboutXHours: {
20035 one: "about 1 hour",
20036 other: "about {{count}} hours"
20037 },
20038 xHours: {
20039 one: "1 hour",
20040 other: "{{count}} hours"
20041 },
20042 xDays: {
20043 one: "1 day",
20044 other: "{{count}} days"
20045 },
20046 aboutXWeeks: {
20047 one: "about 1 week",
20048 other: "about {{count}} weeks"
20049 },
20050 xWeeks: {
20051 one: "1 week",
20052 other: "{{count}} weeks"
20053 },
20054 aboutXMonths: {
20055 one: "about 1 month",
20056 other: "about {{count}} months"
20057 },
20058 xMonths: {
20059 one: "1 month",
20060 other: "{{count}} months"
20061 },
20062 aboutXYears: {
20063 one: "about 1 year",
20064 other: "about {{count}} years"
20065 },
20066 xYears: {
20067 one: "1 year",
20068 other: "{{count}} years"
20069 },
20070 overXYears: {
20071 one: "over 1 year",
20072 other: "over {{count}} years"
20073 },
20074 almostXYears: {
20075 one: "almost 1 year",
20076 other: "almost {{count}} years"
20077 }
20078 };
20079 var formatDistance = (token, count, options) => {
20080 let result;
20081 const tokenValue = formatDistanceLocale[token];
20082 if (typeof tokenValue === "string") {
20083 result = tokenValue;
20084 } else if (count === 1) {
20085 result = tokenValue.one;
20086 } else {
20087 result = tokenValue.other.replace("{{count}}", count.toString());
20088 }
20089 if (options?.addSuffix) {
20090 if (options.comparison && options.comparison > 0) {
20091 return "in " + result;
20092 } else {
20093 return result + " ago";
20094 }
20095 }
20096 return result;
20097 };
20098
20099 // node_modules/date-fns/locale/_lib/buildFormatLongFn.js
20100 function buildFormatLongFn(args) {
20101 return (options = {}) => {
20102 const width = options.width ? String(options.width) : args.defaultWidth;
20103 const format7 = args.formats[width] || args.formats[args.defaultWidth];
20104 return format7;
20105 };
20106 }
20107
20108 // node_modules/date-fns/locale/en-US/_lib/formatLong.js
20109 var dateFormats = {
20110 full: "EEEE, MMMM do, y",
20111 long: "MMMM do, y",
20112 medium: "MMM d, y",
20113 short: "MM/dd/yyyy"
20114 };
20115 var timeFormats = {
20116 full: "h:mm:ss a zzzz",
20117 long: "h:mm:ss a z",
20118 medium: "h:mm:ss a",
20119 short: "h:mm a"
20120 };
20121 var dateTimeFormats = {
20122 full: "{{date}} 'at' {{time}}",
20123 long: "{{date}} 'at' {{time}}",
20124 medium: "{{date}}, {{time}}",
20125 short: "{{date}}, {{time}}"
20126 };
20127 var formatLong = {
20128 date: buildFormatLongFn({
20129 formats: dateFormats,
20130 defaultWidth: "full"
20131 }),
20132 time: buildFormatLongFn({
20133 formats: timeFormats,
20134 defaultWidth: "full"
20135 }),
20136 dateTime: buildFormatLongFn({
20137 formats: dateTimeFormats,
20138 defaultWidth: "full"
20139 })
20140 };
20141
20142 // node_modules/date-fns/locale/en-US/_lib/formatRelative.js
20143 var formatRelativeLocale = {
20144 lastWeek: "'last' eeee 'at' p",
20145 yesterday: "'yesterday at' p",
20146 today: "'today at' p",
20147 tomorrow: "'tomorrow at' p",
20148 nextWeek: "eeee 'at' p",
20149 other: "P"
20150 };
20151 var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
20152
20153 // node_modules/date-fns/locale/_lib/buildLocalizeFn.js
20154 function buildLocalizeFn(args) {
20155 return (value, options) => {
20156 const context = options?.context ? String(options.context) : "standalone";
20157 let valuesArray;
20158 if (context === "formatting" && args.formattingValues) {
20159 const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
20160 const width = options?.width ? String(options.width) : defaultWidth;
20161 valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
20162 } else {
20163 const defaultWidth = args.defaultWidth;
20164 const width = options?.width ? String(options.width) : args.defaultWidth;
20165 valuesArray = args.values[width] || args.values[defaultWidth];
20166 }
20167 const index2 = args.argumentCallback ? args.argumentCallback(value) : value;
20168 return valuesArray[index2];
20169 };
20170 }
20171
20172 // node_modules/date-fns/locale/en-US/_lib/localize.js
20173 var eraValues = {
20174 narrow: ["B", "A"],
20175 abbreviated: ["BC", "AD"],
20176 wide: ["Before Christ", "Anno Domini"]
20177 };
20178 var quarterValues = {
20179 narrow: ["1", "2", "3", "4"],
20180 abbreviated: ["Q1", "Q2", "Q3", "Q4"],
20181 wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
20182 };
20183 var monthValues = {
20184 narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
20185 abbreviated: [
20186 "Jan",
20187 "Feb",
20188 "Mar",
20189 "Apr",
20190 "May",
20191 "Jun",
20192 "Jul",
20193 "Aug",
20194 "Sep",
20195 "Oct",
20196 "Nov",
20197 "Dec"
20198 ],
20199 wide: [
20200 "January",
20201 "February",
20202 "March",
20203 "April",
20204 "May",
20205 "June",
20206 "July",
20207 "August",
20208 "September",
20209 "October",
20210 "November",
20211 "December"
20212 ]
20213 };
20214 var dayValues = {
20215 narrow: ["S", "M", "T", "W", "T", "F", "S"],
20216 short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
20217 abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
20218 wide: [
20219 "Sunday",
20220 "Monday",
20221 "Tuesday",
20222 "Wednesday",
20223 "Thursday",
20224 "Friday",
20225 "Saturday"
20226 ]
20227 };
20228 var dayPeriodValues = {
20229 narrow: {
20230 am: "a",
20231 pm: "p",
20232 midnight: "mi",
20233 noon: "n",
20234 morning: "morning",
20235 afternoon: "afternoon",
20236 evening: "evening",
20237 night: "night"
20238 },
20239 abbreviated: {
20240 am: "AM",
20241 pm: "PM",
20242 midnight: "midnight",
20243 noon: "noon",
20244 morning: "morning",
20245 afternoon: "afternoon",
20246 evening: "evening",
20247 night: "night"
20248 },
20249 wide: {
20250 am: "a.m.",
20251 pm: "p.m.",
20252 midnight: "midnight",
20253 noon: "noon",
20254 morning: "morning",
20255 afternoon: "afternoon",
20256 evening: "evening",
20257 night: "night"
20258 }
20259 };
20260 var formattingDayPeriodValues = {
20261 narrow: {
20262 am: "a",
20263 pm: "p",
20264 midnight: "mi",
20265 noon: "n",
20266 morning: "in the morning",
20267 afternoon: "in the afternoon",
20268 evening: "in the evening",
20269 night: "at night"
20270 },
20271 abbreviated: {
20272 am: "AM",
20273 pm: "PM",
20274 midnight: "midnight",
20275 noon: "noon",
20276 morning: "in the morning",
20277 afternoon: "in the afternoon",
20278 evening: "in the evening",
20279 night: "at night"
20280 },
20281 wide: {
20282 am: "a.m.",
20283 pm: "p.m.",
20284 midnight: "midnight",
20285 noon: "noon",
20286 morning: "in the morning",
20287 afternoon: "in the afternoon",
20288 evening: "in the evening",
20289 night: "at night"
20290 }
20291 };
20292 var ordinalNumber = (dirtyNumber, _options) => {
20293 const number = Number(dirtyNumber);
20294 const rem100 = number % 100;
20295 if (rem100 > 20 || rem100 < 10) {
20296 switch (rem100 % 10) {
20297 case 1:
20298 return number + "st";
20299 case 2:
20300 return number + "nd";
20301 case 3:
20302 return number + "rd";
20303 }
20304 }
20305 return number + "th";
20306 };
20307 var localize = {
20308 ordinalNumber,
20309 era: buildLocalizeFn({
20310 values: eraValues,
20311 defaultWidth: "wide"
20312 }),
20313 quarter: buildLocalizeFn({
20314 values: quarterValues,
20315 defaultWidth: "wide",
20316 argumentCallback: (quarter) => quarter - 1
20317 }),
20318 month: buildLocalizeFn({
20319 values: monthValues,
20320 defaultWidth: "wide"
20321 }),
20322 day: buildLocalizeFn({
20323 values: dayValues,
20324 defaultWidth: "wide"
20325 }),
20326 dayPeriod: buildLocalizeFn({
20327 values: dayPeriodValues,
20328 defaultWidth: "wide",
20329 formattingValues: formattingDayPeriodValues,
20330 defaultFormattingWidth: "wide"
20331 })
20332 };
20333
20334 // node_modules/date-fns/locale/_lib/buildMatchFn.js
20335 function buildMatchFn(args) {
20336 return (string, options = {}) => {
20337 const width = options.width;
20338 const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
20339 const matchResult = string.match(matchPattern);
20340 if (!matchResult) {
20341 return null;
20342 }
20343 const matchedString = matchResult[0];
20344 const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
20345 const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : (
20346 // [TODO] -- I challenge you to fix the type
20347 findKey(parsePatterns, (pattern) => pattern.test(matchedString))
20348 );
20349 let value;
20350 value = args.valueCallback ? args.valueCallback(key) : key;
20351 value = options.valueCallback ? (
20352 // [TODO] -- I challenge you to fix the type
20353 options.valueCallback(value)
20354 ) : value;
20355 const rest = string.slice(matchedString.length);
20356 return { value, rest };
20357 };
20358 }
20359 function findKey(object, predicate) {
20360 for (const key in object) {
20361 if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) {
20362 return key;
20363 }
20364 }
20365 return void 0;
20366 }
20367 function findIndex(array, predicate) {
20368 for (let key = 0; key < array.length; key++) {
20369 if (predicate(array[key])) {
20370 return key;
20371 }
20372 }
20373 return void 0;
20374 }
20375
20376 // node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
20377 function buildMatchPatternFn(args) {
20378 return (string, options = {}) => {
20379 const matchResult = string.match(args.matchPattern);
20380 if (!matchResult) return null;
20381 const matchedString = matchResult[0];
20382 const parseResult = string.match(args.parsePattern);
20383 if (!parseResult) return null;
20384 let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
20385 value = options.valueCallback ? options.valueCallback(value) : value;
20386 const rest = string.slice(matchedString.length);
20387 return { value, rest };
20388 };
20389 }
20390
20391 // node_modules/date-fns/locale/en-US/_lib/match.js
20392 var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
20393 var parseOrdinalNumberPattern = /\d+/i;
20394 var matchEraPatterns = {
20395 narrow: /^(b|a)/i,
20396 abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
20397 wide: /^(before christ|before common era|anno domini|common era)/i
20398 };
20399 var parseEraPatterns = {
20400 any: [/^b/i, /^(a|c)/i]
20401 };
20402 var matchQuarterPatterns = {
20403 narrow: /^[1234]/i,
20404 abbreviated: /^q[1234]/i,
20405 wide: /^[1234](th|st|nd|rd)? quarter/i
20406 };
20407 var parseQuarterPatterns = {
20408 any: [/1/i, /2/i, /3/i, /4/i]
20409 };
20410 var matchMonthPatterns = {
20411 narrow: /^[jfmasond]/i,
20412 abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
20413 wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
20414 };
20415 var parseMonthPatterns = {
20416 narrow: [
20417 /^j/i,
20418 /^f/i,
20419 /^m/i,
20420 /^a/i,
20421 /^m/i,
20422 /^j/i,
20423 /^j/i,
20424 /^a/i,
20425 /^s/i,
20426 /^o/i,
20427 /^n/i,
20428 /^d/i
20429 ],
20430 any: [
20431 /^ja/i,
20432 /^f/i,
20433 /^mar/i,
20434 /^ap/i,
20435 /^may/i,
20436 /^jun/i,
20437 /^jul/i,
20438 /^au/i,
20439 /^s/i,
20440 /^o/i,
20441 /^n/i,
20442 /^d/i
20443 ]
20444 };
20445 var matchDayPatterns = {
20446 narrow: /^[smtwf]/i,
20447 short: /^(su|mo|tu|we|th|fr|sa)/i,
20448 abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
20449 wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
20450 };
20451 var parseDayPatterns = {
20452 narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
20453 any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
20454 };
20455 var matchDayPeriodPatterns = {
20456 narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
20457 any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
20458 };
20459 var parseDayPeriodPatterns = {
20460 any: {
20461 am: /^a/i,
20462 pm: /^p/i,
20463 midnight: /^mi/i,
20464 noon: /^no/i,
20465 morning: /morning/i,
20466 afternoon: /afternoon/i,
20467 evening: /evening/i,
20468 night: /night/i
20469 }
20470 };
20471 var match = {
20472 ordinalNumber: buildMatchPatternFn({
20473 matchPattern: matchOrdinalNumberPattern,
20474 parsePattern: parseOrdinalNumberPattern,
20475 valueCallback: (value) => parseInt(value, 10)
20476 }),
20477 era: buildMatchFn({
20478 matchPatterns: matchEraPatterns,
20479 defaultMatchWidth: "wide",
20480 parsePatterns: parseEraPatterns,
20481 defaultParseWidth: "any"
20482 }),
20483 quarter: buildMatchFn({
20484 matchPatterns: matchQuarterPatterns,
20485 defaultMatchWidth: "wide",
20486 parsePatterns: parseQuarterPatterns,
20487 defaultParseWidth: "any",
20488 valueCallback: (index2) => index2 + 1
20489 }),
20490 month: buildMatchFn({
20491 matchPatterns: matchMonthPatterns,
20492 defaultMatchWidth: "wide",
20493 parsePatterns: parseMonthPatterns,
20494 defaultParseWidth: "any"
20495 }),
20496 day: buildMatchFn({
20497 matchPatterns: matchDayPatterns,
20498 defaultMatchWidth: "wide",
20499 parsePatterns: parseDayPatterns,
20500 defaultParseWidth: "any"
20501 }),
20502 dayPeriod: buildMatchFn({
20503 matchPatterns: matchDayPeriodPatterns,
20504 defaultMatchWidth: "any",
20505 parsePatterns: parseDayPeriodPatterns,
20506 defaultParseWidth: "any"
20507 })
20508 };
20509
20510 // node_modules/date-fns/locale/en-US.js
20511 var enUS = {
20512 code: "en-US",
20513 formatDistance,
20514 formatLong,
20515 formatRelative,
20516 localize,
20517 match,
20518 options: {
20519 weekStartsOn: 0,
20520 firstWeekContainsDate: 1
20521 }
20522 };
20523
20524 // node_modules/date-fns/getDayOfYear.js
20525 function getDayOfYear(date, options) {
20526 const _date = toDate(date, options?.in);
20527 const diff = differenceInCalendarDays(_date, startOfYear(_date));
20528 const dayOfYear = diff + 1;
20529 return dayOfYear;
20530 }
20531
20532 // node_modules/date-fns/getISOWeek.js
20533 function getISOWeek(date, options) {
20534 const _date = toDate(date, options?.in);
20535 const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
20536 return Math.round(diff / millisecondsInWeek) + 1;
20537 }
20538
20539 // node_modules/date-fns/getWeekYear.js
20540 function getWeekYear(date, options) {
20541 const _date = toDate(date, options?.in);
20542 const year = _date.getFullYear();
20543 const defaultOptions2 = getDefaultOptions();
20544 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
20545 const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
20546 firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
20547 firstWeekOfNextYear.setHours(0, 0, 0, 0);
20548 const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
20549 const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
20550 firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
20551 firstWeekOfThisYear.setHours(0, 0, 0, 0);
20552 const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
20553 if (+_date >= +startOfNextYear) {
20554 return year + 1;
20555 } else if (+_date >= +startOfThisYear) {
20556 return year;
20557 } else {
20558 return year - 1;
20559 }
20560 }
20561
20562 // node_modules/date-fns/startOfWeekYear.js
20563 function startOfWeekYear(date, options) {
20564 const defaultOptions2 = getDefaultOptions();
20565 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
20566 const year = getWeekYear(date, options);
20567 const firstWeek = constructFrom(options?.in || date, 0);
20568 firstWeek.setFullYear(year, 0, firstWeekContainsDate);
20569 firstWeek.setHours(0, 0, 0, 0);
20570 const _date = startOfWeek(firstWeek, options);
20571 return _date;
20572 }
20573
20574 // node_modules/date-fns/getWeek.js
20575 function getWeek(date, options) {
20576 const _date = toDate(date, options?.in);
20577 const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
20578 return Math.round(diff / millisecondsInWeek) + 1;
20579 }
20580
20581 // node_modules/date-fns/_lib/addLeadingZeros.js
20582 function addLeadingZeros(number, targetLength) {
20583 const sign = number < 0 ? "-" : "";
20584 const output = Math.abs(number).toString().padStart(targetLength, "0");
20585 return sign + output;
20586 }
20587
20588 // node_modules/date-fns/_lib/format/lightFormatters.js
20589 var lightFormatters = {
20590 // Year
20591 y(date, token) {
20592 const signedYear = date.getFullYear();
20593 const year = signedYear > 0 ? signedYear : 1 - signedYear;
20594 return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
20595 },
20596 // Month
20597 M(date, token) {
20598 const month = date.getMonth();
20599 return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
20600 },
20601 // Day of the month
20602 d(date, token) {
20603 return addLeadingZeros(date.getDate(), token.length);
20604 },
20605 // AM or PM
20606 a(date, token) {
20607 const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
20608 switch (token) {
20609 case "a":
20610 case "aa":
20611 return dayPeriodEnumValue.toUpperCase();
20612 case "aaa":
20613 return dayPeriodEnumValue;
20614 case "aaaaa":
20615 return dayPeriodEnumValue[0];
20616 case "aaaa":
20617 default:
20618 return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
20619 }
20620 },
20621 // Hour [1-12]
20622 h(date, token) {
20623 return addLeadingZeros(date.getHours() % 12 || 12, token.length);
20624 },
20625 // Hour [0-23]
20626 H(date, token) {
20627 return addLeadingZeros(date.getHours(), token.length);
20628 },
20629 // Minute
20630 m(date, token) {
20631 return addLeadingZeros(date.getMinutes(), token.length);
20632 },
20633 // Second
20634 s(date, token) {
20635 return addLeadingZeros(date.getSeconds(), token.length);
20636 },
20637 // Fraction of second
20638 S(date, token) {
20639 const numberOfDigits = token.length;
20640 const milliseconds = date.getMilliseconds();
20641 const fractionalSeconds = Math.trunc(
20642 milliseconds * Math.pow(10, numberOfDigits - 3)
20643 );
20644 return addLeadingZeros(fractionalSeconds, token.length);
20645 }
20646 };
20647
20648 // node_modules/date-fns/_lib/format/formatters.js
20649 var dayPeriodEnum = {
20650 am: "am",
20651 pm: "pm",
20652 midnight: "midnight",
20653 noon: "noon",
20654 morning: "morning",
20655 afternoon: "afternoon",
20656 evening: "evening",
20657 night: "night"
20658 };
20659 var formatters = {
20660 // Era
20661 G: function(date, token, localize2) {
20662 const era = date.getFullYear() > 0 ? 1 : 0;
20663 switch (token) {
20664 // AD, BC
20665 case "G":
20666 case "GG":
20667 case "GGG":
20668 return localize2.era(era, { width: "abbreviated" });
20669 // A, B
20670 case "GGGGG":
20671 return localize2.era(era, { width: "narrow" });
20672 // Anno Domini, Before Christ
20673 case "GGGG":
20674 default:
20675 return localize2.era(era, { width: "wide" });
20676 }
20677 },
20678 // Year
20679 y: function(date, token, localize2) {
20680 if (token === "yo") {
20681 const signedYear = date.getFullYear();
20682 const year = signedYear > 0 ? signedYear : 1 - signedYear;
20683 return localize2.ordinalNumber(year, { unit: "year" });
20684 }
20685 return lightFormatters.y(date, token);
20686 },
20687 // Local week-numbering year
20688 Y: function(date, token, localize2, options) {
20689 const signedWeekYear = getWeekYear(date, options);
20690 const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
20691 if (token === "YY") {
20692 const twoDigitYear = weekYear % 100;
20693 return addLeadingZeros(twoDigitYear, 2);
20694 }
20695 if (token === "Yo") {
20696 return localize2.ordinalNumber(weekYear, { unit: "year" });
20697 }
20698 return addLeadingZeros(weekYear, token.length);
20699 },
20700 // ISO week-numbering year
20701 R: function(date, token) {
20702 const isoWeekYear = getISOWeekYear(date);
20703 return addLeadingZeros(isoWeekYear, token.length);
20704 },
20705 // Extended year. This is a single number designating the year of this calendar system.
20706 // The main difference between `y` and `u` localizers are B.C. years:
20707 // | Year | `y` | `u` |
20708 // |------|-----|-----|
20709 // | AC 1 | 1 | 1 |
20710 // | BC 1 | 1 | 0 |
20711 // | BC 2 | 2 | -1 |
20712 // Also `yy` always returns the last two digits of a year,
20713 // while `uu` pads single digit years to 2 characters and returns other years unchanged.
20714 u: function(date, token) {
20715 const year = date.getFullYear();
20716 return addLeadingZeros(year, token.length);
20717 },
20718 // Quarter
20719 Q: function(date, token, localize2) {
20720 const quarter = Math.ceil((date.getMonth() + 1) / 3);
20721 switch (token) {
20722 // 1, 2, 3, 4
20723 case "Q":
20724 return String(quarter);
20725 // 01, 02, 03, 04
20726 case "QQ":
20727 return addLeadingZeros(quarter, 2);
20728 // 1st, 2nd, 3rd, 4th
20729 case "Qo":
20730 return localize2.ordinalNumber(quarter, { unit: "quarter" });
20731 // Q1, Q2, Q3, Q4
20732 case "QQQ":
20733 return localize2.quarter(quarter, {
20734 width: "abbreviated",
20735 context: "formatting"
20736 });
20737 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
20738 case "QQQQQ":
20739 return localize2.quarter(quarter, {
20740 width: "narrow",
20741 context: "formatting"
20742 });
20743 // 1st quarter, 2nd quarter, ...
20744 case "QQQQ":
20745 default:
20746 return localize2.quarter(quarter, {
20747 width: "wide",
20748 context: "formatting"
20749 });
20750 }
20751 },
20752 // Stand-alone quarter
20753 q: function(date, token, localize2) {
20754 const quarter = Math.ceil((date.getMonth() + 1) / 3);
20755 switch (token) {
20756 // 1, 2, 3, 4
20757 case "q":
20758 return String(quarter);
20759 // 01, 02, 03, 04
20760 case "qq":
20761 return addLeadingZeros(quarter, 2);
20762 // 1st, 2nd, 3rd, 4th
20763 case "qo":
20764 return localize2.ordinalNumber(quarter, { unit: "quarter" });
20765 // Q1, Q2, Q3, Q4
20766 case "qqq":
20767 return localize2.quarter(quarter, {
20768 width: "abbreviated",
20769 context: "standalone"
20770 });
20771 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
20772 case "qqqqq":
20773 return localize2.quarter(quarter, {
20774 width: "narrow",
20775 context: "standalone"
20776 });
20777 // 1st quarter, 2nd quarter, ...
20778 case "qqqq":
20779 default:
20780 return localize2.quarter(quarter, {
20781 width: "wide",
20782 context: "standalone"
20783 });
20784 }
20785 },
20786 // Month
20787 M: function(date, token, localize2) {
20788 const month = date.getMonth();
20789 switch (token) {
20790 case "M":
20791 case "MM":
20792 return lightFormatters.M(date, token);
20793 // 1st, 2nd, ..., 12th
20794 case "Mo":
20795 return localize2.ordinalNumber(month + 1, { unit: "month" });
20796 // Jan, Feb, ..., Dec
20797 case "MMM":
20798 return localize2.month(month, {
20799 width: "abbreviated",
20800 context: "formatting"
20801 });
20802 // J, F, ..., D
20803 case "MMMMM":
20804 return localize2.month(month, {
20805 width: "narrow",
20806 context: "formatting"
20807 });
20808 // January, February, ..., December
20809 case "MMMM":
20810 default:
20811 return localize2.month(month, { width: "wide", context: "formatting" });
20812 }
20813 },
20814 // Stand-alone month
20815 L: function(date, token, localize2) {
20816 const month = date.getMonth();
20817 switch (token) {
20818 // 1, 2, ..., 12
20819 case "L":
20820 return String(month + 1);
20821 // 01, 02, ..., 12
20822 case "LL":
20823 return addLeadingZeros(month + 1, 2);
20824 // 1st, 2nd, ..., 12th
20825 case "Lo":
20826 return localize2.ordinalNumber(month + 1, { unit: "month" });
20827 // Jan, Feb, ..., Dec
20828 case "LLL":
20829 return localize2.month(month, {
20830 width: "abbreviated",
20831 context: "standalone"
20832 });
20833 // J, F, ..., D
20834 case "LLLLL":
20835 return localize2.month(month, {
20836 width: "narrow",
20837 context: "standalone"
20838 });
20839 // January, February, ..., December
20840 case "LLLL":
20841 default:
20842 return localize2.month(month, { width: "wide", context: "standalone" });
20843 }
20844 },
20845 // Local week of year
20846 w: function(date, token, localize2, options) {
20847 const week = getWeek(date, options);
20848 if (token === "wo") {
20849 return localize2.ordinalNumber(week, { unit: "week" });
20850 }
20851 return addLeadingZeros(week, token.length);
20852 },
20853 // ISO week of year
20854 I: function(date, token, localize2) {
20855 const isoWeek = getISOWeek(date);
20856 if (token === "Io") {
20857 return localize2.ordinalNumber(isoWeek, { unit: "week" });
20858 }
20859 return addLeadingZeros(isoWeek, token.length);
20860 },
20861 // Day of the month
20862 d: function(date, token, localize2) {
20863 if (token === "do") {
20864 return localize2.ordinalNumber(date.getDate(), { unit: "date" });
20865 }
20866 return lightFormatters.d(date, token);
20867 },
20868 // Day of year
20869 D: function(date, token, localize2) {
20870 const dayOfYear = getDayOfYear(date);
20871 if (token === "Do") {
20872 return localize2.ordinalNumber(dayOfYear, { unit: "dayOfYear" });
20873 }
20874 return addLeadingZeros(dayOfYear, token.length);
20875 },
20876 // Day of week
20877 E: function(date, token, localize2) {
20878 const dayOfWeek = date.getDay();
20879 switch (token) {
20880 // Tue
20881 case "E":
20882 case "EE":
20883 case "EEE":
20884 return localize2.day(dayOfWeek, {
20885 width: "abbreviated",
20886 context: "formatting"
20887 });
20888 // T
20889 case "EEEEE":
20890 return localize2.day(dayOfWeek, {
20891 width: "narrow",
20892 context: "formatting"
20893 });
20894 // Tu
20895 case "EEEEEE":
20896 return localize2.day(dayOfWeek, {
20897 width: "short",
20898 context: "formatting"
20899 });
20900 // Tuesday
20901 case "EEEE":
20902 default:
20903 return localize2.day(dayOfWeek, {
20904 width: "wide",
20905 context: "formatting"
20906 });
20907 }
20908 },
20909 // Local day of week
20910 e: function(date, token, localize2, options) {
20911 const dayOfWeek = date.getDay();
20912 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
20913 switch (token) {
20914 // Numerical value (Nth day of week with current locale or weekStartsOn)
20915 case "e":
20916 return String(localDayOfWeek);
20917 // Padded numerical value
20918 case "ee":
20919 return addLeadingZeros(localDayOfWeek, 2);
20920 // 1st, 2nd, ..., 7th
20921 case "eo":
20922 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
20923 case "eee":
20924 return localize2.day(dayOfWeek, {
20925 width: "abbreviated",
20926 context: "formatting"
20927 });
20928 // T
20929 case "eeeee":
20930 return localize2.day(dayOfWeek, {
20931 width: "narrow",
20932 context: "formatting"
20933 });
20934 // Tu
20935 case "eeeeee":
20936 return localize2.day(dayOfWeek, {
20937 width: "short",
20938 context: "formatting"
20939 });
20940 // Tuesday
20941 case "eeee":
20942 default:
20943 return localize2.day(dayOfWeek, {
20944 width: "wide",
20945 context: "formatting"
20946 });
20947 }
20948 },
20949 // Stand-alone local day of week
20950 c: function(date, token, localize2, options) {
20951 const dayOfWeek = date.getDay();
20952 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
20953 switch (token) {
20954 // Numerical value (same as in `e`)
20955 case "c":
20956 return String(localDayOfWeek);
20957 // Padded numerical value
20958 case "cc":
20959 return addLeadingZeros(localDayOfWeek, token.length);
20960 // 1st, 2nd, ..., 7th
20961 case "co":
20962 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
20963 case "ccc":
20964 return localize2.day(dayOfWeek, {
20965 width: "abbreviated",
20966 context: "standalone"
20967 });
20968 // T
20969 case "ccccc":
20970 return localize2.day(dayOfWeek, {
20971 width: "narrow",
20972 context: "standalone"
20973 });
20974 // Tu
20975 case "cccccc":
20976 return localize2.day(dayOfWeek, {
20977 width: "short",
20978 context: "standalone"
20979 });
20980 // Tuesday
20981 case "cccc":
20982 default:
20983 return localize2.day(dayOfWeek, {
20984 width: "wide",
20985 context: "standalone"
20986 });
20987 }
20988 },
20989 // ISO day of week
20990 i: function(date, token, localize2) {
20991 const dayOfWeek = date.getDay();
20992 const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
20993 switch (token) {
20994 // 2
20995 case "i":
20996 return String(isoDayOfWeek);
20997 // 02
20998 case "ii":
20999 return addLeadingZeros(isoDayOfWeek, token.length);
21000 // 2nd
21001 case "io":
21002 return localize2.ordinalNumber(isoDayOfWeek, { unit: "day" });
21003 // Tue
21004 case "iii":
21005 return localize2.day(dayOfWeek, {
21006 width: "abbreviated",
21007 context: "formatting"
21008 });
21009 // T
21010 case "iiiii":
21011 return localize2.day(dayOfWeek, {
21012 width: "narrow",
21013 context: "formatting"
21014 });
21015 // Tu
21016 case "iiiiii":
21017 return localize2.day(dayOfWeek, {
21018 width: "short",
21019 context: "formatting"
21020 });
21021 // Tuesday
21022 case "iiii":
21023 default:
21024 return localize2.day(dayOfWeek, {
21025 width: "wide",
21026 context: "formatting"
21027 });
21028 }
21029 },
21030 // AM or PM
21031 a: function(date, token, localize2) {
21032 const hours = date.getHours();
21033 const dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
21034 switch (token) {
21035 case "a":
21036 case "aa":
21037 return localize2.dayPeriod(dayPeriodEnumValue, {
21038 width: "abbreviated",
21039 context: "formatting"
21040 });
21041 case "aaa":
21042 return localize2.dayPeriod(dayPeriodEnumValue, {
21043 width: "abbreviated",
21044 context: "formatting"
21045 }).toLowerCase();
21046 case "aaaaa":
21047 return localize2.dayPeriod(dayPeriodEnumValue, {
21048 width: "narrow",
21049 context: "formatting"
21050 });
21051 case "aaaa":
21052 default:
21053 return localize2.dayPeriod(dayPeriodEnumValue, {
21054 width: "wide",
21055 context: "formatting"
21056 });
21057 }
21058 },
21059 // AM, PM, midnight, noon
21060 b: function(date, token, localize2) {
21061 const hours = date.getHours();
21062 let dayPeriodEnumValue;
21063 if (hours === 12) {
21064 dayPeriodEnumValue = dayPeriodEnum.noon;
21065 } else if (hours === 0) {
21066 dayPeriodEnumValue = dayPeriodEnum.midnight;
21067 } else {
21068 dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
21069 }
21070 switch (token) {
21071 case "b":
21072 case "bb":
21073 return localize2.dayPeriod(dayPeriodEnumValue, {
21074 width: "abbreviated",
21075 context: "formatting"
21076 });
21077 case "bbb":
21078 return localize2.dayPeriod(dayPeriodEnumValue, {
21079 width: "abbreviated",
21080 context: "formatting"
21081 }).toLowerCase();
21082 case "bbbbb":
21083 return localize2.dayPeriod(dayPeriodEnumValue, {
21084 width: "narrow",
21085 context: "formatting"
21086 });
21087 case "bbbb":
21088 default:
21089 return localize2.dayPeriod(dayPeriodEnumValue, {
21090 width: "wide",
21091 context: "formatting"
21092 });
21093 }
21094 },
21095 // in the morning, in the afternoon, in the evening, at night
21096 B: function(date, token, localize2) {
21097 const hours = date.getHours();
21098 let dayPeriodEnumValue;
21099 if (hours >= 17) {
21100 dayPeriodEnumValue = dayPeriodEnum.evening;
21101 } else if (hours >= 12) {
21102 dayPeriodEnumValue = dayPeriodEnum.afternoon;
21103 } else if (hours >= 4) {
21104 dayPeriodEnumValue = dayPeriodEnum.morning;
21105 } else {
21106 dayPeriodEnumValue = dayPeriodEnum.night;
21107 }
21108 switch (token) {
21109 case "B":
21110 case "BB":
21111 case "BBB":
21112 return localize2.dayPeriod(dayPeriodEnumValue, {
21113 width: "abbreviated",
21114 context: "formatting"
21115 });
21116 case "BBBBB":
21117 return localize2.dayPeriod(dayPeriodEnumValue, {
21118 width: "narrow",
21119 context: "formatting"
21120 });
21121 case "BBBB":
21122 default:
21123 return localize2.dayPeriod(dayPeriodEnumValue, {
21124 width: "wide",
21125 context: "formatting"
21126 });
21127 }
21128 },
21129 // Hour [1-12]
21130 h: function(date, token, localize2) {
21131 if (token === "ho") {
21132 let hours = date.getHours() % 12;
21133 if (hours === 0) hours = 12;
21134 return localize2.ordinalNumber(hours, { unit: "hour" });
21135 }
21136 return lightFormatters.h(date, token);
21137 },
21138 // Hour [0-23]
21139 H: function(date, token, localize2) {
21140 if (token === "Ho") {
21141 return localize2.ordinalNumber(date.getHours(), { unit: "hour" });
21142 }
21143 return lightFormatters.H(date, token);
21144 },
21145 // Hour [0-11]
21146 K: function(date, token, localize2) {
21147 const hours = date.getHours() % 12;
21148 if (token === "Ko") {
21149 return localize2.ordinalNumber(hours, { unit: "hour" });
21150 }
21151 return addLeadingZeros(hours, token.length);
21152 },
21153 // Hour [1-24]
21154 k: function(date, token, localize2) {
21155 let hours = date.getHours();
21156 if (hours === 0) hours = 24;
21157 if (token === "ko") {
21158 return localize2.ordinalNumber(hours, { unit: "hour" });
21159 }
21160 return addLeadingZeros(hours, token.length);
21161 },
21162 // Minute
21163 m: function(date, token, localize2) {
21164 if (token === "mo") {
21165 return localize2.ordinalNumber(date.getMinutes(), { unit: "minute" });
21166 }
21167 return lightFormatters.m(date, token);
21168 },
21169 // Second
21170 s: function(date, token, localize2) {
21171 if (token === "so") {
21172 return localize2.ordinalNumber(date.getSeconds(), { unit: "second" });
21173 }
21174 return lightFormatters.s(date, token);
21175 },
21176 // Fraction of second
21177 S: function(date, token) {
21178 return lightFormatters.S(date, token);
21179 },
21180 // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)
21181 X: function(date, token, _localize) {
21182 const timezoneOffset = date.getTimezoneOffset();
21183 if (timezoneOffset === 0) {
21184 return "Z";
21185 }
21186 switch (token) {
21187 // Hours and optional minutes
21188 case "X":
21189 return formatTimezoneWithOptionalMinutes(timezoneOffset);
21190 // Hours, minutes and optional seconds without `:` delimiter
21191 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21192 // so this token always has the same output as `XX`
21193 case "XXXX":
21194 case "XX":
21195 return formatTimezone(timezoneOffset);
21196 // Hours, minutes and optional seconds with `:` delimiter
21197 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21198 // so this token always has the same output as `XXX`
21199 case "XXXXX":
21200 case "XXX":
21201 // Hours and minutes with `:` delimiter
21202 default:
21203 return formatTimezone(timezoneOffset, ":");
21204 }
21205 },
21206 // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)
21207 x: function(date, token, _localize) {
21208 const timezoneOffset = date.getTimezoneOffset();
21209 switch (token) {
21210 // Hours and optional minutes
21211 case "x":
21212 return formatTimezoneWithOptionalMinutes(timezoneOffset);
21213 // Hours, minutes and optional seconds without `:` delimiter
21214 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21215 // so this token always has the same output as `xx`
21216 case "xxxx":
21217 case "xx":
21218 return formatTimezone(timezoneOffset);
21219 // Hours, minutes and optional seconds with `:` delimiter
21220 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21221 // so this token always has the same output as `xxx`
21222 case "xxxxx":
21223 case "xxx":
21224 // Hours and minutes with `:` delimiter
21225 default:
21226 return formatTimezone(timezoneOffset, ":");
21227 }
21228 },
21229 // Timezone (GMT)
21230 O: function(date, token, _localize) {
21231 const timezoneOffset = date.getTimezoneOffset();
21232 switch (token) {
21233 // Short
21234 case "O":
21235 case "OO":
21236 case "OOO":
21237 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
21238 // Long
21239 case "OOOO":
21240 default:
21241 return "GMT" + formatTimezone(timezoneOffset, ":");
21242 }
21243 },
21244 // Timezone (specific non-location)
21245 z: function(date, token, _localize) {
21246 const timezoneOffset = date.getTimezoneOffset();
21247 switch (token) {
21248 // Short
21249 case "z":
21250 case "zz":
21251 case "zzz":
21252 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
21253 // Long
21254 case "zzzz":
21255 default:
21256 return "GMT" + formatTimezone(timezoneOffset, ":");
21257 }
21258 },
21259 // Seconds timestamp
21260 t: function(date, token, _localize) {
21261 const timestamp = Math.trunc(+date / 1e3);
21262 return addLeadingZeros(timestamp, token.length);
21263 },
21264 // Milliseconds timestamp
21265 T: function(date, token, _localize) {
21266 return addLeadingZeros(+date, token.length);
21267 }
21268 };
21269 function formatTimezoneShort(offset4, delimiter = "") {
21270 const sign = offset4 > 0 ? "-" : "+";
21271 const absOffset = Math.abs(offset4);
21272 const hours = Math.trunc(absOffset / 60);
21273 const minutes = absOffset % 60;
21274 if (minutes === 0) {
21275 return sign + String(hours);
21276 }
21277 return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
21278 }
21279 function formatTimezoneWithOptionalMinutes(offset4, delimiter) {
21280 if (offset4 % 60 === 0) {
21281 const sign = offset4 > 0 ? "-" : "+";
21282 return sign + addLeadingZeros(Math.abs(offset4) / 60, 2);
21283 }
21284 return formatTimezone(offset4, delimiter);
21285 }
21286 function formatTimezone(offset4, delimiter = "") {
21287 const sign = offset4 > 0 ? "-" : "+";
21288 const absOffset = Math.abs(offset4);
21289 const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);
21290 const minutes = addLeadingZeros(absOffset % 60, 2);
21291 return sign + hours + delimiter + minutes;
21292 }
21293
21294 // node_modules/date-fns/_lib/format/longFormatters.js
21295 var dateLongFormatter = (pattern, formatLong2) => {
21296 switch (pattern) {
21297 case "P":
21298 return formatLong2.date({ width: "short" });
21299 case "PP":
21300 return formatLong2.date({ width: "medium" });
21301 case "PPP":
21302 return formatLong2.date({ width: "long" });
21303 case "PPPP":
21304 default:
21305 return formatLong2.date({ width: "full" });
21306 }
21307 };
21308 var timeLongFormatter = (pattern, formatLong2) => {
21309 switch (pattern) {
21310 case "p":
21311 return formatLong2.time({ width: "short" });
21312 case "pp":
21313 return formatLong2.time({ width: "medium" });
21314 case "ppp":
21315 return formatLong2.time({ width: "long" });
21316 case "pppp":
21317 default:
21318 return formatLong2.time({ width: "full" });
21319 }
21320 };
21321 var dateTimeLongFormatter = (pattern, formatLong2) => {
21322 const matchResult = pattern.match(/(P+)(p+)?/) || [];
21323 const datePattern = matchResult[1];
21324 const timePattern = matchResult[2];
21325 if (!timePattern) {
21326 return dateLongFormatter(pattern, formatLong2);
21327 }
21328 let dateTimeFormat;
21329 switch (datePattern) {
21330 case "P":
21331 dateTimeFormat = formatLong2.dateTime({ width: "short" });
21332 break;
21333 case "PP":
21334 dateTimeFormat = formatLong2.dateTime({ width: "medium" });
21335 break;
21336 case "PPP":
21337 dateTimeFormat = formatLong2.dateTime({ width: "long" });
21338 break;
21339 case "PPPP":
21340 default:
21341 dateTimeFormat = formatLong2.dateTime({ width: "full" });
21342 break;
21343 }
21344 return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
21345 };
21346 var longFormatters = {
21347 p: timeLongFormatter,
21348 P: dateTimeLongFormatter
21349 };
21350
21351 // node_modules/date-fns/_lib/protectedTokens.js
21352 var dayOfYearTokenRE = /^D+$/;
21353 var weekYearTokenRE = /^Y+$/;
21354 var throwTokens = ["D", "DD", "YY", "YYYY"];
21355 function isProtectedDayOfYearToken(token) {
21356 return dayOfYearTokenRE.test(token);
21357 }
21358 function isProtectedWeekYearToken(token) {
21359 return weekYearTokenRE.test(token);
21360 }
21361 function warnOrThrowProtectedError(token, format7, input) {
21362 const _message = message(token, format7, input);
21363 console.warn(_message);
21364 if (throwTokens.includes(token)) throw new RangeError(_message);
21365 }
21366 function message(token, format7, input) {
21367 const subject = token[0] === "Y" ? "years" : "days of the month";
21368 return `Use \`${token.toLowerCase()}\` instead of \`${token}\` (in \`${format7}\`) for formatting ${subject} to the input \`${input}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;
21369 }
21370
21371 // node_modules/date-fns/format.js
21372 var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
21373 var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
21374 var escapedStringRegExp = /^'([^]*?)'?$/;
21375 var doubleQuoteRegExp = /''/g;
21376 var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
21377 function format(date, formatStr, options) {
21378 const defaultOptions2 = getDefaultOptions();
21379 const locale = options?.locale ?? defaultOptions2.locale ?? enUS;
21380 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
21381 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
21382 const originalDate = toDate(date, options?.in);
21383 if (!isValid(originalDate)) {
21384 throw new RangeError("Invalid time value");
21385 }
21386 let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => {
21387 const firstCharacter = substring[0];
21388 if (firstCharacter === "p" || firstCharacter === "P") {
21389 const longFormatter = longFormatters[firstCharacter];
21390 return longFormatter(substring, locale.formatLong);
21391 }
21392 return substring;
21393 }).join("").match(formattingTokensRegExp).map((substring) => {
21394 if (substring === "''") {
21395 return { isToken: false, value: "'" };
21396 }
21397 const firstCharacter = substring[0];
21398 if (firstCharacter === "'") {
21399 return { isToken: false, value: cleanEscapedString(substring) };
21400 }
21401 if (formatters[firstCharacter]) {
21402 return { isToken: true, value: substring };
21403 }
21404 if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
21405 throw new RangeError(
21406 "Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"
21407 );
21408 }
21409 return { isToken: false, value: substring };
21410 });
21411 if (locale.localize.preprocessor) {
21412 parts = locale.localize.preprocessor(originalDate, parts);
21413 }
21414 const formatterOptions = {
21415 firstWeekContainsDate,
21416 weekStartsOn,
21417 locale
21418 };
21419 return parts.map((part) => {
21420 if (!part.isToken) return part.value;
21421 const token = part.value;
21422 if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) {
21423 warnOrThrowProtectedError(token, formatStr, String(date));
21424 }
21425 const formatter = formatters[token[0]];
21426 return formatter(originalDate, token, locale.localize, formatterOptions);
21427 }).join("");
21428 }
21429 function cleanEscapedString(input) {
21430 const matched = input.match(escapedStringRegExp);
21431 if (!matched) {
21432 return input;
21433 }
21434 return matched[1].replace(doubleQuoteRegExp, "'");
21435 }
21436
21437 // node_modules/date-fns/subDays.js
21438 function subDays(date, amount, options) {
21439 return addDays(date, -amount, options);
21440 }
21441
21442 // node_modules/date-fns/subMonths.js
21443 function subMonths(date, amount, options) {
21444 return addMonths(date, -amount, options);
21445 }
21446
21447 // node_modules/date-fns/subWeeks.js
21448 function subWeeks(date, amount, options) {
21449 return addWeeks(date, -amount, options);
21450 }
21451
21452 // node_modules/date-fns/subYears.js
21453 function subYears(date, amount, options) {
21454 return addYears(date, -amount, options);
21455 }
21456
21457 // packages/dataviews/build-module/utils/operators.mjs
21458 var import_i18n25 = __toESM(require_i18n(), 1);
21459 var import_element53 = __toESM(require_element(), 1);
21460 var import_date = __toESM(require_date(), 1);
21461 var import_jsx_runtime83 = __toESM(require_jsx_runtime(), 1);
21462 var filterTextWrappers = {
21463 Name: /* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "dataviews-filters__summary-filter-text-name" }),
21464 Value: /* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "dataviews-filters__summary-filter-text-value" })
21465 };
21466 function getRelativeDate(value, unit) {
21467 switch (unit) {
21468 case "days":
21469 return subDays(/* @__PURE__ */ new Date(), value);
21470 case "weeks":
21471 return subWeeks(/* @__PURE__ */ new Date(), value);
21472 case "months":
21473 return subMonths(/* @__PURE__ */ new Date(), value);
21474 case "years":
21475 return subYears(/* @__PURE__ */ new Date(), value);
21476 default:
21477 return /* @__PURE__ */ new Date();
21478 }
21479 }
21480 var isNoneOperatorDefinition = {
21481 /* translators: DataViews operator name */
21482 label: (0, import_i18n25.__)("Is none of"),
21483 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21484 (0, import_i18n25.sprintf)(
21485 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */
21486 (0, import_i18n25.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"),
21487 filter.name,
21488 activeElements.map((element) => element.label).join(", ")
21489 ),
21490 filterTextWrappers
21491 ),
21492 filter: ((item, field, filterValue) => {
21493 if (!filterValue?.length) {
21494 return true;
21495 }
21496 const fieldValue = field.getValue({ item });
21497 if (Array.isArray(fieldValue)) {
21498 return !filterValue.some(
21499 (fv) => fieldValue.includes(fv)
21500 );
21501 } else if (typeof fieldValue === "string") {
21502 return !filterValue.includes(fieldValue);
21503 }
21504 return false;
21505 }),
21506 selection: "multi"
21507 };
21508 var OPERATORS = [
21509 {
21510 name: OPERATOR_IS_ANY,
21511 /* translators: DataViews operator name */
21512 label: (0, import_i18n25.__)("Includes"),
21513 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21514 (0, import_i18n25.sprintf)(
21515 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is any: Admin, Editor". */
21516 (0, import_i18n25.__)("<Name>%1$s includes: </Name><Value>%2$s</Value>"),
21517 filter.name,
21518 activeElements.map((element) => element.label).join(", ")
21519 ),
21520 filterTextWrappers
21521 ),
21522 filter(item, field, filterValue) {
21523 if (!filterValue?.length) {
21524 return true;
21525 }
21526 const fieldValue = field.getValue({ item });
21527 if (Array.isArray(fieldValue)) {
21528 return filterValue.some(
21529 (fv) => fieldValue.includes(fv)
21530 );
21531 } else if (typeof fieldValue === "string") {
21532 return filterValue.includes(fieldValue);
21533 }
21534 return false;
21535 },
21536 selection: "multi"
21537 },
21538 {
21539 name: OPERATOR_IS_NONE,
21540 ...isNoneOperatorDefinition
21541 },
21542 {
21543 name: OPERATOR_IS_ALL,
21544 /* translators: DataViews operator name */
21545 label: (0, import_i18n25.__)("Includes all"),
21546 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21547 (0, import_i18n25.sprintf)(
21548 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author includes all: Admin, Editor". */
21549 (0, import_i18n25.__)("<Name>%1$s includes all: </Name><Value>%2$s</Value>"),
21550 filter.name,
21551 activeElements.map((element) => element.label).join(", ")
21552 ),
21553 filterTextWrappers
21554 ),
21555 filter(item, field, filterValue) {
21556 if (!filterValue?.length) {
21557 return true;
21558 }
21559 return filterValue.every((value) => {
21560 return field.getValue({ item })?.includes(value);
21561 });
21562 },
21563 selection: "multi"
21564 },
21565 {
21566 name: OPERATOR_IS_NOT_ALL,
21567 ...isNoneOperatorDefinition
21568 },
21569 {
21570 name: OPERATOR_BETWEEN,
21571 /* translators: DataViews operator name */
21572 label: (0, import_i18n25.__)("Between (inc)"),
21573 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21574 (0, import_i18n25.sprintf)(
21575 /* translators: 1: Filter name (e.g. "Item count"). 2: Filter value min. 3: Filter value max. e.g.: "Item count between (inc): 10 and 180". */
21576 (0, import_i18n25.__)(
21577 "<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>"
21578 ),
21579 filter.name,
21580 activeElements[0].label[0],
21581 activeElements[0].label[1]
21582 ),
21583 filterTextWrappers
21584 ),
21585 filter(item, field, filterValue) {
21586 if (!Array.isArray(filterValue) || filterValue.length !== 2 || filterValue[0] === void 0 || filterValue[1] === void 0) {
21587 return true;
21588 }
21589 const fieldValue = field.getValue({ item });
21590 if (typeof fieldValue === "number" || fieldValue instanceof Date || typeof fieldValue === "string") {
21591 return fieldValue >= filterValue[0] && fieldValue <= filterValue[1];
21592 }
21593 return false;
21594 },
21595 selection: "custom"
21596 },
21597 {
21598 name: OPERATOR_IN_THE_PAST,
21599 /* translators: DataViews operator name */
21600 label: (0, import_i18n25.__)("In the past"),
21601 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21602 (0, import_i18n25.sprintf)(
21603 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is in the past: 7 days". */
21604 (0, import_i18n25.__)(
21605 "<Name>%1$s is in the past: </Name><Value>%2$s</Value>"
21606 ),
21607 filter.name,
21608 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
21609 ),
21610 filterTextWrappers
21611 ),
21612 filter(item, field, filterValue) {
21613 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
21614 return true;
21615 }
21616 const targetDate = getRelativeDate(
21617 filterValue.value,
21618 filterValue.unit
21619 );
21620 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
21621 return fieldValue >= targetDate && fieldValue <= /* @__PURE__ */ new Date();
21622 },
21623 selection: "custom"
21624 },
21625 {
21626 name: OPERATOR_OVER,
21627 /* translators: DataViews operator name */
21628 label: (0, import_i18n25.__)("Over"),
21629 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21630 (0, import_i18n25.sprintf)(
21631 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is over: 7 days". */
21632 (0, import_i18n25.__)("<Name>%1$s is over: </Name><Value>%2$s</Value>"),
21633 filter.name,
21634 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
21635 ),
21636 filterTextWrappers
21637 ),
21638 filter(item, field, filterValue) {
21639 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
21640 return true;
21641 }
21642 const targetDate = getRelativeDate(
21643 filterValue.value,
21644 filterValue.unit
21645 );
21646 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
21647 return fieldValue < targetDate;
21648 },
21649 selection: "custom"
21650 },
21651 {
21652 name: OPERATOR_IS,
21653 /* translators: DataViews operator name */
21654 label: (0, import_i18n25.__)("Is"),
21655 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21656 (0, import_i18n25.sprintf)(
21657 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is: Admin". */
21658 (0, import_i18n25.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
21659 filter.name,
21660 activeElements[0].label
21661 ),
21662 filterTextWrappers
21663 ),
21664 filter(item, field, filterValue) {
21665 return filterValue === field.getValue({ item }) || filterValue === void 0;
21666 },
21667 selection: "single"
21668 },
21669 {
21670 name: OPERATOR_IS_NOT,
21671 /* translators: DataViews operator name */
21672 label: (0, import_i18n25.__)("Is not"),
21673 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21674 (0, import_i18n25.sprintf)(
21675 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is not: Admin". */
21676 (0, import_i18n25.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
21677 filter.name,
21678 activeElements[0].label
21679 ),
21680 filterTextWrappers
21681 ),
21682 filter(item, field, filterValue) {
21683 return filterValue !== field.getValue({ item });
21684 },
21685 selection: "single"
21686 },
21687 {
21688 name: OPERATOR_LESS_THAN,
21689 /* translators: DataViews operator name */
21690 label: (0, import_i18n25.__)("Less than"),
21691 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21692 (0, import_i18n25.sprintf)(
21693 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than: 10". */
21694 (0, import_i18n25.__)("<Name>%1$s is less than: </Name><Value>%2$s</Value>"),
21695 filter.name,
21696 activeElements[0].label
21697 ),
21698 filterTextWrappers
21699 ),
21700 filter(item, field, filterValue) {
21701 if (filterValue === void 0) {
21702 return true;
21703 }
21704 const fieldValue = field.getValue({ item });
21705 return fieldValue < filterValue;
21706 },
21707 selection: "single"
21708 },
21709 {
21710 name: OPERATOR_GREATER_THAN,
21711 /* translators: DataViews operator name */
21712 label: (0, import_i18n25.__)("Greater than"),
21713 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21714 (0, import_i18n25.sprintf)(
21715 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than: 10". */
21716 (0, import_i18n25.__)(
21717 "<Name>%1$s is greater than: </Name><Value>%2$s</Value>"
21718 ),
21719 filter.name,
21720 activeElements[0].label
21721 ),
21722 filterTextWrappers
21723 ),
21724 filter(item, field, filterValue) {
21725 if (filterValue === void 0) {
21726 return true;
21727 }
21728 const fieldValue = field.getValue({ item });
21729 return fieldValue > filterValue;
21730 },
21731 selection: "single"
21732 },
21733 {
21734 name: OPERATOR_LESS_THAN_OR_EQUAL,
21735 /* translators: DataViews operator name */
21736 label: (0, import_i18n25.__)("Less than or equal"),
21737 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21738 (0, import_i18n25.sprintf)(
21739 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than or equal to: 10". */
21740 (0, import_i18n25.__)(
21741 "<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>"
21742 ),
21743 filter.name,
21744 activeElements[0].label
21745 ),
21746 filterTextWrappers
21747 ),
21748 filter(item, field, filterValue) {
21749 if (filterValue === void 0) {
21750 return true;
21751 }
21752 const fieldValue = field.getValue({ item });
21753 return fieldValue <= filterValue;
21754 },
21755 selection: "single"
21756 },
21757 {
21758 name: OPERATOR_GREATER_THAN_OR_EQUAL,
21759 /* translators: DataViews operator name */
21760 label: (0, import_i18n25.__)("Greater than or equal"),
21761 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21762 (0, import_i18n25.sprintf)(
21763 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than or equal to: 10". */
21764 (0, import_i18n25.__)(
21765 "<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>"
21766 ),
21767 filter.name,
21768 activeElements[0].label
21769 ),
21770 filterTextWrappers
21771 ),
21772 filter(item, field, filterValue) {
21773 if (filterValue === void 0) {
21774 return true;
21775 }
21776 const fieldValue = field.getValue({ item });
21777 return fieldValue >= filterValue;
21778 },
21779 selection: "single"
21780 },
21781 {
21782 name: OPERATOR_BEFORE,
21783 /* translators: DataViews operator name */
21784 label: (0, import_i18n25.__)("Before"),
21785 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21786 (0, import_i18n25.sprintf)(
21787 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is before: 2024-01-01". */
21788 (0, import_i18n25.__)("<Name>%1$s is before: </Name><Value>%2$s</Value>"),
21789 filter.name,
21790 activeElements[0].label
21791 ),
21792 filterTextWrappers
21793 ),
21794 filter(item, field, filterValue) {
21795 if (filterValue === void 0) {
21796 return true;
21797 }
21798 const filterDate = (0, import_date.getDate)(filterValue);
21799 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21800 return fieldDate < filterDate;
21801 },
21802 selection: "single"
21803 },
21804 {
21805 name: OPERATOR_AFTER,
21806 /* translators: DataViews operator name */
21807 label: (0, import_i18n25.__)("After"),
21808 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21809 (0, import_i18n25.sprintf)(
21810 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is after: 2024-01-01". */
21811 (0, import_i18n25.__)("<Name>%1$s is after: </Name><Value>%2$s</Value>"),
21812 filter.name,
21813 activeElements[0].label
21814 ),
21815 filterTextWrappers
21816 ),
21817 filter(item, field, filterValue) {
21818 if (filterValue === void 0) {
21819 return true;
21820 }
21821 const filterDate = (0, import_date.getDate)(filterValue);
21822 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21823 return fieldDate > filterDate;
21824 },
21825 selection: "single"
21826 },
21827 {
21828 name: OPERATOR_BEFORE_INC,
21829 /* translators: DataViews operator name */
21830 label: (0, import_i18n25.__)("Before (inc)"),
21831 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21832 (0, import_i18n25.sprintf)(
21833 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or before: 2024-01-01". */
21834 (0, import_i18n25.__)(
21835 "<Name>%1$s is on or before: </Name><Value>%2$s</Value>"
21836 ),
21837 filter.name,
21838 activeElements[0].label
21839 ),
21840 filterTextWrappers
21841 ),
21842 filter(item, field, filterValue) {
21843 if (filterValue === void 0) {
21844 return true;
21845 }
21846 const filterDate = (0, import_date.getDate)(filterValue);
21847 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21848 return fieldDate <= filterDate;
21849 },
21850 selection: "single"
21851 },
21852 {
21853 name: OPERATOR_AFTER_INC,
21854 /* translators: DataViews operator name */
21855 label: (0, import_i18n25.__)("After (inc)"),
21856 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21857 (0, import_i18n25.sprintf)(
21858 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or after: 2024-01-01". */
21859 (0, import_i18n25.__)(
21860 "<Name>%1$s is on or after: </Name><Value>%2$s</Value>"
21861 ),
21862 filter.name,
21863 activeElements[0].label
21864 ),
21865 filterTextWrappers
21866 ),
21867 filter(item, field, filterValue) {
21868 if (filterValue === void 0) {
21869 return true;
21870 }
21871 const filterDate = (0, import_date.getDate)(filterValue);
21872 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21873 return fieldDate >= filterDate;
21874 },
21875 selection: "single"
21876 },
21877 {
21878 name: OPERATOR_CONTAINS,
21879 /* translators: DataViews operator name */
21880 label: (0, import_i18n25.__)("Contains"),
21881 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21882 (0, import_i18n25.sprintf)(
21883 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title contains: Hello". */
21884 (0, import_i18n25.__)("<Name>%1$s contains: </Name><Value>%2$s</Value>"),
21885 filter.name,
21886 activeElements[0].label
21887 ),
21888 filterTextWrappers
21889 ),
21890 filter(item, field, filterValue) {
21891 if (filterValue === void 0) {
21892 return true;
21893 }
21894 const fieldValue = field.getValue({ item });
21895 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
21896 },
21897 selection: "single"
21898 },
21899 {
21900 name: OPERATOR_NOT_CONTAINS,
21901 /* translators: DataViews operator name */
21902 label: (0, import_i18n25.__)("Doesn't contain"),
21903 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21904 (0, import_i18n25.sprintf)(
21905 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title doesn't contain: Hello". */
21906 (0, import_i18n25.__)(
21907 "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>"
21908 ),
21909 filter.name,
21910 activeElements[0].label
21911 ),
21912 filterTextWrappers
21913 ),
21914 filter(item, field, filterValue) {
21915 if (filterValue === void 0) {
21916 return true;
21917 }
21918 const fieldValue = field.getValue({ item });
21919 return typeof fieldValue === "string" && filterValue && !fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
21920 },
21921 selection: "single"
21922 },
21923 {
21924 name: OPERATOR_STARTS_WITH,
21925 /* translators: DataViews operator name */
21926 label: (0, import_i18n25.__)("Starts with"),
21927 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21928 (0, import_i18n25.sprintf)(
21929 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title starts with: Hello". */
21930 (0, import_i18n25.__)("<Name>%1$s starts with: </Name><Value>%2$s</Value>"),
21931 filter.name,
21932 activeElements[0].label
21933 ),
21934 filterTextWrappers
21935 ),
21936 filter(item, field, filterValue) {
21937 if (filterValue === void 0) {
21938 return true;
21939 }
21940 const fieldValue = field.getValue({ item });
21941 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().startsWith(String(filterValue).toLowerCase());
21942 },
21943 selection: "single"
21944 },
21945 {
21946 name: OPERATOR_ON,
21947 /* translators: DataViews operator name */
21948 label: (0, import_i18n25.__)("On"),
21949 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21950 (0, import_i18n25.sprintf)(
21951 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is: 2024-01-01". */
21952 (0, import_i18n25.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
21953 filter.name,
21954 activeElements[0].label
21955 ),
21956 filterTextWrappers
21957 ),
21958 filter(item, field, filterValue) {
21959 if (filterValue === void 0) {
21960 return true;
21961 }
21962 const filterDate = (0, import_date.getDate)(filterValue);
21963 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21964 return filterDate.getTime() === fieldDate.getTime();
21965 },
21966 selection: "single"
21967 },
21968 {
21969 name: OPERATOR_NOT_ON,
21970 /* translators: DataViews operator name */
21971 label: (0, import_i18n25.__)("Not on"),
21972 filterText: (filter, activeElements) => (0, import_element53.createInterpolateElement)(
21973 (0, import_i18n25.sprintf)(
21974 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is not: 2024-01-01". */
21975 (0, import_i18n25.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
21976 filter.name,
21977 activeElements[0].label
21978 ),
21979 filterTextWrappers
21980 ),
21981 filter(item, field, filterValue) {
21982 if (filterValue === void 0) {
21983 return true;
21984 }
21985 const filterDate = (0, import_date.getDate)(filterValue);
21986 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21987 return filterDate.getTime() !== fieldDate.getTime();
21988 },
21989 selection: "single"
21990 }
21991 ];
21992 var getOperatorByName = (name) => OPERATORS.find((op) => op.name === name);
21993 var getAllOperatorNames = () => OPERATORS.map((op) => op.name);
21994 var isSingleSelectionOperator = (name) => OPERATORS.filter((op) => op.selection === "single").some(
21995 (op) => op.name === name
21996 );
21997 var isRegisteredOperator = (name) => OPERATORS.some((op) => op.name === name);
21998
21999 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
22000 var import_jsx_runtime84 = __toESM(require_jsx_runtime(), 1);
22001 var ENTER = "Enter";
22002 var SPACE = " ";
22003 var FilterText = ({
22004 activeElements,
22005 filterInView,
22006 filter
22007 }) => {
22008 if (activeElements === void 0 || activeElements.length === 0) {
22009 return filter.name;
22010 }
22011 const operator = getOperatorByName(filterInView?.operator);
22012 if (operator !== void 0) {
22013 return operator.filterText(filter, activeElements);
22014 }
22015 return (0, import_i18n26.sprintf)(
22016 /* translators: 1: Filter name e.g.: "Unknown status for Author". */
22017 (0, import_i18n26.__)("Unknown status for %1$s"),
22018 filter.name
22019 );
22020 };
22021 function OperatorSelector({
22022 filter,
22023 view,
22024 onChangeView
22025 }) {
22026 const operatorOptions = filter.operators?.map((operator) => ({
22027 value: operator,
22028 label: getOperatorByName(operator)?.label || operator
22029 }));
22030 const currentFilter = view.filters?.find(
22031 (_filter) => _filter.field === filter.field
22032 );
22033 const value = currentFilter?.operator || filter.operators[0];
22034 return operatorOptions.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(
22035 Stack,
22036 {
22037 direction: "row",
22038 gap: "sm",
22039 justify: "flex-start",
22040 className: "dataviews-filters__summary-operators-container",
22041 align: "center",
22042 children: [
22043 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(import_components21.FlexItem, { className: "dataviews-filters__summary-operators-filter-name", children: filter.name }),
22044 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22045 import_components21.SelectControl,
22046 {
22047 className: "dataviews-filters__summary-operators-filter-select",
22048 label: (0, import_i18n26.__)("Conditions"),
22049 value,
22050 options: operatorOptions,
22051 onChange: (newValue) => {
22052 const newOperator = newValue;
22053 const currentOperator = currentFilter?.operator;
22054 const newFilters = currentFilter ? [
22055 ...(view.filters ?? []).map(
22056 (_filter) => {
22057 if (_filter.field === filter.field) {
22058 const currentOpSelectionModel = getOperatorByName(
22059 currentOperator
22060 )?.selection;
22061 const newOpSelectionModel = getOperatorByName(
22062 newOperator
22063 )?.selection;
22064 const shouldResetValue = currentOpSelectionModel !== newOpSelectionModel || [
22065 currentOpSelectionModel,
22066 newOpSelectionModel
22067 ].includes("custom");
22068 return {
22069 ..._filter,
22070 value: shouldResetValue ? void 0 : _filter.value,
22071 operator: newOperator
22072 };
22073 }
22074 return _filter;
22075 }
22076 )
22077 ] : [
22078 ...view.filters ?? [],
22079 {
22080 field: filter.field,
22081 operator: newOperator,
22082 value: void 0
22083 }
22084 ];
22085 onChangeView({
22086 ...view,
22087 page: 1,
22088 filters: newFilters
22089 });
22090 },
22091 size: "small",
22092 variant: "minimal",
22093 hideLabelFromVision: true
22094 }
22095 )
22096 ]
22097 }
22098 );
22099 }
22100 function Filter({
22101 addFilterRef,
22102 openedFilter,
22103 fields,
22104 ...commonProps
22105 }) {
22106 const toggleRef = (0, import_element54.useRef)(null);
22107 const { filter, view, onChangeView } = commonProps;
22108 const filterInView = view.filters?.find(
22109 (f2) => f2.field === filter.field
22110 );
22111 let activeElements = [];
22112 const field = (0, import_element54.useMemo)(() => {
22113 const currentField = fields.find((f2) => f2.id === filter.field);
22114 if (currentField) {
22115 return {
22116 ...currentField,
22117 // Configure getValue as if Item was a plain object.
22118 // See related input-widget.tsx
22119 getValue: ({ item }) => item[currentField.id]
22120 };
22121 }
22122 return currentField;
22123 }, [fields, filter.field]);
22124 const { elements } = useElements({
22125 elements: filter.elements,
22126 getElements: filter.getElements
22127 });
22128 if (elements.length > 0) {
22129 activeElements = elements.filter((element) => {
22130 if (filter.singleSelection) {
22131 return element.value === filterInView?.value;
22132 }
22133 return filterInView?.value?.includes(element.value);
22134 });
22135 } else if (Array.isArray(filterInView?.value)) {
22136 const label = filterInView.value.map((v2) => {
22137 const formattedValue = field?.getValueFormatted({
22138 item: { [field.id]: v2 },
22139 field
22140 });
22141 return formattedValue || String(v2);
22142 });
22143 activeElements = [
22144 {
22145 value: filterInView.value,
22146 // @ts-ignore
22147 label
22148 }
22149 ];
22150 } else if (typeof filterInView?.value === "object") {
22151 activeElements = [
22152 { value: filterInView.value, label: filterInView.value }
22153 ];
22154 } else if (filterInView?.value !== void 0) {
22155 const label = field !== void 0 ? field.getValueFormatted({
22156 item: { [field.id]: filterInView.value },
22157 field
22158 }) : String(filterInView.value);
22159 activeElements = [
22160 {
22161 value: filterInView.value,
22162 label
22163 }
22164 ];
22165 }
22166 const isPrimary = filter.isPrimary;
22167 const isLocked = filterInView?.isLocked;
22168 const hasValues = !isLocked && filterInView?.value !== void 0;
22169 const canResetOrRemove = !isLocked && (!isPrimary || hasValues);
22170 const resetOrRemoveLabel = isPrimary ? (0, import_i18n26.__)("Reset") : (0, import_i18n26.__)("Remove");
22171 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22172 import_components21.Dropdown,
22173 {
22174 defaultOpen: openedFilter === filter.field,
22175 contentClassName: "dataviews-filters__summary-popover",
22176 popoverProps: { placement: "bottom-start", role: "dialog" },
22177 onClose: () => {
22178 toggleRef.current?.focus();
22179 },
22180 renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)("div", { className: "dataviews-filters__summary-chip-container", children: [
22181 /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(tooltip_exports.Root, { children: [
22182 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22183 tooltip_exports.Trigger,
22184 {
22185 render: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22186 "div",
22187 {
22188 className: clsx_default(
22189 "dataviews-filters__summary-chip",
22190 {
22191 "has-reset": canResetOrRemove,
22192 "has-values": hasValues,
22193 "is-not-clickable": isLocked
22194 }
22195 ),
22196 role: "button",
22197 tabIndex: isLocked ? -1 : 0,
22198 onClick: () => {
22199 if (!isLocked) {
22200 onToggle();
22201 }
22202 },
22203 onKeyDown: (event) => {
22204 if (!isLocked && [ENTER, SPACE].includes(
22205 event.key
22206 )) {
22207 onToggle();
22208 event.preventDefault();
22209 }
22210 },
22211 "aria-disabled": isLocked,
22212 "aria-pressed": isOpen,
22213 "aria-expanded": isOpen,
22214 ref: toggleRef,
22215 children: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22216 FilterText,
22217 {
22218 activeElements,
22219 filterInView,
22220 filter
22221 }
22222 )
22223 }
22224 )
22225 }
22226 ),
22227 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(tooltip_exports.Popup, { children: (0, import_i18n26.sprintf)(
22228 /* translators: 1: Filter name. */
22229 (0, import_i18n26.__)("Filter by: %1$s"),
22230 filter.name.toLowerCase()
22231 ) })
22232 ] }),
22233 canResetOrRemove && /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(tooltip_exports.Root, { children: [
22234 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22235 tooltip_exports.Trigger,
22236 {
22237 render: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22238 "button",
22239 {
22240 className: clsx_default(
22241 "dataviews-filters__summary-chip-remove",
22242 { "has-values": hasValues }
22243 ),
22244 "aria-label": resetOrRemoveLabel,
22245 onClick: () => {
22246 onChangeView({
22247 ...view,
22248 page: 1,
22249 filters: view.filters?.filter(
22250 (_filter) => _filter.field !== filter.field
22251 )
22252 });
22253 if (!isPrimary) {
22254 addFilterRef.current?.focus();
22255 } else {
22256 toggleRef.current?.focus();
22257 }
22258 },
22259 children: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(import_components21.Icon, { icon: close_small_default })
22260 }
22261 )
22262 }
22263 ),
22264 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(tooltip_exports.Popup, { children: resetOrRemoveLabel })
22265 ] })
22266 ] }),
22267 renderContent: () => {
22268 return /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(Stack, { direction: "column", justify: "flex-start", children: [
22269 /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(OperatorSelector, { ...commonProps }),
22270 commonProps.filter.hasElements ? /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22271 SearchWidget,
22272 {
22273 ...commonProps,
22274 filter: {
22275 ...commonProps.filter,
22276 elements
22277 }
22278 }
22279 ) : /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(InputWidget, { ...commonProps, fields })
22280 ] });
22281 }
22282 }
22283 );
22284 }
22285
22286 // packages/dataviews/build-module/components/dataviews-filters/add-filter.mjs
22287 var import_components22 = __toESM(require_components(), 1);
22288 var import_i18n27 = __toESM(require_i18n(), 1);
22289 var import_element55 = __toESM(require_element(), 1);
22290 var import_jsx_runtime85 = __toESM(require_jsx_runtime(), 1);
22291 var { Menu: Menu4 } = unlock2(import_components22.privateApis);
22292 function AddFilterMenu({
22293 filters,
22294 view,
22295 onChangeView,
22296 setOpenedFilter,
22297 triggerProps
22298 }) {
22299 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
22300 return /* @__PURE__ */ (0, import_jsx_runtime85.jsxs)(Menu4, { children: [
22301 /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(Menu4.TriggerButton, { ...triggerProps }),
22302 /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(Menu4.Popover, { children: inactiveFilters.map((filter) => {
22303 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22304 Menu4.Item,
22305 {
22306 onClick: () => {
22307 setOpenedFilter(filter.field);
22308 onChangeView({
22309 ...view,
22310 page: 1,
22311 filters: [
22312 ...view.filters || [],
22313 {
22314 field: filter.field,
22315 value: void 0,
22316 operator: filter.operators[0]
22317 }
22318 ]
22319 });
22320 },
22321 children: /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(Menu4.ItemLabel, { children: filter.name })
22322 },
22323 filter.field
22324 );
22325 }) })
22326 ] });
22327 }
22328 function AddFilter({ filters, view, onChangeView, setOpenedFilter }, ref) {
22329 if (!filters.length || filters.every(({ isPrimary }) => isPrimary)) {
22330 return null;
22331 }
22332 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
22333 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22334 AddFilterMenu,
22335 {
22336 triggerProps: {
22337 render: /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22338 import_components22.Button,
22339 {
22340 accessibleWhenDisabled: true,
22341 size: "compact",
22342 className: "dataviews-filters-button",
22343 variant: "tertiary",
22344 disabled: !inactiveFilters.length,
22345 ref
22346 }
22347 ),
22348 children: (0, import_i18n27.__)("Add filter")
22349 },
22350 ...{ filters, view, onChangeView, setOpenedFilter }
22351 }
22352 );
22353 }
22354 var add_filter_default = (0, import_element55.forwardRef)(AddFilter);
22355
22356 // packages/dataviews/build-module/components/dataviews-filters/reset-filters.mjs
22357 var import_components23 = __toESM(require_components(), 1);
22358 var import_i18n28 = __toESM(require_i18n(), 1);
22359 var import_jsx_runtime86 = __toESM(require_jsx_runtime(), 1);
22360 function ResetFilter({
22361 filters,
22362 view,
22363 onChangeView
22364 }) {
22365 const isPrimary = (field) => filters.some(
22366 (_filter) => _filter.field === field && _filter.isPrimary
22367 );
22368 const isDisabled = !view.search && !view.filters?.some(
22369 (_filter) => !_filter.isLocked && (_filter.value !== void 0 || !isPrimary(_filter.field))
22370 );
22371 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
22372 import_components23.Button,
22373 {
22374 disabled: isDisabled,
22375 accessibleWhenDisabled: true,
22376 size: "compact",
22377 variant: "tertiary",
22378 className: "dataviews-filters__reset-button",
22379 onClick: () => {
22380 onChangeView({
22381 ...view,
22382 page: 1,
22383 search: "",
22384 filters: view.filters?.filter((f2) => !!f2.isLocked) || []
22385 });
22386 },
22387 children: (0, import_i18n28.__)("Reset")
22388 }
22389 );
22390 }
22391
22392 // packages/dataviews/build-module/components/dataviews-filters/use-filters.mjs
22393 var import_element56 = __toESM(require_element(), 1);
22394 function useFilters(fields, view) {
22395 return (0, import_element56.useMemo)(() => {
22396 const filters = [];
22397 fields.forEach((field) => {
22398 if (field.filterBy === false || !field.hasElements && !field.Edit) {
22399 return;
22400 }
22401 const operators = field.filterBy.operators;
22402 const isPrimary = !!field.filterBy?.isPrimary;
22403 const isLocked = view.filters?.some(
22404 (f2) => f2.field === field.id && !!f2.isLocked
22405 ) ?? false;
22406 filters.push({
22407 field: field.id,
22408 name: field.label,
22409 elements: field.elements,
22410 getElements: field.getElements,
22411 hasElements: field.hasElements,
22412 singleSelection: operators.some(
22413 (op) => isSingleSelectionOperator(op)
22414 ),
22415 operators,
22416 isVisible: isLocked || isPrimary || !!view.filters?.some(
22417 (f2) => f2.field === field.id && isRegisteredOperator(f2.operator)
22418 ),
22419 isPrimary,
22420 isLocked
22421 });
22422 });
22423 filters.sort((a2, b2) => {
22424 if (a2.isLocked && !b2.isLocked) {
22425 return -1;
22426 }
22427 if (!a2.isLocked && b2.isLocked) {
22428 return 1;
22429 }
22430 if (a2.isPrimary && !b2.isPrimary) {
22431 return -1;
22432 }
22433 if (!a2.isPrimary && b2.isPrimary) {
22434 return 1;
22435 }
22436 return a2.name.localeCompare(b2.name);
22437 });
22438 return filters;
22439 }, [fields, view]);
22440 }
22441 var use_filters_default = useFilters;
22442
22443 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
22444 var import_jsx_runtime87 = __toESM(require_jsx_runtime(), 1);
22445 function Filters({ className }) {
22446 const { fields, view, onChangeView, openedFilter, setOpenedFilter } = (0, import_element57.useContext)(dataviews_context_default);
22447 const addFilterRef = (0, import_element57.useRef)(null);
22448 const filters = use_filters_default(fields, view);
22449 const addFilter = /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
22450 add_filter_default,
22451 {
22452 filters,
22453 view,
22454 onChangeView,
22455 ref: addFilterRef,
22456 setOpenedFilter
22457 },
22458 "add-filter"
22459 );
22460 const visibleFilters = filters.filter((filter) => filter.isVisible);
22461 if (visibleFilters.length === 0) {
22462 return null;
22463 }
22464 const filterComponents = [
22465 ...visibleFilters.map((filter) => {
22466 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
22467 Filter,
22468 {
22469 filter,
22470 view,
22471 fields,
22472 onChangeView,
22473 addFilterRef,
22474 openedFilter
22475 },
22476 filter.field
22477 );
22478 }),
22479 addFilter
22480 ];
22481 filterComponents.push(
22482 /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
22483 ResetFilter,
22484 {
22485 filters,
22486 view,
22487 onChangeView
22488 },
22489 "reset-filters"
22490 )
22491 );
22492 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
22493 Stack,
22494 {
22495 direction: "row",
22496 justify: "flex-start",
22497 gap: "sm",
22498 style: { width: "fit-content" },
22499 wrap: "wrap",
22500 className,
22501 children: filterComponents
22502 }
22503 );
22504 }
22505 var filters_default = (0, import_element57.memo)(Filters);
22506
22507 // packages/dataviews/build-module/components/dataviews-filters/toggle.mjs
22508 var import_element58 = __toESM(require_element(), 1);
22509 var import_components24 = __toESM(require_components(), 1);
22510 var import_i18n29 = __toESM(require_i18n(), 1);
22511 var import_jsx_runtime88 = __toESM(require_jsx_runtime(), 1);
22512 function FiltersToggle() {
22513 const {
22514 filters,
22515 view,
22516 onChangeView,
22517 setOpenedFilter,
22518 isShowingFilter,
22519 setIsShowingFilter
22520 } = (0, import_element58.useContext)(dataviews_context_default);
22521 const buttonRef = (0, import_element58.useRef)(null);
22522 const onChangeViewWithFilterVisibility = (0, import_element58.useCallback)(
22523 (_view) => {
22524 onChangeView(_view);
22525 setIsShowingFilter(true);
22526 },
22527 [onChangeView, setIsShowingFilter]
22528 );
22529 if (filters.length === 0) {
22530 return null;
22531 }
22532 const hasVisibleFilters = filters.some((filter) => filter.isVisible);
22533 const addFilterButtonProps = {
22534 label: (0, import_i18n29.__)("Add filter"),
22535 "aria-expanded": false,
22536 isPressed: false
22537 };
22538 const toggleFiltersButtonProps = {
22539 label: (0, import_i18n29._x)("Filter", "verb"),
22540 "aria-expanded": isShowingFilter,
22541 isPressed: isShowingFilter,
22542 onClick: () => {
22543 if (!isShowingFilter) {
22544 setOpenedFilter(null);
22545 }
22546 setIsShowingFilter(!isShowingFilter);
22547 }
22548 };
22549 const hasPrimaryOrLockedFilters = filters.some(
22550 (filter) => filter.isPrimary || filter.isLocked
22551 );
22552 const buttonComponent = /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
22553 import_components24.Button,
22554 {
22555 ref: buttonRef,
22556 className: "dataviews-filters__visibility-toggle",
22557 size: "compact",
22558 icon: funnel_default,
22559 disabled: hasPrimaryOrLockedFilters,
22560 accessibleWhenDisabled: true,
22561 ...hasVisibleFilters ? toggleFiltersButtonProps : addFilterButtonProps
22562 }
22563 );
22564 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("div", { className: "dataviews-filters__container-visibility-toggle", children: !hasVisibleFilters ? /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
22565 AddFilterMenu,
22566 {
22567 filters,
22568 view,
22569 onChangeView: onChangeViewWithFilterVisibility,
22570 setOpenedFilter,
22571 triggerProps: { render: buttonComponent }
22572 }
22573 ) : /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
22574 FilterVisibilityToggle,
22575 {
22576 buttonRef,
22577 filtersCount: view.filters?.length,
22578 children: buttonComponent
22579 }
22580 ) });
22581 }
22582 function FilterVisibilityToggle({
22583 buttonRef,
22584 filtersCount,
22585 children
22586 }) {
22587 (0, import_element58.useEffect)(
22588 () => () => {
22589 buttonRef.current?.focus();
22590 },
22591 [buttonRef]
22592 );
22593 return /* @__PURE__ */ (0, import_jsx_runtime88.jsxs)(import_jsx_runtime88.Fragment, { children: [
22594 children,
22595 !!filtersCount && /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("span", { className: "dataviews-filters-toggle__count", children: filtersCount })
22596 ] });
22597 }
22598 var toggle_default = FiltersToggle;
22599
22600 // packages/dataviews/build-module/components/dataviews-filters/filters-toggled.mjs
22601 var import_element59 = __toESM(require_element(), 1);
22602 var import_jsx_runtime89 = __toESM(require_jsx_runtime(), 1);
22603 function FiltersToggled(props) {
22604 const { isShowingFilter } = (0, import_element59.useContext)(dataviews_context_default);
22605 if (!isShowingFilter) {
22606 return null;
22607 }
22608 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(filters_default, { ...props });
22609 }
22610 var filters_toggled_default = FiltersToggled;
22611
22612 // packages/dataviews/build-module/components/dataviews-layout/index.mjs
22613 var import_element60 = __toESM(require_element(), 1);
22614 var import_components25 = __toESM(require_components(), 1);
22615 var import_i18n30 = __toESM(require_i18n(), 1);
22616 var import_jsx_runtime90 = __toESM(require_jsx_runtime(), 1);
22617 function DataViewsLayout({ className }) {
22618 const {
22619 actions = [],
22620 data,
22621 fields,
22622 getItemId,
22623 getItemLevel,
22624 hasInitiallyLoaded,
22625 isLoading,
22626 view,
22627 onChangeView,
22628 selection,
22629 onChangeSelection,
22630 setOpenedFilter,
22631 onClickItem,
22632 isItemClickable,
22633 renderItemLink,
22634 defaultLayouts,
22635 containerRef,
22636 empty = /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { children: (0, import_i18n30.__)("No results") })
22637 } = (0, import_element60.useContext)(dataviews_context_default);
22638 const isDelayedInitialLoading = useDelayedLoading(!hasInitiallyLoaded, {
22639 delay: 200
22640 });
22641 if (!hasInitiallyLoaded) {
22642 if (!isDelayedInitialLoading) {
22643 return null;
22644 }
22645 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { className: "dataviews-loading", children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_components25.Spinner, {}) }) });
22646 }
22647 const ViewComponent = VIEW_LAYOUTS.find(
22648 (v2) => v2.type === view.type && defaultLayouts[v2.type]
22649 )?.component;
22650 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { className: "dataviews-layout__container", ref: containerRef, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
22651 ViewComponent,
22652 {
22653 className,
22654 actions,
22655 data,
22656 fields,
22657 getItemId,
22658 getItemLevel,
22659 isLoading,
22660 onChangeView,
22661 onChangeSelection,
22662 selection,
22663 setOpenedFilter,
22664 onClickItem,
22665 renderItemLink,
22666 isItemClickable,
22667 view,
22668 empty
22669 }
22670 ) });
22671 }
22672
22673 // packages/dataviews/build-module/components/dataviews-footer/index.mjs
22674 var import_element61 = __toESM(require_element(), 1);
22675 var import_jsx_runtime91 = __toESM(require_jsx_runtime(), 1);
22676 var EMPTY_ARRAY5 = [];
22677 function DataViewsFooter() {
22678 const {
22679 view,
22680 paginationInfo: { totalItems = 0, totalPages },
22681 data,
22682 actions = EMPTY_ARRAY5,
22683 isLoading,
22684 hasInitiallyLoaded
22685 } = (0, import_element61.useContext)(dataviews_context_default);
22686 const isRefreshing = !!isLoading && hasInitiallyLoaded && !!data?.length;
22687 const isDelayedRefreshing = useDelayedLoading(!!isRefreshing);
22688 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data) && [LAYOUT_TABLE, LAYOUT_GRID].includes(view.type);
22689 const hasPagination = hasPaginationControls(view, {
22690 totalItems,
22691 totalPages
22692 });
22693 if (!totalItems || !hasBulkActions && !hasPagination) {
22694 return null;
22695 }
22696 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22697 "div",
22698 {
22699 className: "dataviews-footer",
22700 inert: isRefreshing ? "true" : void 0,
22701 children: /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(
22702 Stack,
22703 {
22704 direction: "row",
22705 justify: "end",
22706 align: "center",
22707 className: clsx_default("dataviews-footer__content", {
22708 "is-refreshing": isDelayedRefreshing
22709 }),
22710 gap: "sm",
22711 children: [
22712 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(BulkActionsFooter, {}),
22713 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(dataviews_pagination_default, {})
22714 ]
22715 }
22716 )
22717 }
22718 );
22719 }
22720
22721 // packages/dataviews/build-module/components/dataviews-search/index.mjs
22722 var import_i18n31 = __toESM(require_i18n(), 1);
22723 var import_element62 = __toESM(require_element(), 1);
22724 var import_components26 = __toESM(require_components(), 1);
22725 var import_compose10 = __toESM(require_compose(), 1);
22726 var import_jsx_runtime92 = __toESM(require_jsx_runtime(), 1);
22727 var DataViewsSearch = (0, import_element62.memo)(function Search({ label }) {
22728 const { view, onChangeView } = (0, import_element62.useContext)(dataviews_context_default);
22729 const [search, setSearch, debouncedSearch] = (0, import_compose10.useDebouncedInput)(
22730 view.search
22731 );
22732 (0, import_element62.useEffect)(() => {
22733 if (view.search !== debouncedSearch) {
22734 setSearch(view.search ?? "");
22735 }
22736 }, [view.search, setSearch]);
22737 const onChangeViewRef = (0, import_element62.useRef)(onChangeView);
22738 const viewRef = (0, import_element62.useRef)(view);
22739 (0, import_element62.useEffect)(() => {
22740 onChangeViewRef.current = onChangeView;
22741 viewRef.current = view;
22742 }, [onChangeView, view]);
22743 (0, import_element62.useEffect)(() => {
22744 if (debouncedSearch !== viewRef.current?.search) {
22745 onChangeViewRef.current({
22746 ...viewRef.current,
22747 page: view.page ? 1 : void 0,
22748 startPosition: view.startPosition ? 1 : void 0,
22749 search: debouncedSearch
22750 });
22751 }
22752 }, [debouncedSearch]);
22753 const searchLabel = label || (0, import_i18n31.__)("Search");
22754 return /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
22755 import_components26.SearchControl,
22756 {
22757 className: "dataviews-search",
22758 onChange: setSearch,
22759 value: search,
22760 label: searchLabel,
22761 placeholder: searchLabel,
22762 size: "compact"
22763 }
22764 );
22765 });
22766 var dataviews_search_default = DataViewsSearch;
22767
22768 // packages/dataviews/build-module/components/dataviews-view-config/index.mjs
22769 var import_components27 = __toESM(require_components(), 1);
22770 var import_i18n32 = __toESM(require_i18n(), 1);
22771 var import_element63 = __toESM(require_element(), 1);
22772 var import_warning = __toESM(require_warning(), 1);
22773 var import_compose11 = __toESM(require_compose(), 1);
22774 var import_jsx_runtime93 = __toESM(require_jsx_runtime(), 1);
22775 var { Menu: Menu5 } = unlock2(import_components27.privateApis);
22776 var DATAVIEWS_CONFIG_POPOVER_PROPS = {
22777 className: "dataviews-config__popover",
22778 placement: "bottom-end",
22779 offset: 9
22780 };
22781 function ViewTypeMenu() {
22782 const { view, onChangeView, defaultLayouts } = (0, import_element63.useContext)(dataviews_context_default);
22783 const availableLayouts = Object.keys(defaultLayouts);
22784 if (availableLayouts.length <= 1) {
22785 return null;
22786 }
22787 const activeView = VIEW_LAYOUTS.find((v2) => view.type === v2.type);
22788 return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(Menu5, { children: [
22789 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22790 Menu5.TriggerButton,
22791 {
22792 render: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22793 import_components27.Button,
22794 {
22795 size: "compact",
22796 icon: activeView?.icon,
22797 label: (0, import_i18n32.__)("Layout")
22798 }
22799 )
22800 }
22801 ),
22802 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(Menu5.Popover, { children: availableLayouts.map((layout) => {
22803 const config = VIEW_LAYOUTS.find(
22804 (v2) => v2.type === layout
22805 );
22806 if (!config) {
22807 return null;
22808 }
22809 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22810 Menu5.RadioItem,
22811 {
22812 value: layout,
22813 name: "view-actions-available-view",
22814 checked: layout === view.type,
22815 hideOnClick: true,
22816 onChange: (e2) => {
22817 switch (e2.target.value) {
22818 case "list":
22819 case "grid":
22820 case "table":
22821 case "pickerGrid":
22822 case "pickerTable":
22823 case "pickerActivity":
22824 case "activity":
22825 const viewWithoutLayout = { ...view };
22826 if ("layout" in viewWithoutLayout) {
22827 delete viewWithoutLayout.layout;
22828 }
22829 return onChangeView({
22830 ...viewWithoutLayout,
22831 type: e2.target.value,
22832 ...defaultLayouts[e2.target.value]
22833 });
22834 }
22835 (0, import_warning.default)("Invalid dataview");
22836 },
22837 children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(Menu5.ItemLabel, { children: config.label })
22838 },
22839 layout
22840 );
22841 }) })
22842 ] });
22843 }
22844 function SortFieldControl() {
22845 const { view, fields, onChangeView } = (0, import_element63.useContext)(dataviews_context_default);
22846 const orderOptions = (0, import_element63.useMemo)(() => {
22847 const sortableFields = fields.filter(
22848 (field) => field.enableSorting !== false
22849 );
22850 return sortableFields.map((field) => {
22851 return {
22852 label: field.label,
22853 value: field.id
22854 };
22855 });
22856 }, [fields]);
22857 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22858 import_components27.SelectControl,
22859 {
22860 label: (0, import_i18n32.__)("Sort by"),
22861 value: view.sort?.field,
22862 options: orderOptions,
22863 onChange: (value) => {
22864 onChangeView({
22865 ...view,
22866 sort: {
22867 direction: view?.sort?.direction || "desc",
22868 field: value
22869 },
22870 showLevels: false
22871 });
22872 }
22873 }
22874 );
22875 }
22876 function SortDirectionControl() {
22877 const { view, fields, onChangeView } = (0, import_element63.useContext)(dataviews_context_default);
22878 const sortableFields = fields.filter(
22879 (field) => field.enableSorting !== false
22880 );
22881 if (sortableFields.length === 0) {
22882 return null;
22883 }
22884 let value = view.sort?.direction;
22885 if (!value && view.sort?.field) {
22886 value = "desc";
22887 }
22888 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22889 import_components27.__experimentalToggleGroupControl,
22890 {
22891 className: "dataviews-view-config__sort-direction",
22892 isBlock: true,
22893 label: (0, import_i18n32.__)("Order"),
22894 value,
22895 onChange: (newDirection) => {
22896 if (newDirection === "asc" || newDirection === "desc") {
22897 onChangeView({
22898 ...view,
22899 sort: {
22900 direction: newDirection,
22901 field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field.
22902 fields.find(
22903 (field) => field.enableSorting !== false
22904 )?.id || ""
22905 },
22906 showLevels: false
22907 });
22908 return;
22909 }
22910 (0, import_warning.default)("Invalid direction");
22911 },
22912 children: SORTING_DIRECTIONS.map((direction) => {
22913 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22914 import_components27.__experimentalToggleGroupControlOptionIcon,
22915 {
22916 value: direction,
22917 icon: sortIcons[direction],
22918 label: sortLabels[direction]
22919 },
22920 direction
22921 );
22922 })
22923 }
22924 );
22925 }
22926 function ItemsPerPageControl() {
22927 const { view, config, onChangeView } = (0, import_element63.useContext)(dataviews_context_default);
22928 const { infiniteScrollEnabled } = view;
22929 if (!config || !config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled) {
22930 return null;
22931 }
22932 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22933 import_components27.__experimentalToggleGroupControl,
22934 {
22935 isBlock: true,
22936 label: (0, import_i18n32.__)("Items per page"),
22937 value: view.perPage || 10,
22938 disabled: !view?.sort?.field,
22939 onChange: (newItemsPerPage) => {
22940 const newItemsPerPageNumber = typeof newItemsPerPage === "number" || newItemsPerPage === void 0 ? newItemsPerPage : parseInt(newItemsPerPage, 10);
22941 onChangeView({
22942 ...view,
22943 perPage: newItemsPerPageNumber,
22944 page: 1
22945 });
22946 },
22947 children: config.perPageSizes.map((value) => {
22948 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22949 import_components27.__experimentalToggleGroupControlOption,
22950 {
22951 value,
22952 label: value.toString()
22953 },
22954 value
22955 );
22956 })
22957 }
22958 );
22959 }
22960 function ResetViewButton() {
22961 const { onReset } = (0, import_element63.useContext)(dataviews_context_default);
22962 if (onReset === void 0) {
22963 return null;
22964 }
22965 const isDisabled = onReset === false;
22966 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22967 import_components27.Button,
22968 {
22969 variant: "tertiary",
22970 size: "compact",
22971 disabled: isDisabled,
22972 accessibleWhenDisabled: true,
22973 className: "dataviews-view-config__reset-button",
22974 onClick: () => {
22975 if (typeof onReset === "function") {
22976 onReset();
22977 }
22978 },
22979 children: (0, import_i18n32.__)("Reset view")
22980 }
22981 );
22982 }
22983 function DataviewsViewConfigDropdown() {
22984 const { view, onReset } = (0, import_element63.useContext)(dataviews_context_default);
22985 const popoverId = (0, import_compose11.useInstanceId)(
22986 _DataViewsViewConfig,
22987 "dataviews-view-config-dropdown"
22988 );
22989 const activeLayout = VIEW_LAYOUTS.find(
22990 (layout) => layout.type === view.type
22991 );
22992 const isModified = typeof onReset === "function";
22993 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
22994 import_components27.Dropdown,
22995 {
22996 expandOnMobile: true,
22997 popoverProps: {
22998 ...DATAVIEWS_CONFIG_POPOVER_PROPS,
22999 id: popoverId
23000 },
23001 renderToggle: ({ onToggle, isOpen }) => {
23002 return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)("div", { className: "dataviews-view-config__toggle-wrapper", children: [
23003 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
23004 import_components27.Button,
23005 {
23006 size: "compact",
23007 icon: cog_default,
23008 label: (0, import_i18n32._x)(
23009 "View options",
23010 "View is used as a noun"
23011 ),
23012 onClick: onToggle,
23013 "aria-expanded": isOpen ? "true" : "false",
23014 "aria-controls": popoverId
23015 }
23016 ),
23017 isModified && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("span", { className: "dataviews-view-config__modified-indicator" })
23018 ] });
23019 },
23020 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
23021 import_components27.__experimentalDropdownContentWrapper,
23022 {
23023 paddingSize: "medium",
23024 className: "dataviews-config__popover-content-wrapper",
23025 children: /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
23026 Stack,
23027 {
23028 direction: "column",
23029 className: "dataviews-view-config",
23030 gap: "xl",
23031 children: [
23032 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
23033 Stack,
23034 {
23035 direction: "row",
23036 justify: "space-between",
23037 align: "center",
23038 className: "dataviews-view-config__header",
23039 children: [
23040 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
23041 import_components27.__experimentalHeading,
23042 {
23043 level: 2,
23044 className: "dataviews-settings-section__title",
23045 children: (0, import_i18n32.__)("Appearance")
23046 }
23047 ),
23048 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(ResetViewButton, {})
23049 ]
23050 }
23051 ),
23052 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23053 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
23054 Stack,
23055 {
23056 direction: "row",
23057 gap: "sm",
23058 className: "dataviews-view-config__sort-controls",
23059 children: [
23060 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(SortFieldControl, {}),
23061 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(SortDirectionControl, {})
23062 ]
23063 }
23064 ),
23065 !!activeLayout?.viewConfigOptions && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(activeLayout.viewConfigOptions, {}),
23066 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(ItemsPerPageControl, {}),
23067 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(PropertiesSection, {})
23068 ] })
23069 ]
23070 }
23071 )
23072 }
23073 )
23074 }
23075 );
23076 }
23077 function _DataViewsViewConfig() {
23078 return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_jsx_runtime93.Fragment, { children: [
23079 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(ViewTypeMenu, {}),
23080 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(DataviewsViewConfigDropdown, {})
23081 ] });
23082 }
23083 var DataViewsViewConfig = (0, import_element63.memo)(_DataViewsViewConfig);
23084 var dataviews_view_config_default = DataViewsViewConfig;
23085
23086 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
23087 var import_components28 = __toESM(require_components(), 1);
23088 var import_element64 = __toESM(require_element(), 1);
23089
23090 // packages/dataviews/build-module/components/dataform-controls/utils/get-custom-validity.mjs
23091 function getCustomValidity(isValid2, validity) {
23092 let customValidity;
23093 if (isValid2?.required && validity?.required) {
23094 customValidity = validity?.required?.message ? validity.required : void 0;
23095 } else if (isValid2?.pattern && validity?.pattern) {
23096 customValidity = validity.pattern;
23097 } else if (isValid2?.min && validity?.min) {
23098 customValidity = validity.min;
23099 } else if (isValid2?.max && validity?.max) {
23100 customValidity = validity.max;
23101 } else if (isValid2?.minLength && validity?.minLength) {
23102 customValidity = validity.minLength;
23103 } else if (isValid2?.maxLength && validity?.maxLength) {
23104 customValidity = validity.maxLength;
23105 } else if (isValid2?.elements && validity?.elements) {
23106 customValidity = validity.elements;
23107 } else if (validity?.custom) {
23108 customValidity = validity.custom;
23109 }
23110 return customValidity;
23111 }
23112
23113 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
23114 var import_jsx_runtime94 = __toESM(require_jsx_runtime(), 1);
23115 var { ValidatedCheckboxControl } = unlock2(import_components28.privateApis);
23116 function Checkbox({
23117 field,
23118 onChange,
23119 data,
23120 hideLabelFromVision,
23121 markWhenOptional,
23122 validity
23123 }) {
23124 const { getValue, setValue, label, description, isValid: isValid2 } = field;
23125 const disabled2 = field.isDisabled({ item: data, field });
23126 const onChangeControl = (0, import_element64.useCallback)(() => {
23127 onChange(
23128 setValue({ item: data, value: !getValue({ item: data }) })
23129 );
23130 }, [data, getValue, onChange, setValue]);
23131 return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
23132 ValidatedCheckboxControl,
23133 {
23134 required: !!field.isValid?.required,
23135 markWhenOptional,
23136 customValidity: getCustomValidity(isValid2, validity),
23137 hidden: hideLabelFromVision,
23138 label,
23139 help: description,
23140 checked: getValue({ item: data }),
23141 onChange: onChangeControl,
23142 disabled: disabled2
23143 }
23144 );
23145 }
23146
23147 // packages/dataviews/build-module/components/dataform-controls/combobox.mjs
23148 var import_components29 = __toESM(require_components(), 1);
23149 var import_element65 = __toESM(require_element(), 1);
23150 var import_jsx_runtime95 = __toESM(require_jsx_runtime(), 1);
23151 var { ValidatedComboboxControl } = unlock2(import_components29.privateApis);
23152 function Combobox3({
23153 data,
23154 field,
23155 onChange,
23156 hideLabelFromVision,
23157 validity
23158 }) {
23159 const { label, description, placeholder, getValue, setValue, isValid: isValid2 } = field;
23160 const value = getValue({ item: data }) ?? "";
23161 const onChangeControl = (0, import_element65.useCallback)(
23162 (newValue) => onChange(setValue({ item: data, value: newValue ?? "" })),
23163 [data, onChange, setValue]
23164 );
23165 const { elements, isLoading } = useElements({
23166 elements: field.elements,
23167 getElements: field.getElements
23168 });
23169 if (isLoading) {
23170 return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(import_components29.Spinner, {});
23171 }
23172 return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
23173 ValidatedComboboxControl,
23174 {
23175 required: !!field.isValid?.required,
23176 customValidity: getCustomValidity(isValid2, validity),
23177 label,
23178 value,
23179 help: description,
23180 placeholder,
23181 options: elements,
23182 onChange: onChangeControl,
23183 hideLabelFromVision,
23184 allowReset: true,
23185 expandOnFocus: true
23186 }
23187 );
23188 }
23189
23190 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
23191 var import_components31 = __toESM(require_components(), 1);
23192 var import_element68 = __toESM(require_element(), 1);
23193 var import_i18n34 = __toESM(require_i18n(), 1);
23194 var import_date3 = __toESM(require_date(), 1);
23195
23196 // packages/dataviews/build-module/components/dataform-controls/utils/relative-date-control.mjs
23197 var import_components30 = __toESM(require_components(), 1);
23198 var import_element66 = __toESM(require_element(), 1);
23199 var import_i18n33 = __toESM(require_i18n(), 1);
23200 var import_jsx_runtime96 = __toESM(require_jsx_runtime(), 1);
23201 var TIME_UNITS_OPTIONS = {
23202 [OPERATOR_IN_THE_PAST]: [
23203 { value: "days", label: (0, import_i18n33.__)("Days") },
23204 { value: "weeks", label: (0, import_i18n33.__)("Weeks") },
23205 { value: "months", label: (0, import_i18n33.__)("Months") },
23206 { value: "years", label: (0, import_i18n33.__)("Years") }
23207 ],
23208 [OPERATOR_OVER]: [
23209 { value: "days", label: (0, import_i18n33.__)("Days ago") },
23210 { value: "weeks", label: (0, import_i18n33.__)("Weeks ago") },
23211 { value: "months", label: (0, import_i18n33.__)("Months ago") },
23212 { value: "years", label: (0, import_i18n33.__)("Years ago") }
23213 ]
23214 };
23215 function RelativeDateControl({
23216 className,
23217 data,
23218 field,
23219 onChange,
23220 hideLabelFromVision,
23221 operator
23222 }) {
23223 const options = TIME_UNITS_OPTIONS[operator === OPERATOR_IN_THE_PAST ? "inThePast" : "over"];
23224 const { id, label, description, getValue, setValue } = field;
23225 const disabled2 = field.isDisabled({ item: data, field });
23226 const fieldValue = getValue({ item: data });
23227 const { value: relValue = "", unit = options[0].value } = fieldValue && typeof fieldValue === "object" ? fieldValue : {};
23228 const onChangeValue = (0, import_element66.useCallback)(
23229 (newValue) => onChange(
23230 setValue({
23231 item: data,
23232 value: { value: Number(newValue), unit }
23233 })
23234 ),
23235 [onChange, setValue, data, unit]
23236 );
23237 const onChangeUnit = (0, import_element66.useCallback)(
23238 (newUnit) => onChange(
23239 setValue({
23240 item: data,
23241 value: { value: relValue, unit: newUnit }
23242 })
23243 ),
23244 [onChange, setValue, data, relValue]
23245 );
23246 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23247 import_components30.BaseControl,
23248 {
23249 id,
23250 className: clsx_default(className, "dataviews-controls__relative-date"),
23251 label,
23252 hideLabelFromVision,
23253 help: description,
23254 children: /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(Stack, { direction: "row", gap: "sm", children: [
23255 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23256 import_components30.__experimentalNumberControl,
23257 {
23258 className: "dataviews-controls__relative-date-number",
23259 spinControls: "none",
23260 min: 1,
23261 step: 1,
23262 value: relValue,
23263 onChange: onChangeValue,
23264 disabled: disabled2
23265 }
23266 ),
23267 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23268 import_components30.SelectControl,
23269 {
23270 className: "dataviews-controls__relative-date-unit",
23271 label: (0, import_i18n33.__)("Unit"),
23272 value: unit,
23273 options,
23274 onChange: onChangeUnit,
23275 hideLabelFromVision: true,
23276 disabled: disabled2
23277 }
23278 )
23279 ] })
23280 }
23281 );
23282 }
23283
23284 // packages/dataviews/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs
23285 var import_element67 = __toESM(require_element(), 1);
23286 function useDisabledDateMatchers(isValid2, parseDateFn) {
23287 const minConstraint = typeof isValid2.min?.constraint === "string" ? isValid2.min.constraint : void 0;
23288 const maxConstraint = typeof isValid2.max?.constraint === "string" ? isValid2.max.constraint : void 0;
23289 const disabledMatchers = (0, import_element67.useMemo)(() => {
23290 const matchers = [];
23291 if (minConstraint) {
23292 const minDate = parseDateFn(minConstraint);
23293 if (minDate) {
23294 matchers.push({ before: minDate });
23295 }
23296 }
23297 if (maxConstraint) {
23298 const maxDate = parseDateFn(maxConstraint);
23299 if (maxDate) {
23300 matchers.push({ after: maxDate });
23301 }
23302 }
23303 return matchers.length > 0 ? matchers : void 0;
23304 }, [minConstraint, maxConstraint, parseDateFn]);
23305 return { minConstraint, maxConstraint, disabledMatchers };
23306 }
23307
23308 // packages/dataviews/build-module/field-types/utils/parse-date-time.mjs
23309 var import_date2 = __toESM(require_date(), 1);
23310 function parseDateTime(dateTimeString) {
23311 if (!dateTimeString) {
23312 return null;
23313 }
23314 const parsed = (0, import_date2.getDate)(dateTimeString);
23315 return parsed && isValid(parsed) ? parsed : null;
23316 }
23317
23318 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
23319 var import_jsx_runtime97 = __toESM(require_jsx_runtime(), 1);
23320 var { DateCalendar, ValidatedInputControl } = unlock2(import_components31.privateApis);
23321 var formatDateTime = (value) => {
23322 if (!value) {
23323 return "";
23324 }
23325 return (0, import_date3.dateI18n)("Y-m-d\\TH:i", (0, import_date3.getDate)(value));
23326 };
23327 function CalendarDateTimeControl({
23328 data,
23329 field,
23330 onChange,
23331 hideLabelFromVision,
23332 markWhenOptional,
23333 validity,
23334 config
23335 }) {
23336 const { compact } = config || {};
23337 const { id, label, description, setValue, getValue, isValid: isValid2 } = field;
23338 const disabled2 = field.isDisabled({ item: data, field });
23339 const fieldValue = getValue({ item: data });
23340 const value = typeof fieldValue === "string" ? fieldValue : void 0;
23341 const [calendarMonth, setCalendarMonth] = (0, import_element68.useState)(() => {
23342 const parsedDate = parseDateTime(value);
23343 return parsedDate || /* @__PURE__ */ new Date();
23344 });
23345 const inputControlRef = (0, import_element68.useRef)(null);
23346 const validationTimeoutRef = (0, import_element68.useRef)(void 0);
23347 const previousFocusRef = (0, import_element68.useRef)(null);
23348 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDateTime);
23349 const onChangeCallback = (0, import_element68.useCallback)(
23350 (newValue) => onChange(setValue({ item: data, value: newValue })),
23351 [data, onChange, setValue]
23352 );
23353 (0, import_element68.useEffect)(() => {
23354 return () => {
23355 if (validationTimeoutRef.current) {
23356 clearTimeout(validationTimeoutRef.current);
23357 }
23358 };
23359 }, []);
23360 const onSelectDate = (0, import_element68.useCallback)(
23361 (newDate) => {
23362 let dateTimeValue;
23363 if (newDate) {
23364 const wpDate = (0, import_date3.dateI18n)("Y-m-d", newDate);
23365 let wpTime;
23366 if (value) {
23367 wpTime = (0, import_date3.dateI18n)("H:i", (0, import_date3.getDate)(value));
23368 } else {
23369 wpTime = (0, import_date3.dateI18n)("H:i", newDate);
23370 }
23371 const finalDateTime = (0, import_date3.getDate)(`${wpDate}T${wpTime}`);
23372 dateTimeValue = finalDateTime.toISOString();
23373 onChangeCallback(dateTimeValue);
23374 if (validationTimeoutRef.current) {
23375 clearTimeout(validationTimeoutRef.current);
23376 }
23377 } else {
23378 onChangeCallback(void 0);
23379 }
23380 previousFocusRef.current = inputControlRef.current && inputControlRef.current.ownerDocument.activeElement;
23381 validationTimeoutRef.current = setTimeout(() => {
23382 if (inputControlRef.current) {
23383 inputControlRef.current.focus();
23384 inputControlRef.current.blur();
23385 onChangeCallback(dateTimeValue);
23386 if (previousFocusRef.current && previousFocusRef.current instanceof HTMLElement) {
23387 previousFocusRef.current.focus();
23388 }
23389 }
23390 }, 0);
23391 },
23392 [onChangeCallback, value]
23393 );
23394 const handleManualDateTimeChange = (0, import_element68.useCallback)(
23395 (newValue) => {
23396 if (newValue) {
23397 const dateTime = (0, import_date3.getDate)(newValue);
23398 onChangeCallback(dateTime.toISOString());
23399 const parsedDate = parseDateTime(dateTime.toISOString());
23400 if (parsedDate) {
23401 setCalendarMonth(parsedDate);
23402 }
23403 } else {
23404 onChangeCallback(void 0);
23405 }
23406 },
23407 [onChangeCallback]
23408 );
23409 const { format: fieldFormat } = field;
23410 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek;
23411 const {
23412 timezone: { string: timezoneString }
23413 } = (0, import_date3.getSettings)();
23414 let displayLabel = label;
23415 if (isValid2?.required && !markWhenOptional && !hideLabelFromVision) {
23416 displayLabel = `${label} (${(0, import_i18n34.__)("Required")})`;
23417 } else if (!isValid2?.required && markWhenOptional && !hideLabelFromVision) {
23418 displayLabel = `${label} (${(0, import_i18n34.__)("Optional")})`;
23419 }
23420 return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
23421 import_components31.BaseControl,
23422 {
23423 id,
23424 label: displayLabel,
23425 help: description,
23426 hideLabelFromVision,
23427 children: /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23428 /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
23429 ValidatedInputControl,
23430 {
23431 ref: inputControlRef,
23432 required: !!isValid2?.required,
23433 customValidity: getCustomValidity(isValid2, validity),
23434 type: "datetime-local",
23435 label: (0, import_i18n34.__)("Date time"),
23436 hideLabelFromVision: true,
23437 value: formatDateTime(value),
23438 onChange: handleManualDateTimeChange,
23439 disabled: disabled2,
23440 min: minConstraint ? formatDateTime(minConstraint) : void 0,
23441 max: maxConstraint ? formatDateTime(maxConstraint) : void 0
23442 }
23443 ),
23444 !compact && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
23445 DateCalendar,
23446 {
23447 style: { width: "100%" },
23448 selected: value ? parseDateTime(value) || void 0 : void 0,
23449 onSelect: onSelectDate,
23450 month: calendarMonth,
23451 onMonthChange: setCalendarMonth,
23452 timeZone: timezoneString || void 0,
23453 weekStartsOn,
23454 disabled: disabled2 || disabledMatchers
23455 }
23456 )
23457 ] })
23458 }
23459 );
23460 }
23461 function DateTime({
23462 data,
23463 field,
23464 onChange,
23465 hideLabelFromVision,
23466 markWhenOptional,
23467 operator,
23468 validity,
23469 config
23470 }) {
23471 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
23472 return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
23473 RelativeDateControl,
23474 {
23475 className: "dataviews-controls__datetime",
23476 data,
23477 field,
23478 onChange,
23479 hideLabelFromVision,
23480 operator
23481 }
23482 );
23483 }
23484 return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
23485 CalendarDateTimeControl,
23486 {
23487 data,
23488 field,
23489 onChange,
23490 hideLabelFromVision,
23491 markWhenOptional,
23492 validity,
23493 config
23494 }
23495 );
23496 }
23497
23498 // packages/dataviews/build-module/components/dataform-controls/date.mjs
23499 var import_components32 = __toESM(require_components(), 1);
23500 var import_element69 = __toESM(require_element(), 1);
23501 var import_i18n35 = __toESM(require_i18n(), 1);
23502 var import_date4 = __toESM(require_date(), 1);
23503 import { speak } from "@wordpress/a11y";
23504 var import_jsx_runtime98 = __toESM(require_jsx_runtime(), 1);
23505 var { DateCalendar: DateCalendar2, DateRangeCalendar } = unlock2(import_components32.privateApis);
23506 var DATE_PRESETS = [
23507 {
23508 id: "today",
23509 label: (0, import_i18n35.__)("Today"),
23510 getValue: () => (0, import_date4.getDate)(null)
23511 },
23512 {
23513 id: "yesterday",
23514 label: (0, import_i18n35.__)("Yesterday"),
23515 getValue: () => {
23516 const today = (0, import_date4.getDate)(null);
23517 return subDays(today, 1);
23518 }
23519 },
23520 {
23521 id: "past-week",
23522 label: (0, import_i18n35.__)("Past week"),
23523 getValue: () => {
23524 const today = (0, import_date4.getDate)(null);
23525 return subDays(today, 7);
23526 }
23527 },
23528 {
23529 id: "past-month",
23530 label: (0, import_i18n35.__)("Past month"),
23531 getValue: () => {
23532 const today = (0, import_date4.getDate)(null);
23533 return subMonths(today, 1);
23534 }
23535 }
23536 ];
23537 var DATE_RANGE_PRESETS = [
23538 {
23539 id: "last-7-days",
23540 label: (0, import_i18n35.__)("Last 7 days"),
23541 getValue: () => {
23542 const today = (0, import_date4.getDate)(null);
23543 return [subDays(today, 7), today];
23544 }
23545 },
23546 {
23547 id: "last-30-days",
23548 label: (0, import_i18n35.__)("Last 30 days"),
23549 getValue: () => {
23550 const today = (0, import_date4.getDate)(null);
23551 return [subDays(today, 30), today];
23552 }
23553 },
23554 {
23555 id: "month-to-date",
23556 label: (0, import_i18n35.__)("Month to date"),
23557 getValue: () => {
23558 const today = (0, import_date4.getDate)(null);
23559 return [startOfMonth(today), today];
23560 }
23561 },
23562 {
23563 id: "last-year",
23564 label: (0, import_i18n35.__)("Last year"),
23565 getValue: () => {
23566 const today = (0, import_date4.getDate)(null);
23567 return [subYears(today, 1), today];
23568 }
23569 },
23570 {
23571 id: "year-to-date",
23572 label: (0, import_i18n35.__)("Year to date"),
23573 getValue: () => {
23574 const today = (0, import_date4.getDate)(null);
23575 return [startOfYear(today), today];
23576 }
23577 }
23578 ];
23579 var parseDate = (dateString) => {
23580 if (!dateString) {
23581 return null;
23582 }
23583 const parsed = (0, import_date4.getDate)(dateString);
23584 return parsed && isValid(parsed) ? parsed : null;
23585 };
23586 var formatDate = (date) => {
23587 if (!date) {
23588 return "";
23589 }
23590 return typeof date === "string" ? date : format(date, "yyyy-MM-dd");
23591 };
23592 function ValidatedDateControl({
23593 field,
23594 validity,
23595 inputRefs,
23596 isTouched,
23597 setIsTouched,
23598 children
23599 }) {
23600 const { isValid: isValid2 } = field;
23601 const [customValidity, setCustomValidity] = (0, import_element69.useState)(void 0);
23602 const validateRefs = (0, import_element69.useCallback)(() => {
23603 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
23604 for (const ref of refs) {
23605 const input = ref.current;
23606 if (input && !input.validity.valid) {
23607 setCustomValidity({
23608 type: "invalid",
23609 message: input.validationMessage
23610 });
23611 return;
23612 }
23613 }
23614 setCustomValidity(void 0);
23615 }, [inputRefs]);
23616 (0, import_element69.useEffect)(() => {
23617 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
23618 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
23619 for (const ref of refs) {
23620 const input = ref.current;
23621 if (input) {
23622 input.setCustomValidity(
23623 result?.type === "invalid" && result.message ? result.message : ""
23624 );
23625 }
23626 }
23627 }, [inputRefs, isValid2, validity]);
23628 (0, import_element69.useEffect)(() => {
23629 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
23630 const handleInvalid = (event) => {
23631 event.preventDefault();
23632 setIsTouched(true);
23633 };
23634 for (const ref of refs) {
23635 ref.current?.addEventListener("invalid", handleInvalid);
23636 }
23637 return () => {
23638 for (const ref of refs) {
23639 ref.current?.removeEventListener("invalid", handleInvalid);
23640 }
23641 };
23642 }, [inputRefs, setIsTouched]);
23643 (0, import_element69.useEffect)(() => {
23644 if (!isTouched) {
23645 return;
23646 }
23647 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
23648 if (result) {
23649 setCustomValidity(result);
23650 } else {
23651 validateRefs();
23652 }
23653 }, [isTouched, isValid2, validity, validateRefs]);
23654 (0, import_element69.useEffect)(() => {
23655 if (isTouched && customValidity?.message) {
23656 speak(customValidity.message);
23657 }
23658 }, [isTouched, customValidity?.message]);
23659 const onBlur = (event) => {
23660 if (isTouched) {
23661 return;
23662 }
23663 if (!event.relatedTarget || !event.currentTarget.contains(event.relatedTarget)) {
23664 setIsTouched(true);
23665 }
23666 };
23667 return /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("div", { onBlur, children: [
23668 children,
23669 customValidity && /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
23670 "p",
23671 {
23672 className: clsx_default(
23673 "components-validated-control__indicator",
23674 customValidity.type === "invalid" ? "is-invalid" : void 0
23675 ),
23676 children: [
23677 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23678 import_components32.Icon,
23679 {
23680 className: "components-validated-control__indicator-icon",
23681 icon: error_default,
23682 size: 16,
23683 fill: "currentColor"
23684 }
23685 ),
23686 customValidity.message
23687 ]
23688 }
23689 )
23690 ] });
23691 }
23692 function CalendarDateControl({
23693 data,
23694 field,
23695 onChange,
23696 hideLabelFromVision,
23697 markWhenOptional,
23698 validity
23699 }) {
23700 const {
23701 id,
23702 label,
23703 description,
23704 setValue,
23705 getValue,
23706 isValid: isValid2,
23707 format: fieldFormat
23708 } = field;
23709 const disabled2 = field.isDisabled({ item: data, field });
23710 const [selectedPresetId, setSelectedPresetId] = (0, import_element69.useState)(
23711 null
23712 );
23713 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
23714 const fieldValue = getValue({ item: data });
23715 const value = typeof fieldValue === "string" ? fieldValue : void 0;
23716 const [calendarMonth, setCalendarMonth] = (0, import_element69.useState)(() => {
23717 const parsedDate = parseDate(value);
23718 return parsedDate || /* @__PURE__ */ new Date();
23719 });
23720 const [isTouched, setIsTouched] = (0, import_element69.useState)(false);
23721 const validityTargetRef = (0, import_element69.useRef)(null);
23722 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDate);
23723 const onChangeCallback = (0, import_element69.useCallback)(
23724 (newValue) => onChange(setValue({ item: data, value: newValue })),
23725 [data, onChange, setValue]
23726 );
23727 const onSelectDate = (0, import_element69.useCallback)(
23728 (newDate) => {
23729 const dateValue = newDate ? format(newDate, "yyyy-MM-dd") : void 0;
23730 onChangeCallback(dateValue);
23731 setSelectedPresetId(null);
23732 setIsTouched(true);
23733 },
23734 [onChangeCallback]
23735 );
23736 const handlePresetClick = (0, import_element69.useCallback)(
23737 (preset) => {
23738 const presetDate = preset.getValue();
23739 const dateValue = formatDate(presetDate);
23740 setCalendarMonth(presetDate);
23741 onChangeCallback(dateValue);
23742 setSelectedPresetId(preset.id);
23743 setIsTouched(true);
23744 },
23745 [onChangeCallback]
23746 );
23747 const handleManualDateChange = (0, import_element69.useCallback)(
23748 (newValue) => {
23749 onChangeCallback(newValue);
23750 if (newValue) {
23751 const parsedDate = parseDate(newValue);
23752 if (parsedDate) {
23753 setCalendarMonth(parsedDate);
23754 }
23755 }
23756 setSelectedPresetId(null);
23757 setIsTouched(true);
23758 },
23759 [onChangeCallback]
23760 );
23761 const {
23762 timezone: { string: timezoneString }
23763 } = (0, import_date4.getSettings)();
23764 let displayLabel = label;
23765 if (isValid2?.required && !markWhenOptional) {
23766 displayLabel = `${label} (${(0, import_i18n35.__)("Required")})`;
23767 } else if (!isValid2?.required && markWhenOptional) {
23768 displayLabel = `${label} (${(0, import_i18n35.__)("Optional")})`;
23769 }
23770 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23771 ValidatedDateControl,
23772 {
23773 field,
23774 validity,
23775 inputRefs: validityTargetRef,
23776 isTouched,
23777 setIsTouched,
23778 children: /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23779 import_components32.BaseControl,
23780 {
23781 id,
23782 className: "dataviews-controls__date",
23783 label: displayLabel,
23784 help: description,
23785 hideLabelFromVision,
23786 children: /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23787 /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
23788 Stack,
23789 {
23790 direction: "row",
23791 gap: "sm",
23792 wrap: "wrap",
23793 justify: "flex-start",
23794 children: [
23795 DATE_PRESETS.map((preset) => {
23796 const isSelected2 = selectedPresetId === preset.id;
23797 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23798 import_components32.Button,
23799 {
23800 className: "dataviews-controls__date-preset",
23801 variant: "tertiary",
23802 isPressed: isSelected2,
23803 size: "small",
23804 disabled: disabled2,
23805 accessibleWhenDisabled: true,
23806 onClick: () => handlePresetClick(preset),
23807 children: preset.label
23808 },
23809 preset.id
23810 );
23811 }),
23812 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23813 import_components32.Button,
23814 {
23815 className: "dataviews-controls__date-preset",
23816 variant: "tertiary",
23817 isPressed: !selectedPresetId,
23818 size: "small",
23819 disabled: !!selectedPresetId || disabled2,
23820 accessibleWhenDisabled: true,
23821 children: (0, import_i18n35.__)("Custom")
23822 }
23823 )
23824 ]
23825 }
23826 ),
23827 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23828 import_components32.__experimentalInputControl,
23829 {
23830 ref: validityTargetRef,
23831 type: "date",
23832 label: (0, import_i18n35.__)("Date"),
23833 hideLabelFromVision: true,
23834 value,
23835 onChange: handleManualDateChange,
23836 required: !!field.isValid?.required,
23837 disabled: disabled2,
23838 min: minConstraint,
23839 max: maxConstraint
23840 }
23841 ),
23842 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23843 DateCalendar2,
23844 {
23845 style: { width: "100%" },
23846 selected: value ? parseDate(value) || void 0 : void 0,
23847 onSelect: onSelectDate,
23848 month: calendarMonth,
23849 onMonthChange: setCalendarMonth,
23850 timeZone: timezoneString || void 0,
23851 weekStartsOn,
23852 disabled: disabled2 || disabledMatchers,
23853 disableNavigation: disabled2
23854 }
23855 )
23856 ] })
23857 }
23858 )
23859 }
23860 );
23861 }
23862 function CalendarDateRangeControl({
23863 data,
23864 field,
23865 onChange,
23866 hideLabelFromVision,
23867 markWhenOptional,
23868 validity
23869 }) {
23870 const {
23871 id,
23872 label,
23873 description,
23874 getValue,
23875 setValue,
23876 isValid: isValid2,
23877 format: fieldFormat
23878 } = field;
23879 const disabled2 = field.isDisabled({ item: data, field });
23880 let value;
23881 const fieldValue = getValue({ item: data });
23882 if (Array.isArray(fieldValue) && fieldValue.length === 2 && fieldValue.every((date) => typeof date === "string")) {
23883 value = fieldValue;
23884 }
23885 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
23886 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDate);
23887 const onChangeCallback = (0, import_element69.useCallback)(
23888 (newValue) => {
23889 onChange(
23890 setValue({
23891 item: data,
23892 value: newValue
23893 })
23894 );
23895 },
23896 [data, onChange, setValue]
23897 );
23898 const [selectedPresetId, setSelectedPresetId] = (0, import_element69.useState)(
23899 null
23900 );
23901 const selectedRange = (0, import_element69.useMemo)(() => {
23902 if (!value) {
23903 return { from: void 0, to: void 0 };
23904 }
23905 const [from, to] = value;
23906 return {
23907 from: parseDate(from) || void 0,
23908 to: parseDate(to) || void 0
23909 };
23910 }, [value]);
23911 const [calendarMonth, setCalendarMonth] = (0, import_element69.useState)(() => {
23912 return selectedRange.from || /* @__PURE__ */ new Date();
23913 });
23914 const [isTouched, setIsTouched] = (0, import_element69.useState)(false);
23915 const fromInputRef = (0, import_element69.useRef)(null);
23916 const toInputRef = (0, import_element69.useRef)(null);
23917 const updateDateRange = (0, import_element69.useCallback)(
23918 (fromDate, toDate2) => {
23919 if (fromDate && toDate2) {
23920 onChangeCallback([
23921 formatDate(fromDate),
23922 formatDate(toDate2)
23923 ]);
23924 } else if (!fromDate && !toDate2) {
23925 onChangeCallback(void 0);
23926 }
23927 },
23928 [onChangeCallback]
23929 );
23930 const onSelectCalendarRange = (0, import_element69.useCallback)(
23931 (newRange) => {
23932 updateDateRange(newRange?.from, newRange?.to);
23933 setSelectedPresetId(null);
23934 setIsTouched(true);
23935 },
23936 [updateDateRange]
23937 );
23938 const handlePresetClick = (0, import_element69.useCallback)(
23939 (preset) => {
23940 const [startDate, endDate] = preset.getValue();
23941 setCalendarMonth(startDate);
23942 updateDateRange(startDate, endDate);
23943 setSelectedPresetId(preset.id);
23944 setIsTouched(true);
23945 },
23946 [updateDateRange]
23947 );
23948 const handleManualDateChange = (0, import_element69.useCallback)(
23949 (fromOrTo, newValue) => {
23950 const [currentFrom, currentTo] = value || [
23951 void 0,
23952 void 0
23953 ];
23954 const updatedFrom = fromOrTo === "from" ? newValue : currentFrom;
23955 const updatedTo = fromOrTo === "to" ? newValue : currentTo;
23956 updateDateRange(updatedFrom, updatedTo);
23957 if (newValue) {
23958 const parsedDate = parseDate(newValue);
23959 if (parsedDate) {
23960 setCalendarMonth(parsedDate);
23961 }
23962 }
23963 setSelectedPresetId(null);
23964 setIsTouched(true);
23965 },
23966 [value, updateDateRange]
23967 );
23968 const { timezone } = (0, import_date4.getSettings)();
23969 let displayLabel = label;
23970 if (field.isValid?.required && !markWhenOptional) {
23971 displayLabel = `${label} (${(0, import_i18n35.__)("Required")})`;
23972 } else if (!field.isValid?.required && markWhenOptional) {
23973 displayLabel = `${label} (${(0, import_i18n35.__)("Optional")})`;
23974 }
23975 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23976 ValidatedDateControl,
23977 {
23978 field,
23979 validity,
23980 inputRefs: [fromInputRef, toInputRef],
23981 isTouched,
23982 setIsTouched,
23983 children: /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
23984 import_components32.BaseControl,
23985 {
23986 id,
23987 className: "dataviews-controls__date",
23988 label: displayLabel,
23989 help: description,
23990 hideLabelFromVision,
23991 children: /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23992 /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
23993 Stack,
23994 {
23995 direction: "row",
23996 gap: "sm",
23997 wrap: "wrap",
23998 justify: "flex-start",
23999 children: [
24000 DATE_RANGE_PRESETS.map((preset) => {
24001 const isSelected2 = selectedPresetId === preset.id;
24002 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24003 import_components32.Button,
24004 {
24005 className: "dataviews-controls__date-preset",
24006 variant: "tertiary",
24007 isPressed: isSelected2,
24008 size: "small",
24009 disabled: disabled2,
24010 accessibleWhenDisabled: true,
24011 onClick: () => handlePresetClick(preset),
24012 children: preset.label
24013 },
24014 preset.id
24015 );
24016 }),
24017 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24018 import_components32.Button,
24019 {
24020 className: "dataviews-controls__date-preset",
24021 variant: "tertiary",
24022 isPressed: !selectedPresetId,
24023 size: "small",
24024 accessibleWhenDisabled: true,
24025 disabled: !!selectedPresetId || disabled2,
24026 children: (0, import_i18n35.__)("Custom")
24027 }
24028 )
24029 ]
24030 }
24031 ),
24032 /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
24033 Stack,
24034 {
24035 direction: "row",
24036 gap: "sm",
24037 justify: "space-between",
24038 className: "dataviews-controls__date-range-inputs",
24039 children: [
24040 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24041 import_components32.__experimentalInputControl,
24042 {
24043 ref: fromInputRef,
24044 type: "date",
24045 label: (0, import_i18n35.__)("From"),
24046 hideLabelFromVision: true,
24047 value: value?.[0],
24048 onChange: (newValue) => handleManualDateChange("from", newValue),
24049 required: !!field.isValid?.required,
24050 disabled: disabled2,
24051 min: minConstraint,
24052 max: maxConstraint
24053 }
24054 ),
24055 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24056 import_components32.__experimentalInputControl,
24057 {
24058 ref: toInputRef,
24059 type: "date",
24060 label: (0, import_i18n35.__)("To"),
24061 hideLabelFromVision: true,
24062 value: value?.[1],
24063 onChange: (newValue) => handleManualDateChange("to", newValue),
24064 required: !!field.isValid?.required,
24065 disabled: disabled2,
24066 min: minConstraint,
24067 max: maxConstraint
24068 }
24069 )
24070 ]
24071 }
24072 ),
24073 /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24074 DateRangeCalendar,
24075 {
24076 style: { width: "100%" },
24077 selected: selectedRange,
24078 onSelect: onSelectCalendarRange,
24079 month: calendarMonth,
24080 onMonthChange: setCalendarMonth,
24081 timeZone: timezone.string || void 0,
24082 weekStartsOn,
24083 disabled: disabled2 || disabledMatchers
24084 }
24085 )
24086 ] })
24087 }
24088 )
24089 }
24090 );
24091 }
24092 function DateControl({
24093 data,
24094 field,
24095 onChange,
24096 hideLabelFromVision,
24097 markWhenOptional,
24098 operator,
24099 validity
24100 }) {
24101 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
24102 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24103 RelativeDateControl,
24104 {
24105 className: "dataviews-controls__date",
24106 data,
24107 field,
24108 onChange,
24109 hideLabelFromVision,
24110 operator
24111 }
24112 );
24113 }
24114 if (operator === OPERATOR_BETWEEN) {
24115 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24116 CalendarDateRangeControl,
24117 {
24118 data,
24119 field,
24120 onChange,
24121 hideLabelFromVision,
24122 markWhenOptional,
24123 validity
24124 }
24125 );
24126 }
24127 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(
24128 CalendarDateControl,
24129 {
24130 data,
24131 field,
24132 onChange,
24133 hideLabelFromVision,
24134 markWhenOptional,
24135 validity
24136 }
24137 );
24138 }
24139
24140 // packages/dataviews/build-module/components/dataform-controls/select.mjs
24141 var import_components33 = __toESM(require_components(), 1);
24142 var import_element70 = __toESM(require_element(), 1);
24143 var import_jsx_runtime99 = __toESM(require_jsx_runtime(), 1);
24144 var { ValidatedSelectControl } = unlock2(import_components33.privateApis);
24145 function Select({
24146 data,
24147 field,
24148 onChange,
24149 hideLabelFromVision,
24150 markWhenOptional,
24151 validity
24152 }) {
24153 const { type, label, description, getValue, setValue, isValid: isValid2 } = field;
24154 const disabled2 = field.isDisabled({ item: data, field });
24155 const isMultiple = type === "array";
24156 const value = getValue({ item: data }) ?? (isMultiple ? [] : "");
24157 const onChangeControl = (0, import_element70.useCallback)(
24158 (newValue) => onChange(setValue({ item: data, value: newValue })),
24159 [data, onChange, setValue]
24160 );
24161 const { elements, isLoading } = useElements({
24162 elements: field.elements,
24163 getElements: field.getElements
24164 });
24165 if (isLoading) {
24166 return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(import_components33.Spinner, {});
24167 }
24168 return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
24169 ValidatedSelectControl,
24170 {
24171 required: !!field.isValid?.required,
24172 markWhenOptional,
24173 customValidity: getCustomValidity(isValid2, validity),
24174 label,
24175 value,
24176 help: description,
24177 options: elements,
24178 onChange: onChangeControl,
24179 hideLabelFromVision,
24180 multiple: isMultiple,
24181 disabled: disabled2
24182 }
24183 );
24184 }
24185
24186 // packages/dataviews/build-module/components/dataform-controls/adaptive-select.mjs
24187 var import_jsx_runtime100 = __toESM(require_jsx_runtime(), 1);
24188 var ELEMENTS_THRESHOLD = 10;
24189 function AdaptiveSelect(props) {
24190 const { field } = props;
24191 const { elements } = useElements({
24192 elements: field.elements,
24193 getElements: field.getElements
24194 });
24195 if (elements.length >= ELEMENTS_THRESHOLD) {
24196 return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Combobox3, { ...props });
24197 }
24198 return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Select, { ...props });
24199 }
24200
24201 // packages/dataviews/build-module/components/dataform-controls/email.mjs
24202 var import_components35 = __toESM(require_components(), 1);
24203
24204 // packages/dataviews/build-module/components/dataform-controls/utils/validated-input.mjs
24205 var import_components34 = __toESM(require_components(), 1);
24206 var import_element71 = __toESM(require_element(), 1);
24207 var import_jsx_runtime101 = __toESM(require_jsx_runtime(), 1);
24208 var { ValidatedInputControl: ValidatedInputControl2 } = unlock2(import_components34.privateApis);
24209 function ValidatedText({
24210 data,
24211 field,
24212 onChange,
24213 hideLabelFromVision,
24214 markWhenOptional,
24215 type,
24216 prefix,
24217 suffix,
24218 validity
24219 }) {
24220 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field;
24221 const value = getValue({ item: data });
24222 const disabled2 = field.isDisabled({ item: data, field });
24223 const onChangeControl = (0, import_element71.useCallback)(
24224 (newValue) => onChange(
24225 setValue({
24226 item: data,
24227 value: newValue
24228 })
24229 ),
24230 [data, setValue, onChange]
24231 );
24232 return /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(
24233 ValidatedInputControl2,
24234 {
24235 required: !!isValid2.required,
24236 markWhenOptional,
24237 customValidity: getCustomValidity(isValid2, validity),
24238 label,
24239 placeholder,
24240 value: value ?? "",
24241 help: description,
24242 onChange: onChangeControl,
24243 hideLabelFromVision,
24244 type,
24245 prefix,
24246 suffix,
24247 disabled: disabled2,
24248 pattern: isValid2.pattern ? isValid2.pattern.constraint : void 0,
24249 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
24250 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0
24251 }
24252 );
24253 }
24254
24255 // packages/dataviews/build-module/components/dataform-controls/email.mjs
24256 var import_jsx_runtime102 = __toESM(require_jsx_runtime(), 1);
24257 function Email({
24258 data,
24259 field,
24260 onChange,
24261 hideLabelFromVision,
24262 markWhenOptional,
24263 validity
24264 }) {
24265 return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(
24266 ValidatedText,
24267 {
24268 ...{
24269 data,
24270 field,
24271 onChange,
24272 hideLabelFromVision,
24273 markWhenOptional,
24274 validity,
24275 type: "email",
24276 prefix: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(import_components35.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(import_components35.Icon, { icon: envelope_default }) })
24277 }
24278 }
24279 );
24280 }
24281
24282 // packages/dataviews/build-module/components/dataform-controls/telephone.mjs
24283 var import_components36 = __toESM(require_components(), 1);
24284 var import_jsx_runtime103 = __toESM(require_jsx_runtime(), 1);
24285 function Telephone({
24286 data,
24287 field,
24288 onChange,
24289 hideLabelFromVision,
24290 markWhenOptional,
24291 validity
24292 }) {
24293 return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
24294 ValidatedText,
24295 {
24296 ...{
24297 data,
24298 field,
24299 onChange,
24300 hideLabelFromVision,
24301 markWhenOptional,
24302 validity,
24303 type: "tel",
24304 prefix: /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(import_components36.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(import_components36.Icon, { icon: mobile_default }) })
24305 }
24306 }
24307 );
24308 }
24309
24310 // packages/dataviews/build-module/components/dataform-controls/url.mjs
24311 var import_components37 = __toESM(require_components(), 1);
24312 var import_jsx_runtime104 = __toESM(require_jsx_runtime(), 1);
24313 function Url({
24314 data,
24315 field,
24316 onChange,
24317 hideLabelFromVision,
24318 markWhenOptional,
24319 validity
24320 }) {
24321 return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(
24322 ValidatedText,
24323 {
24324 ...{
24325 data,
24326 field,
24327 onChange,
24328 hideLabelFromVision,
24329 markWhenOptional,
24330 validity,
24331 type: "url",
24332 prefix: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(import_components37.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(import_components37.Icon, { icon: link_default }) })
24333 }
24334 }
24335 );
24336 }
24337
24338 // packages/dataviews/build-module/components/dataform-controls/utils/validated-number.mjs
24339 var import_components38 = __toESM(require_components(), 1);
24340 var import_element72 = __toESM(require_element(), 1);
24341 var import_i18n36 = __toESM(require_i18n(), 1);
24342 var import_jsx_runtime105 = __toESM(require_jsx_runtime(), 1);
24343 var { ValidatedNumberControl } = unlock2(import_components38.privateApis);
24344 function toNumberOrEmpty(value) {
24345 if (value === "" || value === void 0) {
24346 return "";
24347 }
24348 const number = Number(value);
24349 return Number.isFinite(number) ? number : "";
24350 }
24351 function BetweenControls({
24352 value,
24353 onChange,
24354 hideLabelFromVision,
24355 step
24356 }) {
24357 const [min2 = "", max2 = ""] = value;
24358 const onChangeMin = (0, import_element72.useCallback)(
24359 (newValue) => onChange([toNumberOrEmpty(newValue), max2]),
24360 [onChange, max2]
24361 );
24362 const onChangeMax = (0, import_element72.useCallback)(
24363 (newValue) => onChange([min2, toNumberOrEmpty(newValue)]),
24364 [onChange, min2]
24365 );
24366 return /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(
24367 import_components38.BaseControl,
24368 {
24369 help: (0, import_i18n36.__)("The max. value must be greater than the min. value."),
24370 children: /* @__PURE__ */ (0, import_jsx_runtime105.jsxs)(import_components38.Flex, { direction: "row", gap: 4, children: [
24371 /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(
24372 import_components38.__experimentalNumberControl,
24373 {
24374 label: (0, import_i18n36.__)("Min."),
24375 value: min2,
24376 max: max2 ? Number(max2) - step : void 0,
24377 onChange: onChangeMin,
24378 hideLabelFromVision,
24379 step
24380 }
24381 ),
24382 /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(
24383 import_components38.__experimentalNumberControl,
24384 {
24385 label: (0, import_i18n36.__)("Max."),
24386 value: max2,
24387 min: min2 ? Number(min2) + step : void 0,
24388 onChange: onChangeMax,
24389 hideLabelFromVision,
24390 step
24391 }
24392 )
24393 ] })
24394 }
24395 );
24396 }
24397 function ValidatedNumber({
24398 data,
24399 field,
24400 onChange,
24401 hideLabelFromVision,
24402 markWhenOptional,
24403 operator,
24404 validity
24405 }) {
24406 const decimals = field.format?.decimals ?? 0;
24407 const step = Math.pow(10, Math.abs(decimals) * -1);
24408 const { label, description, getValue, setValue, isValid: isValid2 } = field;
24409 const value = getValue({ item: data }) ?? "";
24410 const disabled2 = field.isDisabled({ item: data, field });
24411 const onChangeControl = (0, import_element72.useCallback)(
24412 (newValue) => {
24413 onChange(
24414 setValue({
24415 item: data,
24416 // Do not convert an empty string or undefined to a number,
24417 // otherwise there's a mismatch between the UI control (empty)
24418 // and the data relied by onChange (0).
24419 value: ["", void 0].includes(newValue) ? void 0 : Number(newValue)
24420 })
24421 );
24422 },
24423 [data, onChange, setValue]
24424 );
24425 const onChangeBetweenControls = (0, import_element72.useCallback)(
24426 (newValue) => {
24427 onChange(
24428 setValue({
24429 item: data,
24430 value: newValue
24431 })
24432 );
24433 },
24434 [data, onChange, setValue]
24435 );
24436 if (operator === OPERATOR_BETWEEN) {
24437 let valueBetween = ["", ""];
24438 if (Array.isArray(value) && value.length === 2 && value.every(
24439 (element) => typeof element === "number" || element === ""
24440 )) {
24441 valueBetween = value;
24442 }
24443 return /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(
24444 BetweenControls,
24445 {
24446 value: valueBetween,
24447 onChange: onChangeBetweenControls,
24448 hideLabelFromVision,
24449 step
24450 }
24451 );
24452 }
24453 return /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(
24454 ValidatedNumberControl,
24455 {
24456 required: !!isValid2.required,
24457 markWhenOptional,
24458 customValidity: getCustomValidity(isValid2, validity),
24459 label,
24460 help: description,
24461 value,
24462 onChange: onChangeControl,
24463 hideLabelFromVision,
24464 step,
24465 min: isValid2.min ? isValid2.min.constraint : void 0,
24466 max: isValid2.max ? isValid2.max.constraint : void 0,
24467 disabled: disabled2
24468 }
24469 );
24470 }
24471
24472 // packages/dataviews/build-module/components/dataform-controls/integer.mjs
24473 var import_jsx_runtime106 = __toESM(require_jsx_runtime(), 1);
24474 function Integer(props) {
24475 return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(ValidatedNumber, { ...props });
24476 }
24477
24478 // packages/dataviews/build-module/components/dataform-controls/number.mjs
24479 var import_jsx_runtime107 = __toESM(require_jsx_runtime(), 1);
24480 function Number2(props) {
24481 return /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(ValidatedNumber, { ...props });
24482 }
24483
24484 // packages/dataviews/build-module/components/dataform-controls/radio.mjs
24485 var import_components39 = __toESM(require_components(), 1);
24486 var import_element73 = __toESM(require_element(), 1);
24487 var import_jsx_runtime108 = __toESM(require_jsx_runtime(), 1);
24488 var { ValidatedRadioControl } = unlock2(import_components39.privateApis);
24489 function Radio({
24490 data,
24491 field,
24492 onChange,
24493 hideLabelFromVision,
24494 markWhenOptional,
24495 validity
24496 }) {
24497 const { label, description, getValue, setValue, isValid: isValid2 } = field;
24498 const disabled2 = field.isDisabled({ item: data, field });
24499 const { elements, isLoading } = useElements({
24500 elements: field.elements,
24501 getElements: field.getElements
24502 });
24503 const value = getValue({ item: data });
24504 const onChangeControl = (0, import_element73.useCallback)(
24505 (newValue) => onChange(setValue({ item: data, value: newValue })),
24506 [data, onChange, setValue]
24507 );
24508 if (isLoading) {
24509 return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(import_components39.Spinner, {});
24510 }
24511 return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
24512 ValidatedRadioControl,
24513 {
24514 required: !!field.isValid?.required,
24515 markWhenOptional,
24516 customValidity: getCustomValidity(isValid2, validity),
24517 label,
24518 help: description,
24519 onChange: onChangeControl,
24520 options: elements,
24521 selected: value,
24522 hideLabelFromVision,
24523 disabled: disabled2
24524 }
24525 );
24526 }
24527
24528 // packages/dataviews/build-module/components/dataform-controls/text.mjs
24529 var import_element74 = __toESM(require_element(), 1);
24530 var import_jsx_runtime109 = __toESM(require_jsx_runtime(), 1);
24531 function Text3({
24532 data,
24533 field,
24534 onChange,
24535 hideLabelFromVision,
24536 markWhenOptional,
24537 config,
24538 validity
24539 }) {
24540 const { prefix, suffix } = config || {};
24541 return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
24542 ValidatedText,
24543 {
24544 ...{
24545 data,
24546 field,
24547 onChange,
24548 hideLabelFromVision,
24549 markWhenOptional,
24550 validity,
24551 prefix: prefix ? (0, import_element74.createElement)(prefix) : void 0,
24552 suffix: suffix ? (0, import_element74.createElement)(suffix) : void 0
24553 }
24554 }
24555 );
24556 }
24557
24558 // packages/dataviews/build-module/components/dataform-controls/toggle.mjs
24559 var import_components40 = __toESM(require_components(), 1);
24560 var import_element75 = __toESM(require_element(), 1);
24561 var import_jsx_runtime110 = __toESM(require_jsx_runtime(), 1);
24562 var { ValidatedToggleControl } = unlock2(import_components40.privateApis);
24563 function Toggle({
24564 field,
24565 onChange,
24566 data,
24567 hideLabelFromVision,
24568 markWhenOptional,
24569 validity
24570 }) {
24571 const { label, description, getValue, setValue, isValid: isValid2 } = field;
24572 const disabled2 = field.isDisabled({ item: data, field });
24573 const onChangeControl = (0, import_element75.useCallback)(() => {
24574 onChange(
24575 setValue({ item: data, value: !getValue({ item: data }) })
24576 );
24577 }, [onChange, setValue, data, getValue]);
24578 return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
24579 ValidatedToggleControl,
24580 {
24581 required: !!isValid2.required,
24582 markWhenOptional,
24583 customValidity: getCustomValidity(isValid2, validity),
24584 hidden: hideLabelFromVision,
24585 label,
24586 help: description,
24587 checked: getValue({ item: data }),
24588 onChange: onChangeControl,
24589 disabled: disabled2
24590 }
24591 );
24592 }
24593
24594 // packages/dataviews/build-module/components/dataform-controls/textarea.mjs
24595 var import_components41 = __toESM(require_components(), 1);
24596 var import_element76 = __toESM(require_element(), 1);
24597 var import_jsx_runtime111 = __toESM(require_jsx_runtime(), 1);
24598 var { ValidatedTextareaControl } = unlock2(import_components41.privateApis);
24599 function Textarea({
24600 data,
24601 field,
24602 onChange,
24603 hideLabelFromVision,
24604 markWhenOptional,
24605 config,
24606 validity
24607 }) {
24608 const { rows = 4 } = config || {};
24609 const disabled2 = field.isDisabled({ item: data, field });
24610 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
24611 const value = field.getValue({ item: data });
24612 const onChangeControl = (0, import_element76.useCallback)(
24613 (newValue) => onChange(setValue({ item: data, value: newValue })),
24614 [data, onChange, setValue]
24615 );
24616 return /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
24617 ValidatedTextareaControl,
24618 {
24619 required: !!isValid2.required,
24620 markWhenOptional,
24621 customValidity: getCustomValidity(isValid2, validity),
24622 label,
24623 placeholder,
24624 value: value ?? "",
24625 help: description,
24626 onChange: onChangeControl,
24627 rows,
24628 disabled: disabled2,
24629 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
24630 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0,
24631 __next40pxDefaultSize: true,
24632 hideLabelFromVision
24633 }
24634 );
24635 }
24636
24637 // packages/dataviews/build-module/components/dataform-controls/richtext/index.mjs
24638 var import_element78 = __toESM(require_element(), 1);
24639
24640 // packages/dataviews/build-module/components/dataform-controls/richtext/control.mjs
24641 var import_components42 = __toESM(require_components(), 1);
24642 var import_compose12 = __toESM(require_compose(), 1);
24643 var import_element77 = __toESM(require_element(), 1);
24644 var import_rich_text2 = __toESM(require_rich_text(), 1);
24645
24646 // packages/dataviews/build-module/components/dataform-controls/richtext/utils.mjs
24647 var EMPTY_ARRAY6 = [];
24648 function getAllowedFormats({
24649 allowedFormats,
24650 disableFormats
24651 }) {
24652 if (disableFormats) {
24653 return EMPTY_ARRAY6;
24654 }
24655 return allowedFormats;
24656 }
24657
24658 // packages/dataviews/build-module/components/dataform-controls/richtext/format-edit.mjs
24659 var import_rich_text = __toESM(require_rich_text(), 1);
24660 var import_jsx_runtime112 = __toESM(require_jsx_runtime(), 1);
24661 var import_react28 = __toESM(require_react(), 1);
24662 var EMPTY_CONTEXT = {};
24663 function Edit({
24664 onChange,
24665 onFocus,
24666 value,
24667 forwardedRef,
24668 settings,
24669 isVisible: isVisible2
24670 }) {
24671 const { name, edit: EditFunction } = settings;
24672 if (!EditFunction) {
24673 return null;
24674 }
24675 const activeFormat = (0, import_rich_text.getActiveFormat)(value, name);
24676 const isActive = activeFormat !== void 0;
24677 const activeObject = (0, import_rich_text.getActiveObject)(value);
24678 const isObjectActive = activeObject !== void 0 && activeObject.type === name;
24679 return /* @__PURE__ */ (0, import_jsx_runtime112.jsx)(
24680 EditFunction,
24681 {
24682 isActive,
24683 isVisible: isVisible2,
24684 activeAttributes: isActive ? activeFormat.attributes || {} : {},
24685 isObjectActive,
24686 activeObjectAttributes: isObjectActive ? activeObject.attributes || {} : {},
24687 value,
24688 onChange,
24689 onFocus,
24690 contentRef: forwardedRef,
24691 context: EMPTY_CONTEXT
24692 },
24693 name
24694 );
24695 }
24696 function FormatEdit({
24697 formatTypes,
24698 ...props
24699 }) {
24700 return formatTypes.map((settings) => /* @__PURE__ */ (0, import_react28.createElement)(Edit, { settings, ...props, key: settings.name }));
24701 }
24702
24703 // packages/dataviews/build-module/components/dataform-controls/richtext/control.mjs
24704 var import_jsx_runtime113 = __toESM(require_jsx_runtime(), 1);
24705 var {
24706 ValidatedContentEditableControl: RichTextControlShell,
24707 withIgnoreIMEEvents
24708 } = unlock2(import_components42.privateApis);
24709 var {
24710 useRichText,
24711 KeyboardShortcutContext,
24712 InputEventContext,
24713 shortcutsListener,
24714 inputEventsListener
24715 } = unlock2(import_rich_text2.privateApis);
24716 var EMPTY_COMPLETERS = [];
24717 function RichTextControl({
24718 label,
24719 value: attrValue,
24720 onChange,
24721 placeholder,
24722 id,
24723 clientId,
24724 className,
24725 hideLabelFromVision,
24726 help,
24727 disabled: disabled2,
24728 required,
24729 markWhenOptional,
24730 customValidity,
24731 allowedFormats,
24732 disableFormats,
24733 withoutInteractiveFormatting,
24734 preserveWhiteSpace,
24735 disableLineBreaks,
24736 focusOnMount,
24737 completers = EMPTY_COMPLETERS
24738 }) {
24739 const [selection, setSelection] = (0, import_element77.useState)({
24740 start: void 0,
24741 end: void 0
24742 });
24743 const [isSelected2, setIsSelected] = (0, import_element77.useState)(false);
24744 const anchorRef = (0, import_element77.useRef)(void 0);
24745 const inputEvents = (0, import_element77.useRef)(/* @__PURE__ */ new Set());
24746 const keyboardShortcuts = (0, import_element77.useRef)(
24747 /* @__PURE__ */ new Set()
24748 );
24749 const focusOutside = (0, import_compose12.__experimentalUseFocusOutside)(() => setIsSelected(false));
24750 const adjustedAllowedFormats = getAllowedFormats({
24751 allowedFormats,
24752 disableFormats
24753 });
24754 const {
24755 value,
24756 onChange: onRichTextChange,
24757 ref: richTextRef,
24758 formatTypes,
24759 getValue
24760 } = useRichText({
24761 value: attrValue,
24762 onChange,
24763 selectionStart: selection.start,
24764 selectionEnd: selection.end,
24765 onSelectionChange: (start, end) => setSelection({ start, end }),
24766 __unstableIsSelected: isSelected2,
24767 preserveWhiteSpace: !!preserveWhiteSpace,
24768 placeholder,
24769 __unstableDisableFormats: disableFormats,
24770 allowedFormats: adjustedAllowedFormats,
24771 withoutInteractiveFormatting,
24772 __unstableFormatTypeHandlerContext: (0, import_element77.useMemo)(
24773 () => ({
24774 richTextIdentifier: id,
24775 blockClientId: clientId
24776 }),
24777 [id, clientId]
24778 )
24779 });
24780 function onFocus() {
24781 anchorRef.current?.focus();
24782 }
24783 const eventListenersPropsRef = (0, import_element77.useRef)({
24784 keyboardShortcuts,
24785 inputEvents
24786 });
24787 const inputRulePropsRef = (0, import_element77.useRef)({
24788 formatTypes,
24789 getValue,
24790 onChange: onRichTextChange
24791 });
24792 (0, import_element77.useInsertionEffect)(() => {
24793 inputRulePropsRef.current = {
24794 formatTypes,
24795 getValue,
24796 onChange: onRichTextChange
24797 };
24798 });
24799 const enterRef = (0, import_compose12.useRefEffect)(
24800 (element) => {
24801 if (disabled2) {
24802 return;
24803 }
24804 const onKeyDown = withIgnoreIMEEvents((event) => {
24805 if (event.key !== "Enter" || event.defaultPrevented || event.metaKey || event.ctrlKey) {
24806 return;
24807 }
24808 event.preventDefault();
24809 if (disableLineBreaks) {
24810 return;
24811 }
24812 const { getValue: getCurrentValue2, onChange: handleChange } = inputRulePropsRef.current;
24813 const current = getCurrentValue2();
24814 handleChange(
24815 (0, import_rich_text2.insert)(
24816 current,
24817 "\n",
24818 current.start ?? current.text.length,
24819 current.end ?? current.text.length
24820 )
24821 );
24822 });
24823 element.addEventListener("keydown", onKeyDown);
24824 return () => element.removeEventListener("keydown", onKeyDown);
24825 },
24826 [disableLineBreaks, disabled2]
24827 );
24828 const eventListenersRef = (0, import_compose12.useRefEffect)(
24829 (element) => {
24830 if (!isSelected2) {
24831 return;
24832 }
24833 const cleanupShortcuts = shortcutsListener(
24834 eventListenersPropsRef
24835 )(element);
24836 const cleanupInputEvents = inputEventsListener(
24837 eventListenersPropsRef
24838 )(element);
24839 function onFormatInput(event) {
24840 if (event.inputType !== "insertText" && event.type !== "compositionend") {
24841 return;
24842 }
24843 const {
24844 formatTypes: types,
24845 getValue: getCurrentValue2,
24846 onChange: handleChange
24847 } = inputRulePropsRef.current;
24848 const current = getCurrentValue2();
24849 const transformed = types.reduce(
24850 (accumulator, {
24851 __unstableInputRule
24852 }) => __unstableInputRule ? __unstableInputRule(accumulator) : accumulator,
24853 current
24854 );
24855 if (transformed !== current) {
24856 handleChange({
24857 ...transformed,
24858 activeFormats: current.activeFormats
24859 });
24860 }
24861 }
24862 element.addEventListener("input", onFormatInput);
24863 element.addEventListener("compositionend", onFormatInput);
24864 return () => {
24865 cleanupShortcuts();
24866 cleanupInputEvents();
24867 element.removeEventListener("input", onFormatInput);
24868 element.removeEventListener("compositionend", onFormatInput);
24869 };
24870 },
24871 [isSelected2]
24872 );
24873 const { ref: autocompleteRef, ...autocompleteProps } = (0, import_components42.__unstableUseAutocompleteProps)(
24874 {
24875 completers,
24876 record: value,
24877 onChange: onRichTextChange,
24878 // This control's completers insert their completion into the value;
24879 // none replace the whole value, so the required `onReplace` is a
24880 // no-op here.
24881 onReplace: () => {
24882 }
24883 }
24884 );
24885 const focusOnMountRef = (0, import_compose12.useRefEffect)(
24886 (element) => {
24887 if (focusOnMount && !disabled2) {
24888 element.focus();
24889 }
24890 },
24891 [focusOnMount, disabled2]
24892 );
24893 const editableRef = (0, import_compose12.useMergeRefs)([
24894 richTextRef,
24895 anchorRef,
24896 eventListenersRef,
24897 enterRef,
24898 focusOnMountRef,
24899 autocompleteRef
24900 ]);
24901 return (
24902 // Focus boundary for the field's selection: `onFocus` selects on entry;
24903 // the spread `useFocusOutside` handlers deselect once focus leaves.
24904 /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
24905 "div",
24906 {
24907 ...focusOutside,
24908 onFocus: (event) => {
24909 setIsSelected(true);
24910 focusOutside.onFocus(event);
24911 },
24912 children: /* @__PURE__ */ (0, import_jsx_runtime113.jsxs)(import_components42.SlotFillProvider, { children: [
24913 /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
24914 RichTextControlShell,
24915 {
24916 label,
24917 id,
24918 className: clsx_default(
24919 "dataviews-controls__richtext",
24920 className
24921 ),
24922 placeholder,
24923 hideLabelFromVision,
24924 help,
24925 disabled: disabled2,
24926 required,
24927 markWhenOptional,
24928 customValidity,
24929 value: value.text,
24930 "aria-multiline": !disableLineBreaks,
24931 ...autocompleteProps,
24932 ref: editableRef
24933 }
24934 ),
24935 isSelected2 && !disabled2 && /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
24936 KeyboardShortcutContext.Provider,
24937 {
24938 value: keyboardShortcuts,
24939 children: /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(InputEventContext.Provider, { value: inputEvents, children: /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
24940 FormatEdit,
24941 {
24942 value,
24943 onChange: onRichTextChange,
24944 onFocus,
24945 formatTypes,
24946 forwardedRef: anchorRef,
24947 isVisible: true
24948 }
24949 ) })
24950 }
24951 )
24952 ] })
24953 }
24954 )
24955 );
24956 }
24957
24958 // packages/dataviews/build-module/components/dataform-controls/richtext/index.mjs
24959 var import_jsx_runtime114 = __toESM(require_jsx_runtime(), 1);
24960 function RichText({
24961 data,
24962 field,
24963 onChange,
24964 hideLabelFromVision,
24965 markWhenOptional,
24966 config,
24967 validity
24968 }) {
24969 const {
24970 className,
24971 clientId,
24972 allowedFormats,
24973 disableFormats,
24974 withoutInteractiveFormatting,
24975 preserveWhiteSpace,
24976 disableLineBreaks
24977 } = config || {};
24978 const disabled2 = field.isDisabled({ item: data, field });
24979 const { label, placeholder, description, id, setValue, isValid: isValid2 } = field;
24980 const value = field.getValue({ item: data }) ?? "";
24981 const onChangeControl = (0, import_element78.useCallback)(
24982 (newValue) => onChange(setValue({ item: data, value: newValue })),
24983 [data, onChange, setValue]
24984 );
24985 return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(
24986 RichTextControl,
24987 {
24988 label,
24989 value,
24990 onChange: onChangeControl,
24991 placeholder,
24992 id,
24993 hideLabelFromVision,
24994 help: description,
24995 disabled: disabled2,
24996 required: !!isValid2.required,
24997 markWhenOptional,
24998 customValidity: getCustomValidity(isValid2, validity),
24999 className,
25000 clientId,
25001 allowedFormats,
25002 disableFormats,
25003 withoutInteractiveFormatting,
25004 preserveWhiteSpace,
25005 disableLineBreaks
25006 }
25007 );
25008 }
25009
25010 // packages/dataviews/build-module/components/dataform-controls/toggle-group.mjs
25011 var import_components43 = __toESM(require_components(), 1);
25012 var import_element79 = __toESM(require_element(), 1);
25013 var import_jsx_runtime115 = __toESM(require_jsx_runtime(), 1);
25014 var { ValidatedToggleGroupControl } = unlock2(import_components43.privateApis);
25015 function ToggleGroup({
25016 data,
25017 field,
25018 onChange,
25019 hideLabelFromVision,
25020 markWhenOptional,
25021 validity
25022 }) {
25023 const { getValue, setValue, isValid: isValid2 } = field;
25024 const disabled2 = field.isDisabled({ item: data, field });
25025 const value = getValue({ item: data });
25026 const onChangeControl = (0, import_element79.useCallback)(
25027 (newValue) => onChange(setValue({ item: data, value: newValue })),
25028 [data, onChange, setValue]
25029 );
25030 const { elements, isLoading } = useElements({
25031 elements: field.elements,
25032 getElements: field.getElements
25033 });
25034 if (isLoading) {
25035 return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(import_components43.Spinner, {});
25036 }
25037 if (elements.length === 0) {
25038 return null;
25039 }
25040 const selectedOption = elements.find((el) => el.value === value);
25041 return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25042 ValidatedToggleGroupControl,
25043 {
25044 required: !!field.isValid?.required,
25045 markWhenOptional,
25046 customValidity: getCustomValidity(isValid2, validity),
25047 isBlock: true,
25048 label: field.label,
25049 help: selectedOption?.description || field.description,
25050 onChange: onChangeControl,
25051 value,
25052 hideLabelFromVision,
25053 children: elements.map((el) => /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25054 import_components43.__experimentalToggleGroupControlOption,
25055 {
25056 label: el.label,
25057 value: el.value,
25058 disabled: disabled2
25059 },
25060 el.value
25061 ))
25062 }
25063 );
25064 }
25065
25066 // packages/dataviews/build-module/components/dataform-controls/array.mjs
25067 var import_components44 = __toESM(require_components(), 1);
25068 var import_element80 = __toESM(require_element(), 1);
25069 var import_jsx_runtime116 = __toESM(require_jsx_runtime(), 1);
25070 var { ValidatedFormTokenField } = unlock2(import_components44.privateApis);
25071 function ArrayControl({
25072 data,
25073 field,
25074 onChange,
25075 hideLabelFromVision,
25076 markWhenOptional,
25077 validity
25078 }) {
25079 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field;
25080 const value = getValue({ item: data });
25081 const disabled2 = field.isDisabled({ item: data, field });
25082 const { elements, isLoading } = useElements({
25083 elements: field.elements,
25084 getElements: field.getElements
25085 });
25086 const arrayValueAsElements = (0, import_element80.useMemo)(
25087 () => Array.isArray(value) ? value.map((token) => {
25088 const element = elements?.find(
25089 (suggestion) => suggestion.value === token
25090 );
25091 return element || { value: token, label: token };
25092 }) : [],
25093 [value, elements]
25094 );
25095 const onChangeControl = (0, import_element80.useCallback)(
25096 (tokens) => {
25097 const valueTokens = tokens.map((token) => {
25098 if (typeof token === "object" && "value" in token) {
25099 return token.value;
25100 }
25101 return token;
25102 });
25103 onChange(setValue({ item: data, value: valueTokens }));
25104 },
25105 [onChange, setValue, data]
25106 );
25107 if (isLoading) {
25108 return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(import_components44.Spinner, {});
25109 }
25110 return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(
25111 ValidatedFormTokenField,
25112 {
25113 required: !!isValid2?.required,
25114 markWhenOptional,
25115 customValidity: getCustomValidity(isValid2, validity),
25116 label: hideLabelFromVision ? void 0 : label,
25117 value: arrayValueAsElements,
25118 onChange: onChangeControl,
25119 placeholder,
25120 suggestions: elements?.map((element) => element.value),
25121 disabled: disabled2,
25122 __experimentalValidateInput: (token) => {
25123 if (field.isValid?.elements && elements) {
25124 return elements.some(
25125 (element) => element.value === token || element.label === token
25126 );
25127 }
25128 return true;
25129 },
25130 __experimentalExpandOnFocus: elements && elements.length > 0,
25131 help: description ?? (field.isValid?.elements ? "" : void 0),
25132 displayTransform: (token) => {
25133 if (typeof token === "object" && "label" in token) {
25134 return token.label;
25135 }
25136 if (typeof token === "string" && elements) {
25137 const element = elements.find(
25138 (el) => el.value === token
25139 );
25140 return element?.label || token;
25141 }
25142 return token;
25143 },
25144 __experimentalRenderItem: ({ item }) => {
25145 if (typeof item === "string" && elements) {
25146 const element = elements.find(
25147 (el) => el.value === item
25148 );
25149 return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)("span", { children: element?.label || item });
25150 }
25151 return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)("span", { children: item });
25152 }
25153 }
25154 );
25155 }
25156
25157 // node_modules/colord/index.mjs
25158 var r2 = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) };
25159 var t = function(r3) {
25160 return "string" == typeof r3 ? r3.length > 0 : "number" == typeof r3;
25161 };
25162 var n = function(r3, t2, n2) {
25163 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r3) / n2 + 0;
25164 };
25165 var e = function(r3, t2, n2) {
25166 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r3 > n2 ? n2 : r3 > t2 ? r3 : t2;
25167 };
25168 var u = function(r3) {
25169 return (r3 = isFinite(r3) ? r3 % 360 : 0) > 0 ? r3 : r3 + 360;
25170 };
25171 var a = function(r3) {
25172 return { r: e(r3.r, 0, 255), g: e(r3.g, 0, 255), b: e(r3.b, 0, 255), a: e(r3.a) };
25173 };
25174 var o = function(r3) {
25175 return { r: n(r3.r), g: n(r3.g), b: n(r3.b), a: n(r3.a, 3) };
25176 };
25177 var i = /^#([0-9a-f]{3,8})$/i;
25178 var s = function(r3) {
25179 var t2 = r3.toString(16);
25180 return t2.length < 2 ? "0" + t2 : t2;
25181 };
25182 var h = function(r3) {
25183 var t2 = r3.r, n2 = r3.g, e2 = r3.b, u2 = r3.a, a2 = Math.max(t2, n2, e2), o2 = a2 - Math.min(t2, n2, e2), i2 = o2 ? a2 === t2 ? (n2 - e2) / o2 : a2 === n2 ? 2 + (e2 - t2) / o2 : 4 + (t2 - n2) / o2 : 0;
25184 return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 };
25185 };
25186 var b = function(r3) {
25187 var t2 = r3.h, n2 = r3.s, e2 = r3.v, u2 = r3.a;
25188 t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100;
25189 var a2 = Math.floor(t2), o2 = e2 * (1 - n2), i2 = e2 * (1 - (t2 - a2) * n2), s2 = e2 * (1 - (1 - t2 + a2) * n2), h2 = a2 % 6;
25190 return { r: 255 * [e2, i2, o2, o2, s2, e2][h2], g: 255 * [s2, e2, e2, i2, o2, o2][h2], b: 255 * [o2, o2, s2, e2, e2, i2][h2], a: u2 };
25191 };
25192 var g = function(r3) {
25193 return { h: u(r3.h), s: e(r3.s, 0, 100), l: e(r3.l, 0, 100), a: e(r3.a) };
25194 };
25195 var d = function(r3) {
25196 return { h: n(r3.h), s: n(r3.s), l: n(r3.l), a: n(r3.a, 3) };
25197 };
25198 var f = function(r3) {
25199 return b((n2 = (t2 = r3).s, { h: t2.h, s: (n2 *= ((e2 = t2.l) < 50 ? e2 : 100 - e2) / 100) > 0 ? 2 * n2 / (e2 + n2) * 100 : 0, v: e2 + n2, a: t2.a }));
25200 var t2, n2, e2;
25201 };
25202 var c = function(r3) {
25203 return { h: (t2 = h(r3)).h, s: (u2 = (200 - (n2 = t2.s)) * (e2 = t2.v) / 100) > 0 && u2 < 200 ? n2 * e2 / 100 / (u2 <= 100 ? u2 : 200 - u2) * 100 : 0, l: u2 / 2, a: t2.a };
25204 var t2, n2, e2, u2;
25205 };
25206 var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25207 var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25208 var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25209 var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25210 var y = { string: [[function(r3) {
25211 var t2 = i.exec(r3);
25212 return t2 ? (r3 = t2[1]).length <= 4 ? { r: parseInt(r3[0] + r3[0], 16), g: parseInt(r3[1] + r3[1], 16), b: parseInt(r3[2] + r3[2], 16), a: 4 === r3.length ? n(parseInt(r3[3] + r3[3], 16) / 255, 2) : 1 } : 6 === r3.length || 8 === r3.length ? { r: parseInt(r3.substr(0, 2), 16), g: parseInt(r3.substr(2, 2), 16), b: parseInt(r3.substr(4, 2), 16), a: 8 === r3.length ? n(parseInt(r3.substr(6, 2), 16) / 255, 2) : 1 } : null : null;
25213 }, "hex"], [function(r3) {
25214 var t2 = v.exec(r3) || m.exec(r3);
25215 return t2 ? t2[2] !== t2[4] || t2[4] !== t2[6] ? null : a({ r: Number(t2[1]) / (t2[2] ? 100 / 255 : 1), g: Number(t2[3]) / (t2[4] ? 100 / 255 : 1), b: Number(t2[5]) / (t2[6] ? 100 / 255 : 1), a: void 0 === t2[7] ? 1 : Number(t2[7]) / (t2[8] ? 100 : 1) }) : null;
25216 }, "rgb"], [function(t2) {
25217 var n2 = l.exec(t2) || p.exec(t2);
25218 if (!n2) return null;
25219 var e2, u2, a2 = g({ h: (e2 = n2[1], u2 = n2[2], void 0 === u2 && (u2 = "deg"), Number(e2) * (r2[u2] || 1)), s: Number(n2[3]), l: Number(n2[4]), a: void 0 === n2[5] ? 1 : Number(n2[5]) / (n2[6] ? 100 : 1) });
25220 return f(a2);
25221 }, "hsl"]], object: [[function(r3) {
25222 var n2 = r3.r, e2 = r3.g, u2 = r3.b, o2 = r3.a, i2 = void 0 === o2 ? 1 : o2;
25223 return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null;
25224 }, "rgb"], [function(r3) {
25225 var n2 = r3.h, e2 = r3.s, u2 = r3.l, a2 = r3.a, o2 = void 0 === a2 ? 1 : a2;
25226 if (!t(n2) || !t(e2) || !t(u2)) return null;
25227 var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) });
25228 return f(i2);
25229 }, "hsl"], [function(r3) {
25230 var n2 = r3.h, a2 = r3.s, o2 = r3.v, i2 = r3.a, s2 = void 0 === i2 ? 1 : i2;
25231 if (!t(n2) || !t(a2) || !t(o2)) return null;
25232 var h2 = (function(r4) {
25233 return { h: u(r4.h), s: e(r4.s, 0, 100), v: e(r4.v, 0, 100), a: e(r4.a) };
25234 })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) });
25235 return b(h2);
25236 }, "hsv"]] };
25237 var N = function(r3, t2) {
25238 for (var n2 = 0; n2 < t2.length; n2++) {
25239 var e2 = t2[n2][0](r3);
25240 if (e2) return [e2, t2[n2][1]];
25241 }
25242 return [null, void 0];
25243 };
25244 var x = function(r3) {
25245 return "string" == typeof r3 ? N(r3.trim(), y.string) : "object" == typeof r3 && null !== r3 ? N(r3, y.object) : [null, void 0];
25246 };
25247 var M = function(r3, t2) {
25248 var n2 = c(r3);
25249 return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a };
25250 };
25251 var H = function(r3) {
25252 return (299 * r3.r + 587 * r3.g + 114 * r3.b) / 1e3 / 255;
25253 };
25254 var $ = function(r3, t2) {
25255 var n2 = c(r3);
25256 return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a };
25257 };
25258 var j = (function() {
25259 function r3(r4) {
25260 this.parsed = x(r4)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 };
25261 }
25262 return r3.prototype.isValid = function() {
25263 return null !== this.parsed;
25264 }, r3.prototype.brightness = function() {
25265 return n(H(this.rgba), 2);
25266 }, r3.prototype.isDark = function() {
25267 return H(this.rgba) < 0.5;
25268 }, r3.prototype.isLight = function() {
25269 return H(this.rgba) >= 0.5;
25270 }, r3.prototype.toHex = function() {
25271 return r4 = o(this.rgba), t2 = r4.r, e2 = r4.g, u2 = r4.b, i2 = (a2 = r4.a) < 1 ? s(n(255 * a2)) : "", "#" + s(t2) + s(e2) + s(u2) + i2;
25272 var r4, t2, e2, u2, a2, i2;
25273 }, r3.prototype.toRgb = function() {
25274 return o(this.rgba);
25275 }, r3.prototype.toRgbString = function() {
25276 return r4 = o(this.rgba), t2 = r4.r, n2 = r4.g, e2 = r4.b, (u2 = r4.a) < 1 ? "rgba(" + t2 + ", " + n2 + ", " + e2 + ", " + u2 + ")" : "rgb(" + t2 + ", " + n2 + ", " + e2 + ")";
25277 var r4, t2, n2, e2, u2;
25278 }, r3.prototype.toHsl = function() {
25279 return d(c(this.rgba));
25280 }, r3.prototype.toHslString = function() {
25281 return r4 = d(c(this.rgba)), t2 = r4.h, n2 = r4.s, e2 = r4.l, (u2 = r4.a) < 1 ? "hsla(" + t2 + ", " + n2 + "%, " + e2 + "%, " + u2 + ")" : "hsl(" + t2 + ", " + n2 + "%, " + e2 + "%)";
25282 var r4, t2, n2, e2, u2;
25283 }, r3.prototype.toHsv = function() {
25284 return r4 = h(this.rgba), { h: n(r4.h), s: n(r4.s), v: n(r4.v), a: n(r4.a, 3) };
25285 var r4;
25286 }, r3.prototype.invert = function() {
25287 return w({ r: 255 - (r4 = this.rgba).r, g: 255 - r4.g, b: 255 - r4.b, a: r4.a });
25288 var r4;
25289 }, r3.prototype.saturate = function(r4) {
25290 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, r4));
25291 }, r3.prototype.desaturate = function(r4) {
25292 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, -r4));
25293 }, r3.prototype.grayscale = function() {
25294 return w(M(this.rgba, -1));
25295 }, r3.prototype.lighten = function(r4) {
25296 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, r4));
25297 }, r3.prototype.darken = function(r4) {
25298 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, -r4));
25299 }, r3.prototype.rotate = function(r4) {
25300 return void 0 === r4 && (r4 = 15), this.hue(this.hue() + r4);
25301 }, r3.prototype.alpha = function(r4) {
25302 return "number" == typeof r4 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r4 }) : n(this.rgba.a, 3);
25303 var t2;
25304 }, r3.prototype.hue = function(r4) {
25305 var t2 = c(this.rgba);
25306 return "number" == typeof r4 ? w({ h: r4, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h);
25307 }, r3.prototype.isEqual = function(r4) {
25308 return this.toHex() === w(r4).toHex();
25309 }, r3;
25310 })();
25311 var w = function(r3) {
25312 return r3 instanceof j ? r3 : new j(r3);
25313 };
25314
25315 // packages/dataviews/build-module/components/dataform-controls/color.mjs
25316 var import_components45 = __toESM(require_components(), 1);
25317 var import_element81 = __toESM(require_element(), 1);
25318 var import_i18n37 = __toESM(require_i18n(), 1);
25319 var import_jsx_runtime117 = __toESM(require_jsx_runtime(), 1);
25320 var { ValidatedInputControl: ValidatedInputControl3 } = unlock2(import_components45.privateApis);
25321 var ColorPickerDropdown = ({
25322 color,
25323 onColorChange,
25324 disabled: disabled2
25325 }) => {
25326 const validColor = color && w(color).isValid() ? color : "#ffffff";
25327 return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
25328 import_components45.Dropdown,
25329 {
25330 className: "dataviews-controls__color-picker-dropdown",
25331 popoverProps: { resize: false },
25332 renderToggle: ({ onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
25333 import_components45.Button,
25334 {
25335 onClick: onToggle,
25336 "aria-label": (0, import_i18n37.__)("Open color picker"),
25337 size: "small",
25338 disabled: disabled2,
25339 accessibleWhenDisabled: true,
25340 icon: () => /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(import_components45.ColorIndicator, { colorValue: validColor })
25341 }
25342 ),
25343 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(import_components45.__experimentalDropdownContentWrapper, { paddingSize: "none", children: /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
25344 import_components45.ColorPicker,
25345 {
25346 color: validColor,
25347 onChange: onColorChange,
25348 enableAlpha: true
25349 }
25350 ) })
25351 }
25352 );
25353 };
25354 function Color({
25355 data,
25356 field,
25357 onChange,
25358 hideLabelFromVision,
25359 markWhenOptional,
25360 validity
25361 }) {
25362 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
25363 const disabled2 = field.isDisabled({ item: data, field });
25364 const value = field.getValue({ item: data }) || "";
25365 const handleColorChange = (0, import_element81.useCallback)(
25366 (newColor) => {
25367 onChange(setValue({ item: data, value: newColor }));
25368 },
25369 [data, onChange, setValue]
25370 );
25371 const handleInputChange = (0, import_element81.useCallback)(
25372 (newValue) => {
25373 onChange(setValue({ item: data, value: newValue || "" }));
25374 },
25375 [data, onChange, setValue]
25376 );
25377 return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
25378 ValidatedInputControl3,
25379 {
25380 required: !!field.isValid?.required,
25381 markWhenOptional,
25382 customValidity: getCustomValidity(isValid2, validity),
25383 label,
25384 placeholder,
25385 value,
25386 help: description,
25387 onChange: handleInputChange,
25388 hideLabelFromVision,
25389 type: "text",
25390 disabled: disabled2,
25391 prefix: /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(import_components45.__experimentalInputControlPrefixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
25392 ColorPickerDropdown,
25393 {
25394 color: value,
25395 onColorChange: handleColorChange,
25396 disabled: disabled2
25397 }
25398 ) })
25399 }
25400 );
25401 }
25402
25403 // packages/dataviews/build-module/components/dataform-controls/password.mjs
25404 var import_components46 = __toESM(require_components(), 1);
25405 var import_element82 = __toESM(require_element(), 1);
25406 var import_i18n38 = __toESM(require_i18n(), 1);
25407 var import_jsx_runtime118 = __toESM(require_jsx_runtime(), 1);
25408 function Password({
25409 data,
25410 field,
25411 onChange,
25412 hideLabelFromVision,
25413 markWhenOptional,
25414 validity
25415 }) {
25416 const [isVisible2, setIsVisible] = (0, import_element82.useState)(false);
25417 const disabled2 = field.isDisabled({ item: data, field });
25418 const toggleVisibility = (0, import_element82.useCallback)(() => {
25419 setIsVisible((prev) => !prev);
25420 }, []);
25421 return /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(
25422 ValidatedText,
25423 {
25424 ...{
25425 data,
25426 field,
25427 onChange,
25428 hideLabelFromVision,
25429 markWhenOptional,
25430 validity,
25431 type: isVisible2 ? "text" : "password",
25432 suffix: /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(import_components46.__experimentalInputControlSuffixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(
25433 import_components46.Button,
25434 {
25435 icon: isVisible2 ? unseen_default : seen_default,
25436 onClick: toggleVisibility,
25437 size: "small",
25438 label: isVisible2 ? (0, import_i18n38.__)("Hide password") : (0, import_i18n38.__)("Show password"),
25439 disabled: disabled2,
25440 accessibleWhenDisabled: true
25441 }
25442 ) })
25443 }
25444 }
25445 );
25446 }
25447
25448 // packages/dataviews/build-module/field-types/utils/has-elements.mjs
25449 function hasElements(field) {
25450 return Array.isArray(field.elements) && field.elements.length > 0 || typeof field.getElements === "function";
25451 }
25452
25453 // packages/dataviews/build-module/components/dataform-controls/index.mjs
25454 var import_jsx_runtime119 = __toESM(require_jsx_runtime(), 1);
25455 var FORM_CONTROLS = {
25456 adaptiveSelect: AdaptiveSelect,
25457 array: ArrayControl,
25458 checkbox: Checkbox,
25459 color: Color,
25460 combobox: Combobox3,
25461 datetime: DateTime,
25462 date: DateControl,
25463 email: Email,
25464 telephone: Telephone,
25465 url: Url,
25466 integer: Integer,
25467 number: Number2,
25468 password: Password,
25469 radio: Radio,
25470 select: Select,
25471 text: Text3,
25472 toggle: Toggle,
25473 textarea: Textarea,
25474 richtext: RichText,
25475 toggleGroup: ToggleGroup
25476 };
25477 function isEditConfig(value) {
25478 return value && typeof value === "object" && typeof value.control === "string";
25479 }
25480 function createConfiguredControl(config) {
25481 const { control, ...controlConfig } = config;
25482 const BaseControlType = getControlByType(control);
25483 if (BaseControlType === null) {
25484 return null;
25485 }
25486 return function ConfiguredControl(props) {
25487 return /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(BaseControlType, { ...props, config: controlConfig });
25488 };
25489 }
25490 function getControl(field, fallback) {
25491 if (typeof field.Edit === "function") {
25492 return field.Edit;
25493 }
25494 if (typeof field.Edit === "string") {
25495 return getControlByType(field.Edit);
25496 }
25497 if (isEditConfig(field.Edit)) {
25498 return createConfiguredControl(field.Edit);
25499 }
25500 if (hasElements(field) && field.type !== "array") {
25501 return getControlByType("adaptiveSelect");
25502 }
25503 if (fallback === null) {
25504 return null;
25505 }
25506 return getControlByType(fallback);
25507 }
25508 function getControlByType(type) {
25509 if (Object.keys(FORM_CONTROLS).includes(type)) {
25510 return FORM_CONTROLS[type];
25511 }
25512 return null;
25513 }
25514
25515 // packages/dataviews/build-module/field-types/utils/get-filter-by.mjs
25516 function getFilterBy(field, defaultOperators, validOperators) {
25517 if (field.filterBy === false) {
25518 return false;
25519 }
25520 const operators = field.filterBy?.operators?.filter(
25521 (op) => validOperators.includes(op)
25522 ) ?? defaultOperators;
25523 if (operators.length === 0) {
25524 return false;
25525 }
25526 return {
25527 isPrimary: !!field.filterBy?.isPrimary,
25528 operators
25529 };
25530 }
25531 var get_filter_by_default = getFilterBy;
25532
25533 // packages/dataviews/build-module/field-types/utils/get-value-from-id.mjs
25534 var getValueFromId = (id) => ({ item }) => {
25535 const path = id.split(".");
25536 let value = item;
25537 for (const segment of path) {
25538 if (value.hasOwnProperty(segment)) {
25539 value = value[segment];
25540 } else {
25541 value = void 0;
25542 }
25543 }
25544 return value;
25545 };
25546 var get_value_from_id_default = getValueFromId;
25547
25548 // packages/dataviews/build-module/field-types/utils/set-value-from-id.mjs
25549 var setValueFromId = (id) => ({ value }) => {
25550 const path = id.split(".");
25551 const result = {};
25552 let current = result;
25553 for (const segment of path.slice(0, -1)) {
25554 current[segment] = {};
25555 current = current[segment];
25556 }
25557 current[path.at(-1)] = value;
25558 return result;
25559 };
25560 var set_value_from_id_default = setValueFromId;
25561
25562 // packages/dataviews/build-module/field-types/email.mjs
25563 var import_i18n39 = __toESM(require_i18n(), 1);
25564
25565 // packages/dataviews/build-module/field-types/utils/render-from-elements.mjs
25566 function RenderFromElements({
25567 item,
25568 field
25569 }) {
25570 const { elements, isLoading } = useElements({
25571 elements: field.elements,
25572 getElements: field.getElements
25573 });
25574 const value = field.getValue({ item });
25575 if (isLoading) {
25576 return value;
25577 }
25578 if (elements.length === 0) {
25579 return value;
25580 }
25581 return elements?.find((element) => element.value === value)?.label || field.getValue({ item });
25582 }
25583
25584 // packages/dataviews/build-module/field-types/utils/render-default.mjs
25585 var import_jsx_runtime120 = __toESM(require_jsx_runtime(), 1);
25586 function render({
25587 item,
25588 field
25589 }) {
25590 if (field.hasElements) {
25591 return /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(RenderFromElements, { item, field });
25592 }
25593 return field.getValueFormatted({ item, field });
25594 }
25595
25596 // packages/dataviews/build-module/field-types/utils/sort-text.mjs
25597 var sort_text_default = (a2, b2, direction) => {
25598 return direction === "asc" ? a2.localeCompare(b2) : b2.localeCompare(a2);
25599 };
25600
25601 // packages/dataviews/build-module/field-types/utils/is-valid-required.mjs
25602 function isValidRequired(item, field) {
25603 const value = field.getValue({ item });
25604 return ![void 0, "", null].includes(value);
25605 }
25606
25607 // packages/dataviews/build-module/field-types/utils/is-valid-min-length.mjs
25608 function isValidMinLength(item, field) {
25609 if (typeof field.isValid.minLength?.constraint !== "number") {
25610 return false;
25611 }
25612 const value = field.getValue({ item });
25613 if ([void 0, "", null].includes(value)) {
25614 return true;
25615 }
25616 return String(value).length >= field.isValid.minLength.constraint;
25617 }
25618
25619 // packages/dataviews/build-module/field-types/utils/is-valid-max-length.mjs
25620 function isValidMaxLength(item, field) {
25621 if (typeof field.isValid.maxLength?.constraint !== "number") {
25622 return false;
25623 }
25624 const value = field.getValue({ item });
25625 if ([void 0, "", null].includes(value)) {
25626 return true;
25627 }
25628 return String(value).length <= field.isValid.maxLength.constraint;
25629 }
25630
25631 // packages/dataviews/build-module/field-types/utils/is-valid-pattern.mjs
25632 function isValidPattern(item, field) {
25633 if (field.isValid.pattern?.constraint === void 0) {
25634 return true;
25635 }
25636 try {
25637 const regexp = new RegExp(field.isValid.pattern.constraint);
25638 const value = field.getValue({ item });
25639 if ([void 0, "", null].includes(value)) {
25640 return true;
25641 }
25642 return regexp.test(String(value));
25643 } catch {
25644 return false;
25645 }
25646 }
25647
25648 // packages/dataviews/build-module/field-types/utils/is-valid-elements.mjs
25649 function isValidElements(item, field) {
25650 const elements = field.elements ?? [];
25651 const validValues = elements.map((el) => el.value);
25652 if (validValues.length === 0) {
25653 return true;
25654 }
25655 const value = field.getValue({ item });
25656 return [].concat(value).every((v2) => validValues.includes(v2));
25657 }
25658
25659 // packages/dataviews/build-module/field-types/utils/get-value-formatted-default.mjs
25660 function getValueFormatted({
25661 item,
25662 field
25663 }) {
25664 return field.getValue({ item });
25665 }
25666 var get_value_formatted_default_default = getValueFormatted;
25667
25668 // packages/dataviews/build-module/field-types/email.mjs
25669 var emailRegex = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
25670 function isValidCustom(item, field) {
25671 const value = field.getValue({ item });
25672 if (![void 0, "", null].includes(value) && !emailRegex.test(value)) {
25673 return (0, import_i18n39.__)("Value must be a valid email address.");
25674 }
25675 return null;
25676 }
25677 var email_default = {
25678 type: "email",
25679 render,
25680 Edit: "email",
25681 sort: sort_text_default,
25682 enableSorting: true,
25683 enableGlobalSearch: false,
25684 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
25685 validOperators: [
25686 OPERATOR_IS,
25687 OPERATOR_IS_NOT,
25688 OPERATOR_CONTAINS,
25689 OPERATOR_NOT_CONTAINS,
25690 OPERATOR_STARTS_WITH,
25691 // Multiple selection
25692 OPERATOR_IS_ANY,
25693 OPERATOR_IS_NONE,
25694 OPERATOR_IS_ALL,
25695 OPERATOR_IS_NOT_ALL
25696 ],
25697 format: {},
25698 getValueFormatted: get_value_formatted_default_default,
25699 validate: {
25700 required: isValidRequired,
25701 pattern: isValidPattern,
25702 minLength: isValidMinLength,
25703 maxLength: isValidMaxLength,
25704 elements: isValidElements,
25705 custom: isValidCustom
25706 }
25707 };
25708
25709 // packages/dataviews/build-module/field-types/integer.mjs
25710 var import_i18n40 = __toESM(require_i18n(), 1);
25711
25712 // packages/dataviews/build-module/field-types/utils/sort-number.mjs
25713 var sort_number_default = (a2, b2, direction) => {
25714 return direction === "asc" ? a2 - b2 : b2 - a2;
25715 };
25716
25717 // packages/dataviews/build-module/field-types/utils/is-valid-min.mjs
25718 function isValidMin(item, field) {
25719 if (typeof field.isValid.min?.constraint !== "number") {
25720 return false;
25721 }
25722 const value = field.getValue({ item });
25723 if ([void 0, "", null].includes(value)) {
25724 return true;
25725 }
25726 return Number(value) >= field.isValid.min.constraint;
25727 }
25728
25729 // packages/dataviews/build-module/field-types/utils/is-valid-max.mjs
25730 function isValidMax(item, field) {
25731 if (typeof field.isValid.max?.constraint !== "number") {
25732 return false;
25733 }
25734 const value = field.getValue({ item });
25735 if ([void 0, "", null].includes(value)) {
25736 return true;
25737 }
25738 return Number(value) <= field.isValid.max.constraint;
25739 }
25740
25741 // packages/dataviews/build-module/field-types/integer.mjs
25742 var format2 = {
25743 separatorThousand: ","
25744 };
25745 function getValueFormatted2({
25746 item,
25747 field
25748 }) {
25749 let value = field.getValue({ item });
25750 if (value === null || value === void 0) {
25751 return "";
25752 }
25753 value = Number(value);
25754 if (!Number.isFinite(value)) {
25755 return String(value);
25756 }
25757 let formatInteger;
25758 if (field.type !== "integer") {
25759 formatInteger = format2;
25760 } else {
25761 formatInteger = field.format;
25762 }
25763 const { separatorThousand } = formatInteger;
25764 const integerValue = Math.trunc(value);
25765 if (!separatorThousand) {
25766 return String(integerValue);
25767 }
25768 return String(integerValue).replace(
25769 /\B(?=(\d{3})+(?!\d))/g,
25770 separatorThousand
25771 );
25772 }
25773 function isValidCustom2(item, field) {
25774 const value = field.getValue({ item });
25775 if (![void 0, "", null].includes(value) && !Number.isInteger(value)) {
25776 return (0, import_i18n40.__)("Value must be an integer.");
25777 }
25778 return null;
25779 }
25780 var integer_default = {
25781 type: "integer",
25782 render,
25783 Edit: "integer",
25784 sort: sort_number_default,
25785 enableSorting: true,
25786 enableGlobalSearch: false,
25787 defaultOperators: [
25788 OPERATOR_IS,
25789 OPERATOR_IS_NOT,
25790 OPERATOR_LESS_THAN,
25791 OPERATOR_GREATER_THAN,
25792 OPERATOR_LESS_THAN_OR_EQUAL,
25793 OPERATOR_GREATER_THAN_OR_EQUAL,
25794 OPERATOR_BETWEEN
25795 ],
25796 validOperators: [
25797 // Single-selection
25798 OPERATOR_IS,
25799 OPERATOR_IS_NOT,
25800 OPERATOR_LESS_THAN,
25801 OPERATOR_GREATER_THAN,
25802 OPERATOR_LESS_THAN_OR_EQUAL,
25803 OPERATOR_GREATER_THAN_OR_EQUAL,
25804 OPERATOR_BETWEEN,
25805 // Multiple-selection
25806 OPERATOR_IS_ANY,
25807 OPERATOR_IS_NONE,
25808 OPERATOR_IS_ALL,
25809 OPERATOR_IS_NOT_ALL
25810 ],
25811 format: format2,
25812 getValueFormatted: getValueFormatted2,
25813 validate: {
25814 required: isValidRequired,
25815 min: isValidMin,
25816 max: isValidMax,
25817 elements: isValidElements,
25818 custom: isValidCustom2
25819 }
25820 };
25821
25822 // packages/dataviews/build-module/field-types/number.mjs
25823 var import_i18n41 = __toESM(require_i18n(), 1);
25824 var format3 = {
25825 separatorThousand: ",",
25826 separatorDecimal: ".",
25827 decimals: 2
25828 };
25829 function getValueFormatted3({
25830 item,
25831 field
25832 }) {
25833 let value = field.getValue({ item });
25834 if (value === null || value === void 0) {
25835 return "";
25836 }
25837 value = Number(value);
25838 if (!Number.isFinite(value)) {
25839 return String(value);
25840 }
25841 let formatNumber;
25842 if (field.type !== "number") {
25843 formatNumber = format3;
25844 } else {
25845 formatNumber = field.format;
25846 }
25847 const { separatorThousand, separatorDecimal, decimals } = formatNumber;
25848 const fixedValue = value.toFixed(decimals);
25849 const [integerPart, decimalPart] = fixedValue.split(".");
25850 const formattedInteger = separatorThousand ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separatorThousand) : integerPart;
25851 return decimals === 0 ? formattedInteger : formattedInteger + separatorDecimal + decimalPart;
25852 }
25853 function isEmpty(value) {
25854 return value === "" || value === void 0 || value === null;
25855 }
25856 function isValidCustom3(item, field) {
25857 const value = field.getValue({ item });
25858 if (!isEmpty(value) && !Number.isFinite(value)) {
25859 return (0, import_i18n41.__)("Value must be a number.");
25860 }
25861 return null;
25862 }
25863 var number_default = {
25864 type: "number",
25865 render,
25866 Edit: "number",
25867 sort: sort_number_default,
25868 enableSorting: true,
25869 enableGlobalSearch: false,
25870 defaultOperators: [
25871 OPERATOR_IS,
25872 OPERATOR_IS_NOT,
25873 OPERATOR_LESS_THAN,
25874 OPERATOR_GREATER_THAN,
25875 OPERATOR_LESS_THAN_OR_EQUAL,
25876 OPERATOR_GREATER_THAN_OR_EQUAL,
25877 OPERATOR_BETWEEN
25878 ],
25879 validOperators: [
25880 // Single-selection
25881 OPERATOR_IS,
25882 OPERATOR_IS_NOT,
25883 OPERATOR_LESS_THAN,
25884 OPERATOR_GREATER_THAN,
25885 OPERATOR_LESS_THAN_OR_EQUAL,
25886 OPERATOR_GREATER_THAN_OR_EQUAL,
25887 OPERATOR_BETWEEN,
25888 // Multiple-selection
25889 OPERATOR_IS_ANY,
25890 OPERATOR_IS_NONE,
25891 OPERATOR_IS_ALL,
25892 OPERATOR_IS_NOT_ALL
25893 ],
25894 format: format3,
25895 getValueFormatted: getValueFormatted3,
25896 validate: {
25897 required: isValidRequired,
25898 min: isValidMin,
25899 max: isValidMax,
25900 elements: isValidElements,
25901 custom: isValidCustom3
25902 }
25903 };
25904
25905 // packages/dataviews/build-module/field-types/text.mjs
25906 var text_default = {
25907 type: "text",
25908 render,
25909 Edit: "text",
25910 sort: sort_text_default,
25911 enableSorting: true,
25912 enableGlobalSearch: false,
25913 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
25914 validOperators: [
25915 // Single selection
25916 OPERATOR_IS,
25917 OPERATOR_IS_NOT,
25918 OPERATOR_CONTAINS,
25919 OPERATOR_NOT_CONTAINS,
25920 OPERATOR_STARTS_WITH,
25921 // Multiple selection
25922 OPERATOR_IS_ANY,
25923 OPERATOR_IS_NONE,
25924 OPERATOR_IS_ALL,
25925 OPERATOR_IS_NOT_ALL
25926 ],
25927 format: {},
25928 getValueFormatted: get_value_formatted_default_default,
25929 validate: {
25930 required: isValidRequired,
25931 pattern: isValidPattern,
25932 minLength: isValidMinLength,
25933 maxLength: isValidMaxLength,
25934 elements: isValidElements
25935 }
25936 };
25937
25938 // packages/dataviews/build-module/field-types/datetime.mjs
25939 var import_date7 = __toESM(require_date(), 1);
25940
25941 // packages/dataviews/build-module/field-types/utils/is-valid-date-boundary.mjs
25942 var import_date6 = __toESM(require_date(), 1);
25943 function parseDateLike(value) {
25944 if (!value) {
25945 return null;
25946 }
25947 if (!isValid(new Date(value))) {
25948 return null;
25949 }
25950 const parsed = (0, import_date6.getDate)(value);
25951 return parsed && isValid(parsed) ? parsed : null;
25952 }
25953 function validateDateLikeBoundary(item, field, boundary) {
25954 const constraint = field.isValid[boundary]?.constraint;
25955 if (typeof constraint !== "string") {
25956 return false;
25957 }
25958 const value = field.getValue({ item });
25959 const boundaryValue = Array.isArray(value) ? value[boundary === "min" ? 0 : value.length - 1] : value;
25960 if (boundaryValue === void 0 || boundaryValue === null || boundaryValue === "") {
25961 return true;
25962 }
25963 const parsedConstraint = parseDateLike(constraint);
25964 const parsedValue = parseDateLike(String(boundaryValue));
25965 return !!parsedConstraint && !!parsedValue && (boundary === "min" ? parsedValue.getTime() >= parsedConstraint.getTime() : parsedValue.getTime() <= parsedConstraint.getTime());
25966 }
25967 function isValidMinDate(item, field) {
25968 return validateDateLikeBoundary(item, field, "min");
25969 }
25970 function isValidMaxDate(item, field) {
25971 return validateDateLikeBoundary(item, field, "max");
25972 }
25973
25974 // packages/dataviews/build-module/field-types/datetime.mjs
25975 var format4 = {
25976 datetime: (0, import_date7.getSettings)().formats.datetime,
25977 weekStartsOn: (0, import_date7.getSettings)().l10n.startOfWeek
25978 };
25979 function getValueFormatted4({
25980 item,
25981 field
25982 }) {
25983 const value = field.getValue({ item });
25984 if (["", void 0, null].includes(value)) {
25985 return "";
25986 }
25987 let formatDatetime;
25988 if (field.type !== "datetime") {
25989 formatDatetime = format4;
25990 } else {
25991 formatDatetime = field.format;
25992 }
25993 return (0, import_date7.dateI18n)(formatDatetime.datetime, (0, import_date7.getDate)(value));
25994 }
25995 var sort = (a2, b2, direction) => {
25996 const timeA = new Date(a2).getTime();
25997 const timeB = new Date(b2).getTime();
25998 return direction === "asc" ? timeA - timeB : timeB - timeA;
25999 };
26000 var datetime_default = {
26001 type: "datetime",
26002 render,
26003 Edit: "datetime",
26004 sort,
26005 enableSorting: true,
26006 enableGlobalSearch: false,
26007 defaultOperators: [
26008 OPERATOR_ON,
26009 OPERATOR_NOT_ON,
26010 OPERATOR_BEFORE,
26011 OPERATOR_AFTER,
26012 OPERATOR_BEFORE_INC,
26013 OPERATOR_AFTER_INC,
26014 OPERATOR_IN_THE_PAST,
26015 OPERATOR_OVER
26016 ],
26017 validOperators: [
26018 OPERATOR_ON,
26019 OPERATOR_NOT_ON,
26020 OPERATOR_BEFORE,
26021 OPERATOR_AFTER,
26022 OPERATOR_BEFORE_INC,
26023 OPERATOR_AFTER_INC,
26024 OPERATOR_IN_THE_PAST,
26025 OPERATOR_OVER
26026 ],
26027 format: format4,
26028 getValueFormatted: getValueFormatted4,
26029 validate: {
26030 required: isValidRequired,
26031 elements: isValidElements,
26032 min: isValidMinDate,
26033 max: isValidMaxDate
26034 }
26035 };
26036
26037 // packages/dataviews/build-module/field-types/date.mjs
26038 var import_date8 = __toESM(require_date(), 1);
26039 var format5 = {
26040 date: (0, import_date8.getSettings)().formats.date,
26041 weekStartsOn: (0, import_date8.getSettings)().l10n.startOfWeek
26042 };
26043 function getValueFormatted5({
26044 item,
26045 field
26046 }) {
26047 const value = field.getValue({ item });
26048 if (["", void 0, null].includes(value)) {
26049 return "";
26050 }
26051 let formatDate2;
26052 if (field.type !== "date") {
26053 formatDate2 = format5;
26054 } else {
26055 formatDate2 = field.format;
26056 }
26057 return (0, import_date8.dateI18n)(formatDate2.date, (0, import_date8.getDate)(value));
26058 }
26059 var sort2 = (a2, b2, direction) => {
26060 const timeA = new Date(a2).getTime();
26061 const timeB = new Date(b2).getTime();
26062 return direction === "asc" ? timeA - timeB : timeB - timeA;
26063 };
26064 var date_default = {
26065 type: "date",
26066 render,
26067 Edit: "date",
26068 sort: sort2,
26069 enableSorting: true,
26070 enableGlobalSearch: false,
26071 defaultOperators: [
26072 OPERATOR_ON,
26073 OPERATOR_NOT_ON,
26074 OPERATOR_BEFORE,
26075 OPERATOR_AFTER,
26076 OPERATOR_BEFORE_INC,
26077 OPERATOR_AFTER_INC,
26078 OPERATOR_IN_THE_PAST,
26079 OPERATOR_OVER,
26080 OPERATOR_BETWEEN
26081 ],
26082 validOperators: [
26083 OPERATOR_ON,
26084 OPERATOR_NOT_ON,
26085 OPERATOR_BEFORE,
26086 OPERATOR_AFTER,
26087 OPERATOR_BEFORE_INC,
26088 OPERATOR_AFTER_INC,
26089 OPERATOR_IN_THE_PAST,
26090 OPERATOR_OVER,
26091 OPERATOR_BETWEEN
26092 ],
26093 format: format5,
26094 getValueFormatted: getValueFormatted5,
26095 validate: {
26096 required: isValidRequired,
26097 elements: isValidElements,
26098 min: isValidMinDate,
26099 max: isValidMaxDate
26100 }
26101 };
26102
26103 // packages/dataviews/build-module/field-types/boolean.mjs
26104 var import_i18n42 = __toESM(require_i18n(), 1);
26105
26106 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-bool.mjs
26107 function isValidRequiredForBool(item, field) {
26108 const value = field.getValue({ item });
26109 return value === true;
26110 }
26111
26112 // packages/dataviews/build-module/field-types/boolean.mjs
26113 function getValueFormatted6({
26114 item,
26115 field
26116 }) {
26117 const value = field.getValue({ item });
26118 if (value === true) {
26119 return (0, import_i18n42.__)("True");
26120 }
26121 if (value === false) {
26122 return (0, import_i18n42.__)("False");
26123 }
26124 return "";
26125 }
26126 function isValidCustom4(item, field) {
26127 const value = field.getValue({ item });
26128 if (![void 0, "", null].includes(value) && ![true, false].includes(value)) {
26129 return (0, import_i18n42.__)("Value must be true, false, or undefined");
26130 }
26131 return null;
26132 }
26133 var sort3 = (a2, b2, direction) => {
26134 const boolA = Boolean(a2);
26135 const boolB = Boolean(b2);
26136 if (boolA === boolB) {
26137 return 0;
26138 }
26139 if (direction === "asc") {
26140 return boolA ? 1 : -1;
26141 }
26142 return boolA ? -1 : 1;
26143 };
26144 var boolean_default = {
26145 type: "boolean",
26146 render,
26147 Edit: "checkbox",
26148 sort: sort3,
26149 validate: {
26150 required: isValidRequiredForBool,
26151 elements: isValidElements,
26152 custom: isValidCustom4
26153 },
26154 enableSorting: true,
26155 enableGlobalSearch: false,
26156 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
26157 validOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
26158 format: {},
26159 getValueFormatted: getValueFormatted6
26160 };
26161
26162 // packages/dataviews/build-module/field-types/media.mjs
26163 var media_default = {
26164 type: "media",
26165 render: () => null,
26166 Edit: null,
26167 sort: () => 0,
26168 enableSorting: false,
26169 enableGlobalSearch: false,
26170 defaultOperators: [],
26171 validOperators: [],
26172 format: {},
26173 getValueFormatted: get_value_formatted_default_default,
26174 // cannot validate any constraint, so
26175 // the only available validation for the field author
26176 // would be providing a custom validator.
26177 validate: {}
26178 };
26179
26180 // packages/dataviews/build-module/field-types/array.mjs
26181 var import_i18n43 = __toESM(require_i18n(), 1);
26182
26183 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-array.mjs
26184 function isValidRequiredForArray(item, field) {
26185 const value = field.getValue({ item });
26186 return Array.isArray(value) && value.length > 0 && value.every(
26187 (element) => ![void 0, "", null].includes(element)
26188 );
26189 }
26190
26191 // packages/dataviews/build-module/field-types/array.mjs
26192 function getValueFormatted7({
26193 item,
26194 field
26195 }) {
26196 const value = field.getValue({ item });
26197 const arr = Array.isArray(value) ? value : [];
26198 return arr.join(", ");
26199 }
26200 function render2({ item, field }) {
26201 return getValueFormatted7({ item, field });
26202 }
26203 function isValidCustom5(item, field) {
26204 const value = field.getValue({ item });
26205 if (![void 0, "", null].includes(value) && !Array.isArray(value)) {
26206 return (0, import_i18n43.__)("Value must be an array.");
26207 }
26208 if (!value.every((v2) => typeof v2 === "string")) {
26209 return (0, import_i18n43.__)("Every value must be a string.");
26210 }
26211 return null;
26212 }
26213 var sort4 = (a2, b2, direction) => {
26214 const arrA = Array.isArray(a2) ? a2 : [];
26215 const arrB = Array.isArray(b2) ? b2 : [];
26216 if (arrA.length !== arrB.length) {
26217 return direction === "asc" ? arrA.length - arrB.length : arrB.length - arrA.length;
26218 }
26219 const joinedA = arrA.join(",");
26220 const joinedB = arrB.join(",");
26221 return direction === "asc" ? joinedA.localeCompare(joinedB) : joinedB.localeCompare(joinedA);
26222 };
26223 var array_default = {
26224 type: "array",
26225 render: render2,
26226 Edit: "array",
26227 sort: sort4,
26228 enableSorting: true,
26229 enableGlobalSearch: false,
26230 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26231 validOperators: [
26232 OPERATOR_IS_ANY,
26233 OPERATOR_IS_NONE,
26234 OPERATOR_IS_ALL,
26235 OPERATOR_IS_NOT_ALL
26236 ],
26237 format: {},
26238 getValueFormatted: getValueFormatted7,
26239 validate: {
26240 required: isValidRequiredForArray,
26241 elements: isValidElements,
26242 custom: isValidCustom5
26243 }
26244 };
26245
26246 // packages/dataviews/build-module/field-types/password.mjs
26247 function getValueFormatted8({
26248 item,
26249 field
26250 }) {
26251 return field.getValue({ item }) ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : "";
26252 }
26253 var password_default = {
26254 type: "password",
26255 render,
26256 Edit: "password",
26257 sort: () => 0,
26258 // Passwords should not be sortable for security reasons
26259 enableSorting: false,
26260 enableGlobalSearch: false,
26261 defaultOperators: [],
26262 validOperators: [],
26263 format: {},
26264 getValueFormatted: getValueFormatted8,
26265 validate: {
26266 required: isValidRequired,
26267 pattern: isValidPattern,
26268 minLength: isValidMinLength,
26269 maxLength: isValidMaxLength,
26270 elements: isValidElements
26271 }
26272 };
26273
26274 // packages/dataviews/build-module/field-types/telephone.mjs
26275 var telephone_default = {
26276 type: "telephone",
26277 render,
26278 Edit: "telephone",
26279 sort: sort_text_default,
26280 enableSorting: true,
26281 enableGlobalSearch: false,
26282 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26283 validOperators: [
26284 OPERATOR_IS,
26285 OPERATOR_IS_NOT,
26286 OPERATOR_CONTAINS,
26287 OPERATOR_NOT_CONTAINS,
26288 OPERATOR_STARTS_WITH,
26289 // Multiple selection
26290 OPERATOR_IS_ANY,
26291 OPERATOR_IS_NONE,
26292 OPERATOR_IS_ALL,
26293 OPERATOR_IS_NOT_ALL
26294 ],
26295 format: {},
26296 getValueFormatted: get_value_formatted_default_default,
26297 validate: {
26298 required: isValidRequired,
26299 pattern: isValidPattern,
26300 minLength: isValidMinLength,
26301 maxLength: isValidMaxLength,
26302 elements: isValidElements
26303 }
26304 };
26305
26306 // packages/dataviews/build-module/field-types/color.mjs
26307 var import_i18n44 = __toESM(require_i18n(), 1);
26308 var import_jsx_runtime121 = __toESM(require_jsx_runtime(), 1);
26309 function render3({ item, field }) {
26310 if (field.hasElements) {
26311 return /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(RenderFromElements, { item, field });
26312 }
26313 const value = get_value_formatted_default_default({ item, field });
26314 if (!value || !w(value).isValid()) {
26315 return value;
26316 }
26317 return /* @__PURE__ */ (0, import_jsx_runtime121.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
26318 /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
26319 "div",
26320 {
26321 style: {
26322 width: "16px",
26323 height: "16px",
26324 borderRadius: "50%",
26325 backgroundColor: value,
26326 border: "1px solid #ddd",
26327 flexShrink: 0
26328 }
26329 }
26330 ),
26331 /* @__PURE__ */ (0, import_jsx_runtime121.jsx)("span", { children: value })
26332 ] });
26333 }
26334 function isValidCustom6(item, field) {
26335 const value = field.getValue({ item });
26336 if (![void 0, "", null].includes(value) && !w(value).isValid()) {
26337 return (0, import_i18n44.__)("Value must be a valid color.");
26338 }
26339 return null;
26340 }
26341 var sort5 = (a2, b2, direction) => {
26342 const colorA = w(a2);
26343 const colorB = w(b2);
26344 if (!colorA.isValid() && !colorB.isValid()) {
26345 return 0;
26346 }
26347 if (!colorA.isValid()) {
26348 return direction === "asc" ? 1 : -1;
26349 }
26350 if (!colorB.isValid()) {
26351 return direction === "asc" ? -1 : 1;
26352 }
26353 const hslA = colorA.toHsl();
26354 const hslB = colorB.toHsl();
26355 if (hslA.h !== hslB.h) {
26356 return direction === "asc" ? hslA.h - hslB.h : hslB.h - hslA.h;
26357 }
26358 if (hslA.s !== hslB.s) {
26359 return direction === "asc" ? hslA.s - hslB.s : hslB.s - hslA.s;
26360 }
26361 return direction === "asc" ? hslA.l - hslB.l : hslB.l - hslA.l;
26362 };
26363 var color_default = {
26364 type: "color",
26365 render: render3,
26366 Edit: "color",
26367 sort: sort5,
26368 enableSorting: true,
26369 enableGlobalSearch: false,
26370 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26371 validOperators: [
26372 OPERATOR_IS,
26373 OPERATOR_IS_NOT,
26374 OPERATOR_IS_ANY,
26375 OPERATOR_IS_NONE
26376 ],
26377 format: {},
26378 getValueFormatted: get_value_formatted_default_default,
26379 validate: {
26380 required: isValidRequired,
26381 elements: isValidElements,
26382 custom: isValidCustom6
26383 }
26384 };
26385
26386 // packages/dataviews/build-module/field-types/url.mjs
26387 var url_default = {
26388 type: "url",
26389 render,
26390 Edit: "url",
26391 sort: sort_text_default,
26392 enableSorting: true,
26393 enableGlobalSearch: false,
26394 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26395 validOperators: [
26396 OPERATOR_IS,
26397 OPERATOR_IS_NOT,
26398 OPERATOR_CONTAINS,
26399 OPERATOR_NOT_CONTAINS,
26400 OPERATOR_STARTS_WITH,
26401 // Multiple selection
26402 OPERATOR_IS_ANY,
26403 OPERATOR_IS_NONE,
26404 OPERATOR_IS_ALL,
26405 OPERATOR_IS_NOT_ALL
26406 ],
26407 format: {},
26408 getValueFormatted: get_value_formatted_default_default,
26409 validate: {
26410 required: isValidRequired,
26411 pattern: isValidPattern,
26412 minLength: isValidMinLength,
26413 maxLength: isValidMaxLength,
26414 elements: isValidElements
26415 }
26416 };
26417
26418 // packages/dataviews/build-module/field-types/no-type.mjs
26419 var sort6 = (a2, b2, direction) => {
26420 if (typeof a2 === "number" && typeof b2 === "number") {
26421 return sort_number_default(a2, b2, direction);
26422 }
26423 return sort_text_default(a2, b2, direction);
26424 };
26425 var no_type_default = {
26426 // type: no type for this one
26427 render,
26428 Edit: null,
26429 sort: sort6,
26430 enableSorting: true,
26431 enableGlobalSearch: false,
26432 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
26433 validOperators: getAllOperatorNames(),
26434 format: {},
26435 getValueFormatted: get_value_formatted_default_default,
26436 validate: {
26437 required: isValidRequired,
26438 elements: isValidElements
26439 }
26440 };
26441
26442 // packages/dataviews/build-module/field-types/utils/get-is-valid.mjs
26443 function supportsNumericRangeConstraint(type) {
26444 return type === "integer" || type === "number";
26445 }
26446 function supportsDateRangeConstraint(type) {
26447 return type === "date" || type === "datetime";
26448 }
26449 function normalizeRangeRule(value, fieldType, key) {
26450 const validator = fieldType.validate[key];
26451 if (validator && (typeof value === "number" && supportsNumericRangeConstraint(fieldType.type) || typeof value === "string" && supportsDateRangeConstraint(fieldType.type))) {
26452 return { constraint: value, validate: validator };
26453 }
26454 return void 0;
26455 }
26456 function getIsValid(field, fieldType) {
26457 const rules = field.isValid;
26458 let required;
26459 if (rules?.required === true && fieldType.validate.required !== void 0) {
26460 required = {
26461 constraint: true,
26462 validate: fieldType.validate.required
26463 };
26464 }
26465 let elements;
26466 if ((rules?.elements === true || // elements is enabled unless the field opts-out
26467 rules?.elements === void 0 && (!!field.elements || !!field.getElements)) && fieldType.validate.elements !== void 0) {
26468 elements = {
26469 constraint: true,
26470 validate: fieldType.validate.elements
26471 };
26472 }
26473 const min2 = normalizeRangeRule(rules?.min, fieldType, "min");
26474 const max2 = normalizeRangeRule(rules?.max, fieldType, "max");
26475 const minLengthValue = rules?.minLength;
26476 let minLength;
26477 if (typeof minLengthValue === "number" && fieldType.validate.minLength !== void 0) {
26478 minLength = {
26479 constraint: minLengthValue,
26480 validate: fieldType.validate.minLength
26481 };
26482 }
26483 const maxLengthValue = rules?.maxLength;
26484 let maxLength;
26485 if (typeof maxLengthValue === "number" && fieldType.validate.maxLength !== void 0) {
26486 maxLength = {
26487 constraint: maxLengthValue,
26488 validate: fieldType.validate.maxLength
26489 };
26490 }
26491 const patternValue = rules?.pattern;
26492 let pattern;
26493 if (patternValue !== void 0 && fieldType.validate.pattern !== void 0) {
26494 pattern = {
26495 constraint: patternValue,
26496 validate: fieldType.validate.pattern
26497 };
26498 }
26499 const custom = rules?.custom ?? fieldType.validate.custom;
26500 return {
26501 required,
26502 elements,
26503 min: min2,
26504 max: max2,
26505 minLength,
26506 maxLength,
26507 pattern,
26508 custom
26509 };
26510 }
26511
26512 // packages/dataviews/build-module/field-types/utils/get-filter.mjs
26513 function getFilter(fieldType) {
26514 return fieldType.validOperators.reduce((accumulator, operator) => {
26515 const operatorObj = getOperatorByName(operator);
26516 if (operatorObj?.filter) {
26517 accumulator[operator] = operatorObj.filter;
26518 }
26519 return accumulator;
26520 }, {});
26521 }
26522
26523 // packages/dataviews/build-module/field-types/utils/get-format.mjs
26524 function getFormat(field, fieldType) {
26525 return {
26526 ...fieldType.format,
26527 ...field.format
26528 };
26529 }
26530 var get_format_default = getFormat;
26531
26532 // packages/dataviews/build-module/field-types/index.mjs
26533 function getFieldTypeByName(type) {
26534 const found = [
26535 email_default,
26536 integer_default,
26537 number_default,
26538 text_default,
26539 datetime_default,
26540 date_default,
26541 boolean_default,
26542 media_default,
26543 array_default,
26544 password_default,
26545 telephone_default,
26546 color_default,
26547 url_default
26548 ].find((fieldType) => fieldType?.type === type);
26549 if (!!found) {
26550 return found;
26551 }
26552 return no_type_default;
26553 }
26554 function normalizeFields(fields) {
26555 return fields.map((field) => {
26556 const fieldType = getFieldTypeByName(field.type);
26557 const getValue = field.getValue || get_value_from_id_default(field.id);
26558 const sort7 = function(a2, b2, direction) {
26559 const aValue = getValue({ item: a2 });
26560 const bValue = getValue({ item: b2 });
26561 return field.sort ? field.sort(aValue, bValue, direction) : fieldType.sort(aValue, bValue, direction);
26562 };
26563 return {
26564 id: field.id,
26565 label: field.label || field.id,
26566 header: field.header || field.label || field.id,
26567 description: field.description,
26568 placeholder: field.placeholder,
26569 getValue,
26570 setValue: field.setValue || set_value_from_id_default(field.id),
26571 elements: field.elements,
26572 getElements: field.getElements,
26573 hasElements: hasElements(field),
26574 isVisible: field.isVisible,
26575 isDisabled: typeof field.isDisabled === "function" ? field.isDisabled : () => !!field.isDisabled,
26576 enableHiding: field.enableHiding ?? true,
26577 readOnly: field.readOnly ?? false,
26578 // The type provides defaults for the following props
26579 type: fieldType.type,
26580 render: field.render ?? fieldType.render,
26581 Edit: getControl(field, fieldType.Edit),
26582 sort: sort7,
26583 enableSorting: field.enableSorting ?? fieldType.enableSorting,
26584 enableGlobalSearch: field.enableGlobalSearch ?? fieldType.enableGlobalSearch,
26585 isValid: getIsValid(field, fieldType),
26586 filterBy: get_filter_by_default(
26587 field,
26588 fieldType.defaultOperators,
26589 fieldType.validOperators
26590 ),
26591 filter: getFilter(fieldType),
26592 format: get_format_default(field, fieldType),
26593 getValueFormatted: field.getValueFormatted ?? fieldType.getValueFormatted
26594 };
26595 });
26596 }
26597
26598 // packages/dataviews/build-module/hooks/use-data.mjs
26599 var import_element83 = __toESM(require_element(), 1);
26600 function useData({
26601 view,
26602 data: shownData,
26603 getItemId,
26604 isLoading,
26605 paginationInfo,
26606 selection
26607 }) {
26608 const isInfiniteScrollEnabled = view.infiniteScrollEnabled;
26609 const [hasInitiallyLoaded, setHasInitiallyLoaded] = (0, import_element83.useState)(
26610 !isLoading
26611 );
26612 (0, import_element83.useEffect)(() => {
26613 if (!isLoading) {
26614 setHasInitiallyLoaded(true);
26615 }
26616 }, [isLoading]);
26617 const previousDataRef = (0, import_element83.useRef)(shownData);
26618 const previousPaginationInfoRef = (0, import_element83.useRef)(paginationInfo);
26619 (0, import_element83.useEffect)(() => {
26620 if (!isLoading) {
26621 previousDataRef.current = shownData;
26622 previousPaginationInfoRef.current = paginationInfo;
26623 }
26624 }, [shownData, isLoading, paginationInfo]);
26625 const [visibleEntries, setVisibleEntries] = (0, import_element83.useState)([]);
26626 const positionMapRef = (0, import_element83.useRef)(/* @__PURE__ */ new Map());
26627 const allLoadedRecordsRef = (0, import_element83.useRef)([]);
26628 const prevViewParamsRef = (0, import_element83.useRef)({
26629 search: void 0,
26630 filters: void 0,
26631 perPage: void 0
26632 });
26633 const scrollDirectionRef = (0, import_element83.useRef)(void 0);
26634 const prevStartPositionRef = (0, import_element83.useRef)(void 0);
26635 const hasInitializedRef = (0, import_element83.useRef)(false);
26636 const allLoadedRecords = (0, import_element83.useMemo)(() => {
26637 if (view.startPosition !== void 0 && prevStartPositionRef.current !== void 0) {
26638 if (view.startPosition < prevStartPositionRef.current) {
26639 scrollDirectionRef.current = "up";
26640 } else if (view.startPosition > prevStartPositionRef.current) {
26641 scrollDirectionRef.current = "down";
26642 }
26643 }
26644 prevStartPositionRef.current = view.startPosition;
26645 const currentFiltersKey = JSON.stringify(view.filters ?? []);
26646 const prevFiltersKey = prevViewParamsRef.current.filters;
26647 const shouldReset = !hasInitializedRef.current || !view.infiniteScrollEnabled || view.search !== prevViewParamsRef.current.search || currentFiltersKey !== prevFiltersKey || view.perPage !== prevViewParamsRef.current.perPage;
26648 hasInitializedRef.current = true;
26649 prevViewParamsRef.current = {
26650 search: view.search,
26651 filters: currentFiltersKey,
26652 perPage: view.perPage
26653 };
26654 if (shouldReset) {
26655 positionMapRef.current.clear();
26656 scrollDirectionRef.current = void 0;
26657 const startPosition = view.search ? 1 : view.startPosition ?? 1;
26658 const records = shownData.map((record, index2) => {
26659 const position = startPosition + index2;
26660 positionMapRef.current.set(getItemId(record), position);
26661 return {
26662 ...record,
26663 position
26664 };
26665 });
26666 allLoadedRecordsRef.current = records;
26667 return records;
26668 }
26669 const prev = allLoadedRecordsRef.current;
26670 const shownDataIds = new Set(shownData.map(getItemId));
26671 const scrollDirection = scrollDirectionRef.current;
26672 const basePosition = view.search ? 1 : view.startPosition ?? 1;
26673 const newRecords = shownData.map((record, index2) => {
26674 const itemId = getItemId(record);
26675 const position = view.infiniteScrollEnabled ? basePosition + index2 : void 0;
26676 if (position !== void 0) {
26677 positionMapRef.current.set(itemId, position);
26678 }
26679 return {
26680 ...record,
26681 position
26682 };
26683 });
26684 if (newRecords.length === 0) {
26685 return prev;
26686 }
26687 const prevWithoutDuplicates = prev.filter(
26688 (record) => !shownDataIds.has(getItemId(record))
26689 );
26690 const allRecords = scrollDirection === "up" ? [...newRecords, ...prevWithoutDuplicates] : [...prevWithoutDuplicates, ...newRecords];
26691 allRecords.sort((a2, b2) => {
26692 const posA = a2.position;
26693 const posB = b2.position;
26694 return posA - posB;
26695 });
26696 let result = allRecords;
26697 if (visibleEntries.length > 0) {
26698 const visibleMin = Math.min(...visibleEntries);
26699 const visibleMax = Math.max(...visibleEntries);
26700 const buffer = 20;
26701 const recordPositions = allRecords.map(
26702 (r3) => r3.position
26703 );
26704 const minRecordPos = Math.min(...recordPositions);
26705 const maxRecordPos = Math.max(...recordPositions);
26706 const hasOverlap = !(maxRecordPos < visibleMin - buffer || minRecordPos > visibleMax + buffer);
26707 if (hasOverlap) {
26708 result = allRecords.filter((record) => {
26709 const itemId = getItemId(record);
26710 const isSelected2 = selection?.includes(itemId);
26711 if (isSelected2) {
26712 return true;
26713 }
26714 const itemPosition = record.position;
26715 if (scrollDirection === "up") {
26716 return itemPosition <= visibleMax + buffer;
26717 } else if (scrollDirection === "down") {
26718 return itemPosition >= visibleMin - buffer;
26719 }
26720 return itemPosition >= visibleMin - buffer && itemPosition <= visibleMax + buffer;
26721 });
26722 }
26723 }
26724 allLoadedRecordsRef.current = result;
26725 return result;
26726 }, [
26727 shownData,
26728 view.search,
26729 view.filters,
26730 view.perPage,
26731 view.startPosition,
26732 view.infiniteScrollEnabled,
26733 visibleEntries,
26734 selection,
26735 getItemId
26736 ]);
26737 if (!isInfiniteScrollEnabled) {
26738 const dataToReturn = isLoading && previousDataRef.current?.length ? previousDataRef.current : shownData;
26739 return {
26740 data: dataToReturn.map((item) => ({
26741 ...item,
26742 position: void 0
26743 })),
26744 paginationInfo: isLoading && previousDataRef.current?.length ? previousPaginationInfoRef.current : paginationInfo,
26745 hasInitiallyLoaded,
26746 setVisibleEntries: void 0
26747 };
26748 }
26749 return {
26750 data: allLoadedRecords,
26751 paginationInfo,
26752 hasInitiallyLoaded,
26753 setVisibleEntries
26754 };
26755 }
26756
26757 // packages/dataviews/build-module/hooks/use-infinite-scroll.mjs
26758 var import_element84 = __toESM(require_element(), 1);
26759 var import_compose13 = __toESM(require_compose(), 1);
26760 function captureAnchorElement(container, anchorElementRef, direction) {
26761 const containerRect = container.getBoundingClientRect();
26762 const centerY = containerRect.top + containerRect.height / 2;
26763 const items = Array.from(container.querySelectorAll("[aria-posinset]"));
26764 if (items.length === 0) {
26765 return false;
26766 }
26767 const bestAnchor = items.reduce((best, item) => {
26768 const itemRect = item.getBoundingClientRect();
26769 const itemCenterY = itemRect.top + itemRect.height / 2;
26770 const distance = Math.abs(itemCenterY - centerY);
26771 const bestRect = best.getBoundingClientRect();
26772 const bestCenterY = bestRect.top + bestRect.height / 2;
26773 const bestDistance = Math.abs(bestCenterY - centerY);
26774 return distance < bestDistance ? item : best;
26775 });
26776 const posinset = Number(bestAnchor.getAttribute("aria-posinset"));
26777 const anchorRect = bestAnchor.getBoundingClientRect();
26778 anchorElementRef.current = {
26779 posinset,
26780 viewportOffset: anchorRect.top - containerRect.top,
26781 scrollTop: container.scrollTop,
26782 direction
26783 };
26784 return true;
26785 }
26786 function useInfiniteScroll({
26787 view,
26788 onChangeView,
26789 isLoading,
26790 paginationInfo,
26791 containerRef,
26792 setVisibleEntries
26793 }) {
26794 const anchorElementRef = (0, import_element84.useRef)(null);
26795 const viewRef = (0, import_element84.useRef)(view);
26796 const isLoadingRef = (0, import_element84.useRef)(isLoading);
26797 const onChangeViewRef = (0, import_element84.useRef)(onChangeView);
26798 const totalItemsRef = (0, import_element84.useRef)(paginationInfo.totalItems);
26799 (0, import_element84.useLayoutEffect)(() => {
26800 viewRef.current = view;
26801 isLoadingRef.current = isLoading;
26802 onChangeViewRef.current = onChangeView;
26803 totalItemsRef.current = paginationInfo.totalItems;
26804 }, [view, isLoading, onChangeView, paginationInfo.totalItems]);
26805 const intersectionObserverCallback = (0, import_element84.useCallback)(
26806 (entries) => {
26807 if (!setVisibleEntries) {
26808 return;
26809 }
26810 setVisibleEntries((prev) => {
26811 const newVisibleEntries = new Set(prev);
26812 let hasChanged = false;
26813 entries.forEach((entry) => {
26814 const posInSet = Number(
26815 entry.target?.attributes?.getNamedItem(
26816 "aria-posinset"
26817 )?.value
26818 );
26819 if (isNaN(posInSet)) {
26820 return;
26821 }
26822 if (entry.isIntersecting) {
26823 if (!newVisibleEntries.has(posInSet)) {
26824 newVisibleEntries.add(posInSet);
26825 hasChanged = true;
26826 }
26827 } else if (newVisibleEntries.has(posInSet)) {
26828 newVisibleEntries.delete(posInSet);
26829 hasChanged = true;
26830 }
26831 });
26832 return hasChanged ? Array.from(newVisibleEntries).sort() : prev;
26833 });
26834 },
26835 [setVisibleEntries]
26836 );
26837 (0, import_element84.useLayoutEffect)(() => {
26838 const container = containerRef.current;
26839 const anchor = anchorElementRef.current;
26840 if (!container || !view.infiniteScrollEnabled || !anchor || isLoading) {
26841 return;
26842 }
26843 const anchorElement = container.querySelector(
26844 `[aria-posinset="${anchor.posinset}"]`
26845 );
26846 if (anchorElement) {
26847 const containerRect = container.getBoundingClientRect();
26848 const anchorRect = anchorElement.getBoundingClientRect();
26849 const currentOffset = anchorRect.top - containerRect.top;
26850 const scrollAdjustment = currentOffset - anchor.viewportOffset + (container.scrollTop - anchor.scrollTop);
26851 if (Math.abs(scrollAdjustment) > 1) {
26852 container.scrollTop += scrollAdjustment;
26853 }
26854 }
26855 anchorElementRef.current = null;
26856 }, [containerRef, isLoading, view.infiniteScrollEnabled]);
26857 const intersectionObserverRef = (0, import_element84.useRef)(
26858 null
26859 );
26860 (0, import_element84.useEffect)(() => {
26861 if (!view.infiniteScrollEnabled || !intersectionObserverCallback) {
26862 if (intersectionObserverRef.current) {
26863 intersectionObserverRef.current.disconnect();
26864 intersectionObserverRef.current = null;
26865 }
26866 return;
26867 }
26868 intersectionObserverRef.current = new IntersectionObserver(
26869 intersectionObserverCallback,
26870 { root: null, rootMargin: "0px", threshold: 0.1 }
26871 );
26872 return () => {
26873 if (intersectionObserverRef.current) {
26874 intersectionObserverRef.current.disconnect();
26875 intersectionObserverRef.current = null;
26876 }
26877 };
26878 }, [view.infiniteScrollEnabled, intersectionObserverCallback]);
26879 (0, import_element84.useEffect)(() => {
26880 if (!view.infiniteScrollEnabled || !containerRef.current) {
26881 return;
26882 }
26883 let lastScrollTop = 0;
26884 const BOTTOM_THRESHOLD = 600;
26885 const TOP_THRESHOLD = 800;
26886 const handleScroll = (0, import_compose13.throttle)((event) => {
26887 const currentView = viewRef.current;
26888 const totalItems = totalItemsRef.current;
26889 const target = event.target;
26890 const scrollTop = target.scrollTop;
26891 const scrollHeight = target.scrollHeight;
26892 const clientHeight = target.clientHeight;
26893 const scrollDirection = scrollTop > lastScrollTop ? "down" : "up";
26894 lastScrollTop = scrollTop;
26895 if (isLoadingRef.current) {
26896 return;
26897 }
26898 const currentStartPosition = currentView.startPosition || 1;
26899 const batchSize = currentView.perPage || 10;
26900 const currentEndPosition = Math.min(
26901 currentStartPosition + batchSize,
26902 totalItems
26903 );
26904 if (scrollDirection === "down" && scrollTop + clientHeight >= scrollHeight - BOTTOM_THRESHOLD) {
26905 if (currentEndPosition < totalItems) {
26906 const newStartPosition = currentEndPosition;
26907 captureAnchorElement(target, anchorElementRef, "down");
26908 onChangeViewRef.current({
26909 ...currentView,
26910 startPosition: newStartPosition
26911 });
26912 }
26913 }
26914 if (scrollDirection === "up" && scrollTop <= TOP_THRESHOLD) {
26915 if (currentStartPosition > 1) {
26916 const calculatedStartPosition = currentStartPosition - batchSize;
26917 const newStartPosition = calculatedStartPosition < 6 ? 1 : calculatedStartPosition;
26918 captureAnchorElement(target, anchorElementRef, "up");
26919 onChangeViewRef.current({
26920 ...currentView,
26921 startPosition: newStartPosition
26922 });
26923 }
26924 }
26925 }, 50);
26926 const container = containerRef.current;
26927 container.addEventListener("scroll", handleScroll);
26928 return () => {
26929 container.removeEventListener("scroll", handleScroll);
26930 handleScroll.cancel();
26931 };
26932 }, [containerRef, view.infiniteScrollEnabled]);
26933 return {
26934 intersectionObserver: intersectionObserverRef.current
26935 };
26936 }
26937
26938 // packages/dataviews/build-module/dataviews/index.mjs
26939 var import_jsx_runtime122 = __toESM(require_jsx_runtime(), 1);
26940 var defaultGetItemId = (item) => item.id;
26941 var defaultIsItemClickable = () => true;
26942 var EMPTY_ARRAY7 = [];
26943 var DEFAULT_LAYOUTS = { table: {}, grid: {}, list: {} };
26944 var dataViewsLayouts = VIEW_LAYOUTS.filter(
26945 (viewLayout) => !viewLayout.isPicker
26946 );
26947 function DefaultUI({
26948 header,
26949 search = true,
26950 searchLabel = void 0
26951 }) {
26952 const { view } = (0, import_element85.useContext)(dataviews_context_default);
26953 const isInfiniteScroll = view.infiniteScrollEnabled;
26954 return /* @__PURE__ */ (0, import_jsx_runtime122.jsxs)(import_jsx_runtime122.Fragment, { children: [
26955 /* @__PURE__ */ (0, import_jsx_runtime122.jsxs)(
26956 Stack,
26957 {
26958 direction: "row",
26959 align: "top",
26960 justify: "space-between",
26961 className: clsx_default("dataviews__view-actions", {
26962 "dataviews__view-actions--infinite-scroll": isInfiniteScroll
26963 }),
26964 gap: "xs",
26965 children: [
26966 /* @__PURE__ */ (0, import_jsx_runtime122.jsxs)(
26967 Stack,
26968 {
26969 direction: "row",
26970 justify: "start",
26971 gap: "sm",
26972 className: "dataviews__search",
26973 children: [
26974 search && /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(dataviews_search_default, { label: searchLabel }),
26975 /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(toggle_default, {})
26976 ]
26977 }
26978 ),
26979 /* @__PURE__ */ (0, import_jsx_runtime122.jsxs)(Stack, { direction: "row", gap: "xs", style: { flexShrink: 0 }, children: [
26980 /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(dataviews_view_config_default, {}),
26981 header
26982 ] })
26983 ]
26984 }
26985 ),
26986 /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(filters_toggled_default, { className: "dataviews-filters__container" }),
26987 /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(DataViewsLayout, {}),
26988 /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(DataViewsFooter, {})
26989 ] });
26990 }
26991 function DataViews({
26992 view,
26993 onChangeView,
26994 fields,
26995 search = true,
26996 searchLabel = void 0,
26997 actions = EMPTY_ARRAY7,
26998 data,
26999 getItemId = defaultGetItemId,
27000 getItemLevel,
27001 isLoading = false,
27002 paginationInfo,
27003 defaultLayouts: defaultLayoutsProperty = DEFAULT_LAYOUTS,
27004 selection: selectionProperty,
27005 onChangeSelection,
27006 onClickItem,
27007 renderItemLink,
27008 isItemClickable = defaultIsItemClickable,
27009 header,
27010 children,
27011 config = { perPageSizes: [10, 20, 50, 100] },
27012 empty,
27013 onReset
27014 }) {
27015 const [selectionState, setSelectionState] = (0, import_element85.useState)([]);
27016 const isUncontrolled = selectionProperty === void 0 || onChangeSelection === void 0;
27017 const selection = isUncontrolled ? selectionState : selectionProperty;
27018 const {
27019 data: displayData,
27020 paginationInfo: displayPaginationInfo,
27021 hasInitiallyLoaded,
27022 setVisibleEntries
27023 } = useData({
27024 view,
27025 data,
27026 getItemId,
27027 isLoading,
27028 selection,
27029 paginationInfo
27030 });
27031 const containerRef = (0, import_element85.useRef)(null);
27032 const [containerWidth, setContainerWidth] = (0, import_element85.useState)(0);
27033 const resizeObserverRef = (0, import_compose14.useResizeObserver)(
27034 (resizeObserverEntries) => {
27035 setContainerWidth(
27036 resizeObserverEntries[0].borderBoxSize[0].inlineSize
27037 );
27038 },
27039 { box: "border-box" }
27040 );
27041 const [openedFilter, setOpenedFilter] = (0, import_element85.useState)(null);
27042 function setSelectionWithChange(value) {
27043 const newValue = typeof value === "function" ? value(selection) : value;
27044 if (isUncontrolled) {
27045 setSelectionState(newValue);
27046 }
27047 if (onChangeSelection) {
27048 onChangeSelection(newValue);
27049 }
27050 }
27051 const _fields = (0, import_element85.useMemo)(() => normalizeFields(fields), [fields]);
27052 const _selection = (0, import_element85.useMemo)(() => {
27053 if (view.infiniteScrollEnabled) {
27054 return selection;
27055 }
27056 return selection.filter(
27057 (id) => data.some((item) => getItemId(item) === id)
27058 );
27059 }, [selection, data, getItemId, view.infiniteScrollEnabled]);
27060 const filters = use_filters_default(_fields, view);
27061 const hasPrimaryOrLockedFilters = (0, import_element85.useMemo)(
27062 () => (filters || []).some(
27063 (filter) => filter.isPrimary || filter.isLocked
27064 ),
27065 [filters]
27066 );
27067 const [isShowingFilter, setIsShowingFilter] = (0, import_element85.useState)(
27068 hasPrimaryOrLockedFilters
27069 );
27070 const { intersectionObserver } = useInfiniteScroll({
27071 view,
27072 onChangeView,
27073 isLoading,
27074 paginationInfo,
27075 containerRef,
27076 setVisibleEntries
27077 });
27078 (0, import_element85.useEffect)(() => {
27079 if (hasPrimaryOrLockedFilters && !isShowingFilter) {
27080 setIsShowingFilter(true);
27081 }
27082 }, [hasPrimaryOrLockedFilters, isShowingFilter]);
27083 const defaultLayouts = (0, import_element85.useMemo)(
27084 () => Object.fromEntries(
27085 Object.entries(defaultLayoutsProperty).filter(([layoutType]) => {
27086 return dataViewsLayouts.some(
27087 (viewLayout) => viewLayout.type === layoutType
27088 );
27089 }).map(([key, value]) => [
27090 key,
27091 value === true ? {} : value
27092 ])
27093 ),
27094 [defaultLayoutsProperty]
27095 );
27096 if (!defaultLayouts[view.type]) {
27097 return null;
27098 }
27099 return /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(
27100 dataviews_context_default.Provider,
27101 {
27102 value: {
27103 view,
27104 onChangeView,
27105 fields: _fields,
27106 actions,
27107 data: displayData,
27108 isLoading,
27109 paginationInfo: displayPaginationInfo,
27110 selection: _selection,
27111 onChangeSelection: setSelectionWithChange,
27112 openedFilter,
27113 setOpenedFilter,
27114 getItemId,
27115 getItemLevel,
27116 isItemClickable,
27117 onClickItem,
27118 renderItemLink,
27119 containerWidth,
27120 containerRef,
27121 resizeObserverRef,
27122 defaultLayouts,
27123 filters,
27124 isShowingFilter,
27125 setIsShowingFilter,
27126 config,
27127 empty,
27128 hasInitiallyLoaded,
27129 onReset,
27130 intersectionObserver
27131 },
27132 children: /* @__PURE__ */ (0, import_jsx_runtime122.jsx)("div", { className: "dataviews-wrapper", children: children ?? /* @__PURE__ */ (0, import_jsx_runtime122.jsx)(
27133 DefaultUI,
27134 {
27135 header,
27136 search,
27137 searchLabel
27138 }
27139 ) })
27140 }
27141 );
27142 }
27143 var DataViewsSubComponents = DataViews;
27144 DataViewsSubComponents.BulkActionToolbar = BulkActionsFooter;
27145 DataViewsSubComponents.Filters = filters_default;
27146 DataViewsSubComponents.FiltersToggled = filters_toggled_default;
27147 DataViewsSubComponents.FiltersToggle = toggle_default;
27148 DataViewsSubComponents.Layout = DataViewsLayout;
27149 DataViewsSubComponents.LayoutSwitcher = ViewTypeMenu;
27150 DataViewsSubComponents.Pagination = DataViewsPagination;
27151 DataViewsSubComponents.Search = dataviews_search_default;
27152 DataViewsSubComponents.ViewConfig = DataviewsViewConfigDropdown;
27153 DataViewsSubComponents.Footer = DataViewsFooter;
27154 var dataviews_default = DataViewsSubComponents;
27155
27156 // widgets/events/components/events-list/events-list.tsx
27157 var import_date10 = __toESM(require_date());
27158 var import_element86 = __toESM(require_element());
27159 var import_i18n45 = __toESM(require_i18n());
27160
27161 // packages/style-runtime/src/index.ts
27162 var STYLE_HASH_ATTRIBUTE14 = "data-wp-hash";
27163 function getRuntime14() {
27164 const globalScope = globalThis;
27165 if (globalScope.__wpStyleRuntime) {
27166 return globalScope.__wpStyleRuntime;
27167 }
27168 globalScope.__wpStyleRuntime = {
27169 documents: /* @__PURE__ */ new Map(),
27170 styles: /* @__PURE__ */ new Map(),
27171 injectedStyles: /* @__PURE__ */ new WeakMap()
27172 };
27173 if (typeof document !== "undefined") {
27174 registerDocument14(document);
27175 }
27176 return globalScope.__wpStyleRuntime;
27177 }
27178 function documentContainsStyleHash14(targetDocument, hash) {
27179 if (!targetDocument.head) {
27180 return false;
27181 }
27182 for (const style of targetDocument.head.querySelectorAll(
27183 `style[${STYLE_HASH_ATTRIBUTE14}]`
27184 )) {
27185 if (style.getAttribute(STYLE_HASH_ATTRIBUTE14) === hash) {
27186 return true;
27187 }
27188 }
27189 return false;
27190 }
27191 function injectStyle14(targetDocument, hash, css) {
27192 if (!targetDocument.head) {
27193 return;
27194 }
27195 const runtime = getRuntime14();
27196 let injectedStyles = runtime.injectedStyles.get(targetDocument);
27197 if (!injectedStyles) {
27198 injectedStyles = /* @__PURE__ */ new Set();
27199 runtime.injectedStyles.set(targetDocument, injectedStyles);
27200 }
27201 if (injectedStyles.has(hash)) {
27202 return;
27203 }
27204 if (documentContainsStyleHash14(targetDocument, hash)) {
27205 injectedStyles.add(hash);
27206 return;
27207 }
27208 const style = targetDocument.createElement("style");
27209 style.setAttribute(STYLE_HASH_ATTRIBUTE14, hash);
27210 style.appendChild(targetDocument.createTextNode(css));
27211 targetDocument.head.appendChild(style);
27212 injectedStyles.add(hash);
27213 }
27214 function registerDocument14(targetDocument) {
27215 const runtime = getRuntime14();
27216 runtime.documents.set(
27217 targetDocument,
27218 (runtime.documents.get(targetDocument) ?? 0) + 1
27219 );
27220 for (const [hash, css] of runtime.styles) {
27221 injectStyle14(targetDocument, hash, css);
27222 }
27223 return () => {
27224 const count = runtime.documents.get(targetDocument);
27225 if (count === void 0) {
27226 return;
27227 }
27228 if (count <= 1) {
27229 runtime.documents.delete(targetDocument);
27230 return;
27231 }
27232 runtime.documents.set(targetDocument, count - 1);
27233 };
27234 }
27235 function registerStyle14(hash, css) {
27236 const runtime = getRuntime14();
27237 runtime.styles.set(hash, css);
27238 for (const targetDocument of runtime.documents.keys()) {
27239 injectStyle14(targetDocument, hash, css);
27240 }
27241 }
27242
27243 // widgets/events/components/events-list/events-list.module.css
27244 if (typeof process === "undefined" || true) {
27245 registerStyle14("333cf105cc", ".b193ea4f98c12441__listArea,.fae84950ff6b687a__root{flex:1;min-height:0;min-width:0;overflow:hidden}.f2470afe387696bb__eventIcon{background-color:var(--wpds-color-background-track-neutral-weak,#f0f0f0);color:var(--wpds-color-foreground-content-neutral-weak,#707070);height:100%}.e97858c521f8ff5d__titleLink{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._767c9a42070266bb__meta{color:var(--wpds-color-foreground-content-neutral-weak,#707070)}.a8c460f12aae4f63__emptyState{margin-block:var(--wpds-dimension-padding-2xl,24px)}.b0e50a045a1f92c2__eventNone{color:var(--wpds-color-foreground-content-neutral-weak,#707070);flex-shrink:0;padding-block:var(--wpds-dimension-padding-md,12px);padding-inline:var(--wpds-dimension-padding-2xl,24px)}");
27246 }
27247 var events_list_default = { "root": "fae84950ff6b687a__root", "listArea": "b193ea4f98c12441__listArea", "eventIcon": "f2470afe387696bb__eventIcon", "titleLink": "e97858c521f8ff5d__titleLink", "meta": "_767c9a42070266bb__meta", "emptyState": "a8c460f12aae4f63__emptyState", "eventNone": "b0e50a045a1f92c2__eventNone" };
27248
27249 // widgets/events/components/events-list/events-list.tsx
27250 var import_jsx_runtime123 = __toESM(require_jsx_runtime());
27251 var DEFAULT_LAYOUTS2 = { list: {} };
27252 var INITIAL_VIEW = {
27253 type: "list",
27254 page: 1,
27255 perPage: 5,
27256 search: "",
27257 filters: [],
27258 fields: [],
27259 titleField: "title",
27260 descriptionField: "description",
27261 mediaField: "icon",
27262 showMedia: true,
27263 layout: { density: "compact" }
27264 };
27265 function formatEventType(type) {
27266 if (type === "wordcamp") {
27267 return "WordCamp";
27268 }
27269 if (type === "meetup") {
27270 return (0, import_i18n45.__)("Meetup");
27271 }
27272 return type.charAt(0).toUpperCase() + type.slice(1);
27273 }
27274 function getFlippedTimeZoneOffset(startTimestamp) {
27275 return new Date(startTimestamp).getTimezoneOffset() * -1;
27276 }
27277 function getTimeZone(startTimestamp) {
27278 const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
27279 if (typeof timeZone === "undefined") {
27280 return getFlippedTimeZoneOffset(startTimestamp);
27281 }
27282 return timeZone;
27283 }
27284 function getFormattedDate(startDate, endDate, timeZone) {
27285 let formattedDate;
27286 const singleDayEvent = (0, import_i18n45.__)("l, M j, Y");
27287 const multipleDayEvent = (0, import_i18n45.__)("%1$s %2$d\u2013%3$d, %4$d");
27288 const multipleMonthEvent = (0, import_i18n45.__)("%1$s %2$d \u2013 %3$s %4$d, %5$d");
27289 if (!endDate || (0, import_date10.format)("Y-m-d", startDate) === (0, import_date10.format)("Y-m-d", endDate)) {
27290 formattedDate = (0, import_date10.dateI18n)(singleDayEvent, startDate, timeZone);
27291 } else if ((0, import_date10.format)("Y-m", startDate) === (0, import_date10.format)("Y-m", endDate)) {
27292 formattedDate = (0, import_i18n45.sprintf)(
27293 multipleDayEvent,
27294 (0, import_date10.dateI18n)(
27295 (0, import_i18n45._x)("F", "upcoming events month format"),
27296 startDate,
27297 timeZone
27298 ),
27299 Number(
27300 (0, import_date10.dateI18n)(
27301 (0, import_i18n45._x)("j", "upcoming events day format"),
27302 startDate,
27303 timeZone
27304 )
27305 ),
27306 Number(
27307 (0, import_date10.dateI18n)(
27308 (0, import_i18n45._x)("j", "upcoming events day format"),
27309 endDate,
27310 timeZone
27311 )
27312 ),
27313 Number(
27314 (0, import_date10.dateI18n)(
27315 (0, import_i18n45._x)("Y", "upcoming events year format"),
27316 endDate,
27317 timeZone
27318 )
27319 )
27320 );
27321 } else {
27322 formattedDate = (0, import_i18n45.sprintf)(
27323 multipleMonthEvent,
27324 (0, import_date10.dateI18n)(
27325 (0, import_i18n45._x)("F", "upcoming events month format"),
27326 startDate,
27327 timeZone
27328 ),
27329 Number(
27330 (0, import_date10.dateI18n)(
27331 (0, import_i18n45._x)("j", "upcoming events day format"),
27332 startDate,
27333 timeZone
27334 )
27335 ),
27336 (0, import_date10.dateI18n)(
27337 (0, import_i18n45._x)("F", "upcoming events month format"),
27338 endDate,
27339 timeZone
27340 ),
27341 Number(
27342 (0, import_date10.dateI18n)(
27343 (0, import_i18n45._x)("j", "upcoming events day format"),
27344 endDate,
27345 timeZone
27346 )
27347 ),
27348 Number(
27349 (0, import_date10.dateI18n)(
27350 (0, import_i18n45._x)("Y", "upcoming events year format"),
27351 endDate,
27352 timeZone
27353 )
27354 )
27355 );
27356 }
27357 return formattedDate;
27358 }
27359 function toEventListItem(event) {
27360 const startDate = event.start_unix_timestamp ? event.start_unix_timestamp * 1e3 : Date.parse(event.date);
27361 const endDate = event.end_unix_timestamp ? event.end_unix_timestamp * 1e3 : void 0;
27362 const timeZone = getTimeZone(startDate);
27363 const formattedDate = Number.isNaN(startDate) ? event.user_formatted_date || (0, import_date10.dateI18n)("M j, Y", event.date) : getFormattedDate(startDate, endDate, timeZone);
27364 const meta = [
27365 event.type !== "online" ? formatEventType(event.type) : null,
27366 event.location.description,
27367 formattedDate,
27368 event.user_formatted_time
27369 ].filter(Boolean);
27370 return {
27371 id: event.url,
27372 title: event.title,
27373 url: event.url,
27374 type: event.type,
27375 description: meta.join(" \xB7 "),
27376 iconType: event.type === "wordcamp" ? "wordcamp" : "default"
27377 };
27378 }
27379 function EventIcon({ item }) {
27380 return /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(
27381 Stack,
27382 {
27383 className: events_list_default.eventIcon,
27384 direction: "column",
27385 align: "center",
27386 justify: "center",
27387 children: /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Icon, { icon: item.iconType === "wordcamp" ? wordpress_default : people_default })
27388 }
27389 );
27390 }
27391 function EventTitle({ item }) {
27392 return /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Link, { href: item.url, openInNewTab: true, className: events_list_default.titleLink, children: item.title });
27393 }
27394 function EventMeta({ item }) {
27395 return /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Text, { variant: "body-sm", className: events_list_default.meta, children: item.description });
27396 }
27397 function EventsList({
27398 events,
27399 showEmptyState,
27400 location,
27401 isLoading = false
27402 }) {
27403 const [view, setView] = (0, import_element86.useState)(INITIAL_VIEW);
27404 const items = (0, import_element86.useMemo)(() => events.map(toEventListItem), [events]);
27405 const fields = (0, import_element86.useMemo)(
27406 () => [
27407 {
27408 id: "title",
27409 label: (0, import_i18n45.__)("Title"),
27410 enableSorting: false,
27411 enableHiding: false,
27412 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(EventTitle, { item })
27413 },
27414 {
27415 id: "description",
27416 label: (0, import_i18n45.__)("Details"),
27417 enableSorting: false,
27418 enableHiding: false,
27419 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(EventMeta, { item })
27420 },
27421 {
27422 id: "icon",
27423 label: (0, import_i18n45.__)("Type"),
27424 enableSorting: false,
27425 enableHiding: false,
27426 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(EventIcon, { item })
27427 }
27428 ],
27429 []
27430 );
27431 const organizeUrl = (0, import_i18n45.__)(
27432 "https://make.wordpress.org/community/organize-event-landing-page/"
27433 );
27434 const locationLabel = location?.trim();
27435 const emptyTitle = () => {
27436 if (locationLabel) {
27437 return (0, import_i18n45.sprintf)((0, import_i18n45.__)("No events near %s"), locationLabel);
27438 }
27439 return (0, import_i18n45.__)("No events near you");
27440 };
27441 const empty = showEmptyState ? /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Stack, { align: "center", justify: "center", className: events_list_default.emptyState, children: /* @__PURE__ */ (0, import_jsx_runtime123.jsxs)(empty_state_exports.Root, { children: [
27442 /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(empty_state_exports.Icon, { icon: calendar_default }),
27443 /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(empty_state_exports.Title, { children: emptyTitle() }),
27444 /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(empty_state_exports.Description, { children: (0, import_element86.createInterpolateElement)(
27445 (0, import_i18n45.__)("<a>Help organize the next one!</a>"),
27446 {
27447 a: /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Link, { href: organizeUrl, openInNewTab: true })
27448 }
27449 ) })
27450 ] }) }) : void 0;
27451 return /* @__PURE__ */ (0, import_jsx_runtime123.jsxs)(Stack, { className: events_list_default.root, direction: "column", children: [
27452 /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Stack, { className: events_list_default.listArea, direction: "column", children: /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(
27453 dataviews_default,
27454 {
27455 data: items,
27456 fields,
27457 view,
27458 onChangeView: setView,
27459 getItemId: (item) => item.id,
27460 isLoading,
27461 paginationInfo: {
27462 totalItems: items.length,
27463 totalPages: 1
27464 },
27465 defaultLayouts: DEFAULT_LAYOUTS2,
27466 empty,
27467 children: /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(dataviews_default.Layout, {})
27468 }
27469 ) }),
27470 events.length > 0 && events.length <= 2 && /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Text, { variant: "body-sm", className: events_list_default.eventNone, children: (0, import_element86.createInterpolateElement)(
27471 (0, import_i18n45.__)(
27472 "Want more events? <a>Help organize the next one!</a>"
27473 ),
27474 {
27475 a: /* @__PURE__ */ (0, import_jsx_runtime123.jsx)(Link, { href: organizeUrl, openInNewTab: true })
27476 }
27477 ) })
27478 ] });
27479 }
27480
27481 // widgets/events/style.module.css
27482 if (typeof process === "undefined" || true) {
27483 registerStyle14("10b6071c70", "._8eae235c5e84e11a__container{block-size:100%;min-height:200px}.a8467f8a7e71416b__locationPickerInWidget{flex-grow:1;padding:var(--wpds-dimension-padding-2xl,24px)}.dc172eb76cf854ff__footer{border-block-start:var(--wpds-border-width-xs,1px) solid var(--wpds-color-stroke-surface-neutral-weak,#f0f0f0);padding-block:var(--wpds-dimension-padding-lg,16px);padding-inline:var(--wpds-dimension-padding-2xl,24px)}._8035a0c4b6216adf__statusText{color:var(--wpds-color-foreground-content-neutral-weak,#707070);margin:0;padding-inline:var(--wpds-dimension-padding-2xl,24px)}.a55a5460581ee126__noLocationSelected{flex-grow:1}");
27484 }
27485 var style_default13 = { "container": "_8eae235c5e84e11a__container", "locationPickerInWidget": "a8467f8a7e71416b__locationPickerInWidget", "footer": "dc172eb76cf854ff__footer", "statusText": "_8035a0c4b6216adf__statusText", "noLocationSelected": "a55a5460581ee126__noLocationSelected" };
27486
27487 // widgets/events/render.tsx
27488 var import_jsx_runtime124 = __toESM(require_jsx_runtime());
27489 var EVENTS_API = "https://api.wordpress.org/events/1.0/";
27490 function EventsListSection({
27491 events,
27492 loading,
27493 error,
27494 showEmptyState,
27495 location
27496 }) {
27497 if (error) {
27498 return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("p", { className: style_default13.statusText, children: (0, import_i18n46.__)("An error occurred. Please try again.") });
27499 }
27500 return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
27501 EventsList,
27502 {
27503 events,
27504 showEmptyState,
27505 location,
27506 isLoading: loading
27507 }
27508 );
27509 }
27510 function WordPressEvents({
27511 attributes = {}
27512 }) {
27513 const userLocale = (0, import_data6.useSelect)(
27514 (select) => select(import_core_data.store).getCurrentUser()?.locale ?? "en_US",
27515 []
27516 );
27517 const persistedLocation = typeof attributes.location === "string" ? attributes.location.trim() : "";
27518 const [activeLocation, setActiveLocation] = (0, import_element87.useState)(persistedLocation);
27519 const [locationLabel, setLocationLabel] = (0, import_element87.useState)("");
27520 (0, import_element87.useEffect)(() => {
27521 setActiveLocation(persistedLocation);
27522 }, [persistedLocation]);
27523 const [events, setEvents] = (0, import_element87.useState)([]);
27524 const [eventsLoading, setEventsLoading] = (0, import_element87.useState)(false);
27525 const [eventsError, setEventsError] = (0, import_element87.useState)(false);
27526 const hasSelectedLocation = Boolean(activeLocation.trim());
27527 (0, import_element87.useEffect)(() => {
27528 if (!hasSelectedLocation) {
27529 setLocationLabel("");
27530 return;
27531 }
27532 const controller = new AbortController();
27533 setEventsLoading(true);
27534 setEventsError(false);
27535 setLocationLabel("");
27536 const params = new URLSearchParams({
27537 number: "5",
27538 locale: userLocale,
27539 location: activeLocation
27540 });
27541 fetch(`${EVENTS_API}?${params}`, { signal: controller.signal }).then((r3) => r3.json()).then((data) => {
27542 setEvents(data.events ?? []);
27543 if (data.location?.description) {
27544 setLocationLabel(data.location.description);
27545 }
27546 setEventsLoading(false);
27547 }).catch((err) => {
27548 if (err.name !== "AbortError") {
27549 setEventsError(true);
27550 setEventsLoading(false);
27551 }
27552 });
27553 return () => controller.abort();
27554 }, [activeLocation, hasSelectedLocation, userLocale]);
27555 return /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(
27556 Stack,
27557 {
27558 direction: "column",
27559 justify: "space-between",
27560 className: style_default13.container,
27561 children: [
27562 !hasSelectedLocation && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
27563 Stack,
27564 {
27565 align: "center",
27566 justify: "center",
27567 className: style_default13.noLocationSelected,
27568 children: /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(empty_state_exports.Root, { children: [
27569 /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(empty_state_exports.Visual, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(Icon, { icon: map_marker_default }) }),
27570 /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(empty_state_exports.Title, { children: (0, import_i18n46.__)("Attend an upcoming event near you.") }),
27571 /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(empty_state_exports.Description, { children: (0, import_i18n46.__)("Select a city to view events.") })
27572 ] })
27573 }
27574 ),
27575 hasSelectedLocation && eventsLoading && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
27576 Stack,
27577 {
27578 className: style_default13.locationPickerInWidget,
27579 direction: "column",
27580 align: "center",
27581 justify: "center",
27582 children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_components47.Spinner, {})
27583 }
27584 ),
27585 hasSelectedLocation && !eventsLoading && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
27586 EventsListSection,
27587 {
27588 events,
27589 loading: eventsLoading,
27590 error: eventsError,
27591 showEmptyState: true,
27592 location: locationLabel || activeLocation
27593 }
27594 ),
27595 /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("div", { className: style_default13.footer, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(Stack, { direction: "row", align: "center", gap: "sm", wrap: "wrap", children: [
27596 /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
27597 Link,
27598 {
27599 href: "https://make.wordpress.org/community/meetups-landing-page",
27600 openInNewTab: true,
27601 children: (0, import_i18n46.__)("Meetups")
27602 }
27603 ),
27604 /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
27605 Link,
27606 {
27607 href: "https://central.wordcamp.org/schedule/",
27608 openInNewTab: true,
27609 children: (0, import_i18n46.__)("WordCamps")
27610 }
27611 )
27612 ] }) })
27613 ]
27614 }
27615 );
27616 }
27617 export {
27618 WordPressEvents as default
27619 };
27620 /*! Bundled license information:
27621
27622 use-sync-external-store/cjs/use-sync-external-store-shim.development.js:
27623 (**
27624 * @license React
27625 * use-sync-external-store-shim.development.js
27626 *
27627 * Copyright (c) Meta Platforms, Inc. and affiliates.
27628 *
27629 * This source code is licensed under the MIT license found in the
27630 * LICENSE file in the root directory of this source tree.
27631 *)
27632
27633 use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js:
27634 (**
27635 * @license React
27636 * use-sync-external-store-shim/with-selector.development.js
27637 *
27638 * Copyright (c) Meta Platforms, Inc. and affiliates.
27639 *
27640 * This source code is licensed under the MIT license found in the
27641 * LICENSE file in the root directory of this source tree.
27642 *)
27643 */
27644