PluginProbe
Gutenberg / 23.7.2
Gutenberg v23.7.2
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 / activity / render.js

render.js in Gutenberg 23.7.2, at build/widgets/activity/render.js

27,601 lines 959.0 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/i18n
53 var require_i18n = __commonJS({
54 "package-external:@wordpress/i18n"(exports, module) {
55 module.exports = window.wp.i18n;
56 }
57 });
58
59 // package-external:@wordpress/date
60 var require_date = __commonJS({
61 "package-external:@wordpress/date"(exports, module) {
62 module.exports = window.wp.date;
63 }
64 });
65
66 // package-external:@wordpress/html-entities
67 var require_html_entities = __commonJS({
68 "package-external:@wordpress/html-entities"(exports, module) {
69 module.exports = window.wp.htmlEntities;
70 }
71 });
72
73 // package-external:@wordpress/components
74 var require_components = __commonJS({
75 "package-external:@wordpress/components"(exports, module) {
76 module.exports = window.wp.components;
77 }
78 });
79
80 // package-external:@wordpress/primitives
81 var require_primitives = __commonJS({
82 "package-external:@wordpress/primitives"(exports, module) {
83 module.exports = window.wp.primitives;
84 }
85 });
86
87 // vendor-external:react/jsx-runtime
88 var require_jsx_runtime = __commonJS({
89 "vendor-external:react/jsx-runtime"(exports, module) {
90 module.exports = window.ReactJSXRuntime;
91 }
92 });
93
94 // package-external:@wordpress/compose
95 var require_compose = __commonJS({
96 "package-external:@wordpress/compose"(exports, module) {
97 module.exports = window.wp.compose;
98 }
99 });
100
101 // vendor-external:react
102 var require_react = __commonJS({
103 "vendor-external:react"(exports, module) {
104 module.exports = window.React;
105 }
106 });
107
108 // vendor-external:react-dom
109 var require_react_dom = __commonJS({
110 "vendor-external:react-dom"(exports, module) {
111 module.exports = window.ReactDOM;
112 }
113 });
114
115 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js
116 var require_use_sync_external_store_shim_development = __commonJS({
117 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) {
118 "use strict";
119 (function() {
120 function is(x2, y2) {
121 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
122 }
123 function useSyncExternalStore$2(subscribe2, getSnapshot) {
124 didWarnOld18Alpha || void 0 === React49.startTransition || (didWarnOld18Alpha = true, console.error(
125 "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."
126 ));
127 var value = getSnapshot();
128 if (!didWarnUncachedGetSnapshot) {
129 var cachedValue = getSnapshot();
130 objectIs(value, cachedValue) || (console.error(
131 "The result of getSnapshot should be cached to avoid an infinite loop"
132 ), didWarnUncachedGetSnapshot = true);
133 }
134 cachedValue = useState37({
135 inst: { value, getSnapshot }
136 });
137 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1];
138 useLayoutEffect5(
139 function() {
140 inst.value = value;
141 inst.getSnapshot = getSnapshot;
142 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
143 },
144 [subscribe2, value, getSnapshot]
145 );
146 useEffect32(
147 function() {
148 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
149 return subscribe2(function() {
150 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
151 });
152 },
153 [subscribe2]
154 );
155 useDebugValue2(value);
156 return value;
157 }
158 function checkIfSnapshotChanged(inst) {
159 var latestGetSnapshot = inst.getSnapshot;
160 inst = inst.value;
161 try {
162 var nextValue = latestGetSnapshot();
163 return !objectIs(inst, nextValue);
164 } catch (error) {
165 return true;
166 }
167 }
168 function useSyncExternalStore$1(subscribe2, getSnapshot) {
169 return getSnapshot();
170 }
171 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
172 var React49 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState37 = React49.useState, useEffect32 = 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;
173 exports.useSyncExternalStore = void 0 !== React49.useSyncExternalStore ? React49.useSyncExternalStore : shim;
174 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
175 })();
176 }
177 });
178
179 // node_modules/use-sync-external-store/shim/index.js
180 var require_shim = __commonJS({
181 "node_modules/use-sync-external-store/shim/index.js"(exports, module) {
182 "use strict";
183 if (false) {
184 module.exports = null;
185 } else {
186 module.exports = require_use_sync_external_store_shim_development();
187 }
188 }
189 });
190
191 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js
192 var require_with_selector_development = __commonJS({
193 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports) {
194 "use strict";
195 (function() {
196 function is(x2, y2) {
197 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
198 }
199 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
200 var React49 = require_react(), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore3 = shim.useSyncExternalStore, useRef48 = React49.useRef, useEffect32 = React49.useEffect, useMemo41 = React49.useMemo, useDebugValue2 = React49.useDebugValue;
201 exports.useSyncExternalStoreWithSelector = function(subscribe2, getSnapshot, getServerSnapshot, selector2, isEqual) {
202 var instRef = useRef48(null);
203 if (null === instRef.current) {
204 var inst = { hasValue: false, value: null };
205 instRef.current = inst;
206 } else inst = instRef.current;
207 instRef = useMemo41(
208 function() {
209 function memoizedSelector(nextSnapshot) {
210 if (!hasMemo) {
211 hasMemo = true;
212 memoizedSnapshot = nextSnapshot;
213 nextSnapshot = selector2(nextSnapshot);
214 if (void 0 !== isEqual && inst.hasValue) {
215 var currentSelection = inst.value;
216 if (isEqual(currentSelection, nextSnapshot))
217 return memoizedSelection = currentSelection;
218 }
219 return memoizedSelection = nextSnapshot;
220 }
221 currentSelection = memoizedSelection;
222 if (objectIs(memoizedSnapshot, nextSnapshot))
223 return currentSelection;
224 var nextSelection = selector2(nextSnapshot);
225 if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))
226 return memoizedSnapshot = nextSnapshot, currentSelection;
227 memoizedSnapshot = nextSnapshot;
228 return memoizedSelection = nextSelection;
229 }
230 var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot;
231 return [
232 function() {
233 return memoizedSelector(getSnapshot());
234 },
235 null === maybeGetServerSnapshot ? void 0 : function() {
236 return memoizedSelector(maybeGetServerSnapshot());
237 }
238 ];
239 },
240 [getSnapshot, getServerSnapshot, selector2, isEqual]
241 );
242 var value = useSyncExternalStore3(subscribe2, instRef[0], instRef[1]);
243 useEffect32(
244 function() {
245 inst.hasValue = true;
246 inst.value = value;
247 },
248 [value]
249 );
250 useDebugValue2(value);
251 return value;
252 };
253 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
254 })();
255 }
256 });
257
258 // node_modules/use-sync-external-store/shim/with-selector.js
259 var require_with_selector = __commonJS({
260 "node_modules/use-sync-external-store/shim/with-selector.js"(exports, module) {
261 "use strict";
262 if (false) {
263 module.exports = null;
264 } else {
265 module.exports = require_with_selector_development();
266 }
267 }
268 });
269
270 // package-external:@wordpress/theme
271 var require_theme = __commonJS({
272 "package-external:@wordpress/theme"(exports, module) {
273 module.exports = window.wp.theme;
274 }
275 });
276
277 // package-external:@wordpress/private-apis
278 var require_private_apis = __commonJS({
279 "package-external:@wordpress/private-apis"(exports, module) {
280 module.exports = window.wp.privateApis;
281 }
282 });
283
284 // package-external:@wordpress/keycodes
285 var require_keycodes = __commonJS({
286 "package-external:@wordpress/keycodes"(exports, module) {
287 module.exports = window.wp.keycodes;
288 }
289 });
290
291 // node_modules/remove-accents/index.js
292 var require_remove_accents = __commonJS({
293 "node_modules/remove-accents/index.js"(exports, module) {
294 var characterMap = {
295 "\xC0": "A",
296 "\xC1": "A",
297 "\xC2": "A",
298 "\xC3": "A",
299 "\xC4": "A",
300 "\xC5": "A",
301 "\u1EA4": "A",
302 "\u1EAE": "A",
303 "\u1EB2": "A",
304 "\u1EB4": "A",
305 "\u1EB6": "A",
306 "\xC6": "AE",
307 "\u1EA6": "A",
308 "\u1EB0": "A",
309 "\u0202": "A",
310 "\u1EA2": "A",
311 "\u1EA0": "A",
312 "\u1EA8": "A",
313 "\u1EAA": "A",
314 "\u1EAC": "A",
315 "\xC7": "C",
316 "\u1E08": "C",
317 "\xC8": "E",
318 "\xC9": "E",
319 "\xCA": "E",
320 "\xCB": "E",
321 "\u1EBE": "E",
322 "\u1E16": "E",
323 "\u1EC0": "E",
324 "\u1E14": "E",
325 "\u1E1C": "E",
326 "\u0206": "E",
327 "\u1EBA": "E",
328 "\u1EBC": "E",
329 "\u1EB8": "E",
330 "\u1EC2": "E",
331 "\u1EC4": "E",
332 "\u1EC6": "E",
333 "\xCC": "I",
334 "\xCD": "I",
335 "\xCE": "I",
336 "\xCF": "I",
337 "\u1E2E": "I",
338 "\u020A": "I",
339 "\u1EC8": "I",
340 "\u1ECA": "I",
341 "\xD0": "D",
342 "\xD1": "N",
343 "\xD2": "O",
344 "\xD3": "O",
345 "\xD4": "O",
346 "\xD5": "O",
347 "\xD6": "O",
348 "\xD8": "O",
349 "\u1ED0": "O",
350 "\u1E4C": "O",
351 "\u1E52": "O",
352 "\u020E": "O",
353 "\u1ECE": "O",
354 "\u1ECC": "O",
355 "\u1ED4": "O",
356 "\u1ED6": "O",
357 "\u1ED8": "O",
358 "\u1EDC": "O",
359 "\u1EDE": "O",
360 "\u1EE0": "O",
361 "\u1EDA": "O",
362 "\u1EE2": "O",
363 "\xD9": "U",
364 "\xDA": "U",
365 "\xDB": "U",
366 "\xDC": "U",
367 "\u1EE6": "U",
368 "\u1EE4": "U",
369 "\u1EEC": "U",
370 "\u1EEE": "U",
371 "\u1EF0": "U",
372 "\xDD": "Y",
373 "\xE0": "a",
374 "\xE1": "a",
375 "\xE2": "a",
376 "\xE3": "a",
377 "\xE4": "a",
378 "\xE5": "a",
379 "\u1EA5": "a",
380 "\u1EAF": "a",
381 "\u1EB3": "a",
382 "\u1EB5": "a",
383 "\u1EB7": "a",
384 "\xE6": "ae",
385 "\u1EA7": "a",
386 "\u1EB1": "a",
387 "\u0203": "a",
388 "\u1EA3": "a",
389 "\u1EA1": "a",
390 "\u1EA9": "a",
391 "\u1EAB": "a",
392 "\u1EAD": "a",
393 "\xE7": "c",
394 "\u1E09": "c",
395 "\xE8": "e",
396 "\xE9": "e",
397 "\xEA": "e",
398 "\xEB": "e",
399 "\u1EBF": "e",
400 "\u1E17": "e",
401 "\u1EC1": "e",
402 "\u1E15": "e",
403 "\u1E1D": "e",
404 "\u0207": "e",
405 "\u1EBB": "e",
406 "\u1EBD": "e",
407 "\u1EB9": "e",
408 "\u1EC3": "e",
409 "\u1EC5": "e",
410 "\u1EC7": "e",
411 "\xEC": "i",
412 "\xED": "i",
413 "\xEE": "i",
414 "\xEF": "i",
415 "\u1E2F": "i",
416 "\u020B": "i",
417 "\u1EC9": "i",
418 "\u1ECB": "i",
419 "\xF0": "d",
420 "\xF1": "n",
421 "\xF2": "o",
422 "\xF3": "o",
423 "\xF4": "o",
424 "\xF5": "o",
425 "\xF6": "o",
426 "\xF8": "o",
427 "\u1ED1": "o",
428 "\u1E4D": "o",
429 "\u1E53": "o",
430 "\u020F": "o",
431 "\u1ECF": "o",
432 "\u1ECD": "o",
433 "\u1ED5": "o",
434 "\u1ED7": "o",
435 "\u1ED9": "o",
436 "\u1EDD": "o",
437 "\u1EDF": "o",
438 "\u1EE1": "o",
439 "\u1EDB": "o",
440 "\u1EE3": "o",
441 "\xF9": "u",
442 "\xFA": "u",
443 "\xFB": "u",
444 "\xFC": "u",
445 "\u1EE7": "u",
446 "\u1EE5": "u",
447 "\u1EED": "u",
448 "\u1EEF": "u",
449 "\u1EF1": "u",
450 "\xFD": "y",
451 "\xFF": "y",
452 "\u0100": "A",
453 "\u0101": "a",
454 "\u0102": "A",
455 "\u0103": "a",
456 "\u0104": "A",
457 "\u0105": "a",
458 "\u0106": "C",
459 "\u0107": "c",
460 "\u0108": "C",
461 "\u0109": "c",
462 "\u010A": "C",
463 "\u010B": "c",
464 "\u010C": "C",
465 "\u010D": "c",
466 "C\u0306": "C",
467 "c\u0306": "c",
468 "\u010E": "D",
469 "\u010F": "d",
470 "\u0110": "D",
471 "\u0111": "d",
472 "\u0112": "E",
473 "\u0113": "e",
474 "\u0114": "E",
475 "\u0115": "e",
476 "\u0116": "E",
477 "\u0117": "e",
478 "\u0118": "E",
479 "\u0119": "e",
480 "\u011A": "E",
481 "\u011B": "e",
482 "\u011C": "G",
483 "\u01F4": "G",
484 "\u011D": "g",
485 "\u01F5": "g",
486 "\u011E": "G",
487 "\u011F": "g",
488 "\u0120": "G",
489 "\u0121": "g",
490 "\u0122": "G",
491 "\u0123": "g",
492 "\u0124": "H",
493 "\u0125": "h",
494 "\u0126": "H",
495 "\u0127": "h",
496 "\u1E2A": "H",
497 "\u1E2B": "h",
498 "\u0128": "I",
499 "\u0129": "i",
500 "\u012A": "I",
501 "\u012B": "i",
502 "\u012C": "I",
503 "\u012D": "i",
504 "\u012E": "I",
505 "\u012F": "i",
506 "\u0130": "I",
507 "\u0131": "i",
508 "\u0132": "IJ",
509 "\u0133": "ij",
510 "\u0134": "J",
511 "\u0135": "j",
512 "\u0136": "K",
513 "\u0137": "k",
514 "\u1E30": "K",
515 "\u1E31": "k",
516 "K\u0306": "K",
517 "k\u0306": "k",
518 "\u0139": "L",
519 "\u013A": "l",
520 "\u013B": "L",
521 "\u013C": "l",
522 "\u013D": "L",
523 "\u013E": "l",
524 "\u013F": "L",
525 "\u0140": "l",
526 "\u0141": "l",
527 "\u0142": "l",
528 "\u1E3E": "M",
529 "\u1E3F": "m",
530 "M\u0306": "M",
531 "m\u0306": "m",
532 "\u0143": "N",
533 "\u0144": "n",
534 "\u0145": "N",
535 "\u0146": "n",
536 "\u0147": "N",
537 "\u0148": "n",
538 "\u0149": "n",
539 "N\u0306": "N",
540 "n\u0306": "n",
541 "\u014C": "O",
542 "\u014D": "o",
543 "\u014E": "O",
544 "\u014F": "o",
545 "\u0150": "O",
546 "\u0151": "o",
547 "\u0152": "OE",
548 "\u0153": "oe",
549 "P\u0306": "P",
550 "p\u0306": "p",
551 "\u0154": "R",
552 "\u0155": "r",
553 "\u0156": "R",
554 "\u0157": "r",
555 "\u0158": "R",
556 "\u0159": "r",
557 "R\u0306": "R",
558 "r\u0306": "r",
559 "\u0212": "R",
560 "\u0213": "r",
561 "\u015A": "S",
562 "\u015B": "s",
563 "\u015C": "S",
564 "\u015D": "s",
565 "\u015E": "S",
566 "\u0218": "S",
567 "\u0219": "s",
568 "\u015F": "s",
569 "\u0160": "S",
570 "\u0161": "s",
571 "\u0162": "T",
572 "\u0163": "t",
573 "\u021B": "t",
574 "\u021A": "T",
575 "\u0164": "T",
576 "\u0165": "t",
577 "\u0166": "T",
578 "\u0167": "t",
579 "T\u0306": "T",
580 "t\u0306": "t",
581 "\u0168": "U",
582 "\u0169": "u",
583 "\u016A": "U",
584 "\u016B": "u",
585 "\u016C": "U",
586 "\u016D": "u",
587 "\u016E": "U",
588 "\u016F": "u",
589 "\u0170": "U",
590 "\u0171": "u",
591 "\u0172": "U",
592 "\u0173": "u",
593 "\u0216": "U",
594 "\u0217": "u",
595 "V\u0306": "V",
596 "v\u0306": "v",
597 "\u0174": "W",
598 "\u0175": "w",
599 "\u1E82": "W",
600 "\u1E83": "w",
601 "X\u0306": "X",
602 "x\u0306": "x",
603 "\u0176": "Y",
604 "\u0177": "y",
605 "\u0178": "Y",
606 "Y\u0306": "Y",
607 "y\u0306": "y",
608 "\u0179": "Z",
609 "\u017A": "z",
610 "\u017B": "Z",
611 "\u017C": "z",
612 "\u017D": "Z",
613 "\u017E": "z",
614 "\u017F": "s",
615 "\u0192": "f",
616 "\u01A0": "O",
617 "\u01A1": "o",
618 "\u01AF": "U",
619 "\u01B0": "u",
620 "\u01CD": "A",
621 "\u01CE": "a",
622 "\u01CF": "I",
623 "\u01D0": "i",
624 "\u01D1": "O",
625 "\u01D2": "o",
626 "\u01D3": "U",
627 "\u01D4": "u",
628 "\u01D5": "U",
629 "\u01D6": "u",
630 "\u01D7": "U",
631 "\u01D8": "u",
632 "\u01D9": "U",
633 "\u01DA": "u",
634 "\u01DB": "U",
635 "\u01DC": "u",
636 "\u1EE8": "U",
637 "\u1EE9": "u",
638 "\u1E78": "U",
639 "\u1E79": "u",
640 "\u01FA": "A",
641 "\u01FB": "a",
642 "\u01FC": "AE",
643 "\u01FD": "ae",
644 "\u01FE": "O",
645 "\u01FF": "o",
646 "\xDE": "TH",
647 "\xFE": "th",
648 "\u1E54": "P",
649 "\u1E55": "p",
650 "\u1E64": "S",
651 "\u1E65": "s",
652 "X\u0301": "X",
653 "x\u0301": "x",
654 "\u0403": "\u0413",
655 "\u0453": "\u0433",
656 "\u040C": "\u041A",
657 "\u045C": "\u043A",
658 "A\u030B": "A",
659 "a\u030B": "a",
660 "E\u030B": "E",
661 "e\u030B": "e",
662 "I\u030B": "I",
663 "i\u030B": "i",
664 "\u01F8": "N",
665 "\u01F9": "n",
666 "\u1ED2": "O",
667 "\u1ED3": "o",
668 "\u1E50": "O",
669 "\u1E51": "o",
670 "\u1EEA": "U",
671 "\u1EEB": "u",
672 "\u1E80": "W",
673 "\u1E81": "w",
674 "\u1EF2": "Y",
675 "\u1EF3": "y",
676 "\u0200": "A",
677 "\u0201": "a",
678 "\u0204": "E",
679 "\u0205": "e",
680 "\u0208": "I",
681 "\u0209": "i",
682 "\u020C": "O",
683 "\u020D": "o",
684 "\u0210": "R",
685 "\u0211": "r",
686 "\u0214": "U",
687 "\u0215": "u",
688 "B\u030C": "B",
689 "b\u030C": "b",
690 "\u010C\u0323": "C",
691 "\u010D\u0323": "c",
692 "\xCA\u030C": "E",
693 "\xEA\u030C": "e",
694 "F\u030C": "F",
695 "f\u030C": "f",
696 "\u01E6": "G",
697 "\u01E7": "g",
698 "\u021E": "H",
699 "\u021F": "h",
700 "J\u030C": "J",
701 "\u01F0": "j",
702 "\u01E8": "K",
703 "\u01E9": "k",
704 "M\u030C": "M",
705 "m\u030C": "m",
706 "P\u030C": "P",
707 "p\u030C": "p",
708 "Q\u030C": "Q",
709 "q\u030C": "q",
710 "\u0158\u0329": "R",
711 "\u0159\u0329": "r",
712 "\u1E66": "S",
713 "\u1E67": "s",
714 "V\u030C": "V",
715 "v\u030C": "v",
716 "W\u030C": "W",
717 "w\u030C": "w",
718 "X\u030C": "X",
719 "x\u030C": "x",
720 "Y\u030C": "Y",
721 "y\u030C": "y",
722 "A\u0327": "A",
723 "a\u0327": "a",
724 "B\u0327": "B",
725 "b\u0327": "b",
726 "\u1E10": "D",
727 "\u1E11": "d",
728 "\u0228": "E",
729 "\u0229": "e",
730 "\u0190\u0327": "E",
731 "\u025B\u0327": "e",
732 "\u1E28": "H",
733 "\u1E29": "h",
734 "I\u0327": "I",
735 "i\u0327": "i",
736 "\u0197\u0327": "I",
737 "\u0268\u0327": "i",
738 "M\u0327": "M",
739 "m\u0327": "m",
740 "O\u0327": "O",
741 "o\u0327": "o",
742 "Q\u0327": "Q",
743 "q\u0327": "q",
744 "U\u0327": "U",
745 "u\u0327": "u",
746 "X\u0327": "X",
747 "x\u0327": "x",
748 "Z\u0327": "Z",
749 "z\u0327": "z",
750 "\u0439": "\u0438",
751 "\u0419": "\u0418",
752 "\u0451": "\u0435",
753 "\u0401": "\u0415"
754 };
755 var chars = Object.keys(characterMap).join("|");
756 var allAccents = new RegExp(chars, "g");
757 var firstAccent = new RegExp(chars, "");
758 function matcher(match2) {
759 return characterMap[match2];
760 }
761 var removeAccents3 = function(string) {
762 return string.replace(allAccents, matcher);
763 };
764 var hasAccents = function(string) {
765 return !!string.match(firstAccent);
766 };
767 module.exports = removeAccents3;
768 module.exports.has = hasAccents;
769 module.exports.remove = removeAccents3;
770 }
771 });
772
773 // node_modules/fast-deep-equal/es6/index.js
774 var require_es6 = __commonJS({
775 "node_modules/fast-deep-equal/es6/index.js"(exports, module) {
776 "use strict";
777 module.exports = function equal(a2, b2) {
778 if (a2 === b2) return true;
779 if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") {
780 if (a2.constructor !== b2.constructor) return false;
781 var length, i2, keys;
782 if (Array.isArray(a2)) {
783 length = a2.length;
784 if (length != b2.length) return false;
785 for (i2 = length; i2-- !== 0; )
786 if (!equal(a2[i2], b2[i2])) return false;
787 return true;
788 }
789 if (a2 instanceof Map && b2 instanceof Map) {
790 if (a2.size !== b2.size) return false;
791 for (i2 of a2.entries())
792 if (!b2.has(i2[0])) return false;
793 for (i2 of a2.entries())
794 if (!equal(i2[1], b2.get(i2[0]))) return false;
795 return true;
796 }
797 if (a2 instanceof Set && b2 instanceof Set) {
798 if (a2.size !== b2.size) return false;
799 for (i2 of a2.entries())
800 if (!b2.has(i2[0])) return false;
801 return true;
802 }
803 if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) {
804 length = a2.length;
805 if (length != b2.length) return false;
806 for (i2 = length; i2-- !== 0; )
807 if (a2[i2] !== b2[i2]) return false;
808 return true;
809 }
810 if (a2.constructor === RegExp) return a2.source === b2.source && a2.flags === b2.flags;
811 if (a2.valueOf !== Object.prototype.valueOf) return a2.valueOf() === b2.valueOf();
812 if (a2.toString !== Object.prototype.toString) return a2.toString() === b2.toString();
813 keys = Object.keys(a2);
814 length = keys.length;
815 if (length !== Object.keys(b2).length) return false;
816 for (i2 = length; i2-- !== 0; )
817 if (!Object.prototype.hasOwnProperty.call(b2, keys[i2])) return false;
818 for (i2 = length; i2-- !== 0; ) {
819 var key = keys[i2];
820 if (!equal(a2[key], b2[key])) return false;
821 }
822 return true;
823 }
824 return a2 !== a2 && b2 !== b2;
825 };
826 }
827 });
828
829 // package-external:@wordpress/warning
830 var require_warning = __commonJS({
831 "package-external:@wordpress/warning"(exports, module) {
832 module.exports = window.wp.warning;
833 }
834 });
835
836 // package-external:@wordpress/rich-text
837 var require_rich_text = __commonJS({
838 "package-external:@wordpress/rich-text"(exports, module) {
839 module.exports = window.wp.richText;
840 }
841 });
842
843 // package-external:@wordpress/deprecated
844 var require_deprecated = __commonJS({
845 "package-external:@wordpress/deprecated"(exports, module) {
846 module.exports = window.wp.deprecated;
847 }
848 });
849
850 // widgets/activity/render.tsx
851 var import_element87 = __toESM(require_element());
852 var import_data6 = __toESM(require_data());
853 var import_core_data = __toESM(require_core_data());
854 var import_i18n45 = __toESM(require_i18n());
855 var import_date10 = __toESM(require_date());
856 var import_html_entities = __toESM(require_html_entities());
857 var import_components47 = __toESM(require_components());
858
859 // packages/icons/build-module/icon/index.mjs
860 var import_element = __toESM(require_element(), 1);
861 var icon_default = (0, import_element.forwardRef)(
862 ({ icon, size: size4 = 24, ...props }, ref) => {
863 return (0, import_element.cloneElement)(icon, {
864 width: size4,
865 height: size4,
866 ...props,
867 ref
868 });
869 }
870 );
871
872 // packages/icons/build-module/library/arrow-down.mjs
873 var import_primitives = __toESM(require_primitives(), 1);
874 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
875 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" }) });
876
877 // packages/icons/build-module/library/arrow-left.mjs
878 var import_primitives2 = __toESM(require_primitives(), 1);
879 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
880 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" }) });
881
882 // packages/icons/build-module/library/arrow-right.mjs
883 var import_primitives3 = __toESM(require_primitives(), 1);
884 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
885 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" }) });
886
887 // packages/icons/build-module/library/arrow-up.mjs
888 var import_primitives4 = __toESM(require_primitives(), 1);
889 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
890 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" }) });
891
892 // packages/icons/build-module/library/block-table.mjs
893 var import_primitives5 = __toESM(require_primitives(), 1);
894 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
895 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" }) });
896
897 // packages/icons/build-module/library/category.mjs
898 var import_primitives6 = __toESM(require_primitives(), 1);
899 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
900 var category_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, { 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" }) });
901
902 // packages/icons/build-module/library/check.mjs
903 var import_primitives7 = __toESM(require_primitives(), 1);
904 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
905 var check_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, { d: "M16.5 7.5 10 13.9l-2.5-2.4-1 1 3.5 3.6 7.5-7.6z" }) });
906
907 // packages/icons/build-module/library/close-small.mjs
908 var import_primitives8 = __toESM(require_primitives(), 1);
909 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
910 var close_small_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: "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" }) });
911
912 // packages/icons/build-module/library/cog.mjs
913 var import_primitives9 = __toESM(require_primitives(), 1);
914 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
915 var cog_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, { 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" }) });
916
917 // packages/icons/build-module/library/comment.mjs
918 var import_primitives10 = __toESM(require_primitives(), 1);
919 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
920 var comment_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, { d: "M18 4H6c-1.1 0-2 .9-2 2v12.9c0 .6.5 1.1 1.1 1.1.3 0 .5-.1.8-.3L8.5 17H18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm.5 11c0 .3-.2.5-.5.5H7.9l-2.4 2.4V6c0-.3.2-.5.5-.5h12c.3 0 .5.2.5.5v9z" }) });
921
922 // packages/icons/build-module/library/envelope.mjs
923 var import_primitives11 = __toESM(require_primitives(), 1);
924 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
925 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" }) });
926
927 // packages/icons/build-module/library/error.mjs
928 var import_primitives12 = __toESM(require_primitives(), 1);
929 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
930 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" }) });
931
932 // packages/icons/build-module/library/format-list-bullets-rtl.mjs
933 var import_primitives13 = __toESM(require_primitives(), 1);
934 var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
935 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" }) });
936
937 // packages/icons/build-module/library/format-list-bullets.mjs
938 var import_primitives14 = __toESM(require_primitives(), 1);
939 var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
940 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" }) });
941
942 // packages/icons/build-module/library/funnel.mjs
943 var import_primitives15 = __toESM(require_primitives(), 1);
944 var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
945 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" }) });
946
947 // packages/icons/build-module/library/link.mjs
948 var import_primitives16 = __toESM(require_primitives(), 1);
949 var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
950 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" }) });
951
952 // packages/icons/build-module/library/mobile.mjs
953 var import_primitives17 = __toESM(require_primitives(), 1);
954 var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
955 var mobile_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: "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" }) });
956
957 // packages/icons/build-module/library/more-vertical.mjs
958 var import_primitives18 = __toESM(require_primitives(), 1);
959 var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
960 var more_vertical_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: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" }) });
961
962 // packages/icons/build-module/library/next.mjs
963 var import_primitives19 = __toESM(require_primitives(), 1);
964 var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1);
965 var next_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: "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" }) });
966
967 // packages/icons/build-module/library/post-list.mjs
968 var import_primitives20 = __toESM(require_primitives(), 1);
969 var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
970 var post_list_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: "M18 5.5H6a.5.5 0 0 0-.5.5v12a.5.5 0 0 0 .5.5h12a.5.5 0 0 0 .5-.5V6a.5.5 0 0 0-.5-.5ZM6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2Zm1 5h1.5v1.5H7V9Zm1.5 4.5H7V15h1.5v-1.5ZM10 9h7v1.5h-7V9Zm7 4.5h-7V15h7v-1.5Z" }) });
971
972 // packages/icons/build-module/library/previous.mjs
973 var import_primitives21 = __toESM(require_primitives(), 1);
974 var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1);
975 var previous_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, { 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" }) });
976
977 // packages/icons/build-module/library/scheduled.mjs
978 var import_primitives22 = __toESM(require_primitives(), 1);
979 var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1);
980 var scheduled_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, { 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" }) });
981
982 // packages/icons/build-module/library/search.mjs
983 var import_primitives23 = __toESM(require_primitives(), 1);
984 var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1);
985 var search_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, { 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" }) });
986
987 // packages/icons/build-module/library/seen.mjs
988 var import_primitives24 = __toESM(require_primitives(), 1);
989 var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1);
990 var seen_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: "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" }) });
991
992 // packages/icons/build-module/library/unseen.mjs
993 var import_primitives25 = __toESM(require_primitives(), 1);
994 var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
995 var unseen_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: "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" }) });
996
997 // node_modules/clsx/dist/clsx.mjs
998 function r(e2) {
999 var t2, f2, n2 = "";
1000 if ("string" == typeof e2 || "number" == typeof e2) n2 += e2;
1001 else if ("object" == typeof e2) if (Array.isArray(e2)) {
1002 var o2 = e2.length;
1003 for (t2 = 0; t2 < o2; t2++) e2[t2] && (f2 = r(e2[t2])) && (n2 && (n2 += " "), n2 += f2);
1004 } else for (f2 in e2) e2[f2] && (n2 && (n2 += " "), n2 += f2);
1005 return n2;
1006 }
1007 function clsx() {
1008 for (var e2, t2, f2 = 0, n2 = "", o2 = arguments.length; f2 < o2; f2++) (e2 = arguments[f2]) && (t2 = r(e2)) && (n2 && (n2 += " "), n2 += t2);
1009 return n2;
1010 }
1011 var clsx_default = clsx;
1012
1013 // packages/dataviews/build-module/dataviews/index.mjs
1014 var import_element86 = __toESM(require_element(), 1);
1015 var import_compose14 = __toESM(require_compose(), 1);
1016
1017 // node_modules/@base-ui/utils/safeReact.mjs
1018 var React = __toESM(require_react(), 1);
1019 var SafeReact = {
1020 ...React
1021 };
1022
1023 // node_modules/@base-ui/utils/useRefWithInit.mjs
1024 var React2 = __toESM(require_react(), 1);
1025 var UNINITIALIZED = {};
1026 function useRefWithInit(init2, initArg) {
1027 const ref = React2.useRef(UNINITIALIZED);
1028 if (ref.current === UNINITIALIZED) {
1029 ref.current = init2(initArg);
1030 }
1031 return ref;
1032 }
1033
1034 // node_modules/@base-ui/utils/useStableCallback.mjs
1035 var useInsertionEffect = SafeReact.useInsertionEffect;
1036 var useSafeInsertionEffect = (
1037 // React 17 doesn't have useInsertionEffect.
1038 useInsertionEffect && // Preact replaces useInsertionEffect with useLayoutEffect and fires too late.
1039 useInsertionEffect !== SafeReact.useLayoutEffect ? useInsertionEffect : (fn) => fn()
1040 );
1041 function useStableCallback(callback) {
1042 const stable = useRefWithInit(createStableCallback).current;
1043 stable.next = callback;
1044 useSafeInsertionEffect(stable.effect);
1045 return stable.trampoline;
1046 }
1047 function createStableCallback() {
1048 const stable = {
1049 next: void 0,
1050 callback: assertNotCalled,
1051 trampoline: (...args) => stable.callback?.(...args),
1052 effect: () => {
1053 stable.callback = stable.next;
1054 }
1055 };
1056 return stable;
1057 }
1058 function assertNotCalled() {
1059 if (true) {
1060 throw (
1061 /* minify-error-disabled */
1062 new Error("Base UI: Cannot call an event handler while rendering.")
1063 );
1064 }
1065 }
1066
1067 // node_modules/@base-ui/utils/useIsoLayoutEffect.mjs
1068 var React3 = __toESM(require_react(), 1);
1069 var noop = () => {
1070 };
1071 var useIsoLayoutEffect = typeof document !== "undefined" ? React3.useLayoutEffect : noop;
1072
1073 // node_modules/@base-ui/utils/warn.mjs
1074 var set;
1075 if (true) {
1076 set = /* @__PURE__ */ new Set();
1077 }
1078 function warn(...messages) {
1079 if (true) {
1080 const messageKey = messages.join(" ");
1081 if (!set.has(messageKey)) {
1082 set.add(messageKey);
1083 console.warn(`Base UI: ${messageKey}`);
1084 }
1085 }
1086 }
1087
1088 // node_modules/@base-ui/react/internals/direction-context/DirectionContext.mjs
1089 var React4 = __toESM(require_react(), 1);
1090 var DirectionContext = /* @__PURE__ */ React4.createContext(void 0);
1091 if (true) DirectionContext.displayName = "DirectionContext";
1092 function useDirection() {
1093 const context = React4.useContext(DirectionContext);
1094 return context?.direction ?? "ltr";
1095 }
1096
1097 // node_modules/@base-ui/react/internals/useRenderElement.mjs
1098 var React7 = __toESM(require_react(), 1);
1099
1100 // node_modules/@base-ui/utils/useMergedRefs.mjs
1101 function useMergedRefs(a2, b2, c2, d2) {
1102 const forkRef = useRefWithInit(createForkRef).current;
1103 if (didChange(forkRef, a2, b2, c2, d2)) {
1104 update(forkRef, [a2, b2, c2, d2]);
1105 }
1106 return forkRef.callback;
1107 }
1108 function useMergedRefsN(refs) {
1109 const forkRef = useRefWithInit(createForkRef).current;
1110 if (didChangeN(forkRef, refs)) {
1111 update(forkRef, refs);
1112 }
1113 return forkRef.callback;
1114 }
1115 function createForkRef() {
1116 return {
1117 callback: null,
1118 cleanup: null,
1119 refs: []
1120 };
1121 }
1122 function didChange(forkRef, a2, b2, c2, d2) {
1123 return forkRef.refs[0] !== a2 || forkRef.refs[1] !== b2 || forkRef.refs[2] !== c2 || forkRef.refs[3] !== d2;
1124 }
1125 function didChangeN(forkRef, newRefs) {
1126 return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index2) => ref !== newRefs[index2]);
1127 }
1128 function update(forkRef, refs) {
1129 forkRef.refs = refs;
1130 if (refs.every((ref) => ref == null)) {
1131 forkRef.callback = null;
1132 return;
1133 }
1134 forkRef.callback = (instance) => {
1135 if (forkRef.cleanup) {
1136 forkRef.cleanup();
1137 forkRef.cleanup = null;
1138 }
1139 if (instance != null) {
1140 const cleanupCallbacks = Array(refs.length).fill(null);
1141 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1142 const ref = refs[i2];
1143 if (ref == null) {
1144 continue;
1145 }
1146 switch (typeof ref) {
1147 case "function": {
1148 const refCleanup = ref(instance);
1149 if (typeof refCleanup === "function") {
1150 cleanupCallbacks[i2] = refCleanup;
1151 }
1152 break;
1153 }
1154 case "object": {
1155 ref.current = instance;
1156 break;
1157 }
1158 default:
1159 }
1160 }
1161 forkRef.cleanup = () => {
1162 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1163 const ref = refs[i2];
1164 if (ref == null) {
1165 continue;
1166 }
1167 switch (typeof ref) {
1168 case "function": {
1169 const cleanupCallback = cleanupCallbacks[i2];
1170 if (typeof cleanupCallback === "function") {
1171 cleanupCallback();
1172 } else {
1173 ref(null);
1174 }
1175 break;
1176 }
1177 case "object": {
1178 ref.current = null;
1179 break;
1180 }
1181 default:
1182 }
1183 }
1184 };
1185 }
1186 };
1187 }
1188
1189 // node_modules/@base-ui/utils/getReactElementRef.mjs
1190 var React6 = __toESM(require_react(), 1);
1191
1192 // node_modules/@base-ui/utils/reactVersion.mjs
1193 var React5 = __toESM(require_react(), 1);
1194 var majorVersion = parseInt(React5.version, 10);
1195 function isReactVersionAtLeast(reactVersionToCheck) {
1196 return majorVersion >= reactVersionToCheck;
1197 }
1198
1199 // node_modules/@base-ui/utils/getReactElementRef.mjs
1200 function getReactElementRef(element) {
1201 if (!/* @__PURE__ */ React6.isValidElement(element)) {
1202 return null;
1203 }
1204 const reactElement = element;
1205 const propsWithRef = reactElement.props;
1206 return (isReactVersionAtLeast(19) ? propsWithRef?.ref : reactElement.ref) ?? null;
1207 }
1208
1209 // node_modules/@base-ui/utils/mergeObjects.mjs
1210 function mergeObjects(a2, b2) {
1211 if (a2 && !b2) {
1212 return a2;
1213 }
1214 if (!a2 && b2) {
1215 return b2;
1216 }
1217 if (a2 || b2) {
1218 return {
1219 ...a2,
1220 ...b2
1221 };
1222 }
1223 return void 0;
1224 }
1225
1226 // node_modules/@base-ui/utils/empty.mjs
1227 function NOOP() {
1228 }
1229 var EMPTY_ARRAY = Object.freeze([]);
1230 var EMPTY_OBJECT = Object.freeze({});
1231
1232 // node_modules/@base-ui/react/internals/getStateAttributesProps.mjs
1233 function getStateAttributesProps(state, customMapping) {
1234 const props = {};
1235 for (const key in state) {
1236 const value = state[key];
1237 if (customMapping?.hasOwnProperty(key)) {
1238 const customProps = customMapping[key](value);
1239 if (customProps != null) {
1240 Object.assign(props, customProps);
1241 }
1242 continue;
1243 }
1244 if (value === true) {
1245 props[`data-${key.toLowerCase()}`] = "";
1246 } else if (value) {
1247 props[`data-${key.toLowerCase()}`] = value.toString();
1248 }
1249 }
1250 return props;
1251 }
1252
1253 // node_modules/@base-ui/react/utils/resolveClassName.mjs
1254 function resolveClassName(className, state) {
1255 return typeof className === "function" ? className(state) : className;
1256 }
1257
1258 // node_modules/@base-ui/react/utils/resolveStyle.mjs
1259 function resolveStyle(style, state) {
1260 return typeof style === "function" ? style(state) : style;
1261 }
1262
1263 // node_modules/@base-ui/react/merge-props/mergeProps.mjs
1264 var EMPTY_PROPS = {};
1265 function mergeProps(a2, b2, c2, d2, e2) {
1266 if (!c2 && !d2 && !e2 && !a2) {
1267 return createInitialMergedProps(b2);
1268 }
1269 let merged = createInitialMergedProps(a2);
1270 if (b2) {
1271 merged = mergeInto(merged, b2);
1272 }
1273 if (c2) {
1274 merged = mergeInto(merged, c2);
1275 }
1276 if (d2) {
1277 merged = mergeInto(merged, d2);
1278 }
1279 if (e2) {
1280 merged = mergeInto(merged, e2);
1281 }
1282 return merged;
1283 }
1284 function mergePropsN(props) {
1285 if (props.length === 0) {
1286 return EMPTY_PROPS;
1287 }
1288 if (props.length === 1) {
1289 return createInitialMergedProps(props[0]);
1290 }
1291 let merged = createInitialMergedProps(props[0]);
1292 for (let i2 = 1; i2 < props.length; i2 += 1) {
1293 merged = mergeInto(merged, props[i2]);
1294 }
1295 return merged;
1296 }
1297 function createInitialMergedProps(inputProps) {
1298 if (isPropsGetter(inputProps)) {
1299 return {
1300 ...resolvePropsGetter(inputProps, EMPTY_PROPS)
1301 };
1302 }
1303 return copyInitialProps(inputProps);
1304 }
1305 function mergeInto(merged, inputProps) {
1306 if (isPropsGetter(inputProps)) {
1307 return resolvePropsGetter(inputProps, merged);
1308 }
1309 return mutablyMergeInto(merged, inputProps);
1310 }
1311 function copyInitialProps(inputProps) {
1312 const copiedProps = {
1313 ...inputProps
1314 };
1315 for (const propName in copiedProps) {
1316 const propValue = copiedProps[propName];
1317 if (isEventHandler(propName, propValue)) {
1318 copiedProps[propName] = wrapEventHandler(propValue);
1319 }
1320 }
1321 return copiedProps;
1322 }
1323 function mutablyMergeInto(mergedProps, externalProps) {
1324 if (!externalProps) {
1325 return mergedProps;
1326 }
1327 for (const propName in externalProps) {
1328 const externalPropValue = externalProps[propName];
1329 switch (propName) {
1330 case "style": {
1331 mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue);
1332 break;
1333 }
1334 case "className": {
1335 mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue);
1336 break;
1337 }
1338 default: {
1339 if (isEventHandler(propName, externalPropValue)) {
1340 mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue);
1341 } else {
1342 mergedProps[propName] = externalPropValue;
1343 }
1344 }
1345 }
1346 }
1347 return mergedProps;
1348 }
1349 function isEventHandler(key, value) {
1350 const code0 = key.charCodeAt(0);
1351 const code1 = key.charCodeAt(1);
1352 const code2 = key.charCodeAt(2);
1353 return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined");
1354 }
1355 function isPropsGetter(inputProps) {
1356 return typeof inputProps === "function";
1357 }
1358 function resolvePropsGetter(inputProps, previousProps) {
1359 if (isPropsGetter(inputProps)) {
1360 return inputProps(previousProps);
1361 }
1362 return inputProps ?? EMPTY_PROPS;
1363 }
1364 function mergeEventHandlers(ourHandler, theirHandler) {
1365 if (!theirHandler) {
1366 return ourHandler;
1367 }
1368 if (!ourHandler) {
1369 return wrapEventHandler(theirHandler);
1370 }
1371 return (...args) => {
1372 const event = args[0];
1373 if (isSyntheticEvent(event)) {
1374 const baseUIEvent = event;
1375 makeEventPreventable(baseUIEvent);
1376 const result2 = theirHandler(...args);
1377 if (!baseUIEvent.baseUIHandlerPrevented) {
1378 ourHandler?.(...args);
1379 }
1380 return result2;
1381 }
1382 const result = theirHandler(...args);
1383 ourHandler?.(...args);
1384 return result;
1385 };
1386 }
1387 function wrapEventHandler(handler) {
1388 if (!handler) {
1389 return handler;
1390 }
1391 return (...args) => {
1392 const event = args[0];
1393 if (isSyntheticEvent(event)) {
1394 makeEventPreventable(event);
1395 }
1396 return handler(...args);
1397 };
1398 }
1399 function makeEventPreventable(event) {
1400 event.preventBaseUIHandler = () => {
1401 event.baseUIHandlerPrevented = true;
1402 };
1403 return event;
1404 }
1405 function mergeClassNames(ourClassName, theirClassName) {
1406 if (theirClassName) {
1407 if (ourClassName) {
1408 return theirClassName + " " + ourClassName;
1409 }
1410 return theirClassName;
1411 }
1412 return ourClassName;
1413 }
1414 function isSyntheticEvent(event) {
1415 return event != null && typeof event === "object" && "nativeEvent" in event;
1416 }
1417
1418 // node_modules/@base-ui/react/internals/useRenderElement.mjs
1419 var import_react = __toESM(require_react(), 1);
1420 function useRenderElement(element, componentProps, params = {}) {
1421 const renderProp = componentProps.render;
1422 const outProps = useRenderElementProps(componentProps, params);
1423 if (params.enabled === false) {
1424 return null;
1425 }
1426 const state = params.state ?? EMPTY_OBJECT;
1427 return evaluateRenderProp(element, renderProp, outProps, state);
1428 }
1429 function useRenderElementProps(componentProps, params = {}) {
1430 const {
1431 className: classNameProp,
1432 style: styleProp,
1433 render: renderProp
1434 } = componentProps;
1435 const {
1436 state = EMPTY_OBJECT,
1437 ref,
1438 props,
1439 stateAttributesMapping: stateAttributesMapping3,
1440 enabled = true
1441 } = params;
1442 const className = enabled ? resolveClassName(classNameProp, state) : void 0;
1443 const style = enabled ? resolveStyle(styleProp, state) : void 0;
1444 const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping3) : EMPTY_OBJECT;
1445 const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : void 0;
1446 const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT;
1447 if (typeof document !== "undefined") {
1448 if (!enabled) {
1449 useMergedRefs(null, null);
1450 } else if (Array.isArray(ref)) {
1451 outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]);
1452 } else {
1453 outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref);
1454 }
1455 }
1456 if (!enabled) {
1457 return EMPTY_OBJECT;
1458 }
1459 if (className !== void 0) {
1460 outProps.className = mergeClassNames(outProps.className, className);
1461 }
1462 if (style !== void 0) {
1463 outProps.style = mergeObjects(outProps.style, style);
1464 }
1465 return outProps;
1466 }
1467 function resolveRenderFunctionProps(props) {
1468 if (Array.isArray(props)) {
1469 return mergePropsN(props);
1470 }
1471 return mergeProps(void 0, props);
1472 }
1473 var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
1474 var COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/;
1475 var LOWERCASE_CHARACTER_PATTERN = /[a-z]/;
1476 function evaluateRenderProp(element, render4, props, state) {
1477 if (render4) {
1478 if (typeof render4 === "function") {
1479 if (true) {
1480 warnIfRenderPropLooksLikeComponent(render4);
1481 }
1482 return render4(props, state);
1483 }
1484 const mergedProps = mergeProps(props, render4.props);
1485 mergedProps.ref = props.ref;
1486 let newElement = render4;
1487 if (newElement?.$$typeof === REACT_LAZY_TYPE) {
1488 const children = React7.Children.toArray(render4);
1489 newElement = children[0];
1490 }
1491 if (true) {
1492 if (!/* @__PURE__ */ React7.isValidElement(newElement)) {
1493 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"));
1494 }
1495 }
1496 return /* @__PURE__ */ React7.cloneElement(newElement, mergedProps);
1497 }
1498 if (element) {
1499 if (typeof element === "string") {
1500 return renderTag(element, props);
1501 }
1502 }
1503 throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage_default(8));
1504 }
1505 function warnIfRenderPropLooksLikeComponent(renderFn) {
1506 const functionName = renderFn.name;
1507 if (functionName.length === 0) {
1508 return;
1509 }
1510 if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) {
1511 return;
1512 }
1513 if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) {
1514 return;
1515 }
1516 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");
1517 }
1518 function renderTag(Tag, props) {
1519 if (Tag === "button") {
1520 return /* @__PURE__ */ (0, import_react.createElement)("button", {
1521 type: "button",
1522 ...props,
1523 key: props.key
1524 });
1525 }
1526 if (Tag === "img") {
1527 return /* @__PURE__ */ (0, import_react.createElement)("img", {
1528 alt: "",
1529 ...props,
1530 key: props.key
1531 });
1532 }
1533 return /* @__PURE__ */ React7.createElement(Tag, props);
1534 }
1535
1536 // node_modules/@base-ui/utils/useId.mjs
1537 var React8 = __toESM(require_react(), 1);
1538 var globalId = 0;
1539 function useGlobalId(idOverride, prefix = "mui") {
1540 const [defaultId, setDefaultId] = React8.useState(idOverride);
1541 const id = idOverride || defaultId;
1542 React8.useEffect(() => {
1543 if (defaultId == null) {
1544 globalId += 1;
1545 setDefaultId(`${prefix}-${globalId}`);
1546 }
1547 }, [defaultId, prefix]);
1548 return id;
1549 }
1550 var maybeReactUseId = SafeReact.useId;
1551 function useId(idOverride, prefix) {
1552 if (maybeReactUseId !== void 0) {
1553 const reactId = maybeReactUseId();
1554 return idOverride ?? (prefix ? `${prefix}-${reactId}` : reactId);
1555 }
1556 return useGlobalId(idOverride, prefix);
1557 }
1558
1559 // node_modules/@base-ui/react/internals/useBaseUiId.mjs
1560 function useBaseUiId(idOverride) {
1561 return useId(idOverride, "base-ui");
1562 }
1563
1564 // node_modules/@base-ui/react/internals/reason-parts.mjs
1565 var reason_parts_exports = {};
1566 __export(reason_parts_exports, {
1567 cancelOpen: () => cancelOpen,
1568 chipRemovePress: () => chipRemovePress,
1569 clearPress: () => clearPress,
1570 closePress: () => closePress,
1571 closeWatcher: () => closeWatcher,
1572 decrementPress: () => decrementPress,
1573 disabled: () => disabled,
1574 drag: () => drag,
1575 escapeKey: () => escapeKey,
1576 focusOut: () => focusOut,
1577 imperativeAction: () => imperativeAction,
1578 incrementPress: () => incrementPress,
1579 initial: () => initial,
1580 inputBlur: () => inputBlur,
1581 inputChange: () => inputChange,
1582 inputClear: () => inputClear,
1583 inputPaste: () => inputPaste,
1584 inputPress: () => inputPress,
1585 itemPress: () => itemPress,
1586 keyboard: () => keyboard,
1587 linkPress: () => linkPress,
1588 listNavigation: () => listNavigation,
1589 missing: () => missing,
1590 none: () => none,
1591 outsidePress: () => outsidePress,
1592 pointer: () => pointer,
1593 scrub: () => scrub,
1594 siblingOpen: () => siblingOpen,
1595 swipe: () => swipe,
1596 trackPress: () => trackPress,
1597 triggerFocus: () => triggerFocus,
1598 triggerHover: () => triggerHover,
1599 triggerPress: () => triggerPress,
1600 wheel: () => wheel,
1601 windowResize: () => windowResize
1602 });
1603 var none = "none";
1604 var triggerPress = "trigger-press";
1605 var triggerHover = "trigger-hover";
1606 var triggerFocus = "trigger-focus";
1607 var outsidePress = "outside-press";
1608 var itemPress = "item-press";
1609 var closePress = "close-press";
1610 var linkPress = "link-press";
1611 var clearPress = "clear-press";
1612 var chipRemovePress = "chip-remove-press";
1613 var trackPress = "track-press";
1614 var incrementPress = "increment-press";
1615 var decrementPress = "decrement-press";
1616 var inputChange = "input-change";
1617 var inputClear = "input-clear";
1618 var inputBlur = "input-blur";
1619 var inputPaste = "input-paste";
1620 var inputPress = "input-press";
1621 var focusOut = "focus-out";
1622 var escapeKey = "escape-key";
1623 var closeWatcher = "close-watcher";
1624 var listNavigation = "list-navigation";
1625 var keyboard = "keyboard";
1626 var pointer = "pointer";
1627 var drag = "drag";
1628 var wheel = "wheel";
1629 var scrub = "scrub";
1630 var cancelOpen = "cancel-open";
1631 var siblingOpen = "sibling-open";
1632 var disabled = "disabled";
1633 var missing = "missing";
1634 var initial = "initial";
1635 var imperativeAction = "imperative-action";
1636 var swipe = "swipe";
1637 var windowResize = "window-resize";
1638
1639 // node_modules/@base-ui/react/internals/createBaseUIEventDetails.mjs
1640 function createChangeEventDetails(reason, event, trigger, customProperties) {
1641 let canceled = false;
1642 let allowPropagation = false;
1643 const custom = customProperties ?? EMPTY_OBJECT;
1644 const details = {
1645 reason,
1646 event: event ?? new Event("base-ui"),
1647 cancel() {
1648 canceled = true;
1649 },
1650 allowPropagation() {
1651 allowPropagation = true;
1652 },
1653 get isCanceled() {
1654 return canceled;
1655 },
1656 get isPropagationAllowed() {
1657 return allowPropagation;
1658 },
1659 trigger,
1660 ...custom
1661 };
1662 return details;
1663 }
1664
1665 // node_modules/@base-ui/react/internals/useTransitionStatus.mjs
1666 var React10 = __toESM(require_react(), 1);
1667
1668 // node_modules/@base-ui/utils/useOnMount.mjs
1669 var React9 = __toESM(require_react(), 1);
1670 var EMPTY = [];
1671 function useOnMount(fn) {
1672 React9.useEffect(fn, EMPTY);
1673 }
1674
1675 // node_modules/@base-ui/utils/useAnimationFrame.mjs
1676 var EMPTY2 = null;
1677 var LAST_RAF = globalThis.requestAnimationFrame;
1678 var Scheduler = class {
1679 /* This implementation uses an array as a backing data-structure for frame callbacks.
1680 * It allows `O(1)` callback cancelling by inserting a `null` in the array, though it
1681 * never calls the native `cancelAnimationFrame` if there are no frames left. This can
1682 * be much more efficient if there is a call pattern that alterns as
1683 * "request-cancel-request-cancel-…".
1684 * But in the case of "request-request-…-cancel-cancel-…", it leaves the final animation
1685 * frame to run anyway. We turn that frame into a `O(1)` no-op via `callbacksCount`. */
1686 callbacks = [];
1687 callbacksCount = 0;
1688 nextId = 1;
1689 startId = 1;
1690 isScheduled = false;
1691 tick = (timestamp) => {
1692 this.isScheduled = false;
1693 const currentCallbacks = this.callbacks;
1694 const currentCallbacksCount = this.callbacksCount;
1695 this.callbacks = [];
1696 this.callbacksCount = 0;
1697 this.startId = this.nextId;
1698 if (currentCallbacksCount > 0) {
1699 for (let i2 = 0; i2 < currentCallbacks.length; i2 += 1) {
1700 currentCallbacks[i2]?.(timestamp);
1701 }
1702 }
1703 };
1704 request(fn) {
1705 const id = this.nextId;
1706 this.nextId += 1;
1707 this.callbacks.push(fn);
1708 this.callbacksCount += 1;
1709 const didRAFChange = LAST_RAF !== requestAnimationFrame && (LAST_RAF = requestAnimationFrame, true);
1710 if (!this.isScheduled || didRAFChange) {
1711 requestAnimationFrame(this.tick);
1712 this.isScheduled = true;
1713 }
1714 return id;
1715 }
1716 cancel(id) {
1717 const index2 = id - this.startId;
1718 if (index2 < 0 || index2 >= this.callbacks.length) {
1719 return;
1720 }
1721 this.callbacks[index2] = null;
1722 this.callbacksCount -= 1;
1723 }
1724 };
1725 var scheduler = new Scheduler();
1726 var AnimationFrame = class _AnimationFrame {
1727 static create() {
1728 return new _AnimationFrame();
1729 }
1730 static request(fn) {
1731 return scheduler.request(fn);
1732 }
1733 static cancel(id) {
1734 return scheduler.cancel(id);
1735 }
1736 currentId = EMPTY2;
1737 /**
1738 * Executes `fn` after `delay`, clearing any previously scheduled call.
1739 */
1740 request(fn) {
1741 this.cancel();
1742 this.currentId = scheduler.request(() => {
1743 this.currentId = EMPTY2;
1744 fn();
1745 });
1746 }
1747 cancel = () => {
1748 if (this.currentId !== EMPTY2) {
1749 scheduler.cancel(this.currentId);
1750 this.currentId = EMPTY2;
1751 }
1752 };
1753 disposeEffect = () => {
1754 return this.cancel;
1755 };
1756 };
1757 function useAnimationFrame() {
1758 const timeout = useRefWithInit(AnimationFrame.create).current;
1759 useOnMount(timeout.disposeEffect);
1760 return timeout;
1761 }
1762
1763 // node_modules/@base-ui/react/internals/useTransitionStatus.mjs
1764 function useTransitionStatus(open, enableIdleState = false, deferEndingState = false) {
1765 const [transitionStatus, setTransitionStatus] = React10.useState(open && enableIdleState ? "idle" : void 0);
1766 const [mounted, setMounted] = React10.useState(open);
1767 if (open && !mounted) {
1768 setMounted(true);
1769 setTransitionStatus("starting");
1770 }
1771 if (!open && mounted && transitionStatus !== "ending" && !deferEndingState) {
1772 setTransitionStatus("ending");
1773 }
1774 if (!open && !mounted && transitionStatus === "ending") {
1775 setTransitionStatus(void 0);
1776 }
1777 useIsoLayoutEffect(() => {
1778 if (!open && mounted && transitionStatus !== "ending" && deferEndingState) {
1779 const frame = AnimationFrame.request(() => {
1780 setTransitionStatus("ending");
1781 });
1782 return () => {
1783 AnimationFrame.cancel(frame);
1784 };
1785 }
1786 return void 0;
1787 }, [open, mounted, transitionStatus, deferEndingState]);
1788 useIsoLayoutEffect(() => {
1789 if (!open || enableIdleState) {
1790 return void 0;
1791 }
1792 const frame = AnimationFrame.request(() => {
1793 setTransitionStatus(void 0);
1794 });
1795 return () => {
1796 AnimationFrame.cancel(frame);
1797 };
1798 }, [enableIdleState, open]);
1799 useIsoLayoutEffect(() => {
1800 if (!open || !enableIdleState) {
1801 return void 0;
1802 }
1803 if (open && mounted && transitionStatus !== "idle") {
1804 setTransitionStatus("starting");
1805 }
1806 const frame = AnimationFrame.request(() => {
1807 setTransitionStatus("idle");
1808 });
1809 return () => {
1810 AnimationFrame.cancel(frame);
1811 };
1812 }, [enableIdleState, open, mounted, transitionStatus]);
1813 return {
1814 mounted,
1815 setMounted,
1816 transitionStatus
1817 };
1818 }
1819
1820 // node_modules/@base-ui/react/internals/stateAttributesMapping.mjs
1821 var TransitionStatusDataAttributes = /* @__PURE__ */ (function(TransitionStatusDataAttributes2) {
1822 TransitionStatusDataAttributes2["startingStyle"] = "data-starting-style";
1823 TransitionStatusDataAttributes2["endingStyle"] = "data-ending-style";
1824 return TransitionStatusDataAttributes2;
1825 })({});
1826 var STARTING_HOOK = {
1827 [TransitionStatusDataAttributes.startingStyle]: ""
1828 };
1829 var ENDING_HOOK = {
1830 [TransitionStatusDataAttributes.endingStyle]: ""
1831 };
1832 var transitionStatusMapping = {
1833 transitionStatus(value) {
1834 if (value === "starting") {
1835 return STARTING_HOOK;
1836 }
1837 if (value === "ending") {
1838 return ENDING_HOOK;
1839 }
1840 return null;
1841 }
1842 };
1843
1844 // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
1845 function hasWindow() {
1846 return typeof window !== "undefined";
1847 }
1848 function getNodeName(node) {
1849 if (isNode(node)) {
1850 return (node.nodeName || "").toLowerCase();
1851 }
1852 return "#document";
1853 }
1854 function getWindow(node) {
1855 var _node$ownerDocument;
1856 return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;
1857 }
1858 function getDocumentElement(node) {
1859 var _ref;
1860 return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;
1861 }
1862 function isNode(value) {
1863 if (!hasWindow()) {
1864 return false;
1865 }
1866 return value instanceof Node || value instanceof getWindow(value).Node;
1867 }
1868 function isElement(value) {
1869 if (!hasWindow()) {
1870 return false;
1871 }
1872 return value instanceof Element || value instanceof getWindow(value).Element;
1873 }
1874 function isHTMLElement(value) {
1875 if (!hasWindow()) {
1876 return false;
1877 }
1878 return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;
1879 }
1880 function isShadowRoot(value) {
1881 if (!hasWindow() || typeof ShadowRoot === "undefined") {
1882 return false;
1883 }
1884 return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;
1885 }
1886 function isOverflowElement(element) {
1887 const {
1888 overflow,
1889 overflowX,
1890 overflowY,
1891 display
1892 } = getComputedStyle2(element);
1893 return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== "inline" && display !== "contents";
1894 }
1895 function isTableElement(element) {
1896 return /^(table|td|th)$/.test(getNodeName(element));
1897 }
1898 function isTopLayer(element) {
1899 try {
1900 if (element.matches(":popover-open")) {
1901 return true;
1902 }
1903 } catch (_e) {
1904 }
1905 try {
1906 return element.matches(":modal");
1907 } catch (_e) {
1908 return false;
1909 }
1910 }
1911 var willChangeRe = /transform|translate|scale|rotate|perspective|filter/;
1912 var containRe = /paint|layout|strict|content/;
1913 var isNotNone = (value) => !!value && value !== "none";
1914 var isWebKitValue;
1915 function isContainingBlock(elementOrCss) {
1916 const css = isElement(elementOrCss) ? getComputedStyle2(elementOrCss) : elementOrCss;
1917 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 || "");
1918 }
1919 function getContainingBlock(element) {
1920 let currentNode = getParentNode(element);
1921 while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {
1922 if (isContainingBlock(currentNode)) {
1923 return currentNode;
1924 } else if (isTopLayer(currentNode)) {
1925 return null;
1926 }
1927 currentNode = getParentNode(currentNode);
1928 }
1929 return null;
1930 }
1931 function isWebKit() {
1932 if (isWebKitValue == null) {
1933 isWebKitValue = typeof CSS !== "undefined" && CSS.supports && CSS.supports("-webkit-backdrop-filter", "none");
1934 }
1935 return isWebKitValue;
1936 }
1937 function isLastTraversableNode(node) {
1938 return /^(html|body|#document)$/.test(getNodeName(node));
1939 }
1940 function getComputedStyle2(element) {
1941 return getWindow(element).getComputedStyle(element);
1942 }
1943 function getNodeScroll(element) {
1944 if (isElement(element)) {
1945 return {
1946 scrollLeft: element.scrollLeft,
1947 scrollTop: element.scrollTop
1948 };
1949 }
1950 return {
1951 scrollLeft: element.scrollX,
1952 scrollTop: element.scrollY
1953 };
1954 }
1955 function getParentNode(node) {
1956 if (getNodeName(node) === "html") {
1957 return node;
1958 }
1959 const result = (
1960 // Step into the shadow DOM of the parent of a slotted node.
1961 node.assignedSlot || // DOM Element detected.
1962 node.parentNode || // ShadowRoot detected.
1963 isShadowRoot(node) && node.host || // Fallback.
1964 getDocumentElement(node)
1965 );
1966 return isShadowRoot(result) ? result.host : result;
1967 }
1968 function getNearestOverflowAncestor(node) {
1969 const parentNode = getParentNode(node);
1970 if (isLastTraversableNode(parentNode)) {
1971 return node.ownerDocument ? node.ownerDocument.body : node.body;
1972 }
1973 if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {
1974 return parentNode;
1975 }
1976 return getNearestOverflowAncestor(parentNode);
1977 }
1978 function getOverflowAncestors(node, list, traverseIframes) {
1979 var _node$ownerDocument2;
1980 if (list === void 0) {
1981 list = [];
1982 }
1983 if (traverseIframes === void 0) {
1984 traverseIframes = true;
1985 }
1986 const scrollableAncestor = getNearestOverflowAncestor(node);
1987 const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);
1988 const win = getWindow(scrollableAncestor);
1989 if (isBody) {
1990 const frameElement = getFrameElement(win);
1991 return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);
1992 } else {
1993 return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
1994 }
1995 }
1996 function getFrameElement(win) {
1997 return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
1998 }
1999
2000 // node_modules/@base-ui/utils/addEventListener.mjs
2001 function addEventListener(target, type, listener, options) {
2002 target.addEventListener(type, listener, options);
2003 return () => {
2004 target.removeEventListener(type, listener, options);
2005 };
2006 }
2007
2008 // node_modules/@base-ui/utils/useValueAsRef.mjs
2009 function useValueAsRef(value) {
2010 const latest = useRefWithInit(createLatestRef, value).current;
2011 latest.next = value;
2012 useIsoLayoutEffect(latest.effect);
2013 return latest;
2014 }
2015 function createLatestRef(value) {
2016 const latest = {
2017 current: value,
2018 next: value,
2019 effect: () => {
2020 latest.current = latest.next;
2021 }
2022 };
2023 return latest;
2024 }
2025
2026 // node_modules/@base-ui/utils/owner.mjs
2027 function ownerDocument(node) {
2028 return node?.ownerDocument || document;
2029 }
2030
2031 // node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs
2032 var React11 = __toESM(require_react(), 1);
2033
2034 // node_modules/@base-ui/react/internals/useAnimationsFinished.mjs
2035 var ReactDOM = __toESM(require_react_dom(), 1);
2036
2037 // node_modules/@base-ui/react/utils/resolveRef.mjs
2038 function resolveRef(maybeRef) {
2039 if (maybeRef == null) {
2040 return maybeRef;
2041 }
2042 return "current" in maybeRef ? maybeRef.current : maybeRef;
2043 }
2044
2045 // node_modules/@base-ui/react/internals/useAnimationsFinished.mjs
2046 function useAnimationsFinished(elementOrRef, waitForStartingStyleRemoved = false, treatAbortedAsFinished = true) {
2047 const frame = useAnimationFrame();
2048 return useStableCallback((fnToExecute, signal = null) => {
2049 frame.cancel();
2050 const element = resolveRef(elementOrRef);
2051 if (element == null) {
2052 return;
2053 }
2054 const resolvedElement = element;
2055 const done = () => {
2056 ReactDOM.flushSync(fnToExecute);
2057 };
2058 if (typeof resolvedElement.getAnimations !== "function" || globalThis.BASE_UI_ANIMATIONS_DISABLED) {
2059 fnToExecute();
2060 return;
2061 }
2062 function exec() {
2063 Promise.all(resolvedElement.getAnimations().map((animation) => animation.finished)).then(() => {
2064 if (!signal?.aborted) {
2065 done();
2066 }
2067 }).catch(() => {
2068 if (treatAbortedAsFinished) {
2069 if (!signal?.aborted) {
2070 done();
2071 }
2072 return;
2073 }
2074 const currentAnimations = resolvedElement.getAnimations();
2075 if (!signal?.aborted && currentAnimations.length > 0 && currentAnimations.some((animation) => animation.pending || animation.playState !== "finished")) {
2076 exec();
2077 }
2078 });
2079 }
2080 if (waitForStartingStyleRemoved) {
2081 const startingStyleAttribute = TransitionStatusDataAttributes.startingStyle;
2082 if (!resolvedElement.hasAttribute(startingStyleAttribute)) {
2083 frame.request(exec);
2084 return;
2085 }
2086 const attributeObserver = new MutationObserver(() => {
2087 if (!resolvedElement.hasAttribute(startingStyleAttribute)) {
2088 attributeObserver.disconnect();
2089 exec();
2090 }
2091 });
2092 attributeObserver.observe(resolvedElement, {
2093 attributes: true,
2094 attributeFilter: [startingStyleAttribute]
2095 });
2096 signal?.addEventListener("abort", () => attributeObserver.disconnect(), {
2097 once: true
2098 });
2099 return;
2100 }
2101 frame.request(exec);
2102 });
2103 }
2104
2105 // node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs
2106 function useOpenChangeComplete(parameters) {
2107 const {
2108 enabled = true,
2109 open,
2110 ref,
2111 onComplete: onCompleteParam
2112 } = parameters;
2113 const onComplete = useStableCallback(onCompleteParam);
2114 const runOnceAnimationsFinish = useAnimationsFinished(ref, open, false);
2115 React11.useEffect(() => {
2116 if (!enabled) {
2117 return void 0;
2118 }
2119 const abortController = new AbortController();
2120 runOnceAnimationsFinish(onComplete, abortController.signal);
2121 return () => {
2122 abortController.abort();
2123 };
2124 }, [enabled, open, onComplete, runOnceAnimationsFinish]);
2125 }
2126
2127 // node_modules/@base-ui/utils/useOnFirstRender.mjs
2128 var React12 = __toESM(require_react(), 1);
2129 function useOnFirstRender(fn) {
2130 const ref = React12.useRef(true);
2131 if (ref.current) {
2132 ref.current = false;
2133 fn();
2134 }
2135 }
2136
2137 // node_modules/@base-ui/utils/platform/parts.mjs
2138 var parts_exports = {};
2139 __export(parts_exports, {
2140 engine: () => engine_exports,
2141 env: () => env_exports,
2142 os: () => os_exports,
2143 screenReader: () => screen_reader_exports
2144 });
2145
2146 // node_modules/@base-ui/utils/platform/os.mjs
2147 var os_exports = {};
2148 __export(os_exports, {
2149 android: () => android,
2150 apple: () => apple,
2151 ios: () => ios,
2152 linux: () => linux,
2153 mac: () => mac,
2154 windows: () => windows
2155 });
2156
2157 // node_modules/@base-ui/utils/platform/shared.mjs
2158 function readRawData() {
2159 if (typeof navigator === "undefined") {
2160 return {
2161 userAgent: "",
2162 platform: "",
2163 maxTouchPoints: 0
2164 };
2165 }
2166 if (true) {
2167 const uaData = navigator.userAgentData;
2168 if (uaData && Array.isArray(uaData.brands)) {
2169 return {
2170 userAgent: uaData.brands.map(({
2171 brand,
2172 version: version2
2173 }) => `${brand}/${version2}`).join(" "),
2174 platform: uaData.platform ?? navigator.platform ?? "",
2175 maxTouchPoints: navigator.maxTouchPoints ?? 0
2176 };
2177 }
2178 }
2179 return {
2180 userAgent: navigator.userAgent,
2181 platform: navigator.platform ?? "",
2182 maxTouchPoints: navigator.maxTouchPoints ?? 0
2183 };
2184 }
2185 var {
2186 userAgent,
2187 platform,
2188 maxTouchPoints
2189 } = readRawData();
2190 var lowerUserAgent = userAgent.toLowerCase();
2191 var lowerPlatform = platform.toLowerCase();
2192
2193 // node_modules/@base-ui/utils/platform/os.mjs
2194 var ios = /^i(os$|p)/.test(lowerPlatform) || lowerPlatform === "macintel" && maxTouchPoints > 1;
2195 var ANDROID_STRING = "android";
2196 var android = lowerPlatform === ANDROID_STRING || lowerUserAgent.includes(ANDROID_STRING);
2197 var mac = !ios && lowerPlatform.startsWith("mac");
2198 var windows = lowerPlatform.startsWith("win");
2199 var linux = !android && /^(linux|chrome os)/.test(lowerPlatform);
2200 var apple = mac || ios;
2201
2202 // node_modules/@base-ui/utils/platform/engine.mjs
2203 var engine_exports = {};
2204 __export(engine_exports, {
2205 blink: () => blink,
2206 gecko: () => gecko,
2207 webkit: () => webkit
2208 });
2209 var webkit = typeof CSS !== "undefined" && !!CSS.supports?.("-webkit-backdrop-filter:none");
2210 var gecko = !webkit && lowerUserAgent.includes("firefox");
2211 var blink = !webkit && lowerUserAgent.includes("chrom");
2212
2213 // node_modules/@base-ui/utils/platform/screen-reader.mjs
2214 var screen_reader_exports = {};
2215 __export(screen_reader_exports, {
2216 voiceOver: () => voiceOver
2217 });
2218 var voiceOver = apple;
2219
2220 // node_modules/@base-ui/utils/platform/env.mjs
2221 var env_exports = {};
2222 __export(env_exports, {
2223 jsdom: () => jsdom
2224 });
2225 var jsdom = /jsdom|happydom/.test(lowerUserAgent);
2226
2227 // node_modules/@base-ui/utils/useTimeout.mjs
2228 var EMPTY3 = 0;
2229 var Timeout = class _Timeout {
2230 static create() {
2231 return new _Timeout();
2232 }
2233 currentId = EMPTY3;
2234 /**
2235 * Executes `fn` after `delay`, clearing any previously scheduled call.
2236 */
2237 start(delay, fn) {
2238 this.clear();
2239 this.currentId = setTimeout(() => {
2240 this.currentId = EMPTY3;
2241 fn();
2242 }, delay);
2243 }
2244 isStarted() {
2245 return this.currentId !== EMPTY3;
2246 }
2247 clear = () => {
2248 if (this.currentId !== EMPTY3) {
2249 clearTimeout(this.currentId);
2250 this.currentId = EMPTY3;
2251 }
2252 };
2253 disposeEffect = () => {
2254 return this.clear;
2255 };
2256 };
2257 function useTimeout() {
2258 const timeout = useRefWithInit(Timeout.create).current;
2259 useOnMount(timeout.disposeEffect);
2260 return timeout;
2261 }
2262
2263 // node_modules/@base-ui/react/floating-ui-react/components/FloatingDelayGroup.mjs
2264 var React13 = __toESM(require_react(), 1);
2265
2266 // node_modules/@base-ui/react/floating-ui-react/utils/event.mjs
2267 function isReactEvent(event) {
2268 return "nativeEvent" in event;
2269 }
2270 function isMouseLikePointerType(pointerType, strict) {
2271 const values = ["mouse", "pen"];
2272 if (!strict) {
2273 values.push("", void 0);
2274 }
2275 return values.includes(pointerType);
2276 }
2277 function isClickLikeEvent(event) {
2278 const type = event.type;
2279 return type === "click" || type === "mousedown" || type === "keydown" || type === "keyup";
2280 }
2281
2282 // node_modules/@base-ui/react/floating-ui-react/utils/constants.mjs
2283 var FOCUSABLE_ATTRIBUTE = "data-base-ui-focusable";
2284 var TYPEABLE_SELECTOR = "input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])";
2285
2286 // node_modules/@base-ui/react/internals/shadowDom.mjs
2287 function activeElement(doc) {
2288 let element = doc.activeElement;
2289 while (element?.shadowRoot?.activeElement != null) {
2290 element = element.shadowRoot.activeElement;
2291 }
2292 return element;
2293 }
2294 function contains(parent, child) {
2295 if (!parent || !child) {
2296 return false;
2297 }
2298 const rootNode = child.getRootNode?.();
2299 if (parent.contains(child)) {
2300 return true;
2301 }
2302 if (rootNode && isShadowRoot(rootNode)) {
2303 let next = child;
2304 while (next) {
2305 if (parent === next) {
2306 return true;
2307 }
2308 next = next.parentNode || next.host;
2309 }
2310 }
2311 return false;
2312 }
2313 function getTarget(event) {
2314 if ("composedPath" in event) {
2315 return event.composedPath()[0];
2316 }
2317 return event.target;
2318 }
2319
2320 // node_modules/@base-ui/react/floating-ui-react/utils/element.mjs
2321 function isTargetInsideEnabledTrigger(target, triggerElements) {
2322 if (!isElement(target)) {
2323 return false;
2324 }
2325 const targetElement = target;
2326 if (triggerElements.hasElement(targetElement)) {
2327 return !targetElement.hasAttribute("data-trigger-disabled");
2328 }
2329 for (const [, trigger] of triggerElements.entries()) {
2330 if (contains(trigger, targetElement)) {
2331 return !trigger.hasAttribute("data-trigger-disabled");
2332 }
2333 }
2334 return false;
2335 }
2336 function isEventTargetWithin(event, node) {
2337 if (node == null) {
2338 return false;
2339 }
2340 if ("composedPath" in event) {
2341 return event.composedPath().includes(node);
2342 }
2343 const eventAgain = event;
2344 return eventAgain.target != null && node.contains(eventAgain.target);
2345 }
2346 function isRootElement(element) {
2347 return element.matches("html,body");
2348 }
2349 function isTypeableElement(element) {
2350 return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);
2351 }
2352 function isInteractiveElement(element) {
2353 return element?.closest(`button,a[href],[role="button"],select,[tabindex]:not([tabindex="-1"]),${TYPEABLE_SELECTOR}`) != null;
2354 }
2355 function matchesFocusVisible(element) {
2356 if (!element || parts_exports.env.jsdom) {
2357 return true;
2358 }
2359 try {
2360 return element.matches(":focus-visible");
2361 } catch (_e) {
2362 return true;
2363 }
2364 }
2365
2366 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverShared.mjs
2367 function resolveValue(value, pointerType) {
2368 if (pointerType != null && !isMouseLikePointerType(pointerType)) {
2369 return 0;
2370 }
2371 if (typeof value === "function") {
2372 return value();
2373 }
2374 return value;
2375 }
2376 function getDelay(value, prop, pointerType) {
2377 const result = resolveValue(value, pointerType);
2378 if (typeof result === "number") {
2379 return result;
2380 }
2381 return result?.[prop];
2382 }
2383 function getRestMs(value) {
2384 if (typeof value === "function") {
2385 return value();
2386 }
2387 return value;
2388 }
2389 function isClickLikeOpenEvent(openEventType, interactedInside) {
2390 return interactedInside || openEventType === "click" || openEventType === "mousedown";
2391 }
2392 function isHoverOpenEvent(openEventType) {
2393 return openEventType?.includes("mouse") && openEventType !== "mousedown";
2394 }
2395
2396 // node_modules/@base-ui/react/floating-ui-react/components/FloatingDelayGroup.mjs
2397 var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
2398 var FloatingDelayGroupContext = /* @__PURE__ */ React13.createContext({
2399 hasProvider: false,
2400 timeoutMs: 0,
2401 delayRef: {
2402 current: 0
2403 },
2404 initialDelayRef: {
2405 current: 0
2406 },
2407 timeout: new Timeout(),
2408 currentIdRef: {
2409 current: null
2410 },
2411 currentContextRef: {
2412 current: null
2413 }
2414 });
2415 if (true) FloatingDelayGroupContext.displayName = "FloatingDelayGroupContext";
2416 function resetDelayRef(delayRef, initialDelayRef) {
2417 delayRef.current = initialDelayRef.current;
2418 }
2419 function FloatingDelayGroup(props) {
2420 const {
2421 children,
2422 delay,
2423 timeoutMs = 0
2424 } = props;
2425 const delayRef = React13.useRef(delay);
2426 const initialDelayRef = React13.useRef(delay);
2427 const currentIdRef = React13.useRef(null);
2428 const currentContextRef = React13.useRef(null);
2429 const timeout = useTimeout();
2430 useIsoLayoutEffect(() => {
2431 initialDelayRef.current = delay;
2432 if (!currentIdRef.current) {
2433 delayRef.current = delay;
2434 return;
2435 }
2436 delayRef.current = {
2437 open: getDelay(delayRef.current, "open"),
2438 close: getDelay(delay, "close")
2439 };
2440 }, [delay, currentIdRef, delayRef, initialDelayRef]);
2441 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(FloatingDelayGroupContext.Provider, {
2442 value: React13.useMemo(() => ({
2443 hasProvider: true,
2444 delayRef,
2445 initialDelayRef,
2446 currentIdRef,
2447 timeoutMs,
2448 currentContextRef,
2449 timeout
2450 }), [timeoutMs, timeout]),
2451 children
2452 });
2453 }
2454 function useDelayGroup(context, options = {
2455 open: false
2456 }) {
2457 const {
2458 open
2459 } = options;
2460 const store = "rootStore" in context ? context.rootStore : context;
2461 const floatingId = store.useState("floatingId");
2462 const groupContext = React13.useContext(FloatingDelayGroupContext);
2463 const {
2464 currentIdRef,
2465 delayRef,
2466 timeoutMs,
2467 initialDelayRef,
2468 currentContextRef,
2469 hasProvider,
2470 timeout
2471 } = groupContext;
2472 const [isInstantPhase, setIsInstantPhase] = React13.useState(false);
2473 const openRef = React13.useRef(open);
2474 const isUnmountedRef = React13.useRef(false);
2475 useIsoLayoutEffect(() => {
2476 openRef.current = open;
2477 }, [open]);
2478 useIsoLayoutEffect(() => {
2479 return () => {
2480 isUnmountedRef.current = true;
2481 };
2482 }, []);
2483 useIsoLayoutEffect(() => {
2484 function unset() {
2485 if (!isUnmountedRef.current) {
2486 setIsInstantPhase(false);
2487 }
2488 currentContextRef.current?.setIsInstantPhase(false);
2489 currentIdRef.current = null;
2490 currentContextRef.current = null;
2491 delayRef.current = initialDelayRef.current;
2492 timeout.clear();
2493 }
2494 if (!currentIdRef.current) {
2495 return void 0;
2496 }
2497 if (!open && currentIdRef.current === floatingId) {
2498 setIsInstantPhase(false);
2499 if (timeoutMs) {
2500 const closingId = floatingId;
2501 timeout.start(timeoutMs, () => {
2502 if (store.select("open") || currentIdRef.current && currentIdRef.current !== closingId) {
2503 return;
2504 }
2505 unset();
2506 });
2507 return () => {
2508 if (openRef.current || currentIdRef.current !== closingId) {
2509 timeout.clear();
2510 }
2511 };
2512 }
2513 unset();
2514 }
2515 return void 0;
2516 }, [open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeout, store]);
2517 useIsoLayoutEffect(() => {
2518 if (!open) {
2519 return;
2520 }
2521 const prevContext = currentContextRef.current;
2522 const prevId = currentIdRef.current;
2523 timeout.clear();
2524 currentContextRef.current = {
2525 onOpenChange: store.setOpen,
2526 setIsInstantPhase
2527 };
2528 currentIdRef.current = floatingId;
2529 delayRef.current = {
2530 open: 0,
2531 close: getDelay(initialDelayRef.current, "close")
2532 };
2533 if (prevId !== null && prevId !== floatingId) {
2534 setIsInstantPhase(true);
2535 prevContext?.setIsInstantPhase(true);
2536 prevContext?.onOpenChange(false, createChangeEventDetails(reason_parts_exports.none));
2537 } else {
2538 setIsInstantPhase(false);
2539 prevContext?.setIsInstantPhase(false);
2540 }
2541 }, [open, floatingId, store, currentIdRef, delayRef, initialDelayRef, currentContextRef, timeout]);
2542 useIsoLayoutEffect(() => {
2543 return () => {
2544 if (currentIdRef.current === floatingId) {
2545 currentContextRef.current = null;
2546 if (!openRef.current) {
2547 return;
2548 }
2549 currentIdRef.current = null;
2550 resetDelayRef(delayRef, initialDelayRef);
2551 timeout.clear();
2552 }
2553 };
2554 }, [currentContextRef, currentIdRef, delayRef, floatingId, initialDelayRef, timeout]);
2555 return React13.useMemo(() => ({
2556 hasProvider,
2557 delayRef,
2558 isInstantPhase
2559 }), [hasProvider, delayRef, isInstantPhase]);
2560 }
2561
2562 // node_modules/@base-ui/utils/mergeCleanups.mjs
2563 function mergeCleanups(...cleanups) {
2564 return () => {
2565 for (let i2 = 0; i2 < cleanups.length; i2 += 1) {
2566 const cleanup = cleanups[i2];
2567 if (cleanup) {
2568 cleanup();
2569 }
2570 }
2571 };
2572 }
2573
2574 // node_modules/@base-ui/react/utils/FocusGuard.mjs
2575 var React14 = __toESM(require_react(), 1);
2576
2577 // node_modules/@base-ui/utils/visuallyHidden.mjs
2578 var visuallyHiddenBase = {
2579 clipPath: "inset(50%)",
2580 overflow: "hidden",
2581 whiteSpace: "nowrap",
2582 border: 0,
2583 padding: 0,
2584 width: 1,
2585 height: 1,
2586 margin: -1
2587 };
2588 var visuallyHidden = {
2589 ...visuallyHiddenBase,
2590 position: "fixed",
2591 top: 0,
2592 left: 0
2593 };
2594 var visuallyHiddenInput = {
2595 ...visuallyHiddenBase,
2596 position: "absolute"
2597 };
2598
2599 // node_modules/@base-ui/react/utils/FocusGuard.mjs
2600 var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
2601 var FocusGuard = /* @__PURE__ */ React14.forwardRef(function FocusGuard2(props, ref) {
2602 const [role, setRole] = React14.useState();
2603 useIsoLayoutEffect(() => {
2604 if (parts_exports.screenReader.voiceOver && parts_exports.engine.webkit) {
2605 setRole("button");
2606 }
2607 }, []);
2608 const restProps = {
2609 tabIndex: 0,
2610 // Role is only for VoiceOver
2611 role
2612 };
2613 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {
2614 ...props,
2615 ref,
2616 style: visuallyHidden,
2617 "aria-hidden": role ? void 0 : true,
2618 ...restProps,
2619 "data-base-ui-focus-guard": ""
2620 });
2621 });
2622 if (true) FocusGuard.displayName = "FocusGuard";
2623
2624 // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
2625 var sides = ["top", "right", "bottom", "left"];
2626 var min = Math.min;
2627 var max = Math.max;
2628 var round = Math.round;
2629 var floor = Math.floor;
2630 var createCoords = (v2) => ({
2631 x: v2,
2632 y: v2
2633 });
2634 var oppositeSideMap = {
2635 left: "right",
2636 right: "left",
2637 bottom: "top",
2638 top: "bottom"
2639 };
2640 function clamp(start, value, end) {
2641 return max(start, min(value, end));
2642 }
2643 function evaluate(value, param) {
2644 return typeof value === "function" ? value(param) : value;
2645 }
2646 function getSide(placement) {
2647 return placement.split("-")[0];
2648 }
2649 function getAlignment(placement) {
2650 return placement.split("-")[1];
2651 }
2652 function getOppositeAxis(axis) {
2653 return axis === "x" ? "y" : "x";
2654 }
2655 function getAxisLength(axis) {
2656 return axis === "y" ? "height" : "width";
2657 }
2658 function getSideAxis(placement) {
2659 const firstChar = placement[0];
2660 return firstChar === "t" || firstChar === "b" ? "y" : "x";
2661 }
2662 function getAlignmentAxis(placement) {
2663 return getOppositeAxis(getSideAxis(placement));
2664 }
2665 function getAlignmentSides(placement, rects, rtl) {
2666 if (rtl === void 0) {
2667 rtl = false;
2668 }
2669 const alignment = getAlignment(placement);
2670 const alignmentAxis = getAlignmentAxis(placement);
2671 const length = getAxisLength(alignmentAxis);
2672 let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top";
2673 if (rects.reference[length] > rects.floating[length]) {
2674 mainAlignmentSide = getOppositePlacement(mainAlignmentSide);
2675 }
2676 return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];
2677 }
2678 function getExpandedPlacements(placement) {
2679 const oppositePlacement = getOppositePlacement(placement);
2680 return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];
2681 }
2682 function getOppositeAlignmentPlacement(placement) {
2683 return placement.includes("start") ? placement.replace("start", "end") : placement.replace("end", "start");
2684 }
2685 var lrPlacement = ["left", "right"];
2686 var rlPlacement = ["right", "left"];
2687 var tbPlacement = ["top", "bottom"];
2688 var btPlacement = ["bottom", "top"];
2689 function getSideList(side, isStart, rtl) {
2690 switch (side) {
2691 case "top":
2692 case "bottom":
2693 if (rtl) return isStart ? rlPlacement : lrPlacement;
2694 return isStart ? lrPlacement : rlPlacement;
2695 case "left":
2696 case "right":
2697 return isStart ? tbPlacement : btPlacement;
2698 default:
2699 return [];
2700 }
2701 }
2702 function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
2703 const alignment = getAlignment(placement);
2704 let list = getSideList(getSide(placement), direction === "start", rtl);
2705 if (alignment) {
2706 list = list.map((side) => side + "-" + alignment);
2707 if (flipAlignment) {
2708 list = list.concat(list.map(getOppositeAlignmentPlacement));
2709 }
2710 }
2711 return list;
2712 }
2713 function getOppositePlacement(placement) {
2714 const side = getSide(placement);
2715 return oppositeSideMap[side] + placement.slice(side.length);
2716 }
2717 function expandPaddingObject(padding) {
2718 return {
2719 top: 0,
2720 right: 0,
2721 bottom: 0,
2722 left: 0,
2723 ...padding
2724 };
2725 }
2726 function getPaddingObject(padding) {
2727 return typeof padding !== "number" ? expandPaddingObject(padding) : {
2728 top: padding,
2729 right: padding,
2730 bottom: padding,
2731 left: padding
2732 };
2733 }
2734 function rectToClientRect(rect) {
2735 const {
2736 x: x2,
2737 y: y2,
2738 width,
2739 height
2740 } = rect;
2741 return {
2742 width,
2743 height,
2744 top: y2,
2745 left: x2,
2746 right: x2 + width,
2747 bottom: y2 + height,
2748 x: x2,
2749 y: y2
2750 };
2751 }
2752
2753 // node_modules/@base-ui/react/floating-ui-react/utils/composite.mjs
2754 function isHiddenByStyles(styles) {
2755 return styles.visibility === "hidden" || styles.visibility === "collapse";
2756 }
2757 function isElementVisible(element, styles = element ? getComputedStyle2(element) : null) {
2758 if (!element || !element.isConnected || !styles || isHiddenByStyles(styles)) {
2759 return false;
2760 }
2761 if (typeof element.checkVisibility === "function") {
2762 return element.checkVisibility();
2763 }
2764 return styles.display !== "none" && styles.display !== "contents";
2765 }
2766
2767 // node_modules/@base-ui/react/floating-ui-react/utils/tabbable.mjs
2768 var CANDIDATE_SELECTOR = 'a[href],button,input,select,textarea,summary,details,iframe,object,embed,[tabindex],[contenteditable]:not([contenteditable="false"]),audio[controls],video[controls]';
2769 function getParentElement(element) {
2770 const assignedSlot = element.assignedSlot;
2771 if (assignedSlot) {
2772 return assignedSlot;
2773 }
2774 if (element.parentElement) {
2775 return element.parentElement;
2776 }
2777 const rootNode = element.getRootNode();
2778 return isShadowRoot(rootNode) ? rootNode.host : null;
2779 }
2780 function getDetailsSummary(details) {
2781 for (const child of Array.from(details.children)) {
2782 if (getNodeName(child) === "summary") {
2783 return child;
2784 }
2785 }
2786 return null;
2787 }
2788 function isWithinOpenDetailsSummary(element, details) {
2789 const summary = getDetailsSummary(details);
2790 return !!summary && (element === summary || contains(summary, element));
2791 }
2792 function isFocusableCandidate(element) {
2793 const nodeName = element ? getNodeName(element) : "";
2794 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");
2795 }
2796 function isFocusableElement(element) {
2797 if (!isFocusableCandidate(element) || !element.isConnected || element.matches(":disabled")) {
2798 return false;
2799 }
2800 for (let current = element; current; current = getParentElement(current)) {
2801 const isAncestor = current !== element;
2802 const isSlot = getNodeName(current) === "slot";
2803 if (current.hasAttribute("inert")) {
2804 return false;
2805 }
2806 if (isAncestor && getNodeName(current) === "details" && !current.open && !isWithinOpenDetailsSummary(element, current) || current.hasAttribute("hidden") || !isSlot && !isVisibleInTabbableTree(current, isAncestor)) {
2807 return false;
2808 }
2809 }
2810 return true;
2811 }
2812 function isVisibleInTabbableTree(element, isAncestor) {
2813 const styles = getComputedStyle2(element);
2814 if (!isAncestor) {
2815 return isElementVisible(element, styles);
2816 }
2817 return styles.display !== "none";
2818 }
2819 function getTabIndex(element) {
2820 const tabIndex = element.tabIndex;
2821 if (tabIndex < 0) {
2822 const nodeName = getNodeName(element);
2823 if (nodeName === "details" || nodeName === "audio" || nodeName === "video" || isHTMLElement(element) && element.isContentEditable) {
2824 return 0;
2825 }
2826 }
2827 return tabIndex;
2828 }
2829 function getNamedRadioInput(element) {
2830 if (getNodeName(element) !== "input") {
2831 return null;
2832 }
2833 const input = element;
2834 return input.type === "radio" && input.name !== "" ? input : null;
2835 }
2836 function isTabbableRadio(element, candidates) {
2837 const input = getNamedRadioInput(element);
2838 if (!input) {
2839 return true;
2840 }
2841 const checkedRadio = candidates.find((candidate) => {
2842 const radio = getNamedRadioInput(candidate);
2843 return radio?.name === input.name && radio.form === input.form && radio.checked;
2844 });
2845 if (checkedRadio) {
2846 return checkedRadio === input;
2847 }
2848 return candidates.find((candidate) => {
2849 const radio = getNamedRadioInput(candidate);
2850 return radio?.name === input.name && radio.form === input.form;
2851 }) === input;
2852 }
2853 function getComposedChildren(container) {
2854 if (isHTMLElement(container) && getNodeName(container) === "slot") {
2855 const assignedElements = container.assignedElements({
2856 flatten: true
2857 });
2858 if (assignedElements.length > 0) {
2859 return assignedElements;
2860 }
2861 }
2862 if (isHTMLElement(container) && container.shadowRoot) {
2863 return Array.from(container.shadowRoot.children);
2864 }
2865 return Array.from(container.children);
2866 }
2867 function appendCandidates(container, list) {
2868 getComposedChildren(container).forEach((child) => {
2869 if (isFocusableCandidate(child)) {
2870 list.push(child);
2871 }
2872 appendCandidates(child, list);
2873 });
2874 }
2875 function appendMatchingElements(container, selector2, list) {
2876 getComposedChildren(container).forEach((child) => {
2877 if (isHTMLElement(child) && child.matches(selector2)) {
2878 list.push(child);
2879 }
2880 appendMatchingElements(child, selector2, list);
2881 });
2882 }
2883 function focusable(container) {
2884 const candidates = [];
2885 appendCandidates(container, candidates);
2886 return candidates.filter(isFocusableElement);
2887 }
2888 function tabbable(container) {
2889 const candidates = focusable(container);
2890 return candidates.filter((element) => getTabIndex(element) >= 0 && isTabbableRadio(element, candidates));
2891 }
2892 function getTabbableIn(container, dir) {
2893 const list = tabbable(container);
2894 const len = list.length;
2895 if (len === 0) {
2896 return void 0;
2897 }
2898 const active = activeElement(ownerDocument(container));
2899 const index2 = list.indexOf(active);
2900 const nextIndex = index2 === -1 ? dir === 1 ? 0 : len - 1 : index2 + dir;
2901 return list[nextIndex];
2902 }
2903 function getNextTabbable(referenceElement) {
2904 return getTabbableIn(ownerDocument(referenceElement).body, 1) || referenceElement;
2905 }
2906 function getPreviousTabbable(referenceElement) {
2907 return getTabbableIn(ownerDocument(referenceElement).body, -1) || referenceElement;
2908 }
2909 function isOutsideEvent(event, container) {
2910 const containerElement = container || event.currentTarget;
2911 const relatedTarget = event.relatedTarget;
2912 return !relatedTarget || !contains(containerElement, relatedTarget);
2913 }
2914 function disableFocusInside(container) {
2915 const tabbableElements = tabbable(container);
2916 tabbableElements.forEach((element) => {
2917 element.dataset.tabindex = element.getAttribute("tabindex") || "";
2918 element.setAttribute("tabindex", "-1");
2919 });
2920 }
2921 function enableFocusInside(container) {
2922 const elements = [];
2923 appendMatchingElements(container, "[data-tabindex]", elements);
2924 elements.forEach((element) => {
2925 const tabindex = element.dataset.tabindex;
2926 delete element.dataset.tabindex;
2927 if (tabindex) {
2928 element.setAttribute("tabindex", tabindex);
2929 } else {
2930 element.removeAttribute("tabindex");
2931 }
2932 });
2933 }
2934
2935 // node_modules/@base-ui/react/floating-ui-react/utils/nodes.mjs
2936 function getNodeChildren(nodes, id, onlyOpenChildren = true) {
2937 const directChildren = nodes.filter((node) => node.parentId === id);
2938 return directChildren.flatMap((child) => [...!onlyOpenChildren || child.context?.open ? [child] : [], ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);
2939 }
2940
2941 // node_modules/@base-ui/react/floating-ui-react/utils/createAttribute.mjs
2942 function createAttribute(name) {
2943 return `data-base-ui-${name}`;
2944 }
2945
2946 // node_modules/@base-ui/react/floating-ui-react/components/FloatingPortal.mjs
2947 var React15 = __toESM(require_react(), 1);
2948 var ReactDOM2 = __toESM(require_react_dom(), 1);
2949
2950 // node_modules/@base-ui/react/internals/constants.mjs
2951 var DISABLED_TRANSITIONS_STYLE = {
2952 style: {
2953 transition: "none"
2954 }
2955 };
2956 var BASE_UI_SWIPE_IGNORE_ATTRIBUTE = "data-base-ui-swipe-ignore";
2957 var LEGACY_SWIPE_IGNORE_ATTRIBUTE = "data-swipe-ignore";
2958 var BASE_UI_SWIPE_IGNORE_SELECTOR = `[${BASE_UI_SWIPE_IGNORE_ATTRIBUTE}]`;
2959 var LEGACY_SWIPE_IGNORE_SELECTOR = `[${LEGACY_SWIPE_IGNORE_ATTRIBUTE}]`;
2960 var POPUP_COLLISION_AVOIDANCE = {
2961 fallbackAxisSide: "end"
2962 };
2963 var ownerVisuallyHidden = {
2964 clipPath: "inset(50%)",
2965 position: "fixed",
2966 top: 0,
2967 left: 0
2968 };
2969
2970 // node_modules/@base-ui/react/floating-ui-react/components/FloatingPortal.mjs
2971 var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
2972 var PortalContext = /* @__PURE__ */ React15.createContext(null);
2973 if (true) PortalContext.displayName = "PortalContext";
2974 var usePortalContext = () => React15.useContext(PortalContext);
2975 var attr = createAttribute("portal");
2976 function useFloatingPortalNode(props = {}) {
2977 const {
2978 ref,
2979 container: containerProp,
2980 componentProps = EMPTY_OBJECT,
2981 elementProps
2982 } = props;
2983 const uniqueId = useId();
2984 const portalContext = usePortalContext();
2985 const parentPortalNode = portalContext?.portalNode;
2986 const [containerElement, setContainerElement] = React15.useState(null);
2987 const [portalNode, setPortalNode] = React15.useState(null);
2988 const setPortalNodeRef = useStableCallback((node) => {
2989 if (node !== null) {
2990 setPortalNode(node);
2991 }
2992 });
2993 const containerRef = React15.useRef(null);
2994 useIsoLayoutEffect(() => {
2995 if (containerProp === null) {
2996 if (containerRef.current) {
2997 containerRef.current = null;
2998 setPortalNode(null);
2999 setContainerElement(null);
3000 }
3001 return;
3002 }
3003 if (uniqueId == null) {
3004 return;
3005 }
3006 const resolvedContainer = (containerProp && (isNode(containerProp) ? containerProp : containerProp.current)) ?? parentPortalNode ?? document.body;
3007 if (resolvedContainer == null) {
3008 if (containerRef.current) {
3009 containerRef.current = null;
3010 setPortalNode(null);
3011 setContainerElement(null);
3012 }
3013 return;
3014 }
3015 if (containerRef.current !== resolvedContainer) {
3016 containerRef.current = resolvedContainer;
3017 setPortalNode(null);
3018 setContainerElement(resolvedContainer);
3019 }
3020 }, [containerProp, parentPortalNode, uniqueId]);
3021 const portalElement = useRenderElement("div", componentProps, {
3022 ref: [ref, setPortalNodeRef],
3023 props: [{
3024 id: uniqueId,
3025 [attr]: ""
3026 }, elementProps]
3027 });
3028 const portalSubtree = containerElement && portalElement ? /* @__PURE__ */ ReactDOM2.createPortal(portalElement, containerElement) : null;
3029 return {
3030 portalNode,
3031 portalSubtree
3032 };
3033 }
3034 var FloatingPortal = /* @__PURE__ */ React15.forwardRef(function FloatingPortal2(componentProps, forwardedRef) {
3035 const {
3036 render: render4,
3037 className,
3038 style,
3039 children,
3040 container,
3041 renderGuards,
3042 ...elementProps
3043 } = componentProps;
3044 const {
3045 portalNode,
3046 portalSubtree
3047 } = useFloatingPortalNode({
3048 container,
3049 ref: forwardedRef,
3050 componentProps,
3051 elementProps
3052 });
3053 const beforeOutsideRef = React15.useRef(null);
3054 const afterOutsideRef = React15.useRef(null);
3055 const beforeInsideRef = React15.useRef(null);
3056 const afterInsideRef = React15.useRef(null);
3057 const [focusManagerState, setFocusManagerState] = React15.useState(null);
3058 const focusInsideDisabledRef = React15.useRef(false);
3059 const modal = focusManagerState?.modal;
3060 const open = focusManagerState?.open;
3061 const shouldRenderGuards = typeof renderGuards === "boolean" ? renderGuards : !!focusManagerState && !focusManagerState.modal && focusManagerState.open && !!portalNode;
3062 React15.useEffect(() => {
3063 if (!portalNode || modal) {
3064 return void 0;
3065 }
3066 function onFocus(event) {
3067 if (portalNode && event.relatedTarget && isOutsideEvent(event)) {
3068 if (event.type === "focusin") {
3069 if (focusInsideDisabledRef.current) {
3070 enableFocusInside(portalNode);
3071 focusInsideDisabledRef.current = false;
3072 }
3073 } else {
3074 disableFocusInside(portalNode);
3075 focusInsideDisabledRef.current = true;
3076 }
3077 }
3078 }
3079 return mergeCleanups(addEventListener(portalNode, "focusin", onFocus, true), addEventListener(portalNode, "focusout", onFocus, true));
3080 }, [portalNode, modal]);
3081 useIsoLayoutEffect(() => {
3082 if (!portalNode || open !== true || !focusInsideDisabledRef.current) {
3083 return;
3084 }
3085 enableFocusInside(portalNode);
3086 focusInsideDisabledRef.current = false;
3087 }, [open, portalNode]);
3088 const portalContextValue = React15.useMemo(() => ({
3089 beforeOutsideRef,
3090 afterOutsideRef,
3091 beforeInsideRef,
3092 afterInsideRef,
3093 portalNode,
3094 setFocusManagerState
3095 }), [portalNode]);
3096 return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(React15.Fragment, {
3097 children: [portalSubtree, /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(PortalContext.Provider, {
3098 value: portalContextValue,
3099 children: [shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(FocusGuard, {
3100 "data-type": "outside",
3101 ref: beforeOutsideRef,
3102 onFocus: (event) => {
3103 if (isOutsideEvent(event, portalNode)) {
3104 beforeInsideRef.current?.focus();
3105 } else {
3106 const domReference = focusManagerState ? focusManagerState.domReference : null;
3107 const prevTabbable = getPreviousTabbable(domReference);
3108 prevTabbable?.focus();
3109 }
3110 }
3111 }), shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", {
3112 "aria-owns": portalNode.id,
3113 style: ownerVisuallyHidden
3114 }), portalNode && /* @__PURE__ */ ReactDOM2.createPortal(children, portalNode), shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(FocusGuard, {
3115 "data-type": "outside",
3116 ref: afterOutsideRef,
3117 onFocus: (event) => {
3118 if (isOutsideEvent(event, portalNode)) {
3119 afterInsideRef.current?.focus();
3120 } else {
3121 const domReference = focusManagerState ? focusManagerState.domReference : null;
3122 const nextTabbable = getNextTabbable(domReference);
3123 nextTabbable?.focus();
3124 if (focusManagerState?.closeOnFocusOut) {
3125 focusManagerState?.onOpenChange(false, createChangeEventDetails(reason_parts_exports.focusOut, event.nativeEvent));
3126 }
3127 }
3128 }
3129 })]
3130 })]
3131 });
3132 });
3133 if (true) FloatingPortal.displayName = "FloatingPortal";
3134
3135 // node_modules/@base-ui/react/floating-ui-react/components/FloatingTree.mjs
3136 var React16 = __toESM(require_react(), 1);
3137
3138 // node_modules/@base-ui/react/floating-ui-react/utils/createEventEmitter.mjs
3139 function createEventEmitter() {
3140 const map = /* @__PURE__ */ new Map();
3141 return {
3142 emit(event, data) {
3143 map.get(event)?.forEach((listener) => listener(data));
3144 },
3145 on(event, listener) {
3146 if (!map.has(event)) {
3147 map.set(event, /* @__PURE__ */ new Set());
3148 }
3149 map.get(event).add(listener);
3150 },
3151 off(event, listener) {
3152 map.get(event)?.delete(listener);
3153 }
3154 };
3155 }
3156
3157 // node_modules/@base-ui/react/floating-ui-react/components/FloatingTree.mjs
3158 var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
3159 var FloatingNodeContext = /* @__PURE__ */ React16.createContext(null);
3160 if (true) FloatingNodeContext.displayName = "FloatingNodeContext";
3161 var FloatingTreeContext = /* @__PURE__ */ React16.createContext(null);
3162 if (true) FloatingTreeContext.displayName = "FloatingTreeContext";
3163 var useFloatingParentNodeId = () => React16.useContext(FloatingNodeContext)?.id || null;
3164 var useFloatingTree = (externalTree) => {
3165 const contextTree = React16.useContext(FloatingTreeContext);
3166 return externalTree ?? contextTree;
3167 };
3168
3169 // node_modules/@base-ui/react/floating-ui-react/hooks/useClientPoint.mjs
3170 var React17 = __toESM(require_react(), 1);
3171 function createVirtualElement(domElement, data) {
3172 let offsetX = null;
3173 let offsetY = null;
3174 let isAutoUpdateEvent = false;
3175 return {
3176 contextElement: domElement || void 0,
3177 getBoundingClientRect() {
3178 const domRect = domElement?.getBoundingClientRect() || {
3179 width: 0,
3180 height: 0,
3181 x: 0,
3182 y: 0
3183 };
3184 const isXAxis = data.axis === "x" || data.axis === "both";
3185 const isYAxis = data.axis === "y" || data.axis === "both";
3186 const canTrackCursorOnAutoUpdate = ["mouseenter", "mousemove"].includes(data.dataRef.current.openEvent?.type || "") && data.pointerType !== "touch";
3187 let width = domRect.width;
3188 let height = domRect.height;
3189 let x2 = domRect.x;
3190 let y2 = domRect.y;
3191 if (offsetX == null && data.x && isXAxis) {
3192 offsetX = domRect.x - data.x;
3193 }
3194 if (offsetY == null && data.y && isYAxis) {
3195 offsetY = domRect.y - data.y;
3196 }
3197 x2 -= offsetX || 0;
3198 y2 -= offsetY || 0;
3199 width = 0;
3200 height = 0;
3201 if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {
3202 width = data.axis === "y" ? domRect.width : 0;
3203 height = data.axis === "x" ? domRect.height : 0;
3204 x2 = isXAxis && data.x != null ? data.x : x2;
3205 y2 = isYAxis && data.y != null ? data.y : y2;
3206 } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {
3207 height = data.axis === "x" ? domRect.height : height;
3208 width = data.axis === "y" ? domRect.width : width;
3209 }
3210 isAutoUpdateEvent = true;
3211 return {
3212 width,
3213 height,
3214 x: x2,
3215 y: y2,
3216 top: y2,
3217 right: x2 + width,
3218 bottom: y2 + height,
3219 left: x2
3220 };
3221 }
3222 };
3223 }
3224 function isMouseBasedEvent(event) {
3225 return event != null && event.clientX != null;
3226 }
3227 function useClientPoint(context, props = {}) {
3228 const {
3229 enabled = true,
3230 axis = "both"
3231 } = props;
3232 const store = "rootStore" in context ? context.rootStore : context;
3233 const open = store.useState("open");
3234 const floating = store.useState("floatingElement");
3235 const domReference = store.useState("domReferenceElement");
3236 const dataRef = store.context.dataRef;
3237 const initialRef = React17.useRef(false);
3238 const cleanupListenerRef = React17.useRef(null);
3239 const [pointerType, setPointerType] = React17.useState();
3240 const [reactive, setReactive] = React17.useState([]);
3241 const resetReference = useStableCallback((reference2) => {
3242 store.set("positionReference", reference2);
3243 });
3244 const setReference = useStableCallback((newX, newY, referenceElement) => {
3245 if (initialRef.current) {
3246 return;
3247 }
3248 if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {
3249 return;
3250 }
3251 store.set("positionReference", createVirtualElement(referenceElement ?? domReference, {
3252 x: newX,
3253 y: newY,
3254 axis,
3255 dataRef,
3256 pointerType
3257 }));
3258 });
3259 const handleReferenceEnterOrMove = useStableCallback((event) => {
3260 if (!open) {
3261 setReference(event.clientX, event.clientY, event.currentTarget);
3262 } else if (!cleanupListenerRef.current) {
3263 setReference(event.clientX, event.clientY, event.currentTarget);
3264 setReactive([]);
3265 }
3266 });
3267 const openCheck = isMouseLikePointerType(pointerType) ? floating : open;
3268 React17.useEffect(() => {
3269 if (!enabled) {
3270 resetReference(domReference);
3271 return void 0;
3272 }
3273 if (!openCheck) {
3274 return void 0;
3275 }
3276 function cleanupListener() {
3277 cleanupListenerRef.current?.();
3278 cleanupListenerRef.current = null;
3279 }
3280 const win = getWindow(floating);
3281 function handleMouseMove(event) {
3282 const target = getTarget(event);
3283 if (!contains(floating, target)) {
3284 setReference(event.clientX, event.clientY);
3285 } else {
3286 cleanupListener();
3287 }
3288 }
3289 if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {
3290 cleanupListenerRef.current = addEventListener(win, "mousemove", handleMouseMove);
3291 } else {
3292 resetReference(domReference);
3293 }
3294 return cleanupListener;
3295 }, [openCheck, enabled, floating, dataRef, domReference, store, setReference, resetReference, reactive]);
3296 React17.useEffect(() => () => {
3297 store.set("positionReference", null);
3298 }, [store]);
3299 React17.useEffect(() => {
3300 if (enabled && !floating) {
3301 initialRef.current = false;
3302 }
3303 }, [enabled, floating]);
3304 React17.useEffect(() => {
3305 if (!enabled && open) {
3306 initialRef.current = true;
3307 }
3308 }, [enabled, open]);
3309 const reference = React17.useMemo(() => {
3310 function setPointerTypeRef(event) {
3311 setPointerType(event.pointerType);
3312 }
3313 return {
3314 onPointerDown: setPointerTypeRef,
3315 onPointerEnter: setPointerTypeRef,
3316 onMouseMove: handleReferenceEnterOrMove,
3317 onMouseEnter: handleReferenceEnterOrMove
3318 };
3319 }, [handleReferenceEnterOrMove]);
3320 return React17.useMemo(() => enabled ? {
3321 reference,
3322 trigger: reference
3323 } : {}, [enabled, reference]);
3324 }
3325
3326 // node_modules/@base-ui/react/floating-ui-react/hooks/useDismiss.mjs
3327 var React18 = __toESM(require_react(), 1);
3328 function alwaysFalse() {
3329 return false;
3330 }
3331 function normalizeProp(normalizable) {
3332 return {
3333 escapeKey: typeof normalizable === "boolean" ? normalizable : normalizable?.escapeKey ?? false,
3334 outsidePress: typeof normalizable === "boolean" ? normalizable : normalizable?.outsidePress ?? true
3335 };
3336 }
3337 function useDismiss(context, props = {}) {
3338 const {
3339 enabled = true,
3340 escapeKey: escapeKey2 = true,
3341 outsidePress: outsidePressProp = true,
3342 outsidePressEvent = "sloppy",
3343 referencePress = alwaysFalse,
3344 bubbles,
3345 externalTree
3346 } = props;
3347 const store = "rootStore" in context ? context.rootStore : context;
3348 const open = store.useState("open");
3349 const floatingElement = store.useState("floatingElement");
3350 const {
3351 dataRef
3352 } = store.context;
3353 const tree = useFloatingTree(externalTree);
3354 const outsidePressFn = useStableCallback(typeof outsidePressProp === "function" ? outsidePressProp : () => false);
3355 const outsidePress2 = typeof outsidePressProp === "function" ? outsidePressFn : outsidePressProp;
3356 const outsidePressEnabled = outsidePress2 !== false;
3357 const getOutsidePressEventProp = useStableCallback(() => outsidePressEvent);
3358 const {
3359 escapeKey: escapeKeyBubbles,
3360 outsidePress: outsidePressBubbles
3361 } = normalizeProp(bubbles);
3362 const pressStartedInsideRef = React18.useRef(false);
3363 const pressStartPreventedRef = React18.useRef(false);
3364 const suppressNextOutsideClickRef = React18.useRef(false);
3365 const isComposingRef = React18.useRef(false);
3366 const currentPointerTypeRef = React18.useRef("");
3367 const touchStateRef = React18.useRef(null);
3368 const cancelDismissOnEndTimeout = useTimeout();
3369 const clearInsideReactTreeTimeout = useTimeout();
3370 const clearInsideReactTree = useStableCallback(() => {
3371 clearInsideReactTreeTimeout.clear();
3372 dataRef.current.insideReactTree = false;
3373 });
3374 const hasBlockingChild = useStableCallback((bubbleKey) => {
3375 const nodeId = dataRef.current.floatingContext?.nodeId;
3376 const children = tree ? getNodeChildren(tree.nodesRef.current, nodeId) : [];
3377 return children.some((child) => child.context?.open && !child.context.dataRef.current[bubbleKey]);
3378 });
3379 const isEventWithinOwnElements = useStableCallback((event) => {
3380 return isEventTargetWithin(event, store.select("floatingElement")) || isEventTargetWithin(event, store.select("domReferenceElement"));
3381 });
3382 const closeOnReferencePress = useStableCallback((event) => {
3383 if (!referencePress()) {
3384 return;
3385 }
3386 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerPress, event.nativeEvent));
3387 });
3388 const closeOnEscapeKeyDown = useStableCallback((event) => {
3389 if (!open || !enabled || !escapeKey2 || event.key !== "Escape") {
3390 return;
3391 }
3392 if (isComposingRef.current) {
3393 return;
3394 }
3395 if (!escapeKeyBubbles && hasBlockingChild("__escapeKeyBubbles")) {
3396 return;
3397 }
3398 const native = isReactEvent(event) ? event.nativeEvent : event;
3399 const eventDetails = createChangeEventDetails(reason_parts_exports.escapeKey, native);
3400 store.setOpen(false, eventDetails);
3401 if (!eventDetails.isCanceled) {
3402 event.preventDefault();
3403 }
3404 if (!escapeKeyBubbles && !eventDetails.isPropagationAllowed) {
3405 event.stopPropagation();
3406 }
3407 });
3408 const markInsideReactTree = useStableCallback(() => {
3409 dataRef.current.insideReactTree = true;
3410 clearInsideReactTreeTimeout.start(0, clearInsideReactTree);
3411 });
3412 const markPressStartedInsideReactTree = useStableCallback((event) => {
3413 if (!open || !enabled || event.button !== 0) {
3414 return;
3415 }
3416 const target = getTarget(event.nativeEvent);
3417 if (!contains(store.select("floatingElement"), target)) {
3418 return;
3419 }
3420 if (!pressStartedInsideRef.current) {
3421 pressStartedInsideRef.current = true;
3422 pressStartPreventedRef.current = false;
3423 }
3424 });
3425 const markInsidePressStartPrevented = useStableCallback((event) => {
3426 if (!open || !enabled) {
3427 return;
3428 }
3429 if (!(event.defaultPrevented || event.nativeEvent.defaultPrevented)) {
3430 return;
3431 }
3432 if (pressStartedInsideRef.current) {
3433 pressStartPreventedRef.current = true;
3434 }
3435 });
3436 React18.useEffect(() => {
3437 if (!open || !enabled) {
3438 return void 0;
3439 }
3440 dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;
3441 dataRef.current.__outsidePressBubbles = outsidePressBubbles;
3442 const compositionTimeout = new Timeout();
3443 const preventedPressSuppressionTimeout = new Timeout();
3444 function handleCompositionStart() {
3445 compositionTimeout.clear();
3446 isComposingRef.current = true;
3447 }
3448 function handleCompositionEnd() {
3449 compositionTimeout.start(
3450 // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.
3451 // Only apply to WebKit for the test to remain 0ms.
3452 parts_exports.engine.webkit ? 5 : 0,
3453 () => {
3454 isComposingRef.current = false;
3455 }
3456 );
3457 }
3458 function suppressImmediateOutsideClickAfterPreventedStart() {
3459 suppressNextOutsideClickRef.current = true;
3460 preventedPressSuppressionTimeout.start(0, () => {
3461 suppressNextOutsideClickRef.current = false;
3462 });
3463 }
3464 function resetPressStartState() {
3465 pressStartedInsideRef.current = false;
3466 pressStartPreventedRef.current = false;
3467 }
3468 function getOutsidePressEvent() {
3469 const type = currentPointerTypeRef.current;
3470 const computedType = type === "pen" || !type ? "mouse" : type;
3471 const outsidePressEventValue = getOutsidePressEventProp();
3472 const resolved = typeof outsidePressEventValue === "function" ? outsidePressEventValue() : outsidePressEventValue;
3473 if (typeof resolved === "string") {
3474 return resolved;
3475 }
3476 return resolved[computedType];
3477 }
3478 function shouldIgnoreEvent(event) {
3479 const computedOutsidePressEvent = getOutsidePressEvent();
3480 return computedOutsidePressEvent === "intentional" && event.type !== "click" || computedOutsidePressEvent === "sloppy" && event.type === "click";
3481 }
3482 function isEventWithinFloatingTree(event) {
3483 const nodeId = dataRef.current.floatingContext?.nodeId;
3484 const targetIsInsideChildren = tree && getNodeChildren(tree.nodesRef.current, nodeId).some((node) => isEventTargetWithin(event, node.context?.elements.floating));
3485 return isEventWithinOwnElements(event) || targetIsInsideChildren;
3486 }
3487 function closeOnPressOutside(event) {
3488 if (shouldIgnoreEvent(event)) {
3489 if (event.type !== "click" && !isEventWithinOwnElements(event)) {
3490 preventedPressSuppressionTimeout.clear();
3491 suppressNextOutsideClickRef.current = false;
3492 }
3493 clearInsideReactTree();
3494 return;
3495 }
3496 if (dataRef.current.insideReactTree) {
3497 clearInsideReactTree();
3498 return;
3499 }
3500 const target = getTarget(event);
3501 const inertSelector = `[${createAttribute("inert")}]`;
3502 const targetRoot = isElement(target) ? target.getRootNode() : null;
3503 const markers = Array.from((isShadowRoot(targetRoot) ? targetRoot : ownerDocument(store.select("floatingElement"))).querySelectorAll(inertSelector));
3504 const triggers = store.context.triggerElements;
3505 if (target && (triggers.hasElement(target) || triggers.hasMatchingElement((trigger) => contains(trigger, target)))) {
3506 return;
3507 }
3508 let targetRootAncestor = isElement(target) ? target : null;
3509 while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {
3510 const nextParent = getParentNode(targetRootAncestor);
3511 if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {
3512 break;
3513 }
3514 targetRootAncestor = nextParent;
3515 }
3516 if (markers.length && isElement(target) && !isRootElement(target) && // Clicked on a direct ancestor (e.g. FloatingOverlay).
3517 !contains(target, store.select("floatingElement")) && // If the target root element contains none of the markers, then the
3518 // element was injected after the floating element rendered.
3519 markers.every((marker) => !contains(targetRootAncestor, marker))) {
3520 return;
3521 }
3522 if (isHTMLElement(target) && !("touches" in event)) {
3523 const lastTraversableNode = isLastTraversableNode(target);
3524 const style = getComputedStyle2(target);
3525 const scrollRe = /auto|scroll/;
3526 const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX);
3527 const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY);
3528 const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth;
3529 const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight;
3530 const isRTL7 = style.direction === "rtl";
3531 const pressedVerticalScrollbar = canScrollY && (isRTL7 ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth);
3532 const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight;
3533 if (pressedVerticalScrollbar || pressedHorizontalScrollbar) {
3534 return;
3535 }
3536 }
3537 if (isEventWithinFloatingTree(event)) {
3538 return;
3539 }
3540 if (getOutsidePressEvent() === "intentional" && suppressNextOutsideClickRef.current) {
3541 preventedPressSuppressionTimeout.clear();
3542 suppressNextOutsideClickRef.current = false;
3543 return;
3544 }
3545 if (typeof outsidePress2 === "function" && !outsidePress2(event)) {
3546 return;
3547 }
3548 if (hasBlockingChild("__outsidePressBubbles")) {
3549 return;
3550 }
3551 store.setOpen(false, createChangeEventDetails(reason_parts_exports.outsidePress, event));
3552 clearInsideReactTree();
3553 }
3554 function handlePointerDown(event) {
3555 if (getOutsidePressEvent() !== "sloppy" || event.pointerType === "touch" || !store.select("open") || !enabled || isEventWithinOwnElements(event)) {
3556 return;
3557 }
3558 closeOnPressOutside(event);
3559 }
3560 function handleTouchStart(event) {
3561 if (getOutsidePressEvent() !== "sloppy" || !store.select("open") || !enabled || isEventWithinOwnElements(event)) {
3562 return;
3563 }
3564 const touch = event.touches[0];
3565 if (touch) {
3566 touchStateRef.current = {
3567 startTime: Date.now(),
3568 startX: touch.clientX,
3569 startY: touch.clientY,
3570 dismissOnTouchEnd: false,
3571 dismissOnMouseDown: true
3572 };
3573 cancelDismissOnEndTimeout.start(1e3, () => {
3574 if (touchStateRef.current) {
3575 touchStateRef.current.dismissOnTouchEnd = false;
3576 touchStateRef.current.dismissOnMouseDown = false;
3577 }
3578 });
3579 }
3580 }
3581 function addTargetEventListenerOnce(event, listener) {
3582 const target = getTarget(event);
3583 if (!target) {
3584 return;
3585 }
3586 const unsubscribe2 = addEventListener(target, event.type, () => {
3587 listener(event);
3588 unsubscribe2();
3589 });
3590 }
3591 function handleTouchStartCapture(event) {
3592 currentPointerTypeRef.current = "touch";
3593 addTargetEventListenerOnce(event, handleTouchStart);
3594 }
3595 function closeOnPressOutsideCapture(event) {
3596 cancelDismissOnEndTimeout.clear();
3597 if (event.type === "pointerdown") {
3598 currentPointerTypeRef.current = event.pointerType;
3599 }
3600 if (event.type === "mousedown" && touchStateRef.current && !touchStateRef.current.dismissOnMouseDown) {
3601 return;
3602 }
3603 addTargetEventListenerOnce(event, (targetEvent) => {
3604 if (targetEvent.type === "pointerdown") {
3605 handlePointerDown(targetEvent);
3606 } else {
3607 closeOnPressOutside(targetEvent);
3608 }
3609 });
3610 }
3611 function handlePressEndCapture(event) {
3612 if (!pressStartedInsideRef.current) {
3613 return;
3614 }
3615 const pressStartedInsideDefaultPrevented = pressStartPreventedRef.current;
3616 resetPressStartState();
3617 if (getOutsidePressEvent() !== "intentional") {
3618 return;
3619 }
3620 if (event.type === "pointercancel") {
3621 if (pressStartedInsideDefaultPrevented) {
3622 suppressImmediateOutsideClickAfterPreventedStart();
3623 }
3624 return;
3625 }
3626 if (isEventWithinFloatingTree(event)) {
3627 return;
3628 }
3629 if (pressStartedInsideDefaultPrevented) {
3630 suppressImmediateOutsideClickAfterPreventedStart();
3631 return;
3632 }
3633 if (typeof outsidePress2 === "function" && !outsidePress2(event)) {
3634 return;
3635 }
3636 preventedPressSuppressionTimeout.clear();
3637 suppressNextOutsideClickRef.current = true;
3638 clearInsideReactTree();
3639 }
3640 function handleTouchMove(event) {
3641 if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) {
3642 return;
3643 }
3644 const touch = event.touches[0];
3645 if (!touch) {
3646 return;
3647 }
3648 const deltaX = Math.abs(touch.clientX - touchStateRef.current.startX);
3649 const deltaY = Math.abs(touch.clientY - touchStateRef.current.startY);
3650 const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
3651 if (distance > 5) {
3652 touchStateRef.current.dismissOnTouchEnd = true;
3653 }
3654 if (distance > 10) {
3655 closeOnPressOutside(event);
3656 cancelDismissOnEndTimeout.clear();
3657 touchStateRef.current = null;
3658 }
3659 }
3660 function handleTouchMoveCapture(event) {
3661 addTargetEventListenerOnce(event, handleTouchMove);
3662 }
3663 function handleTouchEnd(event) {
3664 if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) {
3665 return;
3666 }
3667 if (touchStateRef.current.dismissOnTouchEnd) {
3668 closeOnPressOutside(event);
3669 }
3670 cancelDismissOnEndTimeout.clear();
3671 touchStateRef.current = null;
3672 }
3673 function handleTouchEndCapture(event) {
3674 addTargetEventListenerOnce(event, handleTouchEnd);
3675 }
3676 const doc = ownerDocument(floatingElement);
3677 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)));
3678 return () => {
3679 unsubscribe();
3680 compositionTimeout.clear();
3681 preventedPressSuppressionTimeout.clear();
3682 resetPressStartState();
3683 suppressNextOutsideClickRef.current = false;
3684 };
3685 }, [dataRef, floatingElement, escapeKey2, outsidePressEnabled, outsidePress2, open, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, clearInsideReactTree, getOutsidePressEventProp, hasBlockingChild, isEventWithinOwnElements, tree, store, cancelDismissOnEndTimeout]);
3686 React18.useEffect(clearInsideReactTree, [outsidePress2, clearInsideReactTree]);
3687 const reference = React18.useMemo(() => ({
3688 onKeyDown: closeOnEscapeKeyDown,
3689 onPointerDown: closeOnReferencePress,
3690 onClick: closeOnReferencePress
3691 }), [closeOnEscapeKeyDown, closeOnReferencePress]);
3692 const floating = React18.useMemo(() => ({
3693 onKeyDown: closeOnEscapeKeyDown,
3694 // `onMouseDown` may be blocked if `event.preventDefault()` is called in
3695 // `onPointerDown`, such as with <NumberField.ScrubArea>.
3696 // See https://github.com/mui/base-ui/pull/3379
3697 onPointerDown: markInsidePressStartPrevented,
3698 onMouseDown: markInsidePressStartPrevented,
3699 onClickCapture: markInsideReactTree,
3700 onMouseDownCapture(event) {
3701 markInsideReactTree();
3702 markPressStartedInsideReactTree(event);
3703 },
3704 onPointerDownCapture(event) {
3705 markInsideReactTree();
3706 markPressStartedInsideReactTree(event);
3707 },
3708 onMouseUpCapture: markInsideReactTree,
3709 onTouchEndCapture: markInsideReactTree,
3710 onTouchMoveCapture: markInsideReactTree
3711 }), [closeOnEscapeKeyDown, markInsideReactTree, markPressStartedInsideReactTree, markInsidePressStartPrevented]);
3712 return React18.useMemo(() => enabled ? {
3713 reference,
3714 floating,
3715 trigger: reference
3716 } : {}, [enabled, reference, floating]);
3717 }
3718
3719 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloating.mjs
3720 var React25 = __toESM(require_react(), 1);
3721
3722 // node_modules/@floating-ui/core/dist/floating-ui.core.mjs
3723 function computeCoordsFromPlacement(_ref, placement, rtl) {
3724 let {
3725 reference,
3726 floating
3727 } = _ref;
3728 const sideAxis = getSideAxis(placement);
3729 const alignmentAxis = getAlignmentAxis(placement);
3730 const alignLength = getAxisLength(alignmentAxis);
3731 const side = getSide(placement);
3732 const isVertical = sideAxis === "y";
3733 const commonX = reference.x + reference.width / 2 - floating.width / 2;
3734 const commonY = reference.y + reference.height / 2 - floating.height / 2;
3735 const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;
3736 let coords;
3737 switch (side) {
3738 case "top":
3739 coords = {
3740 x: commonX,
3741 y: reference.y - floating.height
3742 };
3743 break;
3744 case "bottom":
3745 coords = {
3746 x: commonX,
3747 y: reference.y + reference.height
3748 };
3749 break;
3750 case "right":
3751 coords = {
3752 x: reference.x + reference.width,
3753 y: commonY
3754 };
3755 break;
3756 case "left":
3757 coords = {
3758 x: reference.x - floating.width,
3759 y: commonY
3760 };
3761 break;
3762 default:
3763 coords = {
3764 x: reference.x,
3765 y: reference.y
3766 };
3767 }
3768 switch (getAlignment(placement)) {
3769 case "start":
3770 coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);
3771 break;
3772 case "end":
3773 coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);
3774 break;
3775 }
3776 return coords;
3777 }
3778 async function detectOverflow(state, options) {
3779 var _await$platform$isEle;
3780 if (options === void 0) {
3781 options = {};
3782 }
3783 const {
3784 x: x2,
3785 y: y2,
3786 platform: platform3,
3787 rects,
3788 elements,
3789 strategy
3790 } = state;
3791 const {
3792 boundary = "clippingAncestors",
3793 rootBoundary = "viewport",
3794 elementContext = "floating",
3795 altBoundary = false,
3796 padding = 0
3797 } = evaluate(options, state);
3798 const paddingObject = getPaddingObject(padding);
3799 const altContext = elementContext === "floating" ? "reference" : "floating";
3800 const element = elements[altBoundary ? altContext : elementContext];
3801 const clippingClientRect = rectToClientRect(await platform3.getClippingRect({
3802 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)),
3803 boundary,
3804 rootBoundary,
3805 strategy
3806 }));
3807 const rect = elementContext === "floating" ? {
3808 x: x2,
3809 y: y2,
3810 width: rects.floating.width,
3811 height: rects.floating.height
3812 } : rects.reference;
3813 const offsetParent = await (platform3.getOffsetParent == null ? void 0 : platform3.getOffsetParent(elements.floating));
3814 const offsetScale = await (platform3.isElement == null ? void 0 : platform3.isElement(offsetParent)) ? await (platform3.getScale == null ? void 0 : platform3.getScale(offsetParent)) || {
3815 x: 1,
3816 y: 1
3817 } : {
3818 x: 1,
3819 y: 1
3820 };
3821 const elementClientRect = rectToClientRect(platform3.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform3.convertOffsetParentRelativeRectToViewportRelativeRect({
3822 elements,
3823 rect,
3824 offsetParent,
3825 strategy
3826 }) : rect);
3827 return {
3828 top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,
3829 bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,
3830 left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,
3831 right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x
3832 };
3833 }
3834 var MAX_RESET_COUNT = 50;
3835 var computePosition = async (reference, floating, config) => {
3836 const {
3837 placement = "bottom",
3838 strategy = "absolute",
3839 middleware = [],
3840 platform: platform3
3841 } = config;
3842 const platformWithDetectOverflow = platform3.detectOverflow ? platform3 : {
3843 ...platform3,
3844 detectOverflow
3845 };
3846 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(floating));
3847 let rects = await platform3.getElementRects({
3848 reference,
3849 floating,
3850 strategy
3851 });
3852 let {
3853 x: x2,
3854 y: y2
3855 } = computeCoordsFromPlacement(rects, placement, rtl);
3856 let statefulPlacement = placement;
3857 let resetCount = 0;
3858 const middlewareData = {};
3859 for (let i2 = 0; i2 < middleware.length; i2++) {
3860 const currentMiddleware = middleware[i2];
3861 if (!currentMiddleware) {
3862 continue;
3863 }
3864 const {
3865 name,
3866 fn
3867 } = currentMiddleware;
3868 const {
3869 x: nextX,
3870 y: nextY,
3871 data,
3872 reset
3873 } = await fn({
3874 x: x2,
3875 y: y2,
3876 initialPlacement: placement,
3877 placement: statefulPlacement,
3878 strategy,
3879 middlewareData,
3880 rects,
3881 platform: platformWithDetectOverflow,
3882 elements: {
3883 reference,
3884 floating
3885 }
3886 });
3887 x2 = nextX != null ? nextX : x2;
3888 y2 = nextY != null ? nextY : y2;
3889 middlewareData[name] = {
3890 ...middlewareData[name],
3891 ...data
3892 };
3893 if (reset && resetCount < MAX_RESET_COUNT) {
3894 resetCount++;
3895 if (typeof reset === "object") {
3896 if (reset.placement) {
3897 statefulPlacement = reset.placement;
3898 }
3899 if (reset.rects) {
3900 rects = reset.rects === true ? await platform3.getElementRects({
3901 reference,
3902 floating,
3903 strategy
3904 }) : reset.rects;
3905 }
3906 ({
3907 x: x2,
3908 y: y2
3909 } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));
3910 }
3911 i2 = -1;
3912 }
3913 }
3914 return {
3915 x: x2,
3916 y: y2,
3917 placement: statefulPlacement,
3918 strategy,
3919 middlewareData
3920 };
3921 };
3922 var flip = function(options) {
3923 if (options === void 0) {
3924 options = {};
3925 }
3926 return {
3927 name: "flip",
3928 options,
3929 async fn(state) {
3930 var _middlewareData$arrow, _middlewareData$flip;
3931 const {
3932 placement,
3933 middlewareData,
3934 rects,
3935 initialPlacement,
3936 platform: platform3,
3937 elements
3938 } = state;
3939 const {
3940 mainAxis: checkMainAxis = true,
3941 crossAxis: checkCrossAxis = true,
3942 fallbackPlacements: specifiedFallbackPlacements,
3943 fallbackStrategy = "bestFit",
3944 fallbackAxisSideDirection = "none",
3945 flipAlignment = true,
3946 ...detectOverflowOptions
3947 } = evaluate(options, state);
3948 if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
3949 return {};
3950 }
3951 const side = getSide(placement);
3952 const initialSideAxis = getSideAxis(initialPlacement);
3953 const isBasePlacement = getSide(initialPlacement) === initialPlacement;
3954 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating));
3955 const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));
3956 const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none";
3957 if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {
3958 fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));
3959 }
3960 const placements2 = [initialPlacement, ...fallbackPlacements];
3961 const overflow = await platform3.detectOverflow(state, detectOverflowOptions);
3962 const overflows = [];
3963 let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];
3964 if (checkMainAxis) {
3965 overflows.push(overflow[side]);
3966 }
3967 if (checkCrossAxis) {
3968 const sides2 = getAlignmentSides(placement, rects, rtl);
3969 overflows.push(overflow[sides2[0]], overflow[sides2[1]]);
3970 }
3971 overflowsData = [...overflowsData, {
3972 placement,
3973 overflows
3974 }];
3975 if (!overflows.every((side2) => side2 <= 0)) {
3976 var _middlewareData$flip2, _overflowsData$filter;
3977 const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;
3978 const nextPlacement = placements2[nextIndex];
3979 if (nextPlacement) {
3980 const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false;
3981 if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis
3982 // overflows the main axis.
3983 overflowsData.every((d2) => getSideAxis(d2.placement) === initialSideAxis ? d2.overflows[0] > 0 : true)) {
3984 return {
3985 data: {
3986 index: nextIndex,
3987 overflows: overflowsData
3988 },
3989 reset: {
3990 placement: nextPlacement
3991 }
3992 };
3993 }
3994 }
3995 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;
3996 if (!resetPlacement) {
3997 switch (fallbackStrategy) {
3998 case "bestFit": {
3999 var _overflowsData$filter2;
4000 const placement2 = (_overflowsData$filter2 = overflowsData.filter((d2) => {
4001 if (hasFallbackAxisSideDirection) {
4002 const currentSideAxis = getSideAxis(d2.placement);
4003 return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal
4004 // reading directions favoring greater width.
4005 currentSideAxis === "y";
4006 }
4007 return true;
4008 }).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];
4009 if (placement2) {
4010 resetPlacement = placement2;
4011 }
4012 break;
4013 }
4014 case "initialPlacement":
4015 resetPlacement = initialPlacement;
4016 break;
4017 }
4018 }
4019 if (placement !== resetPlacement) {
4020 return {
4021 reset: {
4022 placement: resetPlacement
4023 }
4024 };
4025 }
4026 }
4027 return {};
4028 }
4029 };
4030 };
4031 function getSideOffsets(overflow, rect) {
4032 return {
4033 top: overflow.top - rect.height,
4034 right: overflow.right - rect.width,
4035 bottom: overflow.bottom - rect.height,
4036 left: overflow.left - rect.width
4037 };
4038 }
4039 function isAnySideFullyClipped(overflow) {
4040 return sides.some((side) => overflow[side] >= 0);
4041 }
4042 var hide = function(options) {
4043 if (options === void 0) {
4044 options = {};
4045 }
4046 return {
4047 name: "hide",
4048 options,
4049 async fn(state) {
4050 const {
4051 rects,
4052 platform: platform3
4053 } = state;
4054 const {
4055 strategy = "referenceHidden",
4056 ...detectOverflowOptions
4057 } = evaluate(options, state);
4058 switch (strategy) {
4059 case "referenceHidden": {
4060 const overflow = await platform3.detectOverflow(state, {
4061 ...detectOverflowOptions,
4062 elementContext: "reference"
4063 });
4064 const offsets = getSideOffsets(overflow, rects.reference);
4065 return {
4066 data: {
4067 referenceHiddenOffsets: offsets,
4068 referenceHidden: isAnySideFullyClipped(offsets)
4069 }
4070 };
4071 }
4072 case "escaped": {
4073 const overflow = await platform3.detectOverflow(state, {
4074 ...detectOverflowOptions,
4075 altBoundary: true
4076 });
4077 const offsets = getSideOffsets(overflow, rects.floating);
4078 return {
4079 data: {
4080 escapedOffsets: offsets,
4081 escaped: isAnySideFullyClipped(offsets)
4082 }
4083 };
4084 }
4085 default: {
4086 return {};
4087 }
4088 }
4089 }
4090 };
4091 };
4092 var originSides = /* @__PURE__ */ new Set(["left", "top"]);
4093 async function convertValueToCoords(state, options) {
4094 const {
4095 placement,
4096 platform: platform3,
4097 elements
4098 } = state;
4099 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating));
4100 const side = getSide(placement);
4101 const alignment = getAlignment(placement);
4102 const isVertical = getSideAxis(placement) === "y";
4103 const mainAxisMulti = originSides.has(side) ? -1 : 1;
4104 const crossAxisMulti = rtl && isVertical ? -1 : 1;
4105 const rawValue = evaluate(options, state);
4106 let {
4107 mainAxis,
4108 crossAxis,
4109 alignmentAxis
4110 } = typeof rawValue === "number" ? {
4111 mainAxis: rawValue,
4112 crossAxis: 0,
4113 alignmentAxis: null
4114 } : {
4115 mainAxis: rawValue.mainAxis || 0,
4116 crossAxis: rawValue.crossAxis || 0,
4117 alignmentAxis: rawValue.alignmentAxis
4118 };
4119 if (alignment && typeof alignmentAxis === "number") {
4120 crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis;
4121 }
4122 return isVertical ? {
4123 x: crossAxis * crossAxisMulti,
4124 y: mainAxis * mainAxisMulti
4125 } : {
4126 x: mainAxis * mainAxisMulti,
4127 y: crossAxis * crossAxisMulti
4128 };
4129 }
4130 var offset = function(options) {
4131 if (options === void 0) {
4132 options = 0;
4133 }
4134 return {
4135 name: "offset",
4136 options,
4137 async fn(state) {
4138 var _middlewareData$offse, _middlewareData$arrow;
4139 const {
4140 x: x2,
4141 y: y2,
4142 placement,
4143 middlewareData
4144 } = state;
4145 const diffCoords = await convertValueToCoords(state, options);
4146 if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
4147 return {};
4148 }
4149 return {
4150 x: x2 + diffCoords.x,
4151 y: y2 + diffCoords.y,
4152 data: {
4153 ...diffCoords,
4154 placement
4155 }
4156 };
4157 }
4158 };
4159 };
4160 var shift = function(options) {
4161 if (options === void 0) {
4162 options = {};
4163 }
4164 return {
4165 name: "shift",
4166 options,
4167 async fn(state) {
4168 const {
4169 x: x2,
4170 y: y2,
4171 placement,
4172 platform: platform3
4173 } = state;
4174 const {
4175 mainAxis: checkMainAxis = true,
4176 crossAxis: checkCrossAxis = false,
4177 limiter = {
4178 fn: (_ref) => {
4179 let {
4180 x: x3,
4181 y: y3
4182 } = _ref;
4183 return {
4184 x: x3,
4185 y: y3
4186 };
4187 }
4188 },
4189 ...detectOverflowOptions
4190 } = evaluate(options, state);
4191 const coords = {
4192 x: x2,
4193 y: y2
4194 };
4195 const overflow = await platform3.detectOverflow(state, detectOverflowOptions);
4196 const crossAxis = getSideAxis(getSide(placement));
4197 const mainAxis = getOppositeAxis(crossAxis);
4198 let mainAxisCoord = coords[mainAxis];
4199 let crossAxisCoord = coords[crossAxis];
4200 if (checkMainAxis) {
4201 const minSide = mainAxis === "y" ? "top" : "left";
4202 const maxSide = mainAxis === "y" ? "bottom" : "right";
4203 const min2 = mainAxisCoord + overflow[minSide];
4204 const max2 = mainAxisCoord - overflow[maxSide];
4205 mainAxisCoord = clamp(min2, mainAxisCoord, max2);
4206 }
4207 if (checkCrossAxis) {
4208 const minSide = crossAxis === "y" ? "top" : "left";
4209 const maxSide = crossAxis === "y" ? "bottom" : "right";
4210 const min2 = crossAxisCoord + overflow[minSide];
4211 const max2 = crossAxisCoord - overflow[maxSide];
4212 crossAxisCoord = clamp(min2, crossAxisCoord, max2);
4213 }
4214 const limitedCoords = limiter.fn({
4215 ...state,
4216 [mainAxis]: mainAxisCoord,
4217 [crossAxis]: crossAxisCoord
4218 });
4219 return {
4220 ...limitedCoords,
4221 data: {
4222 x: limitedCoords.x - x2,
4223 y: limitedCoords.y - y2,
4224 enabled: {
4225 [mainAxis]: checkMainAxis,
4226 [crossAxis]: checkCrossAxis
4227 }
4228 }
4229 };
4230 }
4231 };
4232 };
4233 var limitShift = function(options) {
4234 if (options === void 0) {
4235 options = {};
4236 }
4237 return {
4238 options,
4239 fn(state) {
4240 const {
4241 x: x2,
4242 y: y2,
4243 placement,
4244 rects,
4245 middlewareData
4246 } = state;
4247 const {
4248 offset: offset4 = 0,
4249 mainAxis: checkMainAxis = true,
4250 crossAxis: checkCrossAxis = true
4251 } = evaluate(options, state);
4252 const coords = {
4253 x: x2,
4254 y: y2
4255 };
4256 const crossAxis = getSideAxis(placement);
4257 const mainAxis = getOppositeAxis(crossAxis);
4258 let mainAxisCoord = coords[mainAxis];
4259 let crossAxisCoord = coords[crossAxis];
4260 const rawOffset = evaluate(offset4, state);
4261 const computedOffset = typeof rawOffset === "number" ? {
4262 mainAxis: rawOffset,
4263 crossAxis: 0
4264 } : {
4265 mainAxis: 0,
4266 crossAxis: 0,
4267 ...rawOffset
4268 };
4269 if (checkMainAxis) {
4270 const len = mainAxis === "y" ? "height" : "width";
4271 const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;
4272 const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;
4273 if (mainAxisCoord < limitMin) {
4274 mainAxisCoord = limitMin;
4275 } else if (mainAxisCoord > limitMax) {
4276 mainAxisCoord = limitMax;
4277 }
4278 }
4279 if (checkCrossAxis) {
4280 var _middlewareData$offse, _middlewareData$offse2;
4281 const len = mainAxis === "y" ? "width" : "height";
4282 const isOriginSide = originSides.has(getSide(placement));
4283 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);
4284 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);
4285 if (crossAxisCoord < limitMin) {
4286 crossAxisCoord = limitMin;
4287 } else if (crossAxisCoord > limitMax) {
4288 crossAxisCoord = limitMax;
4289 }
4290 }
4291 return {
4292 [mainAxis]: mainAxisCoord,
4293 [crossAxis]: crossAxisCoord
4294 };
4295 }
4296 };
4297 };
4298 var size = function(options) {
4299 if (options === void 0) {
4300 options = {};
4301 }
4302 return {
4303 name: "size",
4304 options,
4305 async fn(state) {
4306 var _state$middlewareData, _state$middlewareData2;
4307 const {
4308 placement,
4309 rects,
4310 platform: platform3,
4311 elements
4312 } = state;
4313 const {
4314 apply = () => {
4315 },
4316 ...detectOverflowOptions
4317 } = evaluate(options, state);
4318 const overflow = await platform3.detectOverflow(state, detectOverflowOptions);
4319 const side = getSide(placement);
4320 const alignment = getAlignment(placement);
4321 const isYAxis = getSideAxis(placement) === "y";
4322 const {
4323 width,
4324 height
4325 } = rects.floating;
4326 let heightSide;
4327 let widthSide;
4328 if (side === "top" || side === "bottom") {
4329 heightSide = side;
4330 widthSide = alignment === (await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right";
4331 } else {
4332 widthSide = side;
4333 heightSide = alignment === "end" ? "top" : "bottom";
4334 }
4335 const maximumClippingHeight = height - overflow.top - overflow.bottom;
4336 const maximumClippingWidth = width - overflow.left - overflow.right;
4337 const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);
4338 const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);
4339 const noShift = !state.middlewareData.shift;
4340 let availableHeight = overflowAvailableHeight;
4341 let availableWidth = overflowAvailableWidth;
4342 if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {
4343 availableWidth = maximumClippingWidth;
4344 }
4345 if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {
4346 availableHeight = maximumClippingHeight;
4347 }
4348 if (noShift && !alignment) {
4349 const xMin = max(overflow.left, 0);
4350 const xMax = max(overflow.right, 0);
4351 const yMin = max(overflow.top, 0);
4352 const yMax = max(overflow.bottom, 0);
4353 if (isYAxis) {
4354 availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));
4355 } else {
4356 availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));
4357 }
4358 }
4359 await apply({
4360 ...state,
4361 availableWidth,
4362 availableHeight
4363 });
4364 const nextDimensions = await platform3.getDimensions(elements.floating);
4365 if (width !== nextDimensions.width || height !== nextDimensions.height) {
4366 return {
4367 reset: {
4368 rects: true
4369 }
4370 };
4371 }
4372 return {};
4373 }
4374 };
4375 };
4376
4377 // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
4378 function getCssDimensions(element) {
4379 const css = getComputedStyle2(element);
4380 let width = parseFloat(css.width) || 0;
4381 let height = parseFloat(css.height) || 0;
4382 const hasOffset = isHTMLElement(element);
4383 const offsetWidth = hasOffset ? element.offsetWidth : width;
4384 const offsetHeight = hasOffset ? element.offsetHeight : height;
4385 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
4386 if (shouldFallback) {
4387 width = offsetWidth;
4388 height = offsetHeight;
4389 }
4390 return {
4391 width,
4392 height,
4393 $: shouldFallback
4394 };
4395 }
4396 function unwrapElement(element) {
4397 return !isElement(element) ? element.contextElement : element;
4398 }
4399 function getScale(element) {
4400 const domElement = unwrapElement(element);
4401 if (!isHTMLElement(domElement)) {
4402 return createCoords(1);
4403 }
4404 const rect = domElement.getBoundingClientRect();
4405 const {
4406 width,
4407 height,
4408 $: $2
4409 } = getCssDimensions(domElement);
4410 let x2 = ($2 ? round(rect.width) : rect.width) / width;
4411 let y2 = ($2 ? round(rect.height) : rect.height) / height;
4412 if (!x2 || !Number.isFinite(x2)) {
4413 x2 = 1;
4414 }
4415 if (!y2 || !Number.isFinite(y2)) {
4416 y2 = 1;
4417 }
4418 return {
4419 x: x2,
4420 y: y2
4421 };
4422 }
4423 var noOffsets = /* @__PURE__ */ createCoords(0);
4424 function getVisualOffsets(element) {
4425 const win = getWindow(element);
4426 if (!isWebKit() || !win.visualViewport) {
4427 return noOffsets;
4428 }
4429 return {
4430 x: win.visualViewport.offsetLeft,
4431 y: win.visualViewport.offsetTop
4432 };
4433 }
4434 function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {
4435 if (isFixed === void 0) {
4436 isFixed = false;
4437 }
4438 if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {
4439 return false;
4440 }
4441 return isFixed;
4442 }
4443 function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {
4444 if (includeScale === void 0) {
4445 includeScale = false;
4446 }
4447 if (isFixedStrategy === void 0) {
4448 isFixedStrategy = false;
4449 }
4450 const clientRect = element.getBoundingClientRect();
4451 const domElement = unwrapElement(element);
4452 let scale = createCoords(1);
4453 if (includeScale) {
4454 if (offsetParent) {
4455 if (isElement(offsetParent)) {
4456 scale = getScale(offsetParent);
4457 }
4458 } else {
4459 scale = getScale(element);
4460 }
4461 }
4462 const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
4463 let x2 = (clientRect.left + visualOffsets.x) / scale.x;
4464 let y2 = (clientRect.top + visualOffsets.y) / scale.y;
4465 let width = clientRect.width / scale.x;
4466 let height = clientRect.height / scale.y;
4467 if (domElement) {
4468 const win = getWindow(domElement);
4469 const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
4470 let currentWin = win;
4471 let currentIFrame = getFrameElement(currentWin);
4472 while (currentIFrame && offsetParent && offsetWin !== currentWin) {
4473 const iframeScale = getScale(currentIFrame);
4474 const iframeRect = currentIFrame.getBoundingClientRect();
4475 const css = getComputedStyle2(currentIFrame);
4476 const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;
4477 const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;
4478 x2 *= iframeScale.x;
4479 y2 *= iframeScale.y;
4480 width *= iframeScale.x;
4481 height *= iframeScale.y;
4482 x2 += left;
4483 y2 += top;
4484 currentWin = getWindow(currentIFrame);
4485 currentIFrame = getFrameElement(currentWin);
4486 }
4487 }
4488 return rectToClientRect({
4489 width,
4490 height,
4491 x: x2,
4492 y: y2
4493 });
4494 }
4495 function getWindowScrollBarX(element, rect) {
4496 const leftScroll = getNodeScroll(element).scrollLeft;
4497 if (!rect) {
4498 return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;
4499 }
4500 return rect.left + leftScroll;
4501 }
4502 function getHTMLOffset(documentElement, scroll) {
4503 const htmlRect = documentElement.getBoundingClientRect();
4504 const x2 = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);
4505 const y2 = htmlRect.top + scroll.scrollTop;
4506 return {
4507 x: x2,
4508 y: y2
4509 };
4510 }
4511 function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
4512 let {
4513 elements,
4514 rect,
4515 offsetParent,
4516 strategy
4517 } = _ref;
4518 const isFixed = strategy === "fixed";
4519 const documentElement = getDocumentElement(offsetParent);
4520 const topLayer = elements ? isTopLayer(elements.floating) : false;
4521 if (offsetParent === documentElement || topLayer && isFixed) {
4522 return rect;
4523 }
4524 let scroll = {
4525 scrollLeft: 0,
4526 scrollTop: 0
4527 };
4528 let scale = createCoords(1);
4529 const offsets = createCoords(0);
4530 const isOffsetParentAnElement = isHTMLElement(offsetParent);
4531 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
4532 if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) {
4533 scroll = getNodeScroll(offsetParent);
4534 }
4535 if (isOffsetParentAnElement) {
4536 const offsetRect = getBoundingClientRect(offsetParent);
4537 scale = getScale(offsetParent);
4538 offsets.x = offsetRect.x + offsetParent.clientLeft;
4539 offsets.y = offsetRect.y + offsetParent.clientTop;
4540 }
4541 }
4542 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
4543 return {
4544 width: rect.width * scale.x,
4545 height: rect.height * scale.y,
4546 x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,
4547 y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y
4548 };
4549 }
4550 function getClientRects(element) {
4551 return Array.from(element.getClientRects());
4552 }
4553 function getDocumentRect(element) {
4554 const html = getDocumentElement(element);
4555 const scroll = getNodeScroll(element);
4556 const body = element.ownerDocument.body;
4557 const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);
4558 const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);
4559 let x2 = -scroll.scrollLeft + getWindowScrollBarX(element);
4560 const y2 = -scroll.scrollTop;
4561 if (getComputedStyle2(body).direction === "rtl") {
4562 x2 += max(html.clientWidth, body.clientWidth) - width;
4563 }
4564 return {
4565 width,
4566 height,
4567 x: x2,
4568 y: y2
4569 };
4570 }
4571 var SCROLLBAR_MAX = 25;
4572 function getViewportRect(element, strategy) {
4573 const win = getWindow(element);
4574 const html = getDocumentElement(element);
4575 const visualViewport = win.visualViewport;
4576 let width = html.clientWidth;
4577 let height = html.clientHeight;
4578 let x2 = 0;
4579 let y2 = 0;
4580 if (visualViewport) {
4581 width = visualViewport.width;
4582 height = visualViewport.height;
4583 const visualViewportBased = isWebKit();
4584 if (!visualViewportBased || visualViewportBased && strategy === "fixed") {
4585 x2 = visualViewport.offsetLeft;
4586 y2 = visualViewport.offsetTop;
4587 }
4588 }
4589 const windowScrollbarX = getWindowScrollBarX(html);
4590 if (windowScrollbarX <= 0) {
4591 const doc = html.ownerDocument;
4592 const body = doc.body;
4593 const bodyStyles = getComputedStyle(body);
4594 const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;
4595 const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);
4596 if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {
4597 width -= clippingStableScrollbarWidth;
4598 }
4599 } else if (windowScrollbarX <= SCROLLBAR_MAX) {
4600 width += windowScrollbarX;
4601 }
4602 return {
4603 width,
4604 height,
4605 x: x2,
4606 y: y2
4607 };
4608 }
4609 function getInnerBoundingClientRect(element, strategy) {
4610 const clientRect = getBoundingClientRect(element, true, strategy === "fixed");
4611 const top = clientRect.top + element.clientTop;
4612 const left = clientRect.left + element.clientLeft;
4613 const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);
4614 const width = element.clientWidth * scale.x;
4615 const height = element.clientHeight * scale.y;
4616 const x2 = left * scale.x;
4617 const y2 = top * scale.y;
4618 return {
4619 width,
4620 height,
4621 x: x2,
4622 y: y2
4623 };
4624 }
4625 function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {
4626 let rect;
4627 if (clippingAncestor === "viewport") {
4628 rect = getViewportRect(element, strategy);
4629 } else if (clippingAncestor === "document") {
4630 rect = getDocumentRect(getDocumentElement(element));
4631 } else if (isElement(clippingAncestor)) {
4632 rect = getInnerBoundingClientRect(clippingAncestor, strategy);
4633 } else {
4634 const visualOffsets = getVisualOffsets(element);
4635 rect = {
4636 x: clippingAncestor.x - visualOffsets.x,
4637 y: clippingAncestor.y - visualOffsets.y,
4638 width: clippingAncestor.width,
4639 height: clippingAncestor.height
4640 };
4641 }
4642 return rectToClientRect(rect);
4643 }
4644 function hasFixedPositionAncestor(element, stopNode) {
4645 const parentNode = getParentNode(element);
4646 if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {
4647 return false;
4648 }
4649 return getComputedStyle2(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode);
4650 }
4651 function getClippingElementAncestors(element, cache) {
4652 const cachedResult = cache.get(element);
4653 if (cachedResult) {
4654 return cachedResult;
4655 }
4656 let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body");
4657 let currentContainingBlockComputedStyle = null;
4658 const elementIsFixed = getComputedStyle2(element).position === "fixed";
4659 let currentNode = elementIsFixed ? getParentNode(element) : element;
4660 while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {
4661 const computedStyle = getComputedStyle2(currentNode);
4662 const currentNodeIsContaining = isContainingBlock(currentNode);
4663 if (!currentNodeIsContaining && computedStyle.position === "fixed") {
4664 currentContainingBlockComputedStyle = null;
4665 }
4666 const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === "absolute" || currentContainingBlockComputedStyle.position === "fixed") || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);
4667 if (shouldDropCurrentNode) {
4668 result = result.filter((ancestor) => ancestor !== currentNode);
4669 } else {
4670 currentContainingBlockComputedStyle = computedStyle;
4671 }
4672 currentNode = getParentNode(currentNode);
4673 }
4674 cache.set(element, result);
4675 return result;
4676 }
4677 function getClippingRect(_ref) {
4678 let {
4679 element,
4680 boundary,
4681 rootBoundary,
4682 strategy
4683 } = _ref;
4684 const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);
4685 const clippingAncestors = [...elementClippingAncestors, rootBoundary];
4686 const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);
4687 let top = firstRect.top;
4688 let right = firstRect.right;
4689 let bottom = firstRect.bottom;
4690 let left = firstRect.left;
4691 for (let i2 = 1; i2 < clippingAncestors.length; i2++) {
4692 const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i2], strategy);
4693 top = max(rect.top, top);
4694 right = min(rect.right, right);
4695 bottom = min(rect.bottom, bottom);
4696 left = max(rect.left, left);
4697 }
4698 return {
4699 width: right - left,
4700 height: bottom - top,
4701 x: left,
4702 y: top
4703 };
4704 }
4705 function getDimensions(element) {
4706 const {
4707 width,
4708 height
4709 } = getCssDimensions(element);
4710 return {
4711 width,
4712 height
4713 };
4714 }
4715 function getRectRelativeToOffsetParent(element, offsetParent, strategy) {
4716 const isOffsetParentAnElement = isHTMLElement(offsetParent);
4717 const documentElement = getDocumentElement(offsetParent);
4718 const isFixed = strategy === "fixed";
4719 const rect = getBoundingClientRect(element, true, isFixed, offsetParent);
4720 let scroll = {
4721 scrollLeft: 0,
4722 scrollTop: 0
4723 };
4724 const offsets = createCoords(0);
4725 function setLeftRTLScrollbarOffset() {
4726 offsets.x = getWindowScrollBarX(documentElement);
4727 }
4728 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
4729 if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) {
4730 scroll = getNodeScroll(offsetParent);
4731 }
4732 if (isOffsetParentAnElement) {
4733 const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);
4734 offsets.x = offsetRect.x + offsetParent.clientLeft;
4735 offsets.y = offsetRect.y + offsetParent.clientTop;
4736 } else if (documentElement) {
4737 setLeftRTLScrollbarOffset();
4738 }
4739 }
4740 if (isFixed && !isOffsetParentAnElement && documentElement) {
4741 setLeftRTLScrollbarOffset();
4742 }
4743 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
4744 const x2 = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;
4745 const y2 = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;
4746 return {
4747 x: x2,
4748 y: y2,
4749 width: rect.width,
4750 height: rect.height
4751 };
4752 }
4753 function isStaticPositioned(element) {
4754 return getComputedStyle2(element).position === "static";
4755 }
4756 function getTrueOffsetParent(element, polyfill) {
4757 if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") {
4758 return null;
4759 }
4760 if (polyfill) {
4761 return polyfill(element);
4762 }
4763 let rawOffsetParent = element.offsetParent;
4764 if (getDocumentElement(element) === rawOffsetParent) {
4765 rawOffsetParent = rawOffsetParent.ownerDocument.body;
4766 }
4767 return rawOffsetParent;
4768 }
4769 function getOffsetParent(element, polyfill) {
4770 const win = getWindow(element);
4771 if (isTopLayer(element)) {
4772 return win;
4773 }
4774 if (!isHTMLElement(element)) {
4775 let svgOffsetParent = getParentNode(element);
4776 while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {
4777 if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {
4778 return svgOffsetParent;
4779 }
4780 svgOffsetParent = getParentNode(svgOffsetParent);
4781 }
4782 return win;
4783 }
4784 let offsetParent = getTrueOffsetParent(element, polyfill);
4785 while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {
4786 offsetParent = getTrueOffsetParent(offsetParent, polyfill);
4787 }
4788 if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {
4789 return win;
4790 }
4791 return offsetParent || getContainingBlock(element) || win;
4792 }
4793 var getElementRects = async function(data) {
4794 const getOffsetParentFn = this.getOffsetParent || getOffsetParent;
4795 const getDimensionsFn = this.getDimensions;
4796 const floatingDimensions = await getDimensionsFn(data.floating);
4797 return {
4798 reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),
4799 floating: {
4800 x: 0,
4801 y: 0,
4802 width: floatingDimensions.width,
4803 height: floatingDimensions.height
4804 }
4805 };
4806 };
4807 function isRTL(element) {
4808 return getComputedStyle2(element).direction === "rtl";
4809 }
4810 var platform2 = {
4811 convertOffsetParentRelativeRectToViewportRelativeRect,
4812 getDocumentElement,
4813 getClippingRect,
4814 getOffsetParent,
4815 getElementRects,
4816 getClientRects,
4817 getDimensions,
4818 getScale,
4819 isElement,
4820 isRTL
4821 };
4822 function rectsAreEqual(a2, b2) {
4823 return a2.x === b2.x && a2.y === b2.y && a2.width === b2.width && a2.height === b2.height;
4824 }
4825 function observeMove(element, onMove) {
4826 let io = null;
4827 let timeoutId;
4828 const root = getDocumentElement(element);
4829 function cleanup() {
4830 var _io;
4831 clearTimeout(timeoutId);
4832 (_io = io) == null || _io.disconnect();
4833 io = null;
4834 }
4835 function refresh(skip, threshold) {
4836 if (skip === void 0) {
4837 skip = false;
4838 }
4839 if (threshold === void 0) {
4840 threshold = 1;
4841 }
4842 cleanup();
4843 const elementRectForRootMargin = element.getBoundingClientRect();
4844 const {
4845 left,
4846 top,
4847 width,
4848 height
4849 } = elementRectForRootMargin;
4850 if (!skip) {
4851 onMove();
4852 }
4853 if (!width || !height) {
4854 return;
4855 }
4856 const insetTop = floor(top);
4857 const insetRight = floor(root.clientWidth - (left + width));
4858 const insetBottom = floor(root.clientHeight - (top + height));
4859 const insetLeft = floor(left);
4860 const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px";
4861 const options = {
4862 rootMargin,
4863 threshold: max(0, min(1, threshold)) || 1
4864 };
4865 let isFirstUpdate = true;
4866 function handleObserve(entries) {
4867 const ratio = entries[0].intersectionRatio;
4868 if (ratio !== threshold) {
4869 if (!isFirstUpdate) {
4870 return refresh();
4871 }
4872 if (!ratio) {
4873 timeoutId = setTimeout(() => {
4874 refresh(false, 1e-7);
4875 }, 1e3);
4876 } else {
4877 refresh(false, ratio);
4878 }
4879 }
4880 if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {
4881 refresh();
4882 }
4883 isFirstUpdate = false;
4884 }
4885 try {
4886 io = new IntersectionObserver(handleObserve, {
4887 ...options,
4888 // Handle <iframe>s
4889 root: root.ownerDocument
4890 });
4891 } catch (_e) {
4892 io = new IntersectionObserver(handleObserve, options);
4893 }
4894 io.observe(element);
4895 }
4896 refresh(true);
4897 return cleanup;
4898 }
4899 function autoUpdate(reference, floating, update2, options) {
4900 if (options === void 0) {
4901 options = {};
4902 }
4903 const {
4904 ancestorScroll = true,
4905 ancestorResize = true,
4906 elementResize = typeof ResizeObserver === "function",
4907 layoutShift = typeof IntersectionObserver === "function",
4908 animationFrame = false
4909 } = options;
4910 const referenceEl = unwrapElement(reference);
4911 const ancestors = ancestorScroll || ancestorResize ? [...referenceEl ? getOverflowAncestors(referenceEl) : [], ...floating ? getOverflowAncestors(floating) : []] : [];
4912 ancestors.forEach((ancestor) => {
4913 ancestorScroll && ancestor.addEventListener("scroll", update2, {
4914 passive: true
4915 });
4916 ancestorResize && ancestor.addEventListener("resize", update2);
4917 });
4918 const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update2) : null;
4919 let reobserveFrame = -1;
4920 let resizeObserver = null;
4921 if (elementResize) {
4922 resizeObserver = new ResizeObserver((_ref) => {
4923 let [firstEntry] = _ref;
4924 if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {
4925 resizeObserver.unobserve(floating);
4926 cancelAnimationFrame(reobserveFrame);
4927 reobserveFrame = requestAnimationFrame(() => {
4928 var _resizeObserver;
4929 (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);
4930 });
4931 }
4932 update2();
4933 });
4934 if (referenceEl && !animationFrame) {
4935 resizeObserver.observe(referenceEl);
4936 }
4937 if (floating) {
4938 resizeObserver.observe(floating);
4939 }
4940 }
4941 let frameId;
4942 let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;
4943 if (animationFrame) {
4944 frameLoop();
4945 }
4946 function frameLoop() {
4947 const nextRefRect = getBoundingClientRect(reference);
4948 if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {
4949 update2();
4950 }
4951 prevRefRect = nextRefRect;
4952 frameId = requestAnimationFrame(frameLoop);
4953 }
4954 update2();
4955 return () => {
4956 var _resizeObserver2;
4957 ancestors.forEach((ancestor) => {
4958 ancestorScroll && ancestor.removeEventListener("scroll", update2);
4959 ancestorResize && ancestor.removeEventListener("resize", update2);
4960 });
4961 cleanupIo == null || cleanupIo();
4962 (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();
4963 resizeObserver = null;
4964 if (animationFrame) {
4965 cancelAnimationFrame(frameId);
4966 }
4967 };
4968 }
4969 var offset2 = offset;
4970 var shift2 = shift;
4971 var flip2 = flip;
4972 var size2 = size;
4973 var hide2 = hide;
4974 var limitShift2 = limitShift;
4975 var computePosition2 = (reference, floating, options) => {
4976 const cache = /* @__PURE__ */ new Map();
4977 const mergedOptions = {
4978 platform: platform2,
4979 ...options
4980 };
4981 const platformWithCache = {
4982 ...mergedOptions.platform,
4983 _c: cache
4984 };
4985 return computePosition(reference, floating, {
4986 ...mergedOptions,
4987 platform: platformWithCache
4988 });
4989 };
4990
4991 // node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs
4992 var React19 = __toESM(require_react(), 1);
4993 var import_react2 = __toESM(require_react(), 1);
4994 var ReactDOM3 = __toESM(require_react_dom(), 1);
4995 var isClient = typeof document !== "undefined";
4996 var noop2 = function noop3() {
4997 };
4998 var index = isClient ? import_react2.useLayoutEffect : noop2;
4999 function deepEqual(a2, b2) {
5000 if (a2 === b2) {
5001 return true;
5002 }
5003 if (typeof a2 !== typeof b2) {
5004 return false;
5005 }
5006 if (typeof a2 === "function" && a2.toString() === b2.toString()) {
5007 return true;
5008 }
5009 let length;
5010 let i2;
5011 let keys;
5012 if (a2 && b2 && typeof a2 === "object") {
5013 if (Array.isArray(a2)) {
5014 length = a2.length;
5015 if (length !== b2.length) return false;
5016 for (i2 = length; i2-- !== 0; ) {
5017 if (!deepEqual(a2[i2], b2[i2])) {
5018 return false;
5019 }
5020 }
5021 return true;
5022 }
5023 keys = Object.keys(a2);
5024 length = keys.length;
5025 if (length !== Object.keys(b2).length) {
5026 return false;
5027 }
5028 for (i2 = length; i2-- !== 0; ) {
5029 if (!{}.hasOwnProperty.call(b2, keys[i2])) {
5030 return false;
5031 }
5032 }
5033 for (i2 = length; i2-- !== 0; ) {
5034 const key = keys[i2];
5035 if (key === "_owner" && a2.$$typeof) {
5036 continue;
5037 }
5038 if (!deepEqual(a2[key], b2[key])) {
5039 return false;
5040 }
5041 }
5042 return true;
5043 }
5044 return a2 !== a2 && b2 !== b2;
5045 }
5046 function getDPR(element) {
5047 if (typeof window === "undefined") {
5048 return 1;
5049 }
5050 const win = element.ownerDocument.defaultView || window;
5051 return win.devicePixelRatio || 1;
5052 }
5053 function roundByDPR(element, value) {
5054 const dpr = getDPR(element);
5055 return Math.round(value * dpr) / dpr;
5056 }
5057 function useLatestRef(value) {
5058 const ref = React19.useRef(value);
5059 index(() => {
5060 ref.current = value;
5061 });
5062 return ref;
5063 }
5064 function useFloating(options) {
5065 if (options === void 0) {
5066 options = {};
5067 }
5068 const {
5069 placement = "bottom",
5070 strategy = "absolute",
5071 middleware = [],
5072 platform: platform3,
5073 elements: {
5074 reference: externalReference,
5075 floating: externalFloating
5076 } = {},
5077 transform = true,
5078 whileElementsMounted,
5079 open
5080 } = options;
5081 const [data, setData] = React19.useState({
5082 x: 0,
5083 y: 0,
5084 strategy,
5085 placement,
5086 middlewareData: {},
5087 isPositioned: false
5088 });
5089 const [latestMiddleware, setLatestMiddleware] = React19.useState(middleware);
5090 if (!deepEqual(latestMiddleware, middleware)) {
5091 setLatestMiddleware(middleware);
5092 }
5093 const [_reference, _setReference] = React19.useState(null);
5094 const [_floating, _setFloating] = React19.useState(null);
5095 const setReference = React19.useCallback((node) => {
5096 if (node !== referenceRef.current) {
5097 referenceRef.current = node;
5098 _setReference(node);
5099 }
5100 }, []);
5101 const setFloating = React19.useCallback((node) => {
5102 if (node !== floatingRef.current) {
5103 floatingRef.current = node;
5104 _setFloating(node);
5105 }
5106 }, []);
5107 const referenceEl = externalReference || _reference;
5108 const floatingEl = externalFloating || _floating;
5109 const referenceRef = React19.useRef(null);
5110 const floatingRef = React19.useRef(null);
5111 const dataRef = React19.useRef(data);
5112 const hasWhileElementsMounted = whileElementsMounted != null;
5113 const whileElementsMountedRef = useLatestRef(whileElementsMounted);
5114 const platformRef = useLatestRef(platform3);
5115 const openRef = useLatestRef(open);
5116 const update2 = React19.useCallback(() => {
5117 if (!referenceRef.current || !floatingRef.current) {
5118 return;
5119 }
5120 const config = {
5121 placement,
5122 strategy,
5123 middleware: latestMiddleware
5124 };
5125 if (platformRef.current) {
5126 config.platform = platformRef.current;
5127 }
5128 computePosition2(referenceRef.current, floatingRef.current, config).then((data2) => {
5129 const fullData = {
5130 ...data2,
5131 // The floating element's position may be recomputed while it's closed
5132 // but still mounted (such as when transitioning out). To ensure
5133 // `isPositioned` will be `false` initially on the next open, avoid
5134 // setting it to `true` when `open === false` (must be specified).
5135 isPositioned: openRef.current !== false
5136 };
5137 if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {
5138 dataRef.current = fullData;
5139 ReactDOM3.flushSync(() => {
5140 setData(fullData);
5141 });
5142 }
5143 });
5144 }, [latestMiddleware, placement, strategy, platformRef, openRef]);
5145 index(() => {
5146 if (open === false && dataRef.current.isPositioned) {
5147 dataRef.current.isPositioned = false;
5148 setData((data2) => ({
5149 ...data2,
5150 isPositioned: false
5151 }));
5152 }
5153 }, [open]);
5154 const isMountedRef = React19.useRef(false);
5155 index(() => {
5156 isMountedRef.current = true;
5157 return () => {
5158 isMountedRef.current = false;
5159 };
5160 }, []);
5161 index(() => {
5162 if (referenceEl) referenceRef.current = referenceEl;
5163 if (floatingEl) floatingRef.current = floatingEl;
5164 if (referenceEl && floatingEl) {
5165 if (whileElementsMountedRef.current) {
5166 return whileElementsMountedRef.current(referenceEl, floatingEl, update2);
5167 }
5168 update2();
5169 }
5170 }, [referenceEl, floatingEl, update2, whileElementsMountedRef, hasWhileElementsMounted]);
5171 const refs = React19.useMemo(() => ({
5172 reference: referenceRef,
5173 floating: floatingRef,
5174 setReference,
5175 setFloating
5176 }), [setReference, setFloating]);
5177 const elements = React19.useMemo(() => ({
5178 reference: referenceEl,
5179 floating: floatingEl
5180 }), [referenceEl, floatingEl]);
5181 const floatingStyles = React19.useMemo(() => {
5182 const initialStyles = {
5183 position: strategy,
5184 left: 0,
5185 top: 0
5186 };
5187 if (!elements.floating) {
5188 return initialStyles;
5189 }
5190 const x2 = roundByDPR(elements.floating, data.x);
5191 const y2 = roundByDPR(elements.floating, data.y);
5192 if (transform) {
5193 return {
5194 ...initialStyles,
5195 transform: "translate(" + x2 + "px, " + y2 + "px)",
5196 ...getDPR(elements.floating) >= 1.5 && {
5197 willChange: "transform"
5198 }
5199 };
5200 }
5201 return {
5202 position: strategy,
5203 left: x2,
5204 top: y2
5205 };
5206 }, [strategy, transform, elements.floating, data.x, data.y]);
5207 return React19.useMemo(() => ({
5208 ...data,
5209 update: update2,
5210 refs,
5211 elements,
5212 floatingStyles
5213 }), [data, update2, refs, elements, floatingStyles]);
5214 }
5215 var offset3 = (options, deps) => {
5216 const result = offset2(options);
5217 return {
5218 name: result.name,
5219 fn: result.fn,
5220 options: [options, deps]
5221 };
5222 };
5223 var shift3 = (options, deps) => {
5224 const result = shift2(options);
5225 return {
5226 name: result.name,
5227 fn: result.fn,
5228 options: [options, deps]
5229 };
5230 };
5231 var limitShift3 = (options, deps) => {
5232 const result = limitShift2(options);
5233 return {
5234 fn: result.fn,
5235 options: [options, deps]
5236 };
5237 };
5238 var flip3 = (options, deps) => {
5239 const result = flip2(options);
5240 return {
5241 name: result.name,
5242 fn: result.fn,
5243 options: [options, deps]
5244 };
5245 };
5246 var size3 = (options, deps) => {
5247 const result = size2(options);
5248 return {
5249 name: result.name,
5250 fn: result.fn,
5251 options: [options, deps]
5252 };
5253 };
5254 var hide3 = (options, deps) => {
5255 const result = hide2(options);
5256 return {
5257 name: result.name,
5258 fn: result.fn,
5259 options: [options, deps]
5260 };
5261 };
5262
5263 // node_modules/@base-ui/react/utils/popups/popupStoreUtils.mjs
5264 var React24 = __toESM(require_react(), 1);
5265 var ReactDOM4 = __toESM(require_react_dom(), 1);
5266
5267 // node_modules/@base-ui/react/floating-ui-react/hooks/useSyncedFloatingRootContext.mjs
5268 var React23 = __toESM(require_react(), 1);
5269
5270 // node_modules/@base-ui/utils/store/createSelector.mjs
5271 var createSelector = (a2, b2, c2, d2, e2, f2, ...other) => {
5272 if (other.length > 0) {
5273 throw new Error(true ? "Unsupported number of selectors" : formatErrorMessage_default(1));
5274 }
5275 let selector2;
5276 if (a2 && b2 && c2 && d2 && e2 && f2) {
5277 selector2 = (state, a1, a22, a3) => {
5278 const va = a2(state, a1, a22, a3);
5279 const vb = b2(state, a1, a22, a3);
5280 const vc = c2(state, a1, a22, a3);
5281 const vd = d2(state, a1, a22, a3);
5282 const ve = e2(state, a1, a22, a3);
5283 return f2(va, vb, vc, vd, ve, a1, a22, a3);
5284 };
5285 } else if (a2 && b2 && c2 && d2 && e2) {
5286 selector2 = (state, a1, a22, a3) => {
5287 const va = a2(state, a1, a22, a3);
5288 const vb = b2(state, a1, a22, a3);
5289 const vc = c2(state, a1, a22, a3);
5290 const vd = d2(state, a1, a22, a3);
5291 return e2(va, vb, vc, vd, a1, a22, a3);
5292 };
5293 } else if (a2 && b2 && c2 && d2) {
5294 selector2 = (state, a1, a22, a3) => {
5295 const va = a2(state, a1, a22, a3);
5296 const vb = b2(state, a1, a22, a3);
5297 const vc = c2(state, a1, a22, a3);
5298 return d2(va, vb, vc, a1, a22, a3);
5299 };
5300 } else if (a2 && b2 && c2) {
5301 selector2 = (state, a1, a22, a3) => {
5302 const va = a2(state, a1, a22, a3);
5303 const vb = b2(state, a1, a22, a3);
5304 return c2(va, vb, a1, a22, a3);
5305 };
5306 } else if (a2 && b2) {
5307 selector2 = (state, a1, a22, a3) => {
5308 const va = a2(state, a1, a22, a3);
5309 return b2(va, a1, a22, a3);
5310 };
5311 } else if (a2) {
5312 selector2 = a2;
5313 } else {
5314 throw (
5315 /* minify-error-disabled */
5316 new Error("Missing arguments")
5317 );
5318 }
5319 return selector2;
5320 };
5321
5322 // node_modules/@base-ui/utils/store/useStore.mjs
5323 var React21 = __toESM(require_react(), 1);
5324 var import_shim = __toESM(require_shim(), 1);
5325 var import_with_selector = __toESM(require_with_selector(), 1);
5326
5327 // node_modules/@base-ui/utils/fastHooks.mjs
5328 var React20 = __toESM(require_react(), 1);
5329 var hooks = [];
5330 var currentInstance = void 0;
5331 function getInstance() {
5332 return currentInstance;
5333 }
5334 function register(hook) {
5335 hooks.push(hook);
5336 }
5337 function fastComponent(fn) {
5338 const FastComponent = (props, forwardedRef) => {
5339 const instance = useRefWithInit(createInstance).current;
5340 let result;
5341 try {
5342 currentInstance = instance;
5343 for (const hook of hooks) {
5344 hook.before(instance);
5345 }
5346 result = fn(props, forwardedRef);
5347 for (const hook of hooks) {
5348 hook.after(instance);
5349 }
5350 instance.didInitialize = true;
5351 } finally {
5352 currentInstance = void 0;
5353 }
5354 return result;
5355 };
5356 FastComponent.displayName = fn.displayName || fn.name;
5357 return FastComponent;
5358 }
5359 function fastComponentRef(fn) {
5360 return /* @__PURE__ */ React20.forwardRef(fastComponent(fn));
5361 }
5362 function createInstance() {
5363 return {
5364 didInitialize: false
5365 };
5366 }
5367
5368 // node_modules/@base-ui/utils/store/useStore.mjs
5369 var canUseRawUseSyncExternalStore = isReactVersionAtLeast(19);
5370 var useStoreImplementation = canUseRawUseSyncExternalStore ? useStoreFast : useStoreLegacy;
5371 function useStore(store, selector2, a1, a2, a3) {
5372 return useStoreImplementation(store, selector2, a1, a2, a3);
5373 }
5374 function useStoreR19(store, selector2, a1, a2, a3) {
5375 const getSelection = React21.useCallback(() => selector2(store.getSnapshot(), a1, a2, a3), [store, selector2, a1, a2, a3]);
5376 return (0, import_shim.useSyncExternalStore)(store.subscribe, getSelection, getSelection);
5377 }
5378 register({
5379 before(instance) {
5380 instance.syncIndex = 0;
5381 if (!instance.didInitialize) {
5382 instance.syncTick = 1;
5383 instance.syncHooks = [];
5384 instance.didChangeStore = true;
5385 instance.getSnapshot = () => {
5386 let didChange2 = false;
5387 for (let i2 = 0; i2 < instance.syncHooks.length; i2 += 1) {
5388 const hook = instance.syncHooks[i2];
5389 const value = hook.selector(hook.store.state, hook.a1, hook.a2, hook.a3);
5390 if (!Object.is(hook.value, value)) {
5391 didChange2 = true;
5392 hook.value = value;
5393 }
5394 }
5395 if (didChange2) {
5396 instance.syncTick += 1;
5397 }
5398 return instance.syncTick;
5399 };
5400 }
5401 },
5402 after(instance) {
5403 if (instance.syncHooks.length > 0) {
5404 if (instance.didChangeStore) {
5405 instance.didChangeStore = false;
5406 instance.subscribe = (onStoreChange) => {
5407 const stores = /* @__PURE__ */ new Set();
5408 for (const hook of instance.syncHooks) {
5409 stores.add(hook.store);
5410 }
5411 const unsubscribes = [];
5412 for (const store of stores) {
5413 unsubscribes.push(store.subscribe(onStoreChange));
5414 }
5415 return () => {
5416 for (const unsubscribe of unsubscribes) {
5417 unsubscribe();
5418 }
5419 };
5420 };
5421 }
5422 (0, import_shim.useSyncExternalStore)(instance.subscribe, instance.getSnapshot, instance.getSnapshot);
5423 }
5424 }
5425 });
5426 function useStoreFast(store, selector2, a1, a2, a3) {
5427 const instance = getInstance();
5428 if (!instance) {
5429 return useStoreR19(store, selector2, a1, a2, a3);
5430 }
5431 const index2 = instance.syncIndex;
5432 instance.syncIndex += 1;
5433 let hook;
5434 if (!instance.didInitialize) {
5435 hook = {
5436 store,
5437 selector: selector2,
5438 a1,
5439 a2,
5440 a3,
5441 value: selector2(store.getSnapshot(), a1, a2, a3)
5442 };
5443 instance.syncHooks.push(hook);
5444 } else {
5445 hook = instance.syncHooks[index2];
5446 if (hook.store !== store || hook.selector !== selector2 || !Object.is(hook.a1, a1) || !Object.is(hook.a2, a2) || !Object.is(hook.a3, a3)) {
5447 if (hook.store !== store) {
5448 instance.didChangeStore = true;
5449 }
5450 hook.store = store;
5451 hook.selector = selector2;
5452 hook.a1 = a1;
5453 hook.a2 = a2;
5454 hook.a3 = a3;
5455 hook.value = selector2(store.getSnapshot(), a1, a2, a3);
5456 }
5457 }
5458 return hook.value;
5459 }
5460 function useStoreLegacy(store, selector2, a1, a2, a3) {
5461 return (0, import_with_selector.useSyncExternalStoreWithSelector)(store.subscribe, store.getSnapshot, store.getSnapshot, (state) => selector2(state, a1, a2, a3));
5462 }
5463
5464 // node_modules/@base-ui/utils/store/Store.mjs
5465 var Store = class {
5466 /**
5467 * The current state of the store.
5468 * This property is updated immediately when the state changes as a result of calling {@link setState}, {@link update}, or {@link set}.
5469 * 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).
5470 * The values can be used directly (to avoid subscribing to the store) in effects or event handlers.
5471 *
5472 * Do not modify properties in state directly. Instead, use the provided methods to ensure proper state management and listener notification.
5473 */
5474 // Internal state to handle recursive `setState()` calls
5475 constructor(state) {
5476 this.state = state;
5477 this.listeners = /* @__PURE__ */ new Set();
5478 this.updateTick = 0;
5479 }
5480 /**
5481 * Registers a listener that will be called whenever the store's state changes.
5482 *
5483 * @param fn The listener function to be called on state changes.
5484 * @returns A function to unsubscribe the listener.
5485 */
5486 subscribe = (fn) => {
5487 this.listeners.add(fn);
5488 return () => {
5489 this.listeners.delete(fn);
5490 };
5491 };
5492 /**
5493 * Returns the current state of the store.
5494 */
5495 getSnapshot = () => {
5496 return this.state;
5497 };
5498 /**
5499 * Updates the entire store's state and notifies all registered listeners.
5500 *
5501 * @param newState The new state to set for the store.
5502 */
5503 setState(newState) {
5504 if (this.state === newState) {
5505 return;
5506 }
5507 this.state = newState;
5508 this.updateTick += 1;
5509 const currentTick = this.updateTick;
5510 for (const listener of this.listeners) {
5511 if (currentTick !== this.updateTick) {
5512 return;
5513 }
5514 listener(newState);
5515 }
5516 }
5517 /**
5518 * Merges the provided changes into the current state and notifies listeners if there are changes.
5519 *
5520 * @param changes An object containing the changes to apply to the current state.
5521 */
5522 update(changes) {
5523 for (const key in changes) {
5524 if (!Object.is(this.state[key], changes[key])) {
5525 this.setState({
5526 ...this.state,
5527 ...changes
5528 });
5529 return;
5530 }
5531 }
5532 }
5533 /**
5534 * Sets a specific key in the store's state to a new value and notifies listeners if the value has changed.
5535 *
5536 * @param key The key in the store's state to update.
5537 * @param value The new value to set for the specified key.
5538 */
5539 set(key, value) {
5540 if (!Object.is(this.state[key], value)) {
5541 this.setState({
5542 ...this.state,
5543 [key]: value
5544 });
5545 }
5546 }
5547 /**
5548 * Gives the state a new reference and updates all registered listeners.
5549 */
5550 notifyAll() {
5551 const newState = {
5552 ...this.state
5553 };
5554 this.setState(newState);
5555 }
5556 use(selector2, a1, a2, a3) {
5557 return useStore(this, selector2, a1, a2, a3);
5558 }
5559 };
5560
5561 // node_modules/@base-ui/utils/store/ReactStore.mjs
5562 var React22 = __toESM(require_react(), 1);
5563 var ReactStore = class extends Store {
5564 /**
5565 * Creates a new ReactStore instance.
5566 *
5567 * @param state Initial state of the store.
5568 * @param context Non-reactive context values.
5569 * @param selectors Optional selectors for use with `useState`.
5570 */
5571 constructor(state, context = {}, selectors3) {
5572 super(state);
5573 this.context = context;
5574 this.selectors = selectors3;
5575 }
5576 /**
5577 * Non-reactive values such as refs, callbacks, etc.
5578 */
5579 /**
5580 * Synchronizes a single external value into the store.
5581 *
5582 * Note that the while the value in `state` is updated immediately, the value returned
5583 * by `useState` is updated before the next render (similarly to React's `useState`).
5584 */
5585 useSyncedValue(key, value) {
5586 React22.useDebugValue(key);
5587 const store = this;
5588 useIsoLayoutEffect(() => {
5589 if (store.state[key] !== value) {
5590 store.set(key, value);
5591 }
5592 }, [store, key, value]);
5593 }
5594 /**
5595 * Synchronizes a single external value into the store and
5596 * cleans it up (sets to `undefined`) on unmount.
5597 *
5598 * Note that the while the value in `state` is updated immediately, the value returned
5599 * by `useState` is updated before the next render (similarly to React's `useState`).
5600 */
5601 useSyncedValueWithCleanup(key, value) {
5602 const store = this;
5603 useIsoLayoutEffect(() => {
5604 if (store.state[key] !== value) {
5605 store.set(key, value);
5606 }
5607 return () => {
5608 store.set(key, void 0);
5609 };
5610 }, [store, key, value]);
5611 }
5612 /**
5613 * Synchronizes multiple external values into the store.
5614 *
5615 * Note that the while the values in `state` are updated immediately, the values returned
5616 * by `useState` are updated before the next render (similarly to React's `useState`).
5617 */
5618 useSyncedValues(statePart) {
5619 const store = this;
5620 if (true) {
5621 React22.useDebugValue(statePart, (p2) => Object.keys(p2));
5622 const keys = React22.useRef(Object.keys(statePart)).current;
5623 const nextKeys = Object.keys(statePart);
5624 if (keys.length !== nextKeys.length || keys.some((key, index2) => key !== nextKeys[index2])) {
5625 console.error("ReactStore.useSyncedValues expects the same prop keys on every render. Keys should be stable.");
5626 }
5627 }
5628 const dependencies = Object.values(statePart);
5629 useIsoLayoutEffect(() => {
5630 store.update(statePart);
5631 }, [store, ...dependencies]);
5632 }
5633 /**
5634 * Registers a controllable prop pair (`controlled`, `defaultValue`) for a specific key. If `controlled`
5635 * is non-undefined, the store's state at `key` is updated to match `controlled`.
5636 */
5637 useControlledProp(key, controlled) {
5638 React22.useDebugValue(key);
5639 const store = this;
5640 const isControlled = controlled !== void 0;
5641 useIsoLayoutEffect(() => {
5642 if (isControlled && !Object.is(store.state[key], controlled)) {
5643 store.setState({
5644 ...store.state,
5645 [key]: controlled
5646 });
5647 }
5648 }, [store, key, controlled, isControlled]);
5649 if (true) {
5650 const cache = this.controlledValues ??= /* @__PURE__ */ new Map();
5651 if (!cache.has(key)) {
5652 cache.set(key, isControlled);
5653 }
5654 const previouslyControlled = cache.get(key);
5655 if (previouslyControlled !== void 0 && previouslyControlled !== isControlled) {
5656 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).`);
5657 }
5658 }
5659 }
5660 /** Gets the current value from the store using a selector with the provided key.
5661 *
5662 * @param key Key of the selector to use.
5663 */
5664 select(key, a1, a2, a3) {
5665 const selector2 = this.selectors[key];
5666 return selector2(this.state, a1, a2, a3);
5667 }
5668 /**
5669 * Returns a value from the store's state using a selector function.
5670 * Used to subscribe to specific parts of the state.
5671 * This methods causes a rerender whenever the selected state changes.
5672 *
5673 * @param key Key of the selector to use.
5674 */
5675 useState(key, a1, a2, a3) {
5676 React22.useDebugValue(key);
5677 return useStore(this, this.selectors[key], a1, a2, a3);
5678 }
5679 /**
5680 * Wraps a function with `useStableCallback` to ensure it has a stable reference
5681 * and assigns it to the context.
5682 *
5683 * @param key Key of the event callback. Must be a function in the context.
5684 * @param fn Function to assign.
5685 */
5686 useContextCallback(key, fn) {
5687 React22.useDebugValue(key);
5688 const stableFunction = useStableCallback(fn ?? NOOP);
5689 this.context[key] = stableFunction;
5690 }
5691 /**
5692 * Returns a stable setter function for a specific key in the store's state.
5693 * It's commonly used to pass as a ref callback to React elements.
5694 *
5695 * @param key Key of the state to set.
5696 */
5697 useStateSetter(key) {
5698 const ref = React22.useRef(void 0);
5699 if (ref.current === void 0) {
5700 ref.current = (value) => {
5701 this.set(key, value);
5702 };
5703 }
5704 return ref.current;
5705 }
5706 /**
5707 * Observes changes derived from the store's selectors and calls the listener when the selected value changes.
5708 *
5709 * @param key Key of the selector to observe.
5710 * @param listener Listener function called when the selector result changes.
5711 */
5712 observe(selector2, listener) {
5713 let selectFn;
5714 if (typeof selector2 === "function") {
5715 selectFn = selector2;
5716 } else {
5717 selectFn = this.selectors[selector2];
5718 }
5719 let prevValue = selectFn(this.state);
5720 listener(prevValue, prevValue, this);
5721 return this.subscribe((nextState) => {
5722 const nextValue = selectFn(nextState);
5723 if (!Object.is(prevValue, nextValue)) {
5724 const oldValue = prevValue;
5725 prevValue = nextValue;
5726 listener(nextValue, oldValue, this);
5727 }
5728 });
5729 }
5730 };
5731
5732 // node_modules/@base-ui/react/floating-ui-react/components/FloatingRootStore.mjs
5733 var selectors = {
5734 open: createSelector((state) => state.open),
5735 transitionStatus: createSelector((state) => state.transitionStatus),
5736 domReferenceElement: createSelector((state) => state.domReferenceElement),
5737 referenceElement: createSelector((state) => state.positionReference ?? state.referenceElement),
5738 floatingElement: createSelector((state) => state.floatingElement),
5739 floatingId: createSelector((state) => state.floatingId)
5740 };
5741 var FloatingRootStore = class extends ReactStore {
5742 constructor(options) {
5743 const {
5744 syncOnly,
5745 nested,
5746 onOpenChange,
5747 triggerElements,
5748 ...initialState
5749 } = options;
5750 super({
5751 ...initialState,
5752 positionReference: initialState.referenceElement,
5753 domReferenceElement: initialState.referenceElement
5754 }, {
5755 onOpenChange,
5756 dataRef: {
5757 current: {}
5758 },
5759 events: createEventEmitter(),
5760 nested,
5761 triggerElements
5762 }, selectors);
5763 this.syncOnly = syncOnly;
5764 }
5765 /**
5766 * Syncs the event used by hover logic to distinguish hover-open from click-like interaction.
5767 */
5768 syncOpenEvent = (newOpen, event) => {
5769 if (!newOpen || !this.state.open || // Prevent a pending hover-open from overwriting a click-open event, while allowing
5770 // click events to upgrade a hover-open.
5771 event != null && isClickLikeEvent(event)) {
5772 this.context.dataRef.current.openEvent = newOpen ? event : void 0;
5773 }
5774 };
5775 /**
5776 * Runs the root-owned side effects for an open state change.
5777 */
5778 dispatchOpenChange = (newOpen, eventDetails) => {
5779 this.syncOpenEvent(newOpen, eventDetails.event);
5780 const details = {
5781 open: newOpen,
5782 reason: eventDetails.reason,
5783 nativeEvent: eventDetails.event,
5784 nested: this.context.nested,
5785 triggerElement: eventDetails.trigger
5786 };
5787 this.context.events.emit("openchange", details);
5788 };
5789 /**
5790 * Emits the `openchange` event through the internal event emitter and calls the `onOpenChange` handler with the provided arguments.
5791 *
5792 * @param newOpen The new open state.
5793 * @param eventDetails Details about the event that triggered the open state change.
5794 */
5795 setOpen = (newOpen, eventDetails) => {
5796 if (this.syncOnly) {
5797 this.context.onOpenChange?.(newOpen, eventDetails);
5798 return;
5799 }
5800 this.dispatchOpenChange(newOpen, eventDetails);
5801 this.context.onOpenChange?.(newOpen, eventDetails);
5802 };
5803 };
5804
5805 // node_modules/@base-ui/react/floating-ui-react/hooks/useSyncedFloatingRootContext.mjs
5806 function useSyncedFloatingRootContext(options) {
5807 const {
5808 popupStore,
5809 treatPopupAsFloatingElement = false,
5810 floatingRootContext: floatingRootContextProp,
5811 floatingId,
5812 nested,
5813 onOpenChange
5814 } = options;
5815 const open = popupStore.useState("open");
5816 const referenceElement = popupStore.useState("activeTriggerElement");
5817 const floatingElement = popupStore.useState(treatPopupAsFloatingElement ? "popupElement" : "positionerElement");
5818 const triggerElements = popupStore.context.triggerElements;
5819 const handleOpenChange = onOpenChange;
5820 const internalStoreRef = React23.useRef(null);
5821 if (floatingRootContextProp === void 0 && internalStoreRef.current === null) {
5822 internalStoreRef.current = new FloatingRootStore({
5823 open,
5824 transitionStatus: void 0,
5825 referenceElement,
5826 floatingElement,
5827 triggerElements,
5828 onOpenChange: handleOpenChange,
5829 floatingId,
5830 syncOnly: true,
5831 nested
5832 });
5833 }
5834 const store = floatingRootContextProp ?? internalStoreRef.current;
5835 popupStore.useSyncedValue("floatingId", floatingId);
5836 useIsoLayoutEffect(() => {
5837 const valuesToSync = {
5838 open,
5839 floatingId,
5840 referenceElement,
5841 floatingElement
5842 };
5843 if (isElement(referenceElement)) {
5844 valuesToSync.domReferenceElement = referenceElement;
5845 }
5846 if (store.state.positionReference === store.state.referenceElement) {
5847 valuesToSync.positionReference = referenceElement;
5848 }
5849 store.update(valuesToSync);
5850 }, [open, floatingId, referenceElement, floatingElement, store]);
5851 store.context.onOpenChange = handleOpenChange;
5852 store.context.nested = nested;
5853 return store;
5854 }
5855
5856 // node_modules/@base-ui/react/utils/popups/popupStoreUtils.mjs
5857 var FOCUSABLE_POPUP_PROPS = {
5858 tabIndex: -1,
5859 [FOCUSABLE_ATTRIBUTE]: ""
5860 };
5861 function usePopupStore(externalStore, createStore2, treatPopupAsFloatingElement = false) {
5862 const floatingId = useId();
5863 const nested = useFloatingParentNodeId() != null;
5864 const internalStoreRef = React24.useRef(null);
5865 if (externalStore === void 0 && internalStoreRef.current === null) {
5866 internalStoreRef.current = createStore2(floatingId, nested);
5867 }
5868 const store = externalStore ?? internalStoreRef.current;
5869 useSyncedFloatingRootContext({
5870 popupStore: store,
5871 treatPopupAsFloatingElement,
5872 floatingRootContext: store.state.floatingRootContext,
5873 floatingId,
5874 nested,
5875 onOpenChange: store.setOpen
5876 });
5877 return {
5878 store,
5879 internalStore: internalStoreRef.current
5880 };
5881 }
5882 function useTriggerRegistration(id, store) {
5883 const registeredElementIdRef = React24.useRef(null);
5884 const registeredElementRef = React24.useRef(null);
5885 return React24.useCallback((element) => {
5886 if (id === void 0) {
5887 return;
5888 }
5889 let shouldSyncTriggerCount = false;
5890 if (registeredElementIdRef.current !== null) {
5891 const registeredId = registeredElementIdRef.current;
5892 const registeredElement = registeredElementRef.current;
5893 const currentElement = store.context.triggerElements.getById(registeredId);
5894 if (registeredElement && currentElement === registeredElement) {
5895 store.context.triggerElements.delete(registeredId);
5896 shouldSyncTriggerCount = true;
5897 }
5898 registeredElementIdRef.current = null;
5899 registeredElementRef.current = null;
5900 }
5901 if (element !== null) {
5902 registeredElementIdRef.current = id;
5903 registeredElementRef.current = element;
5904 store.context.triggerElements.add(id, element);
5905 shouldSyncTriggerCount = true;
5906 }
5907 if (shouldSyncTriggerCount) {
5908 const triggerCount = store.context.triggerElements.size;
5909 if (store.select("open") && store.state.triggerCount !== triggerCount) {
5910 store.set("triggerCount", triggerCount);
5911 }
5912 }
5913 }, [store, id]);
5914 }
5915 function setPopupOpenState(state, open, trigger, preventUnmountOnClose = false) {
5916 if (open) {
5917 state.preventUnmountingOnClose = false;
5918 } else if (preventUnmountOnClose) {
5919 state.preventUnmountingOnClose = true;
5920 }
5921 const triggerId = trigger?.id ?? null;
5922 if (triggerId || open) {
5923 state.activeTriggerId = triggerId;
5924 state.activeTriggerElement = trigger ?? null;
5925 }
5926 }
5927 function attachPreventUnmountOnClose(eventDetails) {
5928 let preventUnmountOnClose = false;
5929 eventDetails.preventUnmountOnClose = () => {
5930 preventUnmountOnClose = true;
5931 };
5932 return () => preventUnmountOnClose;
5933 }
5934 function applyPopupOpenChange(store, nextOpen, eventDetails, options = {}) {
5935 const reason = eventDetails.reason;
5936 const isHover = reason === reason_parts_exports.triggerHover;
5937 const isFocusOpen = nextOpen && reason === reason_parts_exports.triggerFocus;
5938 const isDismissClose = !nextOpen && (reason === reason_parts_exports.triggerPress || reason === reason_parts_exports.escapeKey);
5939 const shouldPreventUnmountOnClose = attachPreventUnmountOnClose(eventDetails);
5940 store.context.onOpenChange?.(nextOpen, eventDetails);
5941 if (eventDetails.isCanceled) {
5942 return;
5943 }
5944 options.onBeforeDispatch?.();
5945 store.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);
5946 const changeState = () => {
5947 const updatedState = {
5948 ...options.extraState,
5949 open: nextOpen
5950 };
5951 if (isFocusOpen) {
5952 updatedState.instantType = "focus";
5953 } else if (isDismissClose) {
5954 updatedState.instantType = "dismiss";
5955 } else if (isHover) {
5956 updatedState.instantType = void 0;
5957 }
5958 setPopupOpenState(updatedState, nextOpen, eventDetails.trigger, shouldPreventUnmountOnClose());
5959 store.update(updatedState);
5960 };
5961 if (isHover) {
5962 ReactDOM4.flushSync(changeState);
5963 } else {
5964 changeState();
5965 }
5966 }
5967 function useInitialOpenSync(store, openProp, defaultOpen, defaultTriggerId) {
5968 useOnFirstRender(() => {
5969 if (openProp === void 0 && store.state.open === false && defaultOpen) {
5970 store.state = {
5971 ...store.state,
5972 open: true,
5973 activeTriggerId: defaultTriggerId,
5974 preventUnmountingOnClose: false
5975 };
5976 }
5977 });
5978 }
5979 function useTriggerDataForwarding(triggerId, triggerElementRef, store, stateUpdates) {
5980 const isMountedByThisTrigger = store.useState("isMountedByTrigger", triggerId);
5981 const baseRegisterTrigger = useTriggerRegistration(triggerId, store);
5982 const registerTrigger = useStableCallback((element) => {
5983 baseRegisterTrigger(element);
5984 if (!element) {
5985 return;
5986 }
5987 const open = store.select("open");
5988 const activeTriggerId = store.select("activeTriggerId");
5989 if (activeTriggerId === triggerId) {
5990 store.update({
5991 activeTriggerElement: element,
5992 ...open ? stateUpdates : null
5993 });
5994 return;
5995 }
5996 if (activeTriggerId == null && open) {
5997 store.update({
5998 activeTriggerId: triggerId,
5999 activeTriggerElement: element,
6000 ...stateUpdates
6001 });
6002 }
6003 });
6004 useIsoLayoutEffect(() => {
6005 if (isMountedByThisTrigger) {
6006 store.update({
6007 activeTriggerElement: triggerElementRef.current,
6008 ...stateUpdates
6009 });
6010 }
6011 }, [isMountedByThisTrigger, store, triggerElementRef, ...Object.values(stateUpdates)]);
6012 return {
6013 registerTrigger,
6014 isMountedByThisTrigger
6015 };
6016 }
6017 function useImplicitActiveTrigger(store, options = {}) {
6018 const {
6019 closeOnActiveTriggerUnmount = false
6020 } = options;
6021 const open = store.useState("open");
6022 const reactiveTriggerCount = store.useState("triggerCount");
6023 useIsoLayoutEffect(() => {
6024 if (!open) {
6025 if (store.state.triggerCount !== 0) {
6026 store.set("triggerCount", 0);
6027 }
6028 return;
6029 }
6030 const triggerCount = store.context.triggerElements.size;
6031 const stateUpdates = {};
6032 if (store.state.triggerCount !== triggerCount) {
6033 stateUpdates.triggerCount = triggerCount;
6034 }
6035 const activeTriggerId = store.select("activeTriggerId");
6036 let lostActiveTriggerId = null;
6037 if (activeTriggerId) {
6038 const activeTriggerElement = store.context.triggerElements.getById(activeTriggerId);
6039 if (!activeTriggerElement) {
6040 lostActiveTriggerId = activeTriggerId;
6041 } else if (activeTriggerElement !== store.state.activeTriggerElement) {
6042 stateUpdates.activeTriggerElement = activeTriggerElement;
6043 }
6044 }
6045 if (!lostActiveTriggerId && !activeTriggerId && triggerCount === 1) {
6046 const iteratorResult = store.context.triggerElements.entries().next();
6047 if (!iteratorResult.done) {
6048 const [implicitTriggerId, implicitTriggerElement] = iteratorResult.value;
6049 stateUpdates.activeTriggerId = implicitTriggerId;
6050 stateUpdates.activeTriggerElement = implicitTriggerElement;
6051 }
6052 }
6053 if (stateUpdates.triggerCount !== void 0 || stateUpdates.activeTriggerId !== void 0 || stateUpdates.activeTriggerElement !== void 0) {
6054 store.update(stateUpdates);
6055 }
6056 if (lostActiveTriggerId) {
6057 if (closeOnActiveTriggerUnmount) {
6058 queueMicrotask(() => {
6059 if (store.select("open") && store.select("activeTriggerId") === lostActiveTriggerId && !store.context.triggerElements.getById(lostActiveTriggerId)) {
6060 const eventDetails = createChangeEventDetails(reason_parts_exports.none);
6061 store.setOpen(false, eventDetails);
6062 if (!eventDetails.isCanceled) {
6063 store.update({
6064 activeTriggerId: null,
6065 activeTriggerElement: null
6066 });
6067 }
6068 }
6069 });
6070 }
6071 }
6072 }, [open, store, reactiveTriggerCount, closeOnActiveTriggerUnmount]);
6073 }
6074 function useOpenStateTransitions(open, store, onUnmount) {
6075 const {
6076 mounted,
6077 setMounted,
6078 transitionStatus
6079 } = useTransitionStatus(open);
6080 const preventUnmountingOnClose = store.useState("preventUnmountingOnClose");
6081 const syncedPreventUnmountingOnClose = open ? false : preventUnmountingOnClose;
6082 store.useSyncedValues({
6083 mounted,
6084 transitionStatus,
6085 preventUnmountingOnClose: syncedPreventUnmountingOnClose
6086 });
6087 const forceUnmount = useStableCallback(() => {
6088 setMounted(false);
6089 store.update({
6090 activeTriggerId: null,
6091 activeTriggerElement: null,
6092 mounted: false,
6093 preventUnmountingOnClose: false
6094 });
6095 onUnmount?.();
6096 store.context.onOpenChangeComplete?.(false);
6097 });
6098 useOpenChangeComplete({
6099 enabled: mounted && !open && !syncedPreventUnmountingOnClose,
6100 open,
6101 ref: store.context.popupRef,
6102 onComplete() {
6103 if (!open) {
6104 forceUnmount();
6105 }
6106 }
6107 });
6108 return {
6109 forceUnmount,
6110 transitionStatus
6111 };
6112 }
6113 function usePopupInteractionProps(store, statePart) {
6114 store.useSyncedValues(statePart);
6115 useIsoLayoutEffect(() => () => {
6116 store.update({
6117 activeTriggerProps: EMPTY_OBJECT,
6118 inactiveTriggerProps: EMPTY_OBJECT,
6119 popupProps: EMPTY_OBJECT
6120 });
6121 }, [store]);
6122 }
6123
6124 // node_modules/@base-ui/react/utils/popups/popupTriggerMap.mjs
6125 var PopupTriggerMap = class {
6126 constructor() {
6127 this.elementsSet = /* @__PURE__ */ new Set();
6128 this.idMap = /* @__PURE__ */ new Map();
6129 }
6130 /**
6131 * Adds a trigger element with the given ID.
6132 *
6133 * Note: The provided element is assumed to not be registered under multiple IDs.
6134 */
6135 add(id, element) {
6136 const existingElement = this.idMap.get(id);
6137 if (existingElement === element) {
6138 return;
6139 }
6140 if (existingElement !== void 0) {
6141 this.elementsSet.delete(existingElement);
6142 }
6143 this.elementsSet.add(element);
6144 this.idMap.set(id, element);
6145 if (true) {
6146 if (this.elementsSet.size !== this.idMap.size) {
6147 throw new Error("Base UI: A trigger element cannot be registered under multiple IDs in PopupTriggerMap.");
6148 }
6149 }
6150 }
6151 /**
6152 * Removes the trigger element with the given ID.
6153 */
6154 delete(id) {
6155 const element = this.idMap.get(id);
6156 if (element) {
6157 this.elementsSet.delete(element);
6158 this.idMap.delete(id);
6159 }
6160 }
6161 /**
6162 * Whether the given element is registered as a trigger.
6163 */
6164 hasElement(element) {
6165 return this.elementsSet.has(element);
6166 }
6167 /**
6168 * Whether there is a registered trigger element matching the given predicate.
6169 */
6170 hasMatchingElement(predicate) {
6171 for (const element of this.elementsSet) {
6172 if (predicate(element)) {
6173 return true;
6174 }
6175 }
6176 return false;
6177 }
6178 /**
6179 * Returns the trigger element associated with the given ID, or undefined if no such element exists.
6180 */
6181 getById(id) {
6182 return this.idMap.get(id);
6183 }
6184 /**
6185 * Returns an iterable of all registered trigger entries, where each entry is a tuple of [id, element].
6186 */
6187 entries() {
6188 return this.idMap.entries();
6189 }
6190 /**
6191 * Returns an iterable of all registered trigger elements.
6192 */
6193 elements() {
6194 return this.elementsSet.values();
6195 }
6196 /**
6197 * Returns the number of registered trigger elements.
6198 */
6199 get size() {
6200 return this.idMap.size;
6201 }
6202 };
6203
6204 // node_modules/@base-ui/react/floating-ui-react/utils/getEmptyRootContext.mjs
6205 function getEmptyRootContext() {
6206 return new FloatingRootStore({
6207 open: false,
6208 transitionStatus: void 0,
6209 floatingElement: null,
6210 referenceElement: null,
6211 triggerElements: new PopupTriggerMap(),
6212 floatingId: void 0,
6213 syncOnly: false,
6214 nested: false,
6215 onOpenChange: void 0
6216 });
6217 }
6218
6219 // node_modules/@base-ui/react/utils/popups/store.mjs
6220 function createInitialPopupStoreState() {
6221 return {
6222 open: false,
6223 openProp: void 0,
6224 mounted: false,
6225 transitionStatus: void 0,
6226 floatingRootContext: getEmptyRootContext(),
6227 floatingId: void 0,
6228 triggerCount: 0,
6229 preventUnmountingOnClose: false,
6230 payload: void 0,
6231 activeTriggerId: null,
6232 activeTriggerElement: null,
6233 triggerIdProp: void 0,
6234 popupElement: null,
6235 positionerElement: null,
6236 activeTriggerProps: EMPTY_OBJECT,
6237 inactiveTriggerProps: EMPTY_OBJECT,
6238 popupProps: EMPTY_OBJECT
6239 };
6240 }
6241 function createPopupFloatingRootContext(triggerElements, floatingId, nested = false) {
6242 return new FloatingRootStore({
6243 open: false,
6244 transitionStatus: void 0,
6245 floatingElement: null,
6246 referenceElement: null,
6247 triggerElements,
6248 floatingId,
6249 syncOnly: true,
6250 nested,
6251 onOpenChange: void 0
6252 });
6253 }
6254 var activeTriggerIdSelector = createSelector((state) => state.triggerIdProp ?? state.activeTriggerId);
6255 var openSelector = createSelector((state) => state.openProp ?? state.open);
6256 var popupIdSelector = createSelector((state) => {
6257 const popupId = state.popupElement?.id ?? state.floatingId;
6258 return popupId || void 0;
6259 });
6260 function triggerOwnsOpenPopup(state, triggerId) {
6261 return triggerId !== void 0 && openSelector(state) && activeTriggerIdSelector(state) === triggerId;
6262 }
6263 function triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) {
6264 if (triggerOwnsOpenPopup(state, triggerId)) {
6265 return true;
6266 }
6267 return triggerId !== void 0 && openSelector(state) && activeTriggerIdSelector(state) == null && state.triggerCount === 1;
6268 }
6269 var popupStoreSelectors = {
6270 open: openSelector,
6271 mounted: createSelector((state) => state.mounted),
6272 transitionStatus: createSelector((state) => state.transitionStatus),
6273 floatingRootContext: createSelector((state) => state.floatingRootContext),
6274 triggerCount: createSelector((state) => state.triggerCount),
6275 preventUnmountingOnClose: createSelector((state) => state.preventUnmountingOnClose),
6276 payload: createSelector((state) => state.payload),
6277 activeTriggerId: activeTriggerIdSelector,
6278 activeTriggerElement: createSelector((state) => state.mounted ? state.activeTriggerElement : null),
6279 popupId: popupIdSelector,
6280 /**
6281 * Whether the trigger with the given ID was used to open the popup.
6282 */
6283 isTriggerActive: createSelector((state, triggerId) => triggerId !== void 0 && activeTriggerIdSelector(state) === triggerId),
6284 /**
6285 * Whether the popup is open and was activated by a trigger with the given ID.
6286 */
6287 isOpenedByTrigger: createSelector((state, triggerId) => triggerOwnsOpenPopup(state, triggerId)),
6288 /**
6289 * Whether the popup is mounted and was activated by a trigger with the given ID.
6290 */
6291 isMountedByTrigger: createSelector((state, triggerId) => triggerId !== void 0 && activeTriggerIdSelector(state) === triggerId && state.mounted),
6292 triggerProps: createSelector((state, isActive) => isActive ? state.activeTriggerProps : state.inactiveTriggerProps),
6293 /**
6294 * Popup id for the trigger that currently owns the open popup.
6295 */
6296 triggerPopupId: createSelector((state, triggerId) => triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) ? popupIdSelector(state) : void 0),
6297 popupProps: createSelector((state) => state.popupProps),
6298 popupElement: createSelector((state) => state.popupElement),
6299 positionerElement: createSelector((state) => state.positionerElement)
6300 };
6301
6302 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloatingRootContext.mjs
6303 function useFloatingRootContext(options) {
6304 const {
6305 open = false,
6306 onOpenChange,
6307 elements = {}
6308 } = options;
6309 const floatingId = useId();
6310 const nested = useFloatingParentNodeId() != null;
6311 if (true) {
6312 const optionDomReference = elements.reference;
6313 if (optionDomReference && !isElement(optionDomReference)) {
6314 console.error("Cannot pass a virtual element to the `elements.reference` option,", "as it must be a real DOM element. Use `context.setPositionReference()`", "instead.");
6315 }
6316 }
6317 const store = useRefWithInit(() => new FloatingRootStore({
6318 open,
6319 transitionStatus: void 0,
6320 onOpenChange,
6321 referenceElement: elements.reference ?? null,
6322 floatingElement: elements.floating ?? null,
6323 triggerElements: new PopupTriggerMap(),
6324 floatingId,
6325 syncOnly: false,
6326 nested
6327 })).current;
6328 useIsoLayoutEffect(() => {
6329 const valuesToSync = {
6330 open,
6331 floatingId
6332 };
6333 if (elements.reference !== void 0) {
6334 valuesToSync.referenceElement = elements.reference;
6335 valuesToSync.domReferenceElement = isElement(elements.reference) ? elements.reference : null;
6336 }
6337 if (elements.floating !== void 0) {
6338 valuesToSync.floatingElement = elements.floating;
6339 }
6340 store.update(valuesToSync);
6341 }, [open, floatingId, elements.reference, elements.floating, store]);
6342 store.context.onOpenChange = onOpenChange;
6343 store.context.nested = nested;
6344 return store;
6345 }
6346
6347 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloating.mjs
6348 function useFloating2(options = {}) {
6349 const {
6350 nodeId,
6351 externalTree
6352 } = options;
6353 const internalStore = useFloatingRootContext(options);
6354 const store = options.rootContext || internalStore;
6355 const referenceElement = store.useState("referenceElement");
6356 const floatingElement = store.useState("floatingElement");
6357 const domReferenceElement = store.useState("domReferenceElement");
6358 const open = store.useState("open");
6359 const floatingId = store.useState("floatingId");
6360 const [positionReference, setPositionReferenceRaw] = React25.useState(null);
6361 const [localDomReference, setLocalDomReference] = React25.useState(void 0);
6362 const [localFloatingElement, setLocalFloatingElement] = React25.useState(void 0);
6363 const domReferenceRef = React25.useRef(null);
6364 const tree = useFloatingTree(externalTree);
6365 const storeElements = React25.useMemo(() => ({
6366 reference: referenceElement,
6367 floating: floatingElement,
6368 domReference: domReferenceElement
6369 }), [referenceElement, floatingElement, domReferenceElement]);
6370 const position = useFloating({
6371 ...options,
6372 elements: {
6373 ...storeElements,
6374 ...positionReference && {
6375 reference: positionReference
6376 }
6377 }
6378 });
6379 const localDomReferenceElement = isElement(localDomReference) ? localDomReference : null;
6380 const syncedFloatingElement = localFloatingElement === void 0 ? store.state.floatingElement : localFloatingElement;
6381 store.useSyncedValue("referenceElement", localDomReference ?? null);
6382 store.useSyncedValue("domReferenceElement", localDomReference === void 0 ? domReferenceElement : localDomReferenceElement);
6383 store.useSyncedValue("floatingElement", syncedFloatingElement);
6384 const setPositionReference = React25.useCallback((node) => {
6385 const computedPositionReference = isElement(node) ? {
6386 getBoundingClientRect: () => node.getBoundingClientRect(),
6387 getClientRects: () => node.getClientRects(),
6388 contextElement: node
6389 } : node;
6390 setPositionReferenceRaw(computedPositionReference);
6391 position.refs.setReference(computedPositionReference);
6392 }, [position.refs]);
6393 const setReference = React25.useCallback((node) => {
6394 if (isElement(node) || node === null) {
6395 domReferenceRef.current = node;
6396 setLocalDomReference(node);
6397 }
6398 if (isElement(position.refs.reference.current) || position.refs.reference.current === null || // Don't allow setting virtual elements using the old technique back to
6399 // `null` to support `positionReference` + an unstable `reference`
6400 // callback ref.
6401 node !== null && !isElement(node)) {
6402 position.refs.setReference(node);
6403 }
6404 }, [position.refs, setLocalDomReference]);
6405 const setFloating = React25.useCallback((node) => {
6406 setLocalFloatingElement(node);
6407 position.refs.setFloating(node);
6408 }, [position.refs]);
6409 const refs = React25.useMemo(() => ({
6410 ...position.refs,
6411 setReference,
6412 setFloating,
6413 setPositionReference,
6414 domReference: domReferenceRef
6415 }), [position.refs, setReference, setFloating, setPositionReference]);
6416 const elements = React25.useMemo(() => ({
6417 ...position.elements,
6418 domReference: domReferenceElement
6419 }), [position.elements, domReferenceElement]);
6420 const context = React25.useMemo(() => ({
6421 ...position,
6422 dataRef: store.context.dataRef,
6423 open,
6424 onOpenChange: store.setOpen,
6425 events: store.context.events,
6426 floatingId,
6427 refs,
6428 elements,
6429 nodeId,
6430 rootStore: store
6431 }), [position, refs, elements, nodeId, store, open, floatingId]);
6432 useIsoLayoutEffect(() => {
6433 if (domReferenceElement) {
6434 domReferenceRef.current = domReferenceElement;
6435 }
6436 }, [domReferenceElement]);
6437 useIsoLayoutEffect(() => {
6438 store.context.dataRef.current.floatingContext = context;
6439 const node = tree?.nodesRef.current.find((n2) => n2.id === nodeId);
6440 if (node) {
6441 node.context = context;
6442 }
6443 });
6444 return React25.useMemo(() => ({
6445 ...position,
6446 context,
6447 refs,
6448 elements,
6449 rootStore: store
6450 }), [position, refs, elements, context, store]);
6451 }
6452
6453 // node_modules/@base-ui/react/floating-ui-react/hooks/useFocus.mjs
6454 var React26 = __toESM(require_react(), 1);
6455 var isMacSafari = parts_exports.os.mac && parts_exports.engine.webkit;
6456 function useFocus(context, props = {}) {
6457 const {
6458 enabled = true,
6459 delay
6460 } = props;
6461 const store = "rootStore" in context ? context.rootStore : context;
6462 const {
6463 events,
6464 dataRef
6465 } = store.context;
6466 const blockFocusRef = React26.useRef(false);
6467 const blockedReferenceRef = React26.useRef(null);
6468 const keyboardModalityRef = React26.useRef(true);
6469 const timeout = useTimeout();
6470 React26.useEffect(() => {
6471 const domReference = store.select("domReferenceElement");
6472 if (!enabled) {
6473 return void 0;
6474 }
6475 const win = getWindow(domReference);
6476 function onBlur() {
6477 const currentDomReference = store.select("domReferenceElement");
6478 if (!store.select("open") && isHTMLElement(currentDomReference) && currentDomReference === activeElement(ownerDocument(currentDomReference))) {
6479 blockFocusRef.current = true;
6480 }
6481 }
6482 function onKeyDown() {
6483 keyboardModalityRef.current = true;
6484 }
6485 function onPointerDown() {
6486 keyboardModalityRef.current = false;
6487 }
6488 return mergeCleanups(addEventListener(win, "blur", onBlur), isMacSafari && addEventListener(win, "keydown", onKeyDown, true), isMacSafari && addEventListener(win, "pointerdown", onPointerDown, true));
6489 }, [store, enabled]);
6490 React26.useEffect(() => {
6491 if (!enabled) {
6492 return void 0;
6493 }
6494 function onOpenChangeLocal(details) {
6495 if (details.reason === reason_parts_exports.triggerPress || details.reason === reason_parts_exports.escapeKey) {
6496 const referenceElement = store.select("domReferenceElement");
6497 if (isElement(referenceElement)) {
6498 blockedReferenceRef.current = referenceElement;
6499 blockFocusRef.current = true;
6500 }
6501 }
6502 }
6503 events.on("openchange", onOpenChangeLocal);
6504 return () => {
6505 events.off("openchange", onOpenChangeLocal);
6506 };
6507 }, [events, enabled, store]);
6508 const reference = React26.useMemo(() => {
6509 function resetBlockedFocus() {
6510 blockFocusRef.current = false;
6511 blockedReferenceRef.current = null;
6512 }
6513 return {
6514 onMouseLeave() {
6515 resetBlockedFocus();
6516 },
6517 onFocus(event) {
6518 const focusTarget = event.currentTarget;
6519 if (blockFocusRef.current) {
6520 if (blockedReferenceRef.current === focusTarget) {
6521 return;
6522 }
6523 resetBlockedFocus();
6524 }
6525 const target = getTarget(event.nativeEvent);
6526 if (isElement(target)) {
6527 if (isMacSafari && !event.relatedTarget) {
6528 if (!keyboardModalityRef.current && !isTypeableElement(target)) {
6529 return;
6530 }
6531 } else if (!matchesFocusVisible(target)) {
6532 return;
6533 }
6534 }
6535 const movedFromOtherEnabledTrigger = isTargetInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements);
6536 const {
6537 nativeEvent,
6538 currentTarget
6539 } = event;
6540 const delayValue = typeof delay === "function" ? delay() : delay;
6541 if (store.select("open") && movedFromOtherEnabledTrigger || delayValue === 0 || delayValue === void 0) {
6542 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent, currentTarget));
6543 return;
6544 }
6545 timeout.start(delayValue, () => {
6546 if (blockFocusRef.current) {
6547 return;
6548 }
6549 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent, currentTarget));
6550 });
6551 },
6552 onBlur(event) {
6553 resetBlockedFocus();
6554 const relatedTarget = event.relatedTarget;
6555 const nativeEvent = event.nativeEvent;
6556 const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute("focus-guard")) && relatedTarget.getAttribute("data-type") === "outside";
6557 timeout.start(0, () => {
6558 const domReference = store.select("domReferenceElement");
6559 const activeEl = activeElement(ownerDocument(domReference));
6560 if (!relatedTarget && activeEl === domReference) {
6561 return;
6562 }
6563 if (contains(dataRef.current.floatingContext?.refs.floating.current, activeEl) || contains(domReference, activeEl) || movedToFocusGuard) {
6564 return;
6565 }
6566 const nextFocusedElement = relatedTarget ?? activeEl;
6567 if (isTargetInsideEnabledTrigger(nextFocusedElement, store.context.triggerElements)) {
6568 return;
6569 }
6570 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent));
6571 });
6572 }
6573 };
6574 }, [dataRef, delay, store, timeout]);
6575 return React26.useMemo(() => enabled ? {
6576 reference,
6577 trigger: reference
6578 } : {}, [enabled, reference]);
6579 }
6580
6581 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverFloatingInteraction.mjs
6582 var React27 = __toESM(require_react(), 1);
6583
6584 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverInteractionSharedState.mjs
6585 var HoverInteraction = class _HoverInteraction {
6586 constructor() {
6587 this.pointerType = void 0;
6588 this.interactedInside = false;
6589 this.handler = void 0;
6590 this.blockMouseMove = true;
6591 this.performedPointerEventsMutation = false;
6592 this.pointerEventsScopeElement = null;
6593 this.pointerEventsReferenceElement = null;
6594 this.pointerEventsFloatingElement = null;
6595 this.restTimeoutPending = false;
6596 this.openChangeTimeout = new Timeout();
6597 this.restTimeout = new Timeout();
6598 this.handleCloseOptions = void 0;
6599 }
6600 static create() {
6601 return new _HoverInteraction();
6602 }
6603 dispose = () => {
6604 this.openChangeTimeout.clear();
6605 this.restTimeout.clear();
6606 };
6607 disposeEffect = () => {
6608 return this.dispose;
6609 };
6610 };
6611 var pointerEventsMutationOwnerByScopeElement = /* @__PURE__ */ new WeakMap();
6612 function clearSafePolygonPointerEventsMutation(instance) {
6613 if (!instance.performedPointerEventsMutation) {
6614 return;
6615 }
6616 const scopeElement = instance.pointerEventsScopeElement;
6617 if (scopeElement && pointerEventsMutationOwnerByScopeElement.get(scopeElement) === instance) {
6618 instance.pointerEventsScopeElement?.style.removeProperty("pointer-events");
6619 instance.pointerEventsReferenceElement?.style.removeProperty("pointer-events");
6620 instance.pointerEventsFloatingElement?.style.removeProperty("pointer-events");
6621 pointerEventsMutationOwnerByScopeElement.delete(scopeElement);
6622 }
6623 instance.performedPointerEventsMutation = false;
6624 instance.pointerEventsScopeElement = null;
6625 instance.pointerEventsReferenceElement = null;
6626 instance.pointerEventsFloatingElement = null;
6627 }
6628 function applySafePolygonPointerEventsMutation(instance, options) {
6629 const {
6630 scopeElement,
6631 referenceElement,
6632 floatingElement
6633 } = options;
6634 const existingOwner = pointerEventsMutationOwnerByScopeElement.get(scopeElement);
6635 if (existingOwner && existingOwner !== instance) {
6636 clearSafePolygonPointerEventsMutation(existingOwner);
6637 }
6638 clearSafePolygonPointerEventsMutation(instance);
6639 instance.performedPointerEventsMutation = true;
6640 instance.pointerEventsScopeElement = scopeElement;
6641 instance.pointerEventsReferenceElement = referenceElement;
6642 instance.pointerEventsFloatingElement = floatingElement;
6643 pointerEventsMutationOwnerByScopeElement.set(scopeElement, instance);
6644 scopeElement.style.pointerEvents = "none";
6645 referenceElement.style.pointerEvents = "auto";
6646 floatingElement.style.pointerEvents = "auto";
6647 }
6648 function useHoverInteractionSharedState(store) {
6649 const data = store.context.dataRef.current;
6650 const instance = useRefWithInit(() => data.hoverInteractionState ?? HoverInteraction.create()).current;
6651 if (!data.hoverInteractionState) {
6652 data.hoverInteractionState = instance;
6653 }
6654 useOnMount(data.hoverInteractionState.disposeEffect);
6655 return data.hoverInteractionState;
6656 }
6657
6658 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverFloatingInteraction.mjs
6659 function useHoverFloatingInteraction(context, parameters = {}) {
6660 const {
6661 enabled = true,
6662 closeDelay: closeDelayProp = 0,
6663 nodeId: nodeIdProp
6664 } = parameters;
6665 const store = "rootStore" in context ? context.rootStore : context;
6666 const open = store.useState("open");
6667 const floatingElement = store.useState("floatingElement");
6668 const domReferenceElement = store.useState("domReferenceElement");
6669 const {
6670 dataRef
6671 } = store.context;
6672 const tree = useFloatingTree();
6673 const parentId = useFloatingParentNodeId();
6674 const instance = useHoverInteractionSharedState(store);
6675 const childClosedTimeout = useTimeout();
6676 const isClickLikeOpenEvent2 = useStableCallback(() => {
6677 return isClickLikeOpenEvent(dataRef.current.openEvent?.type, instance.interactedInside);
6678 });
6679 const isHoverOpen = useStableCallback(() => {
6680 return isHoverOpenEvent(dataRef.current.openEvent?.type);
6681 });
6682 const clearPointerEvents = useStableCallback(() => {
6683 clearSafePolygonPointerEventsMutation(instance);
6684 });
6685 useIsoLayoutEffect(() => {
6686 if (!open) {
6687 instance.pointerType = void 0;
6688 instance.restTimeoutPending = false;
6689 instance.interactedInside = false;
6690 clearPointerEvents();
6691 }
6692 }, [open, instance, clearPointerEvents]);
6693 React27.useEffect(() => {
6694 return clearPointerEvents;
6695 }, [clearPointerEvents]);
6696 useIsoLayoutEffect(() => {
6697 if (!enabled) {
6698 return void 0;
6699 }
6700 if (open && instance.handleCloseOptions?.blockPointerEvents && isHoverOpen() && isElement(domReferenceElement) && floatingElement) {
6701 const ref = domReferenceElement;
6702 const floatingEl = floatingElement;
6703 const doc = ownerDocument(floatingElement);
6704 const parentFloating = tree?.nodesRef.current.find((node) => node.id === parentId)?.context?.elements.floating;
6705 if (parentFloating) {
6706 parentFloating.style.pointerEvents = "";
6707 }
6708 const cachedScopeElement = instance.pointerEventsScopeElement !== floatingEl ? instance.pointerEventsScopeElement : null;
6709 const parentScopeElement = parentFloating !== floatingEl ? parentFloating : null;
6710 const scopeElement = instance.handleCloseOptions?.getScope?.() ?? cachedScopeElement ?? parentScopeElement ?? ref.closest("[data-rootownerid]") ?? doc.body;
6711 applySafePolygonPointerEventsMutation(instance, {
6712 scopeElement,
6713 referenceElement: ref,
6714 floatingElement: floatingEl
6715 });
6716 return () => {
6717 clearPointerEvents();
6718 };
6719 }
6720 return void 0;
6721 }, [enabled, open, domReferenceElement, floatingElement, instance, isHoverOpen, tree, parentId, clearPointerEvents]);
6722 React27.useEffect(() => {
6723 if (!enabled) {
6724 return void 0;
6725 }
6726 function hasParentChildren() {
6727 return !!(tree && parentId && getNodeChildren(tree.nodesRef.current, parentId).length > 0);
6728 }
6729 function closeWithDelay(event) {
6730 const closeDelay = getDelay(closeDelayProp, "close", instance.pointerType);
6731 const close = () => {
6732 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6733 tree?.events.emit("floating.closed", event);
6734 };
6735 if (closeDelay) {
6736 instance.openChangeTimeout.start(closeDelay, close);
6737 } else {
6738 instance.openChangeTimeout.clear();
6739 close();
6740 }
6741 }
6742 function handleInteractInside(event) {
6743 const target = getTarget(event);
6744 if (!isInteractiveElement(target)) {
6745 instance.interactedInside = false;
6746 return;
6747 }
6748 instance.interactedInside = target?.closest("[aria-haspopup]") != null;
6749 }
6750 function onFloatingMouseEnter() {
6751 instance.openChangeTimeout.clear();
6752 childClosedTimeout.clear();
6753 tree?.events.off("floating.closed", onNodeClosed);
6754 clearPointerEvents();
6755 }
6756 function onFloatingMouseLeave(event) {
6757 if (hasParentChildren() && tree) {
6758 tree.events.on("floating.closed", onNodeClosed);
6759 return;
6760 }
6761 if (isTargetInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements)) {
6762 return;
6763 }
6764 const currentNodeId = dataRef.current.floatingContext?.nodeId ?? nodeIdProp;
6765 const relatedTarget = event.relatedTarget;
6766 const isMovingIntoDescendantFloating = tree && currentNodeId && isElement(relatedTarget) && getNodeChildren(tree.nodesRef.current, currentNodeId, false).some((node) => contains(node.context?.elements.floating, relatedTarget));
6767 if (isMovingIntoDescendantFloating) {
6768 return;
6769 }
6770 if (instance.handler) {
6771 instance.handler(event);
6772 return;
6773 }
6774 clearPointerEvents();
6775 if (isHoverOpen() && !isClickLikeOpenEvent2()) {
6776 closeWithDelay(event);
6777 }
6778 }
6779 function onNodeClosed(event) {
6780 if (!tree || !parentId || hasParentChildren()) {
6781 return;
6782 }
6783 childClosedTimeout.start(0, () => {
6784 tree.events.off("floating.closed", onNodeClosed);
6785 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6786 tree.events.emit("floating.closed", event);
6787 });
6788 }
6789 const floating = floatingElement;
6790 return mergeCleanups(floating && addEventListener(floating, "mouseenter", onFloatingMouseEnter), floating && addEventListener(floating, "mouseleave", onFloatingMouseLeave), floating && addEventListener(floating, "pointerdown", handleInteractInside, true), () => {
6791 tree?.events.off("floating.closed", onNodeClosed);
6792 });
6793 }, [enabled, floatingElement, store, dataRef, closeDelayProp, nodeIdProp, isHoverOpen, isClickLikeOpenEvent2, clearPointerEvents, instance, tree, parentId, childClosedTimeout]);
6794 }
6795
6796 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverReferenceInteraction.mjs
6797 var React28 = __toESM(require_react(), 1);
6798 var ReactDOM5 = __toESM(require_react_dom(), 1);
6799 var EMPTY_REF = {
6800 current: null
6801 };
6802 function useHoverReferenceInteraction(context, props = {}) {
6803 const {
6804 enabled = true,
6805 delay = 0,
6806 handleClose = null,
6807 mouseOnly = false,
6808 restMs = 0,
6809 move = true,
6810 triggerElementRef = EMPTY_REF,
6811 externalTree,
6812 isActiveTrigger = true,
6813 getHandleCloseContext,
6814 isClosing,
6815 shouldOpen: shouldOpenProp
6816 } = props;
6817 const store = "rootStore" in context ? context.rootStore : context;
6818 const {
6819 dataRef,
6820 events
6821 } = store.context;
6822 const tree = useFloatingTree(externalTree);
6823 const instance = useHoverInteractionSharedState(store);
6824 const isHoverCloseActiveRef = React28.useRef(false);
6825 const handleCloseRef = useValueAsRef(handleClose);
6826 const delayRef = useValueAsRef(delay);
6827 const restMsRef = useValueAsRef(restMs);
6828 const enabledRef = useValueAsRef(enabled);
6829 const shouldOpenRef = useValueAsRef(shouldOpenProp);
6830 const isClosingRef = useValueAsRef(isClosing);
6831 const isClickLikeOpenEvent2 = useStableCallback(() => {
6832 return isClickLikeOpenEvent(dataRef.current.openEvent?.type, instance.interactedInside);
6833 });
6834 const checkShouldOpen = useStableCallback(() => {
6835 return shouldOpenRef.current?.() !== false;
6836 });
6837 const isOverInactiveTrigger = useStableCallback((currentDomReference, currentTarget, target) => {
6838 const allTriggers = store.context.triggerElements;
6839 if (allTriggers.hasElement(currentTarget)) {
6840 return !currentDomReference || !contains(currentDomReference, currentTarget);
6841 }
6842 if (!isElement(target)) {
6843 return false;
6844 }
6845 const targetElement = target;
6846 return allTriggers.hasMatchingElement((trigger) => contains(trigger, targetElement)) && (!currentDomReference || !contains(currentDomReference, targetElement));
6847 });
6848 const cleanupMouseMoveHandler = useStableCallback(() => {
6849 if (!instance.handler) {
6850 return;
6851 }
6852 const doc = ownerDocument(store.select("domReferenceElement"));
6853 doc.removeEventListener("mousemove", instance.handler);
6854 instance.handler = void 0;
6855 });
6856 const clearPointerEvents = useStableCallback(() => {
6857 clearSafePolygonPointerEventsMutation(instance);
6858 });
6859 if (isActiveTrigger) {
6860 instance.handleCloseOptions = handleCloseRef.current?.__options;
6861 }
6862 React28.useEffect(() => cleanupMouseMoveHandler, [cleanupMouseMoveHandler]);
6863 React28.useEffect(() => {
6864 if (!enabled) {
6865 return void 0;
6866 }
6867 function onOpenChangeLocal(details) {
6868 if (!details.open) {
6869 isHoverCloseActiveRef.current = details.reason === reason_parts_exports.triggerHover;
6870 cleanupMouseMoveHandler();
6871 instance.openChangeTimeout.clear();
6872 instance.restTimeout.clear();
6873 instance.blockMouseMove = true;
6874 instance.restTimeoutPending = false;
6875 } else {
6876 isHoverCloseActiveRef.current = false;
6877 }
6878 }
6879 events.on("openchange", onOpenChangeLocal);
6880 return () => {
6881 events.off("openchange", onOpenChangeLocal);
6882 };
6883 }, [enabled, events, instance, cleanupMouseMoveHandler]);
6884 React28.useEffect(() => {
6885 if (!enabled) {
6886 return void 0;
6887 }
6888 function closeWithDelay(event, runElseBranch = true) {
6889 const closeDelay = getDelay(delayRef.current, "close", instance.pointerType);
6890 if (closeDelay) {
6891 instance.openChangeTimeout.start(closeDelay, () => {
6892 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6893 tree?.events.emit("floating.closed", event);
6894 });
6895 } else if (runElseBranch) {
6896 instance.openChangeTimeout.clear();
6897 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
6898 tree?.events.emit("floating.closed", event);
6899 }
6900 }
6901 const trigger = triggerElementRef.current ?? (isActiveTrigger ? store.select("domReferenceElement") : null);
6902 if (!isElement(trigger)) {
6903 return void 0;
6904 }
6905 function onMouseEnter(event) {
6906 instance.openChangeTimeout.clear();
6907 instance.blockMouseMove = false;
6908 if (mouseOnly && !isMouseLikePointerType(instance.pointerType)) {
6909 return;
6910 }
6911 const restMsValue = getRestMs(restMsRef.current);
6912 const openDelay = getDelay(delayRef.current, "open", instance.pointerType);
6913 const eventTarget = getTarget(event);
6914 const currentTarget = event.currentTarget ?? null;
6915 const currentDomReference = store.select("domReferenceElement");
6916 let triggerNode = currentTarget;
6917 if (isElement(eventTarget) && !store.context.triggerElements.hasElement(eventTarget)) {
6918 for (const triggerElement of store.context.triggerElements.elements()) {
6919 if (contains(triggerElement, eventTarget)) {
6920 triggerNode = triggerElement;
6921 break;
6922 }
6923 }
6924 }
6925 if (isElement(currentTarget) && isElement(currentDomReference) && !store.context.triggerElements.hasElement(currentTarget) && contains(currentTarget, currentDomReference)) {
6926 triggerNode = currentDomReference;
6927 }
6928 const isOverInactive = triggerNode == null ? false : isOverInactiveTrigger(currentDomReference, triggerNode, eventTarget);
6929 const isOpen = store.select("open");
6930 const isInClosingTransition = isClosingRef.current?.() ?? store.select("transitionStatus") === "ending";
6931 const isHoverCloseTransition = !isOpen && isInClosingTransition && isHoverCloseActiveRef.current;
6932 const isReenteringSameTriggerDuringCloseTransition = !isOverInactive && isElement(triggerNode) && isElement(currentDomReference) && contains(currentDomReference, triggerNode) && isHoverCloseTransition;
6933 const isRestOnlyDelay = restMsValue > 0 && !openDelay;
6934 const shouldOpenImmediately = isOverInactive && (isOpen || isHoverCloseTransition) || isReenteringSameTriggerDuringCloseTransition;
6935 const shouldOpen = !isOpen || isOverInactive;
6936 if (shouldOpenImmediately) {
6937 if (checkShouldOpen()) {
6938 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode));
6939 }
6940 return;
6941 }
6942 if (isRestOnlyDelay) {
6943 return;
6944 }
6945 if (openDelay) {
6946 instance.openChangeTimeout.start(openDelay, () => {
6947 if (shouldOpen && checkShouldOpen()) {
6948 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode));
6949 }
6950 });
6951 } else if (shouldOpen) {
6952 if (checkShouldOpen()) {
6953 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode));
6954 }
6955 }
6956 }
6957 function onMouseLeave(event) {
6958 if (isClickLikeOpenEvent2()) {
6959 clearPointerEvents();
6960 return;
6961 }
6962 cleanupMouseMoveHandler();
6963 const domReferenceElement = store.select("domReferenceElement");
6964 const doc = ownerDocument(domReferenceElement);
6965 instance.restTimeout.clear();
6966 instance.restTimeoutPending = false;
6967 const handleCloseContextBase = dataRef.current.floatingContext ?? getHandleCloseContext?.();
6968 if (isTargetInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements)) {
6969 return;
6970 }
6971 if (handleCloseRef.current && handleCloseContextBase) {
6972 if (!store.select("open")) {
6973 instance.openChangeTimeout.clear();
6974 }
6975 const currentTrigger = triggerElementRef.current;
6976 instance.handler = handleCloseRef.current({
6977 ...handleCloseContextBase,
6978 tree,
6979 x: event.clientX,
6980 y: event.clientY,
6981 onClose() {
6982 clearPointerEvents();
6983 cleanupMouseMoveHandler();
6984 if (enabledRef.current && !isClickLikeOpenEvent2() && currentTrigger === store.select("domReferenceElement")) {
6985 closeWithDelay(event, true);
6986 }
6987 }
6988 });
6989 doc.addEventListener("mousemove", instance.handler);
6990 instance.handler(event);
6991 return;
6992 }
6993 const shouldClose = instance.pointerType === "touch" ? !contains(store.select("floatingElement"), event.relatedTarget) : true;
6994 if (shouldClose) {
6995 closeWithDelay(event);
6996 }
6997 }
6998 if (move) {
6999 return mergeCleanups(addEventListener(trigger, "mousemove", onMouseEnter, {
7000 once: true
7001 }), addEventListener(trigger, "mouseenter", onMouseEnter), addEventListener(trigger, "mouseleave", onMouseLeave));
7002 }
7003 return mergeCleanups(addEventListener(trigger, "mouseenter", onMouseEnter), addEventListener(trigger, "mouseleave", onMouseLeave));
7004 }, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef, store, enabled, handleCloseRef, instance, isActiveTrigger, isOverInactiveTrigger, isClickLikeOpenEvent2, mouseOnly, move, restMsRef, triggerElementRef, tree, enabledRef, getHandleCloseContext, isClosingRef, checkShouldOpen]);
7005 return React28.useMemo(() => {
7006 if (!enabled) {
7007 return void 0;
7008 }
7009 function setPointerRef(event) {
7010 instance.pointerType = event.pointerType;
7011 }
7012 return {
7013 onPointerDown: setPointerRef,
7014 onPointerEnter: setPointerRef,
7015 onMouseMove(event) {
7016 const {
7017 nativeEvent
7018 } = event;
7019 const trigger = event.currentTarget;
7020 const currentDomReference = store.select("domReferenceElement");
7021 const currentOpen = store.select("open");
7022 const isOverInactive = isOverInactiveTrigger(currentDomReference, trigger, event.target);
7023 if (mouseOnly && !isMouseLikePointerType(instance.pointerType)) {
7024 return;
7025 }
7026 if (currentOpen && isOverInactive && instance.handleCloseOptions?.blockPointerEvents) {
7027 const floatingElement = store.select("floatingElement");
7028 if (floatingElement) {
7029 const scopeElement = instance.handleCloseOptions?.getScope?.() ?? trigger.ownerDocument.body;
7030 applySafePolygonPointerEventsMutation(instance, {
7031 scopeElement,
7032 referenceElement: trigger,
7033 floatingElement
7034 });
7035 }
7036 }
7037 const restMsValue = getRestMs(restMsRef.current);
7038 if (currentOpen && !isOverInactive || restMsValue === 0) {
7039 return;
7040 }
7041 if (!isOverInactive && instance.restTimeoutPending && event.movementX ** 2 + event.movementY ** 2 < 2) {
7042 return;
7043 }
7044 instance.restTimeout.clear();
7045 function handleMouseMove() {
7046 instance.restTimeoutPending = false;
7047 if (isClickLikeOpenEvent2()) {
7048 return;
7049 }
7050 const latestOpen = store.select("open");
7051 if (!instance.blockMouseMove && (!latestOpen || isOverInactive) && checkShouldOpen()) {
7052 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, nativeEvent, trigger));
7053 }
7054 }
7055 if (instance.pointerType === "touch") {
7056 ReactDOM5.flushSync(() => {
7057 handleMouseMove();
7058 });
7059 } else if (isOverInactive && currentOpen) {
7060 handleMouseMove();
7061 } else {
7062 instance.restTimeoutPending = true;
7063 instance.restTimeout.start(restMsValue, handleMouseMove);
7064 }
7065 }
7066 };
7067 }, [enabled, instance, isClickLikeOpenEvent2, isOverInactiveTrigger, mouseOnly, store, restMsRef, checkShouldOpen]);
7068 }
7069
7070 // node_modules/@base-ui/react/floating-ui-react/safePolygon.mjs
7071 var CURSOR_SPEED_THRESHOLD = 0.1;
7072 var CURSOR_SPEED_THRESHOLD_SQUARED = CURSOR_SPEED_THRESHOLD * CURSOR_SPEED_THRESHOLD;
7073 var POLYGON_BUFFER = 0.5;
7074 function hasIntersectingEdge(pointX, pointY, xi, yi, xj, yj) {
7075 return yi >= pointY !== yj >= pointY && pointX <= (xj - xi) * (pointY - yi) / (yj - yi) + xi;
7076 }
7077 function isPointInQuadrilateral(pointX, pointY, x1, y1, x2, y2, x3, y3, x4, y4) {
7078 let isInsideValue = false;
7079 if (hasIntersectingEdge(pointX, pointY, x1, y1, x2, y2)) {
7080 isInsideValue = !isInsideValue;
7081 }
7082 if (hasIntersectingEdge(pointX, pointY, x2, y2, x3, y3)) {
7083 isInsideValue = !isInsideValue;
7084 }
7085 if (hasIntersectingEdge(pointX, pointY, x3, y3, x4, y4)) {
7086 isInsideValue = !isInsideValue;
7087 }
7088 if (hasIntersectingEdge(pointX, pointY, x4, y4, x1, y1)) {
7089 isInsideValue = !isInsideValue;
7090 }
7091 return isInsideValue;
7092 }
7093 function isInsideRect(pointX, pointY, rect) {
7094 return pointX >= rect.x && pointX <= rect.x + rect.width && pointY >= rect.y && pointY <= rect.y + rect.height;
7095 }
7096 function isInsideAxisAlignedRect(pointX, pointY, x1, y1, x2, y2) {
7097 const minX = Math.min(x1, x2);
7098 const maxX = Math.max(x1, x2);
7099 const minY = Math.min(y1, y2);
7100 const maxY = Math.max(y1, y2);
7101 return pointX >= minX && pointX <= maxX && pointY >= minY && pointY <= maxY;
7102 }
7103 function safePolygon(options = {}) {
7104 const {
7105 blockPointerEvents = false
7106 } = options;
7107 const timeout = new Timeout();
7108 const fn = ({
7109 x: x2,
7110 y: y2,
7111 placement,
7112 elements,
7113 onClose,
7114 nodeId,
7115 tree
7116 }) => {
7117 const side = placement?.split("-")[0];
7118 let hasLanded = false;
7119 let lastX = null;
7120 let lastY = null;
7121 let lastCursorTime = typeof performance !== "undefined" ? performance.now() : 0;
7122 function isCursorMovingSlowly(nextX, nextY) {
7123 const currentTime = performance.now();
7124 const elapsedTime = currentTime - lastCursorTime;
7125 if (lastX === null || lastY === null || elapsedTime === 0) {
7126 lastX = nextX;
7127 lastY = nextY;
7128 lastCursorTime = currentTime;
7129 return false;
7130 }
7131 const deltaX = nextX - lastX;
7132 const deltaY = nextY - lastY;
7133 const distanceSquared = deltaX * deltaX + deltaY * deltaY;
7134 const thresholdSquared = elapsedTime * elapsedTime * CURSOR_SPEED_THRESHOLD_SQUARED;
7135 lastX = nextX;
7136 lastY = nextY;
7137 lastCursorTime = currentTime;
7138 return distanceSquared < thresholdSquared;
7139 }
7140 function close() {
7141 timeout.clear();
7142 onClose();
7143 }
7144 return function onMouseMove(event) {
7145 timeout.clear();
7146 const domReference = elements.domReference;
7147 const floating = elements.floating;
7148 if (!domReference || !floating || side == null || x2 == null || y2 == null) {
7149 return void 0;
7150 }
7151 const {
7152 clientX,
7153 clientY
7154 } = event;
7155 const target = getTarget(event);
7156 const isLeave = event.type === "mouseleave";
7157 const isOverFloatingEl = contains(floating, target);
7158 const isOverReferenceEl = contains(domReference, target);
7159 if (isOverFloatingEl) {
7160 hasLanded = true;
7161 if (!isLeave) {
7162 return void 0;
7163 }
7164 }
7165 if (isOverReferenceEl) {
7166 hasLanded = false;
7167 if (!isLeave) {
7168 hasLanded = true;
7169 return void 0;
7170 }
7171 }
7172 if (isLeave && isElement(event.relatedTarget) && contains(floating, event.relatedTarget)) {
7173 return void 0;
7174 }
7175 function hasOpenChildNode() {
7176 return Boolean(tree && getNodeChildren(tree.nodesRef.current, nodeId).length > 0);
7177 }
7178 function closeIfNoOpenChild() {
7179 if (!hasOpenChildNode()) {
7180 close();
7181 }
7182 }
7183 if (hasOpenChildNode()) {
7184 return void 0;
7185 }
7186 const refRect = domReference.getBoundingClientRect();
7187 const rect = floating.getBoundingClientRect();
7188 const cursorLeaveFromRight = x2 > rect.right - rect.width / 2;
7189 const cursorLeaveFromBottom = y2 > rect.bottom - rect.height / 2;
7190 const isFloatingWider = rect.width > refRect.width;
7191 const isFloatingTaller = rect.height > refRect.height;
7192 const left = (isFloatingWider ? refRect : rect).left;
7193 const right = (isFloatingWider ? refRect : rect).right;
7194 const top = (isFloatingTaller ? refRect : rect).top;
7195 const bottom = (isFloatingTaller ? refRect : rect).bottom;
7196 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) {
7197 closeIfNoOpenChild();
7198 return void 0;
7199 }
7200 let isInsideTroughRect = false;
7201 switch (side) {
7202 case "top":
7203 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, left, refRect.top + 1, right, rect.bottom - 1);
7204 break;
7205 case "bottom":
7206 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, left, rect.top + 1, right, refRect.bottom - 1);
7207 break;
7208 case "left":
7209 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, rect.right - 1, bottom, refRect.left + 1, top);
7210 break;
7211 case "right":
7212 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, refRect.right - 1, bottom, rect.left + 1, top);
7213 break;
7214 default:
7215 }
7216 if (isInsideTroughRect) {
7217 return void 0;
7218 }
7219 if (hasLanded && !isInsideRect(clientX, clientY, refRect)) {
7220 closeIfNoOpenChild();
7221 return void 0;
7222 }
7223 if (!isLeave && isCursorMovingSlowly(clientX, clientY)) {
7224 closeIfNoOpenChild();
7225 return void 0;
7226 }
7227 let isInsidePolygon = false;
7228 switch (side) {
7229 case "top": {
7230 const cursorXOffset = isFloatingWider ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7231 const cursorPointOneX = isFloatingWider ? x2 + cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7232 const cursorPointTwoX = isFloatingWider ? x2 - cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7233 const cursorPointY = y2 + POLYGON_BUFFER + 1;
7234 const commonYLeft = cursorLeaveFromRight ? rect.bottom - POLYGON_BUFFER : isFloatingWider ? rect.bottom - POLYGON_BUFFER : rect.top;
7235 const commonYRight = cursorLeaveFromRight ? isFloatingWider ? rect.bottom - POLYGON_BUFFER : rect.top : rect.bottom - POLYGON_BUFFER;
7236 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointOneX, cursorPointY, cursorPointTwoX, cursorPointY, rect.left, commonYLeft, rect.right, commonYRight);
7237 break;
7238 }
7239 case "bottom": {
7240 const cursorXOffset = isFloatingWider ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7241 const cursorPointOneX = isFloatingWider ? x2 + cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7242 const cursorPointTwoX = isFloatingWider ? x2 - cursorXOffset : cursorLeaveFromRight ? x2 + cursorXOffset : x2 - cursorXOffset;
7243 const cursorPointY = y2 - POLYGON_BUFFER;
7244 const commonYLeft = cursorLeaveFromRight ? rect.top + POLYGON_BUFFER : isFloatingWider ? rect.top + POLYGON_BUFFER : rect.bottom;
7245 const commonYRight = cursorLeaveFromRight ? isFloatingWider ? rect.top + POLYGON_BUFFER : rect.bottom : rect.top + POLYGON_BUFFER;
7246 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointOneX, cursorPointY, cursorPointTwoX, cursorPointY, rect.left, commonYLeft, rect.right, commonYRight);
7247 break;
7248 }
7249 case "left": {
7250 const cursorYOffset = isFloatingTaller ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7251 const cursorPointOneY = isFloatingTaller ? y2 + cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7252 const cursorPointTwoY = isFloatingTaller ? y2 - cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7253 const cursorPointX = x2 + POLYGON_BUFFER + 1;
7254 const commonXTop = cursorLeaveFromBottom ? rect.right - POLYGON_BUFFER : isFloatingTaller ? rect.right - POLYGON_BUFFER : rect.left;
7255 const commonXBottom = cursorLeaveFromBottom ? isFloatingTaller ? rect.right - POLYGON_BUFFER : rect.left : rect.right - POLYGON_BUFFER;
7256 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, commonXTop, rect.top, commonXBottom, rect.bottom, cursorPointX, cursorPointOneY, cursorPointX, cursorPointTwoY);
7257 break;
7258 }
7259 case "right": {
7260 const cursorYOffset = isFloatingTaller ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4;
7261 const cursorPointOneY = isFloatingTaller ? y2 + cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7262 const cursorPointTwoY = isFloatingTaller ? y2 - cursorYOffset : cursorLeaveFromBottom ? y2 + cursorYOffset : y2 - cursorYOffset;
7263 const cursorPointX = x2 - POLYGON_BUFFER;
7264 const commonXTop = cursorLeaveFromBottom ? rect.left + POLYGON_BUFFER : isFloatingTaller ? rect.left + POLYGON_BUFFER : rect.right;
7265 const commonXBottom = cursorLeaveFromBottom ? isFloatingTaller ? rect.left + POLYGON_BUFFER : rect.right : rect.left + POLYGON_BUFFER;
7266 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointX, cursorPointOneY, cursorPointX, cursorPointTwoY, commonXTop, rect.top, commonXBottom, rect.bottom);
7267 break;
7268 }
7269 default:
7270 }
7271 if (!isInsidePolygon) {
7272 closeIfNoOpenChild();
7273 } else if (!hasLanded) {
7274 timeout.start(40, closeIfNoOpenChild);
7275 }
7276 return void 0;
7277 };
7278 };
7279 fn.__options = {
7280 ...options,
7281 blockPointerEvents
7282 };
7283 return fn;
7284 }
7285
7286 // node_modules/@base-ui/react/utils/popupStateMapping.mjs
7287 var CommonPopupDataAttributes = (function(CommonPopupDataAttributes2) {
7288 CommonPopupDataAttributes2["open"] = "data-open";
7289 CommonPopupDataAttributes2["closed"] = "data-closed";
7290 CommonPopupDataAttributes2[CommonPopupDataAttributes2["startingStyle"] = TransitionStatusDataAttributes.startingStyle] = "startingStyle";
7291 CommonPopupDataAttributes2[CommonPopupDataAttributes2["endingStyle"] = TransitionStatusDataAttributes.endingStyle] = "endingStyle";
7292 CommonPopupDataAttributes2["anchorHidden"] = "data-anchor-hidden";
7293 CommonPopupDataAttributes2["side"] = "data-side";
7294 CommonPopupDataAttributes2["align"] = "data-align";
7295 return CommonPopupDataAttributes2;
7296 })({});
7297 var CommonTriggerDataAttributes = /* @__PURE__ */ (function(CommonTriggerDataAttributes2) {
7298 CommonTriggerDataAttributes2["popupOpen"] = "data-popup-open";
7299 CommonTriggerDataAttributes2["pressed"] = "data-pressed";
7300 return CommonTriggerDataAttributes2;
7301 })({});
7302 var TRIGGER_HOOK = {
7303 [CommonTriggerDataAttributes.popupOpen]: ""
7304 };
7305 var PRESSABLE_TRIGGER_HOOK = {
7306 [CommonTriggerDataAttributes.popupOpen]: "",
7307 [CommonTriggerDataAttributes.pressed]: ""
7308 };
7309 var POPUP_OPEN_HOOK = {
7310 [CommonPopupDataAttributes.open]: ""
7311 };
7312 var POPUP_CLOSED_HOOK = {
7313 [CommonPopupDataAttributes.closed]: ""
7314 };
7315 var ANCHOR_HIDDEN_HOOK = {
7316 [CommonPopupDataAttributes.anchorHidden]: ""
7317 };
7318 var triggerOpenStateMapping = {
7319 open(value) {
7320 if (value) {
7321 return TRIGGER_HOOK;
7322 }
7323 return null;
7324 }
7325 };
7326 var popupStateMapping = {
7327 open(value) {
7328 if (value) {
7329 return POPUP_OPEN_HOOK;
7330 }
7331 return POPUP_CLOSED_HOOK;
7332 },
7333 anchorHidden(value) {
7334 if (value) {
7335 return ANCHOR_HIDDEN_HOOK;
7336 }
7337 return null;
7338 }
7339 };
7340
7341 // node_modules/@base-ui/utils/inertValue.mjs
7342 function inertValue(value) {
7343 if (isReactVersionAtLeast(19)) {
7344 return value;
7345 }
7346 return value ? "true" : void 0;
7347 }
7348
7349 // node_modules/@base-ui/react/utils/useAnchorPositioning.mjs
7350 var React29 = __toESM(require_react(), 1);
7351
7352 // node_modules/@base-ui/react/floating-ui-react/middleware/arrow.mjs
7353 var baseArrow = (options) => ({
7354 name: "arrow",
7355 options,
7356 async fn(state) {
7357 const {
7358 x: x2,
7359 y: y2,
7360 placement,
7361 rects,
7362 platform: platform3,
7363 elements,
7364 middlewareData
7365 } = state;
7366 const {
7367 element,
7368 padding = 0,
7369 offsetParent = "real"
7370 } = evaluate(options, state) || {};
7371 if (element == null) {
7372 return {};
7373 }
7374 const paddingObject = getPaddingObject(padding);
7375 const coords = {
7376 x: x2,
7377 y: y2
7378 };
7379 const axis = getAlignmentAxis(placement);
7380 const length = getAxisLength(axis);
7381 const arrowDimensions = await platform3.getDimensions(element);
7382 const isYAxis = axis === "y";
7383 const minProp = isYAxis ? "top" : "left";
7384 const maxProp = isYAxis ? "bottom" : "right";
7385 const clientProp = isYAxis ? "clientHeight" : "clientWidth";
7386 const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];
7387 const startDiff = coords[axis] - rects.reference[axis];
7388 const arrowOffsetParent = offsetParent === "real" ? await platform3.getOffsetParent?.(element) : elements.floating;
7389 let clientSize = elements.floating[clientProp] || rects.floating[length];
7390 if (!clientSize || !await platform3.isElement?.(arrowOffsetParent)) {
7391 clientSize = elements.floating[clientProp] || rects.floating[length];
7392 }
7393 const centerToReference = endDiff / 2 - startDiff / 2;
7394 const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;
7395 const minPadding = Math.min(paddingObject[minProp], largestPossiblePadding);
7396 const maxPadding = Math.min(paddingObject[maxProp], largestPossiblePadding);
7397 const min2 = minPadding;
7398 const max2 = clientSize - arrowDimensions[length] - maxPadding;
7399 const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;
7400 const offset4 = clamp(min2, center, max2);
7401 const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset4 && rects.reference[length] / 2 - (center < min2 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;
7402 const alignmentOffset = shouldAddOffset ? center < min2 ? center - min2 : center - max2 : 0;
7403 return {
7404 [axis]: coords[axis] + alignmentOffset,
7405 data: {
7406 [axis]: offset4,
7407 centerOffset: center - offset4 - alignmentOffset,
7408 ...shouldAddOffset && {
7409 alignmentOffset
7410 }
7411 },
7412 reset: shouldAddOffset
7413 };
7414 }
7415 });
7416 var arrow4 = (options, deps) => ({
7417 ...baseArrow(options),
7418 options: [options, deps]
7419 });
7420
7421 // node_modules/@base-ui/react/utils/hideMiddleware.mjs
7422 var nativeHideFn = hide3().fn;
7423 var hide4 = {
7424 name: "hide",
7425 async fn(state) {
7426 const {
7427 width,
7428 height,
7429 x: x2,
7430 y: y2
7431 } = state.rects.reference;
7432 const anchorHidden = width === 0 && height === 0 && x2 === 0 && y2 === 0;
7433 const nativeHideResult = await nativeHideFn(state);
7434 return {
7435 data: {
7436 referenceHidden: nativeHideResult.data?.referenceHidden || anchorHidden
7437 }
7438 };
7439 }
7440 };
7441
7442 // node_modules/@base-ui/react/utils/adaptiveOriginMiddleware.mjs
7443 var DEFAULT_SIDES = {
7444 sideX: "left",
7445 sideY: "top"
7446 };
7447 var adaptiveOrigin = {
7448 name: "adaptiveOrigin",
7449 async fn(state) {
7450 const {
7451 x: rawX,
7452 y: rawY,
7453 rects: {
7454 floating: floatRect
7455 },
7456 elements: {
7457 floating
7458 },
7459 platform: platform3,
7460 strategy,
7461 placement
7462 } = state;
7463 const win = getWindow(floating);
7464 const styles = win.getComputedStyle(floating);
7465 const hasTransition = styles.transitionDuration !== "0s" && styles.transitionDuration !== "";
7466 if (!hasTransition) {
7467 return {
7468 x: rawX,
7469 y: rawY,
7470 data: DEFAULT_SIDES
7471 };
7472 }
7473 const offsetParent = await platform3.getOffsetParent?.(floating);
7474 let offsetDimensions = {
7475 width: 0,
7476 height: 0
7477 };
7478 if (strategy === "fixed" && win?.visualViewport) {
7479 offsetDimensions = {
7480 width: win.visualViewport.width,
7481 height: win.visualViewport.height
7482 };
7483 } else if (offsetParent === win) {
7484 const doc = ownerDocument(floating);
7485 offsetDimensions = {
7486 width: doc.documentElement.clientWidth,
7487 height: doc.documentElement.clientHeight
7488 };
7489 } else if (await platform3.isElement?.(offsetParent)) {
7490 offsetDimensions = await platform3.getDimensions(offsetParent);
7491 }
7492 const currentSide = getSide(placement);
7493 let x2 = rawX;
7494 let y2 = rawY;
7495 if (currentSide === "left") {
7496 x2 = offsetDimensions.width - (rawX + floatRect.width);
7497 }
7498 if (currentSide === "top") {
7499 y2 = offsetDimensions.height - (rawY + floatRect.height);
7500 }
7501 const sideX = currentSide === "left" ? "right" : DEFAULT_SIDES.sideX;
7502 const sideY = currentSide === "top" ? "bottom" : DEFAULT_SIDES.sideY;
7503 return {
7504 x: x2,
7505 y: y2,
7506 data: {
7507 sideX,
7508 sideY
7509 }
7510 };
7511 }
7512 };
7513
7514 // node_modules/@base-ui/react/utils/useAnchorPositioning.mjs
7515 function getLogicalSide(sideParam, renderedSide, isRtl) {
7516 const isLogicalSideParam = sideParam === "inline-start" || sideParam === "inline-end";
7517 const logicalRight = isRtl ? "inline-start" : "inline-end";
7518 const logicalLeft = isRtl ? "inline-end" : "inline-start";
7519 return {
7520 top: "top",
7521 right: isLogicalSideParam ? logicalRight : "right",
7522 bottom: "bottom",
7523 left: isLogicalSideParam ? logicalLeft : "left"
7524 }[renderedSide];
7525 }
7526 function getOffsetData(state, sideParam, isRtl) {
7527 const {
7528 rects,
7529 placement
7530 } = state;
7531 const data = {
7532 side: getLogicalSide(sideParam, getSide(placement), isRtl),
7533 align: getAlignment(placement) || "center",
7534 anchor: {
7535 width: rects.reference.width,
7536 height: rects.reference.height
7537 },
7538 positioner: {
7539 width: rects.floating.width,
7540 height: rects.floating.height
7541 }
7542 };
7543 return data;
7544 }
7545 function useAnchorPositioning(params) {
7546 const {
7547 // Public parameters
7548 anchor,
7549 positionMethod = "absolute",
7550 side: sideParam = "bottom",
7551 sideOffset = 0,
7552 align = "center",
7553 alignOffset = 0,
7554 collisionBoundary,
7555 collisionPadding: collisionPaddingParam = 5,
7556 sticky = false,
7557 arrowPadding = 5,
7558 disableAnchorTracking = false,
7559 inline: inlineMiddleware,
7560 // Private parameters
7561 keepMounted = false,
7562 floatingRootContext,
7563 mounted,
7564 collisionAvoidance,
7565 shiftCrossAxis = false,
7566 nodeId,
7567 adaptiveOrigin: adaptiveOrigin2,
7568 lazyFlip = false,
7569 externalTree
7570 } = params;
7571 const [mountSide, setMountSide] = React29.useState(null);
7572 if (!mounted && mountSide !== null) {
7573 setMountSide(null);
7574 }
7575 const collisionAvoidanceSide = collisionAvoidance.side || "flip";
7576 const collisionAvoidanceAlign = collisionAvoidance.align || "flip";
7577 const collisionAvoidanceFallbackAxisSide = collisionAvoidance.fallbackAxisSide || "end";
7578 const anchorFn = typeof anchor === "function" ? anchor : void 0;
7579 const anchorFnCallback = useStableCallback(anchorFn);
7580 const anchorDep = anchorFn ? anchorFnCallback : anchor;
7581 const anchorValueRef = useValueAsRef(anchor);
7582 const mountedRef = useValueAsRef(mounted);
7583 const direction = useDirection();
7584 const isRtl = direction === "rtl";
7585 const side = mountSide || {
7586 top: "top",
7587 right: "right",
7588 bottom: "bottom",
7589 left: "left",
7590 "inline-end": isRtl ? "left" : "right",
7591 "inline-start": isRtl ? "right" : "left"
7592 }[sideParam];
7593 const placement = align === "center" ? side : `${side}-${align}`;
7594 let collisionPadding = collisionPaddingParam;
7595 const bias = 1;
7596 const biasTop = sideParam === "bottom" ? bias : 0;
7597 const biasBottom = sideParam === "top" ? bias : 0;
7598 const biasLeft = sideParam === "right" ? bias : 0;
7599 const biasRight = sideParam === "left" ? bias : 0;
7600 if (typeof collisionPadding === "number") {
7601 collisionPadding = {
7602 top: collisionPadding + biasTop,
7603 right: collisionPadding + biasRight,
7604 bottom: collisionPadding + biasBottom,
7605 left: collisionPadding + biasLeft
7606 };
7607 } else if (collisionPadding) {
7608 collisionPadding = {
7609 top: (collisionPadding.top || 0) + biasTop,
7610 right: (collisionPadding.right || 0) + biasRight,
7611 bottom: (collisionPadding.bottom || 0) + biasBottom,
7612 left: (collisionPadding.left || 0) + biasLeft
7613 };
7614 }
7615 const commonCollisionProps = {
7616 boundary: collisionBoundary === "clipping-ancestors" ? "clippingAncestors" : collisionBoundary,
7617 padding: collisionPadding
7618 };
7619 const arrowRef = React29.useRef(null);
7620 const sideOffsetRef = useValueAsRef(sideOffset);
7621 const alignOffsetRef = useValueAsRef(alignOffset);
7622 const sideOffsetDep = typeof sideOffset !== "function" ? sideOffset : 0;
7623 const alignOffsetDep = typeof alignOffset !== "function" ? alignOffset : 0;
7624 const middleware = [];
7625 if (inlineMiddleware) {
7626 middleware.push(inlineMiddleware);
7627 }
7628 middleware.push(offset3((state) => {
7629 const data = getOffsetData(state, sideParam, isRtl);
7630 const sideAxis = typeof sideOffsetRef.current === "function" ? sideOffsetRef.current(data) : sideOffsetRef.current;
7631 const alignAxis = typeof alignOffsetRef.current === "function" ? alignOffsetRef.current(data) : alignOffsetRef.current;
7632 return {
7633 mainAxis: sideAxis,
7634 crossAxis: alignAxis,
7635 alignmentAxis: alignAxis
7636 };
7637 }, [sideOffsetDep, alignOffsetDep, isRtl, sideParam]));
7638 const shiftDisabled = collisionAvoidanceAlign === "none" && collisionAvoidanceSide !== "shift";
7639 const crossAxisShiftEnabled = !shiftDisabled && (sticky || shiftCrossAxis || collisionAvoidanceSide === "shift");
7640 const flipMiddleware = collisionAvoidanceSide === "none" ? null : flip3({
7641 ...commonCollisionProps,
7642 // Ensure the popup flips if it's been limited by its --available-height and it resizes.
7643 // Since the size() padding is smaller than the flip() padding, flip() will take precedence.
7644 padding: {
7645 top: collisionPadding.top + bias,
7646 right: collisionPadding.right + bias,
7647 bottom: collisionPadding.bottom + bias,
7648 left: collisionPadding.left + bias
7649 },
7650 mainAxis: !shiftCrossAxis && collisionAvoidanceSide === "flip",
7651 crossAxis: collisionAvoidanceAlign === "flip" ? "alignment" : false,
7652 fallbackAxisSideDirection: collisionAvoidanceFallbackAxisSide
7653 });
7654 const shiftMiddleware = shiftDisabled ? null : shift3((data) => {
7655 const html = ownerDocument(data.elements.floating).documentElement;
7656 return {
7657 ...commonCollisionProps,
7658 // Use the Layout Viewport to avoid shifting around when pinch-zooming
7659 // for context menus.
7660 rootBoundary: shiftCrossAxis ? {
7661 x: 0,
7662 y: 0,
7663 width: html.clientWidth,
7664 height: html.clientHeight
7665 } : void 0,
7666 mainAxis: collisionAvoidanceAlign !== "none",
7667 crossAxis: crossAxisShiftEnabled,
7668 limiter: sticky || shiftCrossAxis ? void 0 : limitShift3((limitData) => {
7669 if (!arrowRef.current) {
7670 return {};
7671 }
7672 const {
7673 width,
7674 height
7675 } = arrowRef.current.getBoundingClientRect();
7676 const sideAxis = getSideAxis(getSide(limitData.placement));
7677 const arrowSize = sideAxis === "y" ? width : height;
7678 const offsetAmount = sideAxis === "y" ? collisionPadding.left + collisionPadding.right : collisionPadding.top + collisionPadding.bottom;
7679 return {
7680 offset: arrowSize / 2 + offsetAmount / 2
7681 };
7682 })
7683 };
7684 }, [commonCollisionProps, sticky, shiftCrossAxis, collisionPadding, collisionAvoidanceAlign]);
7685 if (collisionAvoidanceSide === "shift" || collisionAvoidanceAlign === "shift" || align === "center") {
7686 middleware.push(shiftMiddleware, flipMiddleware);
7687 } else {
7688 middleware.push(flipMiddleware, shiftMiddleware);
7689 }
7690 middleware.push(size3({
7691 ...commonCollisionProps,
7692 apply({
7693 elements: {
7694 floating
7695 },
7696 availableWidth,
7697 availableHeight,
7698 rects
7699 }) {
7700 if (!mountedRef.current) {
7701 return;
7702 }
7703 const floatingStyle = floating.style;
7704 floatingStyle.setProperty("--available-width", `${availableWidth}px`);
7705 floatingStyle.setProperty("--available-height", `${availableHeight}px`);
7706 const dpr = getWindow(floating).devicePixelRatio || 1;
7707 const {
7708 x: x3,
7709 y: y3,
7710 width,
7711 height
7712 } = rects.reference;
7713 const anchorWidth = (Math.round((x3 + width) * dpr) - Math.round(x3 * dpr)) / dpr;
7714 const anchorHeight = (Math.round((y3 + height) * dpr) - Math.round(y3 * dpr)) / dpr;
7715 floatingStyle.setProperty("--anchor-width", `${anchorWidth}px`);
7716 floatingStyle.setProperty("--anchor-height", `${anchorHeight}px`);
7717 }
7718 }), arrow4((state) => ({
7719 // `transform-origin` calculations rely on an element existing. If the arrow hasn't been set,
7720 // we'll create a fake element.
7721 element: arrowRef.current || ownerDocument(state.elements.floating).createElement("div"),
7722 padding: arrowPadding,
7723 offsetParent: "floating"
7724 }), [arrowPadding]), {
7725 name: "transformOrigin",
7726 fn(state) {
7727 const {
7728 elements: elements2,
7729 middlewareData: middlewareData2,
7730 placement: renderedPlacement2,
7731 rects,
7732 y: y3
7733 } = state;
7734 const currentRenderedSide = getSide(renderedPlacement2);
7735 const currentRenderedAxis = getSideAxis(currentRenderedSide);
7736 const arrowEl = arrowRef.current;
7737 const arrowX = middlewareData2.arrow?.x || 0;
7738 const arrowY = middlewareData2.arrow?.y || 0;
7739 const arrowWidth = arrowEl?.clientWidth || 0;
7740 const arrowHeight = arrowEl?.clientHeight || 0;
7741 const transformX = arrowX + arrowWidth / 2;
7742 const transformY = arrowY + arrowHeight / 2;
7743 const shiftY = Math.abs(middlewareData2.shift?.y || 0);
7744 const halfAnchorHeight = rects.reference.height / 2;
7745 const sideOffsetValue = typeof sideOffset === "function" ? sideOffset(getOffsetData(state, sideParam, isRtl)) : sideOffset;
7746 const isOverlappingAnchor = shiftY > sideOffsetValue;
7747 const adjacentTransformOrigin = {
7748 top: `${transformX}px calc(100% + ${sideOffsetValue}px)`,
7749 bottom: `${transformX}px ${-sideOffsetValue}px`,
7750 left: `calc(100% + ${sideOffsetValue}px) ${transformY}px`,
7751 right: `${-sideOffsetValue}px ${transformY}px`
7752 }[currentRenderedSide];
7753 const overlapTransformOrigin = `${transformX}px ${rects.reference.y + halfAnchorHeight - y3}px`;
7754 elements2.floating.style.setProperty("--transform-origin", crossAxisShiftEnabled && currentRenderedAxis === "y" && isOverlappingAnchor ? overlapTransformOrigin : adjacentTransformOrigin);
7755 return {};
7756 }
7757 }, hide4, adaptiveOrigin2);
7758 useIsoLayoutEffect(() => {
7759 if (!mounted && floatingRootContext) {
7760 floatingRootContext.update({
7761 referenceElement: null,
7762 floatingElement: null,
7763 domReferenceElement: null,
7764 positionReference: null
7765 });
7766 }
7767 }, [mounted, floatingRootContext]);
7768 const autoUpdateOptions = React29.useMemo(() => ({
7769 elementResize: !disableAnchorTracking && typeof ResizeObserver !== "undefined",
7770 layoutShift: !disableAnchorTracking && typeof IntersectionObserver !== "undefined"
7771 }), [disableAnchorTracking]);
7772 const {
7773 refs,
7774 elements,
7775 x: x2,
7776 y: y2,
7777 middlewareData,
7778 update: update2,
7779 placement: renderedPlacement,
7780 context,
7781 isPositioned,
7782 floatingStyles: originalFloatingStyles
7783 } = useFloating2({
7784 rootContext: floatingRootContext,
7785 open: keepMounted ? mounted : void 0,
7786 placement,
7787 middleware,
7788 strategy: positionMethod,
7789 whileElementsMounted: keepMounted ? void 0 : (...args) => autoUpdate(...args, autoUpdateOptions),
7790 nodeId,
7791 externalTree
7792 });
7793 const {
7794 sideX,
7795 sideY
7796 } = middlewareData.adaptiveOrigin || DEFAULT_SIDES;
7797 const resolvedPosition = isPositioned ? positionMethod : "fixed";
7798 const floatingStyles = React29.useMemo(() => {
7799 const base = adaptiveOrigin2 ? {
7800 position: resolvedPosition,
7801 [sideX]: x2,
7802 [sideY]: y2
7803 } : {
7804 position: resolvedPosition,
7805 ...originalFloatingStyles
7806 };
7807 if (!isPositioned) {
7808 base.opacity = 0;
7809 }
7810 return base;
7811 }, [adaptiveOrigin2, resolvedPosition, sideX, x2, sideY, y2, originalFloatingStyles, isPositioned]);
7812 const registeredPositionReferenceRef = React29.useRef(null);
7813 useIsoLayoutEffect(() => {
7814 if (!mounted) {
7815 return;
7816 }
7817 const anchorValue = anchorValueRef.current;
7818 const resolvedAnchor = typeof anchorValue === "function" ? anchorValue() : anchorValue;
7819 const unwrappedElement = (isRef(resolvedAnchor) ? resolvedAnchor.current : resolvedAnchor) || null;
7820 const finalAnchor = unwrappedElement || null;
7821 if (finalAnchor !== registeredPositionReferenceRef.current) {
7822 refs.setPositionReference(finalAnchor);
7823 registeredPositionReferenceRef.current = finalAnchor;
7824 }
7825 }, [mounted, refs, anchorDep, anchorValueRef]);
7826 React29.useEffect(() => {
7827 if (!mounted) {
7828 return;
7829 }
7830 const anchorValue = anchorValueRef.current;
7831 if (typeof anchorValue === "function") {
7832 return;
7833 }
7834 if (isRef(anchorValue) && anchorValue.current !== registeredPositionReferenceRef.current) {
7835 refs.setPositionReference(anchorValue.current);
7836 registeredPositionReferenceRef.current = anchorValue.current;
7837 }
7838 }, [mounted, refs, anchorDep, anchorValueRef]);
7839 React29.useEffect(() => {
7840 if (keepMounted && mounted && elements.reference && elements.floating) {
7841 return autoUpdate(elements.reference, elements.floating, update2, autoUpdateOptions);
7842 }
7843 return void 0;
7844 }, [keepMounted, mounted, elements, update2, autoUpdateOptions]);
7845 const renderedSide = getSide(renderedPlacement);
7846 const logicalRenderedSide = getLogicalSide(sideParam, renderedSide, isRtl);
7847 const renderedAlign = getAlignment(renderedPlacement) || "center";
7848 const anchorHidden = Boolean(middlewareData.hide?.referenceHidden);
7849 useIsoLayoutEffect(() => {
7850 if (lazyFlip && mounted && isPositioned) {
7851 setMountSide(renderedSide);
7852 }
7853 }, [lazyFlip, mounted, isPositioned, renderedSide]);
7854 const arrowStyles = React29.useMemo(() => ({
7855 position: "absolute",
7856 top: middlewareData.arrow?.y,
7857 left: middlewareData.arrow?.x
7858 }), [middlewareData.arrow]);
7859 const arrowUncentered = middlewareData.arrow?.centerOffset !== 0;
7860 return React29.useMemo(() => ({
7861 positionerStyles: floatingStyles,
7862 arrowStyles,
7863 arrowRef,
7864 arrowUncentered,
7865 side: logicalRenderedSide,
7866 align: renderedAlign,
7867 physicalSide: renderedSide,
7868 anchorHidden,
7869 refs,
7870 context,
7871 isPositioned,
7872 update: update2
7873 }), [floatingStyles, arrowStyles, arrowRef, arrowUncentered, logicalRenderedSide, renderedAlign, renderedSide, anchorHidden, refs, context, isPositioned, update2]);
7874 }
7875 function isRef(param) {
7876 return param != null && "current" in param;
7877 }
7878
7879 // node_modules/@base-ui/react/utils/getDisabledMountTransitionStyles.mjs
7880 function getDisabledMountTransitionStyles(transitionStatus) {
7881 return transitionStatus === "starting" ? DISABLED_TRANSITIONS_STYLE : EMPTY_OBJECT;
7882 }
7883
7884 // node_modules/@base-ui/react/utils/usePositioner.mjs
7885 function usePositioner(componentProps, state, {
7886 styles,
7887 transitionStatus,
7888 props,
7889 refs,
7890 hidden,
7891 inert = false
7892 }) {
7893 const style = {
7894 ...styles
7895 };
7896 if (inert) {
7897 style.pointerEvents = "none";
7898 }
7899 return useRenderElement("div", componentProps, {
7900 state,
7901 ref: refs,
7902 props: [{
7903 role: "presentation",
7904 hidden,
7905 style
7906 }, getDisabledMountTransitionStyles(transitionStatus), props],
7907 stateAttributesMapping: popupStateMapping
7908 });
7909 }
7910
7911 // node_modules/@base-ui/react/utils/usePopupViewport.mjs
7912 var React32 = __toESM(require_react(), 1);
7913 var ReactDOM6 = __toESM(require_react_dom(), 1);
7914
7915 // node_modules/@base-ui/utils/usePreviousValue.mjs
7916 var React30 = __toESM(require_react(), 1);
7917 function usePreviousValue(value) {
7918 const [state, setState] = React30.useState({
7919 current: value,
7920 previous: null
7921 });
7922 if (value !== state.current) {
7923 setState({
7924 current: value,
7925 previous: state.current
7926 });
7927 }
7928 return state.previous;
7929 }
7930
7931 // node_modules/@base-ui/react/utils/usePopupAutoResize.mjs
7932 var React31 = __toESM(require_react(), 1);
7933
7934 // node_modules/@base-ui/react/utils/getCssDimensions.mjs
7935 function getCssDimensions2(element) {
7936 const css = getComputedStyle2(element);
7937 let width = parseFloat(css.width) || 0;
7938 let height = parseFloat(css.height) || 0;
7939 const hasOffset = isHTMLElement(element);
7940 const offsetWidth = hasOffset ? element.offsetWidth : width;
7941 const offsetHeight = hasOffset ? element.offsetHeight : height;
7942 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
7943 if (shouldFallback) {
7944 width = offsetWidth;
7945 height = offsetHeight;
7946 }
7947 return {
7948 width,
7949 height
7950 };
7951 }
7952
7953 // node_modules/@base-ui/react/utils/usePopupAutoResize.mjs
7954 function usePopupAutoResize(parameters) {
7955 const {
7956 popupElement,
7957 positionerElement,
7958 content,
7959 mounted,
7960 onMeasureLayout: onMeasureLayoutParam,
7961 onMeasureLayoutComplete: onMeasureLayoutCompleteParam,
7962 side,
7963 direction
7964 } = parameters;
7965 const runOnceAnimationsFinish = useAnimationsFinished(popupElement, true, false);
7966 const animationFrame = useAnimationFrame();
7967 const committedDimensionsRef = React31.useRef(null);
7968 const isInitialRenderRef = React31.useRef(true);
7969 const restoreAnchoringStylesRef = React31.useRef(NOOP);
7970 const onMeasureLayout = useStableCallback(onMeasureLayoutParam);
7971 const onMeasureLayoutComplete = useStableCallback(onMeasureLayoutCompleteParam);
7972 const anchoringStyles = React31.useMemo(() => {
7973 let isOriginSide = side === "top";
7974 let isPhysicalLeft = side === "left";
7975 if (direction === "rtl") {
7976 isOriginSide = isOriginSide || side === "inline-end";
7977 isPhysicalLeft = isPhysicalLeft || side === "inline-end";
7978 } else {
7979 isOriginSide = isOriginSide || side === "inline-start";
7980 isPhysicalLeft = isPhysicalLeft || side === "inline-start";
7981 }
7982 return isOriginSide ? {
7983 position: "absolute",
7984 [side === "top" ? "bottom" : "top"]: "0",
7985 [isPhysicalLeft ? "right" : "left"]: "0"
7986 } : EMPTY_OBJECT;
7987 }, [side, direction]);
7988 useIsoLayoutEffect(() => {
7989 if (!mounted) {
7990 restoreAnchoringStylesRef.current = NOOP;
7991 isInitialRenderRef.current = true;
7992 committedDimensionsRef.current = null;
7993 return void 0;
7994 }
7995 if (!popupElement || !positionerElement) {
7996 return void 0;
7997 }
7998 restoreAnchoringStylesRef.current = applyElementStyles(popupElement, anchoringStyles);
7999 setPopupCssSize(popupElement, "auto");
8000 const restorePopupPosition = overrideElementStyle(popupElement, "position", "static");
8001 const restorePopupTransform = overrideElementStyle(popupElement, "transform", "none");
8002 const restorePopupScale = overrideElementStyle(popupElement, "scale", "1");
8003 const restorePositionerAvailableSize = applyElementStyles(positionerElement, {
8004 "--available-width": "max-content",
8005 "--available-height": "max-content"
8006 });
8007 function restoreMeasurementOverrides() {
8008 restorePopupPosition();
8009 restorePopupTransform();
8010 restorePositionerAvailableSize();
8011 }
8012 function restoreMeasurementOverridesIncludingScale() {
8013 restoreMeasurementOverrides();
8014 restorePopupScale();
8015 }
8016 onMeasureLayout?.();
8017 if (isInitialRenderRef.current || committedDimensionsRef.current === null) {
8018 setPositionerCssSize(positionerElement, "max-content");
8019 const dimensions = getCssDimensions2(popupElement);
8020 committedDimensionsRef.current = dimensions;
8021 setPositionerCssSize(positionerElement, dimensions);
8022 restoreMeasurementOverridesIncludingScale();
8023 onMeasureLayoutComplete?.(null, dimensions);
8024 isInitialRenderRef.current = false;
8025 return () => {
8026 restoreAnchoringStylesRef.current();
8027 restoreAnchoringStylesRef.current = NOOP;
8028 };
8029 }
8030 setPositionerCssSize(positionerElement, "max-content");
8031 const previousDimensions = committedDimensionsRef.current;
8032 const newDimensions = getCssDimensions2(popupElement);
8033 committedDimensionsRef.current = newDimensions;
8034 setPopupCssSize(popupElement, previousDimensions);
8035 restoreMeasurementOverridesIncludingScale();
8036 onMeasureLayoutComplete?.(previousDimensions, newDimensions);
8037 setPositionerCssSize(positionerElement, newDimensions);
8038 const abortController = new AbortController();
8039 animationFrame.request(() => {
8040 setPopupCssSize(popupElement, newDimensions);
8041 runOnceAnimationsFinish(() => {
8042 popupElement.style.setProperty("--popup-width", "auto");
8043 popupElement.style.setProperty("--popup-height", "auto");
8044 }, abortController.signal);
8045 });
8046 return () => {
8047 abortController.abort();
8048 animationFrame.cancel();
8049 restoreAnchoringStylesRef.current();
8050 restoreAnchoringStylesRef.current = NOOP;
8051 };
8052 }, [content, popupElement, positionerElement, runOnceAnimationsFinish, animationFrame, mounted, onMeasureLayout, onMeasureLayoutComplete, anchoringStyles]);
8053 }
8054 function overrideElementStyle(element, property, value) {
8055 const originalValue = element.style.getPropertyValue(property);
8056 element.style.setProperty(property, value);
8057 return () => {
8058 element.style.setProperty(property, originalValue);
8059 };
8060 }
8061 function applyElementStyles(element, styles) {
8062 const restorers = [];
8063 for (const [key, value] of Object.entries(styles)) {
8064 restorers.push(overrideElementStyle(element, key, value));
8065 }
8066 return restorers.length ? () => {
8067 restorers.forEach((restore) => restore());
8068 } : NOOP;
8069 }
8070 function setPopupCssSize(popupElement, size4) {
8071 const width = size4 === "auto" ? "auto" : `${size4.width}px`;
8072 const height = size4 === "auto" ? "auto" : `${size4.height}px`;
8073 popupElement.style.setProperty("--popup-width", width);
8074 popupElement.style.setProperty("--popup-height", height);
8075 }
8076 function setPositionerCssSize(positionerElement, size4) {
8077 const width = size4 === "max-content" ? "max-content" : `${size4.width}px`;
8078 const height = size4 === "max-content" ? "max-content" : `${size4.height}px`;
8079 positionerElement.style.setProperty("--positioner-width", width);
8080 positionerElement.style.setProperty("--positioner-height", height);
8081 }
8082
8083 // node_modules/@base-ui/react/utils/usePopupViewport.mjs
8084 var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1);
8085 function usePopupViewport(parameters) {
8086 const {
8087 store,
8088 side,
8089 cssVars,
8090 children
8091 } = parameters;
8092 const direction = useDirection();
8093 const activeTrigger = store.useState("activeTriggerElement");
8094 const activeTriggerId = store.useState("activeTriggerId");
8095 const open = store.useState("open");
8096 const payload = store.useState("payload");
8097 const mounted = store.useState("mounted");
8098 const popupElement = store.useState("popupElement");
8099 const positionerElement = store.useState("positionerElement");
8100 const previousActiveTrigger = usePreviousValue(open ? activeTrigger : null);
8101 const currentContentKey = usePopupContentKey(activeTriggerId, payload);
8102 const capturedNodeRef = React32.useRef(null);
8103 const [previousContentNode, setPreviousContentNode] = React32.useState(null);
8104 const [newTriggerOffset, setNewTriggerOffset] = React32.useState(null);
8105 const currentContainerRef = React32.useRef(null);
8106 const previousContainerRef = React32.useRef(null);
8107 const onAnimationsFinished = useAnimationsFinished(currentContainerRef, true, false);
8108 const cleanupFrame = useAnimationFrame();
8109 const [previousContentDimensions, setPreviousContentDimensions] = React32.useState(null);
8110 const [showStartingStyleAttribute, setShowStartingStyleAttribute] = React32.useState(false);
8111 useIsoLayoutEffect(() => {
8112 store.set("hasViewport", true);
8113 return () => {
8114 store.set("hasViewport", false);
8115 };
8116 }, [store]);
8117 const handleMeasureLayout = useStableCallback(() => {
8118 currentContainerRef.current?.style.setProperty("animation", "none");
8119 currentContainerRef.current?.style.setProperty("transition", "none");
8120 previousContainerRef.current?.style.setProperty("display", "none");
8121 });
8122 const handleMeasureLayoutComplete = useStableCallback((previousDimensions) => {
8123 currentContainerRef.current?.style.removeProperty("animation");
8124 currentContainerRef.current?.style.removeProperty("transition");
8125 previousContainerRef.current?.style.removeProperty("display");
8126 if (previousDimensions) {
8127 setPreviousContentDimensions(previousDimensions);
8128 }
8129 });
8130 const lastHandledTriggerRef = React32.useRef(null);
8131 useIsoLayoutEffect(() => {
8132 if (!open || !mounted) {
8133 lastHandledTriggerRef.current = null;
8134 }
8135 }, [open, mounted]);
8136 useIsoLayoutEffect(() => {
8137 if (activeTrigger && previousActiveTrigger && activeTrigger !== previousActiveTrigger && lastHandledTriggerRef.current !== activeTrigger && capturedNodeRef.current) {
8138 setPreviousContentNode(capturedNodeRef.current);
8139 setShowStartingStyleAttribute(true);
8140 const offset4 = calculateRelativePosition(previousActiveTrigger, activeTrigger);
8141 setNewTriggerOffset(offset4);
8142 cleanupFrame.request(() => {
8143 ReactDOM6.flushSync(() => {
8144 setShowStartingStyleAttribute(false);
8145 });
8146 onAnimationsFinished(() => {
8147 setPreviousContentNode(null);
8148 setPreviousContentDimensions(null);
8149 capturedNodeRef.current = null;
8150 });
8151 });
8152 lastHandledTriggerRef.current = activeTrigger;
8153 }
8154 }, [activeTrigger, previousActiveTrigger, previousContentNode, onAnimationsFinished, cleanupFrame]);
8155 useIsoLayoutEffect(() => {
8156 const source = currentContainerRef.current;
8157 if (!source) {
8158 return;
8159 }
8160 const wrapper = ownerDocument(source).createElement("div");
8161 for (const child of Array.from(source.childNodes)) {
8162 wrapper.appendChild(child.cloneNode(true));
8163 }
8164 capturedNodeRef.current = wrapper;
8165 });
8166 const isTransitioning = previousContentNode != null;
8167 let childrenToRender;
8168 if (!isTransitioning) {
8169 childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", {
8170 "data-current": true,
8171 ref: currentContainerRef,
8172 children
8173 }, currentContentKey);
8174 } else {
8175 childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(React32.Fragment, {
8176 children: [/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", {
8177 "data-previous": true,
8178 inert: inertValue(true),
8179 ref: previousContainerRef,
8180 style: {
8181 ...previousContentDimensions ? {
8182 [cssVars.popupWidth]: `${previousContentDimensions.width}px`,
8183 [cssVars.popupHeight]: `${previousContentDimensions.height}px`
8184 } : null,
8185 position: "absolute"
8186 },
8187 "data-ending-style": showStartingStyleAttribute ? void 0 : ""
8188 }, "previous"), /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", {
8189 "data-current": true,
8190 ref: currentContainerRef,
8191 "data-starting-style": showStartingStyleAttribute ? "" : void 0,
8192 children
8193 }, currentContentKey)]
8194 });
8195 }
8196 useIsoLayoutEffect(() => {
8197 const container = previousContainerRef.current;
8198 if (!container || !previousContentNode) {
8199 return;
8200 }
8201 container.replaceChildren(...Array.from(previousContentNode.childNodes));
8202 }, [previousContentNode]);
8203 usePopupAutoResize({
8204 popupElement,
8205 positionerElement,
8206 mounted,
8207 content: payload,
8208 onMeasureLayout: handleMeasureLayout,
8209 onMeasureLayoutComplete: handleMeasureLayoutComplete,
8210 side,
8211 direction
8212 });
8213 const state = {
8214 activationDirection: getActivationDirection(newTriggerOffset),
8215 transitioning: isTransitioning
8216 };
8217 return {
8218 children: childrenToRender,
8219 state
8220 };
8221 }
8222 function getActivationDirection(offset4) {
8223 if (!offset4) {
8224 return void 0;
8225 }
8226 return `${getValueWithTolerance(offset4.horizontal, 5, "right", "left")} ${getValueWithTolerance(offset4.vertical, 5, "down", "up")}`;
8227 }
8228 function getValueWithTolerance(value, tolerance, positiveLabel, negativeLabel) {
8229 if (value > tolerance) {
8230 return positiveLabel;
8231 }
8232 if (value < -tolerance) {
8233 return negativeLabel;
8234 }
8235 return "";
8236 }
8237 function calculateRelativePosition(from, to) {
8238 const fromRect = from.getBoundingClientRect();
8239 const toRect = to.getBoundingClientRect();
8240 const fromCenter = {
8241 x: fromRect.left + fromRect.width / 2,
8242 y: fromRect.top + fromRect.height / 2
8243 };
8244 const toCenter = {
8245 x: toRect.left + toRect.width / 2,
8246 y: toRect.top + toRect.height / 2
8247 };
8248 return {
8249 horizontal: toCenter.x - fromCenter.x,
8250 vertical: toCenter.y - fromCenter.y
8251 };
8252 }
8253 function usePopupContentKey(activeTriggerId, payload) {
8254 const [contentKey, setContentKey] = React32.useState(0);
8255 const previousActiveTriggerIdRef = React32.useRef(activeTriggerId);
8256 const previousPayloadRef = React32.useRef(payload);
8257 const pendingPayloadUpdateRef = React32.useRef(false);
8258 useIsoLayoutEffect(() => {
8259 const previousActiveTriggerId = previousActiveTriggerIdRef.current;
8260 const previousPayload = previousPayloadRef.current;
8261 const triggerIdChanged = activeTriggerId !== previousActiveTriggerId;
8262 const payloadChanged = payload !== previousPayload;
8263 if (triggerIdChanged) {
8264 setContentKey((value) => value + 1);
8265 pendingPayloadUpdateRef.current = !payloadChanged;
8266 } else if (pendingPayloadUpdateRef.current && payloadChanged) {
8267 setContentKey((value) => value + 1);
8268 pendingPayloadUpdateRef.current = false;
8269 }
8270 previousActiveTriggerIdRef.current = activeTriggerId;
8271 previousPayloadRef.current = payload;
8272 }, [activeTriggerId, payload]);
8273 return `${activeTriggerId ?? "current"}-${contentKey}`;
8274 }
8275
8276 // node_modules/@base-ui/react/utils/FloatingPortalLite.mjs
8277 var React33 = __toESM(require_react(), 1);
8278 var ReactDOM7 = __toESM(require_react_dom(), 1);
8279 var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1);
8280 var FloatingPortalLite = /* @__PURE__ */ React33.forwardRef(function FloatingPortalLite2(componentProps, forwardedRef) {
8281 const {
8282 children,
8283 container,
8284 className,
8285 render: render4,
8286 style,
8287 ...elementProps
8288 } = componentProps;
8289 const {
8290 portalNode,
8291 portalSubtree
8292 } = useFloatingPortalNode({
8293 container,
8294 ref: forwardedRef,
8295 componentProps,
8296 elementProps
8297 });
8298 if (!portalSubtree && !portalNode) {
8299 return null;
8300 }
8301 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(React33.Fragment, {
8302 children: [portalSubtree, portalNode && /* @__PURE__ */ ReactDOM7.createPortal(children, portalNode)]
8303 });
8304 });
8305 if (true) FloatingPortalLite.displayName = "FloatingPortalLite";
8306
8307 // node_modules/@base-ui/react/tooltip/index.parts.mjs
8308 var index_parts_exports = {};
8309 __export(index_parts_exports, {
8310 Arrow: () => TooltipArrow,
8311 Handle: () => TooltipHandle,
8312 Popup: () => TooltipPopup,
8313 Portal: () => TooltipPortal,
8314 Positioner: () => TooltipPositioner,
8315 Provider: () => TooltipProvider,
8316 Root: () => TooltipRoot,
8317 Trigger: () => TooltipTrigger,
8318 Viewport: () => TooltipViewport,
8319 createHandle: () => createTooltipHandle
8320 });
8321
8322 // node_modules/@base-ui/react/tooltip/root/TooltipRoot.mjs
8323 var React36 = __toESM(require_react(), 1);
8324
8325 // node_modules/@base-ui/react/tooltip/root/TooltipRootContext.mjs
8326 var React34 = __toESM(require_react(), 1);
8327 var TooltipRootContext = /* @__PURE__ */ React34.createContext(void 0);
8328 if (true) TooltipRootContext.displayName = "TooltipRootContext";
8329 function useTooltipRootContext(optional) {
8330 const context = React34.useContext(TooltipRootContext);
8331 if (context === void 0 && !optional) {
8332 throw new Error(true ? "Base UI: TooltipRootContext is missing. Tooltip parts must be placed within <Tooltip.Root>." : formatErrorMessage_default(72));
8333 }
8334 return context;
8335 }
8336
8337 // node_modules/@base-ui/react/tooltip/store/TooltipStore.mjs
8338 var React35 = __toESM(require_react(), 1);
8339 var selectors2 = {
8340 ...popupStoreSelectors,
8341 disabled: createSelector((state) => state.disabled),
8342 instantType: createSelector((state) => state.instantType),
8343 isInstantPhase: createSelector((state) => state.isInstantPhase),
8344 trackCursorAxis: createSelector((state) => state.trackCursorAxis),
8345 disableHoverablePopup: createSelector((state) => state.disableHoverablePopup),
8346 lastOpenChangeReason: createSelector((state) => state.openChangeReason),
8347 closeOnClick: createSelector((state) => state.closeOnClick),
8348 closeDelay: createSelector((state) => state.closeDelay),
8349 hasViewport: createSelector((state) => state.hasViewport)
8350 };
8351 var TooltipStore = class _TooltipStore extends ReactStore {
8352 constructor(initialState, floatingId, nested = false) {
8353 const triggerElements = new PopupTriggerMap();
8354 const state = {
8355 ...createInitialState(),
8356 ...initialState
8357 };
8358 state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
8359 super(state, {
8360 popupRef: /* @__PURE__ */ React35.createRef(),
8361 onOpenChange: void 0,
8362 onOpenChangeComplete: void 0,
8363 triggerElements
8364 }, selectors2);
8365 }
8366 setOpen = (nextOpen, eventDetails) => {
8367 applyPopupOpenChange(this, nextOpen, eventDetails, {
8368 extraState: {
8369 openChangeReason: eventDetails.reason
8370 }
8371 });
8372 };
8373 // Used by trigger clicks to clear a delayed hover open without reporting a public open-state change.
8374 cancelPendingOpen(event) {
8375 this.state.floatingRootContext.dispatchOpenChange(false, createChangeEventDetails(reason_parts_exports.triggerPress, event));
8376 }
8377 static useStore(externalStore, initialState) {
8378 const store = usePopupStore(externalStore, (floatingId, nested) => new _TooltipStore(initialState, floatingId, nested)).store;
8379 return store;
8380 }
8381 };
8382 function createInitialState() {
8383 return {
8384 ...createInitialPopupStoreState(),
8385 disabled: false,
8386 instantType: void 0,
8387 isInstantPhase: false,
8388 trackCursorAxis: "none",
8389 disableHoverablePopup: false,
8390 openChangeReason: null,
8391 closeOnClick: true,
8392 closeDelay: 0,
8393 hasViewport: false
8394 };
8395 }
8396
8397 // node_modules/@base-ui/react/tooltip/root/TooltipRoot.mjs
8398 var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
8399 var TooltipRoot = fastComponent(function TooltipRoot2(props) {
8400 const {
8401 disabled: disabled2 = false,
8402 defaultOpen = false,
8403 open: openProp,
8404 disableHoverablePopup = false,
8405 trackCursorAxis = "none",
8406 actionsRef,
8407 onOpenChange,
8408 onOpenChangeComplete,
8409 handle,
8410 triggerId: triggerIdProp,
8411 defaultTriggerId: defaultTriggerIdProp = null,
8412 children
8413 } = props;
8414 const store = TooltipStore.useStore(handle?.store, {
8415 open: defaultOpen,
8416 openProp,
8417 activeTriggerId: defaultTriggerIdProp,
8418 triggerIdProp
8419 });
8420 useInitialOpenSync(store, openProp, defaultOpen, defaultTriggerIdProp);
8421 store.useControlledProp("openProp", openProp);
8422 store.useControlledProp("triggerIdProp", triggerIdProp);
8423 store.useContextCallback("onOpenChange", onOpenChange);
8424 store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete);
8425 const openState = store.useState("open");
8426 const open = !disabled2 && openState;
8427 const activeTriggerId = store.useState("activeTriggerId");
8428 const mounted = store.useState("mounted");
8429 const payload = store.useState("payload");
8430 store.useSyncedValues({
8431 trackCursorAxis,
8432 disableHoverablePopup
8433 });
8434 store.useSyncedValue("disabled", disabled2);
8435 useImplicitActiveTrigger(store, {
8436 closeOnActiveTriggerUnmount: true
8437 });
8438 const {
8439 forceUnmount,
8440 transitionStatus
8441 } = useOpenStateTransitions(open, store);
8442 const isInstantPhase = store.useState("isInstantPhase");
8443 const instantType = store.useState("instantType");
8444 const lastOpenChangeReason = store.useState("lastOpenChangeReason");
8445 const previousInstantTypeRef = React36.useRef(null);
8446 useIsoLayoutEffect(() => {
8447 if (openState && disabled2) {
8448 store.setOpen(false, createChangeEventDetails(reason_parts_exports.disabled));
8449 }
8450 }, [openState, disabled2, store]);
8451 useIsoLayoutEffect(() => {
8452 if (transitionStatus === "ending" && lastOpenChangeReason === reason_parts_exports.none || transitionStatus !== "ending" && isInstantPhase) {
8453 if (instantType !== "delay") {
8454 previousInstantTypeRef.current = instantType;
8455 }
8456 store.set("instantType", "delay");
8457 } else if (previousInstantTypeRef.current !== null) {
8458 store.set("instantType", previousInstantTypeRef.current);
8459 previousInstantTypeRef.current = null;
8460 }
8461 }, [transitionStatus, isInstantPhase, lastOpenChangeReason, instantType, store]);
8462 useIsoLayoutEffect(() => {
8463 if (open) {
8464 if (activeTriggerId == null) {
8465 store.set("payload", void 0);
8466 }
8467 }
8468 }, [store, activeTriggerId, open]);
8469 const handleImperativeClose = React36.useCallback(() => {
8470 store.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction));
8471 }, [store]);
8472 React36.useImperativeHandle(actionsRef, () => ({
8473 unmount: forceUnmount,
8474 close: handleImperativeClose
8475 }), [forceUnmount, handleImperativeClose]);
8476 const shouldRenderInteractions = open || mounted || !disabled2 && trackCursorAxis !== "none";
8477 return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(TooltipRootContext.Provider, {
8478 value: store,
8479 children: [shouldRenderInteractions && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(TooltipInteractions, {
8480 store,
8481 disabled: disabled2,
8482 trackCursorAxis
8483 }), typeof children === "function" ? children({
8484 payload
8485 }) : children]
8486 });
8487 });
8488 if (true) TooltipRoot.displayName = "TooltipRoot";
8489 function TooltipInteractions({
8490 store,
8491 disabled: disabled2,
8492 trackCursorAxis
8493 }) {
8494 const floatingRootContext = store.useState("floatingRootContext");
8495 const dismiss = useDismiss(floatingRootContext, {
8496 enabled: !disabled2,
8497 referencePress: () => store.select("closeOnClick")
8498 });
8499 const clientPoint = useClientPoint(floatingRootContext, {
8500 enabled: !disabled2 && trackCursorAxis !== "none",
8501 axis: trackCursorAxis === "none" ? void 0 : trackCursorAxis
8502 });
8503 const activeTriggerProps = React36.useMemo(() => mergeProps(clientPoint.reference, dismiss.reference), [clientPoint.reference, dismiss.reference]);
8504 const inactiveTriggerProps = React36.useMemo(() => mergeProps(clientPoint.trigger, dismiss.trigger), [clientPoint.trigger, dismiss.trigger]);
8505 const popupProps = React36.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, clientPoint.floating, dismiss.floating), [clientPoint.floating, dismiss.floating]);
8506 usePopupInteractionProps(store, {
8507 activeTriggerProps,
8508 inactiveTriggerProps,
8509 popupProps
8510 });
8511 return null;
8512 }
8513
8514 // node_modules/@base-ui/react/tooltip/trigger/TooltipTrigger.mjs
8515 var React38 = __toESM(require_react(), 1);
8516
8517 // node_modules/@base-ui/react/tooltip/provider/TooltipProviderContext.mjs
8518 var React37 = __toESM(require_react(), 1);
8519 var TooltipProviderContext = /* @__PURE__ */ React37.createContext(void 0);
8520 if (true) TooltipProviderContext.displayName = "TooltipProviderContext";
8521 function useTooltipProviderContext() {
8522 return React37.useContext(TooltipProviderContext);
8523 }
8524
8525 // node_modules/@base-ui/react/tooltip/trigger/TooltipTriggerDataAttributes.mjs
8526 var TooltipTriggerDataAttributes = (function(TooltipTriggerDataAttributes2) {
8527 TooltipTriggerDataAttributes2[TooltipTriggerDataAttributes2["popupOpen"] = CommonTriggerDataAttributes.popupOpen] = "popupOpen";
8528 TooltipTriggerDataAttributes2["triggerDisabled"] = "data-trigger-disabled";
8529 return TooltipTriggerDataAttributes2;
8530 })({});
8531
8532 // node_modules/@base-ui/react/tooltip/utils/constants.mjs
8533 var OPEN_DELAY = 600;
8534
8535 // node_modules/@base-ui/react/tooltip/trigger/TooltipTrigger.mjs
8536 var TOOLTIP_TRIGGER_IDENTIFIER = "data-base-ui-tooltip-trigger";
8537 function getTargetElement(event) {
8538 if ("composedPath" in event) {
8539 const path = event.composedPath();
8540 for (let i2 = 0; i2 < path.length; i2 += 1) {
8541 const element = path[i2];
8542 if (isElement(element)) {
8543 return element;
8544 }
8545 }
8546 }
8547 const target = event.target;
8548 if (isElement(target)) {
8549 return target;
8550 }
8551 return null;
8552 }
8553 function closestEnabledTooltipTrigger(element) {
8554 let current = element;
8555 while (current) {
8556 if (current.hasAttribute(TOOLTIP_TRIGGER_IDENTIFIER)) {
8557 return current;
8558 }
8559 const parentElement = current.parentElement;
8560 if (parentElement) {
8561 current = parentElement;
8562 continue;
8563 }
8564 const root = current.getRootNode();
8565 current = "host" in root && isElement(root.host) ? root.host : null;
8566 }
8567 return null;
8568 }
8569 var TooltipTrigger = fastComponentRef(function TooltipTrigger2(componentProps, forwardedRef) {
8570 const {
8571 render: render4,
8572 className,
8573 style,
8574 handle,
8575 payload,
8576 disabled: disabledProp,
8577 delay,
8578 closeOnClick = true,
8579 closeDelay,
8580 id: idProp,
8581 ...elementProps
8582 } = componentProps;
8583 const rootContext = useTooltipRootContext(true);
8584 const store = handle?.store ?? rootContext;
8585 if (!store) {
8586 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));
8587 }
8588 const thisTriggerId = useBaseUiId(idProp);
8589 const isTriggerActive = store.useState("isTriggerActive", thisTriggerId);
8590 const isOpenedByThisTrigger = store.useState("isOpenedByTrigger", thisTriggerId);
8591 const floatingRootContext = store.useState("floatingRootContext");
8592 const triggerElementRef = React38.useRef(null);
8593 const delayWithDefault = delay ?? OPEN_DELAY;
8594 const closeDelayWithDefault = closeDelay ?? 0;
8595 const {
8596 registerTrigger,
8597 isMountedByThisTrigger
8598 } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {
8599 payload,
8600 closeOnClick,
8601 closeDelay: closeDelayWithDefault
8602 });
8603 const providerContext = useTooltipProviderContext();
8604 const {
8605 delayRef,
8606 isInstantPhase,
8607 hasProvider
8608 } = useDelayGroup(floatingRootContext, {
8609 open: isOpenedByThisTrigger
8610 });
8611 const hoverInteraction = useHoverInteractionSharedState(floatingRootContext);
8612 store.useSyncedValue("isInstantPhase", isInstantPhase);
8613 const rootDisabled = store.useState("disabled");
8614 const disabled2 = disabledProp ?? rootDisabled;
8615 const disabledRef = useValueAsRef(disabled2);
8616 const trackCursorAxis = store.useState("trackCursorAxis");
8617 const disableHoverablePopup = store.useState("disableHoverablePopup");
8618 const isNestedTriggerHoveredRef = React38.useRef(false);
8619 const nestedTriggerOpenTimeout = useTimeout();
8620 const pointerTypeRef = React38.useRef(void 0);
8621 function getOpenDelay() {
8622 const providerDelay = providerContext?.delay;
8623 const groupOpenValue = typeof delayRef.current === "object" ? delayRef.current.open : void 0;
8624 let computedOpenDelay = delayWithDefault;
8625 if (hasProvider) {
8626 if (groupOpenValue !== 0) {
8627 computedOpenDelay = delay ?? providerDelay ?? delayWithDefault;
8628 } else {
8629 computedOpenDelay = 0;
8630 }
8631 }
8632 return computedOpenDelay;
8633 }
8634 function isEnabledNestedTriggerTarget(target) {
8635 const triggerEl = triggerElementRef.current;
8636 if (!triggerEl || !target) {
8637 return false;
8638 }
8639 const nearestTrigger = closestEnabledTooltipTrigger(target);
8640 return nearestTrigger !== null && nearestTrigger !== triggerEl && contains(triggerEl, nearestTrigger);
8641 }
8642 function detectNestedTriggerHover(target) {
8643 const nestedTriggerHovered = isEnabledNestedTriggerTarget(target);
8644 isNestedTriggerHoveredRef.current = nestedTriggerHovered;
8645 if (nestedTriggerHovered) {
8646 hoverInteraction.openChangeTimeout.clear();
8647 hoverInteraction.restTimeout.clear();
8648 hoverInteraction.restTimeoutPending = false;
8649 nestedTriggerOpenTimeout.clear();
8650 }
8651 return nestedTriggerHovered;
8652 }
8653 const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
8654 enabled: !disabled2,
8655 mouseOnly: true,
8656 move: false,
8657 handleClose: !disableHoverablePopup && trackCursorAxis !== "both" ? safePolygon() : null,
8658 restMs: getOpenDelay,
8659 delay() {
8660 const closeValue = typeof delayRef.current === "object" ? delayRef.current.close : void 0;
8661 let computedCloseDelay = closeDelayWithDefault;
8662 if (closeDelay == null && hasProvider) {
8663 computedCloseDelay = closeValue;
8664 }
8665 return {
8666 close: computedCloseDelay
8667 };
8668 },
8669 triggerElementRef,
8670 isActiveTrigger: isTriggerActive,
8671 isClosing: () => store.select("transitionStatus") === "ending",
8672 shouldOpen() {
8673 return !isNestedTriggerHoveredRef.current;
8674 }
8675 });
8676 const focusProps = useFocus(floatingRootContext, {
8677 enabled: !disabled2
8678 }).reference;
8679 const handleNestedTriggerHover = (event) => {
8680 const wasNestedTriggerHovered = isNestedTriggerHoveredRef.current;
8681 const target = getTargetElement(event);
8682 const nestedTriggerHovered = detectNestedTriggerHover(target);
8683 const triggerEl = triggerElementRef.current;
8684 const targetInsideTrigger = triggerEl && target && contains(triggerEl, target);
8685 if (nestedTriggerHovered && store.select("open") && store.select("lastOpenChangeReason") === reason_parts_exports.triggerHover) {
8686 store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event));
8687 return;
8688 }
8689 if (wasNestedTriggerHovered && !nestedTriggerHovered && targetInsideTrigger && !disabledRef.current && !store.select("open") && triggerEl && // Match the hover hook's non-strict mouse fallback for mouse-only event sequences.
8690 isMouseLikePointerType(pointerTypeRef.current)) {
8691 const open = () => {
8692 if (!isNestedTriggerHoveredRef.current && !disabledRef.current && !store.select("open")) {
8693 store.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerEl));
8694 }
8695 };
8696 const openDelay = getOpenDelay();
8697 if (openDelay === 0) {
8698 nestedTriggerOpenTimeout.clear();
8699 open();
8700 } else {
8701 nestedTriggerOpenTimeout.start(openDelay, open);
8702 }
8703 }
8704 };
8705 const rootTriggerProps = store.useState("triggerProps", isMountedByThisTrigger);
8706 const shouldApplyRootTriggerProps = isMountedByThisTrigger || trackCursorAxis !== "none";
8707 const state = {
8708 open: isOpenedByThisTrigger
8709 };
8710 const element = useRenderElement("button", componentProps, {
8711 state,
8712 ref: [forwardedRef, registerTrigger, triggerElementRef],
8713 props: [hoverProps, focusProps, shouldApplyRootTriggerProps ? rootTriggerProps : void 0, {
8714 onMouseOver(event) {
8715 handleNestedTriggerHover(event.nativeEvent);
8716 },
8717 onFocus(event) {
8718 if (isEnabledNestedTriggerTarget(getTargetElement(event.nativeEvent))) {
8719 event.preventBaseUIHandler();
8720 }
8721 },
8722 onMouseLeave() {
8723 isNestedTriggerHoveredRef.current = false;
8724 nestedTriggerOpenTimeout.clear();
8725 pointerTypeRef.current = void 0;
8726 },
8727 onPointerEnter(event) {
8728 pointerTypeRef.current = event.pointerType;
8729 },
8730 onPointerDown(event) {
8731 pointerTypeRef.current = event.pointerType;
8732 store.set("closeOnClick", closeOnClick);
8733 if (closeOnClick && !store.select("open")) {
8734 store.cancelPendingOpen(event.nativeEvent);
8735 }
8736 },
8737 onClick(event) {
8738 if (closeOnClick && !store.select("open")) {
8739 store.cancelPendingOpen(event.nativeEvent);
8740 }
8741 },
8742 id: thisTriggerId,
8743 [TooltipTriggerDataAttributes.triggerDisabled]: disabled2 ? "" : void 0,
8744 [TOOLTIP_TRIGGER_IDENTIFIER]: disabled2 ? void 0 : ""
8745 }, elementProps],
8746 stateAttributesMapping: triggerOpenStateMapping
8747 });
8748 return element;
8749 });
8750 if (true) TooltipTrigger.displayName = "TooltipTrigger";
8751
8752 // node_modules/@base-ui/react/tooltip/portal/TooltipPortal.mjs
8753 var React40 = __toESM(require_react(), 1);
8754
8755 // node_modules/@base-ui/react/tooltip/portal/TooltipPortalContext.mjs
8756 var React39 = __toESM(require_react(), 1);
8757 var TooltipPortalContext = /* @__PURE__ */ React39.createContext(void 0);
8758 if (true) TooltipPortalContext.displayName = "TooltipPortalContext";
8759 function useTooltipPortalContext() {
8760 const value = React39.useContext(TooltipPortalContext);
8761 if (value === void 0) {
8762 throw new Error(true ? "Base UI: <Tooltip.Portal> is missing." : formatErrorMessage_default(70));
8763 }
8764 return value;
8765 }
8766
8767 // node_modules/@base-ui/react/tooltip/portal/TooltipPortal.mjs
8768 var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1);
8769 var TooltipPortal = /* @__PURE__ */ React40.forwardRef(function TooltipPortal2(props, forwardedRef) {
8770 const {
8771 keepMounted = false,
8772 ...portalProps
8773 } = props;
8774 const store = useTooltipRootContext();
8775 const mounted = store.useState("mounted");
8776 const shouldRender = mounted || keepMounted;
8777 if (!shouldRender) {
8778 return null;
8779 }
8780 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TooltipPortalContext.Provider, {
8781 value: keepMounted,
8782 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FloatingPortalLite, {
8783 ref: forwardedRef,
8784 ...portalProps
8785 })
8786 });
8787 });
8788 if (true) TooltipPortal.displayName = "TooltipPortal";
8789
8790 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositioner.mjs
8791 var React42 = __toESM(require_react(), 1);
8792
8793 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositionerContext.mjs
8794 var React41 = __toESM(require_react(), 1);
8795 var TooltipPositionerContext = /* @__PURE__ */ React41.createContext(void 0);
8796 if (true) TooltipPositionerContext.displayName = "TooltipPositionerContext";
8797 function useTooltipPositionerContext() {
8798 const context = React41.useContext(TooltipPositionerContext);
8799 if (context === void 0) {
8800 throw new Error(true ? "Base UI: TooltipPositionerContext is missing. TooltipPositioner parts must be placed within <Tooltip.Positioner>." : formatErrorMessage_default(71));
8801 }
8802 return context;
8803 }
8804
8805 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositioner.mjs
8806 var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1);
8807 var TooltipPositioner = /* @__PURE__ */ React42.forwardRef(function TooltipPositioner2(componentProps, forwardedRef) {
8808 const {
8809 render: render4,
8810 className,
8811 anchor,
8812 positionMethod = "absolute",
8813 side = "top",
8814 align = "center",
8815 sideOffset = 0,
8816 alignOffset = 0,
8817 collisionBoundary = "clipping-ancestors",
8818 collisionPadding = 5,
8819 arrowPadding = 5,
8820 sticky = false,
8821 disableAnchorTracking = false,
8822 collisionAvoidance = POPUP_COLLISION_AVOIDANCE,
8823 style,
8824 ...elementProps
8825 } = componentProps;
8826 const store = useTooltipRootContext();
8827 const keepMounted = useTooltipPortalContext();
8828 const open = store.useState("open");
8829 const mounted = store.useState("mounted");
8830 const trackCursorAxis = store.useState("trackCursorAxis");
8831 const disableHoverablePopup = store.useState("disableHoverablePopup");
8832 const floatingRootContext = store.useState("floatingRootContext");
8833 const instantType = store.useState("instantType");
8834 const transitionStatus = store.useState("transitionStatus");
8835 const hasViewport = store.useState("hasViewport");
8836 const positioning = useAnchorPositioning({
8837 anchor,
8838 positionMethod,
8839 floatingRootContext,
8840 mounted,
8841 side,
8842 sideOffset,
8843 align,
8844 alignOffset,
8845 collisionBoundary,
8846 collisionPadding,
8847 sticky,
8848 arrowPadding,
8849 disableAnchorTracking,
8850 keepMounted,
8851 collisionAvoidance,
8852 adaptiveOrigin: hasViewport ? adaptiveOrigin : void 0
8853 });
8854 const state = React42.useMemo(() => ({
8855 open,
8856 side: positioning.side,
8857 align: positioning.align,
8858 anchorHidden: positioning.anchorHidden,
8859 instant: trackCursorAxis !== "none" ? "tracking-cursor" : instantType
8860 }), [open, positioning.side, positioning.align, positioning.anchorHidden, trackCursorAxis, instantType]);
8861 const element = usePositioner(componentProps, state, {
8862 styles: positioning.positionerStyles,
8863 transitionStatus,
8864 props: elementProps,
8865 refs: [forwardedRef, store.useStateSetter("positionerElement")],
8866 hidden: !mounted,
8867 inert: !open || trackCursorAxis === "both" || disableHoverablePopup
8868 });
8869 return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(TooltipPositionerContext.Provider, {
8870 value: positioning,
8871 children: element
8872 });
8873 });
8874 if (true) TooltipPositioner.displayName = "TooltipPositioner";
8875
8876 // node_modules/@base-ui/react/tooltip/popup/TooltipPopup.mjs
8877 var React43 = __toESM(require_react(), 1);
8878 var stateAttributesMapping = {
8879 ...popupStateMapping,
8880 ...transitionStatusMapping
8881 };
8882 var TooltipPopup = /* @__PURE__ */ React43.forwardRef(function TooltipPopup2(componentProps, forwardedRef) {
8883 const {
8884 render: render4,
8885 className,
8886 style,
8887 ...elementProps
8888 } = componentProps;
8889 const store = useTooltipRootContext();
8890 const {
8891 side,
8892 align
8893 } = useTooltipPositionerContext();
8894 const open = store.useState("open");
8895 const instantType = store.useState("instantType");
8896 const transitionStatus = store.useState("transitionStatus");
8897 const popupProps = store.useState("popupProps");
8898 const floatingContext = store.useState("floatingRootContext");
8899 const disabled2 = store.useState("disabled");
8900 const closeDelay = store.useState("closeDelay");
8901 useOpenChangeComplete({
8902 open,
8903 ref: store.context.popupRef,
8904 onComplete() {
8905 if (open) {
8906 store.context.onOpenChangeComplete?.(true);
8907 }
8908 }
8909 });
8910 useHoverFloatingInteraction(floatingContext, {
8911 enabled: !disabled2,
8912 closeDelay
8913 });
8914 const setPopupElement = store.useStateSetter("popupElement");
8915 const state = {
8916 open,
8917 side,
8918 align,
8919 instant: instantType,
8920 transitionStatus
8921 };
8922 const element = useRenderElement("div", componentProps, {
8923 state,
8924 ref: [forwardedRef, store.context.popupRef, setPopupElement],
8925 props: [popupProps, getDisabledMountTransitionStyles(transitionStatus), elementProps],
8926 stateAttributesMapping
8927 });
8928 return element;
8929 });
8930 if (true) TooltipPopup.displayName = "TooltipPopup";
8931
8932 // node_modules/@base-ui/react/tooltip/arrow/TooltipArrow.mjs
8933 var React44 = __toESM(require_react(), 1);
8934 var TooltipArrow = /* @__PURE__ */ React44.forwardRef(function TooltipArrow2(componentProps, forwardedRef) {
8935 const {
8936 render: render4,
8937 className,
8938 style,
8939 ...elementProps
8940 } = componentProps;
8941 const store = useTooltipRootContext();
8942 const {
8943 arrowRef,
8944 side,
8945 align,
8946 arrowUncentered,
8947 arrowStyles
8948 } = useTooltipPositionerContext();
8949 const open = store.useState("open");
8950 const instantType = store.useState("instantType");
8951 const state = {
8952 open,
8953 side,
8954 align,
8955 uncentered: arrowUncentered,
8956 instant: instantType
8957 };
8958 const element = useRenderElement("div", componentProps, {
8959 state,
8960 ref: [forwardedRef, arrowRef],
8961 props: [{
8962 style: arrowStyles,
8963 "aria-hidden": true
8964 }, elementProps],
8965 stateAttributesMapping: popupStateMapping
8966 });
8967 return element;
8968 });
8969 if (true) TooltipArrow.displayName = "TooltipArrow";
8970
8971 // node_modules/@base-ui/react/tooltip/provider/TooltipProvider.mjs
8972 var React45 = __toESM(require_react(), 1);
8973 var import_jsx_runtime35 = __toESM(require_jsx_runtime(), 1);
8974 var TooltipProvider = function TooltipProvider2(props) {
8975 const {
8976 delay,
8977 closeDelay,
8978 timeout = 400
8979 } = props;
8980 const contextValue = React45.useMemo(() => ({
8981 delay,
8982 closeDelay
8983 }), [delay, closeDelay]);
8984 const delayValue = React45.useMemo(() => ({
8985 open: delay,
8986 close: closeDelay
8987 }), [delay, closeDelay]);
8988 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TooltipProviderContext.Provider, {
8989 value: contextValue,
8990 children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(FloatingDelayGroup, {
8991 delay: delayValue,
8992 timeoutMs: timeout,
8993 children: props.children
8994 })
8995 });
8996 };
8997 if (true) TooltipProvider.displayName = "TooltipProvider";
8998
8999 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewport.mjs
9000 var React46 = __toESM(require_react(), 1);
9001
9002 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewportCssVars.mjs
9003 var TooltipViewportCssVars = /* @__PURE__ */ (function(TooltipViewportCssVars2) {
9004 TooltipViewportCssVars2["popupWidth"] = "--popup-width";
9005 TooltipViewportCssVars2["popupHeight"] = "--popup-height";
9006 return TooltipViewportCssVars2;
9007 })({});
9008
9009 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewport.mjs
9010 var stateAttributesMapping2 = {
9011 activationDirection: (value) => value ? {
9012 "data-activation-direction": value
9013 } : null
9014 };
9015 var TooltipViewport = /* @__PURE__ */ React46.forwardRef(function TooltipViewport2(componentProps, forwardedRef) {
9016 const {
9017 render: render4,
9018 className,
9019 style,
9020 children,
9021 ...elementProps
9022 } = componentProps;
9023 const store = useTooltipRootContext();
9024 const positioner = useTooltipPositionerContext();
9025 const instantType = store.useState("instantType");
9026 const {
9027 children: childrenToRender,
9028 state: viewportState
9029 } = usePopupViewport({
9030 store,
9031 side: positioner.side,
9032 cssVars: TooltipViewportCssVars,
9033 children
9034 });
9035 const state = {
9036 activationDirection: viewportState.activationDirection,
9037 transitioning: viewportState.transitioning,
9038 instant: instantType
9039 };
9040 return useRenderElement("div", componentProps, {
9041 state,
9042 ref: forwardedRef,
9043 props: [elementProps, {
9044 children: childrenToRender
9045 }],
9046 stateAttributesMapping: stateAttributesMapping2
9047 });
9048 });
9049 if (true) TooltipViewport.displayName = "TooltipViewport";
9050
9051 // node_modules/@base-ui/react/tooltip/store/TooltipHandle.mjs
9052 var TooltipHandle = class {
9053 /**
9054 * Internal store holding the tooltip state.
9055 * @internal
9056 */
9057 constructor() {
9058 this.store = new TooltipStore();
9059 }
9060 /**
9061 * Opens the tooltip and associates it with the trigger with the given ID.
9062 * The trigger must be a Tooltip.Trigger component with this handle passed as a prop.
9063 *
9064 * This method should only be called in an event handler or an effect (not during rendering).
9065 *
9066 * @param triggerId ID of the trigger to associate with the tooltip.
9067 */
9068 open(triggerId) {
9069 const triggerElement = triggerId ? this.store.context.triggerElements.getById(triggerId) : void 0;
9070 if (triggerId && !triggerElement) {
9071 throw new Error(true ? `Base UI: TooltipHandle.open: No trigger found with id "${triggerId}".` : formatErrorMessage_default(81, triggerId));
9072 }
9073 this.store.setOpen(true, createChangeEventDetails(reason_parts_exports.imperativeAction, void 0, triggerElement));
9074 }
9075 /**
9076 * Closes the tooltip.
9077 */
9078 close() {
9079 this.store.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction, void 0, void 0));
9080 }
9081 /**
9082 * Indicates whether the tooltip is currently open.
9083 */
9084 get isOpen() {
9085 return this.store.select("open");
9086 }
9087 };
9088 function createTooltipHandle() {
9089 return new TooltipHandle();
9090 }
9091
9092 // node_modules/@base-ui/react/use-render/useRender.mjs
9093 function useRender(params) {
9094 return useRenderElement(params.defaultTagName ?? "div", params, params);
9095 }
9096
9097 // packages/ui/build-module/text/text.mjs
9098 var import_element11 = __toESM(require_element(), 1);
9099 var STYLE_HASH_ATTRIBUTE = "data-wp-hash";
9100 function getRuntime() {
9101 const globalScope = globalThis;
9102 if (globalScope.__wpStyleRuntime) {
9103 return globalScope.__wpStyleRuntime;
9104 }
9105 globalScope.__wpStyleRuntime = {
9106 documents: /* @__PURE__ */ new Map(),
9107 styles: /* @__PURE__ */ new Map(),
9108 injectedStyles: /* @__PURE__ */ new WeakMap()
9109 };
9110 if (typeof document !== "undefined") {
9111 registerDocument(document);
9112 }
9113 return globalScope.__wpStyleRuntime;
9114 }
9115 function documentContainsStyleHash(targetDocument, hash) {
9116 if (!targetDocument.head) {
9117 return false;
9118 }
9119 for (const style of targetDocument.head.querySelectorAll(
9120 `style[${STYLE_HASH_ATTRIBUTE}]`
9121 )) {
9122 if (style.getAttribute(STYLE_HASH_ATTRIBUTE) === hash) {
9123 return true;
9124 }
9125 }
9126 return false;
9127 }
9128 function injectStyle(targetDocument, hash, css) {
9129 if (!targetDocument.head) {
9130 return;
9131 }
9132 const runtime = getRuntime();
9133 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9134 if (!injectedStyles) {
9135 injectedStyles = /* @__PURE__ */ new Set();
9136 runtime.injectedStyles.set(targetDocument, injectedStyles);
9137 }
9138 if (injectedStyles.has(hash)) {
9139 return;
9140 }
9141 if (documentContainsStyleHash(targetDocument, hash)) {
9142 injectedStyles.add(hash);
9143 return;
9144 }
9145 const style = targetDocument.createElement("style");
9146 style.setAttribute(STYLE_HASH_ATTRIBUTE, hash);
9147 style.appendChild(targetDocument.createTextNode(css));
9148 targetDocument.head.appendChild(style);
9149 injectedStyles.add(hash);
9150 }
9151 function registerDocument(targetDocument) {
9152 const runtime = getRuntime();
9153 runtime.documents.set(
9154 targetDocument,
9155 (runtime.documents.get(targetDocument) ?? 0) + 1
9156 );
9157 for (const [hash, css] of runtime.styles) {
9158 injectStyle(targetDocument, hash, css);
9159 }
9160 return () => {
9161 const count = runtime.documents.get(targetDocument);
9162 if (count === void 0) {
9163 return;
9164 }
9165 if (count <= 1) {
9166 runtime.documents.delete(targetDocument);
9167 return;
9168 }
9169 runtime.documents.set(targetDocument, count - 1);
9170 };
9171 }
9172 function registerStyle(hash, css) {
9173 const runtime = getRuntime();
9174 runtime.styles.set(hash, css);
9175 for (const targetDocument of runtime.documents.keys()) {
9176 injectStyle(targetDocument, hash, css);
9177 }
9178 }
9179 if (typeof process === "undefined" || true) {
9180 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)}}}');
9181 }
9182 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" };
9183 if (typeof process === "undefined" || true) {
9184 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)}");
9185 }
9186 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" };
9187 var Text = (0, import_element11.forwardRef)(function Text2({ variant = "body-md", render: render4, className, ...props }, ref) {
9188 const element = useRender({
9189 render: render4,
9190 defaultTagName: "span",
9191 ref,
9192 props: mergeProps(props, {
9193 className: clsx_default(
9194 style_default.text,
9195 global_css_defense_default.heading,
9196 global_css_defense_default.p,
9197 style_default[variant],
9198 className
9199 )
9200 })
9201 });
9202 return element;
9203 });
9204
9205 // packages/ui/build-module/icon/icon.mjs
9206 var import_element12 = __toESM(require_element(), 1);
9207 var import_primitives26 = __toESM(require_primitives(), 1);
9208 var import_jsx_runtime36 = __toESM(require_jsx_runtime(), 1);
9209 var Icon = (0, import_element12.forwardRef)(function Icon2({ icon, size: size4 = 24, ...restProps }, ref) {
9210 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
9211 import_primitives26.SVG,
9212 {
9213 ref,
9214 ...icon.props,
9215 ...restProps,
9216 width: size4,
9217 height: size4
9218 }
9219 );
9220 });
9221
9222 // packages/ui/build-module/utils/render-slot-with-children.mjs
9223 var import_element13 = __toESM(require_element(), 1);
9224 function renderSlotWithChildren(slot, defaultSlot, children) {
9225 return (0, import_element13.cloneElement)(slot ?? defaultSlot, { children });
9226 }
9227
9228 // packages/ui/build-module/utils/theme-provider.mjs
9229 var theme = __toESM(require_theme(), 1);
9230
9231 // packages/ui/build-module/lock-unlock.mjs
9232 var import_private_apis = __toESM(require_private_apis(), 1);
9233 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
9234 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
9235 "@wordpress/ui"
9236 );
9237
9238 // packages/ui/build-module/utils/theme-provider.mjs
9239 function getThemeProvider() {
9240 const themePackage = theme;
9241 if (themePackage.ThemeProvider) {
9242 return themePackage.ThemeProvider;
9243 }
9244 if (!themePackage.privateApis) {
9245 throw new Error(
9246 "@wordpress/ui: @wordpress/theme must expose `ThemeProvider` or `privateApis.ThemeProvider`."
9247 );
9248 }
9249 return unlock(
9250 themePackage.privateApis
9251 ).ThemeProvider;
9252 }
9253 var ThemeProvider = getThemeProvider();
9254
9255 // packages/ui/build-module/stack/stack.mjs
9256 var import_element14 = __toESM(require_element(), 1);
9257 var STYLE_HASH_ATTRIBUTE2 = "data-wp-hash";
9258 function getRuntime2() {
9259 const globalScope = globalThis;
9260 if (globalScope.__wpStyleRuntime) {
9261 return globalScope.__wpStyleRuntime;
9262 }
9263 globalScope.__wpStyleRuntime = {
9264 documents: /* @__PURE__ */ new Map(),
9265 styles: /* @__PURE__ */ new Map(),
9266 injectedStyles: /* @__PURE__ */ new WeakMap()
9267 };
9268 if (typeof document !== "undefined") {
9269 registerDocument2(document);
9270 }
9271 return globalScope.__wpStyleRuntime;
9272 }
9273 function documentContainsStyleHash2(targetDocument, hash) {
9274 if (!targetDocument.head) {
9275 return false;
9276 }
9277 for (const style of targetDocument.head.querySelectorAll(
9278 `style[${STYLE_HASH_ATTRIBUTE2}]`
9279 )) {
9280 if (style.getAttribute(STYLE_HASH_ATTRIBUTE2) === hash) {
9281 return true;
9282 }
9283 }
9284 return false;
9285 }
9286 function injectStyle2(targetDocument, hash, css) {
9287 if (!targetDocument.head) {
9288 return;
9289 }
9290 const runtime = getRuntime2();
9291 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9292 if (!injectedStyles) {
9293 injectedStyles = /* @__PURE__ */ new Set();
9294 runtime.injectedStyles.set(targetDocument, injectedStyles);
9295 }
9296 if (injectedStyles.has(hash)) {
9297 return;
9298 }
9299 if (documentContainsStyleHash2(targetDocument, hash)) {
9300 injectedStyles.add(hash);
9301 return;
9302 }
9303 const style = targetDocument.createElement("style");
9304 style.setAttribute(STYLE_HASH_ATTRIBUTE2, hash);
9305 style.appendChild(targetDocument.createTextNode(css));
9306 targetDocument.head.appendChild(style);
9307 injectedStyles.add(hash);
9308 }
9309 function registerDocument2(targetDocument) {
9310 const runtime = getRuntime2();
9311 runtime.documents.set(
9312 targetDocument,
9313 (runtime.documents.get(targetDocument) ?? 0) + 1
9314 );
9315 for (const [hash, css] of runtime.styles) {
9316 injectStyle2(targetDocument, hash, css);
9317 }
9318 return () => {
9319 const count = runtime.documents.get(targetDocument);
9320 if (count === void 0) {
9321 return;
9322 }
9323 if (count <= 1) {
9324 runtime.documents.delete(targetDocument);
9325 return;
9326 }
9327 runtime.documents.set(targetDocument, count - 1);
9328 };
9329 }
9330 function registerStyle2(hash, css) {
9331 const runtime = getRuntime2();
9332 runtime.styles.set(hash, css);
9333 for (const targetDocument of runtime.documents.keys()) {
9334 injectStyle2(targetDocument, hash, css);
9335 }
9336 }
9337 if (typeof process === "undefined" || true) {
9338 registerStyle2("32aba35fe1", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._19ce0419607e1896__stack{display:flex}}}");
9339 }
9340 var style_default2 = { "stack": "_19ce0419607e1896__stack" };
9341 var gapTokens = {
9342 xs: "var(--wpds-dimension-gap-xs, 4px)",
9343 sm: "var(--wpds-dimension-gap-sm, 8px)",
9344 md: "var(--wpds-dimension-gap-md, 12px)",
9345 lg: "var(--wpds-dimension-gap-lg, 16px)",
9346 xl: "var(--wpds-dimension-gap-xl, 24px)",
9347 "2xl": "var(--wpds-dimension-gap-2xl, 32px)",
9348 "3xl": "var(--wpds-dimension-gap-3xl, 40px)"
9349 };
9350 var Stack = (0, import_element14.forwardRef)(function Stack2({ direction, gap, align, justify, wrap, render: render4, ...props }, ref) {
9351 const style = {
9352 gap: gap && gapTokens[gap],
9353 alignItems: align,
9354 justifyContent: justify,
9355 flexDirection: direction,
9356 flexWrap: wrap
9357 };
9358 const element = useRender({
9359 render: render4,
9360 ref,
9361 props: mergeProps(props, { style, className: style_default2.stack })
9362 });
9363 return element;
9364 });
9365
9366 // packages/ui/build-module/tooltip/index.mjs
9367 var tooltip_exports = {};
9368 __export(tooltip_exports, {
9369 Popup: () => Popup,
9370 Portal: () => Portal,
9371 Positioner: () => Positioner,
9372 Provider: () => Provider,
9373 Root: () => Root,
9374 Trigger: () => Trigger
9375 });
9376
9377 // packages/ui/build-module/tooltip/popup.mjs
9378 var import_element17 = __toESM(require_element(), 1);
9379
9380 // packages/ui/build-module/tooltip/portal.mjs
9381 var import_element15 = __toESM(require_element(), 1);
9382
9383 // packages/ui/build-module/utils/wp-compat-overlay-slot.mjs
9384 var STYLE_HASH_ATTRIBUTE3 = "data-wp-hash";
9385 function getRuntime3() {
9386 const globalScope = globalThis;
9387 if (globalScope.__wpStyleRuntime) {
9388 return globalScope.__wpStyleRuntime;
9389 }
9390 globalScope.__wpStyleRuntime = {
9391 documents: /* @__PURE__ */ new Map(),
9392 styles: /* @__PURE__ */ new Map(),
9393 injectedStyles: /* @__PURE__ */ new WeakMap()
9394 };
9395 if (typeof document !== "undefined") {
9396 registerDocument3(document);
9397 }
9398 return globalScope.__wpStyleRuntime;
9399 }
9400 function documentContainsStyleHash3(targetDocument, hash) {
9401 if (!targetDocument.head) {
9402 return false;
9403 }
9404 for (const style of targetDocument.head.querySelectorAll(
9405 `style[${STYLE_HASH_ATTRIBUTE3}]`
9406 )) {
9407 if (style.getAttribute(STYLE_HASH_ATTRIBUTE3) === hash) {
9408 return true;
9409 }
9410 }
9411 return false;
9412 }
9413 function injectStyle3(targetDocument, hash, css) {
9414 if (!targetDocument.head) {
9415 return;
9416 }
9417 const runtime = getRuntime3();
9418 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9419 if (!injectedStyles) {
9420 injectedStyles = /* @__PURE__ */ new Set();
9421 runtime.injectedStyles.set(targetDocument, injectedStyles);
9422 }
9423 if (injectedStyles.has(hash)) {
9424 return;
9425 }
9426 if (documentContainsStyleHash3(targetDocument, hash)) {
9427 injectedStyles.add(hash);
9428 return;
9429 }
9430 const style = targetDocument.createElement("style");
9431 style.setAttribute(STYLE_HASH_ATTRIBUTE3, hash);
9432 style.appendChild(targetDocument.createTextNode(css));
9433 targetDocument.head.appendChild(style);
9434 injectedStyles.add(hash);
9435 }
9436 function registerDocument3(targetDocument) {
9437 const runtime = getRuntime3();
9438 runtime.documents.set(
9439 targetDocument,
9440 (runtime.documents.get(targetDocument) ?? 0) + 1
9441 );
9442 for (const [hash, css] of runtime.styles) {
9443 injectStyle3(targetDocument, hash, css);
9444 }
9445 return () => {
9446 const count = runtime.documents.get(targetDocument);
9447 if (count === void 0) {
9448 return;
9449 }
9450 if (count <= 1) {
9451 runtime.documents.delete(targetDocument);
9452 return;
9453 }
9454 runtime.documents.set(targetDocument, count - 1);
9455 };
9456 }
9457 function registerStyle3(hash, css) {
9458 const runtime = getRuntime3();
9459 runtime.styles.set(hash, css);
9460 for (const targetDocument of runtime.documents.keys()) {
9461 injectStyle3(targetDocument, hash, css);
9462 }
9463 }
9464 if (typeof process === "undefined" || true) {
9465 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}}}");
9466 }
9467 var wp_compat_overlay_slot_default = { "slot": "_11fc52b637ff8a7e__slot" };
9468 var WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE = "data-wp-compat-overlay-slot";
9469 function resolveOwnerDocument() {
9470 return typeof document === "undefined" ? null : document;
9471 }
9472 function isInWordPressEnvironment() {
9473 let topWp;
9474 try {
9475 topWp = window.top?.wp;
9476 } catch {
9477 }
9478 const wp = topWp ?? window.wp;
9479 return typeof wp?.components === "object" && wp.components !== null;
9480 }
9481 var cachedSlot = null;
9482 function ensureSlotIsAccessible(element) {
9483 element.setAttribute("aria-hidden", "false");
9484 return element;
9485 }
9486 function createSlot(ownerDocument2) {
9487 const element = ownerDocument2.createElement("div");
9488 element.setAttribute(WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE, "");
9489 if (wp_compat_overlay_slot_default.slot) {
9490 element.classList.add(wp_compat_overlay_slot_default.slot);
9491 }
9492 ownerDocument2.body.appendChild(element);
9493 return element;
9494 }
9495 function getWpCompatOverlaySlot() {
9496 if (typeof window === "undefined") {
9497 return void 0;
9498 }
9499 if (!isInWordPressEnvironment() && window.__wpUiCompatOverlaySlotEnabled !== true) {
9500 return void 0;
9501 }
9502 const ownerDocument2 = resolveOwnerDocument();
9503 if (!ownerDocument2 || !ownerDocument2.body) {
9504 return void 0;
9505 }
9506 if (cachedSlot && cachedSlot.ownerDocument === ownerDocument2 && cachedSlot.isConnected) {
9507 return ensureSlotIsAccessible(cachedSlot);
9508 }
9509 const existing = ownerDocument2.querySelector(
9510 `[${WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE}]`
9511 );
9512 if (existing instanceof HTMLDivElement) {
9513 cachedSlot = ensureSlotIsAccessible(existing);
9514 return cachedSlot;
9515 }
9516 if (cachedSlot?.isConnected) {
9517 cachedSlot.remove();
9518 }
9519 cachedSlot = ensureSlotIsAccessible(createSlot(ownerDocument2));
9520 return cachedSlot;
9521 }
9522
9523 // packages/ui/build-module/tooltip/portal.mjs
9524 var import_jsx_runtime37 = __toESM(require_jsx_runtime(), 1);
9525 var Portal = (0, import_element15.forwardRef)(
9526 function TooltipPortal3({ container, ...restProps }, ref) {
9527 return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
9528 index_parts_exports.Portal,
9529 {
9530 container: container ?? getWpCompatOverlaySlot(),
9531 ...restProps,
9532 ref
9533 }
9534 );
9535 }
9536 );
9537
9538 // packages/ui/build-module/tooltip/positioner.mjs
9539 var import_element16 = __toESM(require_element(), 1);
9540 var import_jsx_runtime38 = __toESM(require_jsx_runtime(), 1);
9541 var STYLE_HASH_ATTRIBUTE4 = "data-wp-hash";
9542 function getRuntime4() {
9543 const globalScope = globalThis;
9544 if (globalScope.__wpStyleRuntime) {
9545 return globalScope.__wpStyleRuntime;
9546 }
9547 globalScope.__wpStyleRuntime = {
9548 documents: /* @__PURE__ */ new Map(),
9549 styles: /* @__PURE__ */ new Map(),
9550 injectedStyles: /* @__PURE__ */ new WeakMap()
9551 };
9552 if (typeof document !== "undefined") {
9553 registerDocument4(document);
9554 }
9555 return globalScope.__wpStyleRuntime;
9556 }
9557 function documentContainsStyleHash4(targetDocument, hash) {
9558 if (!targetDocument.head) {
9559 return false;
9560 }
9561 for (const style of targetDocument.head.querySelectorAll(
9562 `style[${STYLE_HASH_ATTRIBUTE4}]`
9563 )) {
9564 if (style.getAttribute(STYLE_HASH_ATTRIBUTE4) === hash) {
9565 return true;
9566 }
9567 }
9568 return false;
9569 }
9570 function injectStyle4(targetDocument, hash, css) {
9571 if (!targetDocument.head) {
9572 return;
9573 }
9574 const runtime = getRuntime4();
9575 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9576 if (!injectedStyles) {
9577 injectedStyles = /* @__PURE__ */ new Set();
9578 runtime.injectedStyles.set(targetDocument, injectedStyles);
9579 }
9580 if (injectedStyles.has(hash)) {
9581 return;
9582 }
9583 if (documentContainsStyleHash4(targetDocument, hash)) {
9584 injectedStyles.add(hash);
9585 return;
9586 }
9587 const style = targetDocument.createElement("style");
9588 style.setAttribute(STYLE_HASH_ATTRIBUTE4, hash);
9589 style.appendChild(targetDocument.createTextNode(css));
9590 targetDocument.head.appendChild(style);
9591 injectedStyles.add(hash);
9592 }
9593 function registerDocument4(targetDocument) {
9594 const runtime = getRuntime4();
9595 runtime.documents.set(
9596 targetDocument,
9597 (runtime.documents.get(targetDocument) ?? 0) + 1
9598 );
9599 for (const [hash, css] of runtime.styles) {
9600 injectStyle4(targetDocument, hash, css);
9601 }
9602 return () => {
9603 const count = runtime.documents.get(targetDocument);
9604 if (count === void 0) {
9605 return;
9606 }
9607 if (count <= 1) {
9608 runtime.documents.delete(targetDocument);
9609 return;
9610 }
9611 runtime.documents.set(targetDocument, count - 1);
9612 };
9613 }
9614 function registerStyle4(hash, css) {
9615 const runtime = getRuntime4();
9616 runtime.styles.set(hash, css);
9617 for (const targetDocument of runtime.documents.keys()) {
9618 injectStyle4(targetDocument, hash, css);
9619 }
9620 }
9621 if (typeof process === "undefined" || true) {
9622 registerStyle4("10f3806643", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._336cd3e4e743482f__box-sizing{box-sizing:border-box;*,:after,:before{box-sizing:inherit}}}}");
9623 }
9624 var resets_default = { "box-sizing": "_336cd3e4e743482f__box-sizing" };
9625 if (typeof process === "undefined" || true) {
9626 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}}}}');
9627 }
9628 var style_default3 = { "positioner": "_480b748dd3510e64__positioner", "popup": "_50096b232db7709d__popup" };
9629 var Positioner = (0, import_element16.forwardRef)(
9630 function TooltipPositioner3({ align = "center", className, side = "top", sideOffset = 4, ...props }, ref) {
9631 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
9632 index_parts_exports.Positioner,
9633 {
9634 ref,
9635 align,
9636 side,
9637 sideOffset,
9638 ...props,
9639 className: clsx_default(
9640 resets_default["box-sizing"],
9641 style_default3.positioner,
9642 className
9643 )
9644 }
9645 );
9646 }
9647 );
9648
9649 // packages/ui/build-module/tooltip/popup.mjs
9650 var import_jsx_runtime39 = __toESM(require_jsx_runtime(), 1);
9651 var STYLE_HASH_ATTRIBUTE5 = "data-wp-hash";
9652 function getRuntime5() {
9653 const globalScope = globalThis;
9654 if (globalScope.__wpStyleRuntime) {
9655 return globalScope.__wpStyleRuntime;
9656 }
9657 globalScope.__wpStyleRuntime = {
9658 documents: /* @__PURE__ */ new Map(),
9659 styles: /* @__PURE__ */ new Map(),
9660 injectedStyles: /* @__PURE__ */ new WeakMap()
9661 };
9662 if (typeof document !== "undefined") {
9663 registerDocument5(document);
9664 }
9665 return globalScope.__wpStyleRuntime;
9666 }
9667 function documentContainsStyleHash5(targetDocument, hash) {
9668 if (!targetDocument.head) {
9669 return false;
9670 }
9671 for (const style of targetDocument.head.querySelectorAll(
9672 `style[${STYLE_HASH_ATTRIBUTE5}]`
9673 )) {
9674 if (style.getAttribute(STYLE_HASH_ATTRIBUTE5) === hash) {
9675 return true;
9676 }
9677 }
9678 return false;
9679 }
9680 function injectStyle5(targetDocument, hash, css) {
9681 if (!targetDocument.head) {
9682 return;
9683 }
9684 const runtime = getRuntime5();
9685 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9686 if (!injectedStyles) {
9687 injectedStyles = /* @__PURE__ */ new Set();
9688 runtime.injectedStyles.set(targetDocument, injectedStyles);
9689 }
9690 if (injectedStyles.has(hash)) {
9691 return;
9692 }
9693 if (documentContainsStyleHash5(targetDocument, hash)) {
9694 injectedStyles.add(hash);
9695 return;
9696 }
9697 const style = targetDocument.createElement("style");
9698 style.setAttribute(STYLE_HASH_ATTRIBUTE5, hash);
9699 style.appendChild(targetDocument.createTextNode(css));
9700 targetDocument.head.appendChild(style);
9701 injectedStyles.add(hash);
9702 }
9703 function registerDocument5(targetDocument) {
9704 const runtime = getRuntime5();
9705 runtime.documents.set(
9706 targetDocument,
9707 (runtime.documents.get(targetDocument) ?? 0) + 1
9708 );
9709 for (const [hash, css] of runtime.styles) {
9710 injectStyle5(targetDocument, hash, css);
9711 }
9712 return () => {
9713 const count = runtime.documents.get(targetDocument);
9714 if (count === void 0) {
9715 return;
9716 }
9717 if (count <= 1) {
9718 runtime.documents.delete(targetDocument);
9719 return;
9720 }
9721 runtime.documents.set(targetDocument, count - 1);
9722 };
9723 }
9724 function registerStyle5(hash, css) {
9725 const runtime = getRuntime5();
9726 runtime.styles.set(hash, css);
9727 for (const targetDocument of runtime.documents.keys()) {
9728 injectStyle5(targetDocument, hash, css);
9729 }
9730 }
9731 if (typeof process === "undefined" || true) {
9732 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}}}}');
9733 }
9734 var style_default4 = { "positioner": "_480b748dd3510e64__positioner", "popup": "_50096b232db7709d__popup" };
9735 var POPUP_COLOR = { background: "#1e1e1e" };
9736 var Popup = (0, import_element17.forwardRef)(function TooltipPopup3({ portal, positioner, children, className, ...props }, ref) {
9737 const popupContent = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ThemeProvider, { color: POPUP_COLOR, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
9738 index_parts_exports.Popup,
9739 {
9740 ref,
9741 className: clsx_default(style_default4.popup, className),
9742 ...props,
9743 children
9744 }
9745 ) });
9746 const positionedPopup = renderSlotWithChildren(
9747 positioner,
9748 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Positioner, {}),
9749 popupContent
9750 );
9751 return renderSlotWithChildren(portal, /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Portal, {}), positionedPopup);
9752 });
9753
9754 // packages/ui/build-module/tooltip/trigger.mjs
9755 var import_element18 = __toESM(require_element(), 1);
9756 var import_jsx_runtime40 = __toESM(require_jsx_runtime(), 1);
9757 var Trigger = (0, import_element18.forwardRef)(
9758 function TooltipTrigger3(props, ref) {
9759 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(index_parts_exports.Trigger, { ref, ...props });
9760 }
9761 );
9762
9763 // packages/ui/build-module/tooltip/root.mjs
9764 var import_jsx_runtime41 = __toESM(require_jsx_runtime(), 1);
9765 function Root(props) {
9766 return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(index_parts_exports.Root, { ...props });
9767 }
9768
9769 // packages/ui/build-module/tooltip/provider.mjs
9770 var import_jsx_runtime42 = __toESM(require_jsx_runtime(), 1);
9771 function Provider({ ...props }) {
9772 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(index_parts_exports.Provider, { ...props });
9773 }
9774
9775 // packages/ui/build-module/empty-state/index.mjs
9776 var empty_state_exports = {};
9777 __export(empty_state_exports, {
9778 Actions: () => Actions,
9779 Description: () => Description,
9780 Icon: () => Icon3,
9781 Root: () => Root2,
9782 Title: () => Title,
9783 Visual: () => Visual
9784 });
9785
9786 // packages/ui/build-module/empty-state/root.mjs
9787 var import_element19 = __toESM(require_element(), 1);
9788 var STYLE_HASH_ATTRIBUTE6 = "data-wp-hash";
9789 function getRuntime6() {
9790 const globalScope = globalThis;
9791 if (globalScope.__wpStyleRuntime) {
9792 return globalScope.__wpStyleRuntime;
9793 }
9794 globalScope.__wpStyleRuntime = {
9795 documents: /* @__PURE__ */ new Map(),
9796 styles: /* @__PURE__ */ new Map(),
9797 injectedStyles: /* @__PURE__ */ new WeakMap()
9798 };
9799 if (typeof document !== "undefined") {
9800 registerDocument6(document);
9801 }
9802 return globalScope.__wpStyleRuntime;
9803 }
9804 function documentContainsStyleHash6(targetDocument, hash) {
9805 if (!targetDocument.head) {
9806 return false;
9807 }
9808 for (const style of targetDocument.head.querySelectorAll(
9809 `style[${STYLE_HASH_ATTRIBUTE6}]`
9810 )) {
9811 if (style.getAttribute(STYLE_HASH_ATTRIBUTE6) === hash) {
9812 return true;
9813 }
9814 }
9815 return false;
9816 }
9817 function injectStyle6(targetDocument, hash, css) {
9818 if (!targetDocument.head) {
9819 return;
9820 }
9821 const runtime = getRuntime6();
9822 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9823 if (!injectedStyles) {
9824 injectedStyles = /* @__PURE__ */ new Set();
9825 runtime.injectedStyles.set(targetDocument, injectedStyles);
9826 }
9827 if (injectedStyles.has(hash)) {
9828 return;
9829 }
9830 if (documentContainsStyleHash6(targetDocument, hash)) {
9831 injectedStyles.add(hash);
9832 return;
9833 }
9834 const style = targetDocument.createElement("style");
9835 style.setAttribute(STYLE_HASH_ATTRIBUTE6, hash);
9836 style.appendChild(targetDocument.createTextNode(css));
9837 targetDocument.head.appendChild(style);
9838 injectedStyles.add(hash);
9839 }
9840 function registerDocument6(targetDocument) {
9841 const runtime = getRuntime6();
9842 runtime.documents.set(
9843 targetDocument,
9844 (runtime.documents.get(targetDocument) ?? 0) + 1
9845 );
9846 for (const [hash, css] of runtime.styles) {
9847 injectStyle6(targetDocument, hash, css);
9848 }
9849 return () => {
9850 const count = runtime.documents.get(targetDocument);
9851 if (count === void 0) {
9852 return;
9853 }
9854 if (count <= 1) {
9855 runtime.documents.delete(targetDocument);
9856 return;
9857 }
9858 runtime.documents.set(targetDocument, count - 1);
9859 };
9860 }
9861 function registerStyle6(hash, css) {
9862 const runtime = getRuntime6();
9863 runtime.styles.set(hash, css);
9864 for (const targetDocument of runtime.documents.keys()) {
9865 injectStyle6(targetDocument, hash, css);
9866 }
9867 }
9868 if (typeof process === "undefined" || true) {
9869 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}}}}');
9870 }
9871 var style_default5 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
9872 var Root2 = (0, import_element19.forwardRef)(
9873 function EmptyStateRoot({ render: render4, ...props }, ref) {
9874 const className = clsx_default(style_default5.root);
9875 const element = useRender({
9876 defaultTagName: "div",
9877 render: render4,
9878 ref,
9879 props: mergeProps({ className }, props)
9880 });
9881 return element;
9882 }
9883 );
9884
9885 // packages/ui/build-module/empty-state/visual.mjs
9886 var import_element20 = __toESM(require_element(), 1);
9887 var STYLE_HASH_ATTRIBUTE7 = "data-wp-hash";
9888 function getRuntime7() {
9889 const globalScope = globalThis;
9890 if (globalScope.__wpStyleRuntime) {
9891 return globalScope.__wpStyleRuntime;
9892 }
9893 globalScope.__wpStyleRuntime = {
9894 documents: /* @__PURE__ */ new Map(),
9895 styles: /* @__PURE__ */ new Map(),
9896 injectedStyles: /* @__PURE__ */ new WeakMap()
9897 };
9898 if (typeof document !== "undefined") {
9899 registerDocument7(document);
9900 }
9901 return globalScope.__wpStyleRuntime;
9902 }
9903 function documentContainsStyleHash7(targetDocument, hash) {
9904 if (!targetDocument.head) {
9905 return false;
9906 }
9907 for (const style of targetDocument.head.querySelectorAll(
9908 `style[${STYLE_HASH_ATTRIBUTE7}]`
9909 )) {
9910 if (style.getAttribute(STYLE_HASH_ATTRIBUTE7) === hash) {
9911 return true;
9912 }
9913 }
9914 return false;
9915 }
9916 function injectStyle7(targetDocument, hash, css) {
9917 if (!targetDocument.head) {
9918 return;
9919 }
9920 const runtime = getRuntime7();
9921 let injectedStyles = runtime.injectedStyles.get(targetDocument);
9922 if (!injectedStyles) {
9923 injectedStyles = /* @__PURE__ */ new Set();
9924 runtime.injectedStyles.set(targetDocument, injectedStyles);
9925 }
9926 if (injectedStyles.has(hash)) {
9927 return;
9928 }
9929 if (documentContainsStyleHash7(targetDocument, hash)) {
9930 injectedStyles.add(hash);
9931 return;
9932 }
9933 const style = targetDocument.createElement("style");
9934 style.setAttribute(STYLE_HASH_ATTRIBUTE7, hash);
9935 style.appendChild(targetDocument.createTextNode(css));
9936 targetDocument.head.appendChild(style);
9937 injectedStyles.add(hash);
9938 }
9939 function registerDocument7(targetDocument) {
9940 const runtime = getRuntime7();
9941 runtime.documents.set(
9942 targetDocument,
9943 (runtime.documents.get(targetDocument) ?? 0) + 1
9944 );
9945 for (const [hash, css] of runtime.styles) {
9946 injectStyle7(targetDocument, hash, css);
9947 }
9948 return () => {
9949 const count = runtime.documents.get(targetDocument);
9950 if (count === void 0) {
9951 return;
9952 }
9953 if (count <= 1) {
9954 runtime.documents.delete(targetDocument);
9955 return;
9956 }
9957 runtime.documents.set(targetDocument, count - 1);
9958 };
9959 }
9960 function registerStyle7(hash, css) {
9961 const runtime = getRuntime7();
9962 runtime.styles.set(hash, css);
9963 for (const targetDocument of runtime.documents.keys()) {
9964 injectStyle7(targetDocument, hash, css);
9965 }
9966 }
9967 if (typeof process === "undefined" || true) {
9968 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}}}}');
9969 }
9970 var style_default6 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
9971 var Visual = (0, import_element20.forwardRef)(
9972 function EmptyStateVisual({ render: render4, ...props }, ref) {
9973 const className = clsx_default(style_default6.visual);
9974 const element = useRender({
9975 defaultTagName: "div",
9976 render: render4,
9977 ref,
9978 props: mergeProps({ className }, props)
9979 });
9980 return element;
9981 }
9982 );
9983
9984 // packages/ui/build-module/empty-state/icon.mjs
9985 var import_element21 = __toESM(require_element(), 1);
9986 var import_jsx_runtime43 = __toESM(require_jsx_runtime(), 1);
9987 var STYLE_HASH_ATTRIBUTE8 = "data-wp-hash";
9988 function getRuntime8() {
9989 const globalScope = globalThis;
9990 if (globalScope.__wpStyleRuntime) {
9991 return globalScope.__wpStyleRuntime;
9992 }
9993 globalScope.__wpStyleRuntime = {
9994 documents: /* @__PURE__ */ new Map(),
9995 styles: /* @__PURE__ */ new Map(),
9996 injectedStyles: /* @__PURE__ */ new WeakMap()
9997 };
9998 if (typeof document !== "undefined") {
9999 registerDocument8(document);
10000 }
10001 return globalScope.__wpStyleRuntime;
10002 }
10003 function documentContainsStyleHash8(targetDocument, hash) {
10004 if (!targetDocument.head) {
10005 return false;
10006 }
10007 for (const style of targetDocument.head.querySelectorAll(
10008 `style[${STYLE_HASH_ATTRIBUTE8}]`
10009 )) {
10010 if (style.getAttribute(STYLE_HASH_ATTRIBUTE8) === hash) {
10011 return true;
10012 }
10013 }
10014 return false;
10015 }
10016 function injectStyle8(targetDocument, hash, css) {
10017 if (!targetDocument.head) {
10018 return;
10019 }
10020 const runtime = getRuntime8();
10021 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10022 if (!injectedStyles) {
10023 injectedStyles = /* @__PURE__ */ new Set();
10024 runtime.injectedStyles.set(targetDocument, injectedStyles);
10025 }
10026 if (injectedStyles.has(hash)) {
10027 return;
10028 }
10029 if (documentContainsStyleHash8(targetDocument, hash)) {
10030 injectedStyles.add(hash);
10031 return;
10032 }
10033 const style = targetDocument.createElement("style");
10034 style.setAttribute(STYLE_HASH_ATTRIBUTE8, hash);
10035 style.appendChild(targetDocument.createTextNode(css));
10036 targetDocument.head.appendChild(style);
10037 injectedStyles.add(hash);
10038 }
10039 function registerDocument8(targetDocument) {
10040 const runtime = getRuntime8();
10041 runtime.documents.set(
10042 targetDocument,
10043 (runtime.documents.get(targetDocument) ?? 0) + 1
10044 );
10045 for (const [hash, css] of runtime.styles) {
10046 injectStyle8(targetDocument, hash, css);
10047 }
10048 return () => {
10049 const count = runtime.documents.get(targetDocument);
10050 if (count === void 0) {
10051 return;
10052 }
10053 if (count <= 1) {
10054 runtime.documents.delete(targetDocument);
10055 return;
10056 }
10057 runtime.documents.set(targetDocument, count - 1);
10058 };
10059 }
10060 function registerStyle8(hash, css) {
10061 const runtime = getRuntime8();
10062 runtime.styles.set(hash, css);
10063 for (const targetDocument of runtime.documents.keys()) {
10064 injectStyle8(targetDocument, hash, css);
10065 }
10066 }
10067 if (typeof process === "undefined" || true) {
10068 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}}}}');
10069 }
10070 var style_default7 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10071 var Icon3 = (0, import_element21.forwardRef)(
10072 function EmptyStateIcon({ icon, className, ...restProps }, ref) {
10073 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
10074 Visual,
10075 {
10076 ref,
10077 className: clsx_default(style_default7.icon, className),
10078 ...restProps,
10079 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(Icon, { icon })
10080 }
10081 );
10082 }
10083 );
10084
10085 // packages/ui/build-module/empty-state/title.mjs
10086 var import_element22 = __toESM(require_element(), 1);
10087 var import_jsx_runtime44 = __toESM(require_jsx_runtime(), 1);
10088 var STYLE_HASH_ATTRIBUTE9 = "data-wp-hash";
10089 function getRuntime9() {
10090 const globalScope = globalThis;
10091 if (globalScope.__wpStyleRuntime) {
10092 return globalScope.__wpStyleRuntime;
10093 }
10094 globalScope.__wpStyleRuntime = {
10095 documents: /* @__PURE__ */ new Map(),
10096 styles: /* @__PURE__ */ new Map(),
10097 injectedStyles: /* @__PURE__ */ new WeakMap()
10098 };
10099 if (typeof document !== "undefined") {
10100 registerDocument9(document);
10101 }
10102 return globalScope.__wpStyleRuntime;
10103 }
10104 function documentContainsStyleHash9(targetDocument, hash) {
10105 if (!targetDocument.head) {
10106 return false;
10107 }
10108 for (const style of targetDocument.head.querySelectorAll(
10109 `style[${STYLE_HASH_ATTRIBUTE9}]`
10110 )) {
10111 if (style.getAttribute(STYLE_HASH_ATTRIBUTE9) === hash) {
10112 return true;
10113 }
10114 }
10115 return false;
10116 }
10117 function injectStyle9(targetDocument, hash, css) {
10118 if (!targetDocument.head) {
10119 return;
10120 }
10121 const runtime = getRuntime9();
10122 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10123 if (!injectedStyles) {
10124 injectedStyles = /* @__PURE__ */ new Set();
10125 runtime.injectedStyles.set(targetDocument, injectedStyles);
10126 }
10127 if (injectedStyles.has(hash)) {
10128 return;
10129 }
10130 if (documentContainsStyleHash9(targetDocument, hash)) {
10131 injectedStyles.add(hash);
10132 return;
10133 }
10134 const style = targetDocument.createElement("style");
10135 style.setAttribute(STYLE_HASH_ATTRIBUTE9, hash);
10136 style.appendChild(targetDocument.createTextNode(css));
10137 targetDocument.head.appendChild(style);
10138 injectedStyles.add(hash);
10139 }
10140 function registerDocument9(targetDocument) {
10141 const runtime = getRuntime9();
10142 runtime.documents.set(
10143 targetDocument,
10144 (runtime.documents.get(targetDocument) ?? 0) + 1
10145 );
10146 for (const [hash, css] of runtime.styles) {
10147 injectStyle9(targetDocument, hash, css);
10148 }
10149 return () => {
10150 const count = runtime.documents.get(targetDocument);
10151 if (count === void 0) {
10152 return;
10153 }
10154 if (count <= 1) {
10155 runtime.documents.delete(targetDocument);
10156 return;
10157 }
10158 runtime.documents.set(targetDocument, count - 1);
10159 };
10160 }
10161 function registerStyle9(hash, css) {
10162 const runtime = getRuntime9();
10163 runtime.styles.set(hash, css);
10164 for (const targetDocument of runtime.documents.keys()) {
10165 injectStyle9(targetDocument, hash, css);
10166 }
10167 }
10168 if (typeof process === "undefined" || true) {
10169 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}}}}');
10170 }
10171 var style_default8 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10172 var DEFAULT_TAG = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("h2", {});
10173 var Title = (0, import_element22.forwardRef)(
10174 function EmptyStateTitle({ render: render4 = DEFAULT_TAG, className, children, ...props }, ref) {
10175 return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
10176 Text,
10177 {
10178 ref,
10179 variant: "heading-lg",
10180 render: render4,
10181 className: clsx_default(style_default8.title, className),
10182 ...props,
10183 children
10184 }
10185 );
10186 }
10187 );
10188
10189 // packages/ui/build-module/empty-state/description.mjs
10190 var import_element23 = __toESM(require_element(), 1);
10191 var import_jsx_runtime45 = __toESM(require_jsx_runtime(), 1);
10192 var STYLE_HASH_ATTRIBUTE10 = "data-wp-hash";
10193 function getRuntime10() {
10194 const globalScope = globalThis;
10195 if (globalScope.__wpStyleRuntime) {
10196 return globalScope.__wpStyleRuntime;
10197 }
10198 globalScope.__wpStyleRuntime = {
10199 documents: /* @__PURE__ */ new Map(),
10200 styles: /* @__PURE__ */ new Map(),
10201 injectedStyles: /* @__PURE__ */ new WeakMap()
10202 };
10203 if (typeof document !== "undefined") {
10204 registerDocument10(document);
10205 }
10206 return globalScope.__wpStyleRuntime;
10207 }
10208 function documentContainsStyleHash10(targetDocument, hash) {
10209 if (!targetDocument.head) {
10210 return false;
10211 }
10212 for (const style of targetDocument.head.querySelectorAll(
10213 `style[${STYLE_HASH_ATTRIBUTE10}]`
10214 )) {
10215 if (style.getAttribute(STYLE_HASH_ATTRIBUTE10) === hash) {
10216 return true;
10217 }
10218 }
10219 return false;
10220 }
10221 function injectStyle10(targetDocument, hash, css) {
10222 if (!targetDocument.head) {
10223 return;
10224 }
10225 const runtime = getRuntime10();
10226 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10227 if (!injectedStyles) {
10228 injectedStyles = /* @__PURE__ */ new Set();
10229 runtime.injectedStyles.set(targetDocument, injectedStyles);
10230 }
10231 if (injectedStyles.has(hash)) {
10232 return;
10233 }
10234 if (documentContainsStyleHash10(targetDocument, hash)) {
10235 injectedStyles.add(hash);
10236 return;
10237 }
10238 const style = targetDocument.createElement("style");
10239 style.setAttribute(STYLE_HASH_ATTRIBUTE10, hash);
10240 style.appendChild(targetDocument.createTextNode(css));
10241 targetDocument.head.appendChild(style);
10242 injectedStyles.add(hash);
10243 }
10244 function registerDocument10(targetDocument) {
10245 const runtime = getRuntime10();
10246 runtime.documents.set(
10247 targetDocument,
10248 (runtime.documents.get(targetDocument) ?? 0) + 1
10249 );
10250 for (const [hash, css] of runtime.styles) {
10251 injectStyle10(targetDocument, hash, css);
10252 }
10253 return () => {
10254 const count = runtime.documents.get(targetDocument);
10255 if (count === void 0) {
10256 return;
10257 }
10258 if (count <= 1) {
10259 runtime.documents.delete(targetDocument);
10260 return;
10261 }
10262 runtime.documents.set(targetDocument, count - 1);
10263 };
10264 }
10265 function registerStyle10(hash, css) {
10266 const runtime = getRuntime10();
10267 runtime.styles.set(hash, css);
10268 for (const targetDocument of runtime.documents.keys()) {
10269 injectStyle10(targetDocument, hash, css);
10270 }
10271 }
10272 if (typeof process === "undefined" || true) {
10273 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}}}}');
10274 }
10275 var style_default9 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10276 var DEFAULT_TAG2 = /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", {});
10277 var Description = (0, import_element23.forwardRef)(function EmptyStateDescription({ render: render4 = DEFAULT_TAG2, className, children, ...props }, ref) {
10278 return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
10279 Text,
10280 {
10281 ref,
10282 variant: "body-md",
10283 render: render4,
10284 className: clsx_default(style_default9.description, className),
10285 ...props,
10286 children
10287 }
10288 );
10289 });
10290
10291 // packages/ui/build-module/empty-state/actions.mjs
10292 var import_element24 = __toESM(require_element(), 1);
10293 var STYLE_HASH_ATTRIBUTE11 = "data-wp-hash";
10294 function getRuntime11() {
10295 const globalScope = globalThis;
10296 if (globalScope.__wpStyleRuntime) {
10297 return globalScope.__wpStyleRuntime;
10298 }
10299 globalScope.__wpStyleRuntime = {
10300 documents: /* @__PURE__ */ new Map(),
10301 styles: /* @__PURE__ */ new Map(),
10302 injectedStyles: /* @__PURE__ */ new WeakMap()
10303 };
10304 if (typeof document !== "undefined") {
10305 registerDocument11(document);
10306 }
10307 return globalScope.__wpStyleRuntime;
10308 }
10309 function documentContainsStyleHash11(targetDocument, hash) {
10310 if (!targetDocument.head) {
10311 return false;
10312 }
10313 for (const style of targetDocument.head.querySelectorAll(
10314 `style[${STYLE_HASH_ATTRIBUTE11}]`
10315 )) {
10316 if (style.getAttribute(STYLE_HASH_ATTRIBUTE11) === hash) {
10317 return true;
10318 }
10319 }
10320 return false;
10321 }
10322 function injectStyle11(targetDocument, hash, css) {
10323 if (!targetDocument.head) {
10324 return;
10325 }
10326 const runtime = getRuntime11();
10327 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10328 if (!injectedStyles) {
10329 injectedStyles = /* @__PURE__ */ new Set();
10330 runtime.injectedStyles.set(targetDocument, injectedStyles);
10331 }
10332 if (injectedStyles.has(hash)) {
10333 return;
10334 }
10335 if (documentContainsStyleHash11(targetDocument, hash)) {
10336 injectedStyles.add(hash);
10337 return;
10338 }
10339 const style = targetDocument.createElement("style");
10340 style.setAttribute(STYLE_HASH_ATTRIBUTE11, hash);
10341 style.appendChild(targetDocument.createTextNode(css));
10342 targetDocument.head.appendChild(style);
10343 injectedStyles.add(hash);
10344 }
10345 function registerDocument11(targetDocument) {
10346 const runtime = getRuntime11();
10347 runtime.documents.set(
10348 targetDocument,
10349 (runtime.documents.get(targetDocument) ?? 0) + 1
10350 );
10351 for (const [hash, css] of runtime.styles) {
10352 injectStyle11(targetDocument, hash, css);
10353 }
10354 return () => {
10355 const count = runtime.documents.get(targetDocument);
10356 if (count === void 0) {
10357 return;
10358 }
10359 if (count <= 1) {
10360 runtime.documents.delete(targetDocument);
10361 return;
10362 }
10363 runtime.documents.set(targetDocument, count - 1);
10364 };
10365 }
10366 function registerStyle11(hash, css) {
10367 const runtime = getRuntime11();
10368 runtime.styles.set(hash, css);
10369 for (const targetDocument of runtime.documents.keys()) {
10370 injectStyle11(targetDocument, hash, css);
10371 }
10372 }
10373 if (typeof process === "undefined" || true) {
10374 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}}}}');
10375 }
10376 var style_default10 = { "root": "a23e08e65c8e62e5__root", "visual": "_01303b3680eaa216__visual", "icon": "_58c8e351db225608__icon", "title": "b8b96f70820333a1__title", "description": "_70f1dd22bad55b18__description", "actions": "_89ac025fd8e2bc52__actions" };
10377 var Actions = (0, import_element24.forwardRef)(
10378 function EmptyStateActions({ render: render4, ...props }, ref) {
10379 const className = clsx_default(style_default10.actions);
10380 const element = useRender({
10381 defaultTagName: "div",
10382 render: render4,
10383 ref,
10384 props: mergeProps({ className }, props)
10385 });
10386 return element;
10387 }
10388 );
10389
10390 // packages/ui/build-module/visually-hidden/visually-hidden.mjs
10391 var import_element25 = __toESM(require_element(), 1);
10392 var STYLE_HASH_ATTRIBUTE12 = "data-wp-hash";
10393 function getRuntime12() {
10394 const globalScope = globalThis;
10395 if (globalScope.__wpStyleRuntime) {
10396 return globalScope.__wpStyleRuntime;
10397 }
10398 globalScope.__wpStyleRuntime = {
10399 documents: /* @__PURE__ */ new Map(),
10400 styles: /* @__PURE__ */ new Map(),
10401 injectedStyles: /* @__PURE__ */ new WeakMap()
10402 };
10403 if (typeof document !== "undefined") {
10404 registerDocument12(document);
10405 }
10406 return globalScope.__wpStyleRuntime;
10407 }
10408 function documentContainsStyleHash12(targetDocument, hash) {
10409 if (!targetDocument.head) {
10410 return false;
10411 }
10412 for (const style of targetDocument.head.querySelectorAll(
10413 `style[${STYLE_HASH_ATTRIBUTE12}]`
10414 )) {
10415 if (style.getAttribute(STYLE_HASH_ATTRIBUTE12) === hash) {
10416 return true;
10417 }
10418 }
10419 return false;
10420 }
10421 function injectStyle12(targetDocument, hash, css) {
10422 if (!targetDocument.head) {
10423 return;
10424 }
10425 const runtime = getRuntime12();
10426 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10427 if (!injectedStyles) {
10428 injectedStyles = /* @__PURE__ */ new Set();
10429 runtime.injectedStyles.set(targetDocument, injectedStyles);
10430 }
10431 if (injectedStyles.has(hash)) {
10432 return;
10433 }
10434 if (documentContainsStyleHash12(targetDocument, hash)) {
10435 injectedStyles.add(hash);
10436 return;
10437 }
10438 const style = targetDocument.createElement("style");
10439 style.setAttribute(STYLE_HASH_ATTRIBUTE12, hash);
10440 style.appendChild(targetDocument.createTextNode(css));
10441 targetDocument.head.appendChild(style);
10442 injectedStyles.add(hash);
10443 }
10444 function registerDocument12(targetDocument) {
10445 const runtime = getRuntime12();
10446 runtime.documents.set(
10447 targetDocument,
10448 (runtime.documents.get(targetDocument) ?? 0) + 1
10449 );
10450 for (const [hash, css] of runtime.styles) {
10451 injectStyle12(targetDocument, hash, css);
10452 }
10453 return () => {
10454 const count = runtime.documents.get(targetDocument);
10455 if (count === void 0) {
10456 return;
10457 }
10458 if (count <= 1) {
10459 runtime.documents.delete(targetDocument);
10460 return;
10461 }
10462 runtime.documents.set(targetDocument, count - 1);
10463 };
10464 }
10465 function registerStyle12(hash, css) {
10466 const runtime = getRuntime12();
10467 runtime.styles.set(hash, css);
10468 for (const targetDocument of runtime.documents.keys()) {
10469 injectStyle12(targetDocument, hash, css);
10470 }
10471 }
10472 if (typeof process === "undefined" || true) {
10473 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}}}");
10474 }
10475 var style_default11 = { "visually-hidden": "f37b9e2e191ebd66__visually-hidden" };
10476 var VisuallyHidden = (0, import_element25.forwardRef)(
10477 function VisuallyHidden2({ render: render4, ...restProps }, ref) {
10478 const element = useRender({
10479 render: render4,
10480 ref,
10481 props: mergeProps(
10482 { className: style_default11["visually-hidden"] },
10483 restProps,
10484 {
10485 // @ts-expect-error Arbitrary data-* attributes aren't indexable on the typed div props. Kept hardcoded so consumers can't change or remove it.
10486 "data-visually-hidden": ""
10487 }
10488 )
10489 });
10490 return element;
10491 }
10492 );
10493
10494 // packages/ui/build-module/link/link.mjs
10495 var import_element26 = __toESM(require_element(), 1);
10496 var import_i18n = __toESM(require_i18n(), 1);
10497 var import_jsx_runtime46 = __toESM(require_jsx_runtime(), 1);
10498 var STYLE_HASH_ATTRIBUTE13 = "data-wp-hash";
10499 function getRuntime13() {
10500 const globalScope = globalThis;
10501 if (globalScope.__wpStyleRuntime) {
10502 return globalScope.__wpStyleRuntime;
10503 }
10504 globalScope.__wpStyleRuntime = {
10505 documents: /* @__PURE__ */ new Map(),
10506 styles: /* @__PURE__ */ new Map(),
10507 injectedStyles: /* @__PURE__ */ new WeakMap()
10508 };
10509 if (typeof document !== "undefined") {
10510 registerDocument13(document);
10511 }
10512 return globalScope.__wpStyleRuntime;
10513 }
10514 function documentContainsStyleHash13(targetDocument, hash) {
10515 if (!targetDocument.head) {
10516 return false;
10517 }
10518 for (const style of targetDocument.head.querySelectorAll(
10519 `style[${STYLE_HASH_ATTRIBUTE13}]`
10520 )) {
10521 if (style.getAttribute(STYLE_HASH_ATTRIBUTE13) === hash) {
10522 return true;
10523 }
10524 }
10525 return false;
10526 }
10527 function injectStyle13(targetDocument, hash, css) {
10528 if (!targetDocument.head) {
10529 return;
10530 }
10531 const runtime = getRuntime13();
10532 let injectedStyles = runtime.injectedStyles.get(targetDocument);
10533 if (!injectedStyles) {
10534 injectedStyles = /* @__PURE__ */ new Set();
10535 runtime.injectedStyles.set(targetDocument, injectedStyles);
10536 }
10537 if (injectedStyles.has(hash)) {
10538 return;
10539 }
10540 if (documentContainsStyleHash13(targetDocument, hash)) {
10541 injectedStyles.add(hash);
10542 return;
10543 }
10544 const style = targetDocument.createElement("style");
10545 style.setAttribute(STYLE_HASH_ATTRIBUTE13, hash);
10546 style.appendChild(targetDocument.createTextNode(css));
10547 targetDocument.head.appendChild(style);
10548 injectedStyles.add(hash);
10549 }
10550 function registerDocument13(targetDocument) {
10551 const runtime = getRuntime13();
10552 runtime.documents.set(
10553 targetDocument,
10554 (runtime.documents.get(targetDocument) ?? 0) + 1
10555 );
10556 for (const [hash, css] of runtime.styles) {
10557 injectStyle13(targetDocument, hash, css);
10558 }
10559 return () => {
10560 const count = runtime.documents.get(targetDocument);
10561 if (count === void 0) {
10562 return;
10563 }
10564 if (count <= 1) {
10565 runtime.documents.delete(targetDocument);
10566 return;
10567 }
10568 runtime.documents.set(targetDocument, count - 1);
10569 };
10570 }
10571 function registerStyle13(hash, css) {
10572 const runtime = getRuntime13();
10573 runtime.styles.set(hash, css);
10574 for (const targetDocument of runtime.documents.keys()) {
10575 injectStyle13(targetDocument, hash, css);
10576 }
10577 }
10578 if (typeof process === "undefined" || true) {
10579 registerStyle13("10f3806643", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._336cd3e4e743482f__box-sizing{box-sizing:border-box;*,:after,:before{box-sizing:inherit}}}}");
10580 }
10581 var resets_default2 = { "box-sizing": "_336cd3e4e743482f__box-sizing" };
10582 if (typeof process === "undefined" || true) {
10583 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))}}}");
10584 }
10585 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" };
10586 if (typeof process === "undefined" || true) {
10587 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"}}}');
10588 }
10589 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" };
10590 if (typeof process === "undefined" || true) {
10591 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)}");
10592 }
10593 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" };
10594 var Link = (0, import_element26.forwardRef)(function Link2({
10595 children,
10596 variant = "default",
10597 tone = "brand",
10598 openInNewTab = false,
10599 render: render4,
10600 className,
10601 ...props
10602 }, ref) {
10603 const element = useRender({
10604 render: render4,
10605 defaultTagName: "a",
10606 ref,
10607 props: mergeProps(props, {
10608 className: clsx_default(
10609 global_css_defense_default2.a,
10610 resets_default2["box-sizing"],
10611 focus_default["outset-ring--focus-except-active"],
10612 variant !== "unstyled" && style_default12.link,
10613 variant !== "unstyled" && style_default12[`is-${tone}`],
10614 variant === "unstyled" && style_default12["is-unstyled"],
10615 className
10616 ),
10617 target: openInNewTab ? "_blank" : void 0,
10618 children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_jsx_runtime46.Fragment, { children: [
10619 children,
10620 openInNewTab && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
10621 "span",
10622 {
10623 className: style_default12["link-icon"],
10624 role: "img",
10625 "aria-label": (
10626 /* translators: accessibility text appended to link text */
10627 (0, import_i18n.__)("(opens in a new tab)")
10628 )
10629 }
10630 )
10631 ] })
10632 })
10633 });
10634 return element;
10635 });
10636
10637 // packages/dataviews/build-module/components/dataviews-context/index.mjs
10638 var import_element27 = __toESM(require_element(), 1);
10639
10640 // packages/dataviews/build-module/constants.mjs
10641 var import_i18n2 = __toESM(require_i18n(), 1);
10642 var OPERATOR_IS_ANY = "isAny";
10643 var OPERATOR_IS_NONE = "isNone";
10644 var OPERATOR_IS_ALL = "isAll";
10645 var OPERATOR_IS_NOT_ALL = "isNotAll";
10646 var OPERATOR_BETWEEN = "between";
10647 var OPERATOR_IN_THE_PAST = "inThePast";
10648 var OPERATOR_OVER = "over";
10649 var OPERATOR_IS = "is";
10650 var OPERATOR_IS_NOT = "isNot";
10651 var OPERATOR_LESS_THAN = "lessThan";
10652 var OPERATOR_GREATER_THAN = "greaterThan";
10653 var OPERATOR_LESS_THAN_OR_EQUAL = "lessThanOrEqual";
10654 var OPERATOR_GREATER_THAN_OR_EQUAL = "greaterThanOrEqual";
10655 var OPERATOR_BEFORE = "before";
10656 var OPERATOR_AFTER = "after";
10657 var OPERATOR_BEFORE_INC = "beforeInc";
10658 var OPERATOR_AFTER_INC = "afterInc";
10659 var OPERATOR_CONTAINS = "contains";
10660 var OPERATOR_NOT_CONTAINS = "notContains";
10661 var OPERATOR_STARTS_WITH = "startsWith";
10662 var OPERATOR_ON = "on";
10663 var OPERATOR_NOT_ON = "notOn";
10664 var SORTING_DIRECTIONS = ["asc", "desc"];
10665 var sortArrows = { asc: "\u2191", desc: "\u2193" };
10666 var sortValues = { asc: "ascending", desc: "descending" };
10667 var sortLabels = {
10668 asc: (0, import_i18n2.__)("Sort ascending"),
10669 desc: (0, import_i18n2.__)("Sort descending")
10670 };
10671 var sortIcons = {
10672 asc: arrow_up_default,
10673 desc: arrow_down_default
10674 };
10675 var LAYOUT_TABLE = "table";
10676 var LAYOUT_GRID = "grid";
10677 var LAYOUT_LIST = "list";
10678 var LAYOUT_ACTIVITY = "activity";
10679 var LAYOUT_PICKER_GRID = "pickerGrid";
10680 var LAYOUT_PICKER_TABLE = "pickerTable";
10681 var LAYOUT_PICKER_ACTIVITY = "pickerActivity";
10682
10683 // packages/dataviews/build-module/components/dataviews-context/index.mjs
10684 var DataViewsContext = (0, import_element27.createContext)({
10685 view: { type: LAYOUT_TABLE },
10686 onChangeView: () => {
10687 },
10688 fields: [],
10689 data: [],
10690 paginationInfo: {
10691 totalItems: 0,
10692 totalPages: 0
10693 },
10694 selection: [],
10695 onChangeSelection: () => {
10696 },
10697 setOpenedFilter: () => {
10698 },
10699 openedFilter: null,
10700 getItemId: (item) => item.id,
10701 isItemClickable: () => true,
10702 renderItemLink: void 0,
10703 containerWidth: 0,
10704 containerRef: (0, import_element27.createRef)(),
10705 resizeObserverRef: () => {
10706 },
10707 defaultLayouts: { list: {}, grid: {}, table: {} },
10708 filters: [],
10709 isShowingFilter: false,
10710 setIsShowingFilter: () => {
10711 },
10712 hasInitiallyLoaded: false,
10713 config: {
10714 perPageSizes: []
10715 },
10716 intersectionObserver: null
10717 });
10718 DataViewsContext.displayName = "DataViewsContext";
10719 var dataviews_context_default = DataViewsContext;
10720
10721 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
10722 var import_i18n23 = __toESM(require_i18n(), 1);
10723
10724 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
10725 var import_i18n10 = __toESM(require_i18n(), 1);
10726 var import_components6 = __toESM(require_components(), 1);
10727 var import_element36 = __toESM(require_element(), 1);
10728 var import_keycodes2 = __toESM(require_keycodes(), 1);
10729
10730 // packages/dataviews/build-module/components/dataviews-selection-checkbox/index.mjs
10731 var import_components = __toESM(require_components(), 1);
10732 var import_i18n3 = __toESM(require_i18n(), 1);
10733 var import_jsx_runtime47 = __toESM(require_jsx_runtime(), 1);
10734 var SELECTION_CHECKBOX_CLASS = "dataviews-selection-checkbox";
10735 function DataViewsSelectionCheckbox({
10736 selection,
10737 onChangeSelection,
10738 item,
10739 getItemId,
10740 titleField,
10741 disabled: disabled2,
10742 ...extraProps
10743 }) {
10744 const id = getItemId(item);
10745 const isInSelectionArray = selection.includes(id);
10746 const checked = !disabled2 && isInSelectionArray;
10747 const selectionLabel = titleField?.getValue?.({ item }) || (0, import_i18n3.__)("(no title)");
10748 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
10749 import_components.CheckboxControl,
10750 {
10751 className: SELECTION_CHECKBOX_CLASS,
10752 "aria-label": selectionLabel,
10753 "aria-disabled": disabled2,
10754 checked,
10755 onChange: () => {
10756 if (disabled2) {
10757 return;
10758 }
10759 onChangeSelection(
10760 isInSelectionArray ? selection.filter((itemId) => id !== itemId) : [...selection, id]
10761 );
10762 },
10763 ...extraProps
10764 }
10765 );
10766 }
10767
10768 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
10769 var import_components2 = __toESM(require_components(), 1);
10770 var import_i18n4 = __toESM(require_i18n(), 1);
10771 var import_element28 = __toESM(require_element(), 1);
10772 var import_data = __toESM(require_data(), 1);
10773 var import_compose = __toESM(require_compose(), 1);
10774
10775 // packages/dataviews/build-module/lock-unlock.mjs
10776 var import_private_apis2 = __toESM(require_private_apis(), 1);
10777 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
10778 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
10779 "@wordpress/dataviews"
10780 );
10781
10782 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
10783 var import_jsx_runtime48 = __toESM(require_jsx_runtime(), 1);
10784 var { Menu, kebabCase } = unlock2(import_components2.privateApis);
10785 function ButtonTrigger({
10786 action,
10787 onClick,
10788 items,
10789 variant
10790 }) {
10791 const label = typeof action.label === "string" ? action.label : action.label(items);
10792 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10793 import_components2.Button,
10794 {
10795 disabled: !!action.disabled,
10796 accessibleWhenDisabled: true,
10797 size: "compact",
10798 variant,
10799 onClick,
10800 children: label
10801 }
10802 );
10803 }
10804 function MenuItemTrigger({
10805 action,
10806 onClick,
10807 items
10808 }) {
10809 const label = typeof action.label === "string" ? action.label : action.label(items);
10810 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Menu.Item, { disabled: action.disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Menu.ItemLabel, { children: label }) });
10811 }
10812 function ActionModal({
10813 action,
10814 items,
10815 closeModal
10816 }) {
10817 const label = typeof action.label === "string" ? action.label : action.label(items);
10818 const modalHeader = typeof action.modalHeader === "function" ? action.modalHeader(items) : action.modalHeader;
10819 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10820 import_components2.Modal,
10821 {
10822 title: modalHeader || label,
10823 __experimentalHideHeader: !!action.hideModalHeader,
10824 onRequestClose: closeModal,
10825 focusOnMount: action.modalFocusOnMount ?? true,
10826 size: action.modalSize || "medium",
10827 overlayClassName: `dataviews-action-modal dataviews-action-modal__${kebabCase(
10828 action.id
10829 )}`,
10830 children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(action.RenderModal, { items, closeModal })
10831 }
10832 );
10833 }
10834 function ActionsMenuGroup({
10835 actions,
10836 item,
10837 registry,
10838 setActiveModalAction
10839 }) {
10840 const { primaryActions, regularActions } = (0, import_element28.useMemo)(() => {
10841 return actions.reduce(
10842 (acc, action) => {
10843 (action.isPrimary ? acc.primaryActions : acc.regularActions).push(action);
10844 return acc;
10845 },
10846 {
10847 primaryActions: [],
10848 regularActions: []
10849 }
10850 );
10851 }, [actions]);
10852 const renderActionGroup = (actionList) => actionList.map((action) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10853 MenuItemTrigger,
10854 {
10855 action,
10856 onClick: () => {
10857 if ("RenderModal" in action) {
10858 setActiveModalAction(action);
10859 return;
10860 }
10861 action.callback([item], { registry });
10862 },
10863 items: [item]
10864 },
10865 action.id
10866 ));
10867 return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(Menu.Group, { children: [
10868 renderActionGroup(primaryActions),
10869 renderActionGroup(regularActions)
10870 ] });
10871 }
10872 function ItemActions({
10873 item,
10874 actions,
10875 isCompact
10876 }) {
10877 const registry = (0, import_data.useRegistry)();
10878 const { primaryActions, eligibleActions } = (0, import_element28.useMemo)(() => {
10879 const _eligibleActions = actions.filter(
10880 (action) => !action.isEligible || action.isEligible(item)
10881 );
10882 const _primaryActions = _eligibleActions.filter(
10883 (action) => action.isPrimary
10884 );
10885 return {
10886 primaryActions: _primaryActions,
10887 eligibleActions: _eligibleActions
10888 };
10889 }, [actions, item]);
10890 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
10891 if (isCompact) {
10892 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10893 CompactItemActions,
10894 {
10895 item,
10896 actions: eligibleActions,
10897 isSmall: true,
10898 registry
10899 }
10900 );
10901 }
10902 return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
10903 Stack,
10904 {
10905 direction: "row",
10906 justify: "flex-end",
10907 className: "dataviews-item-actions",
10908 style: {
10909 flexShrink: 0,
10910 width: "auto"
10911 },
10912 children: [
10913 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10914 PrimaryActions,
10915 {
10916 item,
10917 actions: primaryActions,
10918 registry
10919 }
10920 ),
10921 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
10922 // there if there are any actions at all.
10923 isMobileViewport) && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10924 CompactItemActions,
10925 {
10926 item,
10927 actions: eligibleActions,
10928 registry
10929 }
10930 )
10931 ]
10932 }
10933 );
10934 }
10935 function CompactItemActions({
10936 item,
10937 actions,
10938 isSmall,
10939 registry
10940 }) {
10941 const [activeModalAction, setActiveModalAction] = (0, import_element28.useState)(
10942 null
10943 );
10944 return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [
10945 /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(Menu, { placement: "bottom-end", children: [
10946 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10947 Menu.TriggerButton,
10948 {
10949 render: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10950 import_components2.Button,
10951 {
10952 size: isSmall ? "small" : "compact",
10953 icon: more_vertical_default,
10954 label: (0, import_i18n4.__)("Actions"),
10955 accessibleWhenDisabled: true,
10956 disabled: !actions.length,
10957 className: "dataviews-all-actions-button"
10958 }
10959 )
10960 }
10961 ),
10962 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Menu.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10963 ActionsMenuGroup,
10964 {
10965 actions,
10966 item,
10967 registry,
10968 setActiveModalAction
10969 }
10970 ) })
10971 ] }),
10972 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10973 ActionModal,
10974 {
10975 action: activeModalAction,
10976 items: [item],
10977 closeModal: () => setActiveModalAction(null)
10978 }
10979 )
10980 ] });
10981 }
10982 function PrimaryActions({
10983 item,
10984 actions,
10985 registry,
10986 buttonVariant
10987 }) {
10988 const [activeModalAction, setActiveModalAction] = (0, import_element28.useState)(null);
10989 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
10990 if (isMobileViewport) {
10991 return null;
10992 }
10993 if (!Array.isArray(actions) || actions.length === 0) {
10994 return null;
10995 }
10996 return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [
10997 actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
10998 ButtonTrigger,
10999 {
11000 action,
11001 onClick: () => {
11002 if ("RenderModal" in action) {
11003 setActiveModalAction(action);
11004 return;
11005 }
11006 action.callback([item], { registry });
11007 },
11008 items: [item],
11009 variant: buttonVariant
11010 },
11011 action.id
11012 )),
11013 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
11014 ActionModal,
11015 {
11016 action: activeModalAction,
11017 items: [item],
11018 closeModal: () => setActiveModalAction(null)
11019 }
11020 )
11021 ] });
11022 }
11023
11024 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
11025 var import_components3 = __toESM(require_components(), 1);
11026 var import_i18n6 = __toESM(require_i18n(), 1);
11027 var import_element29 = __toESM(require_element(), 1);
11028 var import_data2 = __toESM(require_data(), 1);
11029 var import_compose2 = __toESM(require_compose(), 1);
11030
11031 // packages/dataviews/build-module/utils/get-footer-message.mjs
11032 var import_i18n5 = __toESM(require_i18n(), 1);
11033 function getFooterMessage(selectionCount, itemsCount, totalItems, onlyTotalCount = false) {
11034 if (selectionCount > 0) {
11035 return (0, import_i18n5.sprintf)(
11036 /* translators: %d: number of items. */
11037 (0, import_i18n5._n)("%d Item selected", "%d Items selected", selectionCount),
11038 selectionCount
11039 );
11040 }
11041 if (onlyTotalCount || totalItems <= itemsCount) {
11042 return (0, import_i18n5.sprintf)(
11043 /* translators: %d: number of items. */
11044 (0, import_i18n5._n)("%d Item", "%d Items", totalItems),
11045 totalItems
11046 );
11047 }
11048 return (0, import_i18n5.sprintf)(
11049 /* translators: %1$d: number of items. %2$d: total number of items. */
11050 (0, import_i18n5._n)("%1$d of %2$d Item", "%1$d of %2$d Items", totalItems),
11051 itemsCount,
11052 totalItems
11053 );
11054 }
11055
11056 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
11057 var import_jsx_runtime49 = __toESM(require_jsx_runtime(), 1);
11058 function ActionWithModal({
11059 action,
11060 items,
11061 ActionTriggerComponent
11062 }) {
11063 const [isModalOpen, setIsModalOpen] = (0, import_element29.useState)(false);
11064 const actionTriggerProps = {
11065 action,
11066 onClick: () => {
11067 setIsModalOpen(true);
11068 },
11069 items
11070 };
11071 return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_jsx_runtime49.Fragment, { children: [
11072 /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ActionTriggerComponent, { ...actionTriggerProps }),
11073 isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11074 ActionModal,
11075 {
11076 action,
11077 items,
11078 closeModal: () => setIsModalOpen(false)
11079 }
11080 )
11081 ] });
11082 }
11083 function hasAPossibleBulkAction(actions, item) {
11084 return actions.some(
11085 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item))
11086 );
11087 }
11088 function useHasAPossibleBulkAction(actions, item) {
11089 return (0, import_element29.useMemo)(
11090 () => hasAPossibleBulkAction(actions, item),
11091 [actions, item]
11092 );
11093 }
11094 function useSomeItemHasAPossibleBulkAction(actions, data) {
11095 return (0, import_element29.useMemo)(
11096 () => data.some((item) => hasAPossibleBulkAction(actions, item)),
11097 [actions, data]
11098 );
11099 }
11100 function BulkSelectionCheckbox({
11101 selection,
11102 onChangeSelection,
11103 data,
11104 actions,
11105 getItemId,
11106 disableSelectAll = false
11107 }) {
11108 const selectableItems = (0, import_element29.useMemo)(() => {
11109 return data.filter((item) => {
11110 return actions.some(
11111 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item))
11112 );
11113 });
11114 }, [data, actions]);
11115 const selectedItems = data.filter(
11116 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
11117 );
11118 const hasSelection = selection.length > 0;
11119 const areAllSelected = selectedItems.length === selectableItems.length;
11120 if (disableSelectAll) {
11121 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11122 import_components3.CheckboxControl,
11123 {
11124 className: "dataviews-view-table-selection-checkbox",
11125 checked: hasSelection,
11126 disabled: !hasSelection,
11127 onChange: () => {
11128 onChangeSelection([]);
11129 },
11130 "aria-label": (0, import_i18n6.__)("Deselect all")
11131 }
11132 );
11133 }
11134 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11135 import_components3.CheckboxControl,
11136 {
11137 className: "dataviews-view-table-selection-checkbox",
11138 checked: areAllSelected,
11139 indeterminate: !areAllSelected && !!selectedItems.length,
11140 onChange: () => {
11141 if (areAllSelected) {
11142 onChangeSelection([]);
11143 } else {
11144 onChangeSelection(
11145 selectableItems.map((item) => getItemId(item))
11146 );
11147 }
11148 },
11149 "aria-label": areAllSelected ? (0, import_i18n6.__)("Deselect all") : (0, import_i18n6.__)("Select all")
11150 }
11151 );
11152 }
11153 function ActionTrigger({
11154 action,
11155 onClick,
11156 isBusy,
11157 items
11158 }) {
11159 const label = typeof action.label === "string" ? action.label : action.label(items);
11160 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
11161 if (isMobile) {
11162 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11163 import_components3.Button,
11164 {
11165 disabled: isBusy,
11166 accessibleWhenDisabled: true,
11167 label,
11168 icon: action.icon,
11169 size: "compact",
11170 onClick,
11171 isBusy
11172 }
11173 );
11174 }
11175 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11176 import_components3.Button,
11177 {
11178 disabled: isBusy,
11179 accessibleWhenDisabled: true,
11180 size: "compact",
11181 onClick,
11182 isBusy,
11183 children: label
11184 }
11185 );
11186 }
11187 var EMPTY_ARRAY2 = [];
11188 function ActionButton({
11189 action,
11190 selectedItems,
11191 actionInProgress,
11192 setActionInProgress
11193 }) {
11194 const registry = (0, import_data2.useRegistry)();
11195 const selectedEligibleItems = (0, import_element29.useMemo)(() => {
11196 return selectedItems.filter((item) => {
11197 return !action.isEligible || action.isEligible(item);
11198 });
11199 }, [action, selectedItems]);
11200 if ("RenderModal" in action) {
11201 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11202 ActionWithModal,
11203 {
11204 action,
11205 items: selectedEligibleItems,
11206 ActionTriggerComponent: ActionTrigger
11207 },
11208 action.id
11209 );
11210 }
11211 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11212 ActionTrigger,
11213 {
11214 action,
11215 onClick: async () => {
11216 setActionInProgress(action.id);
11217 await action.callback(selectedItems, {
11218 registry
11219 });
11220 setActionInProgress(null);
11221 },
11222 items: selectedEligibleItems,
11223 isBusy: actionInProgress === action.id
11224 },
11225 action.id
11226 );
11227 }
11228 function renderFooterContent(data, actions, getItemId, isInfiniteScroll, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection, paginationInfo) {
11229 const message2 = getFooterMessage(
11230 selection.length,
11231 data.length,
11232 paginationInfo.totalItems,
11233 isInfiniteScroll
11234 );
11235 return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
11236 Stack,
11237 {
11238 direction: "row",
11239 className: "dataviews-bulk-actions-footer__container",
11240 gap: "md",
11241 align: "center",
11242 children: [
11243 /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11244 BulkSelectionCheckbox,
11245 {
11246 selection,
11247 onChangeSelection,
11248 data,
11249 actions,
11250 getItemId,
11251 disableSelectAll: isInfiniteScroll
11252 }
11253 ),
11254 /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "dataviews-bulk-actions-footer__item-count", children: message2 }),
11255 /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
11256 Stack,
11257 {
11258 direction: "row",
11259 className: "dataviews-bulk-actions-footer__action-buttons",
11260 gap: "xs",
11261 children: [
11262 actionsToShow.map((action) => {
11263 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11264 ActionButton,
11265 {
11266 action,
11267 selectedItems,
11268 actionInProgress,
11269 setActionInProgress
11270 },
11271 action.id
11272 );
11273 }),
11274 selectedItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11275 import_components3.Button,
11276 {
11277 icon: close_small_default,
11278 showTooltip: true,
11279 tooltipPosition: "top",
11280 size: "compact",
11281 label: (0, import_i18n6.__)("Cancel"),
11282 disabled: !!actionInProgress,
11283 accessibleWhenDisabled: false,
11284 onClick: () => {
11285 onChangeSelection(EMPTY_ARRAY2);
11286 }
11287 }
11288 )
11289 ]
11290 }
11291 )
11292 ]
11293 }
11294 );
11295 }
11296 function FooterContent({
11297 selection,
11298 actions,
11299 onChangeSelection,
11300 data,
11301 getItemId,
11302 isInfiniteScroll,
11303 paginationInfo
11304 }) {
11305 const [actionInProgress, setActionInProgress] = (0, import_element29.useState)(
11306 null
11307 );
11308 const footerContentRef = (0, import_element29.useRef)(void 0);
11309 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
11310 const bulkActions = (0, import_element29.useMemo)(
11311 () => actions.filter((action) => action.supportsBulk),
11312 [actions]
11313 );
11314 const selectableItems = (0, import_element29.useMemo)(() => {
11315 return data.filter((item) => {
11316 return bulkActions.some(
11317 (action) => !action.isEligible || action.isEligible(item)
11318 );
11319 });
11320 }, [data, bulkActions]);
11321 const selectedItems = (0, import_element29.useMemo)(() => {
11322 return data.filter(
11323 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
11324 );
11325 }, [selection, data, getItemId, selectableItems]);
11326 const actionsToShow = (0, import_element29.useMemo)(
11327 () => actions.filter((action) => {
11328 return action.supportsBulk && (!isMobile || action.icon) && selectedItems.some(
11329 (item) => !action.isEligible || action.isEligible(item)
11330 );
11331 }),
11332 [actions, selectedItems, isMobile]
11333 );
11334 if (!actionInProgress) {
11335 if (footerContentRef.current) {
11336 footerContentRef.current = void 0;
11337 }
11338 return renderFooterContent(
11339 data,
11340 actions,
11341 getItemId,
11342 isInfiniteScroll,
11343 selection,
11344 actionsToShow,
11345 selectedItems,
11346 actionInProgress,
11347 setActionInProgress,
11348 onChangeSelection,
11349 paginationInfo
11350 );
11351 } else if (!footerContentRef.current) {
11352 footerContentRef.current = renderFooterContent(
11353 data,
11354 actions,
11355 getItemId,
11356 isInfiniteScroll,
11357 selection,
11358 actionsToShow,
11359 selectedItems,
11360 actionInProgress,
11361 setActionInProgress,
11362 onChangeSelection,
11363 paginationInfo
11364 );
11365 }
11366 return footerContentRef.current;
11367 }
11368 function BulkActionsFooter() {
11369 const {
11370 data,
11371 selection,
11372 actions = EMPTY_ARRAY2,
11373 onChangeSelection,
11374 getItemId,
11375 paginationInfo,
11376 view
11377 } = (0, import_element29.useContext)(dataviews_context_default);
11378 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
11379 FooterContent,
11380 {
11381 selection,
11382 onChangeSelection,
11383 data,
11384 actions,
11385 getItemId,
11386 isInfiniteScroll: !!view.infiniteScrollEnabled,
11387 paginationInfo
11388 }
11389 );
11390 }
11391
11392 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
11393 var import_i18n7 = __toESM(require_i18n(), 1);
11394 var import_components4 = __toESM(require_components(), 1);
11395 var import_element30 = __toESM(require_element(), 1);
11396
11397 // packages/dataviews/build-module/utils/get-hideable-fields.mjs
11398 function getHideableFields(view, fields) {
11399 const togglableFields = [
11400 view?.titleField,
11401 view?.mediaField,
11402 view?.descriptionField
11403 ].filter(Boolean);
11404 return fields.filter(
11405 (f2) => !togglableFields.includes(f2.id) && f2.type !== "media" && f2.enableHiding !== false
11406 );
11407 }
11408
11409 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
11410 var import_jsx_runtime50 = __toESM(require_jsx_runtime(), 1);
11411 var { Menu: Menu2 } = unlock2(import_components4.privateApis);
11412 function WithMenuSeparators({ children }) {
11413 return import_element30.Children.toArray(children).filter(Boolean).map((child, i2) => /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_element30.Fragment, { children: [
11414 i2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.Separator, {}),
11415 child
11416 ] }, i2));
11417 }
11418 var _HeaderMenu = (0, import_element30.forwardRef)(function HeaderMenu({
11419 fieldId,
11420 view,
11421 fields,
11422 onChangeView,
11423 onHide,
11424 setOpenedFilter,
11425 canMove = true,
11426 canInsertLeft = true,
11427 canInsertRight = true
11428 }, ref) {
11429 const visibleFieldIds = view.fields ?? [];
11430 const index2 = visibleFieldIds?.indexOf(fieldId);
11431 const isSorted = view.sort?.field === fieldId;
11432 let isHidable = false;
11433 let isSortable = false;
11434 let canAddFilter = false;
11435 let operators = [];
11436 const field = fields.find((f2) => f2.id === fieldId);
11437 const { setIsShowingFilter } = (0, import_element30.useContext)(dataviews_context_default);
11438 if (!field) {
11439 return null;
11440 }
11441 isHidable = field.enableHiding !== false;
11442 isSortable = field.enableSorting !== false;
11443 const header = field.header;
11444 operators = !!field.filterBy && field.filterBy?.operators || [];
11445 canAddFilter = !view.filters?.some((_filter) => fieldId === _filter.field) && !!(field.hasElements || field.Edit) && field.filterBy !== false && !field.filterBy?.isPrimary;
11446 if (!isSortable && !canMove && !isHidable && !canAddFilter) {
11447 return header;
11448 }
11449 const hiddenFields = getHideableFields(view, fields).filter(
11450 (f2) => !visibleFieldIds.includes(f2.id)
11451 );
11452 const canInsert = (canInsertLeft || canInsertRight) && !!hiddenFields.length;
11453 const isRtl = (0, import_i18n7.isRTL)();
11454 return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Menu2, { children: [
11455 /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
11456 Menu2.TriggerButton,
11457 {
11458 render: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11459 import_components4.Button,
11460 {
11461 size: "compact",
11462 className: "dataviews-view-table-header-button",
11463 ref,
11464 variant: "tertiary"
11465 }
11466 ),
11467 children: [
11468 header,
11469 view.sort && isSorted && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { "aria-hidden": "true", children: sortArrows[view.sort.direction] })
11470 ]
11471 }
11472 ),
11473 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.Popover, { style: { minWidth: "240px" }, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(WithMenuSeparators, { children: [
11474 isSortable && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.Group, { children: SORTING_DIRECTIONS.map(
11475 (direction) => {
11476 const isChecked = view.sort && isSorted && view.sort.direction === direction;
11477 const value = `${fieldId}-${direction}`;
11478 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11479 Menu2.RadioItem,
11480 {
11481 name: "view-table-sorting",
11482 value,
11483 checked: isChecked,
11484 onChange: () => {
11485 onChangeView({
11486 ...view,
11487 sort: {
11488 field: fieldId,
11489 direction
11490 },
11491 showLevels: false
11492 });
11493 },
11494 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: sortLabels[direction] })
11495 },
11496 value
11497 );
11498 }
11499 ) }),
11500 canAddFilter && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11501 Menu2.Item,
11502 {
11503 prefix: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_components4.Icon, { icon: funnel_default }),
11504 onClick: () => {
11505 setOpenedFilter(fieldId);
11506 setIsShowingFilter(true);
11507 onChangeView({
11508 ...view,
11509 page: 1,
11510 filters: [
11511 ...view.filters || [],
11512 {
11513 field: fieldId,
11514 value: void 0,
11515 operator: operators[0]
11516 }
11517 ]
11518 });
11519 },
11520 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Add filter") })
11521 }
11522 ) }),
11523 (canMove || isHidable || canInsert) && field && /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Menu2.Group, { children: [
11524 canMove && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11525 Menu2.Item,
11526 {
11527 prefix: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_components4.Icon, { icon: arrow_left_default }),
11528 disabled: isRtl ? index2 >= visibleFieldIds.length - 1 : index2 < 1,
11529 onClick: () => {
11530 const targetIndex = isRtl ? index2 + 1 : index2 - 1;
11531 const newFields = [
11532 ...visibleFieldIds
11533 ];
11534 newFields.splice(index2, 1);
11535 newFields.splice(
11536 targetIndex,
11537 0,
11538 fieldId
11539 );
11540 onChangeView({
11541 ...view,
11542 fields: newFields
11543 });
11544 },
11545 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Move left") })
11546 }
11547 ),
11548 canMove && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11549 Menu2.Item,
11550 {
11551 prefix: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_components4.Icon, { icon: arrow_right_default }),
11552 disabled: isRtl ? index2 < 1 : index2 >= visibleFieldIds.length - 1,
11553 onClick: () => {
11554 const targetIndex = isRtl ? index2 - 1 : index2 + 1;
11555 const newFields = [
11556 ...visibleFieldIds
11557 ];
11558 newFields.splice(index2, 1);
11559 newFields.splice(
11560 targetIndex,
11561 0,
11562 fieldId
11563 );
11564 onChangeView({
11565 ...view,
11566 fields: newFields
11567 });
11568 },
11569 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Move right") })
11570 }
11571 ),
11572 canInsertLeft && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Menu2, { children: [
11573 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Insert left") }) }),
11574 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
11575 const insertIndex = isRtl ? index2 + 1 : index2;
11576 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11577 Menu2.Item,
11578 {
11579 onClick: () => {
11580 onChangeView({
11581 ...view,
11582 fields: [
11583 ...visibleFieldIds.slice(
11584 0,
11585 insertIndex
11586 ),
11587 hiddenField.id,
11588 ...visibleFieldIds.slice(
11589 insertIndex
11590 )
11591 ]
11592 });
11593 },
11594 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
11595 },
11596 hiddenField.id
11597 );
11598 }) })
11599 ] }),
11600 canInsertRight && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Menu2, { children: [
11601 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Insert right") }) }),
11602 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
11603 const insertIndex = isRtl ? index2 : index2 + 1;
11604 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11605 Menu2.Item,
11606 {
11607 onClick: () => {
11608 onChangeView({
11609 ...view,
11610 fields: [
11611 ...visibleFieldIds.slice(
11612 0,
11613 insertIndex
11614 ),
11615 hiddenField.id,
11616 ...visibleFieldIds.slice(
11617 insertIndex
11618 )
11619 ]
11620 });
11621 },
11622 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
11623 },
11624 hiddenField.id
11625 );
11626 }) })
11627 ] }),
11628 isHidable && field && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
11629 Menu2.Item,
11630 {
11631 prefix: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_components4.Icon, { icon: unseen_default }),
11632 onClick: () => {
11633 onHide(field);
11634 onChangeView({
11635 ...view,
11636 fields: visibleFieldIds.filter(
11637 (id) => id !== fieldId
11638 )
11639 });
11640 },
11641 children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Menu2.ItemLabel, { children: (0, import_i18n7.__)("Hide column") })
11642 }
11643 )
11644 ] })
11645 ] }) })
11646 ] });
11647 });
11648 var ColumnHeaderMenu = _HeaderMenu;
11649 var column_header_menu_default = ColumnHeaderMenu;
11650
11651 // packages/dataviews/build-module/components/dataviews-layouts/utils/item-click-wrapper.mjs
11652 var import_element31 = __toESM(require_element(), 1);
11653 var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1);
11654 function getClickableItemProps({
11655 item,
11656 isItemClickable,
11657 onClickItem,
11658 className
11659 }) {
11660 if (!isItemClickable(item) || !onClickItem) {
11661 return { className };
11662 }
11663 return {
11664 className: className ? `${className} ${className}--clickable` : void 0,
11665 role: "button",
11666 tabIndex: 0,
11667 onClick: (event) => {
11668 event.stopPropagation();
11669 onClickItem(item);
11670 },
11671 onKeyDown: (event) => {
11672 if (event.key === "Enter" || event.key === "" || event.key === " ") {
11673 event.stopPropagation();
11674 onClickItem(item);
11675 }
11676 }
11677 };
11678 }
11679 function ItemClickWrapper({
11680 item,
11681 isItemClickable,
11682 onClickItem,
11683 renderItemLink,
11684 className,
11685 children,
11686 ...extraProps
11687 }) {
11688 if (!isItemClickable(item)) {
11689 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className, ...extraProps, children });
11690 }
11691 if (renderItemLink) {
11692 const renderedElement = renderItemLink({
11693 item,
11694 className: `${className} ${className}--clickable`,
11695 ...extraProps,
11696 children
11697 });
11698 return (0, import_element31.cloneElement)(renderedElement, {
11699 onClick: (event) => {
11700 event.stopPropagation();
11701 if (renderedElement.props.onClick) {
11702 renderedElement.props.onClick(event);
11703 }
11704 },
11705 onKeyDown: (event) => {
11706 if (event.key === "Enter" || event.key === "" || event.key === " ") {
11707 event.stopPropagation();
11708 if (renderedElement.props.onKeyDown) {
11709 renderedElement.props.onKeyDown(event);
11710 }
11711 }
11712 }
11713 });
11714 }
11715 const clickProps = getClickableItemProps({
11716 item,
11717 isItemClickable,
11718 onClickItem,
11719 className
11720 });
11721 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { ...clickProps, ...extraProps, children });
11722 }
11723
11724 // packages/dataviews/build-module/components/dataviews-layouts/table/column-primary.mjs
11725 var import_jsx_runtime52 = __toESM(require_jsx_runtime(), 1);
11726 function ColumnPrimary({
11727 item,
11728 level,
11729 titleField,
11730 mediaField,
11731 descriptionField,
11732 onClickItem,
11733 renderItemLink,
11734 isItemClickable
11735 }) {
11736 return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(Stack, { direction: "row", gap: "md", align: "flex-start", justify: "flex-start", children: [
11737 mediaField && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11738 ItemClickWrapper,
11739 {
11740 item,
11741 isItemClickable,
11742 onClickItem,
11743 renderItemLink,
11744 className: "dataviews-view-table__cell-content-wrapper dataviews-column-primary__media",
11745 "aria-label": isItemClickable(item) && (!!onClickItem || !!renderItemLink) && !!titleField ? titleField.getValue?.({ item }) : void 0,
11746 children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11747 mediaField.render,
11748 {
11749 item,
11750 field: mediaField,
11751 config: { sizes: "32px" }
11752 }
11753 )
11754 }
11755 ),
11756 /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
11757 Stack,
11758 {
11759 direction: "column",
11760 align: "flex-start",
11761 className: "dataviews-view-table__primary-column-content",
11762 children: [
11763 titleField && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
11764 ItemClickWrapper,
11765 {
11766 item,
11767 isItemClickable,
11768 onClickItem,
11769 renderItemLink,
11770 className: "dataviews-view-table__cell-content-wrapper dataviews-title-field",
11771 children: [
11772 level !== void 0 && level > 0 && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("span", { className: "dataviews-view-table__level", children: [
11773 Array(level).fill("\u2014").join(" "),
11774 "\xA0"
11775 ] }),
11776 /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(titleField.render, { item, field: titleField })
11777 ]
11778 }
11779 ),
11780 descriptionField && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
11781 descriptionField.render,
11782 {
11783 item,
11784 field: descriptionField
11785 }
11786 )
11787 ]
11788 }
11789 )
11790 ] });
11791 }
11792 var column_primary_default = ColumnPrimary;
11793
11794 // packages/dataviews/build-module/components/dataviews-layouts/table/use-scroll-state.mjs
11795 var import_element32 = __toESM(require_element(), 1);
11796 var import_i18n8 = __toESM(require_i18n(), 1);
11797 var isScrolledToEnd = (element) => {
11798 if ((0, import_i18n8.isRTL)()) {
11799 const scrollLeft = Math.abs(element.scrollLeft);
11800 return scrollLeft <= 1;
11801 }
11802 return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
11803 };
11804 function useScrollState({
11805 scrollContainerRef,
11806 enabledHorizontal = false
11807 }) {
11808 const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = (0, import_element32.useState)(false);
11809 const [isVerticallyScrolled, setIsVerticallyScrolled] = (0, import_element32.useState)(false);
11810 const handleScroll = (0, import_element32.useCallback)(() => {
11811 const scrollContainer = scrollContainerRef.current;
11812 if (!scrollContainer) {
11813 return;
11814 }
11815 if (enabledHorizontal) {
11816 setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer));
11817 }
11818 setIsVerticallyScrolled(scrollContainer.scrollTop > 0);
11819 }, [scrollContainerRef, enabledHorizontal]);
11820 (0, import_element32.useEffect)(() => {
11821 if (typeof window === "undefined" || !scrollContainerRef.current) {
11822 return () => {
11823 };
11824 }
11825 const scrollContainer = scrollContainerRef.current;
11826 handleScroll();
11827 scrollContainer.addEventListener("scroll", handleScroll);
11828 window.addEventListener("resize", handleScroll);
11829 return () => {
11830 scrollContainer.removeEventListener("scroll", handleScroll);
11831 window.removeEventListener("resize", handleScroll);
11832 };
11833 }, [scrollContainerRef, enabledHorizontal, handleScroll]);
11834 return { isHorizontalScrollEnd, isVerticallyScrolled };
11835 }
11836
11837 // packages/dataviews/build-module/components/dataviews-layouts/utils/get-data-by-group.mjs
11838 function getDataByGroup(data, groupByField) {
11839 return data.reduce((groups, item) => {
11840 const groupName = groupByField.getValue({ item });
11841 if (!groups.has(groupName)) {
11842 groups.set(groupName, []);
11843 }
11844 groups.get(groupName)?.push(item);
11845 return groups;
11846 }, /* @__PURE__ */ new Map());
11847 }
11848
11849 // packages/dataviews/build-module/components/dataviews-layouts/utils/use-selection-props.mjs
11850 var import_element33 = __toESM(require_element(), 1);
11851 var import_keycodes = __toESM(require_keycodes(), 1);
11852 function getRange(orderedIds, fromIndex, toIndex) {
11853 return orderedIds.slice(
11854 Math.min(fromIndex, toIndex),
11855 Math.max(fromIndex, toIndex) + 1
11856 );
11857 }
11858 function getRangeSelection({
11859 anchorId,
11860 targetId,
11861 lastTargetId,
11862 orderedIds,
11863 selection
11864 }) {
11865 const targetIndex = orderedIds.indexOf(targetId);
11866 if (targetIndex === -1) {
11867 return selection;
11868 }
11869 const anchorIndex = anchorId === null ? -1 : orderedIds.indexOf(anchorId);
11870 const hasAnchor = anchorIndex !== -1;
11871 const rangeStart = hasAnchor ? anchorIndex : targetIndex;
11872 const lastTargetIndex = hasAnchor && lastTargetId !== null ? orderedIds.indexOf(lastTargetId) : -1;
11873 const lastRange = lastTargetIndex === -1 ? [] : getRange(orderedIds, rangeStart, lastTargetIndex);
11874 const base = selection.filter((id) => !lastRange.includes(id));
11875 return [
11876 .../* @__PURE__ */ new Set([
11877 ...base,
11878 ...getRange(orderedIds, rangeStart, targetIndex)
11879 ])
11880 ];
11881 }
11882 function getClosestSelectedId({
11883 targetId,
11884 orderedIds,
11885 selection
11886 }) {
11887 const targetIndex = orderedIds.indexOf(targetId);
11888 if (targetIndex === -1) {
11889 return null;
11890 }
11891 const selectedIds = new Set(selection);
11892 let closestId = null;
11893 let closestDistance = Infinity;
11894 orderedIds.forEach((id, index2) => {
11895 if (!selectedIds.has(id)) {
11896 return;
11897 }
11898 const distance = Math.abs(index2 - targetIndex);
11899 if (distance < closestDistance) {
11900 closestDistance = distance;
11901 closestId = id;
11902 }
11903 });
11904 return closestId;
11905 }
11906 function useSelectionProps({
11907 data,
11908 getItemId,
11909 isItemSelectable,
11910 selection,
11911 onChangeSelection,
11912 selectionMode,
11913 shouldSelectOnClick
11914 }) {
11915 const isMultiselect = selectionMode === "multi";
11916 const allowDeselect = selectionMode !== "single-required";
11917 const gestureRef = (0, import_element33.useRef)(null);
11918 const anchorTo = (id) => {
11919 gestureRef.current = { anchorId: id, lastTargetId: null };
11920 };
11921 const isTouchDeviceRef = (0, import_element33.useRef)(false);
11922 (0, import_element33.useEffect)(() => {
11923 const markTouchDevice = () => {
11924 isTouchDeviceRef.current = true;
11925 };
11926 document.addEventListener("touchstart", markTouchDevice, {
11927 once: true
11928 });
11929 return () => document.removeEventListener("touchstart", markTouchDevice);
11930 }, []);
11931 const selectableIds = data.filter(isItemSelectable).map(getItemId);
11932 const selectableIdSet = new Set(selectableIds);
11933 const hasSelectableItems = selectableIds.length > 0;
11934 const hasRangeGesture = hasSelectableItems && isMultiselect;
11935 const getSelectionProps = (id) => {
11936 const isSelectable = selectableIdSet.has(id);
11937 return {
11938 // When a plain click selects, that click is also what anchors the
11939 // range a following Shift+Click extends from. Modifier clicks never
11940 // reach here: `onClickCapture` stops them.
11941 ...shouldSelectOnClick && {
11942 onClick: () => {
11943 if (allowDeselect && selection.includes(id)) {
11944 onChangeSelection(
11945 selection.filter((itemId) => id !== itemId)
11946 );
11947 } else {
11948 onChangeSelection(
11949 isMultiselect ? [...selection, id] : [id]
11950 );
11951 }
11952 anchorTo(id);
11953 }
11954 },
11955 onMouseDown: (event) => {
11956 if (event.button === 0 && event.shiftKey && hasRangeGesture) {
11957 event.preventDefault();
11958 }
11959 },
11960 onClickCapture: (event) => {
11961 if (!hasRangeGesture) {
11962 return;
11963 }
11964 const isModifierKeyPressed = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey;
11965 const isSelectionCheckboxClick = event.target instanceof Element && !!event.target.closest(`.${SELECTION_CHECKBOX_CLASS}`);
11966 if (!isModifierKeyPressed && !event.shiftKey) {
11967 if (isSelectable && isSelectionCheckboxClick) {
11968 anchorTo(id);
11969 }
11970 return;
11971 }
11972 if (isTouchDeviceRef.current || document.getSelection()?.type === "Range") {
11973 return;
11974 }
11975 event.stopPropagation();
11976 if (!isSelectionCheckboxClick) {
11977 event.preventDefault();
11978 }
11979 if (!isSelectable) {
11980 return;
11981 }
11982 if (event.shiftKey) {
11983 let gesture = gestureRef.current;
11984 if (!gesture || !selectableIdSet.has(gesture.anchorId)) {
11985 gesture = {
11986 anchorId: getClosestSelectedId({
11987 targetId: id,
11988 orderedIds: selectableIds,
11989 selection
11990 }) ?? id,
11991 lastTargetId: null
11992 };
11993 }
11994 onChangeSelection(
11995 getRangeSelection({
11996 anchorId: gesture.anchorId,
11997 targetId: id,
11998 lastTargetId: gesture.lastTargetId,
11999 orderedIds: selectableIds,
12000 selection
12001 })
12002 );
12003 gestureRef.current = {
12004 anchorId: gesture.anchorId,
12005 lastTargetId: id
12006 };
12007 } else {
12008 onChangeSelection(
12009 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
12010 );
12011 anchorTo(id);
12012 }
12013 }
12014 };
12015 };
12016 return { getSelectionProps };
12017 }
12018
12019 // packages/dataviews/build-module/components/dataviews-view-config/properties-section.mjs
12020 var import_components5 = __toESM(require_components(), 1);
12021 var import_i18n9 = __toESM(require_i18n(), 1);
12022 var import_element34 = __toESM(require_element(), 1);
12023 var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1);
12024 function FieldItem({
12025 field,
12026 isVisible: isVisible2,
12027 onToggleVisibility
12028 }) {
12029 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_components5.__experimentalItem, { onClick: field.enableHiding ? onToggleVisibility : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(Stack, { direction: "row", gap: "sm", justify: "flex-start", align: "center", children: [
12030 /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { style: { height: 24, width: 24 }, children: isVisible2 && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_components5.Icon, { icon: check_default }) }),
12031 /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "dataviews-view-config__label", children: field.label })
12032 ] }) });
12033 }
12034 function isDefined(item) {
12035 return !!item;
12036 }
12037 function PropertiesSection({
12038 showLabel = true
12039 }) {
12040 const { view, fields, onChangeView } = (0, import_element34.useContext)(dataviews_context_default);
12041 const regularFields = getHideableFields(view, fields);
12042 if (!regularFields?.length) {
12043 return null;
12044 }
12045 const titleField = fields.find((f2) => f2.id === view.titleField);
12046 const previewField = fields.find((f2) => f2.id === view.mediaField);
12047 const descriptionField = fields.find(
12048 (f2) => f2.id === view.descriptionField
12049 );
12050 const lockedFields = [
12051 {
12052 field: titleField,
12053 isVisibleFlag: "showTitle"
12054 },
12055 {
12056 field: previewField,
12057 isVisibleFlag: "showMedia"
12058 },
12059 {
12060 field: descriptionField,
12061 isVisibleFlag: "showDescription"
12062 }
12063 ].filter(({ field }) => isDefined(field));
12064 const visibleFieldIds = view.fields ?? [];
12065 const visibleRegularFieldsCount = regularFields.filter(
12066 (f2) => visibleFieldIds.includes(f2.id)
12067 ).length;
12068 const visibleLockedFields = lockedFields.filter(
12069 ({ isVisibleFlag }) => (
12070 // @ts-expect-error
12071 view[isVisibleFlag] ?? true
12072 )
12073 );
12074 const totalVisibleFields = visibleLockedFields.length + visibleRegularFieldsCount;
12075 const isSingleVisibleLockedField = totalVisibleFields === 1 && visibleLockedFields.length === 1;
12076 return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(Stack, { direction: "column", className: "dataviews-field-control", children: [
12077 showLabel && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_components5.BaseControl.VisualLabel, { children: (0, import_i18n9.__)("Properties") }),
12078 /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
12079 Stack,
12080 {
12081 direction: "column",
12082 className: "dataviews-view-config__properties",
12083 children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_components5.__experimentalItemGroup, { isBordered: true, isSeparated: true, size: "medium", children: [
12084 lockedFields.map(({ field, isVisibleFlag }) => {
12085 const isVisible2 = view[isVisibleFlag] ?? true;
12086 const fieldToRender = isSingleVisibleLockedField && isVisible2 ? { ...field, enableHiding: false } : field;
12087 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
12088 FieldItem,
12089 {
12090 field: fieldToRender,
12091 isVisible: isVisible2,
12092 onToggleVisibility: () => {
12093 onChangeView({
12094 ...view,
12095 [isVisibleFlag]: !isVisible2
12096 });
12097 }
12098 },
12099 field.id
12100 );
12101 }),
12102 regularFields.map((field) => {
12103 const isVisible2 = visibleFieldIds.includes(field.id);
12104 const fieldToRender = totalVisibleFields === 1 && isVisible2 ? { ...field, enableHiding: false } : field;
12105 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
12106 FieldItem,
12107 {
12108 field: fieldToRender,
12109 isVisible: isVisible2,
12110 onToggleVisibility: () => {
12111 onChangeView({
12112 ...view,
12113 fields: isVisible2 ? visibleFieldIds.filter(
12114 (fieldId) => fieldId !== field.id
12115 ) : [...visibleFieldIds, field.id]
12116 });
12117 }
12118 },
12119 field.id
12120 );
12121 })
12122 ] })
12123 }
12124 )
12125 ] });
12126 }
12127
12128 // packages/dataviews/build-module/hooks/use-delayed-loading.mjs
12129 var import_element35 = __toESM(require_element(), 1);
12130 function useDelayedLoading(isLoading, options = { delay: 400 }) {
12131 const [showLoader, setShowLoader] = (0, import_element35.useState)(false);
12132 (0, import_element35.useEffect)(() => {
12133 if (!isLoading) {
12134 return;
12135 }
12136 const timeout = setTimeout(() => {
12137 setShowLoader(true);
12138 }, options.delay);
12139 return () => {
12140 clearTimeout(timeout);
12141 setShowLoader(false);
12142 };
12143 }, [isLoading, options.delay]);
12144 return showLoader;
12145 }
12146
12147 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
12148 var import_jsx_runtime54 = __toESM(require_jsx_runtime(), 1);
12149 function getEffectiveAlign(explicitAlign, fieldType) {
12150 if (explicitAlign) {
12151 return explicitAlign;
12152 }
12153 if (fieldType === "integer" || fieldType === "number") {
12154 return "end";
12155 }
12156 return void 0;
12157 }
12158 function TableColumnField({
12159 item,
12160 fields,
12161 column,
12162 align
12163 }) {
12164 const field = fields.find((f2) => f2.id === column);
12165 if (!field) {
12166 return null;
12167 }
12168 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
12169 "dataviews-view-table__cell-align-end": align === "end",
12170 "dataviews-view-table__cell-align-center": align === "center"
12171 });
12172 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(field.render, { item, field }) });
12173 }
12174 function TableRow({
12175 hasBulkActions,
12176 item,
12177 level,
12178 actions,
12179 fields,
12180 id,
12181 view,
12182 titleField,
12183 mediaField,
12184 descriptionField,
12185 selection,
12186 getItemId,
12187 isItemClickable,
12188 onClickItem,
12189 renderItemLink,
12190 onChangeSelection,
12191 onMouseDown,
12192 onClickCapture,
12193 isActionsColumnSticky,
12194 posinset
12195 }) {
12196 const { paginationInfo } = (0, import_element36.useContext)(dataviews_context_default);
12197 const hasPossibleBulkAction = useHasAPossibleBulkAction(actions, item);
12198 const isSelected2 = hasPossibleBulkAction && selection.includes(id);
12199 const {
12200 showTitle = true,
12201 showMedia = true,
12202 showDescription = true,
12203 infiniteScrollEnabled
12204 } = view;
12205 const columns = view.fields ?? [];
12206 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
12207 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
12208 "tr",
12209 {
12210 className: clsx_default("dataviews-view-table__row", {
12211 "is-selected": hasPossibleBulkAction && isSelected2,
12212 "has-bulk-actions": hasPossibleBulkAction
12213 }),
12214 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
12215 "aria-posinset": posinset,
12216 role: infiniteScrollEnabled ? "article" : void 0,
12217 onClickCapture,
12218 onMouseDown: (event) => {
12219 const isMetaClick = (0, import_keycodes2.isAppleOS)() ? event.metaKey : event.ctrlKey;
12220 if (event.button === 0 && isMetaClick && window.navigator.userAgent.toLowerCase().includes("firefox")) {
12221 event.preventDefault();
12222 }
12223 onMouseDown(event);
12224 },
12225 children: [
12226 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("td", { className: "dataviews-view-table__checkbox-column", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12227 DataViewsSelectionCheckbox,
12228 {
12229 item,
12230 selection,
12231 onChangeSelection,
12232 getItemId,
12233 titleField,
12234 disabled: !hasPossibleBulkAction
12235 }
12236 ) }) }),
12237 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12238 column_primary_default,
12239 {
12240 item,
12241 level,
12242 titleField: showTitle ? titleField : void 0,
12243 mediaField: showMedia ? mediaField : void 0,
12244 descriptionField: showDescription ? descriptionField : void 0,
12245 isItemClickable,
12246 onClickItem,
12247 renderItemLink
12248 }
12249 ) }),
12250 columns.map((column) => {
12251 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
12252 const field = fields.find((f2) => f2.id === column);
12253 const effectiveAlign = getEffectiveAlign(align, field?.type);
12254 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12255 "td",
12256 {
12257 style: {
12258 width,
12259 maxWidth,
12260 minWidth
12261 },
12262 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12263 TableColumnField,
12264 {
12265 fields,
12266 item,
12267 column,
12268 align: effectiveAlign
12269 }
12270 )
12271 },
12272 column
12273 );
12274 }),
12275 !!actions?.length && // Disable reason: we are not making the element interactive,
12276 // but preventing any click events from bubbling up to the
12277 // table row. This allows us to add a click handler to the row
12278 // itself (to toggle row selection) without erroneously
12279 // intercepting click events from ItemActions.
12280 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12281 "td",
12282 {
12283 className: clsx_default("dataviews-view-table__actions-column", {
12284 "dataviews-view-table__actions-column--sticky": true,
12285 "dataviews-view-table__actions-column--stuck": isActionsColumnSticky
12286 }),
12287 onClick: (e2) => e2.stopPropagation(),
12288 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ItemActions, { item, actions })
12289 }
12290 )
12291 ]
12292 }
12293 );
12294 }
12295 function ViewTable({
12296 actions,
12297 data,
12298 fields,
12299 getItemId,
12300 getItemLevel,
12301 isLoading = false,
12302 onChangeView,
12303 onChangeSelection,
12304 selection,
12305 setOpenedFilter,
12306 onClickItem,
12307 isItemClickable,
12308 renderItemLink,
12309 view,
12310 className,
12311 empty
12312 }) {
12313 const { containerRef } = (0, import_element36.useContext)(dataviews_context_default);
12314 const isDelayedLoading = useDelayedLoading(isLoading);
12315 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
12316 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
12317 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
12318 const { getSelectionProps } = useSelectionProps({
12319 data: orderedData,
12320 getItemId,
12321 isItemSelectable: (item) => hasAPossibleBulkAction(actions, item),
12322 selection,
12323 onChangeSelection,
12324 selectionMode: "multi",
12325 shouldSelectOnClick: false
12326 });
12327 const headerMenuRefs = (0, import_element36.useRef)(/* @__PURE__ */ new Map());
12328 const headerMenuToFocusRef = (0, import_element36.useRef)(void 0);
12329 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element36.useState)();
12330 const [contextMenuAnchor, setContextMenuAnchor] = (0, import_element36.useState)(null);
12331 (0, import_element36.useEffect)(() => {
12332 if (headerMenuToFocusRef.current) {
12333 headerMenuToFocusRef.current.focus();
12334 headerMenuToFocusRef.current = void 0;
12335 }
12336 });
12337 const tableNoticeId = (0, import_element36.useId)();
12338 const { isHorizontalScrollEnd, isVerticallyScrolled } = useScrollState({
12339 scrollContainerRef: containerRef,
12340 enabledHorizontal: !!actions?.length
12341 });
12342 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
12343 if (nextHeaderMenuToFocus) {
12344 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
12345 setNextHeaderMenuToFocus(void 0);
12346 return;
12347 }
12348 const onHide = (field) => {
12349 const hidden = headerMenuRefs.current.get(field.id);
12350 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
12351 setNextHeaderMenuToFocus(fallback?.node);
12352 };
12353 const handleHeaderContextMenu = (event) => {
12354 event.preventDefault();
12355 event.stopPropagation();
12356 const virtualAnchor = {
12357 getBoundingClientRect: () => ({
12358 x: event.clientX,
12359 y: event.clientY,
12360 top: event.clientY,
12361 left: event.clientX,
12362 right: event.clientX,
12363 bottom: event.clientY,
12364 width: 0,
12365 height: 0,
12366 toJSON: () => ({})
12367 })
12368 };
12369 window.requestAnimationFrame(() => {
12370 setContextMenuAnchor(virtualAnchor);
12371 });
12372 };
12373 const hasData = !!data?.length;
12374 const titleField = fields.find((field) => field.id === view.titleField);
12375 const mediaField = fields.find((field) => field.id === view.mediaField);
12376 const descriptionField = fields.find(
12377 (field) => field.id === view.descriptionField
12378 );
12379 const { showTitle = true, showMedia = true, showDescription = true } = view;
12380 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
12381 const columns = view.fields ?? [];
12382 const headerMenuRef = (column, index2) => (node) => {
12383 if (node) {
12384 headerMenuRefs.current.set(column, {
12385 node,
12386 fallback: columns[index2 > 0 ? index2 - 1 : 1]
12387 });
12388 } else {
12389 headerMenuRefs.current.delete(column);
12390 }
12391 };
12392 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
12393 const isRtl = (0, import_i18n10.isRTL)();
12394 if (!hasData) {
12395 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12396 "div",
12397 {
12398 className: clsx_default("dataviews-no-results", {
12399 "is-refreshing": isDelayedLoading
12400 }),
12401 id: tableNoticeId,
12402 children: empty
12403 }
12404 );
12405 }
12406 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
12407 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
12408 "table",
12409 {
12410 className: clsx_default("dataviews-view-table", className, {
12411 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
12412 view.layout.density
12413 ),
12414 "has-bulk-actions": hasBulkActions,
12415 "is-refreshing": !isInfiniteScroll && isDelayedLoading
12416 }),
12417 "aria-busy": isLoading,
12418 "aria-describedby": tableNoticeId,
12419 role: isInfiniteScroll ? "feed" : void 0,
12420 inert: !isInfiniteScroll && isLoading ? "true" : void 0,
12421 children: [
12422 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("colgroup", { children: [
12423 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("col", { className: "dataviews-view-table__col-checkbox" }),
12424 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("col", { className: "dataviews-view-table__col-first-data" }),
12425 columns.map((column, index2) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12426 "col",
12427 {
12428 className: clsx_default(
12429 `dataviews-view-table__col-${column}`,
12430 {
12431 "dataviews-view-table__col-expand": !hasPrimaryColumn && index2 === columns.length - 1
12432 }
12433 )
12434 },
12435 `col-${column}`
12436 )),
12437 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("col", { className: "dataviews-view-table__col-actions" })
12438 ] }),
12439 contextMenuAnchor && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12440 import_components6.Popover,
12441 {
12442 anchor: contextMenuAnchor,
12443 onClose: () => setContextMenuAnchor(null),
12444 placement: "bottom-start",
12445 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PropertiesSection, { showLabel: false })
12446 }
12447 ),
12448 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12449 "thead",
12450 {
12451 className: clsx_default({
12452 "dataviews-view-table__thead--stuck": isVerticallyScrolled
12453 }),
12454 onContextMenu: handleHeaderContextMenu,
12455 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("tr", { className: "dataviews-view-table__row", children: [
12456 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12457 "th",
12458 {
12459 className: "dataviews-view-table__checkbox-column",
12460 scope: "col",
12461 onContextMenu: handleHeaderContextMenu,
12462 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12463 BulkSelectionCheckbox,
12464 {
12465 selection,
12466 onChangeSelection,
12467 data,
12468 actions,
12469 getItemId
12470 }
12471 )
12472 }
12473 ),
12474 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("th", { scope: "col", children: titleField && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12475 column_header_menu_default,
12476 {
12477 ref: headerMenuRef(
12478 titleField.id,
12479 0
12480 ),
12481 fieldId: titleField.id,
12482 view,
12483 fields,
12484 onChangeView,
12485 onHide,
12486 setOpenedFilter,
12487 canMove: false,
12488 canInsertLeft: isRtl ? view.layout?.enableMoving ?? true : false,
12489 canInsertRight: isRtl ? false : view.layout?.enableMoving ?? true
12490 }
12491 ) }),
12492 columns.map((column, index2) => {
12493 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
12494 const field = fields.find(
12495 (f2) => f2.id === column
12496 );
12497 const effectiveAlign = getEffectiveAlign(
12498 align,
12499 field?.type
12500 );
12501 const canInsertOrMove = view.layout?.enableMoving ?? true;
12502 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12503 "th",
12504 {
12505 style: {
12506 width,
12507 maxWidth,
12508 minWidth,
12509 textAlign: effectiveAlign
12510 },
12511 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
12512 scope: "col",
12513 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12514 column_header_menu_default,
12515 {
12516 ref: headerMenuRef(column, index2),
12517 fieldId: column,
12518 view,
12519 fields,
12520 onChangeView,
12521 onHide,
12522 setOpenedFilter,
12523 canMove: canInsertOrMove,
12524 canInsertLeft: canInsertOrMove,
12525 canInsertRight: canInsertOrMove
12526 }
12527 )
12528 },
12529 column
12530 );
12531 }),
12532 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12533 "th",
12534 {
12535 className: clsx_default(
12536 "dataviews-view-table__actions-column",
12537 {
12538 "dataviews-view-table__actions-column--sticky": true,
12539 "dataviews-view-table__actions-column--stuck": !isHorizontalScrollEnd
12540 }
12541 ),
12542 children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "dataviews-view-table-header", children: (0, import_i18n10.__)("Actions") })
12543 }
12544 )
12545 ] })
12546 }
12547 ),
12548 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
12549 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("tbody", { children: [
12550 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("tr", { className: "dataviews-view-table__group-header-row", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12551 "td",
12552 {
12553 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + (hasBulkActions ? 1 : 0) + (actions?.length ? 1 : 0),
12554 className: "dataviews-view-table__group-header-cell",
12555 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n10.sprintf)(
12556 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
12557 (0, import_i18n10.__)("%1$s: %2$s"),
12558 groupField.label,
12559 groupName
12560 )
12561 }
12562 ) }),
12563 groupItems.map((item, index2) => {
12564 const id = getItemId(item) || index2.toString();
12565 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12566 TableRow,
12567 {
12568 item,
12569 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
12570 hasBulkActions,
12571 actions,
12572 fields,
12573 id,
12574 view,
12575 titleField,
12576 mediaField,
12577 descriptionField,
12578 selection,
12579 getItemId,
12580 onChangeSelection,
12581 ...getSelectionProps(id),
12582 onClickItem,
12583 renderItemLink,
12584 isItemClickable,
12585 isActionsColumnSticky: !isHorizontalScrollEnd
12586 },
12587 getItemId(item)
12588 );
12589 })
12590 ] }, `group-${groupName}`)
12591 ) : /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("tbody", { children: hasData && data.map((item, index2) => {
12592 const id = getItemId(item) || index2.toString();
12593 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
12594 TableRow,
12595 {
12596 item,
12597 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
12598 hasBulkActions,
12599 actions,
12600 fields,
12601 id,
12602 view,
12603 titleField,
12604 mediaField,
12605 descriptionField,
12606 selection,
12607 getItemId,
12608 onChangeSelection,
12609 ...getSelectionProps(id),
12610 onClickItem,
12611 renderItemLink,
12612 isItemClickable,
12613 isActionsColumnSticky: !isHorizontalScrollEnd,
12614 posinset: isInfiniteScroll ? index2 + 1 : void 0
12615 },
12616 getItemId(item)
12617 );
12618 }) })
12619 ]
12620 }
12621 ),
12622 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-loading", id: tableNoticeId, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components6.Spinner, {}) }) })
12623 ] });
12624 }
12625 var table_default = ViewTable;
12626
12627 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
12628 var import_components9 = __toESM(require_components(), 1);
12629 var import_i18n13 = __toESM(require_i18n(), 1);
12630
12631 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
12632 var import_components8 = __toESM(require_components(), 1);
12633 var import_i18n12 = __toESM(require_i18n(), 1);
12634 var import_compose3 = __toESM(require_compose(), 1);
12635 var import_element40 = __toESM(require_element(), 1);
12636
12637 // packages/dataviews/build-module/components/dataviews-layouts/grid/preview-size-picker.mjs
12638 var import_components7 = __toESM(require_components(), 1);
12639 var import_i18n11 = __toESM(require_i18n(), 1);
12640 var import_element37 = __toESM(require_element(), 1);
12641 var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1);
12642 var imageSizes = [
12643 {
12644 value: 120,
12645 breakpoint: 1
12646 },
12647 {
12648 value: 170,
12649 breakpoint: 1
12650 },
12651 {
12652 value: 230,
12653 breakpoint: 1
12654 },
12655 {
12656 value: 290,
12657 breakpoint: 1112
12658 // at minimum image width, 4 images display at this container size
12659 },
12660 {
12661 value: 350,
12662 breakpoint: 1636
12663 // at minimum image width, 6 images display at this container size
12664 },
12665 {
12666 value: 430,
12667 breakpoint: 588
12668 // at minimum image width, 2 images display at this container size
12669 }
12670 ];
12671 var DEFAULT_PREVIEW_SIZE = imageSizes[2].value;
12672 function useGridColumns() {
12673 const context = (0, import_element37.useContext)(dataviews_context_default);
12674 const view = context.view;
12675 return (0, import_element37.useMemo)(() => {
12676 const containerWidth = context.containerWidth;
12677 const gap = 32;
12678 const previewSize = view.layout?.previewSize ?? DEFAULT_PREVIEW_SIZE;
12679 const columns = Math.floor(
12680 (containerWidth + gap) / (previewSize + gap)
12681 );
12682 return Math.max(1, columns);
12683 }, [context.containerWidth, view.layout?.previewSize]);
12684 }
12685
12686 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-items.mjs
12687 var import_element38 = __toESM(require_element(), 1);
12688 var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1);
12689 var GridItems = (0, import_element38.forwardRef)(({ className, previewSize, ...props }, ref) => {
12690 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
12691 "div",
12692 {
12693 ref,
12694 className: clsx_default("dataviews-view-grid-items", className),
12695 style: {
12696 gridTemplateColumns: previewSize && `repeat(auto-fill, minmax(${previewSize}px, 1fr))`
12697 },
12698 ...props
12699 }
12700 );
12701 });
12702
12703 // packages/dataviews/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs
12704 var import_element39 = __toESM(require_element(), 1);
12705 function useIntersectionObserver(elementRef, posinset) {
12706 const { intersectionObserver } = (0, import_element39.useContext)(dataviews_context_default);
12707 (0, import_element39.useEffect)(() => {
12708 const element = elementRef.current;
12709 if (!element || posinset === void 0 || !intersectionObserver) {
12710 return;
12711 }
12712 intersectionObserver.observe(element);
12713 return () => {
12714 intersectionObserver.unobserve(element);
12715 };
12716 }, [elementRef, intersectionObserver, posinset]);
12717 }
12718 function usePlaceholdersNeeded(data, isInfiniteScroll, gridColumns) {
12719 const hasData = !!data?.length;
12720 const firstItemPosition = hasData && isInfiniteScroll ? data[0].position : void 0;
12721 return firstItemPosition && gridColumns ? (firstItemPosition - 1) % gridColumns : 0;
12722 }
12723
12724 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
12725 var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1);
12726 var { Badge: WCBadge } = unlock2(import_components8.privateApis);
12727 function chunk(array, size4) {
12728 const chunks = [];
12729 for (let i2 = 0, j2 = array.length; i2 < j2; i2 += size4) {
12730 chunks.push(array.slice(i2, i2 + size4));
12731 }
12732 return chunks;
12733 }
12734 var GridItem = (0, import_element40.forwardRef)(
12735 function GridItem2({
12736 view,
12737 selection,
12738 onChangeSelection,
12739 onClickItem,
12740 isItemClickable,
12741 renderItemLink,
12742 getItemId,
12743 item,
12744 actions,
12745 mediaField,
12746 titleField,
12747 descriptionField,
12748 regularFields,
12749 badgeFields,
12750 hasBulkActions,
12751 config,
12752 posinset,
12753 setsize,
12754 ...props
12755 }, forwardedRef) {
12756 const {
12757 showTitle = true,
12758 showMedia = true,
12759 showDescription = true
12760 } = view;
12761 const hasBulkAction = useHasAPossibleBulkAction(actions, item);
12762 const id = getItemId(item);
12763 const elementRef = (0, import_element40.useRef)(null);
12764 const setRefs = (0, import_element40.useCallback)(
12765 (node) => {
12766 elementRef.current = node;
12767 if (typeof forwardedRef === "function") {
12768 forwardedRef(node);
12769 } else if (forwardedRef) {
12770 forwardedRef.current = node;
12771 }
12772 },
12773 [forwardedRef]
12774 );
12775 useIntersectionObserver(elementRef, posinset);
12776 const instanceId = (0, import_compose3.useInstanceId)(GridItem2);
12777 const isSelected2 = selection.includes(id);
12778 const mediaPlaceholder = /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "dataviews-view-grid__media-placeholder" });
12779 const rendersMediaField = showMedia && mediaField?.render;
12780 const renderedMediaField = rendersMediaField ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12781 mediaField.render,
12782 {
12783 item,
12784 field: mediaField,
12785 config
12786 }
12787 ) : mediaPlaceholder;
12788 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(titleField.render, { item, field: titleField }) : null;
12789 let mediaA11yProps;
12790 let titleA11yProps;
12791 if (isItemClickable(item) && onClickItem) {
12792 if (renderedTitleField) {
12793 mediaA11yProps = {
12794 "aria-labelledby": `dataviews-view-grid__title-field-${instanceId}`
12795 };
12796 titleA11yProps = {
12797 id: `dataviews-view-grid__title-field-${instanceId}`
12798 };
12799 } else {
12800 mediaA11yProps = {
12801 "aria-label": (0, import_i18n12.__)("Navigate to item")
12802 };
12803 }
12804 }
12805 return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
12806 Stack,
12807 {
12808 direction: "column",
12809 ...props,
12810 ref: setRefs,
12811 "aria-setsize": setsize,
12812 "aria-posinset": posinset,
12813 className: clsx_default(
12814 props.className,
12815 "dataviews-view-grid__row__gridcell",
12816 "dataviews-view-grid__card",
12817 {
12818 "is-selected": hasBulkAction && isSelected2
12819 }
12820 ),
12821 children: [
12822 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12823 ItemClickWrapper,
12824 {
12825 item,
12826 isItemClickable,
12827 onClickItem,
12828 renderItemLink,
12829 className: clsx_default("dataviews-view-grid__media", {
12830 "dataviews-view-grid__media--placeholder": !rendersMediaField
12831 }),
12832 ...mediaA11yProps,
12833 children: renderedMediaField
12834 }
12835 ),
12836 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12837 DataViewsSelectionCheckbox,
12838 {
12839 item,
12840 selection,
12841 onChangeSelection,
12842 getItemId,
12843 titleField,
12844 disabled: !hasBulkAction
12845 }
12846 ),
12847 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12848 ItemActions,
12849 {
12850 item,
12851 actions,
12852 isCompact: true
12853 }
12854 ) }),
12855 showTitle && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "dataviews-view-grid__title-actions", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12856 ItemClickWrapper,
12857 {
12858 item,
12859 isItemClickable,
12860 onClickItem,
12861 renderItemLink,
12862 className: "dataviews-view-grid__title-field dataviews-title-field",
12863 ...titleA11yProps,
12864 title: titleField?.getValueFormatted({
12865 item,
12866 field: titleField
12867 }) || void 0,
12868 children: renderedTitleField
12869 }
12870 ) }),
12871 /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Stack, { direction: "column", gap: "xs", children: [
12872 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12873 descriptionField.render,
12874 {
12875 item,
12876 field: descriptionField
12877 }
12878 ),
12879 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12880 Stack,
12881 {
12882 direction: "row",
12883 className: "dataviews-view-grid__badge-fields",
12884 gap: "sm",
12885 wrap: "wrap",
12886 align: "top",
12887 justify: "flex-start",
12888 children: badgeFields.map((field) => {
12889 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12890 WCBadge,
12891 {
12892 className: "dataviews-view-grid__field-value",
12893 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12894 field.render,
12895 {
12896 item,
12897 field
12898 }
12899 )
12900 },
12901 field.id
12902 );
12903 })
12904 }
12905 ),
12906 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12907 Stack,
12908 {
12909 direction: "column",
12910 className: "dataviews-view-grid__fields",
12911 gap: "xs",
12912 children: regularFields.map((field) => {
12913 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12914 import_components8.Flex,
12915 {
12916 className: "dataviews-view-grid__field",
12917 gap: 1,
12918 justify: "flex-start",
12919 expanded: true,
12920 style: { height: "auto" },
12921 direction: "row",
12922 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
12923 /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(tooltip_exports.Root, { children: [
12924 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12925 tooltip_exports.Trigger,
12926 {
12927 render: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_components8.FlexItem, { className: "dataviews-view-grid__field-name", children: field.header })
12928 }
12929 ),
12930 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(tooltip_exports.Popup, { children: field.label })
12931 ] }),
12932 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12933 import_components8.FlexItem,
12934 {
12935 className: "dataviews-view-grid__field-value",
12936 style: { maxHeight: "none" },
12937 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12938 field.render,
12939 {
12940 item,
12941 field
12942 }
12943 )
12944 }
12945 )
12946 ] })
12947 },
12948 field.id
12949 );
12950 })
12951 }
12952 )
12953 ] })
12954 ]
12955 }
12956 );
12957 }
12958 );
12959 function CompositeGrid({
12960 data,
12961 isInfiniteScroll,
12962 className,
12963 inert,
12964 isLoading,
12965 view,
12966 fields,
12967 selection,
12968 onChangeSelection,
12969 onClickItem,
12970 isItemClickable,
12971 renderItemLink,
12972 getItemId,
12973 actions,
12974 getSelectionProps
12975 }) {
12976 const { paginationInfo, resizeObserverRef } = (0, import_element40.useContext)(dataviews_context_default);
12977 const gridColumns = useGridColumns();
12978 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
12979 const titleField = fields.find(
12980 (field) => field.id === view?.titleField
12981 );
12982 const mediaField = fields.find(
12983 (field) => field.id === view?.mediaField
12984 );
12985 const descriptionField = fields.find(
12986 (field) => field.id === view?.descriptionField
12987 );
12988 const otherFields = view.fields ?? [];
12989 const { regularFields, badgeFields } = otherFields.reduce(
12990 (accumulator, fieldId) => {
12991 const field = fields.find((f2) => f2.id === fieldId);
12992 if (!field) {
12993 return accumulator;
12994 }
12995 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
12996 accumulator[key].push(field);
12997 return accumulator;
12998 },
12999 { regularFields: [], badgeFields: [] }
13000 );
13001 const size4 = "900px";
13002 const totalRows = Math.ceil(data.length / gridColumns);
13003 const placeholdersNeeded = usePlaceholdersNeeded(
13004 data,
13005 isInfiniteScroll,
13006 gridColumns
13007 );
13008 return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, {
13009 // Render infinite scroll layout (no rows, feed semantics)
13010 children: [
13011 isInfiniteScroll && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
13012 import_components8.Composite,
13013 {
13014 render: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13015 GridItems,
13016 {
13017 className: clsx_default(
13018 "dataviews-view-grid-infinite-scroll",
13019 className,
13020 {
13021 [`has-${view.layout?.density}-density`]: view.layout?.density && [
13022 "compact",
13023 "comfortable"
13024 ].includes(view.layout.density)
13025 }
13026 ),
13027 previewSize: view.layout?.previewSize,
13028 "aria-busy": isLoading,
13029 ref: resizeObserverRef
13030 }
13031 ),
13032 role: "feed",
13033 focusWrap: true,
13034 inert,
13035 children: [
13036 Array.from({ length: placeholdersNeeded }).map(
13037 (_, index2) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13038 import_components8.Composite.Item,
13039 {
13040 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13041 Stack,
13042 {
13043 ...props,
13044 direction: "column",
13045 role: "article",
13046 className: "dataviews-view-grid__row__gridcell dataviews-view-grid__card dataviews-view-grid__placeholder"
13047 }
13048 ),
13049 "aria-hidden": true,
13050 tabIndex: -1
13051 },
13052 `placeholder-${index2}`
13053 )
13054 ),
13055 data.map((item) => {
13056 const itemId = getItemId(item);
13057 const selectionProps = getSelectionProps(itemId);
13058 const stablePosition = item.position;
13059 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13060 import_components8.Composite.Item,
13061 {
13062 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13063 GridItem,
13064 {
13065 ...props,
13066 id: itemId,
13067 role: "article",
13068 view,
13069 selection,
13070 onChangeSelection,
13071 onClickItem,
13072 isItemClickable,
13073 renderItemLink,
13074 getItemId,
13075 item,
13076 actions,
13077 onMouseDown: (event) => {
13078 props.onMouseDown?.(event);
13079 selectionProps.onMouseDown(
13080 event
13081 );
13082 },
13083 onClickCapture: (event) => {
13084 props.onClickCapture?.(event);
13085 selectionProps.onClickCapture(
13086 event
13087 );
13088 },
13089 mediaField,
13090 titleField,
13091 descriptionField,
13092 regularFields,
13093 badgeFields,
13094 hasBulkActions,
13095 posinset: stablePosition,
13096 setsize: paginationInfo.totalItems,
13097 config: {
13098 sizes: size4
13099 }
13100 }
13101 )
13102 },
13103 itemId
13104 );
13105 })
13106 ]
13107 }
13108 ),
13109 // Render standard grid layout (with rows, grid semantics)
13110 !isInfiniteScroll && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13111 import_components8.Composite,
13112 {
13113 role: "grid",
13114 className: clsx_default("dataviews-view-grid", className, {
13115 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
13116 view.layout.density
13117 )
13118 }),
13119 focusWrap: true,
13120 "aria-busy": isLoading,
13121 "aria-rowcount": totalRows,
13122 ref: resizeObserverRef,
13123 inert,
13124 children: chunk(data, gridColumns).map((row, i2) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13125 import_components8.Composite.Row,
13126 {
13127 render: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13128 "div",
13129 {
13130 role: "row",
13131 "aria-rowindex": i2 + 1,
13132 "aria-label": (0, import_i18n12.sprintf)(
13133 /* translators: %d: The row number in the grid */
13134 (0, import_i18n12.__)("Row %d"),
13135 i2 + 1
13136 ),
13137 className: "dataviews-view-grid__row",
13138 style: {
13139 gridTemplateColumns: `repeat( ${gridColumns}, minmax(0, 1fr) )`
13140 }
13141 }
13142 ),
13143 children: row.map((item) => {
13144 const itemId = getItemId(item);
13145 const selectionProps = getSelectionProps(itemId);
13146 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13147 import_components8.Composite.Item,
13148 {
13149 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
13150 GridItem,
13151 {
13152 ...props,
13153 id: itemId,
13154 role: "gridcell",
13155 view,
13156 selection,
13157 onChangeSelection,
13158 onClickItem,
13159 isItemClickable,
13160 renderItemLink,
13161 getItemId,
13162 item,
13163 actions,
13164 onMouseDown: (event) => {
13165 props.onMouseDown?.(
13166 event
13167 );
13168 selectionProps.onMouseDown(
13169 event
13170 );
13171 },
13172 onClickCapture: (event) => {
13173 props.onClickCapture?.(
13174 event
13175 );
13176 selectionProps.onClickCapture(
13177 event
13178 );
13179 },
13180 mediaField,
13181 titleField,
13182 descriptionField,
13183 regularFields,
13184 badgeFields,
13185 hasBulkActions,
13186 config: {
13187 sizes: size4
13188 }
13189 }
13190 )
13191 },
13192 itemId
13193 );
13194 })
13195 },
13196 i2
13197 ))
13198 }
13199 )
13200 ]
13201 });
13202 }
13203
13204 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
13205 var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1);
13206 function ViewGrid({
13207 actions,
13208 data,
13209 fields,
13210 getItemId,
13211 isLoading,
13212 onChangeSelection,
13213 onClickItem,
13214 isItemClickable,
13215 renderItemLink,
13216 selection,
13217 view,
13218 className,
13219 empty
13220 }) {
13221 const isDelayedLoading = useDelayedLoading(!!isLoading);
13222 const hasData = !!data?.length;
13223 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
13224 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
13225 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
13226 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
13227 const { getSelectionProps } = useSelectionProps({
13228 data: orderedData,
13229 getItemId,
13230 isItemSelectable: (item) => hasAPossibleBulkAction(actions, item),
13231 selection,
13232 onChangeSelection,
13233 selectionMode: "multi",
13234 shouldSelectOnClick: false
13235 });
13236 if (!hasData) {
13237 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13238 "div",
13239 {
13240 className: clsx_default("dataviews-no-results", {
13241 "is-refreshing": isDelayedLoading
13242 }),
13243 children: empty
13244 }
13245 );
13246 }
13247 const gridProps = {
13248 className: clsx_default(className, {
13249 "is-refreshing": !isInfiniteScroll && isDelayedLoading
13250 }),
13251 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0,
13252 isLoading,
13253 view,
13254 fields,
13255 selection,
13256 onChangeSelection,
13257 onClickItem,
13258 isItemClickable,
13259 renderItemLink,
13260 getItemId,
13261 actions,
13262 getSelectionProps
13263 };
13264 return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_jsx_runtime58.Fragment, {
13265 // Render multiple groups.
13266 children: [
13267 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Stack, { direction: "column", gap: "lg", children: Array.from(dataByGroup.entries()).map(
13268 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
13269 Stack,
13270 {
13271 direction: "column",
13272 gap: "sm",
13273 children: [
13274 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("h3", { className: "dataviews-view-grid__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n13.sprintf)(
13275 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
13276 (0, import_i18n13.__)("%1$s: %2$s"),
13277 groupField.label,
13278 groupName
13279 ) }),
13280 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13281 CompositeGrid,
13282 {
13283 ...gridProps,
13284 data: groupItems,
13285 isInfiniteScroll: false
13286 }
13287 )
13288 ]
13289 },
13290 groupName
13291 )
13292 ) }),
13293 // Render a single grid with all data.
13294 !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13295 CompositeGrid,
13296 {
13297 ...gridProps,
13298 data,
13299 isInfiniteScroll: !!isInfiniteScroll
13300 }
13301 ),
13302 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_components9.Spinner, {}) })
13303 ]
13304 });
13305 }
13306 var grid_default = ViewGrid;
13307
13308 // packages/dataviews/build-module/components/dataviews-layouts/list/index.mjs
13309 var import_compose4 = __toESM(require_compose(), 1);
13310 var import_components10 = __toESM(require_components(), 1);
13311 var import_element41 = __toESM(require_element(), 1);
13312 var import_i18n14 = __toESM(require_i18n(), 1);
13313 var import_data3 = __toESM(require_data(), 1);
13314 var import_jsx_runtime59 = __toESM(require_jsx_runtime(), 1);
13315 var { Menu: Menu3 } = unlock2(import_components10.privateApis);
13316 function generateItemWrapperCompositeId(idPrefix) {
13317 return `${idPrefix}-item-wrapper`;
13318 }
13319 function generatePrimaryActionCompositeId(idPrefix, primaryActionId) {
13320 return `${idPrefix}-primary-action-${primaryActionId}`;
13321 }
13322 function generateDropdownTriggerCompositeId(idPrefix) {
13323 return `${idPrefix}-dropdown`;
13324 }
13325 function PrimaryActionGridCell({
13326 idPrefix,
13327 primaryAction,
13328 item
13329 }) {
13330 const registry = (0, import_data3.useRegistry)();
13331 const [isModalOpen, setIsModalOpen] = (0, import_element41.useState)(false);
13332 const compositeItemId = generatePrimaryActionCompositeId(
13333 idPrefix,
13334 primaryAction.id
13335 );
13336 const label = typeof primaryAction.label === "string" ? primaryAction.label : primaryAction.label([item]);
13337 return "RenderModal" in primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13338 import_components10.Composite.Item,
13339 {
13340 id: compositeItemId,
13341 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13342 import_components10.Button,
13343 {
13344 disabled: !!primaryAction.disabled,
13345 accessibleWhenDisabled: true,
13346 text: label,
13347 size: "small",
13348 onClick: () => setIsModalOpen(true)
13349 }
13350 ),
13351 children: isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13352 ActionModal,
13353 {
13354 action: primaryAction,
13355 items: [item],
13356 closeModal: () => setIsModalOpen(false)
13357 }
13358 )
13359 }
13360 ) }, primaryAction.id) : /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13361 import_components10.Composite.Item,
13362 {
13363 id: compositeItemId,
13364 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13365 import_components10.Button,
13366 {
13367 disabled: !!primaryAction.disabled,
13368 accessibleWhenDisabled: true,
13369 size: "small",
13370 onClick: () => {
13371 primaryAction.callback([item], { registry });
13372 },
13373 children: label
13374 }
13375 )
13376 }
13377 ) }, primaryAction.id);
13378 }
13379 function ListItem({
13380 view,
13381 actions,
13382 idPrefix,
13383 isSelected: isSelected2,
13384 item,
13385 titleField,
13386 mediaField,
13387 descriptionField,
13388 selectionProps,
13389 otherFields,
13390 onDropdownTriggerKeyDown,
13391 posinset
13392 }) {
13393 const {
13394 showTitle = true,
13395 showMedia = true,
13396 showDescription = true,
13397 infiniteScrollEnabled
13398 } = view;
13399 const itemRef = (0, import_element41.useRef)(null);
13400 const labelId = `${idPrefix}-label`;
13401 const descriptionId = `${idPrefix}-description`;
13402 const registry = (0, import_data3.useRegistry)();
13403 const [isHovered, setIsHovered] = (0, import_element41.useState)(false);
13404 const [activeModalAction, setActiveModalAction] = (0, import_element41.useState)(
13405 null
13406 );
13407 const handleHover = ({ type }) => {
13408 const isHover = type === "mouseenter";
13409 setIsHovered(isHover);
13410 };
13411 const { paginationInfo } = (0, import_element41.useContext)(dataviews_context_default);
13412 (0, import_element41.useEffect)(() => {
13413 if (isSelected2) {
13414 itemRef.current?.scrollIntoView({
13415 behavior: "auto",
13416 block: "nearest",
13417 inline: "nearest"
13418 });
13419 }
13420 }, [isSelected2]);
13421 const { primaryAction, eligibleActions } = (0, import_element41.useMemo)(() => {
13422 const _eligibleActions = actions.filter(
13423 (action) => !action.isEligible || action.isEligible(item)
13424 );
13425 const _primaryActions = _eligibleActions.filter(
13426 (action) => action.isPrimary
13427 );
13428 return {
13429 primaryAction: _primaryActions[0],
13430 eligibleActions: _eligibleActions
13431 };
13432 }, [actions, item]);
13433 const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1;
13434 const renderedMediaField = showMedia && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-view-list__media-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13435 mediaField.render,
13436 {
13437 item,
13438 field: mediaField,
13439 config: { sizes: "52px" }
13440 }
13441 ) }) : null;
13442 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(titleField.render, { item, field: titleField }) : null;
13443 const renderDescription = showDescription && descriptionField?.render;
13444 const hasOnlyMediaAndTitle = !!renderedMediaField && !renderDescription && !otherFields.length;
13445 const usedActions = eligibleActions?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
13446 Stack,
13447 {
13448 direction: "row",
13449 gap: "md",
13450 className: "dataviews-view-list__item-actions",
13451 children: [
13452 primaryAction && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13453 PrimaryActionGridCell,
13454 {
13455 idPrefix,
13456 primaryAction,
13457 item
13458 }
13459 ),
13460 !hasOnlyOnePrimaryAction && /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { role: "gridcell", children: [
13461 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Menu3, { placement: "bottom-end", children: [
13462 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13463 Menu3.TriggerButton,
13464 {
13465 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13466 import_components10.Composite.Item,
13467 {
13468 id: generateDropdownTriggerCompositeId(
13469 idPrefix
13470 ),
13471 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13472 import_components10.Button,
13473 {
13474 size: "small",
13475 icon: more_vertical_default,
13476 label: (0, import_i18n14.__)("Actions"),
13477 accessibleWhenDisabled: true,
13478 disabled: !actions.length,
13479 onKeyDown: onDropdownTriggerKeyDown
13480 }
13481 )
13482 }
13483 )
13484 }
13485 ),
13486 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Menu3.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13487 ActionsMenuGroup,
13488 {
13489 actions: eligibleActions,
13490 item,
13491 registry,
13492 setActiveModalAction
13493 }
13494 ) })
13495 ] }),
13496 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13497 ActionModal,
13498 {
13499 action: activeModalAction,
13500 items: [item],
13501 closeModal: () => setActiveModalAction(null)
13502 }
13503 )
13504 ] })
13505 ]
13506 }
13507 );
13508 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13509 import_components10.Composite.Row,
13510 {
13511 ref: itemRef,
13512 render: (
13513 /* aria-posinset breaks Composite.Row if passed to it directly. */
13514 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13515 "div",
13516 {
13517 "aria-posinset": posinset,
13518 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0
13519 }
13520 )
13521 ),
13522 role: infiniteScrollEnabled ? "article" : "row",
13523 className: clsx_default({
13524 "is-selected": isSelected2,
13525 "is-hovered": isHovered
13526 }),
13527 onMouseEnter: handleHover,
13528 onMouseLeave: handleHover,
13529 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
13530 Stack,
13531 {
13532 direction: "row",
13533 className: "dataviews-view-list__item-wrapper",
13534 children: [
13535 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13536 import_components10.Composite.Item,
13537 {
13538 id: generateItemWrapperCompositeId(idPrefix),
13539 "aria-pressed": isSelected2,
13540 "aria-labelledby": labelId,
13541 "aria-describedby": descriptionId,
13542 className: "dataviews-view-list__item",
13543 ...selectionProps
13544 }
13545 ) }),
13546 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
13547 Stack,
13548 {
13549 direction: "row",
13550 gap: "md",
13551 justify: "start",
13552 align: hasOnlyMediaAndTitle ? "center" : "flex-start",
13553 style: { flex: 1, minWidth: 0 },
13554 children: [
13555 renderedMediaField,
13556 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
13557 Stack,
13558 {
13559 direction: "column",
13560 gap: "xs",
13561 className: "dataviews-view-list__field-wrapper",
13562 children: [
13563 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Stack, { direction: "row", align: "center", children: [
13564 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13565 "div",
13566 {
13567 className: "dataviews-title-field dataviews-view-list__title-field",
13568 id: labelId,
13569 children: renderedTitleField
13570 }
13571 ),
13572 usedActions
13573 ] }),
13574 renderDescription && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-view-list__field", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13575 descriptionField.render,
13576 {
13577 item,
13578 field: descriptionField
13579 }
13580 ) }),
13581 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13582 "div",
13583 {
13584 className: "dataviews-view-list__fields",
13585 id: descriptionId,
13586 children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
13587 "div",
13588 {
13589 className: "dataviews-view-list__field",
13590 children: [
13591 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13592 VisuallyHidden,
13593 {
13594 className: "dataviews-view-list__field-label",
13595 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", {}),
13596 children: field.label
13597 }
13598 ),
13599 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "dataviews-view-list__field-value", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13600 field.render,
13601 {
13602 item,
13603 field
13604 }
13605 ) })
13606 ]
13607 },
13608 field.id
13609 ))
13610 }
13611 )
13612 ]
13613 }
13614 )
13615 ]
13616 }
13617 )
13618 ]
13619 }
13620 )
13621 }
13622 );
13623 }
13624 function isDefined2(item) {
13625 return !!item;
13626 }
13627 function ViewList(props) {
13628 const {
13629 actions,
13630 data,
13631 fields,
13632 getItemId,
13633 isLoading,
13634 onChangeSelection,
13635 selection,
13636 view,
13637 className,
13638 empty
13639 } = props;
13640 const baseId = (0, import_compose4.useInstanceId)(ViewList, "view-list");
13641 const isDelayedLoading = useDelayedLoading(!!isLoading);
13642 const { paginationInfo } = (0, import_element41.useContext)(dataviews_context_default);
13643 const selectedItem = data?.findLast(
13644 (item) => selection.includes(getItemId(item))
13645 );
13646 const titleField = fields.find((field) => field.id === view.titleField);
13647 const mediaField = fields.find((field) => field.id === view.mediaField);
13648 const descriptionField = fields.find(
13649 (field) => field.id === view.descriptionField
13650 );
13651 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined2);
13652 const { getSelectionProps } = useSelectionProps({
13653 data,
13654 getItemId,
13655 isItemSelectable: () => true,
13656 selection,
13657 onChangeSelection,
13658 selectionMode: "single-required",
13659 shouldSelectOnClick: true
13660 });
13661 const generateCompositeItemIdPrefix = (0, import_element41.useCallback)(
13662 (item) => `${baseId}-${getItemId(item)}`,
13663 [baseId, getItemId]
13664 );
13665 const isActiveCompositeItem = (0, import_element41.useCallback)(
13666 (item, idToCheck) => {
13667 return idToCheck.startsWith(
13668 generateCompositeItemIdPrefix(item)
13669 );
13670 },
13671 [generateCompositeItemIdPrefix]
13672 );
13673 const [activeCompositeId, setActiveCompositeId] = (0, import_element41.useState)(void 0);
13674 const compositeRef = (0, import_element41.useRef)(null);
13675 (0, import_element41.useEffect)(() => {
13676 if (selectedItem) {
13677 setActiveCompositeId(
13678 generateItemWrapperCompositeId(
13679 generateCompositeItemIdPrefix(selectedItem)
13680 )
13681 );
13682 }
13683 }, [selectedItem, generateCompositeItemIdPrefix]);
13684 const activeItemIndex = data.findIndex(
13685 (item) => isActiveCompositeItem(item, activeCompositeId ?? "")
13686 );
13687 const previousActiveItemIndex = (0, import_compose4.usePrevious)(activeItemIndex);
13688 const isActiveIdInList = activeItemIndex !== -1;
13689 const selectCompositeItem = (0, import_element41.useCallback)(
13690 (targetIndex, generateCompositeId) => {
13691 const clampedIndex = Math.min(
13692 data.length - 1,
13693 Math.max(0, targetIndex)
13694 );
13695 if (!data[clampedIndex]) {
13696 return;
13697 }
13698 const itemIdPrefix = generateCompositeItemIdPrefix(
13699 data[clampedIndex]
13700 );
13701 const targetCompositeItemId = generateCompositeId(itemIdPrefix);
13702 setActiveCompositeId(targetCompositeItemId);
13703 if (compositeRef.current?.contains(
13704 compositeRef.current.ownerDocument.activeElement
13705 )) {
13706 document.getElementById(targetCompositeItemId)?.focus();
13707 }
13708 },
13709 [data, generateCompositeItemIdPrefix]
13710 );
13711 (0, import_element41.useEffect)(() => {
13712 const wasActiveIdInList = previousActiveItemIndex !== void 0 && previousActiveItemIndex !== -1;
13713 if (!isActiveIdInList && wasActiveIdInList) {
13714 selectCompositeItem(
13715 previousActiveItemIndex,
13716 generateItemWrapperCompositeId
13717 );
13718 }
13719 }, [isActiveIdInList, selectCompositeItem, previousActiveItemIndex]);
13720 const onDropdownTriggerKeyDown = (0, import_element41.useCallback)(
13721 (event) => {
13722 if (event.key === "ArrowDown") {
13723 event.preventDefault();
13724 selectCompositeItem(
13725 activeItemIndex + 1,
13726 generateDropdownTriggerCompositeId
13727 );
13728 }
13729 if (event.key === "ArrowUp") {
13730 event.preventDefault();
13731 selectCompositeItem(
13732 activeItemIndex - 1,
13733 generateDropdownTriggerCompositeId
13734 );
13735 }
13736 },
13737 [selectCompositeItem, activeItemIndex]
13738 );
13739 const hasData = !!data?.length;
13740 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
13741 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
13742 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
13743 const hasMoreItems = isInfiniteScroll && (view.startPosition ?? 1) + (view.perPage ?? 0) < paginationInfo.totalItems;
13744 const listClassName = clsx_default("dataviews-view-list", className, {
13745 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(view.layout.density),
13746 "is-refreshing": !isInfiniteScroll && isDelayedLoading
13747 });
13748 const compositeProps = {
13749 ref: compositeRef,
13750 id: baseId,
13751 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", {}),
13752 activeId: activeCompositeId,
13753 setActiveId: setActiveCompositeId,
13754 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0
13755 };
13756 if (!hasData) {
13757 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13758 "div",
13759 {
13760 className: clsx_default("dataviews-no-results", {
13761 "is-refreshing": isDelayedLoading
13762 }),
13763 children: empty
13764 }
13765 );
13766 }
13767 if (hasData && groupField && dataByGroup) {
13768 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13769 import_components10.Composite,
13770 {
13771 ...compositeProps,
13772 className: "dataviews-view-list__group",
13773 role: "grid",
13774 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Stack, { direction: "column", gap: "lg", className: listClassName, children: Array.from(dataByGroup.entries()).map(
13775 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Stack, { direction: "column", children: [
13776 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("h3", { className: "dataviews-view-list__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n14.sprintf)(
13777 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
13778 (0, import_i18n14.__)("%1$s: %2$s"),
13779 groupField.label,
13780 groupName
13781 ) }),
13782 groupItems.map((item) => {
13783 const id = generateCompositeItemIdPrefix(item);
13784 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13785 ListItem,
13786 {
13787 view,
13788 idPrefix: id,
13789 actions,
13790 item,
13791 isSelected: item === selectedItem,
13792 selectionProps: getSelectionProps(
13793 getItemId(item)
13794 ),
13795 mediaField,
13796 titleField,
13797 descriptionField,
13798 otherFields,
13799 onDropdownTriggerKeyDown
13800 },
13801 id
13802 );
13803 })
13804 ] }, groupName)
13805 ) })
13806 }
13807 );
13808 }
13809 return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_jsx_runtime59.Fragment, { children: [
13810 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13811 import_components10.Composite,
13812 {
13813 ...compositeProps,
13814 className: listClassName,
13815 role: view.infiniteScrollEnabled ? "feed" : "grid",
13816 children: data.map((item, index2) => {
13817 const id = generateCompositeItemIdPrefix(item);
13818 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13819 ListItem,
13820 {
13821 view,
13822 idPrefix: id,
13823 actions,
13824 item,
13825 isSelected: item === selectedItem,
13826 selectionProps: getSelectionProps(
13827 getItemId(item)
13828 ),
13829 mediaField,
13830 titleField,
13831 descriptionField,
13832 otherFields,
13833 onDropdownTriggerKeyDown,
13834 posinset: view.infiniteScrollEnabled ? index2 + 1 : void 0
13835 },
13836 id
13837 );
13838 })
13839 }
13840 ),
13841 (hasMoreItems || isInfiniteScroll && isLoading) && // Keep the spinner's height reserved while loading more so the
13842 // scroll position doesn't bounce. Hidden, and silent to a11y,
13843 // while idle.
13844 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13845 "p",
13846 {
13847 className: "dataviews-loading-more",
13848 "aria-hidden": !isLoading,
13849 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components10.Spinner, {})
13850 }
13851 )
13852 ] });
13853 }
13854
13855 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
13856 var import_components11 = __toESM(require_components(), 1);
13857
13858 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-group.mjs
13859 var import_i18n15 = __toESM(require_i18n(), 1);
13860 var import_element42 = __toESM(require_element(), 1);
13861 var import_jsx_runtime60 = __toESM(require_jsx_runtime(), 1);
13862 function ActivityGroup({
13863 groupName,
13864 groupData,
13865 groupField,
13866 showLabel = true,
13867 children
13868 }) {
13869 const groupHeader = showLabel ? (0, import_element42.createInterpolateElement)(
13870 // translators: %s: The label of the field e.g. "Status".
13871 (0, import_i18n15.sprintf)((0, import_i18n15.__)("%s: <groupName />"), groupField.label).trim(),
13872 {
13873 groupName: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
13874 groupField.render,
13875 {
13876 item: groupData[0],
13877 field: groupField
13878 }
13879 )
13880 }
13881 ) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(groupField.render, { item: groupData[0], field: groupField });
13882 return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
13883 Stack,
13884 {
13885 direction: "column",
13886 className: "dataviews-view-activity__group",
13887 children: [
13888 /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("h3", { className: "dataviews-view-activity__group-header", children: groupHeader }),
13889 children
13890 ]
13891 },
13892 groupName
13893 );
13894 }
13895
13896 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-item.mjs
13897 var import_element43 = __toESM(require_element(), 1);
13898 var import_data4 = __toESM(require_data(), 1);
13899 var import_compose5 = __toESM(require_compose(), 1);
13900 var import_jsx_runtime61 = __toESM(require_jsx_runtime(), 1);
13901 function ActivityItem(props) {
13902 const {
13903 view,
13904 actions,
13905 item,
13906 titleField,
13907 mediaField,
13908 descriptionField,
13909 otherFields,
13910 posinset,
13911 onClickItem,
13912 renderItemLink,
13913 isItemClickable
13914 } = props;
13915 const {
13916 showTitle = true,
13917 showMedia = true,
13918 showDescription = true,
13919 infiniteScrollEnabled
13920 } = view;
13921 const itemRef = (0, import_element43.useRef)(null);
13922 const registry = (0, import_data4.useRegistry)();
13923 const { paginationInfo } = (0, import_element43.useContext)(dataviews_context_default);
13924 const { primaryActions, eligibleActions } = (0, import_element43.useMemo)(() => {
13925 const _eligibleActions = actions.filter(
13926 (action) => !action.isEligible || action.isEligible(item)
13927 );
13928 const _primaryActions = _eligibleActions.filter(
13929 (action) => action.isPrimary
13930 );
13931 return {
13932 primaryActions: _primaryActions,
13933 eligibleActions: _eligibleActions
13934 };
13935 }, [actions, item]);
13936 const isMobileViewport = (0, import_compose5.useViewportMatch)("medium", "<");
13937 const density = view.layout?.density ?? "balanced";
13938 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13939 mediaField.render,
13940 {
13941 item,
13942 field: mediaField,
13943 config: {
13944 sizes: density === "comfortable" ? "32px" : "24px"
13945 }
13946 }
13947 ) : null;
13948 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-view-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13949 "span",
13950 {
13951 className: "dataviews-view-activity__item-bullet",
13952 "aria-hidden": "true"
13953 }
13954 ) });
13955 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(titleField.render, { item, field: titleField }) : null;
13956 const verticalGap = (0, import_element43.useMemo)(() => {
13957 switch (density) {
13958 case "comfortable":
13959 return "md";
13960 default:
13961 return "sm";
13962 }
13963 }, [density]);
13964 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13965 "div",
13966 {
13967 ref: itemRef,
13968 role: infiniteScrollEnabled ? "article" : void 0,
13969 "aria-posinset": posinset,
13970 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
13971 className: clsx_default(
13972 "dataviews-view-activity__item",
13973 density === "compact" && "is-compact",
13974 density === "balanced" && "is-balanced",
13975 density === "comfortable" && "is-comfortable"
13976 ),
13977 children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(Stack, { direction: "row", gap: "lg", justify: "start", align: "flex-start", children: [
13978 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13979 Stack,
13980 {
13981 direction: "column",
13982 gap: "xs",
13983 align: "center",
13984 className: "dataviews-view-activity__item-type",
13985 children: renderedMediaField
13986 }
13987 ),
13988 /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
13989 Stack,
13990 {
13991 direction: "column",
13992 gap: verticalGap,
13993 align: "flex-start",
13994 className: "dataviews-view-activity__item-content",
13995 children: [
13996 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13997 ItemClickWrapper,
13998 {
13999 item,
14000 isItemClickable,
14001 onClickItem,
14002 renderItemLink,
14003 className: "dataviews-view-activity__item-title",
14004 children: renderedTitleField
14005 }
14006 ),
14007 showDescription && descriptionField && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-view-activity__item-description", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14008 descriptionField.render,
14009 {
14010 item,
14011 field: descriptionField
14012 }
14013 ) }),
14014 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-view-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
14015 "div",
14016 {
14017 className: "dataviews-view-activity__item-field",
14018 children: [
14019 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14020 VisuallyHidden,
14021 {
14022 className: "dataviews-view-activity__item-field-label",
14023 render: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", {}),
14024 children: field.label
14025 }
14026 ),
14027 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "dataviews-view-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14028 field.render,
14029 {
14030 item,
14031 field
14032 }
14033 ) })
14034 ]
14035 },
14036 field.id
14037 )) }),
14038 !!primaryActions?.length && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14039 PrimaryActions,
14040 {
14041 item,
14042 actions: primaryActions,
14043 registry,
14044 buttonVariant: "secondary"
14045 }
14046 )
14047 ]
14048 }
14049 ),
14050 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
14051 // there if there are any actions at all.
14052 isMobileViewport && // At the same time, only show the menu if there are actions to show.
14053 eligibleActions.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-view-activity__item-actions", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
14054 ItemActions,
14055 {
14056 item,
14057 actions: eligibleActions,
14058 isCompact: true
14059 }
14060 ) })
14061 ] })
14062 }
14063 );
14064 }
14065 var activity_item_default = ActivityItem;
14066
14067 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-items.mjs
14068 var import_react10 = __toESM(require_react(), 1);
14069 function isDefined3(item) {
14070 return !!item;
14071 }
14072 function ActivityItems(props) {
14073 const { data, fields, getItemId, view } = props;
14074 const titleField = fields.find((field) => field.id === view.titleField);
14075 const mediaField = fields.find((field) => field.id === view.mediaField);
14076 const descriptionField = fields.find(
14077 (field) => field.id === view.descriptionField
14078 );
14079 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined3);
14080 return data.map((item, index2) => {
14081 return /* @__PURE__ */ (0, import_react10.createElement)(
14082 activity_item_default,
14083 {
14084 ...props,
14085 key: getItemId(item),
14086 item,
14087 mediaField,
14088 titleField,
14089 descriptionField,
14090 otherFields,
14091 posinset: view.infiniteScrollEnabled ? index2 + 1 : void 0
14092 }
14093 );
14094 });
14095 }
14096
14097 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
14098 var import_jsx_runtime62 = __toESM(require_jsx_runtime(), 1);
14099 function ViewActivity(props) {
14100 const { empty, data, fields, isLoading, view, className } = props;
14101 const isDelayedLoading = useDelayedLoading(!!isLoading);
14102 const hasData = !!data?.length;
14103 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
14104 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
14105 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
14106 if (!hasData) {
14107 return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14108 "div",
14109 {
14110 className: clsx_default("dataviews-no-results", {
14111 "is-refreshing": isDelayedLoading
14112 }),
14113 children: empty
14114 }
14115 );
14116 }
14117 const isInert = !isInfiniteScroll && !!isLoading;
14118 const wrapperClassName = clsx_default("dataviews-view-activity", className, {
14119 "is-refreshing": !isInfiniteScroll && isDelayedLoading
14120 });
14121 const groupedEntries = dataByGroup ? Array.from(dataByGroup.entries()) : [];
14122 if (hasData && groupField && dataByGroup) {
14123 return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14124 Stack,
14125 {
14126 direction: "column",
14127 gap: "sm",
14128 className: wrapperClassName,
14129 inert: isInert ? "true" : void 0,
14130 children: groupedEntries.map(
14131 ([groupName, groupData]) => /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14132 ActivityGroup,
14133 {
14134 groupName,
14135 groupData,
14136 groupField,
14137 showLabel: view.groupBy?.showLabel !== false,
14138 children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14139 ActivityItems,
14140 {
14141 ...props,
14142 data: groupData
14143 }
14144 )
14145 },
14146 groupName
14147 )
14148 )
14149 }
14150 );
14151 }
14152 return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_jsx_runtime62.Fragment, { children: [
14153 /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
14154 "div",
14155 {
14156 className: wrapperClassName,
14157 role: view.infiniteScrollEnabled ? "feed" : void 0,
14158 inert: isInert ? "true" : void 0,
14159 children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(ActivityItems, { ...props })
14160 }
14161 ),
14162 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_components11.Spinner, {}) })
14163 ] });
14164 }
14165
14166 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
14167 var import_components14 = __toESM(require_components(), 1);
14168 var import_i18n18 = __toESM(require_i18n(), 1);
14169 var import_compose6 = __toESM(require_compose(), 1);
14170 var import_element46 = __toESM(require_element(), 1);
14171
14172 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
14173 var import_components13 = __toESM(require_components(), 1);
14174 var import_data5 = __toESM(require_data(), 1);
14175 var import_element45 = __toESM(require_element(), 1);
14176 var import_i18n17 = __toESM(require_i18n(), 1);
14177
14178 // packages/dataviews/build-module/components/dataviews-pagination/index.mjs
14179 var import_components12 = __toESM(require_components(), 1);
14180 var import_element44 = __toESM(require_element(), 1);
14181 var import_i18n16 = __toESM(require_i18n(), 1);
14182 var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
14183 function hasPaginationControls(view, paginationInfo) {
14184 return !view.infiniteScrollEnabled && paginationInfo.totalItems > 0 && paginationInfo.totalPages > 1;
14185 }
14186 function DataViewsPagination() {
14187 const { view, onChangeView, paginationInfo } = (0, import_element44.useContext)(dataviews_context_default);
14188 if (!hasPaginationControls(view, paginationInfo)) {
14189 return null;
14190 }
14191 const { totalPages } = paginationInfo;
14192 const currentPage = view.page ?? 1;
14193 const pageSelectOptions = Array.from(Array(totalPages)).map(
14194 (_, i2) => {
14195 const page = i2 + 1;
14196 return {
14197 value: page.toString(),
14198 label: page.toString(),
14199 "aria-label": currentPage === page ? (0, import_i18n16.sprintf)(
14200 // translators: 1: current page number. 2: total number of pages.
14201 (0, import_i18n16.__)("Page %1$d of %2$d"),
14202 currentPage,
14203 totalPages
14204 ) : page.toString()
14205 };
14206 }
14207 );
14208 return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
14209 Stack,
14210 {
14211 direction: "row",
14212 className: "dataviews-pagination",
14213 justify: "end",
14214 align: "center",
14215 gap: "xl",
14216 children: [
14217 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14218 Stack,
14219 {
14220 direction: "row",
14221 justify: "flex-start",
14222 align: "center",
14223 gap: "xs",
14224 className: "dataviews-pagination__page-select",
14225 children: (0, import_element44.createInterpolateElement)(
14226 (0, import_i18n16.sprintf)(
14227 // translators: 1: Current page number, 2: Total number of pages.
14228 (0, import_i18n16._x)("<div>Page</div>%1$s<div>of %2$d</div>", "paging"),
14229 "<CurrentPage />",
14230 totalPages
14231 ),
14232 {
14233 div: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { "aria-hidden": true }),
14234 // @ts-expect-error — Tag injected via sprintf argument, not visible in format string.
14235 CurrentPage: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14236 import_components12.SelectControl,
14237 {
14238 "aria-label": (0, import_i18n16.__)("Current page"),
14239 value: currentPage.toString(),
14240 options: pageSelectOptions,
14241 onChange: (newValue) => {
14242 onChangeView({
14243 ...view,
14244 page: +newValue
14245 });
14246 },
14247 size: "small",
14248 variant: "minimal"
14249 }
14250 )
14251 }
14252 )
14253 }
14254 ),
14255 /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(Stack, { direction: "row", gap: "xs", align: "center", children: [
14256 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14257 import_components12.Button,
14258 {
14259 onClick: () => onChangeView({
14260 ...view,
14261 page: currentPage - 1
14262 }),
14263 disabled: currentPage === 1,
14264 accessibleWhenDisabled: true,
14265 label: (0, import_i18n16.__)("Previous page"),
14266 icon: (0, import_i18n16.isRTL)() ? next_default : previous_default,
14267 showTooltip: true,
14268 size: "compact",
14269 tooltipPosition: "top"
14270 }
14271 ),
14272 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
14273 import_components12.Button,
14274 {
14275 onClick: () => onChangeView({ ...view, page: currentPage + 1 }),
14276 disabled: currentPage >= totalPages,
14277 accessibleWhenDisabled: true,
14278 label: (0, import_i18n16.__)("Next page"),
14279 icon: (0, import_i18n16.isRTL)() ? previous_default : next_default,
14280 showTooltip: true,
14281 size: "compact",
14282 tooltipPosition: "top"
14283 }
14284 )
14285 ] })
14286 ]
14287 }
14288 );
14289 }
14290 var dataviews_pagination_default = (0, import_element44.memo)(DataViewsPagination);
14291
14292 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
14293 var import_jsx_runtime64 = __toESM(require_jsx_runtime(), 1);
14294 function useIsMultiselectPicker(actions) {
14295 return (0, import_element45.useMemo)(() => {
14296 return !!actions?.length && actions?.every((action) => action.supportsBulk);
14297 }, [actions]);
14298 }
14299
14300 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
14301 var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
14302 var { Badge: WCBadge2 } = unlock2(import_components14.privateApis);
14303 function GridItem3({
14304 view,
14305 selection,
14306 onChangeSelection,
14307 selectionProps,
14308 getItemId,
14309 item,
14310 mediaField,
14311 titleField,
14312 descriptionField,
14313 regularFields,
14314 badgeFields,
14315 config,
14316 posinset,
14317 setsize
14318 }) {
14319 const { showTitle = true, showMedia = true, showDescription = true } = view;
14320 const id = getItemId(item);
14321 const elementRef = (0, import_element46.useRef)(null);
14322 const isSelected2 = selection.includes(id);
14323 useIntersectionObserver(elementRef, posinset);
14324 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14325 mediaField.render,
14326 {
14327 item,
14328 field: mediaField,
14329 config
14330 }
14331 ) : null;
14332 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(titleField.render, { item, field: titleField }) : null;
14333 return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
14334 import_components14.Composite.Item,
14335 {
14336 ref: elementRef,
14337 "aria-label": titleField ? titleField.getValue({ item }) || (0, import_i18n18.__)("(no title)") : void 0,
14338 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Stack, { direction: "column", children, ...props }),
14339 role: "option",
14340 "aria-posinset": posinset,
14341 "aria-setsize": setsize,
14342 className: clsx_default("dataviews-view-picker-grid__card", {
14343 "is-selected": isSelected2
14344 }),
14345 "aria-selected": isSelected2,
14346 ...selectionProps,
14347 children: [
14348 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "dataviews-view-picker-grid__media", children: renderedMediaField }),
14349 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14350 DataViewsSelectionCheckbox,
14351 {
14352 item,
14353 selection,
14354 onChangeSelection,
14355 getItemId,
14356 titleField,
14357 disabled: false,
14358 "aria-hidden": true,
14359 tabIndex: -1
14360 }
14361 ),
14362 showTitle && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14363 Stack,
14364 {
14365 direction: "row",
14366 justify: "space-between",
14367 className: "dataviews-view-picker-grid__title-actions",
14368 children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "dataviews-view-picker-grid__title-field dataviews-title-field", children: renderedTitleField })
14369 }
14370 ),
14371 /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(Stack, { direction: "column", gap: "xs", children: [
14372 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14373 descriptionField.render,
14374 {
14375 item,
14376 field: descriptionField
14377 }
14378 ),
14379 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14380 Stack,
14381 {
14382 direction: "row",
14383 className: "dataviews-view-picker-grid__badge-fields",
14384 gap: "sm",
14385 wrap: "wrap",
14386 align: "top",
14387 justify: "flex-start",
14388 children: badgeFields.map((field) => {
14389 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14390 WCBadge2,
14391 {
14392 className: "dataviews-view-picker-grid__field-value",
14393 children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14394 field.render,
14395 {
14396 item,
14397 field
14398 }
14399 )
14400 },
14401 field.id
14402 );
14403 })
14404 }
14405 ),
14406 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14407 Stack,
14408 {
14409 direction: "column",
14410 className: "dataviews-view-picker-grid__fields",
14411 gap: "xs",
14412 children: regularFields.map((field) => {
14413 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14414 import_components14.Flex,
14415 {
14416 className: "dataviews-view-picker-grid__field",
14417 gap: 1,
14418 justify: "flex-start",
14419 expanded: true,
14420 style: { height: "auto" },
14421 direction: "row",
14422 children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_jsx_runtime65.Fragment, { children: [
14423 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_components14.FlexItem, { className: "dataviews-view-picker-grid__field-name", children: field.header }),
14424 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14425 import_components14.FlexItem,
14426 {
14427 className: "dataviews-view-picker-grid__field-value",
14428 style: { maxHeight: "none" },
14429 children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14430 field.render,
14431 {
14432 item,
14433 field
14434 }
14435 )
14436 }
14437 )
14438 ] })
14439 },
14440 field.id
14441 );
14442 })
14443 }
14444 )
14445 ] })
14446 ]
14447 },
14448 id
14449 );
14450 }
14451 function GridGroup({
14452 groupName,
14453 groupField,
14454 showLabel = true,
14455 children
14456 }) {
14457 const headerId = (0, import_compose6.useInstanceId)(
14458 GridGroup,
14459 "dataviews-view-picker-grid-group__header"
14460 );
14461 return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
14462 Stack,
14463 {
14464 direction: "column",
14465 gap: "sm",
14466 role: "group",
14467 "aria-labelledby": headerId,
14468 children: [
14469 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14470 "h3",
14471 {
14472 className: "dataviews-view-picker-grid-group__header",
14473 id: headerId,
14474 children: showLabel ? (0, import_i18n18.sprintf)(
14475 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
14476 (0, import_i18n18.__)("%1$s: %2$s"),
14477 groupField.label,
14478 groupName
14479 ) : groupName
14480 }
14481 ),
14482 children
14483 ]
14484 },
14485 groupName
14486 );
14487 }
14488 function ViewPickerGrid({
14489 actions,
14490 data,
14491 fields,
14492 getItemId,
14493 isLoading,
14494 onChangeSelection,
14495 selection,
14496 view,
14497 className,
14498 empty
14499 }) {
14500 const { resizeObserverRef, paginationInfo, itemListLabel } = (0, import_element46.useContext)(dataviews_context_default);
14501 const titleField = fields.find(
14502 (field) => field.id === view?.titleField
14503 );
14504 const mediaField = fields.find(
14505 (field) => field.id === view?.mediaField
14506 );
14507 const descriptionField = fields.find(
14508 (field) => field.id === view?.descriptionField
14509 );
14510 const otherFields = view.fields ?? [];
14511 const { regularFields, badgeFields } = otherFields.reduce(
14512 (accumulator, fieldId) => {
14513 const field = fields.find((f2) => f2.id === fieldId);
14514 if (!field) {
14515 return accumulator;
14516 }
14517 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
14518 accumulator[key].push(field);
14519 return accumulator;
14520 },
14521 { regularFields: [], badgeFields: [] }
14522 );
14523 const hasData = !!data?.length;
14524 const usedPreviewSize = view.layout?.previewSize;
14525 const isMultiselect = useIsMultiselectPicker(actions);
14526 const size4 = "900px";
14527 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
14528 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
14529 const isInfiniteScroll = (view.infiniteScrollEnabled && !dataByGroup) ?? false;
14530 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
14531 const { getSelectionProps } = useSelectionProps({
14532 data: orderedData,
14533 getItemId,
14534 isItemSelectable: () => true,
14535 selection,
14536 onChangeSelection,
14537 selectionMode: isMultiselect ? "multi" : "single-clearable",
14538 shouldSelectOnClick: true
14539 });
14540 const currentPage = view?.page ?? 1;
14541 const perPage = view?.perPage ?? 0;
14542 const setSize = isInfiniteScroll ? paginationInfo?.totalItems : void 0;
14543 const gridColumns = useGridColumns();
14544 const placeholdersNeeded = usePlaceholdersNeeded(
14545 data,
14546 isInfiniteScroll,
14547 gridColumns
14548 );
14549 return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_jsx_runtime65.Fragment, {
14550 // Render multiple groups.
14551 children: [
14552 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14553 import_components14.Composite,
14554 {
14555 virtualFocus: true,
14556 orientation: "horizontal",
14557 role: "listbox",
14558 "aria-multiselectable": isMultiselect,
14559 className: clsx_default(
14560 "dataviews-view-picker-grid",
14561 className,
14562 {
14563 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
14564 view.layout.density
14565 )
14566 }
14567 ),
14568 "aria-label": itemListLabel,
14569 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14570 Stack,
14571 {
14572 direction: "column",
14573 gap: "lg",
14574 children,
14575 ...props
14576 }
14577 ),
14578 children: Array.from(dataByGroup.entries()).map(
14579 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14580 GridGroup,
14581 {
14582 groupName,
14583 groupField,
14584 showLabel: view.groupBy?.showLabel !== false,
14585 children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14586 GridItems,
14587 {
14588 previewSize: usedPreviewSize,
14589 style: {
14590 gridTemplateColumns: usedPreviewSize && `repeat(auto-fill, minmax(${usedPreviewSize}px, 1fr))`
14591 },
14592 "aria-busy": isLoading,
14593 ref: resizeObserverRef,
14594 children: groupItems.map((item) => {
14595 const posInSet = item.position ?? (currentPage - 1) * perPage + data.indexOf(item) + 1;
14596 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14597 GridItem3,
14598 {
14599 view,
14600 selection,
14601 onChangeSelection,
14602 selectionProps: getSelectionProps(
14603 getItemId(item)
14604 ),
14605 getItemId,
14606 item,
14607 mediaField,
14608 titleField,
14609 descriptionField,
14610 regularFields,
14611 badgeFields,
14612 config: {
14613 sizes: size4
14614 },
14615 posinset: posInSet,
14616 setsize: setSize
14617 },
14618 getItemId(item)
14619 );
14620 })
14621 }
14622 )
14623 },
14624 groupName
14625 )
14626 )
14627 }
14628 ),
14629 // Render a single grid with all data.
14630 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
14631 import_components14.Composite,
14632 {
14633 render: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14634 GridItems,
14635 {
14636 className: clsx_default(
14637 "dataviews-view-picker-grid",
14638 className,
14639 {
14640 [`has-${view.layout?.density}-density`]: view.layout?.density && [
14641 "compact",
14642 "comfortable"
14643 ].includes(view.layout.density)
14644 }
14645 ),
14646 previewSize: usedPreviewSize,
14647 "aria-busy": isLoading,
14648 ref: resizeObserverRef
14649 }
14650 ),
14651 virtualFocus: true,
14652 orientation: "horizontal",
14653 role: "listbox",
14654 "aria-multiselectable": isMultiselect,
14655 "aria-label": itemListLabel,
14656 children: [
14657 Array.from({ length: placeholdersNeeded }).map(
14658 (_, index2) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14659 import_components14.Composite.Item,
14660 {
14661 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14662 Stack,
14663 {
14664 direction: "column",
14665 children,
14666 ...props
14667 }
14668 ),
14669 role: "option",
14670 "aria-hidden": true,
14671 tabIndex: -1,
14672 className: "dataviews-view-picker-grid__card dataviews-view-picker-grid__placeholder"
14673 },
14674 `placeholder-${index2}`
14675 )
14676 ),
14677 data.map((item) => {
14678 const posinset = item.position;
14679 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14680 GridItem3,
14681 {
14682 view,
14683 selection,
14684 onChangeSelection,
14685 selectionProps: getSelectionProps(
14686 getItemId(item)
14687 ),
14688 getItemId,
14689 item,
14690 mediaField,
14691 titleField,
14692 descriptionField,
14693 regularFields,
14694 badgeFields,
14695 config: {
14696 sizes: size4
14697 },
14698 posinset,
14699 setsize: setSize
14700 },
14701 getItemId(item)
14702 );
14703 })
14704 ]
14705 }
14706 ),
14707 // Render empty state.
14708 !hasData && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
14709 "div",
14710 {
14711 className: clsx_default({
14712 "dataviews-loading": isLoading,
14713 "dataviews-no-results": !isLoading
14714 }),
14715 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_components14.Spinner, {}) }) : empty
14716 }
14717 ),
14718 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_components14.Spinner, {}) })
14719 ]
14720 });
14721 }
14722 var picker_grid_default = ViewPickerGrid;
14723
14724 // packages/dataviews/build-module/components/dataviews-layouts/picker-table/index.mjs
14725 var import_i18n19 = __toESM(require_i18n(), 1);
14726 var import_components15 = __toESM(require_components(), 1);
14727 var import_element47 = __toESM(require_element(), 1);
14728 var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
14729 function TableColumnField2({
14730 item,
14731 fields,
14732 column,
14733 align
14734 }) {
14735 const field = fields.find((f2) => f2.id === column);
14736 if (!field) {
14737 return null;
14738 }
14739 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
14740 "dataviews-view-table__cell-align-end": align === "end",
14741 "dataviews-view-table__cell-align-center": align === "center"
14742 });
14743 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(field.render, { item, field }) });
14744 }
14745 function TableRow2({
14746 item,
14747 fields,
14748 id,
14749 view,
14750 titleField,
14751 mediaField,
14752 descriptionField,
14753 selection,
14754 getItemId,
14755 onChangeSelection,
14756 selectionProps,
14757 posinset
14758 }) {
14759 const { paginationInfo } = (0, import_element47.useContext)(dataviews_context_default);
14760 const isSelected2 = selection.includes(id);
14761 const [isHovered, setIsHovered] = (0, import_element47.useState)(false);
14762 const elementRef = (0, import_element47.useRef)(null);
14763 useIntersectionObserver(elementRef, posinset);
14764 const {
14765 showTitle = true,
14766 showMedia = true,
14767 showDescription = true,
14768 infiniteScrollEnabled
14769 } = view;
14770 const handleMouseEnter = () => {
14771 setIsHovered(true);
14772 };
14773 const handleMouseLeave = () => {
14774 setIsHovered(false);
14775 };
14776 const columns = view.fields ?? [];
14777 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
14778 return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
14779 import_components15.Composite.Item,
14780 {
14781 ref: elementRef,
14782 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14783 "tr",
14784 {
14785 className: clsx_default("dataviews-view-table__row", {
14786 "is-selected": isSelected2,
14787 "is-hovered": isHovered
14788 }),
14789 onMouseEnter: handleMouseEnter,
14790 onMouseLeave: handleMouseLeave,
14791 children,
14792 ...props
14793 }
14794 ),
14795 "aria-selected": isSelected2,
14796 "aria-setsize": paginationInfo.totalItems || void 0,
14797 "aria-posinset": posinset,
14798 role: infiniteScrollEnabled ? "article" : "option",
14799 onClickCapture: selectionProps.onClickCapture,
14800 onClick: selectionProps.onClick,
14801 onMouseDown: (event) => {
14802 if (event.button !== 0) {
14803 return;
14804 }
14805 event.currentTarget.parentElement?.focus({
14806 preventScroll: true
14807 });
14808 selectionProps.onMouseDown(event);
14809 },
14810 children: [
14811 /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14812 "td",
14813 {
14814 className: "dataviews-view-table__checkbox-column",
14815 role: "presentation",
14816 children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14817 DataViewsSelectionCheckbox,
14818 {
14819 item,
14820 selection,
14821 onChangeSelection,
14822 getItemId,
14823 titleField,
14824 disabled: false,
14825 "aria-hidden": true,
14826 tabIndex: -1
14827 }
14828 ) })
14829 }
14830 ),
14831 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14832 "td",
14833 {
14834 role: "presentation",
14835 children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14836 column_primary_default,
14837 {
14838 item,
14839 titleField: showTitle ? titleField : void 0,
14840 mediaField: showMedia ? mediaField : void 0,
14841 descriptionField: showDescription ? descriptionField : void 0,
14842 isItemClickable: () => false
14843 }
14844 )
14845 }
14846 ),
14847 columns.map((column) => {
14848 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
14849 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14850 "td",
14851 {
14852 style: {
14853 width,
14854 maxWidth,
14855 minWidth
14856 },
14857 role: "presentation",
14858 children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14859 TableColumnField2,
14860 {
14861 fields,
14862 item,
14863 column,
14864 align
14865 }
14866 )
14867 },
14868 column
14869 );
14870 })
14871 ]
14872 },
14873 id
14874 );
14875 }
14876 function ViewPickerTable({
14877 actions,
14878 data,
14879 fields,
14880 getItemId,
14881 isLoading = false,
14882 onChangeView,
14883 onChangeSelection,
14884 selection,
14885 setOpenedFilter,
14886 view,
14887 className,
14888 empty
14889 }) {
14890 const headerMenuRefs = (0, import_element47.useRef)(/* @__PURE__ */ new Map());
14891 const headerMenuToFocusRef = (0, import_element47.useRef)(void 0);
14892 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element47.useState)();
14893 const isMultiselect = useIsMultiselectPicker(actions) ?? false;
14894 (0, import_element47.useEffect)(() => {
14895 if (headerMenuToFocusRef.current) {
14896 headerMenuToFocusRef.current.focus();
14897 headerMenuToFocusRef.current = void 0;
14898 }
14899 });
14900 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
14901 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
14902 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
14903 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
14904 const { getSelectionProps } = useSelectionProps({
14905 data: orderedData,
14906 getItemId,
14907 isItemSelectable: () => true,
14908 selection,
14909 onChangeSelection,
14910 selectionMode: isMultiselect ? "multi" : "single-clearable",
14911 shouldSelectOnClick: true
14912 });
14913 const tableNoticeId = (0, import_element47.useId)();
14914 if (nextHeaderMenuToFocus) {
14915 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
14916 setNextHeaderMenuToFocus(void 0);
14917 return;
14918 }
14919 const onHide = (field) => {
14920 const hidden = headerMenuRefs.current.get(field.id);
14921 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
14922 setNextHeaderMenuToFocus(fallback?.node);
14923 };
14924 const hasData = !!data?.length;
14925 const titleField = fields.find((field) => field.id === view.titleField);
14926 const mediaField = fields.find((field) => field.id === view.mediaField);
14927 const descriptionField = fields.find(
14928 (field) => field.id === view.descriptionField
14929 );
14930 const { showTitle = true, showMedia = true, showDescription = true } = view;
14931 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
14932 const columns = view.fields ?? [];
14933 const headerMenuRef = (column, index2) => (node) => {
14934 if (node) {
14935 headerMenuRefs.current.set(column, {
14936 node,
14937 fallback: columns[index2 > 0 ? index2 - 1 : 1]
14938 });
14939 } else {
14940 headerMenuRefs.current.delete(column);
14941 }
14942 };
14943 return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_jsx_runtime66.Fragment, { children: [
14944 /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
14945 "table",
14946 {
14947 className: clsx_default(
14948 "dataviews-view-table",
14949 "dataviews-view-picker-table",
14950 className,
14951 {
14952 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
14953 view.layout.density
14954 )
14955 }
14956 ),
14957 "aria-busy": isLoading,
14958 "aria-describedby": tableNoticeId,
14959 role: isInfiniteScroll ? "feed" : "listbox",
14960 children: [
14961 /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("thead", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
14962 "tr",
14963 {
14964 className: "dataviews-view-table__row",
14965 role: "presentation",
14966 children: [
14967 /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("th", { className: "dataviews-view-table__checkbox-column", children: isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14968 BulkSelectionCheckbox,
14969 {
14970 selection,
14971 onChangeSelection,
14972 data,
14973 actions,
14974 getItemId,
14975 disableSelectAll: isInfiniteScroll
14976 }
14977 ) }),
14978 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("th", { children: titleField && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14979 column_header_menu_default,
14980 {
14981 ref: headerMenuRef(
14982 titleField.id,
14983 0
14984 ),
14985 fieldId: titleField.id,
14986 view,
14987 fields,
14988 onChangeView,
14989 onHide,
14990 setOpenedFilter,
14991 canMove: false
14992 }
14993 ) }),
14994 columns.map((column, index2) => {
14995 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
14996 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
14997 "th",
14998 {
14999 style: {
15000 width,
15001 maxWidth,
15002 minWidth,
15003 textAlign: align
15004 },
15005 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
15006 scope: "col",
15007 children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15008 column_header_menu_default,
15009 {
15010 ref: headerMenuRef(column, index2),
15011 fieldId: column,
15012 view,
15013 fields,
15014 onChangeView,
15015 onHide,
15016 setOpenedFilter,
15017 canMove: view.layout?.enableMoving ?? true
15018 }
15019 )
15020 },
15021 column
15022 );
15023 })
15024 ]
15025 }
15026 ) }),
15027 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
15028 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
15029 import_components15.Composite,
15030 {
15031 virtualFocus: true,
15032 orientation: "vertical",
15033 render: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("tbody", { role: "group" }),
15034 children: [
15035 /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15036 "tr",
15037 {
15038 className: "dataviews-view-table__group-header-row",
15039 role: "presentation",
15040 children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15041 "td",
15042 {
15043 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + 1,
15044 className: "dataviews-view-table__group-header-cell",
15045 role: "presentation",
15046 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n19.sprintf)(
15047 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
15048 (0, import_i18n19.__)("%1$s: %2$s"),
15049 groupField.label,
15050 groupName
15051 )
15052 }
15053 )
15054 }
15055 ),
15056 groupItems.map((item, index2) => {
15057 const id = getItemId(item) || index2.toString();
15058 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15059 TableRow2,
15060 {
15061 item,
15062 fields,
15063 id,
15064 view,
15065 titleField,
15066 mediaField,
15067 descriptionField,
15068 selection,
15069 getItemId,
15070 onChangeSelection,
15071 selectionProps: getSelectionProps(
15072 id
15073 )
15074 },
15075 getItemId(item)
15076 );
15077 })
15078 ]
15079 },
15080 `group-${groupName}`
15081 )
15082 ) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15083 import_components15.Composite,
15084 {
15085 render: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("tbody", { role: "presentation" }),
15086 virtualFocus: true,
15087 orientation: "vertical",
15088 children: hasData && data.map((item, index2) => {
15089 const itemId = getItemId(item);
15090 const id = itemId || index2.toString();
15091 const posinset = item.position;
15092 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
15093 TableRow2,
15094 {
15095 item,
15096 fields,
15097 id,
15098 view,
15099 titleField,
15100 mediaField,
15101 descriptionField,
15102 selection,
15103 getItemId,
15104 onChangeSelection,
15105 selectionProps: getSelectionProps(
15106 id
15107 ),
15108 posinset
15109 },
15110 itemId
15111 );
15112 })
15113 }
15114 )
15115 ]
15116 }
15117 ),
15118 /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
15119 "div",
15120 {
15121 className: clsx_default({
15122 "dataviews-loading": isLoading,
15123 "dataviews-no-results": !hasData && !isLoading
15124 }),
15125 id: tableNoticeId,
15126 children: [
15127 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_components15.Spinner, {}) }) : empty),
15128 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_components15.Spinner, {}) })
15129 ]
15130 }
15131 )
15132 ] });
15133 }
15134 var picker_table_default = ViewPickerTable;
15135
15136 // packages/dataviews/build-module/components/dataviews-layouts/picker-activity/index.mjs
15137 var import_components16 = __toESM(require_components(), 1);
15138 var import_element48 = __toESM(require_element(), 1);
15139 var import_compose7 = __toESM(require_compose(), 1);
15140 var import_i18n20 = __toESM(require_i18n(), 1);
15141 var import_jsx_runtime67 = __toESM(require_jsx_runtime(), 1);
15142 function isDefined4(item) {
15143 return !!item;
15144 }
15145 function PickerActivityItem({
15146 view,
15147 selection,
15148 selectionProps,
15149 getItemId,
15150 item,
15151 titleField,
15152 mediaField,
15153 descriptionField,
15154 otherFields,
15155 posinset,
15156 setsize
15157 }) {
15158 const elementRef = (0, import_element48.useRef)(null);
15159 useIntersectionObserver(elementRef, posinset);
15160 const { showTitle = true, showMedia = true, showDescription = true } = view;
15161 const id = getItemId(item);
15162 const isSelected2 = selection.includes(id);
15163 const density = view.layout?.density ?? "balanced";
15164 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15165 mediaField.render,
15166 {
15167 item,
15168 field: mediaField,
15169 config: {
15170 sizes: density === "comfortable" ? "32px" : "24px"
15171 }
15172 }
15173 ) : null;
15174 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "dataviews-view-picker-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15175 "span",
15176 {
15177 className: "dataviews-view-picker-activity__item-bullet",
15178 "aria-hidden": "true"
15179 }
15180 ) });
15181 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(titleField.render, { item, field: titleField }) : null;
15182 const renderedDescriptionField = showDescription && descriptionField?.render ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(descriptionField.render, { item, field: descriptionField }) : null;
15183 const verticalGap = (0, import_element48.useMemo)(() => {
15184 switch (density) {
15185 case "comfortable":
15186 return "md";
15187 default:
15188 return "sm";
15189 }
15190 }, [density]);
15191 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15192 import_components16.Composite.Item,
15193 {
15194 ref: elementRef,
15195 role: "option",
15196 "aria-label": titleField ? titleField.getValue({ item }) || void 0 : void 0,
15197 "aria-posinset": posinset,
15198 "aria-setsize": setsize,
15199 "aria-selected": isSelected2,
15200 className: clsx_default(
15201 "dataviews-view-picker-activity__item",
15202 density === "compact" && "is-compact",
15203 density === "balanced" && "is-balanced",
15204 density === "comfortable" && "is-comfortable",
15205 isSelected2 && "is-selected"
15206 ),
15207 ...selectionProps,
15208 render: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", {}),
15209 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Stack, { direction: "row", gap: "lg", justify: "start", align: "flex-start", children: [
15210 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15211 Stack,
15212 {
15213 direction: "column",
15214 gap: "xs",
15215 align: "center",
15216 className: "dataviews-view-picker-activity__item-type",
15217 children: renderedMediaField
15218 }
15219 ),
15220 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
15221 Stack,
15222 {
15223 direction: "column",
15224 gap: verticalGap,
15225 align: "flex-start",
15226 className: "dataviews-view-picker-activity__item-content",
15227 children: [
15228 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "dataviews-view-picker-activity__item-title", children: renderedTitleField }),
15229 renderedDescriptionField && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "dataviews-view-picker-activity__item-description", children: renderedDescriptionField }),
15230 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "dataviews-view-picker-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
15231 "div",
15232 {
15233 className: "dataviews-view-picker-activity__item-field",
15234 children: [
15235 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15236 VisuallyHidden,
15237 {
15238 render: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("span", {}),
15239 className: "dataviews-view-picker-activity__item-field-label",
15240 children: field.label
15241 }
15242 ),
15243 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("span", { className: "dataviews-view-picker-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15244 field.render,
15245 {
15246 item,
15247 field
15248 }
15249 ) })
15250 ]
15251 },
15252 field.id
15253 )) })
15254 ]
15255 }
15256 )
15257 ] })
15258 }
15259 );
15260 }
15261 function PickerActivityGroup({
15262 groupName,
15263 groupField,
15264 showLabel = true,
15265 children
15266 }) {
15267 const headerId = (0, import_compose7.useInstanceId)(
15268 PickerActivityGroup,
15269 "dataviews-view-picker-activity-group__header"
15270 );
15271 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
15272 Stack,
15273 {
15274 direction: "column",
15275 role: "group",
15276 "aria-labelledby": headerId,
15277 className: "dataviews-view-picker-activity-group",
15278 children: [
15279 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15280 "h3",
15281 {
15282 className: "dataviews-view-picker-activity-group__header",
15283 id: headerId,
15284 children: showLabel ? (0, import_i18n20.sprintf)(
15285 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
15286 (0, import_i18n20.__)("%1$s: %2$s"),
15287 groupField.label,
15288 groupName
15289 ) : groupName
15290 }
15291 ),
15292 children
15293 ]
15294 }
15295 );
15296 }
15297 function ViewPickerActivity({
15298 data,
15299 fields,
15300 getItemId,
15301 isLoading,
15302 onChangeSelection,
15303 selection,
15304 view,
15305 actions,
15306 className,
15307 empty
15308 }) {
15309 const { itemListLabel, paginationInfo } = (0, import_element48.useContext)(dataviews_context_default);
15310 const isMultiselect = useIsMultiselectPicker(actions);
15311 const titleField = fields.find(
15312 (field) => field.id === view?.titleField
15313 );
15314 const mediaField = fields.find(
15315 (field) => field.id === view?.mediaField
15316 );
15317 const descriptionField = fields.find(
15318 (field) => field.id === view?.descriptionField
15319 );
15320 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined4);
15321 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
15322 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
15323 const isInfiniteScroll = (view.infiniteScrollEnabled && !dataByGroup) ?? false;
15324 const setsize = isInfiniteScroll ? paginationInfo?.totalItems : void 0;
15325 const hasData = !!data?.length;
15326 const isGrouped = !!(groupField && dataByGroup);
15327 const orderedData = dataByGroup ? Array.from(dataByGroup.values()).flat() : data;
15328 const { getSelectionProps } = useSelectionProps({
15329 data: orderedData,
15330 getItemId,
15331 isItemSelectable: () => true,
15332 selection,
15333 onChangeSelection,
15334 selectionMode: isMultiselect ? "multi" : "single-clearable",
15335 shouldSelectOnClick: true
15336 });
15337 const renderItem = (item) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15338 PickerActivityItem,
15339 {
15340 view,
15341 selection,
15342 selectionProps: getSelectionProps(getItemId(item)),
15343 getItemId,
15344 item,
15345 titleField,
15346 mediaField,
15347 descriptionField,
15348 otherFields,
15349 posinset: item.position,
15350 setsize
15351 },
15352 getItemId(item)
15353 );
15354 if (!hasData) {
15355 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15356 "div",
15357 {
15358 className: clsx_default({
15359 "dataviews-loading": isLoading,
15360 "dataviews-no-results": !isLoading
15361 }),
15362 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_components16.Spinner, {}) }) : empty
15363 }
15364 );
15365 }
15366 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
15367 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15368 import_components16.Composite,
15369 {
15370 virtualFocus: true,
15371 orientation: "vertical",
15372 role: "listbox",
15373 "aria-multiselectable": isMultiselect,
15374 "aria-label": itemListLabel,
15375 "aria-busy": isLoading,
15376 render: isGrouped ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Stack, { direction: "column", gap: "sm" }) : void 0,
15377 className: clsx_default(
15378 "dataviews-view-picker-activity",
15379 className
15380 ),
15381 children: isGrouped && dataByGroup ? Array.from(dataByGroup.entries()).map(
15382 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
15383 PickerActivityGroup,
15384 {
15385 groupName,
15386 groupField,
15387 showLabel: view.groupBy?.showLabel !== false,
15388 children: groupItems.map(renderItem)
15389 },
15390 groupName
15391 )
15392 ) : data.map(renderItem)
15393 }
15394 ),
15395 isLoading && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_components16.Spinner, {}) })
15396 ] });
15397 }
15398
15399 // packages/dataviews/build-module/components/dataviews-layouts/utils/density-picker.mjs
15400 var import_components17 = __toESM(require_components(), 1);
15401 var import_i18n21 = __toESM(require_i18n(), 1);
15402 var import_element49 = __toESM(require_element(), 1);
15403 var import_jsx_runtime68 = __toESM(require_jsx_runtime(), 1);
15404 function DensityPicker() {
15405 const context = (0, import_element49.useContext)(dataviews_context_default);
15406 const view = context.view;
15407 return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
15408 import_components17.__experimentalToggleGroupControl,
15409 {
15410 label: (0, import_i18n21.__)("Density"),
15411 value: view.layout?.density || "balanced",
15412 onChange: (value) => {
15413 context.onChangeView({
15414 ...view,
15415 layout: {
15416 ...view.layout,
15417 density: value
15418 }
15419 });
15420 },
15421 isBlock: true,
15422 children: [
15423 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15424 import_components17.__experimentalToggleGroupControlOption,
15425 {
15426 value: "comfortable",
15427 label: (0, import_i18n21._x)(
15428 "Comfortable",
15429 "Density option for DataView layout"
15430 )
15431 },
15432 "comfortable"
15433 ),
15434 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15435 import_components17.__experimentalToggleGroupControlOption,
15436 {
15437 value: "balanced",
15438 label: (0, import_i18n21._x)("Balanced", "Density option for DataView layout")
15439 },
15440 "balanced"
15441 ),
15442 /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
15443 import_components17.__experimentalToggleGroupControlOption,
15444 {
15445 value: "compact",
15446 label: (0, import_i18n21._x)("Compact", "Density option for DataView layout")
15447 },
15448 "compact"
15449 )
15450 ]
15451 }
15452 );
15453 }
15454
15455 // packages/dataviews/build-module/components/dataviews-layouts/utils/preview-size-picker.mjs
15456 var import_components18 = __toESM(require_components(), 1);
15457 var import_i18n22 = __toESM(require_i18n(), 1);
15458 var import_element50 = __toESM(require_element(), 1);
15459 var import_jsx_runtime69 = __toESM(require_jsx_runtime(), 1);
15460 var imageSizes2 = [
15461 {
15462 value: 120,
15463 breakpoint: 1
15464 },
15465 {
15466 value: 170,
15467 breakpoint: 1
15468 },
15469 {
15470 value: 230,
15471 breakpoint: 1
15472 },
15473 {
15474 value: 290,
15475 breakpoint: 1112
15476 // at minimum image width, 4 images display at this container size
15477 },
15478 {
15479 value: 350,
15480 breakpoint: 1636
15481 // at minimum image width, 6 images display at this container size
15482 },
15483 {
15484 value: 430,
15485 breakpoint: 588
15486 // at minimum image width, 2 images display at this container size
15487 }
15488 ];
15489 function PreviewSizePicker() {
15490 const context = (0, import_element50.useContext)(dataviews_context_default);
15491 const view = context.view;
15492 const breakValues = imageSizes2.filter((size4) => {
15493 return context.containerWidth >= size4.breakpoint;
15494 });
15495 const layoutPreviewSize = view.layout?.previewSize ?? 230;
15496 const previewSizeToUse = breakValues.map((size4, index2) => ({ ...size4, index: index2 })).filter((size4) => size4.value <= layoutPreviewSize).sort((a2, b2) => b2.value - a2.value)[0]?.index ?? 0;
15497 const marks = breakValues.map((size4, index2) => {
15498 return {
15499 value: index2
15500 };
15501 });
15502 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
15503 import_components18.RangeControl,
15504 {
15505 showTooltip: false,
15506 label: (0, import_i18n22.__)("Preview size"),
15507 value: previewSizeToUse,
15508 min: 0,
15509 max: breakValues.length - 1,
15510 withInputField: false,
15511 onChange: (value = 0) => {
15512 context.onChangeView({
15513 ...view,
15514 layout: {
15515 ...view.layout,
15516 previewSize: breakValues[value].value
15517 }
15518 });
15519 },
15520 step: 1,
15521 marks
15522 }
15523 );
15524 }
15525
15526 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-config-options.mjs
15527 var import_jsx_runtime70 = __toESM(require_jsx_runtime(), 1);
15528 function GridConfigOptions() {
15529 return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(import_jsx_runtime70.Fragment, { children: [
15530 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(DensityPicker, {}),
15531 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(PreviewSizePicker, {})
15532 ] });
15533 }
15534
15535 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
15536 var VIEW_LAYOUTS = [
15537 {
15538 type: LAYOUT_TABLE,
15539 label: (0, import_i18n23.__)("Table"),
15540 component: table_default,
15541 icon: block_table_default,
15542 viewConfigOptions: DensityPicker
15543 },
15544 {
15545 type: LAYOUT_GRID,
15546 label: (0, import_i18n23.__)("Grid"),
15547 component: grid_default,
15548 icon: category_default,
15549 viewConfigOptions: GridConfigOptions
15550 },
15551 {
15552 type: LAYOUT_LIST,
15553 label: (0, import_i18n23.__)("List"),
15554 component: ViewList,
15555 icon: (0, import_i18n23.isRTL)() ? format_list_bullets_rtl_default : format_list_bullets_default,
15556 viewConfigOptions: DensityPicker
15557 },
15558 {
15559 type: LAYOUT_ACTIVITY,
15560 label: (0, import_i18n23.__)("Activity"),
15561 component: ViewActivity,
15562 icon: scheduled_default,
15563 viewConfigOptions: DensityPicker
15564 },
15565 {
15566 type: LAYOUT_PICKER_GRID,
15567 label: (0, import_i18n23.__)("Grid"),
15568 component: picker_grid_default,
15569 icon: category_default,
15570 viewConfigOptions: GridConfigOptions,
15571 isPicker: true
15572 },
15573 {
15574 type: LAYOUT_PICKER_TABLE,
15575 label: (0, import_i18n23.__)("Table"),
15576 component: picker_table_default,
15577 icon: block_table_default,
15578 viewConfigOptions: DensityPicker,
15579 isPicker: true
15580 },
15581 {
15582 type: LAYOUT_PICKER_ACTIVITY,
15583 label: (0, import_i18n23.__)("Activity"),
15584 component: ViewPickerActivity,
15585 icon: scheduled_default,
15586 viewConfigOptions: DensityPicker,
15587 isPicker: true
15588 }
15589 ];
15590
15591 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
15592 var import_element58 = __toESM(require_element(), 1);
15593
15594 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
15595 var import_components21 = __toESM(require_components(), 1);
15596 var import_i18n26 = __toESM(require_i18n(), 1);
15597 var import_element55 = __toESM(require_element(), 1);
15598
15599 // node_modules/@ariakit/react-components/dist/focusable/focusable-context.js
15600 var import_react11 = __toESM(require_react(), 1);
15601 var FocusableContext = (0, import_react11.createContext)(true);
15602
15603 // node_modules/@ariakit/utils/dist/index.js
15604 function toArray(arg) {
15605 if (Array.isArray(arg)) return arg;
15606 return typeof arg !== "undefined" ? [arg] : [];
15607 }
15608 function flatten2DArray(array) {
15609 const flattened = [];
15610 for (const row of array) flattened.push(...row);
15611 return flattened;
15612 }
15613 function reverseArray(array) {
15614 return array.slice().reverse();
15615 }
15616 function noop4(..._) {
15617 }
15618 function hasOwnProperty(object, prop) {
15619 if (typeof Object.hasOwn === "function") return Object.hasOwn(object, prop);
15620 return Object.prototype.hasOwnProperty.call(object, prop);
15621 }
15622 function chain(...fns) {
15623 return (...args) => {
15624 for (const fn of fns) if (typeof fn === "function") fn(...args);
15625 };
15626 }
15627 function normalizeString(str) {
15628 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
15629 }
15630 function omit(object, keys) {
15631 const result = { ...object };
15632 for (const key of keys) if (hasOwnProperty(result, key)) delete result[key];
15633 return result;
15634 }
15635 function pick(object, paths) {
15636 const result = {};
15637 for (const key of paths) if (hasOwnProperty(object, key)) result[key] = object[key];
15638 return result;
15639 }
15640 function identity(value) {
15641 return value;
15642 }
15643 function afterPaint(cb = noop4) {
15644 let raf = requestAnimationFrame(() => {
15645 raf = requestAnimationFrame(cb);
15646 });
15647 return () => cancelAnimationFrame(raf);
15648 }
15649 function invariant(condition, message2) {
15650 if (condition) return;
15651 if (typeof message2 !== "string") throw new Error("Invariant failed");
15652 throw new Error(message2);
15653 }
15654 function getKeys(obj) {
15655 return Object.keys(obj);
15656 }
15657 function isFalsyBooleanCallback(booleanOrCallback, ...args) {
15658 const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback;
15659 if (result == null) return false;
15660 return !result;
15661 }
15662 function disabledFromProps(props) {
15663 return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true";
15664 }
15665 function removeUndefinedValues(obj) {
15666 const result = {};
15667 for (const key in obj) if (obj[key] !== void 0) result[key] = obj[key];
15668 return result;
15669 }
15670 function defaultValue(...values) {
15671 for (const value of values) if (value !== void 0) return value;
15672 }
15673 var canUseDOM = checkIsBrowser();
15674 function checkIsBrowser() {
15675 return typeof window !== "undefined" && !!window.document?.createElement;
15676 }
15677 function getDocument(node) {
15678 if (!node) return document;
15679 if ("self" in node) return node.document;
15680 return node.ownerDocument || document;
15681 }
15682 function getActiveElement(node, activeDescendant = false) {
15683 const { activeElement: activeElement2 } = getDocument(node);
15684 if (!activeElement2?.nodeName) return null;
15685 if (isFrame(activeElement2) && activeElement2.contentDocument?.body) return getActiveElement(activeElement2.contentDocument.body, activeDescendant);
15686 if (activeDescendant) {
15687 const id = activeElement2.getAttribute("aria-activedescendant");
15688 if (id) {
15689 const element = getDocument(activeElement2).getElementById(id);
15690 if (element) return element;
15691 }
15692 }
15693 return activeElement2;
15694 }
15695 function contains2(parent, child) {
15696 return parent === child || parent.contains(child);
15697 }
15698 function isElement2(target) {
15699 return target?.nodeType === 1;
15700 }
15701 function isNode2(target) {
15702 return typeof target?.nodeType === "number";
15703 }
15704 function isFrame(element) {
15705 return element.tagName === "IFRAME";
15706 }
15707 function isButton(element) {
15708 const tagName = element.tagName.toLowerCase();
15709 if (tagName === "button") return true;
15710 if (tagName === "input" && element.type) return buttonInputTypes.indexOf(element.type) !== -1;
15711 return false;
15712 }
15713 var buttonInputTypes = [
15714 "button",
15715 "color",
15716 "file",
15717 "image",
15718 "reset",
15719 "submit"
15720 ];
15721 function isVisible(element) {
15722 if (typeof element.checkVisibility === "function") return element.checkVisibility();
15723 const htmlElement = element;
15724 return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0;
15725 }
15726 function isTextField(element) {
15727 try {
15728 if (element.tagName === "TEXTAREA") return true;
15729 if (element.tagName !== "INPUT") return false;
15730 return element.selectionStart !== null;
15731 } catch (_error) {
15732 return false;
15733 }
15734 }
15735 function isTextbox(element) {
15736 return element.isContentEditable || isTextField(element);
15737 }
15738 function getTextboxValue(element) {
15739 if (isTextField(element)) return element.value;
15740 if (element.isContentEditable) {
15741 const range = getDocument(element).createRange();
15742 range.selectNodeContents(element);
15743 return range.toString();
15744 }
15745 return "";
15746 }
15747 function getTextboxSelection(element) {
15748 let start = 0;
15749 let end = 0;
15750 if (isTextField(element)) {
15751 start = element.selectionStart || 0;
15752 end = element.selectionEnd || 0;
15753 } else if (element.isContentEditable) {
15754 const selection = getDocument(element).getSelection();
15755 if (selection?.rangeCount && selection.anchorNode && contains2(element, selection.anchorNode) && selection.focusNode && contains2(element, selection.focusNode)) {
15756 const range = selection.getRangeAt(0);
15757 const nextRange = range.cloneRange();
15758 nextRange.selectNodeContents(element);
15759 nextRange.setEnd(range.startContainer, range.startOffset);
15760 start = nextRange.toString().length;
15761 nextRange.setEnd(range.endContainer, range.endOffset);
15762 end = nextRange.toString().length;
15763 }
15764 }
15765 return {
15766 start,
15767 end
15768 };
15769 }
15770 var allowedPopupRoles = [
15771 "dialog",
15772 "menu",
15773 "listbox",
15774 "tree",
15775 "grid"
15776 ];
15777 var itemRoleByPopupRole = {
15778 menu: "menuitem",
15779 listbox: "option",
15780 tree: "treeitem"
15781 };
15782 function getPopupRole(element, fallback) {
15783 const role = element?.getAttribute("role");
15784 if (role && allowedPopupRoles.indexOf(role) !== -1) return role;
15785 return fallback;
15786 }
15787 function getItemRoleByPopupRole(popupRole) {
15788 if (popupRole == null) return;
15789 if (!hasOwnProperty(itemRoleByPopupRole, popupRole)) return;
15790 return itemRoleByPopupRole[popupRole];
15791 }
15792 function getScrollingElement(element) {
15793 if (!element) return null;
15794 const isScrollableOverflow = (overflow) => {
15795 if (overflow === "auto") return true;
15796 if (overflow === "scroll") return true;
15797 return false;
15798 };
15799 if (element.clientHeight && element.scrollHeight > element.clientHeight) {
15800 const { overflowY } = getComputedStyle(element);
15801 if (isScrollableOverflow(overflowY)) return element;
15802 } else if (element.clientWidth && element.scrollWidth > element.clientWidth) {
15803 const { overflowX } = getComputedStyle(element);
15804 if (isScrollableOverflow(overflowX)) return element;
15805 }
15806 const doc = getDocument(element);
15807 return getScrollingElement(element.parentElement) || doc.scrollingElement || doc.body;
15808 }
15809 function setSelectionRange(element, ...args) {
15810 if (/text|search|password|tel|url/i.test(element.type)) element.setSelectionRange(...args);
15811 }
15812 function sortBasedOnDOMPosition(items, getElement) {
15813 const pairs = items.map((item, index2) => [index2, item]);
15814 let isOrderDifferent = false;
15815 pairs.sort(([indexA, a2], [indexB, b2]) => {
15816 const elementA = getElement(a2);
15817 const elementB = getElement(b2);
15818 if (elementA === elementB) return 0;
15819 if (!elementA || !elementB) return 0;
15820 if (isElementPreceding(elementA, elementB)) {
15821 if (indexA > indexB) isOrderDifferent = true;
15822 return -1;
15823 }
15824 if (indexA < indexB) isOrderDifferent = true;
15825 return 1;
15826 });
15827 if (isOrderDifferent) return pairs.map(([_, item]) => item);
15828 return items;
15829 }
15830 function isElementPreceding(a2, b2) {
15831 return Boolean(b2.compareDocumentPosition(a2) & Node.DOCUMENT_POSITION_PRECEDING);
15832 }
15833 function isTouchDevice() {
15834 return canUseDOM && !!navigator.maxTouchPoints;
15835 }
15836 function isApple() {
15837 if (!canUseDOM) return false;
15838 return /mac|iphone|ipad|ipod/i.test(navigator.platform);
15839 }
15840 function isSafari() {
15841 return canUseDOM && isApple() && /apple/i.test(navigator.vendor);
15842 }
15843 function isFirefox() {
15844 return canUseDOM && /firefox\//i.test(navigator.userAgent);
15845 }
15846 function isPortalEvent(event) {
15847 const { currentTarget, target } = event;
15848 if (!currentTarget) return false;
15849 if (!isNode2(target)) return true;
15850 return !contains2(currentTarget, target);
15851 }
15852 function isSelfTarget(event) {
15853 return event.target === event.currentTarget;
15854 }
15855 function isActivatableNavigationTarget(element) {
15856 if (!isElement2(element)) return false;
15857 const target = element;
15858 const tagName = target.tagName.toLowerCase();
15859 if (tagName === "a") return true;
15860 if (tagName === "button" && target.type === "submit") return true;
15861 if (tagName === "input" && target.type === "submit") return true;
15862 return false;
15863 }
15864 function isOpeningInNewTab(event) {
15865 const isAppleDevice = isApple();
15866 if (isAppleDevice && !event.metaKey) return false;
15867 if (!isAppleDevice && !event.ctrlKey) return false;
15868 return isActivatableNavigationTarget(event.currentTarget);
15869 }
15870 function isDownloading(event) {
15871 if (!event.altKey) return false;
15872 return isActivatableNavigationTarget(event.currentTarget);
15873 }
15874 function fireBlurEvent(element, eventInit) {
15875 const event = new FocusEvent("blur", eventInit);
15876 const defaultAllowed = element.dispatchEvent(event);
15877 const bubbleInit = {
15878 ...eventInit,
15879 bubbles: true
15880 };
15881 element.dispatchEvent(new FocusEvent("focusout", bubbleInit));
15882 return defaultAllowed;
15883 }
15884 function fireKeyboardEvent(element, type, eventInit) {
15885 const event = new KeyboardEvent(type, eventInit);
15886 return element.dispatchEvent(event);
15887 }
15888 function fireClickEvent(element, eventInit) {
15889 const event = new MouseEvent("click", eventInit);
15890 return element.dispatchEvent(event);
15891 }
15892 function isFocusEventOutside(event, container) {
15893 const containerElement = container || event.currentTarget;
15894 const relatedTarget = event.relatedTarget;
15895 return !isNode2(relatedTarget) || !contains2(containerElement, relatedTarget);
15896 }
15897 function isInputEvent(event) {
15898 return event.type === "input";
15899 }
15900 function queueBeforeEvent(element, type, callback, timeout) {
15901 const createTimer = (callback2) => {
15902 if (timeout) {
15903 const timerId2 = setTimeout(callback2, timeout);
15904 return () => clearTimeout(timerId2);
15905 }
15906 const timerId = requestAnimationFrame(callback2);
15907 return () => cancelAnimationFrame(timerId);
15908 };
15909 const cancelTimer = createTimer(() => {
15910 element.removeEventListener(type, callSync, true);
15911 callback();
15912 });
15913 const callSync = () => {
15914 cancelTimer();
15915 callback();
15916 };
15917 element.addEventListener(type, callSync, {
15918 once: true,
15919 capture: true
15920 });
15921 return () => {
15922 cancelTimer();
15923 element.removeEventListener(type, callSync, true);
15924 };
15925 }
15926 function addGlobalEventListener(type, listener, options, scope = window) {
15927 const children = [];
15928 try {
15929 scope.document.addEventListener(type, listener, options);
15930 for (const frame of Array.from(scope.frames)) children.push(addGlobalEventListener(type, listener, options, frame));
15931 } catch {
15932 }
15933 const removeEventListener = () => {
15934 try {
15935 scope.document.removeEventListener(type, listener, options);
15936 } catch {
15937 }
15938 for (const remove of children) remove();
15939 };
15940 return removeEventListener;
15941 }
15942 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'])";
15943 function isFocusable(element) {
15944 if (!element.matches(selector)) return false;
15945 if (!isVisible(element)) return false;
15946 if (element.closest("[inert]")) return false;
15947 return true;
15948 }
15949 function hasFocus(element) {
15950 const activeElement2 = getActiveElement(element);
15951 if (!activeElement2) return false;
15952 if (activeElement2 === element) return true;
15953 const activeDescendant = activeElement2.getAttribute("aria-activedescendant");
15954 if (!activeDescendant) return false;
15955 return activeDescendant === element.id;
15956 }
15957 function hasFocusWithin(element) {
15958 const activeElement2 = getActiveElement(element);
15959 if (!activeElement2) return false;
15960 if (contains2(element, activeElement2)) return true;
15961 const activeDescendant = activeElement2.getAttribute("aria-activedescendant");
15962 if (!activeDescendant) return false;
15963 if (!("id" in element)) return false;
15964 if (activeDescendant === element.id) return true;
15965 return !!element.querySelector(`#${CSS.escape(activeDescendant)}`);
15966 }
15967 function focusIntoView(element, options) {
15968 if (!("scrollIntoView" in element)) element.focus();
15969 else {
15970 element.focus({ preventScroll: true });
15971 element.scrollIntoView({
15972 block: "nearest",
15973 inline: "nearest",
15974 ...options
15975 });
15976 }
15977 }
15978 function createUndoCallback(callback) {
15979 return async () => {
15980 const redo = await callback?.();
15981 return createUndoCallback(async () => {
15982 await redo?.();
15983 return callback;
15984 });
15985 };
15986 }
15987 var UndoManager = createUndoManager();
15988 function createUndoManager({ limit = 100 } = {}) {
15989 const undoStack = [];
15990 let redoStack = [];
15991 let currentGroup = null;
15992 const canUndo = () => undoStack.length > 0;
15993 const canRedo = () => redoStack.length > 0;
15994 const undo = async () => {
15995 if (!canUndo()) return;
15996 currentGroup = null;
15997 redoStack.push(await undoStack.pop()?.());
15998 };
15999 const redo = async () => {
16000 if (!canRedo()) return;
16001 currentGroup = null;
16002 undoStack.push(await redoStack.pop()?.());
16003 };
16004 const execute = async (callback, group) => {
16005 if (!callback) return;
16006 const sameGroup = group === currentGroup;
16007 currentGroup = group ?? null;
16008 const nextIndex = sameGroup ? Math.max(0, undoStack.length - 1) : undoStack.length;
16009 const undoCallback = await callback();
16010 if (!undoCallback) return;
16011 redoStack = [];
16012 const currentUndo = undoStack[nextIndex];
16013 undoStack[nextIndex] = createUndoCallback(async () => {
16014 await undoCallback?.();
16015 const currentRedo = await currentUndo?.();
16016 return async () => {
16017 await currentRedo?.();
16018 await callback?.();
16019 };
16020 });
16021 while (undoStack.length > limit) undoStack.shift();
16022 };
16023 return {
16024 canUndo,
16025 canRedo,
16026 undo,
16027 redo,
16028 execute
16029 };
16030 }
16031
16032 // node_modules/@ariakit/react-utils/dist/index.js
16033 var React47 = __toESM(require_react(), 1);
16034 var import_react12 = __toESM(require_react(), 1);
16035 var import_jsx_runtime71 = __toESM(require_jsx_runtime(), 1);
16036 function setRef(ref, value) {
16037 if (typeof ref === "function") {
16038 const cleanup = ref(value);
16039 if (typeof cleanup === "function") return cleanup;
16040 } else if (ref) ref.current = value;
16041 }
16042 function isValidElementWithRef(element) {
16043 if (!element) return false;
16044 if (!(0, import_react12.isValidElement)(element)) return false;
16045 if ("ref" in element.props) return true;
16046 if ("ref" in element) return true;
16047 return false;
16048 }
16049 function getRefProperty(element) {
16050 if (!isValidElementWithRef(element)) return null;
16051 return { ...element.props }.ref || element.ref;
16052 }
16053 function mergeProps2(base, overrides) {
16054 const props = { ...base };
16055 for (const key in overrides) {
16056 if (!hasOwnProperty(overrides, key)) continue;
16057 if (key === "className") {
16058 const prop = "className";
16059 const baseClass = base[prop];
16060 const overrideClass = overrides[prop];
16061 if (baseClass && overrideClass) props[prop] = `${baseClass} ${overrideClass}`;
16062 else props[prop] = overrideClass || baseClass;
16063 continue;
16064 }
16065 if (key === "style") {
16066 const prop = "style";
16067 props[prop] = base[prop] ? {
16068 ...base[prop],
16069 ...overrides[prop]
16070 } : overrides[prop];
16071 continue;
16072 }
16073 const overrideValue = overrides[key];
16074 if (key.startsWith("on")) {
16075 if (typeof overrideValue !== "function") continue;
16076 const baseValue = base[key];
16077 if (typeof baseValue === "function") {
16078 props[key] = (...args) => {
16079 overrideValue(...args);
16080 baseValue(...args);
16081 };
16082 continue;
16083 }
16084 }
16085 props[key] = overrideValue;
16086 }
16087 return props;
16088 }
16089 var _React = { ...React47 };
16090 var useReactId = _React.useId;
16091 var useReactDeferredValue = _React.useDeferredValue;
16092 var useReactInsertionEffect = _React.useInsertionEffect;
16093 var useSafeLayoutEffect = canUseDOM ? import_react12.useLayoutEffect : import_react12.useEffect;
16094 function useInitialValue(value) {
16095 const [initialValue] = (0, import_react12.useState)(value);
16096 return initialValue;
16097 }
16098 function useLiveRef(value) {
16099 const ref = (0, import_react12.useRef)(value);
16100 useSafeLayoutEffect(() => {
16101 ref.current = value;
16102 });
16103 return ref;
16104 }
16105 function useEvent(callback) {
16106 const ref = (0, import_react12.useRef)(() => {
16107 throw new Error("Cannot call an event handler while rendering.");
16108 });
16109 if (useReactInsertionEffect) useReactInsertionEffect(() => {
16110 ref.current = callback;
16111 });
16112 else ref.current = callback;
16113 return (0, import_react12.useCallback)((...args) => ref.current?.(...args), []);
16114 }
16115 function useTransactionState(callback) {
16116 const [state, setState] = (0, import_react12.useState)(null);
16117 useSafeLayoutEffect(() => {
16118 if (state == null) return;
16119 if (!callback) return;
16120 let prevState = null;
16121 callback((prev) => {
16122 prevState = prev;
16123 return state;
16124 });
16125 return () => {
16126 callback(prevState);
16127 };
16128 }, [state, callback]);
16129 return [state, setState];
16130 }
16131 function useMergeRefs(...refs) {
16132 return (0, import_react12.useMemo)(() => {
16133 if (!refs.some(Boolean)) return;
16134 return (value) => {
16135 const refEffects = [];
16136 for (const ref of refs) {
16137 if (!ref) continue;
16138 const cleanup = setRef(ref, value);
16139 refEffects.push({
16140 ref,
16141 cleanup: typeof cleanup === "function" ? cleanup : void 0
16142 });
16143 }
16144 if (!refEffects.some((effect) => effect.cleanup)) return;
16145 return () => {
16146 for (const { ref, cleanup } of refEffects) if (cleanup) cleanup();
16147 else setRef(ref, null);
16148 };
16149 };
16150 }, refs);
16151 }
16152 function useId4(defaultId) {
16153 if (useReactId) {
16154 const reactId = useReactId();
16155 if (defaultId) return defaultId;
16156 return reactId;
16157 }
16158 const [id, setId] = (0, import_react12.useState)(defaultId);
16159 useSafeLayoutEffect(() => {
16160 if (defaultId || id) return;
16161 setId(`id-${Math.random().toString(36).slice(2, 8)}`);
16162 }, [defaultId, id]);
16163 return defaultId || id;
16164 }
16165 function useTagName(refOrElement, type) {
16166 const stringOrUndefined = (type2) => {
16167 if (typeof type2 !== "string") return;
16168 return type2;
16169 };
16170 const [tagName, setTagName] = (0, import_react12.useState)(() => stringOrUndefined(type));
16171 useSafeLayoutEffect(() => {
16172 setTagName((refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement)?.tagName.toLowerCase() || stringOrUndefined(type));
16173 }, [refOrElement, type]);
16174 return tagName;
16175 }
16176 function useAttribute(refOrElement, attributeName, defaultValue2) {
16177 const initialValue = useInitialValue(defaultValue2);
16178 const [attribute, setAttribute] = (0, import_react12.useState)(initialValue);
16179 (0, import_react12.useEffect)(() => {
16180 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement;
16181 if (!element) return;
16182 const callback = () => {
16183 const value = element.getAttribute(attributeName);
16184 setAttribute(value == null ? initialValue : value);
16185 };
16186 const observer = new MutationObserver(callback);
16187 observer.observe(element, { attributeFilter: [attributeName] });
16188 callback();
16189 return () => observer.disconnect();
16190 }, [
16191 refOrElement,
16192 attributeName,
16193 initialValue
16194 ]);
16195 return attribute;
16196 }
16197 function useUpdateEffect(effect, deps) {
16198 const mounted = (0, import_react12.useRef)(false);
16199 (0, import_react12.useEffect)(() => {
16200 if (mounted.current) return effect();
16201 mounted.current = true;
16202 }, deps);
16203 (0, import_react12.useEffect)(() => () => {
16204 mounted.current = false;
16205 }, []);
16206 }
16207 function useUpdateLayoutEffect(effect, deps) {
16208 const mounted = (0, import_react12.useRef)(false);
16209 useSafeLayoutEffect(() => {
16210 if (mounted.current) return effect();
16211 mounted.current = true;
16212 }, deps);
16213 useSafeLayoutEffect(() => () => {
16214 mounted.current = false;
16215 }, []);
16216 }
16217 function useForceUpdate() {
16218 return (0, import_react12.useReducer)(() => [], []);
16219 }
16220 function useBooleanEvent(booleanOrCallback) {
16221 return useEvent(typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback);
16222 }
16223 function useWrapElement(props, callback, deps = []) {
16224 const wrapElement = (0, import_react12.useCallback)((element) => {
16225 if (props.wrapElement) element = props.wrapElement(element);
16226 return callback(element);
16227 }, [...deps, props.wrapElement]);
16228 return {
16229 ...props,
16230 wrapElement
16231 };
16232 }
16233 function useMetadataProps(props, key, value) {
16234 const parent = props.onLoadedMetadataCapture;
16235 const onLoadedMetadataCapture = (0, import_react12.useMemo)(() => {
16236 return Object.assign(() => {
16237 }, parent, ...value !== void 0 ? [{ [key]: value }] : []);
16238 }, [
16239 parent,
16240 key,
16241 value
16242 ]);
16243 return [parent?.[key], { onLoadedMetadataCapture }];
16244 }
16245 var hasInstalledGlobalEventListeners = false;
16246 function useIsMouseMoving() {
16247 (0, import_react12.useEffect)(() => {
16248 if (hasInstalledGlobalEventListeners) return;
16249 addGlobalEventListener("mousemove", setMouseMoving, true);
16250 addGlobalEventListener("mousedown", resetMouseMoving, true);
16251 addGlobalEventListener("mouseup", resetMouseMoving, true);
16252 addGlobalEventListener("keydown", resetMouseMoving, true);
16253 addGlobalEventListener("scroll", resetMouseMoving, true);
16254 hasInstalledGlobalEventListeners = true;
16255 }, []);
16256 return useEvent(() => mouseMoving);
16257 }
16258 var mouseMoving = false;
16259 var previousScreenX = 0;
16260 var previousScreenY = 0;
16261 function hasMouseMovement(event) {
16262 const movementX = event.movementX || event.screenX - previousScreenX;
16263 const movementY = event.movementY || event.screenY - previousScreenY;
16264 previousScreenX = event.screenX;
16265 previousScreenY = event.screenY;
16266 return movementX || movementY || false;
16267 }
16268 function setMouseMoving(event) {
16269 if (!hasMouseMovement(event)) return;
16270 mouseMoving = true;
16271 }
16272 function resetMouseMoving() {
16273 mouseMoving = false;
16274 }
16275 function forwardRef30(render4) {
16276 const Role = React47.forwardRef((props, ref) => render4({
16277 ...props,
16278 ref
16279 }));
16280 Role.displayName = render4.displayName || render4.name;
16281 return Role;
16282 }
16283 function memo3(Component, propsAreEqual) {
16284 return React47.memo(Component, propsAreEqual);
16285 }
16286 function createElement3(Type, props) {
16287 const { wrapElement, render: render4, ...rest } = props;
16288 const mergedRef = useMergeRefs(props.ref, getRefProperty(render4));
16289 let element;
16290 if (React47.isValidElement(render4)) {
16291 const renderProps = {
16292 ...render4.props,
16293 ref: mergedRef
16294 };
16295 element = React47.cloneElement(render4, mergeProps2(rest, renderProps));
16296 } else if (render4) element = render4(rest);
16297 else element = /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Type, { ...rest });
16298 if (wrapElement) return wrapElement(element);
16299 return element;
16300 }
16301 function createHook(useProps) {
16302 const useRole = (props = {}) => {
16303 return useProps(props);
16304 };
16305 useRole.displayName = useProps.name;
16306 return useRole;
16307 }
16308 function createStoreContext(providers = [], scopedProviders = []) {
16309 const context = React47.createContext(void 0);
16310 const scopedContext = React47.createContext(void 0);
16311 const useContext38 = () => React47.useContext(context);
16312 const useScopedContext = (onlyScoped = false) => {
16313 const scoped = React47.useContext(scopedContext);
16314 const store = useContext38();
16315 if (onlyScoped) return scoped;
16316 return scoped || store;
16317 };
16318 const useProviderContext = () => {
16319 const scoped = React47.useContext(scopedContext);
16320 const store = useContext38();
16321 if (scoped && scoped === store) return;
16322 return store;
16323 };
16324 const ContextProvider = (props) => {
16325 return providers.reduceRight((children, Provider2) => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Provider2, {
16326 ...props,
16327 children
16328 }), /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(context.Provider, { ...props }));
16329 };
16330 const ScopedContextProvider = (props) => {
16331 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ContextProvider, {
16332 ...props,
16333 children: scopedProviders.reduceRight((children, Provider2) => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Provider2, {
16334 ...props,
16335 children
16336 }), /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(scopedContext.Provider, { ...props }))
16337 });
16338 };
16339 return {
16340 context,
16341 scopedContext,
16342 useContext: useContext38,
16343 useScopedContext,
16344 useProviderContext,
16345 ContextProvider,
16346 ScopedContextProvider
16347 };
16348 }
16349
16350 // node_modules/@ariakit/react-components/dist/focusable/focusable.js
16351 var import_react13 = __toESM(require_react(), 1);
16352 var TagName = "div";
16353 var accessibleWhenDisabledSymbol = /* @__PURE__ */ Symbol("accessibleWhenDisabled");
16354 var isSafariBrowser = isSafari();
16355 var alwaysFocusVisibleInputTypes = [
16356 "text",
16357 "search",
16358 "url",
16359 "tel",
16360 "email",
16361 "password",
16362 "number",
16363 "date",
16364 "month",
16365 "week",
16366 "time",
16367 "datetime",
16368 "datetime-local"
16369 ];
16370 function isAlwaysFocusVisible(element) {
16371 const { tagName, readOnly, type } = element;
16372 if (tagName === "TEXTAREA" && !readOnly) return true;
16373 if (tagName === "SELECT" && !readOnly) return true;
16374 if (tagName === "INPUT" && !readOnly) return alwaysFocusVisibleInputTypes.includes(type);
16375 if (element.isContentEditable) return true;
16376 if (element.getAttribute("role") === "combobox" && element.dataset.name) return true;
16377 return false;
16378 }
16379 function isNativeTabbable(tagName) {
16380 if (!tagName) return true;
16381 return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a";
16382 }
16383 function supportsDisabledAttribute(tagName) {
16384 if (!tagName) return true;
16385 return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea";
16386 }
16387 function isNativeSubmitControl(element) {
16388 if (element.tagName === "BUTTON") {
16389 const { type } = element;
16390 return type === "submit";
16391 }
16392 if (element.tagName === "INPUT") {
16393 const { type } = element;
16394 return type === "submit" || type === "image";
16395 }
16396 return false;
16397 }
16398 function getTabIndex2({ focusable: focusable2, trulyDisabled, nativeTabbable, supportsDisabled, safariTabIndex, tabIndexProp }) {
16399 if (!focusable2) return tabIndexProp;
16400 if (trulyDisabled) {
16401 if (nativeTabbable && !supportsDisabled) return -1;
16402 return;
16403 }
16404 if (nativeTabbable) {
16405 if (safariTabIndex && tabIndexProp == null) return 0;
16406 return tabIndexProp;
16407 }
16408 return tabIndexProp ?? 0;
16409 }
16410 function useDisableEvent(onEvent, disabled2) {
16411 return useEvent((event) => {
16412 onEvent?.(event);
16413 if (event.defaultPrevented) return;
16414 if (disabled2) {
16415 event.stopPropagation();
16416 event.preventDefault();
16417 }
16418 });
16419 }
16420 var hasInstalledGlobalEventListeners2 = false;
16421 var isKeyboardModality = true;
16422 function onGlobalMouseDown(event) {
16423 const target = event.target;
16424 if (isElement2(target) && !target.hasAttribute("data-focus-visible")) isKeyboardModality = false;
16425 }
16426 function onGlobalKeyDown(event) {
16427 if (event.metaKey) return;
16428 if (event.ctrlKey) return;
16429 if (event.altKey) return;
16430 isKeyboardModality = true;
16431 }
16432 var useFocusable = createHook(function useFocusable2({ focusable: focusable2 = true, accessibleWhenDisabled, autoFocus, onFocusVisible, ...props }) {
16433 const ref = (0, import_react13.useRef)(null);
16434 const [parentAccessibleWhenDisabled, metadataProps] = useMetadataProps(props, accessibleWhenDisabledSymbol, accessibleWhenDisabled);
16435 accessibleWhenDisabled ??= parentAccessibleWhenDisabled;
16436 (0, import_react13.useEffect)(() => {
16437 if (!focusable2) return;
16438 if (hasInstalledGlobalEventListeners2) return;
16439 addGlobalEventListener("mousedown", onGlobalMouseDown, true);
16440 addGlobalEventListener("keydown", onGlobalKeyDown, true);
16441 hasInstalledGlobalEventListeners2 = true;
16442 }, [focusable2]);
16443 const disabled2 = focusable2 && disabledFromProps(props);
16444 const trulyDisabled = disabled2 && !accessibleWhenDisabled;
16445 const [focusVisible, setFocusVisible] = (0, import_react13.useState)(false);
16446 const focusVisibleRef = (0, import_react13.useRef)(false);
16447 const nativeSubmitObserverCleanupRef = (0, import_react13.useRef)(null);
16448 const cleanupFocusVisible = useEvent((element) => {
16449 nativeSubmitObserverCleanupRef.current?.();
16450 nativeSubmitObserverCleanupRef.current = null;
16451 focusVisibleRef.current = false;
16452 element?.removeAttribute("data-focus-visible");
16453 });
16454 (0, import_react13.useEffect)(() => {
16455 if (!focusable2) return;
16456 if (!trulyDisabled) return;
16457 cleanupFocusVisible(ref.current);
16458 if (focusVisible) setFocusVisible(false);
16459 }, [
16460 focusable2,
16461 trulyDisabled,
16462 focusVisible,
16463 cleanupFocusVisible
16464 ]);
16465 (0, import_react13.useEffect)(() => {
16466 if (!focusable2) return;
16467 if (!focusVisible) return;
16468 const element = ref.current;
16469 if (!element) return;
16470 if (typeof IntersectionObserver === "undefined") return;
16471 const observer = new IntersectionObserver(() => {
16472 if (!isFocusable(element)) {
16473 focusVisibleRef.current = false;
16474 setFocusVisible(false);
16475 }
16476 });
16477 observer.observe(element);
16478 return () => observer.disconnect();
16479 }, [focusable2, focusVisible]);
16480 (0, import_react13.useEffect)(() => {
16481 return () => nativeSubmitObserverCleanupRef.current?.();
16482 }, []);
16483 const onKeyPressCapture = useDisableEvent(props.onKeyPressCapture, disabled2);
16484 const onMouseDownCapture = useDisableEvent(props.onMouseDownCapture, disabled2);
16485 const onClickCapture = useDisableEvent(props.onClickCapture, disabled2);
16486 const handleFocusVisible = (event, currentTarget) => {
16487 if (currentTarget) event.currentTarget = currentTarget;
16488 if (!focusable2) return;
16489 const element = event.currentTarget;
16490 if (!element) return;
16491 if (!hasFocus(element)) return;
16492 onFocusVisible?.(event);
16493 if (event.defaultPrevented) return;
16494 element.dataset.focusVisible = "true";
16495 focusVisibleRef.current = true;
16496 if (isNativeSubmitControl(element)) {
16497 nativeSubmitObserverCleanupRef.current?.();
16498 nativeSubmitObserverCleanupRef.current = null;
16499 if (typeof IntersectionObserver !== "undefined") {
16500 const observer = new IntersectionObserver(() => {
16501 if (isFocusable(element)) return;
16502 cleanupFocusVisible(element);
16503 });
16504 observer.observe(element);
16505 nativeSubmitObserverCleanupRef.current = () => observer.disconnect();
16506 }
16507 return;
16508 }
16509 setFocusVisible(true);
16510 };
16511 const onKeyDownCaptureProp = props.onKeyDownCapture;
16512 const onKeyDownCapture = useEvent((event) => {
16513 onKeyDownCaptureProp?.(event);
16514 if (event.defaultPrevented) return;
16515 if (!focusable2) return;
16516 if (focusVisible) return;
16517 if (focusVisibleRef.current) return;
16518 if (event.metaKey) return;
16519 if (event.altKey) return;
16520 if (event.ctrlKey) return;
16521 if (!isSelfTarget(event)) return;
16522 const element = event.currentTarget;
16523 const applyFocusVisible = () => handleFocusVisible(event, element);
16524 queueBeforeEvent(element, "focusout", applyFocusVisible);
16525 });
16526 const onFocusCaptureProp = props.onFocusCapture;
16527 const onFocusCapture = useEvent((event) => {
16528 onFocusCaptureProp?.(event);
16529 if (event.defaultPrevented) return;
16530 if (!focusable2) return;
16531 if (!isSelfTarget(event)) {
16532 setFocusVisible(false);
16533 return;
16534 }
16535 const element = event.currentTarget;
16536 const applyFocusVisible = () => handleFocusVisible(event, element);
16537 if (isKeyboardModality || isAlwaysFocusVisible(event.target)) queueBeforeEvent(event.target, "focusout", applyFocusVisible);
16538 else setFocusVisible(false);
16539 });
16540 const onBlurProp = props.onBlur;
16541 const onBlur = useEvent((event) => {
16542 onBlurProp?.(event);
16543 if (!focusable2) return;
16544 if (!isFocusEventOutside(event)) return;
16545 cleanupFocusVisible(event.currentTarget);
16546 setFocusVisible(false);
16547 });
16548 const autoFocusOnShow = (0, import_react13.useContext)(FocusableContext);
16549 const autoFocusRef = useEvent((element) => {
16550 if (!focusable2) return;
16551 if (!autoFocus) return;
16552 if (!element) return;
16553 if (!autoFocusOnShow) return;
16554 queueMicrotask(() => {
16555 if (hasFocus(element)) return;
16556 if (!isFocusable(element)) return;
16557 element.focus();
16558 });
16559 });
16560 const tagName = useTagName(ref);
16561 const nativeTabbable = focusable2 && isNativeTabbable(tagName);
16562 const supportsDisabled = focusable2 && supportsDisabledAttribute(tagName);
16563 const [safariTabIndex, setSafariTabIndex] = (0, import_react13.useState)(false);
16564 if (isSafariBrowser) (0, import_react13.useEffect)(() => {
16565 if (!focusable2) return;
16566 const element = ref.current;
16567 if (!element) return;
16568 const { type } = element;
16569 const isNativeCheckboxOrRadio = element.tagName === "INPUT" && (type === "checkbox" || type === "radio");
16570 setSafariTabIndex(isButton(element) || isNativeCheckboxOrRadio);
16571 }, [focusable2]);
16572 const styleProp = props.style;
16573 const style = (0, import_react13.useMemo)(() => {
16574 if (trulyDisabled) return {
16575 pointerEvents: "none",
16576 ...styleProp
16577 };
16578 return styleProp;
16579 }, [trulyDisabled, styleProp]);
16580 props = {
16581 "data-focus-visible": focusable2 && focusVisible || void 0,
16582 "data-autofocus": autoFocus || void 0,
16583 "aria-disabled": disabled2 || void 0,
16584 ...props,
16585 ...metadataProps,
16586 ref: useMergeRefs(ref, autoFocusRef, props.ref),
16587 style,
16588 tabIndex: getTabIndex2({
16589 focusable: focusable2,
16590 trulyDisabled,
16591 nativeTabbable,
16592 supportsDisabled,
16593 safariTabIndex,
16594 tabIndexProp: props.tabIndex
16595 }),
16596 disabled: supportsDisabled && trulyDisabled ? true : void 0,
16597 contentEditable: disabled2 ? void 0 : props.contentEditable,
16598 onKeyPressCapture,
16599 onClickCapture,
16600 onMouseDownCapture,
16601 onKeyDownCapture,
16602 onFocusCapture,
16603 onBlur
16604 };
16605 return removeUndefinedValues(props);
16606 });
16607 var Focusable = forwardRef30(function Focusable2(props) {
16608 return createElement3(TagName, useFocusable(props));
16609 });
16610
16611 // node_modules/@ariakit/react-components/dist/command/command.js
16612 var import_react14 = __toESM(require_react(), 1);
16613 var TagName2 = "button";
16614 function isNativeClick(event) {
16615 if (!event.isTrusted) return false;
16616 const element = event.currentTarget;
16617 if (event.key === "Enter") return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A";
16618 if (event.key === " ") return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT";
16619 return false;
16620 }
16621 var symbol = /* @__PURE__ */ Symbol("command");
16622 var useCommand = createHook(function useCommand2({ clickOnEnter = true, clickOnSpace = true, ...props }) {
16623 const ref = (0, import_react14.useRef)(null);
16624 const [isNativeButton, setIsNativeButton] = (0, import_react14.useState)(false);
16625 (0, import_react14.useEffect)(() => {
16626 if (!ref.current) return;
16627 setIsNativeButton(isButton(ref.current));
16628 }, []);
16629 const [active, setActive] = (0, import_react14.useState)(false);
16630 const activeRef = (0, import_react14.useRef)(false);
16631 const disabled2 = disabledFromProps(props);
16632 const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true);
16633 useSafeLayoutEffect(() => {
16634 if (!disabled2) return;
16635 activeRef.current = false;
16636 setActive(false);
16637 }, [disabled2]);
16638 const onKeyDownProp = props.onKeyDown;
16639 const onKeyDown = useEvent((event) => {
16640 onKeyDownProp?.(event);
16641 const element = event.currentTarget;
16642 if (event.defaultPrevented) return;
16643 if (isDuplicate) return;
16644 if (disabled2) return;
16645 if (!isSelfTarget(event)) return;
16646 if (isTextField(element)) return;
16647 if (element.isContentEditable) return;
16648 const isEnter = clickOnEnter && event.key === "Enter";
16649 const isSpace = clickOnSpace && event.key === " ";
16650 const shouldPreventEnter = event.key === "Enter" && !clickOnEnter;
16651 const shouldPreventSpace = event.key === " " && !clickOnSpace;
16652 if (shouldPreventEnter || shouldPreventSpace) {
16653 event.preventDefault();
16654 return;
16655 }
16656 if (isEnter || isSpace) {
16657 const nativeClick = isNativeClick(event);
16658 if (isEnter) {
16659 if (!nativeClick) {
16660 event.preventDefault();
16661 const { view, ...eventInit } = event;
16662 const click = () => fireClickEvent(element, eventInit);
16663 if (isFirefox()) queueBeforeEvent(element, "keyup", click);
16664 else queueMicrotask(click);
16665 }
16666 } else if (isSpace) {
16667 activeRef.current = true;
16668 if (!nativeClick) {
16669 event.preventDefault();
16670 setActive(true);
16671 }
16672 }
16673 }
16674 });
16675 const onKeyUpProp = props.onKeyUp;
16676 const onKeyUp = useEvent((event) => {
16677 onKeyUpProp?.(event);
16678 if (isDuplicate) return;
16679 const isSpace = clickOnSpace && event.key === " ";
16680 if (!activeRef.current || !isSpace) return;
16681 const nativeClick = isNativeClick(event);
16682 activeRef.current = false;
16683 if (!nativeClick) setActive(false);
16684 if (event.defaultPrevented) return;
16685 if (!isSelfTarget(event)) return;
16686 if (disabled2) return;
16687 if (event.metaKey) return;
16688 if (nativeClick) return;
16689 event.preventDefault();
16690 const element = event.currentTarget;
16691 const { view, ...eventInit } = event;
16692 queueMicrotask(() => fireClickEvent(element, eventInit));
16693 });
16694 const onBlurProp = props.onBlur;
16695 const onBlur = useEvent((event) => {
16696 onBlurProp?.(event);
16697 if (!activeRef.current) return;
16698 activeRef.current = false;
16699 setActive(false);
16700 });
16701 props = {
16702 "data-active": active || void 0,
16703 type: isNativeButton ? "button" : void 0,
16704 ...metadataProps,
16705 ...props,
16706 ref: useMergeRefs(ref, props.ref),
16707 onKeyDown,
16708 onKeyUp,
16709 onBlur
16710 };
16711 props = useFocusable(props);
16712 return props;
16713 });
16714 var Command = forwardRef30(function Command2(props) {
16715 return createElement3(TagName2, useCommand(props));
16716 });
16717
16718 // node_modules/@ariakit/react-components/dist/collection/collection-context.js
16719 var ctx = createStoreContext();
16720 var useCollectionContext = ctx.useContext;
16721 var useCollectionScopedContext = ctx.useScopedContext;
16722 var useCollectionProviderContext = ctx.useProviderContext;
16723 var CollectionContextProvider = ctx.ContextProvider;
16724 var CollectionScopedContextProvider = ctx.ScopedContextProvider;
16725
16726 // node_modules/@ariakit/react-components/dist/collection/collection-item.js
16727 var import_react15 = __toESM(require_react(), 1);
16728 var TagName3 = "div";
16729 var useCollectionItem = createHook(function useCollectionItem2({ store, shouldRegisterItem = true, getItem = identity, element, ...props }) {
16730 const context = useCollectionContext();
16731 store = store || context;
16732 const id = useId4(props.id);
16733 const ref = (0, import_react15.useRef)(element);
16734 (0, import_react15.useEffect)(() => {
16735 const element2 = ref.current;
16736 if (!id) return;
16737 if (!element2) return;
16738 if (!shouldRegisterItem) return;
16739 const item = getItem({
16740 id,
16741 element: element2
16742 });
16743 return store?.renderItem(item);
16744 }, [
16745 id,
16746 shouldRegisterItem,
16747 getItem,
16748 store
16749 ]);
16750 props = {
16751 ...props,
16752 ref: useMergeRefs(ref, props.ref)
16753 };
16754 return removeUndefinedValues(props);
16755 });
16756 var CollectionItem = forwardRef30(function CollectionItem2(props) {
16757 return createElement3(TagName3, useCollectionItem(props));
16758 });
16759
16760 // node_modules/@ariakit/react-components/dist/composite/composite-context.js
16761 var import_react16 = __toESM(require_react(), 1);
16762 var ctx2 = createStoreContext([CollectionContextProvider], [CollectionScopedContextProvider]);
16763 var useCompositeContext = ctx2.useContext;
16764 var useCompositeScopedContext = ctx2.useScopedContext;
16765 var useCompositeProviderContext = ctx2.useProviderContext;
16766 var CompositeContextProvider = ctx2.ContextProvider;
16767 var CompositeScopedContextProvider = ctx2.ScopedContextProvider;
16768 var CompositeItemContext = (0, import_react16.createContext)(void 0);
16769 var CompositeRowContext = (0, import_react16.createContext)(void 0);
16770
16771 // node_modules/@ariakit/store/dist/index.js
16772 function getInternal(store, key) {
16773 const internals = store.__unstableInternals;
16774 invariant(internals, "Invalid store");
16775 return internals[key];
16776 }
16777 function hasUpdatedKey(keys, updatedKey) {
16778 if (!keys) return true;
16779 for (const currentKey of keys) if (updatedKey instanceof Set) {
16780 if (updatedKey.has(currentKey)) return true;
16781 } else if (currentKey === updatedKey) return true;
16782 return false;
16783 }
16784 function isSameValue(value, other) {
16785 return value === other || value !== value && other !== other;
16786 }
16787 function getCleanupPrevState(prevState, state, stateBeforeCleanup, updatedKey) {
16788 let cleanupPrevState;
16789 for (const key of getKeys(state)) {
16790 if (isSameValue(state[key], stateBeforeCleanup[key])) continue;
16791 if (updatedKey !== void 0 && hasUpdatedKey([key], updatedKey)) continue;
16792 cleanupPrevState ??= { ...prevState };
16793 cleanupPrevState[key] = state[key];
16794 }
16795 return cleanupPrevState;
16796 }
16797 var MAX_REPAIR_PASSES = 100;
16798 function addKeyedListener(map, keys, listener) {
16799 if (!keys) return;
16800 for (const key of keys) {
16801 let listeners = map.get(key);
16802 if (!listeners) {
16803 listeners = /* @__PURE__ */ new Set();
16804 map.set(key, listeners);
16805 }
16806 listeners.add(listener);
16807 }
16808 }
16809 function deleteKeyedListener(map, keys, listener) {
16810 if (!map) return;
16811 if (!keys) return;
16812 for (const key of keys) {
16813 const listeners = map.get(key);
16814 if (!listeners) continue;
16815 listeners.delete(listener);
16816 if (!listeners.size) map.delete(key);
16817 }
16818 }
16819 function getFastPathNotifiedListeners(frame) {
16820 const notifiedListeners = /* @__PURE__ */ new Set();
16821 const currentListener = frame.currentListener;
16822 if (!currentListener) return notifiedListeners;
16823 for (const listener of frame.keyedListeners) {
16824 notifiedListeners.add(listener);
16825 if (listener === currentListener) return notifiedListeners;
16826 }
16827 notifiedListeners.clear();
16828 notifiedListeners.add(currentListener);
16829 return notifiedListeners;
16830 }
16831 function preserveFastPathNotifiedListeners(frame) {
16832 frame.notifiedListeners ??= getFastPathNotifiedListeners(frame);
16833 }
16834 function hasFastPathPassedListener(frame, listener) {
16835 if (!frame.currentListener) return false;
16836 let foundCurrentKeyedListener = false;
16837 for (const currentListener of frame.keyedListeners) {
16838 if (currentListener === frame.currentListener) {
16839 foundCurrentKeyedListener = true;
16840 continue;
16841 }
16842 if (!foundCurrentKeyedListener) continue;
16843 if (currentListener === listener) return false;
16844 }
16845 let foundListener = false;
16846 for (const currentListener of frame.group.listeners) {
16847 if (currentListener === frame.currentListener) return foundListener;
16848 if (currentListener === listener) foundListener = true;
16849 }
16850 return false;
16851 }
16852 function preserveFastPathFrames(fastPathFrames, group, listener) {
16853 for (const frame of fastPathFrames) {
16854 if (frame.group !== group) continue;
16855 if (frame.recovering) continue;
16856 if (listener && !frame.keyedListeners.has(listener)) continue;
16857 preserveFastPathNotifiedListeners(frame);
16858 for (const currentListener of frame.group.listeners) {
16859 if (currentListener === frame.currentListener) break;
16860 if (!hasFastPathPassedListener(frame, currentListener)) continue;
16861 frame.notifiedListeners?.add(currentListener);
16862 }
16863 }
16864 }
16865 function preserveFastPathPassedListeners(fastPathFrames, group, listener) {
16866 for (const frame of fastPathFrames) {
16867 if (frame.group !== group) continue;
16868 if (frame.recovering) continue;
16869 if (!hasFastPathPassedListener(frame, listener)) continue;
16870 preserveFastPathNotifiedListeners(frame);
16871 frame.notifiedListeners?.add(listener);
16872 }
16873 }
16874 function preserveFastPathPassedKeyedListeners({ fastPathFrames, group, keys, listener }) {
16875 const wasRegistered = group.listeners.has(listener);
16876 for (const frame of fastPathFrames) {
16877 if (frame.group !== group) continue;
16878 if (frame.recovering) continue;
16879 if (!keys.includes(frame.updatedKey)) continue;
16880 if (hasFastPathPassedListener(frame, listener)) {
16881 preserveFastPathNotifiedListeners(frame);
16882 frame.notifiedListeners?.add(listener);
16883 } else if (wasRegistered) {
16884 preserveFastPathNotifiedListeners(frame);
16885 frame.recoverToLive = true;
16886 }
16887 }
16888 }
16889 function clearFastPathNotifiedListener(fastPathFrames, group, listener) {
16890 for (const frame of fastPathFrames) {
16891 if (frame.group !== group) continue;
16892 frame.notifiedListeners?.delete(listener);
16893 }
16894 }
16895 function addFastPathKeyedListener({ fastPathFrames, group, keys, listener }) {
16896 for (const frame of fastPathFrames) {
16897 if (frame.group !== group) continue;
16898 if (frame.recovering) continue;
16899 if (!keys.includes(frame.updatedKey)) continue;
16900 frame.keyedListeners.add(listener);
16901 }
16902 }
16903 function runPendingCleanup(group, listener) {
16904 if (!group.disposables.size) return;
16905 const cleanup = group.disposables.get(listener);
16906 if (!cleanup) return;
16907 group.disposables.delete(listener);
16908 cleanup();
16909 }
16910 function setListenerCleanup(group, listener, cleanup) {
16911 const currentCleanup = group.disposables.get(listener);
16912 if (!currentCleanup) {
16913 group.disposables.set(listener, cleanup);
16914 return;
16915 }
16916 group.disposables.set(listener, () => {
16917 currentCleanup();
16918 cleanup();
16919 });
16920 }
16921 function notifyStoreListener(group, listener, state, prevState, getState, updatedKey) {
16922 if (group.suspendCounts?.has(listener)) return;
16923 const { disposables } = group;
16924 const cleanup = disposables.size ? disposables.get(listener) : void 0;
16925 if (cleanup) {
16926 disposables.delete(listener);
16927 const stateBeforeCleanup = state;
16928 cleanup();
16929 state = getState?.() ?? state;
16930 if (state !== stateBeforeCleanup) prevState = getCleanupPrevState(prevState, state, stateBeforeCleanup, updatedKey) ?? prevState;
16931 }
16932 const result = listener(state, prevState);
16933 if (result) setListenerCleanup(group, listener, result);
16934 }
16935 function runLiveListeners({ group, getState, prevState, updatedKey, notifiedListeners }) {
16936 const allKeysListeners = group.allKeysListeners;
16937 for (const listener of group.listeners) {
16938 if (notifiedListeners?.has(listener)) continue;
16939 if (!allKeysListeners?.has(listener)) {
16940 if (!hasUpdatedKey(group.listenerKeys.get(listener), updatedKey)) continue;
16941 }
16942 notifiedListeners?.add(listener);
16943 notifyStoreListener(group, listener, getState(), prevState, getState, updatedKey);
16944 }
16945 }
16946 function createStore(initialState, ...stores) {
16947 let state = initialState;
16948 let prevStateBatch = state;
16949 let destroy = noop4;
16950 let batchPending = false;
16951 let inDispatch = false;
16952 let updatedKeys = /* @__PURE__ */ new Set();
16953 const instances = /* @__PURE__ */ new Set();
16954 const setups = /* @__PURE__ */ new Set();
16955 const syncListenerGroup = {
16956 listeners: /* @__PURE__ */ new Set(),
16957 disposables: /* @__PURE__ */ new Map(),
16958 listenerKeys: /* @__PURE__ */ new WeakMap()
16959 };
16960 const batchListenerGroup = {
16961 listeners: /* @__PURE__ */ new Set(),
16962 disposables: /* @__PURE__ */ new Map(),
16963 listenerKeys: /* @__PURE__ */ new WeakMap()
16964 };
16965 const storeSetup = (callback) => {
16966 setups.add(callback);
16967 return () => setups.delete(callback);
16968 };
16969 const storeInit = () => {
16970 const initializedInstances = instances.size;
16971 const instance = /* @__PURE__ */ Symbol();
16972 instances.add(instance);
16973 const maybeDestroy = () => {
16974 if (!instances.delete(instance)) return;
16975 if (instances.size) return;
16976 destroy();
16977 };
16978 if (initializedInstances) return maybeDestroy;
16979 const stateKeys = getKeys(state);
16980 const desyncs = [];
16981 for (const store of stores) {
16982 const storeState = store?.getState?.();
16983 if (!storeState) continue;
16984 const keys = stateKeys.filter((key) => hasOwnProperty(storeState, key));
16985 if (!keys.length) continue;
16986 if (stores.length === 1 || keys.length === stateKeys.length) {
16987 for (const key of keys) desyncs.push(sync(store, [key], (state2) => {
16988 setState(key, state2[key], true);
16989 }));
16990 continue;
16991 }
16992 desyncs.push(subscribe(store, keys, (state2, prevState) => {
16993 for (const key of keys) {
16994 if (state2[key] === prevState[key]) continue;
16995 setState(key, state2[key], true);
16996 }
16997 }));
16998 for (const key of keys) {
16999 const liveState = store?.getState?.();
17000 if (!liveState) continue;
17001 setState(key, liveState[key], true);
17002 }
17003 }
17004 const teardowns = [];
17005 for (const setup2 of setups) teardowns.push(setup2());
17006 const cleanups = stores.map(init);
17007 destroy = chain(...desyncs, ...teardowns, ...cleanups);
17008 return maybeDestroy;
17009 };
17010 const deleteListenerIndexes = (group, listener, keys) => {
17011 if (keys === void 0) return;
17012 if (keys) deleteKeyedListener(group.listenersByKey, keys, listener);
17013 else group.allKeysListeners?.delete(listener);
17014 };
17015 const fastPathFrames = [];
17016 const registerListener = (keys, listener, group = syncListenerGroup) => {
17017 const listenerKeysValue = keys ? [...keys] : null;
17018 const wasRegistered = group.listeners.has(listener);
17019 if (!wasRegistered) clearFastPathNotifiedListener(fastPathFrames, group, listener);
17020 if (!listenerKeysValue) {
17021 if (wasRegistered) preserveFastPathFrames(fastPathFrames, group);
17022 preserveFastPathPassedListeners(fastPathFrames, group, listener);
17023 } else preserveFastPathPassedKeyedListeners({
17024 fastPathFrames,
17025 group,
17026 keys: listenerKeysValue,
17027 listener
17028 });
17029 if (wasRegistered) {
17030 preserveFastPathFrames(fastPathFrames, group, listener);
17031 deleteListenerIndexes(group, listener, group.listenerKeys.get(listener));
17032 }
17033 group.listeners.add(listener);
17034 if (listenerKeysValue) {
17035 group.listenersByKey ??= /* @__PURE__ */ new Map();
17036 addKeyedListener(group.listenersByKey, listenerKeysValue, listener);
17037 addFastPathKeyedListener({
17038 fastPathFrames,
17039 group,
17040 keys: listenerKeysValue,
17041 listener
17042 });
17043 } else {
17044 group.allKeysListeners ??= /* @__PURE__ */ new Set();
17045 group.allKeysListeners.add(listener);
17046 }
17047 group.listenerKeys.set(listener, listenerKeysValue);
17048 return () => {
17049 const cleanup = group.disposables.get(listener);
17050 group.disposables.delete(listener);
17051 preserveFastPathFrames(fastPathFrames, group, listener);
17052 const currentKeys = group.listenerKeys.get(listener);
17053 deleteListenerIndexes(group, listener, listenerKeysValue);
17054 if (currentKeys !== listenerKeysValue) deleteListenerIndexes(group, listener, currentKeys);
17055 group.listenerKeys.delete(listener);
17056 group.listeners.delete(listener);
17057 cleanup?.();
17058 };
17059 };
17060 const storeSubscribe = (keys, listener) => registerListener(keys, listener);
17061 const runInitialListener = (group, listener, prevState) => {
17062 const shouldSuspend = group.listeners.has(listener);
17063 if (shouldSuspend) {
17064 group.suspendCounts ??= /* @__PURE__ */ new Map();
17065 const count = group.suspendCounts.get(listener) ?? 0;
17066 group.suspendCounts.set(listener, count + 1);
17067 }
17068 let cleanupPrevState;
17069 try {
17070 const stateBeforeCleanups = state;
17071 runPendingCleanup(group, listener);
17072 if (state !== stateBeforeCleanups) cleanupPrevState = getCleanupPrevState(prevState, state, stateBeforeCleanups);
17073 const cleanup = listener(state, cleanupPrevState ?? prevState);
17074 if (cleanup) setListenerCleanup(group, listener, cleanup);
17075 } finally {
17076 if (shouldSuspend) {
17077 const suspendCounts = group.suspendCounts;
17078 const count = suspendCounts?.get(listener);
17079 if (count && count > 1) suspendCounts?.set(listener, count - 1);
17080 else suspendCounts?.delete(listener);
17081 if (!suspendCounts?.size) delete group.suspendCounts;
17082 }
17083 }
17084 };
17085 const storeSync = (keys, listener) => {
17086 runInitialListener(syncListenerGroup, listener, state);
17087 return registerListener(keys, listener);
17088 };
17089 const storeBatch = (keys, listener) => {
17090 if (!batchListenerGroup.listeners.size && !inDispatch) prevStateBatch = state;
17091 runInitialListener(batchListenerGroup, listener, prevStateBatch);
17092 return registerListener(keys, listener, batchListenerGroup);
17093 };
17094 const storePick = (keys) => createStore(pick(state, keys), finalStore);
17095 const storeOmit = (keys) => createStore(omit(state, keys), finalStore);
17096 const getState = () => state;
17097 const runListeners = (group, prevState, updatedKey) => {
17098 if (!(updatedKey instanceof Set) && !group.allKeysListeners?.size) {
17099 const keyedListeners = group.listenersByKey?.get(updatedKey);
17100 if (!keyedListeners) return;
17101 const frame = {
17102 group,
17103 keyedListeners,
17104 updatedKey,
17105 currentListener: null
17106 };
17107 fastPathFrames.push(frame);
17108 try {
17109 for (const listener of keyedListeners) {
17110 if (frame.notifiedListeners?.has(listener)) continue;
17111 frame.currentListener = listener;
17112 frame.notifiedListeners?.add(listener);
17113 notifyStoreListener(group, listener, state, prevState, getState, updatedKey);
17114 if (!group.allKeysListeners?.size && !frame.recoverToLive) continue;
17115 const notifiedListeners = frame.notifiedListeners ?? getFastPathNotifiedListeners(frame);
17116 frame.notifiedListeners = notifiedListeners;
17117 frame.recovering = true;
17118 runLiveListeners({
17119 group,
17120 getState,
17121 prevState,
17122 updatedKey,
17123 notifiedListeners
17124 });
17125 return;
17126 }
17127 } finally {
17128 fastPathFrames.pop();
17129 }
17130 return;
17131 }
17132 runLiveListeners({
17133 group,
17134 getState,
17135 prevState,
17136 updatedKey
17137 });
17138 };
17139 const setState = (key, value, fromStores = false) => {
17140 if (!hasOwnProperty(state, key)) return;
17141 const currentValue = state[key];
17142 const nextValue = typeof value === "function" ? value(currentValue) : value;
17143 if (isSameValue(nextValue, currentValue)) return;
17144 const wasInDispatch = inDispatch;
17145 inDispatch = true;
17146 const prevState = state;
17147 const nextState = {
17148 ...state,
17149 [key]: nextValue
17150 };
17151 state = nextState;
17152 let superseded = false;
17153 try {
17154 if (!fromStores && stores.length) {
17155 for (const store of stores) {
17156 store?.setState?.(key, nextValue);
17157 if (isSameValue(state[key], nextValue)) continue;
17158 superseded = true;
17159 break;
17160 }
17161 if (superseded) {
17162 let pass = 0;
17163 for (; pass < MAX_REPAIR_PASSES; pass += 1) {
17164 let changed = false;
17165 for (const store of stores) {
17166 const previousValue = state[key];
17167 store?.setState?.(key, previousValue);
17168 if (!isSameValue(state[key], previousValue)) changed = true;
17169 }
17170 if (!changed) break;
17171 }
17172 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.");
17173 }
17174 }
17175 if (!superseded) runListeners(syncListenerGroup, state === nextState ? prevState : {
17176 ...state,
17177 [key]: prevState[key]
17178 }, key);
17179 } finally {
17180 inDispatch = wasInDispatch;
17181 }
17182 if (!batchListenerGroup.listeners.size) {
17183 if (!inDispatch) prevStateBatch = state;
17184 return;
17185 }
17186 updatedKeys.add(key);
17187 if (batchPending) return;
17188 batchPending = true;
17189 queueMicrotask(() => {
17190 batchPending = false;
17191 const snapshot = state;
17192 const updatedKeysSnapshot = updatedKeys;
17193 updatedKeys = /* @__PURE__ */ new Set();
17194 const prevStateBatchBefore = prevStateBatch;
17195 runListeners(batchListenerGroup, prevStateBatchBefore, updatedKeysSnapshot);
17196 if (prevStateBatch === prevStateBatchBefore) prevStateBatch = snapshot;
17197 });
17198 };
17199 const finalStore = {
17200 getState,
17201 setState,
17202 __unstableInternals: {
17203 setup: storeSetup,
17204 init: storeInit,
17205 subscribe: storeSubscribe,
17206 sync: storeSync,
17207 batch: storeBatch,
17208 pick: storePick,
17209 omit: storeOmit
17210 }
17211 };
17212 return finalStore;
17213 }
17214 function setup(store, ...args) {
17215 if (!store) return;
17216 return getInternal(store, "setup")(...args);
17217 }
17218 function init(store, ...args) {
17219 if (!store) return;
17220 return getInternal(store, "init")(...args);
17221 }
17222 function subscribe(store, ...args) {
17223 if (!store) return;
17224 return getInternal(store, "subscribe")(...args);
17225 }
17226 function sync(store, ...args) {
17227 if (!store) return;
17228 return getInternal(store, "sync")(...args);
17229 }
17230 function batch(store, ...args) {
17231 if (!store) return;
17232 return getInternal(store, "batch")(...args);
17233 }
17234 function omit2(store, ...args) {
17235 if (!store) return;
17236 return getInternal(store, "omit")(...args);
17237 }
17238 function pick2(store, ...args) {
17239 if (!store) return;
17240 return getInternal(store, "pick")(...args);
17241 }
17242 function mergeStore(...stores) {
17243 const initialState = {};
17244 for (const store2 of stores) {
17245 const nextState = store2?.getState?.();
17246 if (nextState) Object.assign(initialState, nextState);
17247 }
17248 const store = createStore(initialState, ...stores);
17249 return Object.assign({}, ...stores, store);
17250 }
17251 function throwOnConflictingProps(props, store) {
17252 if (false) return;
17253 if (!store) return;
17254 const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => {
17255 const stateKey = key.replace("default", "");
17256 return `${stateKey[0]?.toLowerCase() || ""}${stateKey.slice(1)}`;
17257 });
17258 if (!defaultKeys.length) return;
17259 const storeState = store.getState();
17260 if (!defaultKeys.filter((key) => hasOwnProperty(storeState, key)).length) return;
17261 throw new Error(`Passing a store prop in conjunction with a default state is not supported.
17262
17263 const store = useSelectStore();
17264 <SelectProvider store={store} defaultValue="Apple" />
17265 ^ ^
17266
17267 Instead, pass the default state to the topmost store:
17268
17269 const store = useSelectStore({ defaultValue: "Apple" });
17270 <SelectProvider store={store} />
17271
17272 See https://github.com/ariakit/ariakit/pull/2745 for more details.
17273
17274 If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit
17275 `);
17276 }
17277
17278 // node_modules/@ariakit/components/dist/collection/collection-store.js
17279 function getCommonParent(items) {
17280 const firstItem = items.find((item) => !!item.element);
17281 const lastElement = [...items].reverse().find((item) => !!item.element)?.element;
17282 let parentElement = firstItem?.element?.parentElement;
17283 if (!lastElement) return getDocument(parentElement).body;
17284 while (parentElement) {
17285 if (parentElement.contains(lastElement)) return parentElement;
17286 parentElement = parentElement.parentElement;
17287 }
17288 return getDocument(parentElement).body;
17289 }
17290 function getPrivateStore(store) {
17291 return store?.__unstablePrivateStore;
17292 }
17293 function createCollectionStore(props = {}) {
17294 throwOnConflictingProps(props, props.store);
17295 const syncState = props.store?.getState();
17296 const items = defaultValue(props.items, syncState?.items, props.defaultItems, []);
17297 const itemsMap = new Map(items.map((item) => [item.id, item]));
17298 const initialState = {
17299 items,
17300 renderedItems: defaultValue(syncState?.renderedItems, [])
17301 };
17302 const syncPrivateStore = getPrivateStore(props.store);
17303 const privateStore = createStore({
17304 items,
17305 renderedItems: initialState.renderedItems
17306 }, syncPrivateStore);
17307 const collection = createStore(initialState, props.store);
17308 const sortItems = (renderedItems) => {
17309 const sortedItems = sortBasedOnDOMPosition(renderedItems, (i2) => i2.element);
17310 privateStore.setState("renderedItems", sortedItems);
17311 collection.setState("renderedItems", sortedItems);
17312 };
17313 setup(collection, () => init(privateStore));
17314 setup(privateStore, () => {
17315 return batch(privateStore, ["items"], (state) => {
17316 collection.setState("items", state.items);
17317 });
17318 });
17319 setup(privateStore, () => {
17320 return batch(privateStore, ["renderedItems"], (state) => {
17321 let firstRun = true;
17322 let raf = requestAnimationFrame(() => {
17323 const { renderedItems } = collection.getState();
17324 if (state.renderedItems === renderedItems) return;
17325 sortItems(state.renderedItems);
17326 });
17327 if (typeof IntersectionObserver !== "function") return () => cancelAnimationFrame(raf);
17328 const ioCallback = () => {
17329 if (firstRun) {
17330 firstRun = false;
17331 return;
17332 }
17333 cancelAnimationFrame(raf);
17334 raf = requestAnimationFrame(() => sortItems(state.renderedItems));
17335 };
17336 const root = getCommonParent(state.renderedItems);
17337 const observer = new IntersectionObserver(ioCallback, { root });
17338 for (const item of state.renderedItems) {
17339 if (!item.element) continue;
17340 observer.observe(item.element);
17341 }
17342 return () => {
17343 cancelAnimationFrame(raf);
17344 observer.disconnect();
17345 };
17346 });
17347 });
17348 const mergeItem = (item, setItems, canDeleteFromMap = false) => {
17349 let prevItem;
17350 setItems((items2) => {
17351 const index2 = items2.findIndex(({ id }) => id === item.id);
17352 const nextItems = items2.slice();
17353 if (index2 !== -1) {
17354 prevItem = items2[index2];
17355 const nextItem = {
17356 ...prevItem,
17357 ...item
17358 };
17359 nextItems[index2] = nextItem;
17360 itemsMap.set(item.id, nextItem);
17361 } else {
17362 nextItems.push(item);
17363 itemsMap.set(item.id, item);
17364 }
17365 return nextItems;
17366 });
17367 const unmergeItem = () => {
17368 setItems((items2) => {
17369 if (!prevItem) {
17370 if (canDeleteFromMap) itemsMap.delete(item.id);
17371 return items2.filter(({ id }) => id !== item.id);
17372 }
17373 const index2 = items2.findIndex(({ id }) => id === item.id);
17374 if (index2 === -1) return items2;
17375 const nextItems = items2.slice();
17376 nextItems[index2] = prevItem;
17377 itemsMap.set(item.id, prevItem);
17378 return nextItems;
17379 });
17380 };
17381 return unmergeItem;
17382 };
17383 const registerItem = (item) => mergeItem(item, (getItems) => privateStore.setState("items", getItems), true);
17384 return {
17385 ...collection,
17386 registerItem,
17387 renderItem: (item) => chain(registerItem(item), mergeItem(item, (getItems) => privateStore.setState("renderedItems", getItems))),
17388 item: (id) => {
17389 if (!id) return null;
17390 let item = itemsMap.get(id);
17391 if (!item) {
17392 const { items: items2 } = privateStore.getState();
17393 item = items2.find((item2) => item2.id === id);
17394 if (item) itemsMap.set(id, item);
17395 }
17396 return item || null;
17397 },
17398 __unstablePrivateStore: privateStore
17399 };
17400 }
17401
17402 // node_modules/@ariakit/components/dist/composite/composite-store.js
17403 var NULL_ITEM = { id: null };
17404 function findFirstEnabledItem(items, excludeId) {
17405 return items.find((item) => {
17406 if (excludeId) return !item.disabled && item.id !== excludeId;
17407 return !item.disabled;
17408 });
17409 }
17410 function getEnabledItems(items, excludeId) {
17411 return items.filter((item) => {
17412 if (excludeId) return !item.disabled && item.id !== excludeId;
17413 return !item.disabled;
17414 });
17415 }
17416 function getItemsInRow(items, rowId) {
17417 return items.filter((item) => item.rowId === rowId);
17418 }
17419 function findEnabledItemId({ items, fromIndex, step, rowId, excludeId }) {
17420 for (let i2 = fromIndex; i2 >= 0 && i2 < items.length; i2 += step) {
17421 const item = items[i2];
17422 if (!item) continue;
17423 if (item.rowId !== rowId) continue;
17424 if (item.disabled) continue;
17425 if (excludeId != null && item.id === excludeId) continue;
17426 return item.id;
17427 }
17428 }
17429 function flipItems(items, activeId, shouldInsertNullItem = false) {
17430 const index2 = items.findIndex((item) => item.id === activeId);
17431 return [
17432 ...items.slice(index2 + 1),
17433 ...shouldInsertNullItem ? [NULL_ITEM] : [],
17434 ...items.slice(0, index2)
17435 ];
17436 }
17437 function groupItemsByRows(items) {
17438 const rows = [];
17439 for (const item of items) {
17440 const row = rows.find((currentRow) => currentRow[0]?.rowId === item.rowId);
17441 if (row) row.push(item);
17442 else rows.push([item]);
17443 }
17444 return rows;
17445 }
17446 function getMaxRowLength(array) {
17447 let maxLength = 0;
17448 for (const { length } of array) if (length > maxLength) maxLength = length;
17449 return maxLength;
17450 }
17451 function createEmptyItem(rowId) {
17452 return {
17453 id: "__EMPTY_ITEM__",
17454 disabled: true,
17455 rowId
17456 };
17457 }
17458 function normalizeRows(rows, activeId, focusShift) {
17459 const maxLength = getMaxRowLength(rows);
17460 for (const row of rows) for (let i2 = 0; i2 < maxLength; i2 += 1) {
17461 const item = row[i2];
17462 if (!item || focusShift && item.disabled) {
17463 const previousItem = i2 === 0 && focusShift ? findFirstEnabledItem(row) : row[i2 - 1];
17464 row[i2] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem?.rowId);
17465 }
17466 }
17467 return rows;
17468 }
17469 function verticalizeItems(items) {
17470 const rows = groupItemsByRows(items);
17471 const maxLength = getMaxRowLength(rows);
17472 const verticalized = [];
17473 for (let i2 = 0; i2 < maxLength; i2 += 1) for (const row of rows) {
17474 const item = row[i2];
17475 if (item) verticalized.push({
17476 ...item,
17477 rowId: item.rowId ? `${i2}` : void 0
17478 });
17479 }
17480 return verticalized;
17481 }
17482 function createCompositeStore(props = {}) {
17483 const syncState = props.store?.getState();
17484 const collection = createCollectionStore(props);
17485 const activeId = defaultValue(props.activeId, syncState?.activeId, props.defaultActiveId);
17486 const composite = createStore({
17487 ...collection.getState(),
17488 id: defaultValue(props.id, syncState?.id) ?? `id-${Math.random().toString(36).slice(2, 8)}`,
17489 activeId,
17490 baseElement: defaultValue(syncState?.baseElement, null),
17491 includesBaseElement: defaultValue(props.includesBaseElement, syncState?.includesBaseElement, activeId === null),
17492 moves: defaultValue(syncState?.moves, 0),
17493 orientation: defaultValue(props.orientation, syncState?.orientation, "both"),
17494 rtl: defaultValue(props.rtl, syncState?.rtl, false),
17495 virtualFocus: defaultValue(props.virtualFocus, syncState?.virtualFocus, false),
17496 focusLoop: defaultValue(props.focusLoop, syncState?.focusLoop, false),
17497 focusWrap: defaultValue(props.focusWrap, syncState?.focusWrap, false),
17498 focusShift: defaultValue(props.focusShift, syncState?.focusShift, false)
17499 }, collection, props.store);
17500 setup(composite, () => sync(composite, ["renderedItems", "activeId"], (state) => {
17501 composite.setState("activeId", (activeId2) => {
17502 if (activeId2 !== void 0) return activeId2;
17503 return findFirstEnabledItem(state.renderedItems)?.id;
17504 });
17505 }));
17506 const getNextId = (direction = "next", options = {}) => {
17507 const defaultState = composite.getState();
17508 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;
17509 const isVerticalDirection = direction === "up" || direction === "down";
17510 const isNextDirection = direction === "next" || direction === "down";
17511 const canReverse = isNextDirection ? rtl && !isVerticalDirection : !rtl || isVerticalDirection;
17512 const canShift = focusShift && !skip;
17513 if (!skip && !focusWrap && !includesBaseElement && activeId2 != null) {
17514 if (!isVerticalDirection ? true : !canShift && !renderedItems.some((item) => item.rowId != null)) {
17515 const activeIndex2 = renderedItems.findIndex((item) => item.id === activeId2);
17516 const activeItem2 = renderedItems[activeIndex2];
17517 if (activeItem2) {
17518 const step = canReverse ? -1 : 1;
17519 const nextId = findEnabledItemId({
17520 items: renderedItems,
17521 fromIndex: activeIndex2 + step,
17522 step,
17523 rowId: activeItem2.rowId,
17524 excludeId: activeId2
17525 });
17526 if (nextId !== void 0) return nextId;
17527 if (!(focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical"))) return void 0;
17528 return findEnabledItemId({
17529 items: renderedItems,
17530 fromIndex: step === 1 ? 0 : renderedItems.length - 1,
17531 step,
17532 rowId: activeItem2.rowId,
17533 excludeId: activeId2
17534 });
17535 }
17536 }
17537 }
17538 let items = !isVerticalDirection ? renderedItems : flatten2DArray(normalizeRows(groupItemsByRows(renderedItems), activeId2, canShift));
17539 items = canReverse ? reverseArray(items) : items;
17540 items = isVerticalDirection ? verticalizeItems(items) : items;
17541 if (activeId2 == null) return findFirstEnabledItem(items)?.id;
17542 const activeItem = items.find((item) => item.id === activeId2);
17543 if (!activeItem) return findFirstEnabledItem(items)?.id;
17544 const isGrid2 = items.some((item) => item.rowId);
17545 const activeIndex = items.indexOf(activeItem);
17546 const nextItems = items.slice(activeIndex + 1);
17547 const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId);
17548 if (skip) {
17549 const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2);
17550 return (nextEnabledItemsInRow.slice(skip)[0] || nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1])?.id;
17551 }
17552 const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical");
17553 const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical");
17554 const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false;
17555 if (canLoop) return findFirstEnabledItem(flipItems(canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId), activeId2, hasNullItem), activeId2)?.id;
17556 if (canWrap) {
17557 const nextItem2 = findFirstEnabledItem(hasNullItem ? nextItemsInRow : nextItems, activeId2);
17558 return hasNullItem ? nextItem2?.id || null : nextItem2?.id;
17559 }
17560 const nextItem = findFirstEnabledItem(nextItemsInRow, activeId2);
17561 if (!nextItem && hasNullItem) return null;
17562 return nextItem?.id;
17563 };
17564 const getNextIdFromOptions = (direction, options) => {
17565 if (typeof options === "number") return getNextId(direction, { skip: options });
17566 return getNextId(direction, options);
17567 };
17568 return {
17569 ...collection,
17570 ...composite,
17571 setBaseElement: (element) => composite.setState("baseElement", element),
17572 setActiveId: (id) => composite.setState("activeId", id),
17573 move: (id) => {
17574 if (id === void 0) return;
17575 composite.setState("activeId", id);
17576 composite.setState("moves", (moves) => moves + 1);
17577 },
17578 first: () => findFirstEnabledItem(composite.getState().renderedItems)?.id,
17579 last: () => findFirstEnabledItem(reverseArray(composite.getState().renderedItems))?.id,
17580 next: (options) => getNextIdFromOptions("next", options),
17581 previous: (options) => getNextIdFromOptions("previous", options),
17582 down: (options) => getNextIdFromOptions("down", options),
17583 up: (options) => getNextIdFromOptions("up", options)
17584 };
17585 }
17586
17587 // node_modules/@ariakit/react-components/dist/composite/utils.js
17588 var findFirstEnabledItem2 = findFirstEnabledItem;
17589 var groupItemsByRows2 = groupItemsByRows;
17590 function getEnabledItem(store, id) {
17591 if (!id) return null;
17592 return store.item(id) || null;
17593 }
17594 function selectTextField(element, collapseToEnd = false) {
17595 if (isTextField(element)) element.setSelectionRange(collapseToEnd ? element.value.length : 0, element.value.length);
17596 else if (element.isContentEditable) {
17597 const selection = getDocument(element).getSelection();
17598 selection?.selectAllChildren(element);
17599 if (collapseToEnd) selection?.collapseToEnd();
17600 }
17601 }
17602 var FOCUS_SILENTLY = /* @__PURE__ */ Symbol("FOCUS_SILENTLY");
17603 function focusSilently(element) {
17604 element[FOCUS_SILENTLY] = true;
17605 element.focus({ preventScroll: true });
17606 }
17607 function silentlyFocused(element) {
17608 const isSilentlyFocused = element[FOCUS_SILENTLY];
17609 delete element[FOCUS_SILENTLY];
17610 return isSilentlyFocused;
17611 }
17612 function isItem(store, element, exclude) {
17613 if (!element) return false;
17614 if (element === exclude) return false;
17615 const item = store.item(element.id);
17616 if (!item) return false;
17617 if (exclude && item.element === exclude) return false;
17618 return true;
17619 }
17620
17621 // node_modules/@ariakit/react-components/dist/composite/composite-item.js
17622 var import_react17 = __toESM(require_react(), 1);
17623 var import_jsx_runtime72 = __toESM(require_jsx_runtime(), 1);
17624
17625 // node_modules/@ariakit/react-store/dist/index.js
17626 var React48 = __toESM(require_react(), 1);
17627 var import_shim2 = __toESM(require_shim(), 1);
17628 var noopSubscribe = () => () => {
17629 };
17630 function useStoreState(store, keyOrSelector = identity) {
17631 const storeSubscribe = React48.useCallback((callback) => {
17632 if (!store) return noopSubscribe();
17633 return subscribe(store, null, callback);
17634 }, [store]);
17635 const getSnapshot = () => {
17636 const key = typeof keyOrSelector === "string" ? keyOrSelector : null;
17637 const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null;
17638 const state = store?.getState();
17639 if (selector2) return selector2(state);
17640 if (!state) return;
17641 if (!key) return;
17642 if (!hasOwnProperty(state, key)) return;
17643 return state[key];
17644 };
17645 return (0, import_shim2.useSyncExternalStore)(storeSubscribe, getSnapshot, getSnapshot);
17646 }
17647 function useStoreStateObject(store, object) {
17648 const objRef = React48.useRef({});
17649 const storeSubscribe = React48.useCallback((callback) => {
17650 if (!store) return noopSubscribe();
17651 return subscribe(store, null, callback);
17652 }, [store]);
17653 const getSnapshot = () => {
17654 const state = store?.getState();
17655 let updated = false;
17656 const obj = objRef.current;
17657 for (const prop in object) {
17658 const keyOrSelector = object[prop];
17659 if (typeof keyOrSelector === "function") {
17660 const value = keyOrSelector(state);
17661 if (!Object.is(value, obj[prop])) {
17662 obj[prop] = value;
17663 updated = true;
17664 }
17665 }
17666 if (typeof keyOrSelector === "string") {
17667 if (!state) continue;
17668 if (!hasOwnProperty(state, keyOrSelector)) continue;
17669 const value = state[keyOrSelector];
17670 if (!Object.is(value, obj[prop])) {
17671 obj[prop] = value;
17672 updated = true;
17673 }
17674 }
17675 }
17676 if (updated) objRef.current = { ...obj };
17677 return objRef.current;
17678 };
17679 return (0, import_shim2.useSyncExternalStore)(storeSubscribe, getSnapshot, getSnapshot);
17680 }
17681 function useStoreProps(store, props, key, setKey) {
17682 const value = hasOwnProperty(props, key) ? props[key] : void 0;
17683 const propsRef = useLiveRef({
17684 value,
17685 setValue: setKey ? props[setKey] : void 0
17686 });
17687 useSafeLayoutEffect(() => {
17688 return sync(store, [key], (state, prev) => {
17689 const { value: value2, setValue } = propsRef.current;
17690 if (!setValue) return;
17691 if (state[key] === prev[key]) return;
17692 if (state[key] === value2) return;
17693 setValue(state[key]);
17694 });
17695 }, [store, key]);
17696 useSafeLayoutEffect(() => {
17697 if (value === void 0) return;
17698 store.setState(key, value);
17699 return batch(store, [key], () => {
17700 if (value === void 0) return;
17701 store.setState(key, value);
17702 });
17703 });
17704 }
17705 function useStore2(createStore2, props) {
17706 const [store, setStore] = React48.useState(() => createStore2(props));
17707 useSafeLayoutEffect(() => init(store), [store]);
17708 const useState37 = React48.useCallback((keyOrSelector) => useStoreState(store, keyOrSelector), [store]);
17709 return [React48.useMemo(() => ({
17710 ...store,
17711 useState: useState37
17712 }), [store, useState37]), useEvent(() => {
17713 setStore((store2) => createStore2({
17714 ...props,
17715 ...store2.getState()
17716 }));
17717 })];
17718 }
17719
17720 // node_modules/@ariakit/react-components/dist/composite/composite-item.js
17721 var TagName4 = "button";
17722 function isEditableElement(element) {
17723 if (isTextbox(element)) return true;
17724 return element.tagName === "INPUT" && !isButton(element);
17725 }
17726 function getNextPageOffset(scrollingElement, pageUp = false) {
17727 const height = scrollingElement.clientHeight;
17728 const { top } = scrollingElement.getBoundingClientRect();
17729 const pageSize = Math.max(height * 0.875, height - 40) * 1.5;
17730 const pageOffset = pageUp ? height - pageSize + top : pageSize + top;
17731 if (scrollingElement.tagName === "HTML") return pageOffset + scrollingElement.scrollTop;
17732 return pageOffset;
17733 }
17734 function getItemOffset(itemElement, pageUp = false) {
17735 const { top } = itemElement.getBoundingClientRect();
17736 if (pageUp) return top + itemElement.clientHeight;
17737 return top;
17738 }
17739 function findNextPageItemId(element, store, next, pageUp = false) {
17740 if (!store) return;
17741 if (!next) return;
17742 const { renderedItems } = store.getState();
17743 const scrollingElement = getScrollingElement(element);
17744 if (!scrollingElement) return;
17745 const nextPageOffset = getNextPageOffset(scrollingElement, pageUp);
17746 let id;
17747 let prevDifference;
17748 for (let i2 = 0; i2 < renderedItems.length; i2 += 1) {
17749 const previousId = id;
17750 id = next(i2);
17751 if (!id) break;
17752 if (id === previousId) continue;
17753 const itemElement = getEnabledItem(store, id)?.element;
17754 if (!itemElement) continue;
17755 const difference = getItemOffset(itemElement, pageUp) - nextPageOffset;
17756 const absDifference = Math.abs(difference);
17757 if (pageUp && difference <= 0 || !pageUp && difference >= 0) {
17758 if (prevDifference !== void 0 && prevDifference < absDifference) id = previousId;
17759 break;
17760 }
17761 prevDifference = absDifference;
17762 }
17763 return id;
17764 }
17765 function targetIsAnotherItem(event, store) {
17766 if (isSelfTarget(event)) return false;
17767 return isItem(store, event.target);
17768 }
17769 var useCompositeItem = createHook(function useCompositeItem2({ store, rowId: rowIdProp, preventScrollOnKeyDown = false, moveOnKeyPress = true, tabbable: tabbable2 = false, getItem: getItemProp, "aria-setsize": ariaSetSizeProp, "aria-posinset": ariaPosInSetProp, ...props }) {
17770 const context = useCompositeScopedContext();
17771 store = store || context;
17772 const id = useId4(props.id);
17773 const ref = (0, import_react17.useRef)(null);
17774 const row = (0, import_react17.useContext)(CompositeRowContext);
17775 const trulyDisabled = disabledFromProps(props) && !props.accessibleWhenDisabled;
17776 const shouldRegisterItem = props.shouldRegisterItem;
17777 const getRowId = (state) => {
17778 if (rowIdProp) return rowIdProp;
17779 if (!state) return;
17780 if (!row?.baseElement) return;
17781 if (row.baseElement !== state.baseElement) return;
17782 return row.id;
17783 };
17784 const { rowId, baseElement, isActiveItem, ariaSetSize, ariaPosInSet, isTabbable } = useStoreStateObject(store, {
17785 rowId: getRowId,
17786 baseElement(state) {
17787 return state?.baseElement || void 0;
17788 },
17789 isActiveItem(state) {
17790 return !!state && state.activeId === id;
17791 },
17792 ariaSetSize(state) {
17793 if (ariaSetSizeProp != null) return ariaSetSizeProp;
17794 if (!state) return;
17795 if (!row?.ariaSetSize) return;
17796 if (row.baseElement !== state.baseElement) return;
17797 return row.ariaSetSize;
17798 },
17799 ariaPosInSet(state) {
17800 if (ariaPosInSetProp != null) return ariaPosInSetProp;
17801 if (!state) return;
17802 if (!row?.ariaPosInSet) return;
17803 if (row.baseElement !== state.baseElement) return;
17804 const rowId2 = getRowId(state);
17805 const itemsInRow = state.renderedItems.filter((item) => item.rowId === rowId2);
17806 return row.ariaPosInSet + itemsInRow.findIndex((item) => item.id === id);
17807 },
17808 isTabbable(state) {
17809 if (!state?.renderedItems.length) return true;
17810 if (state.virtualFocus) return false;
17811 if (tabbable2) return true;
17812 if (state.activeId === null) return false;
17813 const item = store?.item(state.activeId);
17814 if (item?.disabled) return true;
17815 if (!item?.element) return true;
17816 return state.activeId === id;
17817 }
17818 });
17819 const getItem = (0, import_react17.useCallback)((item) => {
17820 const nextItem = {
17821 ...item,
17822 id: id || item.id,
17823 rowId,
17824 disabled: trulyDisabled,
17825 children: item.element?.textContent
17826 };
17827 if (getItemProp) return getItemProp(nextItem);
17828 return nextItem;
17829 }, [
17830 id,
17831 rowId,
17832 trulyDisabled,
17833 getItemProp
17834 ]);
17835 const onFocusProp = props.onFocus;
17836 const hasFocusedComposite = (0, import_react17.useRef)(false);
17837 const cancelScheduledFocusRedirectRef = (0, import_react17.useRef)(null);
17838 const onFocus = useEvent((event) => {
17839 onFocusProp?.(event);
17840 if (event.defaultPrevented) return;
17841 if (isPortalEvent(event)) return;
17842 if (!id) return;
17843 if (!store) return;
17844 if (targetIsAnotherItem(event, store)) return;
17845 const { virtualFocus, baseElement: baseElement2 } = store.getState();
17846 store.setActiveId(id);
17847 if (isTextbox(event.currentTarget)) selectTextField(event.currentTarget);
17848 if (!virtualFocus) return;
17849 if (!isSelfTarget(event)) return;
17850 if (isEditableElement(event.currentTarget)) return;
17851 const redirectFocusToBaseElement = (currentTarget2, relatedTarget2, baseElement3) => {
17852 if (isSafari() && currentTarget2.hasAttribute("data-autofocus")) currentTarget2.scrollIntoView({
17853 block: "nearest",
17854 inline: "nearest"
17855 });
17856 hasFocusedComposite.current = true;
17857 if (relatedTarget2 === baseElement3 || isItem(store, relatedTarget2)) focusSilently(baseElement3);
17858 else baseElement3.focus();
17859 };
17860 if (baseElement2?.isConnected) {
17861 redirectFocusToBaseElement(event.currentTarget, event.relatedTarget, baseElement2);
17862 return;
17863 }
17864 if (shouldRegisterItem === false) return;
17865 const { currentTarget, relatedTarget } = event;
17866 const cancelScheduledFocusRedirect = () => {
17867 cancelScheduledFocusRedirectRef.current?.();
17868 cancelScheduledFocusRedirectRef.current = null;
17869 };
17870 cancelScheduledFocusRedirect();
17871 cancelScheduledFocusRedirectRef.current = subscribe(store, null, () => {
17872 if (getActiveElement(currentTarget) !== currentTarget) {
17873 cancelScheduledFocusRedirect();
17874 return;
17875 }
17876 const state = store.getState();
17877 const nextBaseElement = state.baseElement;
17878 if (!nextBaseElement?.isConnected) return;
17879 cancelScheduledFocusRedirect();
17880 if (!state.virtualFocus) return;
17881 redirectFocusToBaseElement(currentTarget, relatedTarget, nextBaseElement);
17882 });
17883 });
17884 const onBlurCaptureProp = props.onBlurCapture;
17885 const onBlurCapture = useEvent((event) => {
17886 onBlurCaptureProp?.(event);
17887 if (event.defaultPrevented) return;
17888 if (store?.getState()?.virtualFocus && hasFocusedComposite.current) {
17889 hasFocusedComposite.current = false;
17890 event.preventDefault();
17891 event.stopPropagation();
17892 }
17893 });
17894 const onKeyDownProp = props.onKeyDown;
17895 const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown);
17896 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
17897 const onKeyDown = useEvent((event) => {
17898 onKeyDownProp?.(event);
17899 if (event.defaultPrevented) return;
17900 if (!isSelfTarget(event)) return;
17901 if (!store) return;
17902 const { currentTarget } = event;
17903 const state = store.getState();
17904 const isGrid2 = !!store.item(id)?.rowId;
17905 const isVertical = state.orientation !== "horizontal";
17906 const isHorizontal = state.orientation !== "vertical";
17907 const canHomeEnd = () => {
17908 if (isGrid2) return true;
17909 if (isHorizontal) return true;
17910 if (!state.baseElement) return true;
17911 if (!isTextField(state.baseElement)) return true;
17912 return false;
17913 };
17914 const action = {
17915 ArrowUp: (isGrid2 || isVertical) && store.up,
17916 ArrowRight: (isGrid2 || isHorizontal) && store.next,
17917 ArrowDown: (isGrid2 || isVertical) && store.down,
17918 ArrowLeft: (isGrid2 || isHorizontal) && store.previous,
17919 Home: () => {
17920 if (!canHomeEnd()) return;
17921 if (!isGrid2 || event.ctrlKey) return store?.first();
17922 return store?.previous(-1);
17923 },
17924 End: () => {
17925 if (!canHomeEnd()) return;
17926 if (!isGrid2 || event.ctrlKey) return store?.last();
17927 return store?.next(-1);
17928 },
17929 PageUp: () => {
17930 return findNextPageItemId(currentTarget, store, store?.up, true);
17931 },
17932 PageDown: () => {
17933 return findNextPageItemId(currentTarget, store, store?.down);
17934 }
17935 }[event.key];
17936 if (action) {
17937 if (isTextbox(currentTarget)) {
17938 const selection = getTextboxSelection(currentTarget);
17939 const isLeft = isHorizontal && event.key === "ArrowLeft";
17940 const isRight = isHorizontal && event.key === "ArrowRight";
17941 const isUp = isVertical && event.key === "ArrowUp";
17942 const isDown = isVertical && event.key === "ArrowDown";
17943 if (isRight || isDown) {
17944 const { length: valueLength } = getTextboxValue(currentTarget);
17945 if (selection.end !== valueLength) return;
17946 } else if ((isLeft || isUp) && selection.start !== 0) return;
17947 }
17948 const nextId = action();
17949 if (preventScrollOnKeyDownProp(event) || nextId !== void 0) {
17950 if (!moveOnKeyPressProp(event)) return;
17951 event.preventDefault();
17952 store.move(nextId);
17953 }
17954 }
17955 });
17956 const providerValue = (0, import_react17.useMemo)(() => ({
17957 id,
17958 baseElement
17959 }), [id, baseElement]);
17960 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(CompositeItemContext.Provider, {
17961 value: providerValue,
17962 children: element
17963 }), [providerValue]);
17964 props = {
17965 "data-active-item": isActiveItem || void 0,
17966 ...props,
17967 id,
17968 ref: useMergeRefs(ref, props.ref),
17969 tabIndex: isTabbable ? props.tabIndex : -1,
17970 onFocus,
17971 onBlurCapture,
17972 onKeyDown
17973 };
17974 props = useCommand(props);
17975 props = useCollectionItem({
17976 store,
17977 ...props,
17978 getItem,
17979 shouldRegisterItem: id ? shouldRegisterItem : false
17980 });
17981 return removeUndefinedValues({
17982 ...props,
17983 "aria-setsize": ariaSetSize,
17984 "aria-posinset": ariaPosInSet
17985 });
17986 });
17987 var CompositeItem = memo3(forwardRef30(function CompositeItem2(props) {
17988 return createElement3(TagName4, useCompositeItem(props));
17989 }));
17990
17991 // node_modules/@ariakit/react-components/dist/composite/composite.js
17992 var import_react18 = __toESM(require_react(), 1);
17993 var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
17994 var TagName5 = "div";
17995 function isGrid(items) {
17996 return items.some((item) => !!item.rowId);
17997 }
17998 function isPrintableKey(event) {
17999 const target = event.target;
18000 if (target && !isTextField(target)) return false;
18001 return event.key.length === 1 && !event.ctrlKey && !event.metaKey;
18002 }
18003 function isModifierKey(event) {
18004 return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta";
18005 }
18006 function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) {
18007 return useEvent((event) => {
18008 onKeyboardEvent?.(event);
18009 if (event.defaultPrevented) return;
18010 if (event.isPropagationStopped()) return;
18011 if (!isSelfTarget(event)) return;
18012 if (isModifierKey(event)) return;
18013 if (isPrintableKey(event)) return;
18014 const activeElement2 = getEnabledItem(store, store.getState().activeId)?.element;
18015 if (!activeElement2) return;
18016 const { view, ...eventInit } = event;
18017 if (activeElement2 !== previousElementRef?.current) activeElement2.focus();
18018 if (!fireKeyboardEvent(activeElement2, event.type, eventInit)) event.preventDefault();
18019 if (event.currentTarget.contains(activeElement2)) event.stopPropagation();
18020 });
18021 }
18022 function findFirstEnabledItemInTheLastRow(items) {
18023 return findFirstEnabledItem2(flatten2DArray(reverseArray(groupItemsByRows2(items))));
18024 }
18025 function withBaseScrollPreserved(store, callback) {
18026 const { virtualFocus, baseElement } = store.getState();
18027 if (!virtualFocus || !baseElement || !isTextField(baseElement)) {
18028 callback();
18029 return;
18030 }
18031 const savedScrollLeft = baseElement.scrollLeft;
18032 const savedScrollTop = baseElement.scrollTop;
18033 callback();
18034 baseElement.scrollLeft = savedScrollLeft;
18035 baseElement.scrollTop = savedScrollTop;
18036 }
18037 function useScheduleFocus(store) {
18038 const [scheduled, setScheduled] = (0, import_react18.useState)(false);
18039 const schedule = (0, import_react18.useCallback)(() => setScheduled(true), []);
18040 const activeItem = useStoreState(store, (state) => scheduled ? getEnabledItem(store, state.activeId) : null);
18041 (0, import_react18.useEffect)(() => {
18042 const activeElement2 = activeItem?.element;
18043 if (!scheduled) return;
18044 if (!activeElement2) return;
18045 setScheduled(false);
18046 withBaseScrollPreserved(store, () => {
18047 activeElement2.focus({ preventScroll: true });
18048 });
18049 }, [
18050 store,
18051 activeItem,
18052 scheduled
18053 ]);
18054 return schedule;
18055 }
18056 var CompositeFocusOnMove = memo3(function CompositeFocusOnMove2({ store, focusOnMove, previousElementRef }) {
18057 const moves = useStoreState(store, "moves");
18058 const baseElement = useStoreState(store, "baseElement");
18059 (0, import_react18.useEffect)(() => {
18060 if (!moves) return;
18061 if (!focusOnMove) return;
18062 const { activeId } = store.getState();
18063 const itemElement = getEnabledItem(store, activeId)?.element;
18064 if (!itemElement) return;
18065 withBaseScrollPreserved(store, () => focusIntoView(itemElement));
18066 }, [
18067 store,
18068 moves,
18069 focusOnMove
18070 ]);
18071 useSafeLayoutEffect(() => {
18072 if (!moves) return;
18073 if (!baseElement) return;
18074 const { activeId } = store.getState();
18075 if (!(activeId === null)) return;
18076 const previousElement = previousElementRef.current;
18077 previousElementRef.current = null;
18078 if (previousElement) fireBlurEvent(previousElement, { relatedTarget: baseElement });
18079 if (!hasFocus(baseElement)) baseElement.focus();
18080 }, [
18081 store,
18082 moves,
18083 baseElement
18084 ]);
18085 return null;
18086 });
18087 var useComposite = createHook(function useComposite2({ store, composite = true, focusOnMove = composite, moveOnKeyPress = true, ...props }) {
18088 const context = useCompositeProviderContext();
18089 store = store || context;
18090 invariant(store, "Composite must receive a `store` prop or be wrapped in a CompositeProvider component.");
18091 const ref = (0, import_react18.useRef)(null);
18092 const previousElementRef = (0, import_react18.useRef)(null);
18093 const scheduleFocus = useScheduleFocus(store);
18094 const [, setBaseElement] = useTransactionState(composite ? store.setBaseElement : null);
18095 const virtualFocus = useStoreState(store, "virtualFocus");
18096 const activeId = useStoreState(store, (state) => state.virtualFocus ? state.activeId : null);
18097 useSafeLayoutEffect(() => {
18098 if (!store) return;
18099 if (!composite) return;
18100 if (!virtualFocus) return;
18101 const previousElement = previousElementRef.current;
18102 previousElementRef.current = null;
18103 if (!previousElement) return;
18104 const relatedTarget = getEnabledItem(store, activeId)?.element || getActiveElement(previousElement);
18105 if (relatedTarget === previousElement) return;
18106 fireBlurEvent(previousElement, { relatedTarget });
18107 }, [
18108 store,
18109 activeId,
18110 virtualFocus,
18111 composite
18112 ]);
18113 const onKeyDownCapture = useKeyboardEventProxy(store, props.onKeyDownCapture, previousElementRef);
18114 const onKeyUpCapture = useKeyboardEventProxy(store, props.onKeyUpCapture, previousElementRef);
18115 const onFocusCaptureProp = props.onFocusCapture;
18116 const onFocusCapture = useEvent((event) => {
18117 onFocusCaptureProp?.(event);
18118 if (event.defaultPrevented) return;
18119 if (!store) return;
18120 const { virtualFocus: virtualFocus2 } = store.getState();
18121 if (!virtualFocus2) return;
18122 const previousActiveElement = event.relatedTarget;
18123 const isSilentlyFocused = silentlyFocused(event.currentTarget);
18124 if (isSelfTarget(event) && isSilentlyFocused) {
18125 event.stopPropagation();
18126 previousElementRef.current = previousActiveElement;
18127 }
18128 });
18129 const onFocusProp = props.onFocus;
18130 const onFocus = useEvent((event) => {
18131 onFocusProp?.(event);
18132 if (event.defaultPrevented) return;
18133 if (!composite) return;
18134 if (!store) return;
18135 const { relatedTarget } = event;
18136 const { virtualFocus: virtualFocus2 } = store.getState();
18137 if (virtualFocus2) {
18138 if (isSelfTarget(event) && !isItem(store, relatedTarget)) queueMicrotask(scheduleFocus);
18139 } else if (isSelfTarget(event)) store.setActiveId(null);
18140 });
18141 const onBlurCaptureProp = props.onBlurCapture;
18142 const onBlurCapture = useEvent((event) => {
18143 onBlurCaptureProp?.(event);
18144 if (event.defaultPrevented) return;
18145 if (!store) return;
18146 const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState();
18147 if (!virtualFocus2) return;
18148 const activeElement2 = getEnabledItem(store, activeId2)?.element;
18149 const nextActiveElement = event.relatedTarget;
18150 const nextActiveElementIsItem = isItem(store, nextActiveElement);
18151 const previousElement = previousElementRef.current;
18152 previousElementRef.current = null;
18153 if (isSelfTarget(event) && nextActiveElementIsItem) {
18154 if (nextActiveElement === activeElement2) {
18155 if (previousElement && previousElement !== nextActiveElement) fireBlurEvent(previousElement, event);
18156 } else if (activeElement2) fireBlurEvent(activeElement2, event);
18157 else if (previousElement) fireBlurEvent(previousElement, event);
18158 event.stopPropagation();
18159 } else if (!isItem(store, event.target) && activeElement2) fireBlurEvent(activeElement2, event);
18160 });
18161 const onKeyDownProp = props.onKeyDown;
18162 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
18163 const onKeyDown = useEvent((event) => {
18164 onKeyDownProp?.(event);
18165 if (event.nativeEvent.isComposing) return;
18166 if (event.defaultPrevented) return;
18167 if (!store) return;
18168 if (!isSelfTarget(event)) return;
18169 const { orientation, renderedItems, activeId: activeId2, rtl } = store.getState();
18170 if (getEnabledItem(store, activeId2)?.element?.isConnected) return;
18171 const isVertical = orientation !== "horizontal";
18172 const isHorizontal = orientation !== "vertical";
18173 const grid = isGrid(renderedItems);
18174 if ((event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End") && isTextField(event.currentTarget)) return;
18175 const up = () => {
18176 if (grid) return findFirstEnabledItemInTheLastRow(renderedItems)?.id;
18177 return store?.last();
18178 };
18179 const action = {
18180 ArrowUp: (grid || isVertical) && up,
18181 ArrowRight: (grid || isHorizontal) && (rtl ? store.last : store.first),
18182 ArrowDown: (grid || isVertical) && store.first,
18183 ArrowLeft: (grid || isHorizontal) && (rtl ? store.first : store.last),
18184 Home: store.first,
18185 End: store.last,
18186 PageUp: store.first,
18187 PageDown: store.last
18188 }[event.key];
18189 if (action) {
18190 const id = action();
18191 if (id !== void 0) {
18192 if (!moveOnKeyPressProp(event)) return;
18193 event.preventDefault();
18194 store.move(id);
18195 }
18196 }
18197 });
18198 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(CompositeScopedContextProvider, {
18199 value: store,
18200 children: [element, composite && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(CompositeFocusOnMove, {
18201 store,
18202 focusOnMove,
18203 previousElementRef
18204 })]
18205 }), [
18206 store,
18207 composite,
18208 focusOnMove
18209 ]);
18210 props = {
18211 "aria-activedescendant": useStoreState(store, (state) => {
18212 if (!store) return;
18213 if (!composite) return;
18214 if (!state.virtualFocus) return;
18215 return getEnabledItem(store, state.activeId)?.id;
18216 }),
18217 ...props,
18218 ref: useMergeRefs(ref, setBaseElement, props.ref),
18219 onKeyDownCapture,
18220 onKeyUpCapture,
18221 onFocusCapture,
18222 onFocus,
18223 onBlurCapture,
18224 onKeyDown
18225 };
18226 props = useFocusable({
18227 focusable: useStoreState(store, (state) => composite && (state.virtualFocus || state.activeId === null)),
18228 ...props
18229 });
18230 return props;
18231 });
18232 var Composite6 = forwardRef30(function Composite7(props) {
18233 return createElement3(TagName5, useComposite(props));
18234 });
18235
18236 // node_modules/@ariakit/react-components/dist/disclosure/disclosure-context.js
18237 var ctx3 = createStoreContext();
18238 var useDisclosureContext = ctx3.useContext;
18239 var useDisclosureScopedContext = ctx3.useScopedContext;
18240 var useDisclosureProviderContext = ctx3.useProviderContext;
18241 var DisclosureContextProvider = ctx3.ContextProvider;
18242 var DisclosureScopedContextProvider = ctx3.ScopedContextProvider;
18243
18244 // node_modules/@ariakit/react-components/dist/dialog/dialog-context.js
18245 var import_react19 = __toESM(require_react(), 1);
18246 var ctx4 = createStoreContext([DisclosureContextProvider], [DisclosureScopedContextProvider]);
18247 var useDialogContext = ctx4.useContext;
18248 var useDialogScopedContext = ctx4.useScopedContext;
18249 var useDialogProviderContext = ctx4.useProviderContext;
18250 var DialogContextProvider = ctx4.ContextProvider;
18251 var DialogScopedContextProvider = ctx4.ScopedContextProvider;
18252 var DialogHeadingContext = (0, import_react19.createContext)(void 0);
18253 var DialogDescriptionContext = (0, import_react19.createContext)(void 0);
18254
18255 // node_modules/@ariakit/react-components/dist/disclosure/disclosure-content.js
18256 var import_react20 = __toESM(require_react(), 1);
18257 var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
18258 var import_react_dom4 = __toESM(require_react_dom(), 1);
18259 var TagName6 = "div";
18260 function afterTimeout(timeoutMs, cb) {
18261 const timeoutId = setTimeout(cb, timeoutMs);
18262 return () => clearTimeout(timeoutId);
18263 }
18264 function parseCSSTime(time) {
18265 const value = time?.trim() || "0s";
18266 const multiplier = value.endsWith("ms") ? 1 : 1e3;
18267 const parsed = Number.parseFloat(value) * multiplier;
18268 return Number.isNaN(parsed) ? 0 : parsed;
18269 }
18270 function getEndTime(names, delays, durations) {
18271 const nameList = names.split(",");
18272 const delayList = delays.split(",");
18273 const durationList = durations.split(",");
18274 let endTime = 0;
18275 for (const [index2, name] of nameList.entries()) {
18276 if (name.trim() === "none") continue;
18277 const delay = parseCSSTime(delayList[index2 % delayList.length]);
18278 const duration = parseCSSTime(durationList[index2 % durationList.length]);
18279 endTime = Math.max(endTime, delay + duration);
18280 }
18281 return endTime;
18282 }
18283 function getElementEndTime(element) {
18284 const { transitionProperty, transitionDuration, transitionDelay, animationName, animationDuration, animationDelay } = getComputedStyle(element);
18285 return Math.max(getEndTime(transitionProperty, transitionDelay, transitionDuration), getEndTime(animationName, animationDelay, animationDuration));
18286 }
18287 function isHidden(mounted, hidden, alwaysVisible) {
18288 return !alwaysVisible && hidden !== false && (!mounted || !!hidden);
18289 }
18290 var useDisclosureContent = createHook(function useDisclosureContent2({ store, alwaysVisible, unstable_otherElementRef: otherElementRef, ...props }) {
18291 const context = useDisclosureProviderContext();
18292 store = store || context;
18293 invariant(store, "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component.");
18294 const ref = (0, import_react20.useRef)(null);
18295 const id = useId4(props.id);
18296 const [transition, setTransition] = (0, import_react20.useState)(null);
18297 const open = useStoreState(store, "open");
18298 const mounted = useStoreState(store, "mounted");
18299 const animated = useStoreState(store, "animated");
18300 const contentElement = useStoreState(store, "contentElement");
18301 const otherElement = useStoreState(store.disclosure, "contentElement");
18302 const hasClosedRef = (0, import_react20.useRef)(false);
18303 useSafeLayoutEffect(() => {
18304 if (!ref.current) return;
18305 store?.setContentElement(ref.current);
18306 }, [store]);
18307 useSafeLayoutEffect(() => {
18308 let previousAnimated;
18309 store?.setState("animated", (animated2) => {
18310 previousAnimated = animated2;
18311 return true;
18312 });
18313 return () => {
18314 if (previousAnimated === void 0) return;
18315 store?.setState("animated", previousAnimated);
18316 };
18317 }, [store]);
18318 useSafeLayoutEffect(() => {
18319 if (!animated) {
18320 if (!open) {
18321 hasClosedRef.current = true;
18322 setTransition(null);
18323 } else if (hasClosedRef.current) {
18324 hasClosedRef.current = false;
18325 setTransition("enter");
18326 }
18327 return;
18328 }
18329 if (!contentElement?.isConnected) {
18330 setTransition(null);
18331 return;
18332 }
18333 return afterPaint(() => {
18334 setTransition(open ? "enter" : mounted ? "leave" : null);
18335 });
18336 }, [
18337 animated,
18338 contentElement,
18339 open,
18340 mounted
18341 ]);
18342 useSafeLayoutEffect(() => {
18343 if (!store) return;
18344 if (!animated) return;
18345 if (!transition) return;
18346 if (!contentElement) return;
18347 const stopAnimation = () => store?.setState("animating", false);
18348 const stopAnimationSync = () => (0, import_react_dom4.flushSync)(stopAnimation);
18349 if (transition === "leave" && open) return;
18350 if (transition === "enter" && !open) return;
18351 if (typeof animated === "number") return afterTimeout(animated, stopAnimationSync);
18352 const elements = [contentElement];
18353 if (otherElement) elements.push(otherElement);
18354 const relatedElement = otherElementRef?.current;
18355 if (relatedElement) elements.push(relatedElement);
18356 const timeout = Math.max(...elements.map(getElementEndTime));
18357 if (!timeout) {
18358 if (transition === "enter") store.setState("animated", false);
18359 stopAnimation();
18360 return;
18361 }
18362 return afterTimeout(Math.max(timeout - 1e3 / 60, 0), stopAnimationSync);
18363 }, [
18364 store,
18365 animated,
18366 contentElement,
18367 otherElement,
18368 otherElementRef,
18369 open,
18370 transition
18371 ]);
18372 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(DialogScopedContextProvider, {
18373 value: store,
18374 children: element
18375 }), [store]);
18376 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
18377 const styleProp = props.style;
18378 const style = (0, import_react20.useMemo)(() => {
18379 if (hidden) return {
18380 ...styleProp,
18381 display: "none"
18382 };
18383 return styleProp;
18384 }, [hidden, styleProp]);
18385 props = {
18386 "data-open": open || void 0,
18387 "data-enter": transition === "enter" || void 0,
18388 "data-leave": transition === "leave" || void 0,
18389 hidden,
18390 ...props,
18391 id,
18392 ref: useMergeRefs(id ? store.setContentElement : null, ref, props.ref),
18393 style
18394 };
18395 return removeUndefinedValues(props);
18396 });
18397 var DisclosureContentImpl = forwardRef30(function DisclosureContentImpl2(props) {
18398 return createElement3(TagName6, useDisclosureContent(props));
18399 });
18400 var DisclosureContent = forwardRef30(function DisclosureContent2({ unmountOnHide, ...props }) {
18401 const context = useDisclosureProviderContext();
18402 if (useStoreState(props.store || context, (state) => !unmountOnHide || state?.mounted) === false) return null;
18403 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(DisclosureContentImpl, { ...props });
18404 });
18405
18406 // node_modules/@ariakit/components/dist/disclosure/disclosure-store.js
18407 function createDisclosureStore(props = {}) {
18408 const store = mergeStore(props.store, omit2(props.disclosure, ["contentElement", "disclosureElement"]));
18409 throwOnConflictingProps(props, store);
18410 const syncState = store?.getState();
18411 const open = defaultValue(props.open, syncState?.open, props.defaultOpen, false);
18412 const animated = defaultValue(props.animated, syncState?.animated, false);
18413 const disclosure = createStore({
18414 open,
18415 animated,
18416 animating: !!animated && open,
18417 mounted: open,
18418 contentElement: defaultValue(syncState?.contentElement, null),
18419 disclosureElement: defaultValue(syncState?.disclosureElement, null)
18420 }, store);
18421 setup(disclosure, () => sync(disclosure, ["animated", "animating"], (state) => {
18422 if (state.animated) return;
18423 disclosure.setState("animating", false);
18424 }));
18425 setup(disclosure, () => subscribe(disclosure, ["open"], () => {
18426 if (!disclosure.getState().animated) return;
18427 disclosure.setState("animating", true);
18428 }));
18429 setup(disclosure, () => sync(disclosure, ["open", "animating"], (state) => {
18430 disclosure.setState("mounted", state.open || state.animating);
18431 }));
18432 return {
18433 ...disclosure,
18434 disclosure: props.disclosure,
18435 setOpen: (value) => disclosure.setState("open", value),
18436 show: () => disclosure.setState("open", true),
18437 hide: () => disclosure.setState("open", false),
18438 toggle: () => disclosure.setState("open", (open2) => !open2),
18439 stopAnimation: () => disclosure.setState("animating", false),
18440 setContentElement: (value) => disclosure.setState("contentElement", value),
18441 setDisclosureElement: (value) => disclosure.setState("disclosureElement", value)
18442 };
18443 }
18444
18445 // node_modules/@ariakit/react-components/dist/disclosure/disclosure-store.js
18446 function useDisclosureStoreProps(store, update2, props) {
18447 useUpdateEffect(update2, [props.store, props.disclosure]);
18448 useStoreProps(store, props, "open", "setOpen");
18449 useStoreProps(store, props, "mounted", "setMounted");
18450 useStoreProps(store, props, "animated");
18451 return Object.assign(store, { disclosure: props.disclosure });
18452 }
18453
18454 // node_modules/@ariakit/react-components/dist/popover/popover-context.js
18455 var ctx5 = createStoreContext([DialogContextProvider], [DialogScopedContextProvider]);
18456 var usePopoverContext = ctx5.useContext;
18457 var usePopoverScopedContext = ctx5.useScopedContext;
18458 var usePopoverProviderContext = ctx5.useProviderContext;
18459 var PopoverContextProvider = ctx5.ContextProvider;
18460 var PopoverScopedContextProvider = ctx5.ScopedContextProvider;
18461
18462 // node_modules/@ariakit/react-components/dist/combobox/combobox-context.js
18463 var import_react21 = __toESM(require_react(), 1);
18464 var ComboboxListRoleContext = (0, import_react21.createContext)(void 0);
18465 var ctx6 = createStoreContext([PopoverContextProvider, CompositeContextProvider], [PopoverScopedContextProvider, CompositeScopedContextProvider]);
18466 var useComboboxContext = ctx6.useContext;
18467 var useComboboxScopedContext = ctx6.useScopedContext;
18468 var useComboboxProviderContext = ctx6.useProviderContext;
18469 var ComboboxContextProvider = ctx6.ContextProvider;
18470 var ComboboxScopedContextProvider = ctx6.ScopedContextProvider;
18471 var ComboboxItemValueContext = (0, import_react21.createContext)(void 0);
18472 var ComboboxItemCheckedContext = (0, import_react21.createContext)(false);
18473
18474 // node_modules/@ariakit/react-components/dist/collection/collection-store.js
18475 function useCollectionStoreProps(store, update2, props) {
18476 useUpdateEffect(update2, [props.store]);
18477 useStoreProps(store, props, "items", "setItems");
18478 return store;
18479 }
18480
18481 // node_modules/@ariakit/react-components/dist/composite/composite-store.js
18482 function useCompositeStoreOptions(props) {
18483 return {
18484 id: useId4(props.id),
18485 ...props
18486 };
18487 }
18488 function useCompositeStoreProps(store, update2, props) {
18489 store = useCollectionStoreProps(store, update2, props);
18490 useStoreProps(store, props, "activeId", "setActiveId");
18491 useStoreProps(store, props, "includesBaseElement");
18492 useStoreProps(store, props, "virtualFocus");
18493 useStoreProps(store, props, "orientation");
18494 useStoreProps(store, props, "rtl");
18495 useStoreProps(store, props, "focusLoop");
18496 useStoreProps(store, props, "focusWrap");
18497 useStoreProps(store, props, "focusShift");
18498 return store;
18499 }
18500
18501 // node_modules/@ariakit/components/dist/dialog/dialog-store.js
18502 function createDialogStore(props = {}) {
18503 return createDisclosureStore(props);
18504 }
18505
18506 // node_modules/@ariakit/react-components/dist/dialog/dialog-store.js
18507 function useDialogStoreProps(store, update2, props) {
18508 return useDisclosureStoreProps(store, update2, props);
18509 }
18510
18511 // node_modules/@ariakit/components/dist/popover/popover-store.js
18512 function createPopoverStore({ popover: otherPopover, ...props } = {}) {
18513 const store = mergeStore(props.store, omit2(otherPopover, [
18514 "arrowElement",
18515 "anchorElement",
18516 "contentElement",
18517 "popoverElement",
18518 "disclosureElement"
18519 ]));
18520 throwOnConflictingProps(props, store);
18521 const syncState = store?.getState();
18522 const dialog = createDialogStore({
18523 ...props,
18524 store
18525 });
18526 const placement = defaultValue(props.placement, syncState?.placement, "bottom");
18527 const popover = createStore({
18528 ...dialog.getState(),
18529 placement,
18530 currentPlacement: placement,
18531 anchorElement: defaultValue(syncState?.anchorElement, null),
18532 popoverElement: defaultValue(syncState?.popoverElement, null),
18533 arrowElement: defaultValue(syncState?.arrowElement, null),
18534 rendered: /* @__PURE__ */ Symbol("rendered")
18535 }, dialog, store);
18536 return {
18537 ...dialog,
18538 ...popover,
18539 setAnchorElement: (element) => popover.setState("anchorElement", element),
18540 setPopoverElement: (element) => popover.setState("popoverElement", element),
18541 setArrowElement: (element) => popover.setState("arrowElement", element),
18542 render: () => popover.setState("rendered", /* @__PURE__ */ Symbol("rendered"))
18543 };
18544 }
18545
18546 // node_modules/@ariakit/react-components/dist/popover/popover-store.js
18547 function usePopoverStoreProps(store, update2, props) {
18548 useUpdateEffect(update2, [props.popover]);
18549 useStoreProps(store, props, "placement");
18550 return useDialogStoreProps(store, update2, props);
18551 }
18552
18553 // node_modules/@ariakit/react-components/dist/popover/popover-anchor.js
18554 var TagName7 = "div";
18555 var usePopoverAnchor = createHook(function usePopoverAnchor2({ store, ...props }) {
18556 const context = usePopoverProviderContext();
18557 store = store || context;
18558 props = {
18559 ...props,
18560 ref: useMergeRefs(store?.setAnchorElement, props.ref)
18561 };
18562 return props;
18563 });
18564 var PopoverAnchor = forwardRef30(function PopoverAnchor2(props) {
18565 return createElement3(TagName7, usePopoverAnchor(props));
18566 });
18567
18568 // node_modules/@ariakit/react-components/dist/composite/composite-hover.js
18569 var import_react22 = __toESM(require_react(), 1);
18570 var TagName8 = "div";
18571 function hoveringInside(event) {
18572 const nextElement = event.relatedTarget;
18573 if (!isElement2(nextElement)) return false;
18574 return contains2(event.currentTarget, nextElement);
18575 }
18576 var symbol2 = /* @__PURE__ */ Symbol("composite-hover");
18577 function movingToAnotherItem(event) {
18578 const { relatedTarget } = event;
18579 if (!isElement2(relatedTarget)) return false;
18580 let dest = relatedTarget;
18581 do {
18582 if (hasOwnProperty(dest, symbol2) && dest[symbol2]) return true;
18583 dest = dest.parentElement;
18584 } while (dest);
18585 return false;
18586 }
18587 var useCompositeHover = createHook(function useCompositeHover2({ store, focusOnHover = true, blurOnHoverEnd = !!focusOnHover, ...props }) {
18588 const context = useCompositeScopedContext();
18589 store = store || context;
18590 invariant(store, "CompositeHover must be wrapped in a Composite component.");
18591 const isMouseMoving = useIsMouseMoving();
18592 const onMouseMoveProp = props.onMouseMove;
18593 const focusOnHoverProp = useBooleanEvent(focusOnHover);
18594 const onMouseMove = useEvent((event) => {
18595 onMouseMoveProp?.(event);
18596 if (event.defaultPrevented) return;
18597 if (!isMouseMoving()) return;
18598 if (!focusOnHoverProp(event)) return;
18599 if (!hasFocusWithin(event.currentTarget)) {
18600 const baseElement = store?.getState().baseElement;
18601 if (baseElement && !hasFocus(baseElement)) baseElement.focus();
18602 }
18603 store?.setActiveId(event.currentTarget.id);
18604 });
18605 const onMouseLeaveProp = props.onMouseLeave;
18606 const blurOnHoverEndProp = useBooleanEvent(blurOnHoverEnd);
18607 const onMouseLeave = useEvent((event) => {
18608 onMouseLeaveProp?.(event);
18609 if (event.defaultPrevented) return;
18610 if (!isMouseMoving()) return;
18611 if (hoveringInside(event)) return;
18612 if (movingToAnotherItem(event)) return;
18613 if (!focusOnHoverProp(event)) return;
18614 if (!blurOnHoverEndProp(event)) return;
18615 store?.setActiveId(null);
18616 store?.getState().baseElement?.focus();
18617 });
18618 const ref = (0, import_react22.useCallback)((element) => {
18619 if (!element) return;
18620 element[symbol2] = true;
18621 }, []);
18622 props = {
18623 ...props,
18624 ref: useMergeRefs(ref, props.ref),
18625 onMouseMove,
18626 onMouseLeave
18627 };
18628 return removeUndefinedValues(props);
18629 });
18630 var CompositeHover = memo3(forwardRef30(function CompositeHover2(props) {
18631 return createElement3(TagName8, useCompositeHover(props));
18632 }));
18633
18634 // node_modules/@ariakit/react-components/dist/combobox/combobox.js
18635 var import_react23 = __toESM(require_react(), 1);
18636 var TagName9 = "input";
18637 function isFirstItemAutoSelected(items, activeValue, autoSelect) {
18638 if (!autoSelect) return false;
18639 return items.find((item) => !item.disabled && item.value)?.value === activeValue;
18640 }
18641 function hasCompletionString(value, activeValue) {
18642 if (!activeValue) return false;
18643 if (value == null) return false;
18644 const normalizedValue = normalizeString(value);
18645 const normalizedActiveValue = normalizeString(activeValue);
18646 if (normalizedValue.length !== value.length) return false;
18647 if (normalizedActiveValue.length !== activeValue.length) return false;
18648 return normalizedActiveValue.length > normalizedValue.length && normalizedActiveValue.toLowerCase().startsWith(normalizedValue.toLowerCase());
18649 }
18650 function isAriaAutoCompleteValue(value) {
18651 return value === "inline" || value === "list" || value === "both" || value === "none";
18652 }
18653 function getDefaultAutoSelectId(items) {
18654 return items.find((item) => {
18655 if (item.disabled) return false;
18656 return item.element?.getAttribute("role") !== "tab";
18657 })?.id;
18658 }
18659 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 }) {
18660 const context = useComboboxProviderContext();
18661 store = store || context;
18662 invariant(store, "Combobox must receive a `store` prop or be wrapped in a ComboboxProvider component.");
18663 const ref = (0, import_react23.useRef)(null);
18664 const [valueUpdated, forceValueUpdate] = useForceUpdate();
18665 const canAutoSelectRef = (0, import_react23.useRef)(false);
18666 const composingRef = (0, import_react23.useRef)(false);
18667 const autoSelect = useStoreState(store, (state) => state.virtualFocus && autoSelectProp);
18668 const inline4 = autoComplete === "inline" || autoComplete === "both";
18669 const [canInline, setCanInline] = (0, import_react23.useState)(inline4);
18670 useUpdateLayoutEffect(() => {
18671 if (!inline4) return;
18672 setCanInline(true);
18673 }, [inline4]);
18674 const storeValue = useStoreState(store, "value");
18675 const prevSelectedValueRef = (0, import_react23.useRef)(void 0);
18676 (0, import_react23.useEffect)(() => {
18677 return sync(store, ["selectedValue", "activeId"], (_, prev) => {
18678 prevSelectedValueRef.current = prev.selectedValue;
18679 });
18680 }, [store]);
18681 const inlineActiveValue = useStoreState(store, (state) => {
18682 if (!inline4) return;
18683 if (!canInline) return;
18684 if (state.activeValue && Array.isArray(state.selectedValue)) {
18685 if (state.selectedValue.includes(state.activeValue)) return;
18686 if (prevSelectedValueRef.current?.includes(state.activeValue)) return;
18687 }
18688 return state.activeValue;
18689 });
18690 const items = useStoreState(store, "renderedItems");
18691 const open = useStoreState(store, "open");
18692 const contentElement = useStoreState(store, "contentElement");
18693 const value = (0, import_react23.useMemo)(() => {
18694 if (!inline4) return storeValue;
18695 if (!canInline) return storeValue;
18696 if (isFirstItemAutoSelected(items, inlineActiveValue, autoSelect)) {
18697 if (hasCompletionString(storeValue, inlineActiveValue)) return storeValue + (inlineActiveValue?.slice(storeValue.length) || "");
18698 return storeValue;
18699 }
18700 return inlineActiveValue || storeValue;
18701 }, [
18702 inline4,
18703 canInline,
18704 items,
18705 inlineActiveValue,
18706 autoSelect,
18707 storeValue
18708 ]);
18709 (0, import_react23.useEffect)(() => {
18710 const element = ref.current;
18711 if (!element) return;
18712 const onCompositeItemMove = () => setCanInline(true);
18713 element.addEventListener("combobox-item-move", onCompositeItemMove);
18714 return () => {
18715 element.removeEventListener("combobox-item-move", onCompositeItemMove);
18716 };
18717 }, []);
18718 (0, import_react23.useEffect)(() => {
18719 if (!inline4) return;
18720 if (!canInline) return;
18721 if (!inlineActiveValue) return;
18722 if (!isFirstItemAutoSelected(items, inlineActiveValue, autoSelect)) return;
18723 if (!hasCompletionString(storeValue, inlineActiveValue)) return;
18724 let cleanup = noop4;
18725 queueMicrotask(() => {
18726 const element = ref.current;
18727 if (!element) return;
18728 const { start: prevStart, end: prevEnd } = getTextboxSelection(element);
18729 const nextStart = storeValue.length;
18730 const nextEnd = inlineActiveValue.length;
18731 setSelectionRange(element, nextStart, nextEnd);
18732 cleanup = () => {
18733 if (!hasFocus(element)) return;
18734 const { start, end } = getTextboxSelection(element);
18735 if (start !== nextStart) return;
18736 if (end !== nextEnd) return;
18737 setSelectionRange(element, prevStart, prevEnd);
18738 };
18739 });
18740 return () => cleanup();
18741 }, [
18742 valueUpdated,
18743 inline4,
18744 canInline,
18745 inlineActiveValue,
18746 items,
18747 autoSelect,
18748 storeValue
18749 ]);
18750 const getAutoSelectIdProp = useEvent(getAutoSelectId);
18751 const autoSelectIdRef = (0, import_react23.useRef)(null);
18752 const autoSelectMovedRef = (0, import_react23.useRef)(void 0);
18753 const userScrolledRef = (0, import_react23.useRef)(false);
18754 const isAutoScrollingRef = (0, import_react23.useRef)(false);
18755 (0, import_react23.useEffect)(() => {
18756 if (!open) return;
18757 if (!contentElement) return;
18758 const scrollingElement = getScrollingElement(contentElement);
18759 if (!scrollingElement) return;
18760 const onUserScroll = () => {
18761 canAutoSelectRef.current = false;
18762 userScrolledRef.current = true;
18763 };
18764 const onScroll = () => {
18765 if (!isAutoScrollingRef.current) userScrolledRef.current = true;
18766 if (!store) return;
18767 if (!canAutoSelectRef.current) return;
18768 const { activeId } = store.getState();
18769 if (activeId === null) return;
18770 if (activeId === autoSelectIdRef.current) return;
18771 canAutoSelectRef.current = false;
18772 };
18773 const options = {
18774 passive: true,
18775 capture: true
18776 };
18777 scrollingElement.addEventListener("wheel", onUserScroll, options);
18778 scrollingElement.addEventListener("touchmove", onUserScroll, options);
18779 scrollingElement.addEventListener("scroll", onScroll, options);
18780 return () => {
18781 scrollingElement.removeEventListener("wheel", onUserScroll, true);
18782 scrollingElement.removeEventListener("touchmove", onUserScroll, true);
18783 scrollingElement.removeEventListener("scroll", onScroll, true);
18784 };
18785 }, [
18786 open,
18787 contentElement,
18788 store
18789 ]);
18790 useSafeLayoutEffect(() => {
18791 userScrolledRef.current = false;
18792 if (!storeValue) return;
18793 if (composingRef.current) return;
18794 canAutoSelectRef.current = true;
18795 }, [storeValue]);
18796 useSafeLayoutEffect(() => {
18797 if (autoSelect !== "always" && open) return;
18798 canAutoSelectRef.current = open;
18799 }, [autoSelect, open]);
18800 useSafeLayoutEffect(() => {
18801 if (open) return;
18802 autoSelectMovedRef.current = void 0;
18803 }, [open]);
18804 const resetValueOnSelect = useStoreState(store, "resetValueOnSelect");
18805 useUpdateEffect(() => {
18806 const canAutoSelect = canAutoSelectRef.current;
18807 if (!store) return;
18808 if (!open) return;
18809 if (!canAutoSelect && (!resetValueOnSelect || userScrolledRef.current)) return;
18810 const { baseElement, contentElement: contentElement2, activeId } = store.getState();
18811 if (baseElement && !hasFocus(baseElement)) return;
18812 if (contentElement2?.hasAttribute("data-placing")) {
18813 const observer = new MutationObserver(forceValueUpdate);
18814 observer.observe(contentElement2, { attributeFilter: ["data-placing"] });
18815 return () => observer.disconnect();
18816 }
18817 if (autoSelect && canAutoSelect) {
18818 const userAutoSelectId = getAutoSelectIdProp(items);
18819 const autoSelectId = userAutoSelectId !== void 0 ? userAutoSelectId : getDefaultAutoSelectId(items) ?? store.first();
18820 autoSelectIdRef.current = autoSelectId;
18821 const nextActiveId = autoSelectId ?? null;
18822 const nextActiveValue = store.item(nextActiveId)?.value;
18823 const moved = autoSelectMovedRef.current;
18824 if (nextActiveId !== activeId || moved?.id !== nextActiveId || moved?.value !== nextActiveValue) {
18825 autoSelectMovedRef.current = {
18826 id: nextActiveId,
18827 value: nextActiveValue
18828 };
18829 store.move(nextActiveId);
18830 } else store.setState("activeValue", nextActiveValue);
18831 } else {
18832 const element = store.item(activeId || store.first())?.element;
18833 if (element && "scrollIntoView" in element) {
18834 isAutoScrollingRef.current = true;
18835 element.scrollIntoView({
18836 block: "nearest",
18837 inline: "nearest"
18838 });
18839 requestAnimationFrame(() => {
18840 isAutoScrollingRef.current = false;
18841 });
18842 }
18843 }
18844 }, [
18845 store,
18846 open,
18847 valueUpdated,
18848 storeValue,
18849 autoSelect,
18850 resetValueOnSelect,
18851 getAutoSelectIdProp,
18852 items
18853 ]);
18854 (0, import_react23.useEffect)(() => {
18855 if (!inline4) return;
18856 const combobox = ref.current;
18857 if (!combobox) return;
18858 const elements = [combobox, contentElement].filter((value2) => !!value2);
18859 const onBlur2 = (event) => {
18860 if (elements.every((el) => isFocusEventOutside(event, el))) store?.setValue(value);
18861 };
18862 for (const element of elements) element.addEventListener("focusout", onBlur2);
18863 return () => {
18864 for (const element of elements) element.removeEventListener("focusout", onBlur2);
18865 };
18866 }, [
18867 inline4,
18868 contentElement,
18869 store,
18870 value
18871 ]);
18872 const canShow = (event) => {
18873 return event.currentTarget.value.length >= showMinLength;
18874 };
18875 const onChangeProp = props.onChange;
18876 const showOnChangeProp = useBooleanEvent(showOnChange ?? canShow);
18877 const setValueOnChangeProp = useBooleanEvent(setValueOnChange ?? !store.tag);
18878 const onChange = useEvent((event) => {
18879 onChangeProp?.(event);
18880 if (event.defaultPrevented) return;
18881 if (!store) return;
18882 const currentTarget = event.currentTarget;
18883 const { value: value2, selectionStart, selectionEnd } = currentTarget;
18884 const nativeEvent = event.nativeEvent;
18885 canAutoSelectRef.current = true;
18886 if (isInputEvent(nativeEvent)) {
18887 if (nativeEvent.isComposing) {
18888 canAutoSelectRef.current = false;
18889 composingRef.current = true;
18890 }
18891 if (inline4) {
18892 const textInserted = nativeEvent.inputType === "insertText" || nativeEvent.inputType === "insertCompositionText";
18893 const caretAtEnd = selectionStart === value2.length;
18894 setCanInline(textInserted && caretAtEnd);
18895 }
18896 }
18897 if (setValueOnChangeProp(event)) {
18898 const isSameValue2 = value2 === store.getState().value;
18899 store.setValue(value2);
18900 queueMicrotask(() => {
18901 setSelectionRange(currentTarget, selectionStart, selectionEnd);
18902 });
18903 if (inline4 && autoSelect && isSameValue2) forceValueUpdate();
18904 }
18905 if (showOnChangeProp(event)) store.show();
18906 if (!autoSelect || !canAutoSelectRef.current) store.setActiveId(null);
18907 });
18908 const onCompositionEndProp = props.onCompositionEnd;
18909 const onCompositionEnd = useEvent((event) => {
18910 canAutoSelectRef.current = true;
18911 composingRef.current = false;
18912 onCompositionEndProp?.(event);
18913 if (event.defaultPrevented) return;
18914 if (!autoSelect) return;
18915 forceValueUpdate();
18916 });
18917 const onMouseDownProp = props.onMouseDown;
18918 const blurActiveItemOnClickProp = useBooleanEvent(blurActiveItemOnClick ?? (() => store.getState().includesBaseElement));
18919 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
18920 const showOnClickProp = useBooleanEvent(showOnClick ?? canShow);
18921 const onMouseDown = useEvent((event) => {
18922 onMouseDownProp?.(event);
18923 if (event.defaultPrevented) return;
18924 if (event.button) return;
18925 if (event.ctrlKey) return;
18926 if (!store) return;
18927 if (blurActiveItemOnClickProp(event)) store.setActiveId(null);
18928 if (setValueOnClickProp(event)) store.setValue(value);
18929 if (showOnClickProp(event)) queueBeforeEvent(event.currentTarget, "mouseup", store.show);
18930 });
18931 const onKeyDownProp = props.onKeyDown;
18932 const showOnKeyPressProp = useBooleanEvent(showOnKeyPress ?? canShow);
18933 const onKeyDown = useEvent((event) => {
18934 onKeyDownProp?.(event);
18935 if (!event.repeat) canAutoSelectRef.current = false;
18936 if (event.defaultPrevented) return;
18937 if (!store) return;
18938 const { open: open2 } = store.getState();
18939 if (open2 && event.key === "Enter") {
18940 event.preventDefault();
18941 return;
18942 }
18943 if (event.ctrlKey) return;
18944 if (event.altKey) return;
18945 if (event.shiftKey) return;
18946 if (event.metaKey) return;
18947 if (open2) return;
18948 if (event.key === "ArrowUp" || event.key === "ArrowDown") {
18949 if (showOnKeyPressProp(event)) {
18950 event.preventDefault();
18951 store.show();
18952 }
18953 }
18954 });
18955 const onBlurProp = props.onBlur;
18956 const onBlur = useEvent((event) => {
18957 canAutoSelectRef.current = false;
18958 onBlurProp?.(event);
18959 });
18960 const id = useId4(props.id);
18961 const ariaAutoComplete = isAriaAutoCompleteValue(autoComplete) ? autoComplete : void 0;
18962 const isActiveItem = useStoreState(store, (state) => state.activeId === null);
18963 props = {
18964 role: "combobox",
18965 "aria-autocomplete": ariaAutoComplete,
18966 "aria-haspopup": getPopupRole(contentElement, "listbox"),
18967 "aria-expanded": open,
18968 "aria-controls": contentElement?.id,
18969 "data-active-item": isActiveItem || void 0,
18970 value,
18971 ...props,
18972 id,
18973 ref: useMergeRefs(ref, props.ref),
18974 onChange,
18975 onCompositionEnd,
18976 onMouseDown,
18977 onKeyDown,
18978 onBlur
18979 };
18980 props = useComposite({
18981 store,
18982 focusable: focusable2,
18983 ...props,
18984 moveOnKeyPress: (event) => {
18985 if (isFalsyBooleanCallback(moveOnKeyPress, event)) return false;
18986 if (inline4) setCanInline(true);
18987 return true;
18988 }
18989 });
18990 props = usePopoverAnchor({
18991 store,
18992 ...props
18993 });
18994 return {
18995 autoComplete: "off",
18996 ...props
18997 };
18998 });
18999 var Combobox = forwardRef30(function Combobox2(props) {
19000 return createElement3(TagName9, useCombobox(props));
19001 });
19002
19003 // node_modules/@ariakit/react-components/dist/combobox/combobox-item.js
19004 var import_react24 = __toESM(require_react(), 1);
19005 var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
19006 var TagName10 = "div";
19007 function isSelected(storeValue, itemValue) {
19008 if (itemValue == null) return;
19009 if (storeValue == null) return false;
19010 if (Array.isArray(storeValue)) return storeValue.includes(itemValue);
19011 return storeValue === itemValue;
19012 }
19013 function getItemRole(popupRole) {
19014 return getItemRoleByPopupRole(popupRole) ?? "option";
19015 }
19016 var useComboboxItem = createHook(function useComboboxItem2({ store, value, hideOnClick, setValueOnClick, selectValueOnClick = true, resetValueOnSelect, focusOnHover = false, moveOnKeyPress = true, getItem: getItemProp, ...props }) {
19017 const context = useComboboxScopedContext();
19018 store = store || context;
19019 invariant(store, "ComboboxItem must be wrapped in a ComboboxList or ComboboxPopover component.");
19020 const { resetValueOnSelectState, multiSelectable, selected } = useStoreStateObject(store, {
19021 resetValueOnSelectState: "resetValueOnSelect",
19022 multiSelectable(state) {
19023 return Array.isArray(state.selectedValue);
19024 },
19025 selected(state) {
19026 return isSelected(state.selectedValue, value);
19027 }
19028 });
19029 const getItem = (0, import_react24.useCallback)((item) => {
19030 const nextItem = {
19031 ...item,
19032 value
19033 };
19034 if (getItemProp) return getItemProp(nextItem);
19035 return nextItem;
19036 }, [value, getItemProp]);
19037 setValueOnClick = setValueOnClick ?? !multiSelectable;
19038 hideOnClick = hideOnClick ?? (value != null && !multiSelectable);
19039 const onClickProp = props.onClick;
19040 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
19041 const selectValueOnClickProp = useBooleanEvent(selectValueOnClick);
19042 const resetValueOnSelectProp = useBooleanEvent(resetValueOnSelect ?? resetValueOnSelectState ?? multiSelectable);
19043 const hideOnClickProp = useBooleanEvent(hideOnClick);
19044 const onClick = useEvent((event) => {
19045 onClickProp?.(event);
19046 if (event.defaultPrevented) return;
19047 if (isDownloading(event)) return;
19048 if (isOpeningInNewTab(event)) return;
19049 if (value != null) {
19050 if (selectValueOnClickProp(event)) {
19051 if (resetValueOnSelectProp(event)) store?.resetValue();
19052 store?.setSelectedValue((prevValue) => {
19053 if (!Array.isArray(prevValue)) return value;
19054 if (prevValue.includes(value)) return prevValue.filter((v2) => v2 !== value);
19055 return [...prevValue, value];
19056 });
19057 }
19058 if (setValueOnClickProp(event)) store?.setValue(value);
19059 }
19060 if (hideOnClickProp(event)) store?.hide();
19061 });
19062 const onKeyDownProp = props.onKeyDown;
19063 const onKeyDown = useEvent((event) => {
19064 onKeyDownProp?.(event);
19065 if (event.defaultPrevented) return;
19066 const baseElement = store?.getState().baseElement;
19067 if (!baseElement) return;
19068 if (hasFocus(baseElement)) return;
19069 const printable = event.key.length === 1 && !event.ctrlKey && !event.metaKey;
19070 const paste = (!isApple() ? event.ctrlKey : event.metaKey) && event.key.toLowerCase() === "v";
19071 const deleteKey = event.key === "Backspace" || event.key === "Delete";
19072 if (printable || paste || deleteKey) {
19073 queueMicrotask(() => baseElement.focus());
19074 if (isTextField(baseElement)) store?.setValue(baseElement.value);
19075 }
19076 });
19077 if (multiSelectable && selected != null) props = {
19078 "aria-selected": selected,
19079 ...props
19080 };
19081 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ComboboxItemValueContext.Provider, {
19082 value,
19083 children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(ComboboxItemCheckedContext.Provider, {
19084 value: selected ?? false,
19085 children: element
19086 })
19087 }), [value, selected]);
19088 props = {
19089 role: getItemRole((0, import_react24.useContext)(ComboboxListRoleContext)),
19090 children: value,
19091 ...props,
19092 onClick,
19093 onKeyDown
19094 };
19095 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
19096 props = useCompositeItem({
19097 store,
19098 ...props,
19099 getItem,
19100 moveOnKeyPress: (event) => {
19101 if (!moveOnKeyPressProp(event)) return false;
19102 const moveEvent = new Event("combobox-item-move");
19103 store?.getState().baseElement?.dispatchEvent(moveEvent);
19104 return true;
19105 }
19106 });
19107 props = useCompositeHover({
19108 store,
19109 focusOnHover,
19110 ...props
19111 });
19112 return props;
19113 });
19114 var ComboboxItem = memo3(forwardRef30(function ComboboxItem2(props) {
19115 return createElement3(TagName10, useComboboxItem(props));
19116 }));
19117
19118 // node_modules/@ariakit/react-components/dist/combobox/combobox-item-value.js
19119 var import_react25 = __toESM(require_react(), 1);
19120 var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
19121 var TagName11 = "span";
19122 function normalizeValue(value) {
19123 return normalizeString(value).toLowerCase();
19124 }
19125 function getOffsets(string, values) {
19126 const offsets = [];
19127 for (const value of values) {
19128 if (!value) continue;
19129 let pos = 0;
19130 const length = value.length;
19131 let index2 = string.indexOf(value, pos);
19132 while (index2 !== -1) {
19133 offsets.push([index2, length]);
19134 pos = index2 + 1;
19135 index2 = string.indexOf(value, pos);
19136 }
19137 }
19138 return offsets;
19139 }
19140 function mergeOverlappingOffsets(offsets) {
19141 offsets.sort(([a2], [b2]) => a2 - b2);
19142 const merged = [];
19143 for (const [offset4, length] of offsets) {
19144 const last = merged[merged.length - 1];
19145 if (last && offset4 < last[0] + last[1]) last[1] = Math.max(last[1], offset4 + length - last[0]);
19146 else merged.push([offset4, length]);
19147 }
19148 return merged;
19149 }
19150 function getNormalizedIndexes(itemValue) {
19151 const starts = [];
19152 const ends = [];
19153 let index2 = 0;
19154 for (const char of itemValue) {
19155 const normalizedLength = normalizeValue(char).length;
19156 for (let i2 = 0; i2 < normalizedLength; i2 += 1) {
19157 starts.push(i2 === 0 ? index2 : -1);
19158 ends.push(index2);
19159 }
19160 index2 += char.length;
19161 }
19162 starts.push(itemValue.length);
19163 ends.push(itemValue.length);
19164 let nextBoundary = itemValue.length;
19165 for (let i2 = starts.length - 1; i2 >= 0; i2 -= 1) {
19166 const start = starts[i2];
19167 if (start == null) continue;
19168 if (start === -1) starts[i2] = nextBoundary;
19169 else nextBoundary = start;
19170 }
19171 return {
19172 starts,
19173 ends
19174 };
19175 }
19176 function toOriginalOffsets(itemValue, normalizedOffsets) {
19177 if (!normalizedOffsets.length) return normalizedOffsets;
19178 const { starts, ends } = getNormalizedIndexes(itemValue);
19179 const offsets = [];
19180 for (const [normalizedOffset, normalizedLength] of normalizedOffsets) {
19181 const start = starts[normalizedOffset];
19182 const end = ends[normalizedOffset + normalizedLength];
19183 if (start == null || end == null) continue;
19184 if (end <= start) continue;
19185 offsets.push([start, end - start]);
19186 }
19187 return offsets;
19188 }
19189 function splitValue(itemValue, userValue) {
19190 if (!itemValue) return itemValue;
19191 if (!userValue) return itemValue;
19192 const userValues = toArray(userValue).map(normalizeValue);
19193 const parts = [];
19194 const span = (value, autocomplete = false) => /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", {
19195 "data-autocomplete-value": autocomplete ? "" : void 0,
19196 "data-user-value": autocomplete ? void 0 : "",
19197 children: value
19198 }, parts.length);
19199 const offsets = toOriginalOffsets(itemValue, mergeOverlappingOffsets(getOffsets(normalizeValue(itemValue), new Set(userValues))));
19200 const firstEntry = offsets[0];
19201 if (!firstEntry) {
19202 parts.push(span(itemValue, true));
19203 return parts;
19204 }
19205 const [firstOffset] = firstEntry;
19206 [itemValue.slice(0, firstOffset), ...offsets.flatMap(([offset4, length], i2) => {
19207 const value = itemValue.slice(offset4, offset4 + length);
19208 const nextOffset = offsets[i2 + 1]?.[0];
19209 return [value, itemValue.slice(offset4 + length, nextOffset)];
19210 })].forEach((value, i2) => {
19211 if (!value) return;
19212 parts.push(span(value, i2 % 2 === 0));
19213 });
19214 return parts;
19215 }
19216 var useComboboxItemValue = createHook(function useComboboxItemValue2({ store, value, userValue, ...props }) {
19217 const context = useComboboxScopedContext();
19218 store = store || context;
19219 const itemContext = (0, import_react25.useContext)(ComboboxItemValueContext);
19220 const itemValue = value ?? itemContext;
19221 const inputValue = useStoreState(store, (state) => userValue ?? state?.value);
19222 props = {
19223 children: (0, import_react25.useMemo)(() => {
19224 if (!itemValue) return;
19225 if (!inputValue) return itemValue;
19226 return splitValue(itemValue, inputValue);
19227 }, [itemValue, inputValue]),
19228 ...props
19229 };
19230 return removeUndefinedValues(props);
19231 });
19232 var ComboboxItemValue = forwardRef30(function ComboboxItemValue2(props) {
19233 return createElement3(TagName11, useComboboxItemValue(props));
19234 });
19235
19236 // node_modules/@ariakit/react-components/dist/combobox/combobox-label.js
19237 var TagName12 = "label";
19238 var useComboboxLabel = createHook(function useComboboxLabel2({ store, ...props }) {
19239 const context = useComboboxProviderContext();
19240 store = store || context;
19241 invariant(store, "ComboboxLabel must receive a `store` prop or be wrapped in a ComboboxProvider component.");
19242 props = {
19243 htmlFor: useStoreState(store, (state) => state.baseElement?.id),
19244 ...props
19245 };
19246 return removeUndefinedValues(props);
19247 });
19248 var ComboboxLabel = memo3(forwardRef30(function ComboboxLabel2(props) {
19249 return createElement3(TagName12, useComboboxLabel(props));
19250 }));
19251
19252 // node_modules/@ariakit/react-components/dist/combobox/combobox-list.js
19253 var import_react26 = __toESM(require_react(), 1);
19254 var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
19255 var TagName13 = "div";
19256 var useComboboxList = createHook(function useComboboxList2({ store, alwaysVisible, ...props }) {
19257 const scopedContext = useComboboxScopedContext(true);
19258 const context = useComboboxContext();
19259 store = store || context;
19260 const scopedContextSameStore = !!store && store === scopedContext;
19261 invariant(store, "ComboboxList must receive a `store` prop or be wrapped in a ComboboxProvider component.");
19262 const ref = (0, import_react26.useRef)(null);
19263 const id = useId4(props.id);
19264 const mounted = useStoreState(store, "mounted");
19265 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
19266 const style = hidden ? {
19267 ...props.style,
19268 display: "none"
19269 } : props.style;
19270 const multiSelectable = useStoreState(store, (state) => Array.isArray(state.selectedValue));
19271 const role = useAttribute(ref, "role", props.role);
19272 const ariaMultiSelectable = role === "listbox" || role === "tree" || role === "grid" ? multiSelectable || void 0 : void 0;
19273 const [hasListboxInside, setHasListboxInside] = (0, import_react26.useState)(false);
19274 const contentElement = useStoreState(store, "contentElement");
19275 useSafeLayoutEffect(() => {
19276 if (!mounted) return;
19277 const element = ref.current;
19278 if (!element) return;
19279 if (contentElement !== element) return;
19280 const callback = () => {
19281 setHasListboxInside(!!element.querySelector("[role='listbox']"));
19282 };
19283 const observer = new MutationObserver(callback);
19284 observer.observe(element, {
19285 subtree: true,
19286 childList: true,
19287 attributeFilter: ["role"]
19288 });
19289 callback();
19290 return () => observer.disconnect();
19291 }, [mounted, contentElement]);
19292 if (!hasListboxInside) props = {
19293 role: "listbox",
19294 "aria-multiselectable": ariaMultiSelectable,
19295 ...props
19296 };
19297 props = useWrapElement(props, (element) => /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(ComboboxScopedContextProvider, {
19298 value: store,
19299 children: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(ComboboxListRoleContext.Provider, {
19300 value: role,
19301 children: element
19302 })
19303 }), [store, role]);
19304 const setContentElement = id && (!scopedContext || !scopedContextSameStore) ? store.setContentElement : null;
19305 props = {
19306 hidden,
19307 ...props,
19308 id,
19309 ref: useMergeRefs(setContentElement, ref, props.ref),
19310 style
19311 };
19312 return removeUndefinedValues(props);
19313 });
19314 var ComboboxList = forwardRef30(function ComboboxList2(props) {
19315 return createElement3(TagName13, useComboboxList(props));
19316 });
19317
19318 // node_modules/@ariakit/react-components/dist/tag/tag-context.js
19319 var import_react27 = __toESM(require_react(), 1);
19320 var TagValueContext = (0, import_react27.createContext)(null);
19321 var TagRemoveIdContext = (0, import_react27.createContext)(null);
19322 var ctx7 = createStoreContext([CompositeContextProvider], [CompositeScopedContextProvider]);
19323 var useTagContext = ctx7.useContext;
19324 var useTagScopedContext = ctx7.useScopedContext;
19325 var useTagProviderContext = ctx7.useProviderContext;
19326 var TagContextProvider = ctx7.ContextProvider;
19327 var TagScopedContextProvider = ctx7.ScopedContextProvider;
19328
19329 // node_modules/@ariakit/components/dist/combobox/combobox-store.js
19330 var isTouchSafari = isSafari() && isTouchDevice();
19331 function createComboboxStore({ tag, ...props } = {}) {
19332 const store = mergeStore(props.store, pick2(tag, ["value", "rtl"]));
19333 throwOnConflictingProps(props, store);
19334 const tagState = tag?.getState();
19335 const syncState = store?.getState();
19336 const activeId = defaultValue(props.activeId, syncState?.activeId, props.defaultActiveId, null);
19337 const composite = createCompositeStore({
19338 ...props,
19339 activeId,
19340 includesBaseElement: defaultValue(props.includesBaseElement, syncState?.includesBaseElement, true),
19341 orientation: defaultValue(props.orientation, syncState?.orientation, "vertical"),
19342 focusLoop: defaultValue(props.focusLoop, syncState?.focusLoop, true),
19343 focusWrap: defaultValue(props.focusWrap, syncState?.focusWrap, true),
19344 virtualFocus: defaultValue(props.virtualFocus, syncState?.virtualFocus, true)
19345 });
19346 const popover = createPopoverStore({
19347 ...props,
19348 placement: defaultValue(props.placement, syncState?.placement, "bottom-start")
19349 });
19350 const value = defaultValue(props.value, syncState?.value, props.defaultValue, "");
19351 const selectedValue = defaultValue(props.selectedValue, syncState?.selectedValue, tagState?.values, props.defaultSelectedValue, "");
19352 const multiSelectable = Array.isArray(selectedValue);
19353 const initialState = {
19354 ...composite.getState(),
19355 ...popover.getState(),
19356 value,
19357 selectedValue,
19358 resetValueOnSelect: defaultValue(props.resetValueOnSelect, syncState?.resetValueOnSelect, multiSelectable),
19359 resetValueOnHide: defaultValue(props.resetValueOnHide, syncState?.resetValueOnHide, multiSelectable && !tag),
19360 activeValue: syncState?.activeValue
19361 };
19362 const combobox = createStore(initialState, composite, popover, store);
19363 if (isTouchSafari) setup(combobox, () => sync(combobox, ["virtualFocus"], () => {
19364 combobox.setState("virtualFocus", false);
19365 }));
19366 setup(combobox, () => {
19367 if (!tag) return;
19368 return chain(sync(combobox, ["selectedValue"], (state) => {
19369 if (!Array.isArray(state.selectedValue)) return;
19370 tag.setValues(state.selectedValue);
19371 }), sync(tag, ["values"], (state) => {
19372 combobox.setState("selectedValue", state.values);
19373 }));
19374 });
19375 setup(combobox, () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => {
19376 if (!state.resetValueOnHide) return;
19377 if (state.mounted) return;
19378 combobox.setState("value", value);
19379 }));
19380 setup(combobox, () => sync(combobox, ["open"], (state) => {
19381 if (state.open) return;
19382 combobox.setState("activeId", activeId);
19383 combobox.setState("moves", 0);
19384 }));
19385 setup(combobox, () => sync(combobox, ["moves", "activeId"], (state, prevState) => {
19386 if (state.moves === prevState.moves) combobox.setState("activeValue", void 0);
19387 }));
19388 setup(combobox, () => batch(combobox, ["moves", "renderedItems"], (state, prev) => {
19389 if (state.moves === prev.moves) return;
19390 const { activeId: activeId2 } = combobox.getState();
19391 const activeItem = composite.item(activeId2);
19392 combobox.setState("activeValue", activeItem?.value);
19393 }));
19394 return {
19395 ...popover,
19396 ...composite,
19397 ...combobox,
19398 tag,
19399 setValue: (value2) => combobox.setState("value", value2),
19400 resetValue: () => combobox.setState("value", initialState.value),
19401 setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2)
19402 };
19403 }
19404
19405 // node_modules/@ariakit/react-components/dist/combobox/combobox-store.js
19406 function useComboboxStoreOptions(props) {
19407 const tag = useTagContext();
19408 props = {
19409 ...props,
19410 tag: props.tag !== void 0 ? props.tag : tag
19411 };
19412 return useCompositeStoreOptions(props);
19413 }
19414 function useComboboxStoreProps(store, update2, props) {
19415 useUpdateEffect(update2, [props.tag]);
19416 useStoreProps(store, props, "value", "setValue");
19417 useStoreProps(store, props, "selectedValue", "setSelectedValue");
19418 useStoreProps(store, props, "resetValueOnHide");
19419 useStoreProps(store, props, "resetValueOnSelect");
19420 return Object.assign(useCompositeStoreProps(usePopoverStoreProps(store, update2, props), update2, props), { tag: props.tag });
19421 }
19422 function useComboboxStore(props = {}) {
19423 props = useComboboxStoreOptions(props);
19424 const [store, update2] = useStore2(createComboboxStore, props);
19425 return useComboboxStoreProps(store, update2, props);
19426 }
19427
19428 // node_modules/@ariakit/react-components/dist/combobox/combobox-provider.js
19429 var import_jsx_runtime78 = __toESM(require_jsx_runtime(), 1);
19430 function ComboboxProvider(props = {}) {
19431 return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(ComboboxContextProvider, {
19432 value: useComboboxStore(props),
19433 children: props.children
19434 });
19435 }
19436
19437 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
19438 var import_remove_accents = __toESM(require_remove_accents(), 1);
19439 var import_compose8 = __toESM(require_compose(), 1);
19440 var import_i18n24 = __toESM(require_i18n(), 1);
19441 var import_element52 = __toESM(require_element(), 1);
19442 var import_components19 = __toESM(require_components(), 1);
19443
19444 // packages/dataviews/build-module/components/dataviews-filters/utils.mjs
19445 var EMPTY_ARRAY3 = [];
19446 var getCurrentValue = (filterDefinition, currentFilter) => {
19447 if (filterDefinition.singleSelection) {
19448 return currentFilter?.value;
19449 }
19450 if (Array.isArray(currentFilter?.value)) {
19451 return currentFilter.value;
19452 }
19453 if (!Array.isArray(currentFilter?.value) && !!currentFilter?.value) {
19454 return [currentFilter.value];
19455 }
19456 return EMPTY_ARRAY3;
19457 };
19458
19459 // packages/dataviews/build-module/hooks/use-elements.mjs
19460 var import_element51 = __toESM(require_element(), 1);
19461 var EMPTY_ARRAY4 = [];
19462 function useElements({
19463 elements,
19464 getElements
19465 }) {
19466 const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY4;
19467 const [records, setRecords] = (0, import_element51.useState)(staticElements);
19468 const [isLoading, setIsLoading] = (0, import_element51.useState)(false);
19469 (0, import_element51.useEffect)(() => {
19470 if (!getElements) {
19471 setRecords(staticElements);
19472 return;
19473 }
19474 let cancelled = false;
19475 setIsLoading(true);
19476 getElements().then((fetchedElements) => {
19477 if (!cancelled) {
19478 const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements;
19479 setRecords(dynamicElements);
19480 }
19481 }).catch(() => {
19482 if (!cancelled) {
19483 setRecords(staticElements);
19484 }
19485 }).finally(() => {
19486 if (!cancelled) {
19487 setIsLoading(false);
19488 }
19489 });
19490 return () => {
19491 cancelled = true;
19492 };
19493 }, [getElements, staticElements]);
19494 return {
19495 elements: records,
19496 isLoading
19497 };
19498 }
19499
19500 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
19501 var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
19502 function normalizeSearchInput(input = "") {
19503 return (0, import_remove_accents.default)(input.trim().toLowerCase());
19504 }
19505 var getNewValue = (filterDefinition, currentFilter, value) => {
19506 if (filterDefinition.singleSelection) {
19507 return value;
19508 }
19509 if (Array.isArray(currentFilter?.value)) {
19510 return currentFilter.value.includes(value) ? currentFilter.value.filter((v2) => v2 !== value) : [...currentFilter.value, value];
19511 }
19512 return [value];
19513 };
19514 function generateFilterElementCompositeItemId(prefix, filterElementValue) {
19515 return `${prefix}-${filterElementValue}`;
19516 }
19517 var MultiSelectionOption = ({ selected }) => {
19518 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19519 "span",
19520 {
19521 className: clsx_default(
19522 "dataviews-filters__search-widget-listitem-multi-selection",
19523 { "is-selected": selected }
19524 ),
19525 children: selected && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components19.Icon, { icon: check_default })
19526 }
19527 );
19528 };
19529 var SingleSelectionOption = ({ selected }) => {
19530 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19531 "span",
19532 {
19533 className: clsx_default(
19534 "dataviews-filters__search-widget-listitem-single-selection",
19535 { "is-selected": selected }
19536 )
19537 }
19538 );
19539 };
19540 function ListBox({ view, filter, onChangeView }) {
19541 const baseId = (0, import_compose8.useInstanceId)(ListBox, "dataviews-filter-list-box");
19542 const [activeCompositeId, setActiveCompositeId] = (0, import_element52.useState)(
19543 // When there are one or less operators, the first item is set as active
19544 // (by setting the initial `activeId` to `undefined`).
19545 // With 2 or more operators, the focus is moved on the operators control
19546 // (by setting the initial `activeId` to `null`), meaning that there won't
19547 // be an active item initially. Focus is then managed via the
19548 // `onFocusVisible` callback.
19549 filter.operators?.length === 1 ? void 0 : null
19550 );
19551 const currentFilter = view.filters?.find(
19552 (f2) => f2.field === filter.field
19553 );
19554 const currentValue = getCurrentValue(filter, currentFilter);
19555 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19556 import_components19.Composite,
19557 {
19558 virtualFocus: true,
19559 focusLoop: true,
19560 activeId: activeCompositeId,
19561 setActiveId: setActiveCompositeId,
19562 role: "listbox",
19563 className: "dataviews-filters__search-widget-listbox",
19564 "aria-label": (0, import_i18n24.sprintf)(
19565 /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */
19566 (0, import_i18n24.__)("List of: %1$s"),
19567 filter.name
19568 ),
19569 onFocusVisible: () => {
19570 if (!activeCompositeId && filter.elements.length) {
19571 setActiveCompositeId(
19572 generateFilterElementCompositeItemId(
19573 baseId,
19574 filter.elements[0].value
19575 )
19576 );
19577 }
19578 },
19579 render: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components19.Composite.Typeahead, {}),
19580 children: filter.elements.map((element) => /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
19581 import_components19.Composite.Hover,
19582 {
19583 render: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19584 import_components19.Composite.Item,
19585 {
19586 id: generateFilterElementCompositeItemId(
19587 baseId,
19588 element.value
19589 ),
19590 render: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19591 "div",
19592 {
19593 "aria-label": element.label,
19594 role: "option",
19595 className: "dataviews-filters__search-widget-listitem"
19596 }
19597 ),
19598 onClick: () => {
19599 const newFilters = currentFilter ? [
19600 ...(view.filters ?? []).map(
19601 (_filter) => {
19602 if (_filter.field === filter.field) {
19603 return {
19604 ..._filter,
19605 operator: currentFilter.operator || filter.operators[0],
19606 value: getNewValue(
19607 filter,
19608 currentFilter,
19609 element.value
19610 )
19611 };
19612 }
19613 return _filter;
19614 }
19615 )
19616 ] : [
19617 ...view.filters ?? [],
19618 {
19619 field: filter.field,
19620 operator: filter.operators[0],
19621 value: getNewValue(
19622 filter,
19623 currentFilter,
19624 element.value
19625 )
19626 }
19627 ];
19628 onChangeView({
19629 ...view,
19630 page: 1,
19631 filters: newFilters
19632 });
19633 }
19634 }
19635 ),
19636 children: [
19637 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19638 SingleSelectionOption,
19639 {
19640 selected: currentValue === element.value
19641 }
19642 ),
19643 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19644 MultiSelectionOption,
19645 {
19646 selected: currentValue.includes(element.value)
19647 }
19648 ),
19649 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19650 "span",
19651 {
19652 className: "dataviews-filters__search-widget-listitem-value",
19653 title: element.label,
19654 children: element.label
19655 }
19656 )
19657 ]
19658 },
19659 element.value
19660 ))
19661 }
19662 );
19663 }
19664 function ComboboxList22({ view, filter, onChangeView }) {
19665 const [searchValue, setSearchValue] = (0, import_element52.useState)("");
19666 const deferredSearchValue = (0, import_element52.useDeferredValue)(searchValue);
19667 const currentFilter = view.filters?.find(
19668 (_filter) => _filter.field === filter.field
19669 );
19670 const currentValue = getCurrentValue(filter, currentFilter);
19671 const matches = (0, import_element52.useMemo)(() => {
19672 const normalizedSearch = normalizeSearchInput(deferredSearchValue);
19673 return filter.elements.filter(
19674 (item) => normalizeSearchInput(item.label).includes(normalizedSearch)
19675 );
19676 }, [filter.elements, deferredSearchValue]);
19677 return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
19678 ComboboxProvider,
19679 {
19680 selectedValue: currentValue,
19681 setSelectedValue: (value) => {
19682 const newFilters = currentFilter ? [
19683 ...(view.filters ?? []).map((_filter) => {
19684 if (_filter.field === filter.field) {
19685 return {
19686 ..._filter,
19687 operator: currentFilter.operator || filter.operators[0],
19688 value
19689 };
19690 }
19691 return _filter;
19692 })
19693 ] : [
19694 ...view.filters ?? [],
19695 {
19696 field: filter.field,
19697 operator: filter.operators[0],
19698 value
19699 }
19700 ];
19701 onChangeView({
19702 ...view,
19703 page: 1,
19704 filters: newFilters
19705 });
19706 },
19707 setValue: setSearchValue,
19708 children: [
19709 /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { className: "dataviews-filters__search-widget-filter-combobox__wrapper", children: [
19710 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(VisuallyHidden, { render: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(ComboboxLabel, {}), children: (0, import_i18n24.__)("Search items") }),
19711 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19712 Combobox,
19713 {
19714 autoSelect: "always",
19715 placeholder: (0, import_i18n24.__)("Search"),
19716 className: "dataviews-filters__search-widget-filter-combobox__input"
19717 }
19718 ),
19719 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("div", { className: "dataviews-filters__search-widget-filter-combobox__icon", children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components19.Icon, { icon: search_default }) })
19720 ] }),
19721 /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
19722 ComboboxList,
19723 {
19724 className: "dataviews-filters__search-widget-filter-combobox-list",
19725 alwaysVisible: true,
19726 children: [
19727 matches.map((element) => {
19728 return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
19729 ComboboxItem,
19730 {
19731 resetValueOnSelect: false,
19732 value: element.value,
19733 className: "dataviews-filters__search-widget-listitem",
19734 hideOnClick: false,
19735 setValueOnClick: false,
19736 focusOnHover: true,
19737 children: [
19738 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19739 SingleSelectionOption,
19740 {
19741 selected: currentValue === element.value
19742 }
19743 ),
19744 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19745 MultiSelectionOption,
19746 {
19747 selected: currentValue.includes(
19748 element.value
19749 )
19750 }
19751 ),
19752 /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
19753 "span",
19754 {
19755 className: "dataviews-filters__search-widget-listitem-value",
19756 title: element.label,
19757 children: [
19758 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
19759 ComboboxItemValue,
19760 {
19761 className: "dataviews-filters__search-widget-filter-combobox-item-value",
19762 value: element.label
19763 }
19764 ),
19765 !!element.description && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("span", { className: "dataviews-filters__search-widget-listitem-description", children: element.description })
19766 ]
19767 }
19768 )
19769 ]
19770 },
19771 element.value
19772 );
19773 }),
19774 !matches.length && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("p", { children: (0, import_i18n24.__)("No results found") })
19775 ]
19776 }
19777 )
19778 ]
19779 }
19780 );
19781 }
19782 function SearchWidget(props) {
19783 const { elements, isLoading } = useElements({
19784 elements: props.filter.elements,
19785 getElements: props.filter.getElements
19786 });
19787 if (isLoading) {
19788 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components19.Spinner, {}) });
19789 }
19790 if (elements.length === 0) {
19791 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: (0, import_i18n24.__)("No elements found") });
19792 }
19793 const Widget = elements.length > 10 ? ComboboxList22 : ListBox;
19794 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Widget, { ...props, filter: { ...props.filter, elements } });
19795 }
19796
19797 // packages/dataviews/build-module/components/dataviews-filters/input-widget.mjs
19798 var import_es6 = __toESM(require_es6(), 1);
19799 var import_compose9 = __toESM(require_compose(), 1);
19800 var import_element53 = __toESM(require_element(), 1);
19801 var import_components20 = __toESM(require_components(), 1);
19802 var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
19803 function InputWidget({
19804 filter,
19805 view,
19806 onChangeView,
19807 fields
19808 }) {
19809 const currentFilter = view.filters?.find(
19810 (f2) => f2.field === filter.field
19811 );
19812 const currentValue = getCurrentValue(filter, currentFilter);
19813 const field = (0, import_element53.useMemo)(() => {
19814 const currentField = fields.find((f2) => f2.id === filter.field);
19815 if (currentField) {
19816 return {
19817 ...currentField,
19818 // Deactivate validation for filters.
19819 isValid: {},
19820 // Filter controls are always enabled.
19821 isDisabled: () => false,
19822 // Filter controls are always visible.
19823 isVisible: () => true,
19824 // Configure getValue/setValue as if Item was a plain object.
19825 getValue: ({ item }) => item[currentField.id],
19826 setValue: ({ value }) => ({
19827 [currentField.id]: value
19828 })
19829 };
19830 }
19831 return currentField;
19832 }, [fields, filter.field]);
19833 const data = (0, import_element53.useMemo)(() => {
19834 return (view.filters ?? []).reduce(
19835 (acc, activeFilter) => {
19836 acc[activeFilter.field] = activeFilter.value;
19837 return acc;
19838 },
19839 {}
19840 );
19841 }, [view.filters]);
19842 const handleChange = (0, import_compose9.useEvent)((updatedData) => {
19843 if (!field || !currentFilter) {
19844 return;
19845 }
19846 const nextValue = field.getValue({ item: updatedData });
19847 if ((0, import_es6.default)(nextValue, currentValue)) {
19848 return;
19849 }
19850 onChangeView({
19851 ...view,
19852 filters: (view.filters ?? []).map(
19853 (_filter) => _filter.field === filter.field ? {
19854 ..._filter,
19855 operator: currentFilter.operator || filter.operators[0],
19856 // Consider empty strings as undefined:
19857 //
19858 // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records
19859 // - empty string as value means "search empty string": returns only the records that have an empty string as value
19860 //
19861 // In practice, this means the filter will not be able to find an empty string as the value.
19862 value: nextValue === "" ? void 0 : nextValue
19863 } : _filter
19864 )
19865 });
19866 });
19867 if (!field || !field.Edit || !currentFilter) {
19868 return null;
19869 }
19870 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
19871 import_components20.Flex,
19872 {
19873 className: "dataviews-filters__user-input-widget",
19874 gap: 2.5,
19875 direction: "column",
19876 children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
19877 field.Edit,
19878 {
19879 hideLabelFromVision: true,
19880 data,
19881 field,
19882 operator: currentFilter.operator,
19883 onChange: handleChange
19884 }
19885 )
19886 }
19887 );
19888 }
19889
19890 // packages/dataviews/node_modules/date-fns/constants.js
19891 var daysInYear = 365.2425;
19892 var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3;
19893 var minTime = -maxTime;
19894 var millisecondsInWeek = 6048e5;
19895 var millisecondsInDay = 864e5;
19896 var secondsInHour = 3600;
19897 var secondsInDay = secondsInHour * 24;
19898 var secondsInWeek = secondsInDay * 7;
19899 var secondsInYear = secondsInDay * daysInYear;
19900 var secondsInMonth = secondsInYear / 12;
19901 var secondsInQuarter = secondsInMonth * 3;
19902 var constructFromSymbol = /* @__PURE__ */ Symbol.for("constructDateFrom");
19903
19904 // packages/dataviews/node_modules/date-fns/constructFrom.js
19905 function constructFrom(date, value) {
19906 if (typeof date === "function") return date(value);
19907 if (date && typeof date === "object" && constructFromSymbol in date)
19908 return date[constructFromSymbol](value);
19909 if (date instanceof Date) return new date.constructor(value);
19910 return new Date(value);
19911 }
19912
19913 // packages/dataviews/node_modules/date-fns/toDate.js
19914 function toDate(argument, context) {
19915 return constructFrom(context || argument, argument);
19916 }
19917
19918 // packages/dataviews/node_modules/date-fns/addDays.js
19919 function addDays(date, amount, options) {
19920 const _date = toDate(date, options?.in);
19921 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
19922 if (!amount) return _date;
19923 _date.setDate(_date.getDate() + amount);
19924 return _date;
19925 }
19926
19927 // packages/dataviews/node_modules/date-fns/addMonths.js
19928 function addMonths(date, amount, options) {
19929 const _date = toDate(date, options?.in);
19930 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
19931 if (!amount) {
19932 return _date;
19933 }
19934 const dayOfMonth = _date.getDate();
19935 const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());
19936 endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
19937 const daysInMonth = endOfDesiredMonth.getDate();
19938 if (dayOfMonth >= daysInMonth) {
19939 return endOfDesiredMonth;
19940 } else {
19941 _date.setFullYear(
19942 endOfDesiredMonth.getFullYear(),
19943 endOfDesiredMonth.getMonth(),
19944 dayOfMonth
19945 );
19946 return _date;
19947 }
19948 }
19949
19950 // packages/dataviews/node_modules/date-fns/_lib/defaultOptions.js
19951 var defaultOptions = {};
19952 function getDefaultOptions() {
19953 return defaultOptions;
19954 }
19955
19956 // packages/dataviews/node_modules/date-fns/startOfWeek.js
19957 function startOfWeek(date, options) {
19958 const defaultOptions2 = getDefaultOptions();
19959 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
19960 const _date = toDate(date, options?.in);
19961 const day = _date.getDay();
19962 const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
19963 _date.setDate(_date.getDate() - diff);
19964 _date.setHours(0, 0, 0, 0);
19965 return _date;
19966 }
19967
19968 // packages/dataviews/node_modules/date-fns/startOfISOWeek.js
19969 function startOfISOWeek(date, options) {
19970 return startOfWeek(date, { ...options, weekStartsOn: 1 });
19971 }
19972
19973 // packages/dataviews/node_modules/date-fns/getISOWeekYear.js
19974 function getISOWeekYear(date, options) {
19975 const _date = toDate(date, options?.in);
19976 const year = _date.getFullYear();
19977 const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);
19978 fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
19979 fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
19980 const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
19981 const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);
19982 fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
19983 fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
19984 const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
19985 if (_date.getTime() >= startOfNextYear.getTime()) {
19986 return year + 1;
19987 } else if (_date.getTime() >= startOfThisYear.getTime()) {
19988 return year;
19989 } else {
19990 return year - 1;
19991 }
19992 }
19993
19994 // packages/dataviews/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js
19995 function getTimezoneOffsetInMilliseconds(date) {
19996 const _date = toDate(date);
19997 const utcDate = new Date(
19998 Date.UTC(
19999 _date.getFullYear(),
20000 _date.getMonth(),
20001 _date.getDate(),
20002 _date.getHours(),
20003 _date.getMinutes(),
20004 _date.getSeconds(),
20005 _date.getMilliseconds()
20006 )
20007 );
20008 utcDate.setUTCFullYear(_date.getFullYear());
20009 return +date - +utcDate;
20010 }
20011
20012 // packages/dataviews/node_modules/date-fns/_lib/normalizeDates.js
20013 function normalizeDates(context, ...dates) {
20014 const normalize = constructFrom.bind(
20015 null,
20016 context || dates.find((date) => typeof date === "object")
20017 );
20018 return dates.map(normalize);
20019 }
20020
20021 // packages/dataviews/node_modules/date-fns/startOfDay.js
20022 function startOfDay(date, options) {
20023 const _date = toDate(date, options?.in);
20024 _date.setHours(0, 0, 0, 0);
20025 return _date;
20026 }
20027
20028 // packages/dataviews/node_modules/date-fns/differenceInCalendarDays.js
20029 function differenceInCalendarDays(laterDate, earlierDate, options) {
20030 const [laterDate_, earlierDate_] = normalizeDates(
20031 options?.in,
20032 laterDate,
20033 earlierDate
20034 );
20035 const laterStartOfDay = startOfDay(laterDate_);
20036 const earlierStartOfDay = startOfDay(earlierDate_);
20037 const laterTimestamp = +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);
20038 const earlierTimestamp = +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);
20039 return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);
20040 }
20041
20042 // packages/dataviews/node_modules/date-fns/startOfISOWeekYear.js
20043 function startOfISOWeekYear(date, options) {
20044 const year = getISOWeekYear(date, options);
20045 const fourthOfJanuary = constructFrom(options?.in || date, 0);
20046 fourthOfJanuary.setFullYear(year, 0, 4);
20047 fourthOfJanuary.setHours(0, 0, 0, 0);
20048 return startOfISOWeek(fourthOfJanuary);
20049 }
20050
20051 // packages/dataviews/node_modules/date-fns/addWeeks.js
20052 function addWeeks(date, amount, options) {
20053 return addDays(date, amount * 7, options);
20054 }
20055
20056 // packages/dataviews/node_modules/date-fns/addYears.js
20057 function addYears(date, amount, options) {
20058 return addMonths(date, amount * 12, options);
20059 }
20060
20061 // packages/dataviews/node_modules/date-fns/isDate.js
20062 function isDate(value) {
20063 return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
20064 }
20065
20066 // packages/dataviews/node_modules/date-fns/isValid.js
20067 function isValid(date) {
20068 return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date)));
20069 }
20070
20071 // packages/dataviews/node_modules/date-fns/startOfMonth.js
20072 function startOfMonth(date, options) {
20073 const _date = toDate(date, options?.in);
20074 _date.setDate(1);
20075 _date.setHours(0, 0, 0, 0);
20076 return _date;
20077 }
20078
20079 // packages/dataviews/node_modules/date-fns/startOfYear.js
20080 function startOfYear(date, options) {
20081 const date_ = toDate(date, options?.in);
20082 date_.setFullYear(date_.getFullYear(), 0, 1);
20083 date_.setHours(0, 0, 0, 0);
20084 return date_;
20085 }
20086
20087 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatDistance.js
20088 var formatDistanceLocale = {
20089 lessThanXSeconds: {
20090 one: "less than a second",
20091 other: "less than {{count}} seconds"
20092 },
20093 xSeconds: {
20094 one: "1 second",
20095 other: "{{count}} seconds"
20096 },
20097 halfAMinute: "half a minute",
20098 lessThanXMinutes: {
20099 one: "less than a minute",
20100 other: "less than {{count}} minutes"
20101 },
20102 xMinutes: {
20103 one: "1 minute",
20104 other: "{{count}} minutes"
20105 },
20106 aboutXHours: {
20107 one: "about 1 hour",
20108 other: "about {{count}} hours"
20109 },
20110 xHours: {
20111 one: "1 hour",
20112 other: "{{count}} hours"
20113 },
20114 xDays: {
20115 one: "1 day",
20116 other: "{{count}} days"
20117 },
20118 aboutXWeeks: {
20119 one: "about 1 week",
20120 other: "about {{count}} weeks"
20121 },
20122 xWeeks: {
20123 one: "1 week",
20124 other: "{{count}} weeks"
20125 },
20126 aboutXMonths: {
20127 one: "about 1 month",
20128 other: "about {{count}} months"
20129 },
20130 xMonths: {
20131 one: "1 month",
20132 other: "{{count}} months"
20133 },
20134 aboutXYears: {
20135 one: "about 1 year",
20136 other: "about {{count}} years"
20137 },
20138 xYears: {
20139 one: "1 year",
20140 other: "{{count}} years"
20141 },
20142 overXYears: {
20143 one: "over 1 year",
20144 other: "over {{count}} years"
20145 },
20146 almostXYears: {
20147 one: "almost 1 year",
20148 other: "almost {{count}} years"
20149 }
20150 };
20151 var formatDistance = (token, count, options) => {
20152 let result;
20153 const tokenValue = formatDistanceLocale[token];
20154 if (typeof tokenValue === "string") {
20155 result = tokenValue;
20156 } else if (count === 1) {
20157 result = tokenValue.one;
20158 } else {
20159 result = tokenValue.other.replace("{{count}}", count.toString());
20160 }
20161 if (options?.addSuffix) {
20162 if (options.comparison && options.comparison > 0) {
20163 return "in " + result;
20164 } else {
20165 return result + " ago";
20166 }
20167 }
20168 return result;
20169 };
20170
20171 // packages/dataviews/node_modules/date-fns/locale/_lib/buildFormatLongFn.js
20172 function buildFormatLongFn(args) {
20173 return (options = {}) => {
20174 const width = options.width ? String(options.width) : args.defaultWidth;
20175 const format6 = args.formats[width] || args.formats[args.defaultWidth];
20176 return format6;
20177 };
20178 }
20179
20180 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatLong.js
20181 var dateFormats = {
20182 full: "EEEE, MMMM do, y",
20183 long: "MMMM do, y",
20184 medium: "MMM d, y",
20185 short: "MM/dd/yyyy"
20186 };
20187 var timeFormats = {
20188 full: "h:mm:ss a zzzz",
20189 long: "h:mm:ss a z",
20190 medium: "h:mm:ss a",
20191 short: "h:mm a"
20192 };
20193 var dateTimeFormats = {
20194 full: "{{date}} 'at' {{time}}",
20195 long: "{{date}} 'at' {{time}}",
20196 medium: "{{date}}, {{time}}",
20197 short: "{{date}}, {{time}}"
20198 };
20199 var formatLong = {
20200 date: buildFormatLongFn({
20201 formats: dateFormats,
20202 defaultWidth: "full"
20203 }),
20204 time: buildFormatLongFn({
20205 formats: timeFormats,
20206 defaultWidth: "full"
20207 }),
20208 dateTime: buildFormatLongFn({
20209 formats: dateTimeFormats,
20210 defaultWidth: "full"
20211 })
20212 };
20213
20214 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatRelative.js
20215 var formatRelativeLocale = {
20216 lastWeek: "'last' eeee 'at' p",
20217 yesterday: "'yesterday at' p",
20218 today: "'today at' p",
20219 tomorrow: "'tomorrow at' p",
20220 nextWeek: "eeee 'at' p",
20221 other: "P"
20222 };
20223 var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
20224
20225 // packages/dataviews/node_modules/date-fns/locale/_lib/buildLocalizeFn.js
20226 function buildLocalizeFn(args) {
20227 return (value, options) => {
20228 const context = options?.context ? String(options.context) : "standalone";
20229 let valuesArray;
20230 if (context === "formatting" && args.formattingValues) {
20231 const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
20232 const width = options?.width ? String(options.width) : defaultWidth;
20233 valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
20234 } else {
20235 const defaultWidth = args.defaultWidth;
20236 const width = options?.width ? String(options.width) : args.defaultWidth;
20237 valuesArray = args.values[width] || args.values[defaultWidth];
20238 }
20239 const index2 = args.argumentCallback ? args.argumentCallback(value) : value;
20240 return valuesArray[index2];
20241 };
20242 }
20243
20244 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/localize.js
20245 var eraValues = {
20246 narrow: ["B", "A"],
20247 abbreviated: ["BC", "AD"],
20248 wide: ["Before Christ", "Anno Domini"]
20249 };
20250 var quarterValues = {
20251 narrow: ["1", "2", "3", "4"],
20252 abbreviated: ["Q1", "Q2", "Q3", "Q4"],
20253 wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
20254 };
20255 var monthValues = {
20256 narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
20257 abbreviated: [
20258 "Jan",
20259 "Feb",
20260 "Mar",
20261 "Apr",
20262 "May",
20263 "Jun",
20264 "Jul",
20265 "Aug",
20266 "Sep",
20267 "Oct",
20268 "Nov",
20269 "Dec"
20270 ],
20271 wide: [
20272 "January",
20273 "February",
20274 "March",
20275 "April",
20276 "May",
20277 "June",
20278 "July",
20279 "August",
20280 "September",
20281 "October",
20282 "November",
20283 "December"
20284 ]
20285 };
20286 var dayValues = {
20287 narrow: ["S", "M", "T", "W", "T", "F", "S"],
20288 short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
20289 abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
20290 wide: [
20291 "Sunday",
20292 "Monday",
20293 "Tuesday",
20294 "Wednesday",
20295 "Thursday",
20296 "Friday",
20297 "Saturday"
20298 ]
20299 };
20300 var dayPeriodValues = {
20301 narrow: {
20302 am: "a",
20303 pm: "p",
20304 midnight: "mi",
20305 noon: "n",
20306 morning: "morning",
20307 afternoon: "afternoon",
20308 evening: "evening",
20309 night: "night"
20310 },
20311 abbreviated: {
20312 am: "AM",
20313 pm: "PM",
20314 midnight: "midnight",
20315 noon: "noon",
20316 morning: "morning",
20317 afternoon: "afternoon",
20318 evening: "evening",
20319 night: "night"
20320 },
20321 wide: {
20322 am: "a.m.",
20323 pm: "p.m.",
20324 midnight: "midnight",
20325 noon: "noon",
20326 morning: "morning",
20327 afternoon: "afternoon",
20328 evening: "evening",
20329 night: "night"
20330 }
20331 };
20332 var formattingDayPeriodValues = {
20333 narrow: {
20334 am: "a",
20335 pm: "p",
20336 midnight: "mi",
20337 noon: "n",
20338 morning: "in the morning",
20339 afternoon: "in the afternoon",
20340 evening: "in the evening",
20341 night: "at night"
20342 },
20343 abbreviated: {
20344 am: "AM",
20345 pm: "PM",
20346 midnight: "midnight",
20347 noon: "noon",
20348 morning: "in the morning",
20349 afternoon: "in the afternoon",
20350 evening: "in the evening",
20351 night: "at night"
20352 },
20353 wide: {
20354 am: "a.m.",
20355 pm: "p.m.",
20356 midnight: "midnight",
20357 noon: "noon",
20358 morning: "in the morning",
20359 afternoon: "in the afternoon",
20360 evening: "in the evening",
20361 night: "at night"
20362 }
20363 };
20364 var ordinalNumber = (dirtyNumber, _options) => {
20365 const number = Number(dirtyNumber);
20366 const rem100 = number % 100;
20367 if (rem100 > 20 || rem100 < 10) {
20368 switch (rem100 % 10) {
20369 case 1:
20370 return number + "st";
20371 case 2:
20372 return number + "nd";
20373 case 3:
20374 return number + "rd";
20375 }
20376 }
20377 return number + "th";
20378 };
20379 var localize = {
20380 ordinalNumber,
20381 era: buildLocalizeFn({
20382 values: eraValues,
20383 defaultWidth: "wide"
20384 }),
20385 quarter: buildLocalizeFn({
20386 values: quarterValues,
20387 defaultWidth: "wide",
20388 argumentCallback: (quarter) => quarter - 1
20389 }),
20390 month: buildLocalizeFn({
20391 values: monthValues,
20392 defaultWidth: "wide"
20393 }),
20394 day: buildLocalizeFn({
20395 values: dayValues,
20396 defaultWidth: "wide"
20397 }),
20398 dayPeriod: buildLocalizeFn({
20399 values: dayPeriodValues,
20400 defaultWidth: "wide",
20401 formattingValues: formattingDayPeriodValues,
20402 defaultFormattingWidth: "wide"
20403 })
20404 };
20405
20406 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchFn.js
20407 function buildMatchFn(args) {
20408 return (string, options = {}) => {
20409 const width = options.width;
20410 const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
20411 const matchResult = string.match(matchPattern);
20412 if (!matchResult) {
20413 return null;
20414 }
20415 const matchedString = matchResult[0];
20416 const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
20417 const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : (
20418 // [TODO] -- I challenge you to fix the type
20419 findKey(parsePatterns, (pattern) => pattern.test(matchedString))
20420 );
20421 let value;
20422 value = args.valueCallback ? args.valueCallback(key) : key;
20423 value = options.valueCallback ? (
20424 // [TODO] -- I challenge you to fix the type
20425 options.valueCallback(value)
20426 ) : value;
20427 const rest = string.slice(matchedString.length);
20428 return { value, rest };
20429 };
20430 }
20431 function findKey(object, predicate) {
20432 for (const key in object) {
20433 if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) {
20434 return key;
20435 }
20436 }
20437 return void 0;
20438 }
20439 function findIndex(array, predicate) {
20440 for (let key = 0; key < array.length; key++) {
20441 if (predicate(array[key])) {
20442 return key;
20443 }
20444 }
20445 return void 0;
20446 }
20447
20448 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
20449 function buildMatchPatternFn(args) {
20450 return (string, options = {}) => {
20451 const matchResult = string.match(args.matchPattern);
20452 if (!matchResult) return null;
20453 const matchedString = matchResult[0];
20454 const parseResult = string.match(args.parsePattern);
20455 if (!parseResult) return null;
20456 let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
20457 value = options.valueCallback ? options.valueCallback(value) : value;
20458 const rest = string.slice(matchedString.length);
20459 return { value, rest };
20460 };
20461 }
20462
20463 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/match.js
20464 var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
20465 var parseOrdinalNumberPattern = /\d+/i;
20466 var matchEraPatterns = {
20467 narrow: /^(b|a)/i,
20468 abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
20469 wide: /^(before christ|before common era|anno domini|common era)/i
20470 };
20471 var parseEraPatterns = {
20472 any: [/^b/i, /^(a|c)/i]
20473 };
20474 var matchQuarterPatterns = {
20475 narrow: /^[1234]/i,
20476 abbreviated: /^q[1234]/i,
20477 wide: /^[1234](th|st|nd|rd)? quarter/i
20478 };
20479 var parseQuarterPatterns = {
20480 any: [/1/i, /2/i, /3/i, /4/i]
20481 };
20482 var matchMonthPatterns = {
20483 narrow: /^[jfmasond]/i,
20484 abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
20485 wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
20486 };
20487 var parseMonthPatterns = {
20488 narrow: [
20489 /^j/i,
20490 /^f/i,
20491 /^m/i,
20492 /^a/i,
20493 /^m/i,
20494 /^j/i,
20495 /^j/i,
20496 /^a/i,
20497 /^s/i,
20498 /^o/i,
20499 /^n/i,
20500 /^d/i
20501 ],
20502 any: [
20503 /^ja/i,
20504 /^f/i,
20505 /^mar/i,
20506 /^ap/i,
20507 /^may/i,
20508 /^jun/i,
20509 /^jul/i,
20510 /^au/i,
20511 /^s/i,
20512 /^o/i,
20513 /^n/i,
20514 /^d/i
20515 ]
20516 };
20517 var matchDayPatterns = {
20518 narrow: /^[smtwf]/i,
20519 short: /^(su|mo|tu|we|th|fr|sa)/i,
20520 abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
20521 wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
20522 };
20523 var parseDayPatterns = {
20524 narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
20525 any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
20526 };
20527 var matchDayPeriodPatterns = {
20528 narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
20529 any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
20530 };
20531 var parseDayPeriodPatterns = {
20532 any: {
20533 am: /^a/i,
20534 pm: /^p/i,
20535 midnight: /^mi/i,
20536 noon: /^no/i,
20537 morning: /morning/i,
20538 afternoon: /afternoon/i,
20539 evening: /evening/i,
20540 night: /night/i
20541 }
20542 };
20543 var match = {
20544 ordinalNumber: buildMatchPatternFn({
20545 matchPattern: matchOrdinalNumberPattern,
20546 parsePattern: parseOrdinalNumberPattern,
20547 valueCallback: (value) => parseInt(value, 10)
20548 }),
20549 era: buildMatchFn({
20550 matchPatterns: matchEraPatterns,
20551 defaultMatchWidth: "wide",
20552 parsePatterns: parseEraPatterns,
20553 defaultParseWidth: "any"
20554 }),
20555 quarter: buildMatchFn({
20556 matchPatterns: matchQuarterPatterns,
20557 defaultMatchWidth: "wide",
20558 parsePatterns: parseQuarterPatterns,
20559 defaultParseWidth: "any",
20560 valueCallback: (index2) => index2 + 1
20561 }),
20562 month: buildMatchFn({
20563 matchPatterns: matchMonthPatterns,
20564 defaultMatchWidth: "wide",
20565 parsePatterns: parseMonthPatterns,
20566 defaultParseWidth: "any"
20567 }),
20568 day: buildMatchFn({
20569 matchPatterns: matchDayPatterns,
20570 defaultMatchWidth: "wide",
20571 parsePatterns: parseDayPatterns,
20572 defaultParseWidth: "any"
20573 }),
20574 dayPeriod: buildMatchFn({
20575 matchPatterns: matchDayPeriodPatterns,
20576 defaultMatchWidth: "any",
20577 parsePatterns: parseDayPeriodPatterns,
20578 defaultParseWidth: "any"
20579 })
20580 };
20581
20582 // packages/dataviews/node_modules/date-fns/locale/en-US.js
20583 var enUS = {
20584 code: "en-US",
20585 formatDistance,
20586 formatLong,
20587 formatRelative,
20588 localize,
20589 match,
20590 options: {
20591 weekStartsOn: 0,
20592 firstWeekContainsDate: 1
20593 }
20594 };
20595
20596 // packages/dataviews/node_modules/date-fns/getDayOfYear.js
20597 function getDayOfYear(date, options) {
20598 const _date = toDate(date, options?.in);
20599 const diff = differenceInCalendarDays(_date, startOfYear(_date));
20600 const dayOfYear = diff + 1;
20601 return dayOfYear;
20602 }
20603
20604 // packages/dataviews/node_modules/date-fns/getISOWeek.js
20605 function getISOWeek(date, options) {
20606 const _date = toDate(date, options?.in);
20607 const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
20608 return Math.round(diff / millisecondsInWeek) + 1;
20609 }
20610
20611 // packages/dataviews/node_modules/date-fns/getWeekYear.js
20612 function getWeekYear(date, options) {
20613 const _date = toDate(date, options?.in);
20614 const year = _date.getFullYear();
20615 const defaultOptions2 = getDefaultOptions();
20616 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
20617 const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
20618 firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
20619 firstWeekOfNextYear.setHours(0, 0, 0, 0);
20620 const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
20621 const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
20622 firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
20623 firstWeekOfThisYear.setHours(0, 0, 0, 0);
20624 const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
20625 if (+_date >= +startOfNextYear) {
20626 return year + 1;
20627 } else if (+_date >= +startOfThisYear) {
20628 return year;
20629 } else {
20630 return year - 1;
20631 }
20632 }
20633
20634 // packages/dataviews/node_modules/date-fns/startOfWeekYear.js
20635 function startOfWeekYear(date, options) {
20636 const defaultOptions2 = getDefaultOptions();
20637 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
20638 const year = getWeekYear(date, options);
20639 const firstWeek = constructFrom(options?.in || date, 0);
20640 firstWeek.setFullYear(year, 0, firstWeekContainsDate);
20641 firstWeek.setHours(0, 0, 0, 0);
20642 const _date = startOfWeek(firstWeek, options);
20643 return _date;
20644 }
20645
20646 // packages/dataviews/node_modules/date-fns/getWeek.js
20647 function getWeek(date, options) {
20648 const _date = toDate(date, options?.in);
20649 const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
20650 return Math.round(diff / millisecondsInWeek) + 1;
20651 }
20652
20653 // packages/dataviews/node_modules/date-fns/_lib/addLeadingZeros.js
20654 function addLeadingZeros(number, targetLength) {
20655 const sign = number < 0 ? "-" : "";
20656 const output = Math.abs(number).toString().padStart(targetLength, "0");
20657 return sign + output;
20658 }
20659
20660 // packages/dataviews/node_modules/date-fns/_lib/format/lightFormatters.js
20661 var lightFormatters = {
20662 // Year
20663 y(date, token) {
20664 const signedYear = date.getFullYear();
20665 const year = signedYear > 0 ? signedYear : 1 - signedYear;
20666 return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
20667 },
20668 // Month
20669 M(date, token) {
20670 const month = date.getMonth();
20671 return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
20672 },
20673 // Day of the month
20674 d(date, token) {
20675 return addLeadingZeros(date.getDate(), token.length);
20676 },
20677 // AM or PM
20678 a(date, token) {
20679 const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
20680 switch (token) {
20681 case "a":
20682 case "aa":
20683 return dayPeriodEnumValue.toUpperCase();
20684 case "aaa":
20685 return dayPeriodEnumValue;
20686 case "aaaaa":
20687 return dayPeriodEnumValue[0];
20688 case "aaaa":
20689 default:
20690 return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
20691 }
20692 },
20693 // Hour [1-12]
20694 h(date, token) {
20695 return addLeadingZeros(date.getHours() % 12 || 12, token.length);
20696 },
20697 // Hour [0-23]
20698 H(date, token) {
20699 return addLeadingZeros(date.getHours(), token.length);
20700 },
20701 // Minute
20702 m(date, token) {
20703 return addLeadingZeros(date.getMinutes(), token.length);
20704 },
20705 // Second
20706 s(date, token) {
20707 return addLeadingZeros(date.getSeconds(), token.length);
20708 },
20709 // Fraction of second
20710 S(date, token) {
20711 const numberOfDigits = token.length;
20712 const milliseconds = date.getMilliseconds();
20713 const fractionalSeconds = Math.trunc(
20714 milliseconds * Math.pow(10, numberOfDigits - 3)
20715 );
20716 return addLeadingZeros(fractionalSeconds, token.length);
20717 }
20718 };
20719
20720 // packages/dataviews/node_modules/date-fns/_lib/format/formatters.js
20721 var dayPeriodEnum = {
20722 am: "am",
20723 pm: "pm",
20724 midnight: "midnight",
20725 noon: "noon",
20726 morning: "morning",
20727 afternoon: "afternoon",
20728 evening: "evening",
20729 night: "night"
20730 };
20731 var formatters = {
20732 // Era
20733 G: function(date, token, localize2) {
20734 const era = date.getFullYear() > 0 ? 1 : 0;
20735 switch (token) {
20736 // AD, BC
20737 case "G":
20738 case "GG":
20739 case "GGG":
20740 return localize2.era(era, { width: "abbreviated" });
20741 // A, B
20742 case "GGGGG":
20743 return localize2.era(era, { width: "narrow" });
20744 // Anno Domini, Before Christ
20745 case "GGGG":
20746 default:
20747 return localize2.era(era, { width: "wide" });
20748 }
20749 },
20750 // Year
20751 y: function(date, token, localize2) {
20752 if (token === "yo") {
20753 const signedYear = date.getFullYear();
20754 const year = signedYear > 0 ? signedYear : 1 - signedYear;
20755 return localize2.ordinalNumber(year, { unit: "year" });
20756 }
20757 return lightFormatters.y(date, token);
20758 },
20759 // Local week-numbering year
20760 Y: function(date, token, localize2, options) {
20761 const signedWeekYear = getWeekYear(date, options);
20762 const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
20763 if (token === "YY") {
20764 const twoDigitYear = weekYear % 100;
20765 return addLeadingZeros(twoDigitYear, 2);
20766 }
20767 if (token === "Yo") {
20768 return localize2.ordinalNumber(weekYear, { unit: "year" });
20769 }
20770 return addLeadingZeros(weekYear, token.length);
20771 },
20772 // ISO week-numbering year
20773 R: function(date, token) {
20774 const isoWeekYear = getISOWeekYear(date);
20775 return addLeadingZeros(isoWeekYear, token.length);
20776 },
20777 // Extended year. This is a single number designating the year of this calendar system.
20778 // The main difference between `y` and `u` localizers are B.C. years:
20779 // | Year | `y` | `u` |
20780 // |------|-----|-----|
20781 // | AC 1 | 1 | 1 |
20782 // | BC 1 | 1 | 0 |
20783 // | BC 2 | 2 | -1 |
20784 // Also `yy` always returns the last two digits of a year,
20785 // while `uu` pads single digit years to 2 characters and returns other years unchanged.
20786 u: function(date, token) {
20787 const year = date.getFullYear();
20788 return addLeadingZeros(year, token.length);
20789 },
20790 // Quarter
20791 Q: function(date, token, localize2) {
20792 const quarter = Math.ceil((date.getMonth() + 1) / 3);
20793 switch (token) {
20794 // 1, 2, 3, 4
20795 case "Q":
20796 return String(quarter);
20797 // 01, 02, 03, 04
20798 case "QQ":
20799 return addLeadingZeros(quarter, 2);
20800 // 1st, 2nd, 3rd, 4th
20801 case "Qo":
20802 return localize2.ordinalNumber(quarter, { unit: "quarter" });
20803 // Q1, Q2, Q3, Q4
20804 case "QQQ":
20805 return localize2.quarter(quarter, {
20806 width: "abbreviated",
20807 context: "formatting"
20808 });
20809 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
20810 case "QQQQQ":
20811 return localize2.quarter(quarter, {
20812 width: "narrow",
20813 context: "formatting"
20814 });
20815 // 1st quarter, 2nd quarter, ...
20816 case "QQQQ":
20817 default:
20818 return localize2.quarter(quarter, {
20819 width: "wide",
20820 context: "formatting"
20821 });
20822 }
20823 },
20824 // Stand-alone quarter
20825 q: function(date, token, localize2) {
20826 const quarter = Math.ceil((date.getMonth() + 1) / 3);
20827 switch (token) {
20828 // 1, 2, 3, 4
20829 case "q":
20830 return String(quarter);
20831 // 01, 02, 03, 04
20832 case "qq":
20833 return addLeadingZeros(quarter, 2);
20834 // 1st, 2nd, 3rd, 4th
20835 case "qo":
20836 return localize2.ordinalNumber(quarter, { unit: "quarter" });
20837 // Q1, Q2, Q3, Q4
20838 case "qqq":
20839 return localize2.quarter(quarter, {
20840 width: "abbreviated",
20841 context: "standalone"
20842 });
20843 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
20844 case "qqqqq":
20845 return localize2.quarter(quarter, {
20846 width: "narrow",
20847 context: "standalone"
20848 });
20849 // 1st quarter, 2nd quarter, ...
20850 case "qqqq":
20851 default:
20852 return localize2.quarter(quarter, {
20853 width: "wide",
20854 context: "standalone"
20855 });
20856 }
20857 },
20858 // Month
20859 M: function(date, token, localize2) {
20860 const month = date.getMonth();
20861 switch (token) {
20862 case "M":
20863 case "MM":
20864 return lightFormatters.M(date, token);
20865 // 1st, 2nd, ..., 12th
20866 case "Mo":
20867 return localize2.ordinalNumber(month + 1, { unit: "month" });
20868 // Jan, Feb, ..., Dec
20869 case "MMM":
20870 return localize2.month(month, {
20871 width: "abbreviated",
20872 context: "formatting"
20873 });
20874 // J, F, ..., D
20875 case "MMMMM":
20876 return localize2.month(month, {
20877 width: "narrow",
20878 context: "formatting"
20879 });
20880 // January, February, ..., December
20881 case "MMMM":
20882 default:
20883 return localize2.month(month, { width: "wide", context: "formatting" });
20884 }
20885 },
20886 // Stand-alone month
20887 L: function(date, token, localize2) {
20888 const month = date.getMonth();
20889 switch (token) {
20890 // 1, 2, ..., 12
20891 case "L":
20892 return String(month + 1);
20893 // 01, 02, ..., 12
20894 case "LL":
20895 return addLeadingZeros(month + 1, 2);
20896 // 1st, 2nd, ..., 12th
20897 case "Lo":
20898 return localize2.ordinalNumber(month + 1, { unit: "month" });
20899 // Jan, Feb, ..., Dec
20900 case "LLL":
20901 return localize2.month(month, {
20902 width: "abbreviated",
20903 context: "standalone"
20904 });
20905 // J, F, ..., D
20906 case "LLLLL":
20907 return localize2.month(month, {
20908 width: "narrow",
20909 context: "standalone"
20910 });
20911 // January, February, ..., December
20912 case "LLLL":
20913 default:
20914 return localize2.month(month, { width: "wide", context: "standalone" });
20915 }
20916 },
20917 // Local week of year
20918 w: function(date, token, localize2, options) {
20919 const week = getWeek(date, options);
20920 if (token === "wo") {
20921 return localize2.ordinalNumber(week, { unit: "week" });
20922 }
20923 return addLeadingZeros(week, token.length);
20924 },
20925 // ISO week of year
20926 I: function(date, token, localize2) {
20927 const isoWeek = getISOWeek(date);
20928 if (token === "Io") {
20929 return localize2.ordinalNumber(isoWeek, { unit: "week" });
20930 }
20931 return addLeadingZeros(isoWeek, token.length);
20932 },
20933 // Day of the month
20934 d: function(date, token, localize2) {
20935 if (token === "do") {
20936 return localize2.ordinalNumber(date.getDate(), { unit: "date" });
20937 }
20938 return lightFormatters.d(date, token);
20939 },
20940 // Day of year
20941 D: function(date, token, localize2) {
20942 const dayOfYear = getDayOfYear(date);
20943 if (token === "Do") {
20944 return localize2.ordinalNumber(dayOfYear, { unit: "dayOfYear" });
20945 }
20946 return addLeadingZeros(dayOfYear, token.length);
20947 },
20948 // Day of week
20949 E: function(date, token, localize2) {
20950 const dayOfWeek = date.getDay();
20951 switch (token) {
20952 // Tue
20953 case "E":
20954 case "EE":
20955 case "EEE":
20956 return localize2.day(dayOfWeek, {
20957 width: "abbreviated",
20958 context: "formatting"
20959 });
20960 // T
20961 case "EEEEE":
20962 return localize2.day(dayOfWeek, {
20963 width: "narrow",
20964 context: "formatting"
20965 });
20966 // Tu
20967 case "EEEEEE":
20968 return localize2.day(dayOfWeek, {
20969 width: "short",
20970 context: "formatting"
20971 });
20972 // Tuesday
20973 case "EEEE":
20974 default:
20975 return localize2.day(dayOfWeek, {
20976 width: "wide",
20977 context: "formatting"
20978 });
20979 }
20980 },
20981 // Local day of week
20982 e: function(date, token, localize2, options) {
20983 const dayOfWeek = date.getDay();
20984 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
20985 switch (token) {
20986 // Numerical value (Nth day of week with current locale or weekStartsOn)
20987 case "e":
20988 return String(localDayOfWeek);
20989 // Padded numerical value
20990 case "ee":
20991 return addLeadingZeros(localDayOfWeek, 2);
20992 // 1st, 2nd, ..., 7th
20993 case "eo":
20994 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
20995 case "eee":
20996 return localize2.day(dayOfWeek, {
20997 width: "abbreviated",
20998 context: "formatting"
20999 });
21000 // T
21001 case "eeeee":
21002 return localize2.day(dayOfWeek, {
21003 width: "narrow",
21004 context: "formatting"
21005 });
21006 // Tu
21007 case "eeeeee":
21008 return localize2.day(dayOfWeek, {
21009 width: "short",
21010 context: "formatting"
21011 });
21012 // Tuesday
21013 case "eeee":
21014 default:
21015 return localize2.day(dayOfWeek, {
21016 width: "wide",
21017 context: "formatting"
21018 });
21019 }
21020 },
21021 // Stand-alone local day of week
21022 c: function(date, token, localize2, options) {
21023 const dayOfWeek = date.getDay();
21024 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
21025 switch (token) {
21026 // Numerical value (same as in `e`)
21027 case "c":
21028 return String(localDayOfWeek);
21029 // Padded numerical value
21030 case "cc":
21031 return addLeadingZeros(localDayOfWeek, token.length);
21032 // 1st, 2nd, ..., 7th
21033 case "co":
21034 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
21035 case "ccc":
21036 return localize2.day(dayOfWeek, {
21037 width: "abbreviated",
21038 context: "standalone"
21039 });
21040 // T
21041 case "ccccc":
21042 return localize2.day(dayOfWeek, {
21043 width: "narrow",
21044 context: "standalone"
21045 });
21046 // Tu
21047 case "cccccc":
21048 return localize2.day(dayOfWeek, {
21049 width: "short",
21050 context: "standalone"
21051 });
21052 // Tuesday
21053 case "cccc":
21054 default:
21055 return localize2.day(dayOfWeek, {
21056 width: "wide",
21057 context: "standalone"
21058 });
21059 }
21060 },
21061 // ISO day of week
21062 i: function(date, token, localize2) {
21063 const dayOfWeek = date.getDay();
21064 const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
21065 switch (token) {
21066 // 2
21067 case "i":
21068 return String(isoDayOfWeek);
21069 // 02
21070 case "ii":
21071 return addLeadingZeros(isoDayOfWeek, token.length);
21072 // 2nd
21073 case "io":
21074 return localize2.ordinalNumber(isoDayOfWeek, { unit: "day" });
21075 // Tue
21076 case "iii":
21077 return localize2.day(dayOfWeek, {
21078 width: "abbreviated",
21079 context: "formatting"
21080 });
21081 // T
21082 case "iiiii":
21083 return localize2.day(dayOfWeek, {
21084 width: "narrow",
21085 context: "formatting"
21086 });
21087 // Tu
21088 case "iiiiii":
21089 return localize2.day(dayOfWeek, {
21090 width: "short",
21091 context: "formatting"
21092 });
21093 // Tuesday
21094 case "iiii":
21095 default:
21096 return localize2.day(dayOfWeek, {
21097 width: "wide",
21098 context: "formatting"
21099 });
21100 }
21101 },
21102 // AM or PM
21103 a: function(date, token, localize2) {
21104 const hours = date.getHours();
21105 const dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
21106 switch (token) {
21107 case "a":
21108 case "aa":
21109 return localize2.dayPeriod(dayPeriodEnumValue, {
21110 width: "abbreviated",
21111 context: "formatting"
21112 });
21113 case "aaa":
21114 return localize2.dayPeriod(dayPeriodEnumValue, {
21115 width: "abbreviated",
21116 context: "formatting"
21117 }).toLowerCase();
21118 case "aaaaa":
21119 return localize2.dayPeriod(dayPeriodEnumValue, {
21120 width: "narrow",
21121 context: "formatting"
21122 });
21123 case "aaaa":
21124 default:
21125 return localize2.dayPeriod(dayPeriodEnumValue, {
21126 width: "wide",
21127 context: "formatting"
21128 });
21129 }
21130 },
21131 // AM, PM, midnight, noon
21132 b: function(date, token, localize2) {
21133 const hours = date.getHours();
21134 let dayPeriodEnumValue;
21135 if (hours === 12) {
21136 dayPeriodEnumValue = dayPeriodEnum.noon;
21137 } else if (hours === 0) {
21138 dayPeriodEnumValue = dayPeriodEnum.midnight;
21139 } else {
21140 dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
21141 }
21142 switch (token) {
21143 case "b":
21144 case "bb":
21145 return localize2.dayPeriod(dayPeriodEnumValue, {
21146 width: "abbreviated",
21147 context: "formatting"
21148 });
21149 case "bbb":
21150 return localize2.dayPeriod(dayPeriodEnumValue, {
21151 width: "abbreviated",
21152 context: "formatting"
21153 }).toLowerCase();
21154 case "bbbbb":
21155 return localize2.dayPeriod(dayPeriodEnumValue, {
21156 width: "narrow",
21157 context: "formatting"
21158 });
21159 case "bbbb":
21160 default:
21161 return localize2.dayPeriod(dayPeriodEnumValue, {
21162 width: "wide",
21163 context: "formatting"
21164 });
21165 }
21166 },
21167 // in the morning, in the afternoon, in the evening, at night
21168 B: function(date, token, localize2) {
21169 const hours = date.getHours();
21170 let dayPeriodEnumValue;
21171 if (hours >= 17) {
21172 dayPeriodEnumValue = dayPeriodEnum.evening;
21173 } else if (hours >= 12) {
21174 dayPeriodEnumValue = dayPeriodEnum.afternoon;
21175 } else if (hours >= 4) {
21176 dayPeriodEnumValue = dayPeriodEnum.morning;
21177 } else {
21178 dayPeriodEnumValue = dayPeriodEnum.night;
21179 }
21180 switch (token) {
21181 case "B":
21182 case "BB":
21183 case "BBB":
21184 return localize2.dayPeriod(dayPeriodEnumValue, {
21185 width: "abbreviated",
21186 context: "formatting"
21187 });
21188 case "BBBBB":
21189 return localize2.dayPeriod(dayPeriodEnumValue, {
21190 width: "narrow",
21191 context: "formatting"
21192 });
21193 case "BBBB":
21194 default:
21195 return localize2.dayPeriod(dayPeriodEnumValue, {
21196 width: "wide",
21197 context: "formatting"
21198 });
21199 }
21200 },
21201 // Hour [1-12]
21202 h: function(date, token, localize2) {
21203 if (token === "ho") {
21204 let hours = date.getHours() % 12;
21205 if (hours === 0) hours = 12;
21206 return localize2.ordinalNumber(hours, { unit: "hour" });
21207 }
21208 return lightFormatters.h(date, token);
21209 },
21210 // Hour [0-23]
21211 H: function(date, token, localize2) {
21212 if (token === "Ho") {
21213 return localize2.ordinalNumber(date.getHours(), { unit: "hour" });
21214 }
21215 return lightFormatters.H(date, token);
21216 },
21217 // Hour [0-11]
21218 K: function(date, token, localize2) {
21219 const hours = date.getHours() % 12;
21220 if (token === "Ko") {
21221 return localize2.ordinalNumber(hours, { unit: "hour" });
21222 }
21223 return addLeadingZeros(hours, token.length);
21224 },
21225 // Hour [1-24]
21226 k: function(date, token, localize2) {
21227 let hours = date.getHours();
21228 if (hours === 0) hours = 24;
21229 if (token === "ko") {
21230 return localize2.ordinalNumber(hours, { unit: "hour" });
21231 }
21232 return addLeadingZeros(hours, token.length);
21233 },
21234 // Minute
21235 m: function(date, token, localize2) {
21236 if (token === "mo") {
21237 return localize2.ordinalNumber(date.getMinutes(), { unit: "minute" });
21238 }
21239 return lightFormatters.m(date, token);
21240 },
21241 // Second
21242 s: function(date, token, localize2) {
21243 if (token === "so") {
21244 return localize2.ordinalNumber(date.getSeconds(), { unit: "second" });
21245 }
21246 return lightFormatters.s(date, token);
21247 },
21248 // Fraction of second
21249 S: function(date, token) {
21250 return lightFormatters.S(date, token);
21251 },
21252 // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)
21253 X: function(date, token, _localize) {
21254 const timezoneOffset = date.getTimezoneOffset();
21255 if (timezoneOffset === 0) {
21256 return "Z";
21257 }
21258 switch (token) {
21259 // Hours and optional minutes
21260 case "X":
21261 return formatTimezoneWithOptionalMinutes(timezoneOffset);
21262 // Hours, minutes and optional seconds without `:` delimiter
21263 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21264 // so this token always has the same output as `XX`
21265 case "XXXX":
21266 case "XX":
21267 return formatTimezone(timezoneOffset);
21268 // Hours, minutes and optional seconds with `:` delimiter
21269 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21270 // so this token always has the same output as `XXX`
21271 case "XXXXX":
21272 case "XXX":
21273 // Hours and minutes with `:` delimiter
21274 default:
21275 return formatTimezone(timezoneOffset, ":");
21276 }
21277 },
21278 // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)
21279 x: function(date, token, _localize) {
21280 const timezoneOffset = date.getTimezoneOffset();
21281 switch (token) {
21282 // Hours and optional minutes
21283 case "x":
21284 return formatTimezoneWithOptionalMinutes(timezoneOffset);
21285 // Hours, minutes and optional seconds without `:` delimiter
21286 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21287 // so this token always has the same output as `xx`
21288 case "xxxx":
21289 case "xx":
21290 return formatTimezone(timezoneOffset);
21291 // Hours, minutes and optional seconds with `:` delimiter
21292 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
21293 // so this token always has the same output as `xxx`
21294 case "xxxxx":
21295 case "xxx":
21296 // Hours and minutes with `:` delimiter
21297 default:
21298 return formatTimezone(timezoneOffset, ":");
21299 }
21300 },
21301 // Timezone (GMT)
21302 O: function(date, token, _localize) {
21303 const timezoneOffset = date.getTimezoneOffset();
21304 switch (token) {
21305 // Short
21306 case "O":
21307 case "OO":
21308 case "OOO":
21309 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
21310 // Long
21311 case "OOOO":
21312 default:
21313 return "GMT" + formatTimezone(timezoneOffset, ":");
21314 }
21315 },
21316 // Timezone (specific non-location)
21317 z: function(date, token, _localize) {
21318 const timezoneOffset = date.getTimezoneOffset();
21319 switch (token) {
21320 // Short
21321 case "z":
21322 case "zz":
21323 case "zzz":
21324 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
21325 // Long
21326 case "zzzz":
21327 default:
21328 return "GMT" + formatTimezone(timezoneOffset, ":");
21329 }
21330 },
21331 // Seconds timestamp
21332 t: function(date, token, _localize) {
21333 const timestamp = Math.trunc(+date / 1e3);
21334 return addLeadingZeros(timestamp, token.length);
21335 },
21336 // Milliseconds timestamp
21337 T: function(date, token, _localize) {
21338 return addLeadingZeros(+date, token.length);
21339 }
21340 };
21341 function formatTimezoneShort(offset4, delimiter = "") {
21342 const sign = offset4 > 0 ? "-" : "+";
21343 const absOffset = Math.abs(offset4);
21344 const hours = Math.trunc(absOffset / 60);
21345 const minutes = absOffset % 60;
21346 if (minutes === 0) {
21347 return sign + String(hours);
21348 }
21349 return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
21350 }
21351 function formatTimezoneWithOptionalMinutes(offset4, delimiter) {
21352 if (offset4 % 60 === 0) {
21353 const sign = offset4 > 0 ? "-" : "+";
21354 return sign + addLeadingZeros(Math.abs(offset4) / 60, 2);
21355 }
21356 return formatTimezone(offset4, delimiter);
21357 }
21358 function formatTimezone(offset4, delimiter = "") {
21359 const sign = offset4 > 0 ? "-" : "+";
21360 const absOffset = Math.abs(offset4);
21361 const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);
21362 const minutes = addLeadingZeros(absOffset % 60, 2);
21363 return sign + hours + delimiter + minutes;
21364 }
21365
21366 // packages/dataviews/node_modules/date-fns/_lib/format/longFormatters.js
21367 var dateLongFormatter = (pattern, formatLong2) => {
21368 switch (pattern) {
21369 case "P":
21370 return formatLong2.date({ width: "short" });
21371 case "PP":
21372 return formatLong2.date({ width: "medium" });
21373 case "PPP":
21374 return formatLong2.date({ width: "long" });
21375 case "PPPP":
21376 default:
21377 return formatLong2.date({ width: "full" });
21378 }
21379 };
21380 var timeLongFormatter = (pattern, formatLong2) => {
21381 switch (pattern) {
21382 case "p":
21383 return formatLong2.time({ width: "short" });
21384 case "pp":
21385 return formatLong2.time({ width: "medium" });
21386 case "ppp":
21387 return formatLong2.time({ width: "long" });
21388 case "pppp":
21389 default:
21390 return formatLong2.time({ width: "full" });
21391 }
21392 };
21393 var dateTimeLongFormatter = (pattern, formatLong2) => {
21394 const matchResult = pattern.match(/(P+)(p+)?/) || [];
21395 const datePattern = matchResult[1];
21396 const timePattern = matchResult[2];
21397 if (!timePattern) {
21398 return dateLongFormatter(pattern, formatLong2);
21399 }
21400 let dateTimeFormat;
21401 switch (datePattern) {
21402 case "P":
21403 dateTimeFormat = formatLong2.dateTime({ width: "short" });
21404 break;
21405 case "PP":
21406 dateTimeFormat = formatLong2.dateTime({ width: "medium" });
21407 break;
21408 case "PPP":
21409 dateTimeFormat = formatLong2.dateTime({ width: "long" });
21410 break;
21411 case "PPPP":
21412 default:
21413 dateTimeFormat = formatLong2.dateTime({ width: "full" });
21414 break;
21415 }
21416 return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
21417 };
21418 var longFormatters = {
21419 p: timeLongFormatter,
21420 P: dateTimeLongFormatter
21421 };
21422
21423 // packages/dataviews/node_modules/date-fns/_lib/protectedTokens.js
21424 var dayOfYearTokenRE = /^D+$/;
21425 var weekYearTokenRE = /^Y+$/;
21426 var throwTokens = ["D", "DD", "YY", "YYYY"];
21427 function isProtectedDayOfYearToken(token) {
21428 return dayOfYearTokenRE.test(token);
21429 }
21430 function isProtectedWeekYearToken(token) {
21431 return weekYearTokenRE.test(token);
21432 }
21433 function warnOrThrowProtectedError(token, format6, input) {
21434 const _message = message(token, format6, input);
21435 console.warn(_message);
21436 if (throwTokens.includes(token)) throw new RangeError(_message);
21437 }
21438 function message(token, format6, input) {
21439 const subject = token[0] === "Y" ? "years" : "days of the month";
21440 return `Use \`${token.toLowerCase()}\` instead of \`${token}\` (in \`${format6}\`) for formatting ${subject} to the input \`${input}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;
21441 }
21442
21443 // packages/dataviews/node_modules/date-fns/format.js
21444 var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
21445 var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
21446 var escapedStringRegExp = /^'([^]*?)'?$/;
21447 var doubleQuoteRegExp = /''/g;
21448 var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
21449 function format(date, formatStr, options) {
21450 const defaultOptions2 = getDefaultOptions();
21451 const locale = options?.locale ?? defaultOptions2.locale ?? enUS;
21452 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
21453 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
21454 const originalDate = toDate(date, options?.in);
21455 if (!isValid(originalDate)) {
21456 throw new RangeError("Invalid time value");
21457 }
21458 let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => {
21459 const firstCharacter = substring[0];
21460 if (firstCharacter === "p" || firstCharacter === "P") {
21461 const longFormatter = longFormatters[firstCharacter];
21462 return longFormatter(substring, locale.formatLong);
21463 }
21464 return substring;
21465 }).join("").match(formattingTokensRegExp).map((substring) => {
21466 if (substring === "''") {
21467 return { isToken: false, value: "'" };
21468 }
21469 const firstCharacter = substring[0];
21470 if (firstCharacter === "'") {
21471 return { isToken: false, value: cleanEscapedString(substring) };
21472 }
21473 if (formatters[firstCharacter]) {
21474 return { isToken: true, value: substring };
21475 }
21476 if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
21477 throw new RangeError(
21478 "Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"
21479 );
21480 }
21481 return { isToken: false, value: substring };
21482 });
21483 if (locale.localize.preprocessor) {
21484 parts = locale.localize.preprocessor(originalDate, parts);
21485 }
21486 const formatterOptions = {
21487 firstWeekContainsDate,
21488 weekStartsOn,
21489 locale
21490 };
21491 return parts.map((part) => {
21492 if (!part.isToken) return part.value;
21493 const token = part.value;
21494 if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) {
21495 warnOrThrowProtectedError(token, formatStr, String(date));
21496 }
21497 const formatter = formatters[token[0]];
21498 return formatter(originalDate, token, locale.localize, formatterOptions);
21499 }).join("");
21500 }
21501 function cleanEscapedString(input) {
21502 const matched = input.match(escapedStringRegExp);
21503 if (!matched) {
21504 return input;
21505 }
21506 return matched[1].replace(doubleQuoteRegExp, "'");
21507 }
21508
21509 // packages/dataviews/node_modules/date-fns/subDays.js
21510 function subDays(date, amount, options) {
21511 return addDays(date, -amount, options);
21512 }
21513
21514 // packages/dataviews/node_modules/date-fns/subMonths.js
21515 function subMonths(date, amount, options) {
21516 return addMonths(date, -amount, options);
21517 }
21518
21519 // packages/dataviews/node_modules/date-fns/subWeeks.js
21520 function subWeeks(date, amount, options) {
21521 return addWeeks(date, -amount, options);
21522 }
21523
21524 // packages/dataviews/node_modules/date-fns/subYears.js
21525 function subYears(date, amount, options) {
21526 return addYears(date, -amount, options);
21527 }
21528
21529 // packages/dataviews/build-module/utils/operators.mjs
21530 var import_i18n25 = __toESM(require_i18n(), 1);
21531 var import_element54 = __toESM(require_element(), 1);
21532 var import_date = __toESM(require_date(), 1);
21533 var import_jsx_runtime81 = __toESM(require_jsx_runtime(), 1);
21534 var filterTextWrappers = {
21535 Name: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { className: "dataviews-filters__summary-filter-text-name" }),
21536 Value: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { className: "dataviews-filters__summary-filter-text-value" })
21537 };
21538 function getRelativeDate(value, unit) {
21539 switch (unit) {
21540 case "days":
21541 return subDays(/* @__PURE__ */ new Date(), value);
21542 case "weeks":
21543 return subWeeks(/* @__PURE__ */ new Date(), value);
21544 case "months":
21545 return subMonths(/* @__PURE__ */ new Date(), value);
21546 case "years":
21547 return subYears(/* @__PURE__ */ new Date(), value);
21548 default:
21549 return /* @__PURE__ */ new Date();
21550 }
21551 }
21552 var isNoneOperatorDefinition = {
21553 /* translators: DataViews operator name */
21554 label: (0, import_i18n25.__)("Is none of"),
21555 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21556 (0, import_i18n25.sprintf)(
21557 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */
21558 (0, import_i18n25.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"),
21559 filter.name,
21560 activeElements.map((element) => element.label).join(", ")
21561 ),
21562 filterTextWrappers
21563 ),
21564 filter: ((item, field, filterValue) => {
21565 if (!filterValue?.length) {
21566 return true;
21567 }
21568 const fieldValue = field.getValue({ item });
21569 if (Array.isArray(fieldValue)) {
21570 return !filterValue.some(
21571 (fv) => fieldValue.includes(fv)
21572 );
21573 } else if (typeof fieldValue === "string") {
21574 return !filterValue.includes(fieldValue);
21575 }
21576 return false;
21577 }),
21578 selection: "multi"
21579 };
21580 var OPERATORS = [
21581 {
21582 name: OPERATOR_IS_ANY,
21583 /* translators: DataViews operator name */
21584 label: (0, import_i18n25.__)("Includes"),
21585 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21586 (0, import_i18n25.sprintf)(
21587 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is any: Admin, Editor". */
21588 (0, import_i18n25.__)("<Name>%1$s includes: </Name><Value>%2$s</Value>"),
21589 filter.name,
21590 activeElements.map((element) => element.label).join(", ")
21591 ),
21592 filterTextWrappers
21593 ),
21594 filter(item, field, filterValue) {
21595 if (!filterValue?.length) {
21596 return true;
21597 }
21598 const fieldValue = field.getValue({ item });
21599 if (Array.isArray(fieldValue)) {
21600 return filterValue.some(
21601 (fv) => fieldValue.includes(fv)
21602 );
21603 } else if (typeof fieldValue === "string") {
21604 return filterValue.includes(fieldValue);
21605 }
21606 return false;
21607 },
21608 selection: "multi"
21609 },
21610 {
21611 name: OPERATOR_IS_NONE,
21612 ...isNoneOperatorDefinition
21613 },
21614 {
21615 name: OPERATOR_IS_ALL,
21616 /* translators: DataViews operator name */
21617 label: (0, import_i18n25.__)("Includes all"),
21618 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21619 (0, import_i18n25.sprintf)(
21620 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author includes all: Admin, Editor". */
21621 (0, import_i18n25.__)("<Name>%1$s includes all: </Name><Value>%2$s</Value>"),
21622 filter.name,
21623 activeElements.map((element) => element.label).join(", ")
21624 ),
21625 filterTextWrappers
21626 ),
21627 filter(item, field, filterValue) {
21628 if (!filterValue?.length) {
21629 return true;
21630 }
21631 return filterValue.every((value) => {
21632 return field.getValue({ item })?.includes(value);
21633 });
21634 },
21635 selection: "multi"
21636 },
21637 {
21638 name: OPERATOR_IS_NOT_ALL,
21639 ...isNoneOperatorDefinition
21640 },
21641 {
21642 name: OPERATOR_BETWEEN,
21643 /* translators: DataViews operator name */
21644 label: (0, import_i18n25.__)("Between (inc)"),
21645 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21646 (0, import_i18n25.sprintf)(
21647 /* 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". */
21648 (0, import_i18n25.__)(
21649 "<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>"
21650 ),
21651 filter.name,
21652 activeElements[0].label[0],
21653 activeElements[0].label[1]
21654 ),
21655 filterTextWrappers
21656 ),
21657 filter(item, field, filterValue) {
21658 if (!Array.isArray(filterValue) || filterValue.length !== 2 || filterValue[0] === void 0 || filterValue[1] === void 0) {
21659 return true;
21660 }
21661 const fieldValue = field.getValue({ item });
21662 if (typeof fieldValue === "number" || fieldValue instanceof Date || typeof fieldValue === "string") {
21663 return fieldValue >= filterValue[0] && fieldValue <= filterValue[1];
21664 }
21665 return false;
21666 },
21667 selection: "custom"
21668 },
21669 {
21670 name: OPERATOR_IN_THE_PAST,
21671 /* translators: DataViews operator name */
21672 label: (0, import_i18n25.__)("In the past"),
21673 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21674 (0, import_i18n25.sprintf)(
21675 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is in the past: 7 days". */
21676 (0, import_i18n25.__)(
21677 "<Name>%1$s is in the past: </Name><Value>%2$s</Value>"
21678 ),
21679 filter.name,
21680 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
21681 ),
21682 filterTextWrappers
21683 ),
21684 filter(item, field, filterValue) {
21685 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
21686 return true;
21687 }
21688 const targetDate = getRelativeDate(
21689 filterValue.value,
21690 filterValue.unit
21691 );
21692 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
21693 return fieldValue >= targetDate && fieldValue <= /* @__PURE__ */ new Date();
21694 },
21695 selection: "custom"
21696 },
21697 {
21698 name: OPERATOR_OVER,
21699 /* translators: DataViews operator name */
21700 label: (0, import_i18n25.__)("Over"),
21701 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21702 (0, import_i18n25.sprintf)(
21703 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is over: 7 days". */
21704 (0, import_i18n25.__)("<Name>%1$s is over: </Name><Value>%2$s</Value>"),
21705 filter.name,
21706 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
21707 ),
21708 filterTextWrappers
21709 ),
21710 filter(item, field, filterValue) {
21711 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
21712 return true;
21713 }
21714 const targetDate = getRelativeDate(
21715 filterValue.value,
21716 filterValue.unit
21717 );
21718 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
21719 return fieldValue < targetDate;
21720 },
21721 selection: "custom"
21722 },
21723 {
21724 name: OPERATOR_IS,
21725 /* translators: DataViews operator name */
21726 label: (0, import_i18n25.__)("Is"),
21727 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21728 (0, import_i18n25.sprintf)(
21729 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is: Admin". */
21730 (0, import_i18n25.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
21731 filter.name,
21732 activeElements[0].label
21733 ),
21734 filterTextWrappers
21735 ),
21736 filter(item, field, filterValue) {
21737 return filterValue === field.getValue({ item }) || filterValue === void 0;
21738 },
21739 selection: "single"
21740 },
21741 {
21742 name: OPERATOR_IS_NOT,
21743 /* translators: DataViews operator name */
21744 label: (0, import_i18n25.__)("Is not"),
21745 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21746 (0, import_i18n25.sprintf)(
21747 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is not: Admin". */
21748 (0, import_i18n25.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
21749 filter.name,
21750 activeElements[0].label
21751 ),
21752 filterTextWrappers
21753 ),
21754 filter(item, field, filterValue) {
21755 return filterValue !== field.getValue({ item });
21756 },
21757 selection: "single"
21758 },
21759 {
21760 name: OPERATOR_LESS_THAN,
21761 /* translators: DataViews operator name */
21762 label: (0, import_i18n25.__)("Less than"),
21763 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21764 (0, import_i18n25.sprintf)(
21765 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than: 10". */
21766 (0, import_i18n25.__)("<Name>%1$s is less than: </Name><Value>%2$s</Value>"),
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_GREATER_THAN,
21783 /* translators: DataViews operator name */
21784 label: (0, import_i18n25.__)("Greater than"),
21785 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21786 (0, import_i18n25.sprintf)(
21787 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than: 10". */
21788 (0, import_i18n25.__)(
21789 "<Name>%1$s is greater than: </Name><Value>%2$s</Value>"
21790 ),
21791 filter.name,
21792 activeElements[0].label
21793 ),
21794 filterTextWrappers
21795 ),
21796 filter(item, field, filterValue) {
21797 if (filterValue === void 0) {
21798 return true;
21799 }
21800 const fieldValue = field.getValue({ item });
21801 return fieldValue > filterValue;
21802 },
21803 selection: "single"
21804 },
21805 {
21806 name: OPERATOR_LESS_THAN_OR_EQUAL,
21807 /* translators: DataViews operator name */
21808 label: (0, import_i18n25.__)("Less than or equal"),
21809 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21810 (0, import_i18n25.sprintf)(
21811 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than or equal to: 10". */
21812 (0, import_i18n25.__)(
21813 "<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>"
21814 ),
21815 filter.name,
21816 activeElements[0].label
21817 ),
21818 filterTextWrappers
21819 ),
21820 filter(item, field, filterValue) {
21821 if (filterValue === void 0) {
21822 return true;
21823 }
21824 const fieldValue = field.getValue({ item });
21825 return fieldValue <= filterValue;
21826 },
21827 selection: "single"
21828 },
21829 {
21830 name: OPERATOR_GREATER_THAN_OR_EQUAL,
21831 /* translators: DataViews operator name */
21832 label: (0, import_i18n25.__)("Greater than or equal"),
21833 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21834 (0, import_i18n25.sprintf)(
21835 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than or equal to: 10". */
21836 (0, import_i18n25.__)(
21837 "<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>"
21838 ),
21839 filter.name,
21840 activeElements[0].label
21841 ),
21842 filterTextWrappers
21843 ),
21844 filter(item, field, filterValue) {
21845 if (filterValue === void 0) {
21846 return true;
21847 }
21848 const fieldValue = field.getValue({ item });
21849 return fieldValue >= filterValue;
21850 },
21851 selection: "single"
21852 },
21853 {
21854 name: OPERATOR_BEFORE,
21855 /* translators: DataViews operator name */
21856 label: (0, import_i18n25.__)("Before"),
21857 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21858 (0, import_i18n25.sprintf)(
21859 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is before: 2024-01-01". */
21860 (0, import_i18n25.__)("<Name>%1$s is before: </Name><Value>%2$s</Value>"),
21861 filter.name,
21862 activeElements[0].label
21863 ),
21864 filterTextWrappers
21865 ),
21866 filter(item, field, filterValue) {
21867 if (filterValue === void 0) {
21868 return true;
21869 }
21870 const filterDate = (0, import_date.getDate)(filterValue);
21871 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21872 return fieldDate < filterDate;
21873 },
21874 selection: "single"
21875 },
21876 {
21877 name: OPERATOR_AFTER,
21878 /* translators: DataViews operator name */
21879 label: (0, import_i18n25.__)("After"),
21880 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21881 (0, import_i18n25.sprintf)(
21882 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is after: 2024-01-01". */
21883 (0, import_i18n25.__)("<Name>%1$s is after: </Name><Value>%2$s</Value>"),
21884 filter.name,
21885 activeElements[0].label
21886 ),
21887 filterTextWrappers
21888 ),
21889 filter(item, field, filterValue) {
21890 if (filterValue === void 0) {
21891 return true;
21892 }
21893 const filterDate = (0, import_date.getDate)(filterValue);
21894 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21895 return fieldDate > filterDate;
21896 },
21897 selection: "single"
21898 },
21899 {
21900 name: OPERATOR_BEFORE_INC,
21901 /* translators: DataViews operator name */
21902 label: (0, import_i18n25.__)("Before (inc)"),
21903 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21904 (0, import_i18n25.sprintf)(
21905 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or before: 2024-01-01". */
21906 (0, import_i18n25.__)(
21907 "<Name>%1$s is on or before: </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 filterDate = (0, import_date.getDate)(filterValue);
21919 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21920 return fieldDate <= filterDate;
21921 },
21922 selection: "single"
21923 },
21924 {
21925 name: OPERATOR_AFTER_INC,
21926 /* translators: DataViews operator name */
21927 label: (0, import_i18n25.__)("After (inc)"),
21928 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21929 (0, import_i18n25.sprintf)(
21930 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or after: 2024-01-01". */
21931 (0, import_i18n25.__)(
21932 "<Name>%1$s is on or after: </Name><Value>%2$s</Value>"
21933 ),
21934 filter.name,
21935 activeElements[0].label
21936 ),
21937 filterTextWrappers
21938 ),
21939 filter(item, field, filterValue) {
21940 if (filterValue === void 0) {
21941 return true;
21942 }
21943 const filterDate = (0, import_date.getDate)(filterValue);
21944 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
21945 return fieldDate >= filterDate;
21946 },
21947 selection: "single"
21948 },
21949 {
21950 name: OPERATOR_CONTAINS,
21951 /* translators: DataViews operator name */
21952 label: (0, import_i18n25.__)("Contains"),
21953 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21954 (0, import_i18n25.sprintf)(
21955 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title contains: Hello". */
21956 (0, import_i18n25.__)("<Name>%1$s contains: </Name><Value>%2$s</Value>"),
21957 filter.name,
21958 activeElements[0].label
21959 ),
21960 filterTextWrappers
21961 ),
21962 filter(item, field, filterValue) {
21963 if (filterValue === void 0) {
21964 return true;
21965 }
21966 const fieldValue = field.getValue({ item });
21967 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
21968 },
21969 selection: "single"
21970 },
21971 {
21972 name: OPERATOR_NOT_CONTAINS,
21973 /* translators: DataViews operator name */
21974 label: (0, import_i18n25.__)("Doesn't contain"),
21975 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
21976 (0, import_i18n25.sprintf)(
21977 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title doesn't contain: Hello". */
21978 (0, import_i18n25.__)(
21979 "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>"
21980 ),
21981 filter.name,
21982 activeElements[0].label
21983 ),
21984 filterTextWrappers
21985 ),
21986 filter(item, field, filterValue) {
21987 if (filterValue === void 0) {
21988 return true;
21989 }
21990 const fieldValue = field.getValue({ item });
21991 return typeof fieldValue === "string" && filterValue && !fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
21992 },
21993 selection: "single"
21994 },
21995 {
21996 name: OPERATOR_STARTS_WITH,
21997 /* translators: DataViews operator name */
21998 label: (0, import_i18n25.__)("Starts with"),
21999 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
22000 (0, import_i18n25.sprintf)(
22001 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title starts with: Hello". */
22002 (0, import_i18n25.__)("<Name>%1$s starts with: </Name><Value>%2$s</Value>"),
22003 filter.name,
22004 activeElements[0].label
22005 ),
22006 filterTextWrappers
22007 ),
22008 filter(item, field, filterValue) {
22009 if (filterValue === void 0) {
22010 return true;
22011 }
22012 const fieldValue = field.getValue({ item });
22013 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().startsWith(String(filterValue).toLowerCase());
22014 },
22015 selection: "single"
22016 },
22017 {
22018 name: OPERATOR_ON,
22019 /* translators: DataViews operator name */
22020 label: (0, import_i18n25.__)("On"),
22021 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
22022 (0, import_i18n25.sprintf)(
22023 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is: 2024-01-01". */
22024 (0, import_i18n25.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
22025 filter.name,
22026 activeElements[0].label
22027 ),
22028 filterTextWrappers
22029 ),
22030 filter(item, field, filterValue) {
22031 if (filterValue === void 0) {
22032 return true;
22033 }
22034 const filterDate = (0, import_date.getDate)(filterValue);
22035 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
22036 return filterDate.getTime() === fieldDate.getTime();
22037 },
22038 selection: "single"
22039 },
22040 {
22041 name: OPERATOR_NOT_ON,
22042 /* translators: DataViews operator name */
22043 label: (0, import_i18n25.__)("Not on"),
22044 filterText: (filter, activeElements) => (0, import_element54.createInterpolateElement)(
22045 (0, import_i18n25.sprintf)(
22046 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is not: 2024-01-01". */
22047 (0, import_i18n25.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
22048 filter.name,
22049 activeElements[0].label
22050 ),
22051 filterTextWrappers
22052 ),
22053 filter(item, field, filterValue) {
22054 if (filterValue === void 0) {
22055 return true;
22056 }
22057 const filterDate = (0, import_date.getDate)(filterValue);
22058 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
22059 return filterDate.getTime() !== fieldDate.getTime();
22060 },
22061 selection: "single"
22062 }
22063 ];
22064 var getOperatorByName = (name) => OPERATORS.find((op) => op.name === name);
22065 var getAllOperatorNames = () => OPERATORS.map((op) => op.name);
22066 var isSingleSelectionOperator = (name) => OPERATORS.filter((op) => op.selection === "single").some(
22067 (op) => op.name === name
22068 );
22069 var isRegisteredOperator = (name) => OPERATORS.some((op) => op.name === name);
22070
22071 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
22072 var import_jsx_runtime82 = __toESM(require_jsx_runtime(), 1);
22073 var ENTER = "Enter";
22074 var SPACE = " ";
22075 var FilterText = ({
22076 activeElements,
22077 filterInView,
22078 filter
22079 }) => {
22080 if (activeElements === void 0 || activeElements.length === 0) {
22081 return filter.name;
22082 }
22083 const operator = getOperatorByName(filterInView?.operator);
22084 if (operator !== void 0) {
22085 return operator.filterText(filter, activeElements);
22086 }
22087 return (0, import_i18n26.sprintf)(
22088 /* translators: 1: Filter name e.g.: "Unknown status for Author". */
22089 (0, import_i18n26.__)("Unknown status for %1$s"),
22090 filter.name
22091 );
22092 };
22093 function OperatorSelector({
22094 filter,
22095 view,
22096 onChangeView
22097 }) {
22098 const operatorOptions = filter.operators?.map((operator) => ({
22099 value: operator,
22100 label: getOperatorByName(operator)?.label || operator
22101 }));
22102 const currentFilter = view.filters?.find(
22103 (_filter) => _filter.field === filter.field
22104 );
22105 const value = currentFilter?.operator || filter.operators[0];
22106 return operatorOptions.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(
22107 Stack,
22108 {
22109 direction: "row",
22110 gap: "sm",
22111 justify: "flex-start",
22112 className: "dataviews-filters__summary-operators-container",
22113 align: "center",
22114 children: [
22115 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_components21.FlexItem, { className: "dataviews-filters__summary-operators-filter-name", children: filter.name }),
22116 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22117 import_components21.SelectControl,
22118 {
22119 className: "dataviews-filters__summary-operators-filter-select",
22120 label: (0, import_i18n26.__)("Conditions"),
22121 value,
22122 options: operatorOptions,
22123 onChange: (newValue) => {
22124 const newOperator = newValue;
22125 const currentOperator = currentFilter?.operator;
22126 const newFilters = currentFilter ? [
22127 ...(view.filters ?? []).map(
22128 (_filter) => {
22129 if (_filter.field === filter.field) {
22130 const currentOpSelectionModel = getOperatorByName(
22131 currentOperator
22132 )?.selection;
22133 const newOpSelectionModel = getOperatorByName(
22134 newOperator
22135 )?.selection;
22136 const shouldResetValue = currentOpSelectionModel !== newOpSelectionModel || [
22137 currentOpSelectionModel,
22138 newOpSelectionModel
22139 ].includes("custom");
22140 return {
22141 ..._filter,
22142 value: shouldResetValue ? void 0 : _filter.value,
22143 operator: newOperator
22144 };
22145 }
22146 return _filter;
22147 }
22148 )
22149 ] : [
22150 ...view.filters ?? [],
22151 {
22152 field: filter.field,
22153 operator: newOperator,
22154 value: void 0
22155 }
22156 ];
22157 onChangeView({
22158 ...view,
22159 page: 1,
22160 filters: newFilters
22161 });
22162 },
22163 size: "small",
22164 variant: "minimal",
22165 hideLabelFromVision: true
22166 }
22167 )
22168 ]
22169 }
22170 );
22171 }
22172 function Filter({
22173 addFilterRef,
22174 openedFilter,
22175 fields,
22176 ...commonProps
22177 }) {
22178 const toggleRef = (0, import_element55.useRef)(null);
22179 const { filter, view, onChangeView } = commonProps;
22180 const filterInView = view.filters?.find(
22181 (f2) => f2.field === filter.field
22182 );
22183 let activeElements = [];
22184 const field = (0, import_element55.useMemo)(() => {
22185 const currentField = fields.find((f2) => f2.id === filter.field);
22186 if (currentField) {
22187 return {
22188 ...currentField,
22189 // Configure getValue as if Item was a plain object.
22190 // See related input-widget.tsx
22191 getValue: ({ item }) => item[currentField.id]
22192 };
22193 }
22194 return currentField;
22195 }, [fields, filter.field]);
22196 const { elements } = useElements({
22197 elements: filter.elements,
22198 getElements: filter.getElements
22199 });
22200 if (elements.length > 0) {
22201 activeElements = elements.filter((element) => {
22202 if (filter.singleSelection) {
22203 return element.value === filterInView?.value;
22204 }
22205 return filterInView?.value?.includes(element.value);
22206 });
22207 } else if (Array.isArray(filterInView?.value)) {
22208 const label = filterInView.value.map((v2) => {
22209 const formattedValue = field?.getValueFormatted({
22210 item: { [field.id]: v2 },
22211 field
22212 });
22213 return formattedValue || String(v2);
22214 });
22215 activeElements = [
22216 {
22217 value: filterInView.value,
22218 // @ts-ignore
22219 label
22220 }
22221 ];
22222 } else if (typeof filterInView?.value === "object") {
22223 activeElements = [
22224 { value: filterInView.value, label: filterInView.value }
22225 ];
22226 } else if (filterInView?.value !== void 0) {
22227 const label = field !== void 0 ? field.getValueFormatted({
22228 item: { [field.id]: filterInView.value },
22229 field
22230 }) : String(filterInView.value);
22231 activeElements = [
22232 {
22233 value: filterInView.value,
22234 label
22235 }
22236 ];
22237 }
22238 const isPrimary = filter.isPrimary;
22239 const isLocked = filterInView?.isLocked;
22240 const hasValues = !isLocked && filterInView?.value !== void 0;
22241 const canResetOrRemove = !isLocked && (!isPrimary || hasValues);
22242 const resetOrRemoveLabel = isPrimary ? (0, import_i18n26.__)("Reset") : (0, import_i18n26.__)("Remove");
22243 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22244 import_components21.Dropdown,
22245 {
22246 defaultOpen: openedFilter === filter.field,
22247 contentClassName: "dataviews-filters__summary-popover",
22248 popoverProps: { placement: "bottom-start", role: "dialog" },
22249 onClose: () => {
22250 toggleRef.current?.focus();
22251 },
22252 renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { className: "dataviews-filters__summary-chip-container", children: [
22253 /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(tooltip_exports.Root, { children: [
22254 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22255 tooltip_exports.Trigger,
22256 {
22257 render: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22258 "div",
22259 {
22260 className: clsx_default(
22261 "dataviews-filters__summary-chip",
22262 {
22263 "has-reset": canResetOrRemove,
22264 "has-values": hasValues,
22265 "is-not-clickable": isLocked
22266 }
22267 ),
22268 role: "button",
22269 tabIndex: isLocked ? -1 : 0,
22270 onClick: () => {
22271 if (!isLocked) {
22272 onToggle();
22273 }
22274 },
22275 onKeyDown: (event) => {
22276 if (!isLocked && [ENTER, SPACE].includes(
22277 event.key
22278 )) {
22279 onToggle();
22280 event.preventDefault();
22281 }
22282 },
22283 "aria-disabled": isLocked,
22284 "aria-pressed": isOpen,
22285 "aria-expanded": isOpen,
22286 ref: toggleRef,
22287 children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22288 FilterText,
22289 {
22290 activeElements,
22291 filterInView,
22292 filter
22293 }
22294 )
22295 }
22296 )
22297 }
22298 ),
22299 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(tooltip_exports.Popup, { children: (0, import_i18n26.sprintf)(
22300 /* translators: 1: Filter name. */
22301 (0, import_i18n26.__)("Filter by: %1$s"),
22302 filter.name.toLowerCase()
22303 ) })
22304 ] }),
22305 canResetOrRemove && /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(tooltip_exports.Root, { children: [
22306 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22307 tooltip_exports.Trigger,
22308 {
22309 render: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22310 "button",
22311 {
22312 className: clsx_default(
22313 "dataviews-filters__summary-chip-remove",
22314 { "has-values": hasValues }
22315 ),
22316 "aria-label": resetOrRemoveLabel,
22317 onClick: () => {
22318 onChangeView({
22319 ...view,
22320 page: 1,
22321 filters: view.filters?.filter(
22322 (_filter) => _filter.field !== filter.field
22323 )
22324 });
22325 if (!isPrimary) {
22326 addFilterRef.current?.focus();
22327 } else {
22328 toggleRef.current?.focus();
22329 }
22330 },
22331 children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_components21.Icon, { icon: close_small_default })
22332 }
22333 )
22334 }
22335 ),
22336 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(tooltip_exports.Popup, { children: resetOrRemoveLabel })
22337 ] })
22338 ] }),
22339 renderContent: () => {
22340 return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(Stack, { direction: "column", justify: "flex-start", children: [
22341 /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(OperatorSelector, { ...commonProps }),
22342 commonProps.filter.hasElements ? /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
22343 SearchWidget,
22344 {
22345 ...commonProps,
22346 filter: {
22347 ...commonProps.filter,
22348 elements
22349 }
22350 }
22351 ) : /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(InputWidget, { ...commonProps, fields })
22352 ] });
22353 }
22354 }
22355 );
22356 }
22357
22358 // packages/dataviews/build-module/components/dataviews-filters/add-filter.mjs
22359 var import_components22 = __toESM(require_components(), 1);
22360 var import_i18n27 = __toESM(require_i18n(), 1);
22361 var import_element56 = __toESM(require_element(), 1);
22362 var import_jsx_runtime83 = __toESM(require_jsx_runtime(), 1);
22363 var { Menu: Menu4 } = unlock2(import_components22.privateApis);
22364 function AddFilterMenu({
22365 filters,
22366 view,
22367 onChangeView,
22368 setOpenedFilter,
22369 triggerProps
22370 }) {
22371 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
22372 return /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)(Menu4, { children: [
22373 /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(Menu4.TriggerButton, { ...triggerProps }),
22374 /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(Menu4.Popover, { children: inactiveFilters.map((filter) => {
22375 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(
22376 Menu4.Item,
22377 {
22378 onClick: () => {
22379 setOpenedFilter(filter.field);
22380 onChangeView({
22381 ...view,
22382 page: 1,
22383 filters: [
22384 ...view.filters || [],
22385 {
22386 field: filter.field,
22387 value: void 0,
22388 operator: filter.operators[0]
22389 }
22390 ]
22391 });
22392 },
22393 children: /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(Menu4.ItemLabel, { children: filter.name })
22394 },
22395 filter.field
22396 );
22397 }) })
22398 ] });
22399 }
22400 function AddFilter({ filters, view, onChangeView, setOpenedFilter }, ref) {
22401 if (!filters.length || filters.every(({ isPrimary }) => isPrimary)) {
22402 return null;
22403 }
22404 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
22405 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(
22406 AddFilterMenu,
22407 {
22408 triggerProps: {
22409 render: /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(
22410 import_components22.Button,
22411 {
22412 accessibleWhenDisabled: true,
22413 size: "compact",
22414 className: "dataviews-filters-button",
22415 variant: "tertiary",
22416 disabled: !inactiveFilters.length,
22417 ref
22418 }
22419 ),
22420 children: (0, import_i18n27.__)("Add filter")
22421 },
22422 ...{ filters, view, onChangeView, setOpenedFilter }
22423 }
22424 );
22425 }
22426 var add_filter_default = (0, import_element56.forwardRef)(AddFilter);
22427
22428 // packages/dataviews/build-module/components/dataviews-filters/reset-filters.mjs
22429 var import_components23 = __toESM(require_components(), 1);
22430 var import_i18n28 = __toESM(require_i18n(), 1);
22431 var import_jsx_runtime84 = __toESM(require_jsx_runtime(), 1);
22432 function ResetFilter({
22433 filters,
22434 view,
22435 onChangeView
22436 }) {
22437 const isPrimary = (field) => filters.some(
22438 (_filter) => _filter.field === field && _filter.isPrimary
22439 );
22440 const isDisabled = !view.search && !view.filters?.some(
22441 (_filter) => !_filter.isLocked && (_filter.value !== void 0 || !isPrimary(_filter.field))
22442 );
22443 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
22444 import_components23.Button,
22445 {
22446 disabled: isDisabled,
22447 accessibleWhenDisabled: true,
22448 size: "compact",
22449 variant: "tertiary",
22450 className: "dataviews-filters__reset-button",
22451 onClick: () => {
22452 onChangeView({
22453 ...view,
22454 page: 1,
22455 search: "",
22456 filters: view.filters?.filter((f2) => !!f2.isLocked) || []
22457 });
22458 },
22459 children: (0, import_i18n28.__)("Reset")
22460 }
22461 );
22462 }
22463
22464 // packages/dataviews/build-module/components/dataviews-filters/use-filters.mjs
22465 var import_element57 = __toESM(require_element(), 1);
22466 function useFilters(fields, view) {
22467 return (0, import_element57.useMemo)(() => {
22468 const filters = [];
22469 fields.forEach((field) => {
22470 if (field.filterBy === false || !field.hasElements && !field.Edit) {
22471 return;
22472 }
22473 const operators = field.filterBy.operators;
22474 const isPrimary = !!field.filterBy?.isPrimary;
22475 const isLocked = view.filters?.some(
22476 (f2) => f2.field === field.id && !!f2.isLocked
22477 ) ?? false;
22478 filters.push({
22479 field: field.id,
22480 name: field.label,
22481 elements: field.elements,
22482 getElements: field.getElements,
22483 hasElements: field.hasElements,
22484 singleSelection: operators.some(
22485 (op) => isSingleSelectionOperator(op)
22486 ),
22487 operators,
22488 isVisible: isLocked || isPrimary || !!view.filters?.some(
22489 (f2) => f2.field === field.id && isRegisteredOperator(f2.operator)
22490 ),
22491 isPrimary,
22492 isLocked
22493 });
22494 });
22495 filters.sort((a2, b2) => {
22496 if (a2.isLocked && !b2.isLocked) {
22497 return -1;
22498 }
22499 if (!a2.isLocked && b2.isLocked) {
22500 return 1;
22501 }
22502 if (a2.isPrimary && !b2.isPrimary) {
22503 return -1;
22504 }
22505 if (!a2.isPrimary && b2.isPrimary) {
22506 return 1;
22507 }
22508 return a2.name.localeCompare(b2.name);
22509 });
22510 return filters;
22511 }, [fields, view]);
22512 }
22513 var use_filters_default = useFilters;
22514
22515 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
22516 var import_jsx_runtime85 = __toESM(require_jsx_runtime(), 1);
22517 function Filters({ className }) {
22518 const { fields, view, onChangeView, openedFilter, setOpenedFilter } = (0, import_element58.useContext)(dataviews_context_default);
22519 const addFilterRef = (0, import_element58.useRef)(null);
22520 const filters = use_filters_default(fields, view);
22521 const addFilter = /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22522 add_filter_default,
22523 {
22524 filters,
22525 view,
22526 onChangeView,
22527 ref: addFilterRef,
22528 setOpenedFilter
22529 },
22530 "add-filter"
22531 );
22532 const visibleFilters = filters.filter((filter) => filter.isVisible);
22533 if (visibleFilters.length === 0) {
22534 return null;
22535 }
22536 const filterComponents = [
22537 ...visibleFilters.map((filter) => {
22538 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22539 Filter,
22540 {
22541 filter,
22542 view,
22543 fields,
22544 onChangeView,
22545 addFilterRef,
22546 openedFilter
22547 },
22548 filter.field
22549 );
22550 }),
22551 addFilter
22552 ];
22553 filterComponents.push(
22554 /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22555 ResetFilter,
22556 {
22557 filters,
22558 view,
22559 onChangeView
22560 },
22561 "reset-filters"
22562 )
22563 );
22564 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
22565 Stack,
22566 {
22567 direction: "row",
22568 justify: "flex-start",
22569 gap: "sm",
22570 style: { width: "fit-content" },
22571 wrap: "wrap",
22572 className,
22573 children: filterComponents
22574 }
22575 );
22576 }
22577 var filters_default = (0, import_element58.memo)(Filters);
22578
22579 // packages/dataviews/build-module/components/dataviews-filters/toggle.mjs
22580 var import_element59 = __toESM(require_element(), 1);
22581 var import_components24 = __toESM(require_components(), 1);
22582 var import_i18n29 = __toESM(require_i18n(), 1);
22583 var import_jsx_runtime86 = __toESM(require_jsx_runtime(), 1);
22584 function FiltersToggle() {
22585 const {
22586 filters,
22587 view,
22588 onChangeView,
22589 setOpenedFilter,
22590 isShowingFilter,
22591 setIsShowingFilter
22592 } = (0, import_element59.useContext)(dataviews_context_default);
22593 const buttonRef = (0, import_element59.useRef)(null);
22594 const onChangeViewWithFilterVisibility = (0, import_element59.useCallback)(
22595 (_view) => {
22596 onChangeView(_view);
22597 setIsShowingFilter(true);
22598 },
22599 [onChangeView, setIsShowingFilter]
22600 );
22601 if (filters.length === 0) {
22602 return null;
22603 }
22604 const hasVisibleFilters = filters.some((filter) => filter.isVisible);
22605 const addFilterButtonProps = {
22606 label: (0, import_i18n29.__)("Add filter"),
22607 "aria-expanded": false,
22608 isPressed: false
22609 };
22610 const toggleFiltersButtonProps = {
22611 label: (0, import_i18n29._x)("Filter", "verb"),
22612 "aria-expanded": isShowingFilter,
22613 isPressed: isShowingFilter,
22614 onClick: () => {
22615 if (!isShowingFilter) {
22616 setOpenedFilter(null);
22617 }
22618 setIsShowingFilter(!isShowingFilter);
22619 }
22620 };
22621 const hasPrimaryOrLockedFilters = filters.some(
22622 (filter) => filter.isPrimary || filter.isLocked
22623 );
22624 const buttonComponent = /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
22625 import_components24.Button,
22626 {
22627 ref: buttonRef,
22628 className: "dataviews-filters__visibility-toggle",
22629 size: "compact",
22630 icon: funnel_default,
22631 disabled: hasPrimaryOrLockedFilters,
22632 accessibleWhenDisabled: true,
22633 ...hasVisibleFilters ? toggleFiltersButtonProps : addFilterButtonProps
22634 }
22635 );
22636 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)("div", { className: "dataviews-filters__container-visibility-toggle", children: !hasVisibleFilters ? /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
22637 AddFilterMenu,
22638 {
22639 filters,
22640 view,
22641 onChangeView: onChangeViewWithFilterVisibility,
22642 setOpenedFilter,
22643 triggerProps: { render: buttonComponent }
22644 }
22645 ) : /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
22646 FilterVisibilityToggle,
22647 {
22648 buttonRef,
22649 filtersCount: view.filters?.length,
22650 children: buttonComponent
22651 }
22652 ) });
22653 }
22654 function FilterVisibilityToggle({
22655 buttonRef,
22656 filtersCount,
22657 children
22658 }) {
22659 (0, import_element59.useEffect)(
22660 () => () => {
22661 buttonRef.current?.focus();
22662 },
22663 [buttonRef]
22664 );
22665 return /* @__PURE__ */ (0, import_jsx_runtime86.jsxs)(import_jsx_runtime86.Fragment, { children: [
22666 children,
22667 !!filtersCount && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)("span", { className: "dataviews-filters-toggle__count", children: filtersCount })
22668 ] });
22669 }
22670 var toggle_default = FiltersToggle;
22671
22672 // packages/dataviews/build-module/components/dataviews-filters/filters-toggled.mjs
22673 var import_element60 = __toESM(require_element(), 1);
22674 var import_jsx_runtime87 = __toESM(require_jsx_runtime(), 1);
22675 function FiltersToggled(props) {
22676 const { isShowingFilter } = (0, import_element60.useContext)(dataviews_context_default);
22677 if (!isShowingFilter) {
22678 return null;
22679 }
22680 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(filters_default, { ...props });
22681 }
22682 var filters_toggled_default = FiltersToggled;
22683
22684 // packages/dataviews/build-module/components/dataviews-layout/index.mjs
22685 var import_element61 = __toESM(require_element(), 1);
22686 var import_components25 = __toESM(require_components(), 1);
22687 var import_i18n30 = __toESM(require_i18n(), 1);
22688 var import_jsx_runtime88 = __toESM(require_jsx_runtime(), 1);
22689 function DataViewsLayout({ className }) {
22690 const {
22691 actions = [],
22692 data,
22693 fields,
22694 getItemId,
22695 getItemLevel,
22696 hasInitiallyLoaded,
22697 isLoading,
22698 view,
22699 onChangeView,
22700 selection,
22701 onChangeSelection,
22702 setOpenedFilter,
22703 onClickItem,
22704 isItemClickable,
22705 renderItemLink,
22706 defaultLayouts,
22707 containerRef,
22708 empty = /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("p", { children: (0, import_i18n30.__)("No results") })
22709 } = (0, import_element61.useContext)(dataviews_context_default);
22710 const isDelayedInitialLoading = useDelayedLoading(!hasInitiallyLoaded, {
22711 delay: 200
22712 });
22713 if (!hasInitiallyLoaded) {
22714 if (!isDelayedInitialLoading) {
22715 return null;
22716 }
22717 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("div", { className: "dataviews-loading", children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components25.Spinner, {}) }) });
22718 }
22719 const ViewComponent = VIEW_LAYOUTS.find(
22720 (v2) => v2.type === view.type && defaultLayouts[v2.type]
22721 )?.component;
22722 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)("div", { className: "dataviews-layout__container", ref: containerRef, children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
22723 ViewComponent,
22724 {
22725 className,
22726 actions,
22727 data,
22728 fields,
22729 getItemId,
22730 getItemLevel,
22731 isLoading,
22732 onChangeView,
22733 onChangeSelection,
22734 selection,
22735 setOpenedFilter,
22736 onClickItem,
22737 renderItemLink,
22738 isItemClickable,
22739 view,
22740 empty
22741 }
22742 ) });
22743 }
22744
22745 // packages/dataviews/build-module/components/dataviews-footer/index.mjs
22746 var import_element62 = __toESM(require_element(), 1);
22747 var import_jsx_runtime89 = __toESM(require_jsx_runtime(), 1);
22748 var EMPTY_ARRAY5 = [];
22749 function DataViewsFooter() {
22750 const {
22751 view,
22752 paginationInfo: { totalItems = 0, totalPages },
22753 data,
22754 actions = EMPTY_ARRAY5,
22755 isLoading,
22756 hasInitiallyLoaded
22757 } = (0, import_element62.useContext)(dataviews_context_default);
22758 const isRefreshing = !!isLoading && hasInitiallyLoaded && !!data?.length;
22759 const isDelayedRefreshing = useDelayedLoading(!!isRefreshing);
22760 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data) && [LAYOUT_TABLE, LAYOUT_GRID].includes(view.type);
22761 const hasPagination = hasPaginationControls(view, {
22762 totalItems,
22763 totalPages
22764 });
22765 if (!totalItems || !hasBulkActions && !hasPagination) {
22766 return null;
22767 }
22768 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(
22769 "div",
22770 {
22771 className: "dataviews-footer",
22772 inert: isRefreshing ? "true" : void 0,
22773 children: /* @__PURE__ */ (0, import_jsx_runtime89.jsxs)(
22774 Stack,
22775 {
22776 direction: "row",
22777 justify: "end",
22778 align: "center",
22779 className: clsx_default("dataviews-footer__content", {
22780 "is-refreshing": isDelayedRefreshing
22781 }),
22782 gap: "sm",
22783 children: [
22784 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(BulkActionsFooter, {}),
22785 /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(dataviews_pagination_default, {})
22786 ]
22787 }
22788 )
22789 }
22790 );
22791 }
22792
22793 // packages/dataviews/build-module/components/dataviews-search/index.mjs
22794 var import_i18n31 = __toESM(require_i18n(), 1);
22795 var import_element63 = __toESM(require_element(), 1);
22796 var import_components26 = __toESM(require_components(), 1);
22797 var import_compose10 = __toESM(require_compose(), 1);
22798 var import_jsx_runtime90 = __toESM(require_jsx_runtime(), 1);
22799 var DataViewsSearch = (0, import_element63.memo)(function Search({ label }) {
22800 const { view, onChangeView } = (0, import_element63.useContext)(dataviews_context_default);
22801 const [search, setSearch, debouncedSearch] = (0, import_compose10.useDebouncedInput)(
22802 view.search
22803 );
22804 (0, import_element63.useEffect)(() => {
22805 if (view.search !== debouncedSearch) {
22806 setSearch(view.search ?? "");
22807 }
22808 }, [view.search, setSearch]);
22809 const onChangeViewRef = (0, import_element63.useRef)(onChangeView);
22810 const viewRef = (0, import_element63.useRef)(view);
22811 (0, import_element63.useEffect)(() => {
22812 onChangeViewRef.current = onChangeView;
22813 viewRef.current = view;
22814 }, [onChangeView, view]);
22815 (0, import_element63.useEffect)(() => {
22816 if (debouncedSearch !== viewRef.current?.search) {
22817 onChangeViewRef.current({
22818 ...viewRef.current,
22819 page: view.page ? 1 : void 0,
22820 startPosition: view.startPosition ? 1 : void 0,
22821 search: debouncedSearch
22822 });
22823 }
22824 }, [debouncedSearch]);
22825 const searchLabel = label || (0, import_i18n31.__)("Search");
22826 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
22827 import_components26.SearchControl,
22828 {
22829 className: "dataviews-search",
22830 onChange: setSearch,
22831 value: search,
22832 label: searchLabel,
22833 placeholder: searchLabel,
22834 size: "compact"
22835 }
22836 );
22837 });
22838 var dataviews_search_default = DataViewsSearch;
22839
22840 // packages/dataviews/build-module/components/dataviews-view-config/index.mjs
22841 var import_components27 = __toESM(require_components(), 1);
22842 var import_i18n32 = __toESM(require_i18n(), 1);
22843 var import_element64 = __toESM(require_element(), 1);
22844 var import_warning = __toESM(require_warning(), 1);
22845 var import_compose11 = __toESM(require_compose(), 1);
22846 var import_jsx_runtime91 = __toESM(require_jsx_runtime(), 1);
22847 var { Menu: Menu5 } = unlock2(import_components27.privateApis);
22848 var DATAVIEWS_CONFIG_POPOVER_PROPS = {
22849 className: "dataviews-config__popover",
22850 placement: "bottom-end",
22851 offset: 9
22852 };
22853 function ViewTypeMenu() {
22854 const { view, onChangeView, defaultLayouts } = (0, import_element64.useContext)(dataviews_context_default);
22855 const availableLayouts = Object.keys(defaultLayouts);
22856 if (availableLayouts.length <= 1) {
22857 return null;
22858 }
22859 const activeView = VIEW_LAYOUTS.find((v2) => view.type === v2.type);
22860 return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(Menu5, { children: [
22861 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22862 Menu5.TriggerButton,
22863 {
22864 render: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22865 import_components27.Button,
22866 {
22867 size: "compact",
22868 icon: activeView?.icon,
22869 label: (0, import_i18n32.__)("Layout")
22870 }
22871 )
22872 }
22873 ),
22874 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(Menu5.Popover, { children: availableLayouts.map((layout) => {
22875 const config = VIEW_LAYOUTS.find(
22876 (v2) => v2.type === layout
22877 );
22878 if (!config) {
22879 return null;
22880 }
22881 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22882 Menu5.RadioItem,
22883 {
22884 value: layout,
22885 name: "view-actions-available-view",
22886 checked: layout === view.type,
22887 hideOnClick: true,
22888 onChange: (e2) => {
22889 switch (e2.target.value) {
22890 case "list":
22891 case "grid":
22892 case "table":
22893 case "pickerGrid":
22894 case "pickerTable":
22895 case "pickerActivity":
22896 case "activity":
22897 const viewWithoutLayout = { ...view };
22898 if ("layout" in viewWithoutLayout) {
22899 delete viewWithoutLayout.layout;
22900 }
22901 return onChangeView({
22902 ...viewWithoutLayout,
22903 type: e2.target.value,
22904 ...defaultLayouts[e2.target.value]
22905 });
22906 }
22907 (0, import_warning.default)("Invalid dataview");
22908 },
22909 children: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(Menu5.ItemLabel, { children: config.label })
22910 },
22911 layout
22912 );
22913 }) })
22914 ] });
22915 }
22916 function SortFieldControl() {
22917 const { view, fields, onChangeView } = (0, import_element64.useContext)(dataviews_context_default);
22918 const orderOptions = (0, import_element64.useMemo)(() => {
22919 const sortableFields = fields.filter(
22920 (field) => field.enableSorting !== false
22921 );
22922 return sortableFields.map((field) => {
22923 return {
22924 label: field.label,
22925 value: field.id
22926 };
22927 });
22928 }, [fields]);
22929 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22930 import_components27.SelectControl,
22931 {
22932 label: (0, import_i18n32.__)("Sort by"),
22933 value: view.sort?.field,
22934 options: orderOptions,
22935 onChange: (value) => {
22936 onChangeView({
22937 ...view,
22938 sort: {
22939 direction: view?.sort?.direction || "desc",
22940 field: value
22941 },
22942 showLevels: false
22943 });
22944 }
22945 }
22946 );
22947 }
22948 function SortDirectionControl() {
22949 const { view, fields, onChangeView } = (0, import_element64.useContext)(dataviews_context_default);
22950 const sortableFields = fields.filter(
22951 (field) => field.enableSorting !== false
22952 );
22953 if (sortableFields.length === 0) {
22954 return null;
22955 }
22956 let value = view.sort?.direction;
22957 if (!value && view.sort?.field) {
22958 value = "desc";
22959 }
22960 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22961 import_components27.__experimentalToggleGroupControl,
22962 {
22963 className: "dataviews-view-config__sort-direction",
22964 isBlock: true,
22965 label: (0, import_i18n32.__)("Order"),
22966 value,
22967 onChange: (newDirection) => {
22968 if (newDirection === "asc" || newDirection === "desc") {
22969 onChangeView({
22970 ...view,
22971 sort: {
22972 direction: newDirection,
22973 field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field.
22974 fields.find(
22975 (field) => field.enableSorting !== false
22976 )?.id || ""
22977 },
22978 showLevels: false
22979 });
22980 return;
22981 }
22982 (0, import_warning.default)("Invalid direction");
22983 },
22984 children: SORTING_DIRECTIONS.map((direction) => {
22985 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
22986 import_components27.__experimentalToggleGroupControlOptionIcon,
22987 {
22988 value: direction,
22989 icon: sortIcons[direction],
22990 label: sortLabels[direction]
22991 },
22992 direction
22993 );
22994 })
22995 }
22996 );
22997 }
22998 function ItemsPerPageControl() {
22999 const { view, config, onChangeView } = (0, import_element64.useContext)(dataviews_context_default);
23000 const { infiniteScrollEnabled } = view;
23001 if (!config || !config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled) {
23002 return null;
23003 }
23004 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23005 import_components27.__experimentalToggleGroupControl,
23006 {
23007 isBlock: true,
23008 label: (0, import_i18n32.__)("Items per page"),
23009 value: view.perPage || 10,
23010 disabled: !view?.sort?.field,
23011 onChange: (newItemsPerPage) => {
23012 const newItemsPerPageNumber = typeof newItemsPerPage === "number" || newItemsPerPage === void 0 ? newItemsPerPage : parseInt(newItemsPerPage, 10);
23013 onChangeView({
23014 ...view,
23015 perPage: newItemsPerPageNumber,
23016 page: 1
23017 });
23018 },
23019 children: config.perPageSizes.map((value) => {
23020 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23021 import_components27.__experimentalToggleGroupControlOption,
23022 {
23023 value,
23024 label: value.toString()
23025 },
23026 value
23027 );
23028 })
23029 }
23030 );
23031 }
23032 function ResetViewButton() {
23033 const { onReset } = (0, import_element64.useContext)(dataviews_context_default);
23034 if (onReset === void 0) {
23035 return null;
23036 }
23037 const isDisabled = onReset === false;
23038 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23039 import_components27.Button,
23040 {
23041 variant: "tertiary",
23042 size: "compact",
23043 disabled: isDisabled,
23044 accessibleWhenDisabled: true,
23045 className: "dataviews-view-config__reset-button",
23046 onClick: () => {
23047 if (typeof onReset === "function") {
23048 onReset();
23049 }
23050 },
23051 children: (0, import_i18n32.__)("Reset view")
23052 }
23053 );
23054 }
23055 function DataviewsViewConfigDropdown() {
23056 const { view, onReset } = (0, import_element64.useContext)(dataviews_context_default);
23057 const popoverId = (0, import_compose11.useInstanceId)(
23058 _DataViewsViewConfig,
23059 "dataviews-view-config-dropdown"
23060 );
23061 const activeLayout = VIEW_LAYOUTS.find(
23062 (layout) => layout.type === view.type
23063 );
23064 const isModified = typeof onReset === "function";
23065 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23066 import_components27.Dropdown,
23067 {
23068 expandOnMobile: true,
23069 popoverProps: {
23070 ...DATAVIEWS_CONFIG_POPOVER_PROPS,
23071 id: popoverId
23072 },
23073 renderToggle: ({ onToggle, isOpen }) => {
23074 return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "dataviews-view-config__toggle-wrapper", children: [
23075 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23076 import_components27.Button,
23077 {
23078 size: "compact",
23079 icon: cog_default,
23080 label: (0, import_i18n32._x)(
23081 "View options",
23082 "View is used as a noun"
23083 ),
23084 onClick: onToggle,
23085 "aria-expanded": isOpen ? "true" : "false",
23086 "aria-controls": popoverId
23087 }
23088 ),
23089 isModified && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "dataviews-view-config__modified-indicator" })
23090 ] });
23091 },
23092 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23093 import_components27.__experimentalDropdownContentWrapper,
23094 {
23095 paddingSize: "medium",
23096 className: "dataviews-config__popover-content-wrapper",
23097 children: /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(
23098 Stack,
23099 {
23100 direction: "column",
23101 className: "dataviews-view-config",
23102 gap: "xl",
23103 children: [
23104 /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(
23105 Stack,
23106 {
23107 direction: "row",
23108 justify: "space-between",
23109 align: "center",
23110 className: "dataviews-view-config__header",
23111 children: [
23112 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
23113 import_components27.__experimentalHeading,
23114 {
23115 level: 2,
23116 className: "dataviews-settings-section__title",
23117 children: (0, import_i18n32.__)("Appearance")
23118 }
23119 ),
23120 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(ResetViewButton, {})
23121 ]
23122 }
23123 ),
23124 /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23125 /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(
23126 Stack,
23127 {
23128 direction: "row",
23129 gap: "sm",
23130 className: "dataviews-view-config__sort-controls",
23131 children: [
23132 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(SortFieldControl, {}),
23133 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(SortDirectionControl, {})
23134 ]
23135 }
23136 ),
23137 !!activeLayout?.viewConfigOptions && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(activeLayout.viewConfigOptions, {}),
23138 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(ItemsPerPageControl, {}),
23139 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(PropertiesSection, {})
23140 ] })
23141 ]
23142 }
23143 )
23144 }
23145 )
23146 }
23147 );
23148 }
23149 function _DataViewsViewConfig() {
23150 return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(import_jsx_runtime91.Fragment, { children: [
23151 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(ViewTypeMenu, {}),
23152 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(DataviewsViewConfigDropdown, {})
23153 ] });
23154 }
23155 var DataViewsViewConfig = (0, import_element64.memo)(_DataViewsViewConfig);
23156 var dataviews_view_config_default = DataViewsViewConfig;
23157
23158 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
23159 var import_components28 = __toESM(require_components(), 1);
23160 var import_element65 = __toESM(require_element(), 1);
23161
23162 // packages/dataviews/build-module/components/dataform-controls/utils/get-custom-validity.mjs
23163 function getCustomValidity(isValid2, validity) {
23164 let customValidity;
23165 if (isValid2?.required && validity?.required) {
23166 customValidity = validity?.required?.message ? validity.required : void 0;
23167 } else if (isValid2?.pattern && validity?.pattern) {
23168 customValidity = validity.pattern;
23169 } else if (isValid2?.min && validity?.min) {
23170 customValidity = validity.min;
23171 } else if (isValid2?.max && validity?.max) {
23172 customValidity = validity.max;
23173 } else if (isValid2?.minLength && validity?.minLength) {
23174 customValidity = validity.minLength;
23175 } else if (isValid2?.maxLength && validity?.maxLength) {
23176 customValidity = validity.maxLength;
23177 } else if (isValid2?.elements && validity?.elements) {
23178 customValidity = validity.elements;
23179 } else if (validity?.custom) {
23180 customValidity = validity.custom;
23181 }
23182 return customValidity;
23183 }
23184
23185 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
23186 var import_jsx_runtime92 = __toESM(require_jsx_runtime(), 1);
23187 var { ValidatedCheckboxControl } = unlock2(import_components28.privateApis);
23188 function Checkbox({
23189 field,
23190 onChange,
23191 data,
23192 hideLabelFromVision,
23193 markWhenOptional,
23194 validity
23195 }) {
23196 const { getValue, setValue, label, description, isValid: isValid2 } = field;
23197 const disabled2 = field.isDisabled({ item: data, field });
23198 const onChangeControl = (0, import_element65.useCallback)(() => {
23199 onChange(
23200 setValue({ item: data, value: !getValue({ item: data }) })
23201 );
23202 }, [data, getValue, onChange, setValue]);
23203 return /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
23204 ValidatedCheckboxControl,
23205 {
23206 required: !!field.isValid?.required,
23207 markWhenOptional,
23208 customValidity: getCustomValidity(isValid2, validity),
23209 hidden: hideLabelFromVision,
23210 label,
23211 help: description,
23212 checked: getValue({ item: data }),
23213 onChange: onChangeControl,
23214 disabled: disabled2
23215 }
23216 );
23217 }
23218
23219 // packages/dataviews/build-module/components/dataform-controls/combobox.mjs
23220 var import_components29 = __toESM(require_components(), 1);
23221 var import_element66 = __toESM(require_element(), 1);
23222 var import_jsx_runtime93 = __toESM(require_jsx_runtime(), 1);
23223 var { ValidatedComboboxControl } = unlock2(import_components29.privateApis);
23224 function Combobox3({
23225 data,
23226 field,
23227 onChange,
23228 hideLabelFromVision,
23229 validity
23230 }) {
23231 const { label, description, placeholder, getValue, setValue, isValid: isValid2 } = field;
23232 const value = getValue({ item: data }) ?? "";
23233 const onChangeControl = (0, import_element66.useCallback)(
23234 (newValue) => onChange(setValue({ item: data, value: newValue ?? "" })),
23235 [data, onChange, setValue]
23236 );
23237 const { elements, isLoading } = useElements({
23238 elements: field.elements,
23239 getElements: field.getElements
23240 });
23241 if (isLoading) {
23242 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(import_components29.Spinner, {});
23243 }
23244 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
23245 ValidatedComboboxControl,
23246 {
23247 required: !!field.isValid?.required,
23248 customValidity: getCustomValidity(isValid2, validity),
23249 label,
23250 value,
23251 help: description,
23252 placeholder,
23253 options: elements,
23254 onChange: onChangeControl,
23255 hideLabelFromVision,
23256 allowReset: true,
23257 expandOnFocus: true
23258 }
23259 );
23260 }
23261
23262 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
23263 var import_components31 = __toESM(require_components(), 1);
23264 var import_element69 = __toESM(require_element(), 1);
23265 var import_i18n34 = __toESM(require_i18n(), 1);
23266 var import_date3 = __toESM(require_date(), 1);
23267
23268 // packages/dataviews/build-module/components/dataform-controls/utils/relative-date-control.mjs
23269 var import_components30 = __toESM(require_components(), 1);
23270 var import_element67 = __toESM(require_element(), 1);
23271 var import_i18n33 = __toESM(require_i18n(), 1);
23272 var import_jsx_runtime94 = __toESM(require_jsx_runtime(), 1);
23273 var TIME_UNITS_OPTIONS = {
23274 [OPERATOR_IN_THE_PAST]: [
23275 { value: "days", label: (0, import_i18n33.__)("Days") },
23276 { value: "weeks", label: (0, import_i18n33.__)("Weeks") },
23277 { value: "months", label: (0, import_i18n33.__)("Months") },
23278 { value: "years", label: (0, import_i18n33.__)("Years") }
23279 ],
23280 [OPERATOR_OVER]: [
23281 { value: "days", label: (0, import_i18n33.__)("Days ago") },
23282 { value: "weeks", label: (0, import_i18n33.__)("Weeks ago") },
23283 { value: "months", label: (0, import_i18n33.__)("Months ago") },
23284 { value: "years", label: (0, import_i18n33.__)("Years ago") }
23285 ]
23286 };
23287 function RelativeDateControl({
23288 className,
23289 data,
23290 field,
23291 onChange,
23292 hideLabelFromVision,
23293 operator
23294 }) {
23295 const options = TIME_UNITS_OPTIONS[operator === OPERATOR_IN_THE_PAST ? "inThePast" : "over"];
23296 const { id, label, description, getValue, setValue } = field;
23297 const disabled2 = field.isDisabled({ item: data, field });
23298 const fieldValue = getValue({ item: data });
23299 const { value: relValue = "", unit = options[0].value } = fieldValue && typeof fieldValue === "object" ? fieldValue : {};
23300 const onChangeValue = (0, import_element67.useCallback)(
23301 (newValue) => onChange(
23302 setValue({
23303 item: data,
23304 value: { value: Number(newValue), unit }
23305 })
23306 ),
23307 [onChange, setValue, data, unit]
23308 );
23309 const onChangeUnit = (0, import_element67.useCallback)(
23310 (newUnit) => onChange(
23311 setValue({
23312 item: data,
23313 value: { value: relValue, unit: newUnit }
23314 })
23315 ),
23316 [onChange, setValue, data, relValue]
23317 );
23318 return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
23319 import_components30.BaseControl,
23320 {
23321 id,
23322 className: clsx_default(className, "dataviews-controls__relative-date"),
23323 label,
23324 hideLabelFromVision,
23325 help: description,
23326 children: /* @__PURE__ */ (0, import_jsx_runtime94.jsxs)(Stack, { direction: "row", gap: "sm", children: [
23327 /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
23328 import_components30.__experimentalNumberControl,
23329 {
23330 className: "dataviews-controls__relative-date-number",
23331 spinControls: "none",
23332 min: 1,
23333 step: 1,
23334 value: relValue,
23335 onChange: onChangeValue,
23336 disabled: disabled2
23337 }
23338 ),
23339 /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
23340 import_components30.SelectControl,
23341 {
23342 className: "dataviews-controls__relative-date-unit",
23343 label: (0, import_i18n33.__)("Unit"),
23344 value: unit,
23345 options,
23346 onChange: onChangeUnit,
23347 hideLabelFromVision: true,
23348 disabled: disabled2
23349 }
23350 )
23351 ] })
23352 }
23353 );
23354 }
23355
23356 // packages/dataviews/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs
23357 var import_element68 = __toESM(require_element(), 1);
23358 function useDisabledDateMatchers(isValid2, parseDateFn) {
23359 const minConstraint = typeof isValid2.min?.constraint === "string" ? isValid2.min.constraint : void 0;
23360 const maxConstraint = typeof isValid2.max?.constraint === "string" ? isValid2.max.constraint : void 0;
23361 const disabledMatchers = (0, import_element68.useMemo)(() => {
23362 const matchers = [];
23363 if (minConstraint) {
23364 const minDate = parseDateFn(minConstraint);
23365 if (minDate) {
23366 matchers.push({ before: minDate });
23367 }
23368 }
23369 if (maxConstraint) {
23370 const maxDate = parseDateFn(maxConstraint);
23371 if (maxDate) {
23372 matchers.push({ after: maxDate });
23373 }
23374 }
23375 return matchers.length > 0 ? matchers : void 0;
23376 }, [minConstraint, maxConstraint, parseDateFn]);
23377 return { minConstraint, maxConstraint, disabledMatchers };
23378 }
23379
23380 // packages/dataviews/build-module/field-types/utils/parse-date-time.mjs
23381 var import_date2 = __toESM(require_date(), 1);
23382 function parseDateTime(dateTimeString) {
23383 if (!dateTimeString) {
23384 return null;
23385 }
23386 const parsed = (0, import_date2.getDate)(dateTimeString);
23387 return parsed && isValid(parsed) ? parsed : null;
23388 }
23389
23390 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
23391 var import_jsx_runtime95 = __toESM(require_jsx_runtime(), 1);
23392 var { DateCalendar, ValidatedInputControl } = unlock2(import_components31.privateApis);
23393 var formatDateTime = (value) => {
23394 if (!value) {
23395 return "";
23396 }
23397 return (0, import_date3.dateI18n)("Y-m-d\\TH:i", (0, import_date3.getDate)(value));
23398 };
23399 function CalendarDateTimeControl({
23400 data,
23401 field,
23402 onChange,
23403 hideLabelFromVision,
23404 markWhenOptional,
23405 validity,
23406 config
23407 }) {
23408 const { compact } = config || {};
23409 const { id, label, description, setValue, getValue, isValid: isValid2 } = field;
23410 const disabled2 = field.isDisabled({ item: data, field });
23411 const fieldValue = getValue({ item: data });
23412 const value = typeof fieldValue === "string" ? fieldValue : void 0;
23413 const [calendarMonth, setCalendarMonth] = (0, import_element69.useState)(() => {
23414 const parsedDate = parseDateTime(value);
23415 return parsedDate || /* @__PURE__ */ new Date();
23416 });
23417 const inputControlRef = (0, import_element69.useRef)(null);
23418 const validationTimeoutRef = (0, import_element69.useRef)(void 0);
23419 const previousFocusRef = (0, import_element69.useRef)(null);
23420 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDateTime);
23421 const onChangeCallback = (0, import_element69.useCallback)(
23422 (newValue) => onChange(setValue({ item: data, value: newValue })),
23423 [data, onChange, setValue]
23424 );
23425 (0, import_element69.useEffect)(() => {
23426 return () => {
23427 if (validationTimeoutRef.current) {
23428 clearTimeout(validationTimeoutRef.current);
23429 }
23430 };
23431 }, []);
23432 const onSelectDate = (0, import_element69.useCallback)(
23433 (newDate) => {
23434 let dateTimeValue;
23435 if (newDate) {
23436 const wpDate = (0, import_date3.dateI18n)("Y-m-d", newDate);
23437 let wpTime;
23438 if (value) {
23439 wpTime = (0, import_date3.dateI18n)("H:i", (0, import_date3.getDate)(value));
23440 } else {
23441 wpTime = (0, import_date3.dateI18n)("H:i", newDate);
23442 }
23443 const finalDateTime = (0, import_date3.getDate)(`${wpDate}T${wpTime}`);
23444 dateTimeValue = finalDateTime.toISOString();
23445 onChangeCallback(dateTimeValue);
23446 if (validationTimeoutRef.current) {
23447 clearTimeout(validationTimeoutRef.current);
23448 }
23449 } else {
23450 onChangeCallback(void 0);
23451 }
23452 previousFocusRef.current = inputControlRef.current && inputControlRef.current.ownerDocument.activeElement;
23453 validationTimeoutRef.current = setTimeout(() => {
23454 if (inputControlRef.current) {
23455 inputControlRef.current.focus();
23456 inputControlRef.current.blur();
23457 onChangeCallback(dateTimeValue);
23458 if (previousFocusRef.current && previousFocusRef.current instanceof HTMLElement) {
23459 previousFocusRef.current.focus();
23460 }
23461 }
23462 }, 0);
23463 },
23464 [onChangeCallback, value]
23465 );
23466 const handleManualDateTimeChange = (0, import_element69.useCallback)(
23467 (newValue) => {
23468 if (newValue) {
23469 const dateTime = (0, import_date3.getDate)(newValue);
23470 onChangeCallback(dateTime.toISOString());
23471 const parsedDate = parseDateTime(dateTime.toISOString());
23472 if (parsedDate) {
23473 setCalendarMonth(parsedDate);
23474 }
23475 } else {
23476 onChangeCallback(void 0);
23477 }
23478 },
23479 [onChangeCallback]
23480 );
23481 const { format: fieldFormat } = field;
23482 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek;
23483 const {
23484 timezone: { string: timezoneString }
23485 } = (0, import_date3.getSettings)();
23486 let displayLabel = label;
23487 if (isValid2?.required && !markWhenOptional && !hideLabelFromVision) {
23488 displayLabel = `${label} (${(0, import_i18n34.__)("Required")})`;
23489 } else if (!isValid2?.required && markWhenOptional && !hideLabelFromVision) {
23490 displayLabel = `${label} (${(0, import_i18n34.__)("Optional")})`;
23491 }
23492 return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
23493 import_components31.BaseControl,
23494 {
23495 id,
23496 label: displayLabel,
23497 help: description,
23498 hideLabelFromVision,
23499 children: /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23500 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
23501 ValidatedInputControl,
23502 {
23503 ref: inputControlRef,
23504 required: !!isValid2?.required,
23505 customValidity: getCustomValidity(isValid2, validity),
23506 type: "datetime-local",
23507 label: (0, import_i18n34.__)("Date time"),
23508 hideLabelFromVision: true,
23509 value: formatDateTime(value),
23510 onChange: handleManualDateTimeChange,
23511 disabled: disabled2,
23512 min: minConstraint ? formatDateTime(minConstraint) : void 0,
23513 max: maxConstraint ? formatDateTime(maxConstraint) : void 0
23514 }
23515 ),
23516 !compact && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
23517 DateCalendar,
23518 {
23519 style: { width: "100%" },
23520 selected: value ? parseDateTime(value) || void 0 : void 0,
23521 onSelect: onSelectDate,
23522 month: calendarMonth,
23523 onMonthChange: setCalendarMonth,
23524 timeZone: timezoneString || void 0,
23525 weekStartsOn,
23526 disabled: disabled2 || disabledMatchers
23527 }
23528 )
23529 ] })
23530 }
23531 );
23532 }
23533 function DateTime({
23534 data,
23535 field,
23536 onChange,
23537 hideLabelFromVision,
23538 markWhenOptional,
23539 operator,
23540 validity,
23541 config
23542 }) {
23543 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
23544 return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
23545 RelativeDateControl,
23546 {
23547 className: "dataviews-controls__datetime",
23548 data,
23549 field,
23550 onChange,
23551 hideLabelFromVision,
23552 operator
23553 }
23554 );
23555 }
23556 return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
23557 CalendarDateTimeControl,
23558 {
23559 data,
23560 field,
23561 onChange,
23562 hideLabelFromVision,
23563 markWhenOptional,
23564 validity,
23565 config
23566 }
23567 );
23568 }
23569
23570 // packages/dataviews/build-module/components/dataform-controls/date.mjs
23571 var import_components32 = __toESM(require_components(), 1);
23572 var import_element70 = __toESM(require_element(), 1);
23573 var import_i18n35 = __toESM(require_i18n(), 1);
23574 var import_date4 = __toESM(require_date(), 1);
23575 import { speak } from "@wordpress/a11y";
23576 var import_jsx_runtime96 = __toESM(require_jsx_runtime(), 1);
23577 var { DateCalendar: DateCalendar2, DateRangeCalendar } = unlock2(import_components32.privateApis);
23578 var DATE_PRESETS = [
23579 {
23580 id: "today",
23581 label: (0, import_i18n35.__)("Today"),
23582 getValue: () => (0, import_date4.getDate)(null)
23583 },
23584 {
23585 id: "yesterday",
23586 label: (0, import_i18n35.__)("Yesterday"),
23587 getValue: () => {
23588 const today = (0, import_date4.getDate)(null);
23589 return subDays(today, 1);
23590 }
23591 },
23592 {
23593 id: "past-week",
23594 label: (0, import_i18n35.__)("Past week"),
23595 getValue: () => {
23596 const today = (0, import_date4.getDate)(null);
23597 return subDays(today, 7);
23598 }
23599 },
23600 {
23601 id: "past-month",
23602 label: (0, import_i18n35.__)("Past month"),
23603 getValue: () => {
23604 const today = (0, import_date4.getDate)(null);
23605 return subMonths(today, 1);
23606 }
23607 }
23608 ];
23609 var DATE_RANGE_PRESETS = [
23610 {
23611 id: "last-7-days",
23612 label: (0, import_i18n35.__)("Last 7 days"),
23613 getValue: () => {
23614 const today = (0, import_date4.getDate)(null);
23615 return [subDays(today, 7), today];
23616 }
23617 },
23618 {
23619 id: "last-30-days",
23620 label: (0, import_i18n35.__)("Last 30 days"),
23621 getValue: () => {
23622 const today = (0, import_date4.getDate)(null);
23623 return [subDays(today, 30), today];
23624 }
23625 },
23626 {
23627 id: "month-to-date",
23628 label: (0, import_i18n35.__)("Month to date"),
23629 getValue: () => {
23630 const today = (0, import_date4.getDate)(null);
23631 return [startOfMonth(today), today];
23632 }
23633 },
23634 {
23635 id: "last-year",
23636 label: (0, import_i18n35.__)("Last year"),
23637 getValue: () => {
23638 const today = (0, import_date4.getDate)(null);
23639 return [subYears(today, 1), today];
23640 }
23641 },
23642 {
23643 id: "year-to-date",
23644 label: (0, import_i18n35.__)("Year to date"),
23645 getValue: () => {
23646 const today = (0, import_date4.getDate)(null);
23647 return [startOfYear(today), today];
23648 }
23649 }
23650 ];
23651 var parseDate = (dateString) => {
23652 if (!dateString) {
23653 return null;
23654 }
23655 const parsed = (0, import_date4.getDate)(dateString);
23656 return parsed && isValid(parsed) ? parsed : null;
23657 };
23658 var formatDate = (date) => {
23659 if (!date) {
23660 return "";
23661 }
23662 return typeof date === "string" ? date : format(date, "yyyy-MM-dd");
23663 };
23664 function ValidatedDateControl({
23665 field,
23666 validity,
23667 inputRefs,
23668 isTouched,
23669 setIsTouched,
23670 children
23671 }) {
23672 const { isValid: isValid2 } = field;
23673 const [customValidity, setCustomValidity] = (0, import_element70.useState)(void 0);
23674 const validateRefs = (0, import_element70.useCallback)(() => {
23675 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
23676 for (const ref of refs) {
23677 const input = ref.current;
23678 if (input && !input.validity.valid) {
23679 setCustomValidity({
23680 type: "invalid",
23681 message: input.validationMessage
23682 });
23683 return;
23684 }
23685 }
23686 setCustomValidity(void 0);
23687 }, [inputRefs]);
23688 (0, import_element70.useEffect)(() => {
23689 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
23690 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
23691 for (const ref of refs) {
23692 const input = ref.current;
23693 if (input) {
23694 input.setCustomValidity(
23695 result?.type === "invalid" && result.message ? result.message : ""
23696 );
23697 }
23698 }
23699 }, [inputRefs, isValid2, validity]);
23700 (0, import_element70.useEffect)(() => {
23701 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
23702 const handleInvalid = (event) => {
23703 event.preventDefault();
23704 setIsTouched(true);
23705 };
23706 for (const ref of refs) {
23707 ref.current?.addEventListener("invalid", handleInvalid);
23708 }
23709 return () => {
23710 for (const ref of refs) {
23711 ref.current?.removeEventListener("invalid", handleInvalid);
23712 }
23713 };
23714 }, [inputRefs, setIsTouched]);
23715 (0, import_element70.useEffect)(() => {
23716 if (!isTouched) {
23717 return;
23718 }
23719 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
23720 if (result) {
23721 setCustomValidity(result);
23722 } else {
23723 validateRefs();
23724 }
23725 }, [isTouched, isValid2, validity, validateRefs]);
23726 (0, import_element70.useEffect)(() => {
23727 if (isTouched && customValidity?.message) {
23728 speak(customValidity.message);
23729 }
23730 }, [isTouched, customValidity?.message]);
23731 const onBlur = (event) => {
23732 if (isTouched) {
23733 return;
23734 }
23735 if (!event.relatedTarget || !event.currentTarget.contains(event.relatedTarget)) {
23736 setIsTouched(true);
23737 }
23738 };
23739 return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { onBlur, children: [
23740 children,
23741 customValidity && /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(
23742 "p",
23743 {
23744 className: clsx_default(
23745 "components-validated-control__indicator",
23746 customValidity.type === "invalid" ? "is-invalid" : void 0
23747 ),
23748 children: [
23749 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23750 import_components32.Icon,
23751 {
23752 className: "components-validated-control__indicator-icon",
23753 icon: error_default,
23754 size: 16,
23755 fill: "currentColor"
23756 }
23757 ),
23758 customValidity.message
23759 ]
23760 }
23761 )
23762 ] });
23763 }
23764 function CalendarDateControl({
23765 data,
23766 field,
23767 onChange,
23768 hideLabelFromVision,
23769 markWhenOptional,
23770 validity
23771 }) {
23772 const {
23773 id,
23774 label,
23775 description,
23776 setValue,
23777 getValue,
23778 isValid: isValid2,
23779 format: fieldFormat
23780 } = field;
23781 const disabled2 = field.isDisabled({ item: data, field });
23782 const [selectedPresetId, setSelectedPresetId] = (0, import_element70.useState)(
23783 null
23784 );
23785 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
23786 const fieldValue = getValue({ item: data });
23787 const value = typeof fieldValue === "string" ? fieldValue : void 0;
23788 const [calendarMonth, setCalendarMonth] = (0, import_element70.useState)(() => {
23789 const parsedDate = parseDate(value);
23790 return parsedDate || /* @__PURE__ */ new Date();
23791 });
23792 const [isTouched, setIsTouched] = (0, import_element70.useState)(false);
23793 const validityTargetRef = (0, import_element70.useRef)(null);
23794 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDate);
23795 const onChangeCallback = (0, import_element70.useCallback)(
23796 (newValue) => onChange(setValue({ item: data, value: newValue })),
23797 [data, onChange, setValue]
23798 );
23799 const onSelectDate = (0, import_element70.useCallback)(
23800 (newDate) => {
23801 const dateValue = newDate ? format(newDate, "yyyy-MM-dd") : void 0;
23802 onChangeCallback(dateValue);
23803 setSelectedPresetId(null);
23804 setIsTouched(true);
23805 },
23806 [onChangeCallback]
23807 );
23808 const handlePresetClick = (0, import_element70.useCallback)(
23809 (preset) => {
23810 const presetDate = preset.getValue();
23811 const dateValue = formatDate(presetDate);
23812 setCalendarMonth(presetDate);
23813 onChangeCallback(dateValue);
23814 setSelectedPresetId(preset.id);
23815 setIsTouched(true);
23816 },
23817 [onChangeCallback]
23818 );
23819 const handleManualDateChange = (0, import_element70.useCallback)(
23820 (newValue) => {
23821 onChangeCallback(newValue);
23822 if (newValue) {
23823 const parsedDate = parseDate(newValue);
23824 if (parsedDate) {
23825 setCalendarMonth(parsedDate);
23826 }
23827 }
23828 setSelectedPresetId(null);
23829 setIsTouched(true);
23830 },
23831 [onChangeCallback]
23832 );
23833 const {
23834 timezone: { string: timezoneString }
23835 } = (0, import_date4.getSettings)();
23836 let displayLabel = label;
23837 if (isValid2?.required && !markWhenOptional) {
23838 displayLabel = `${label} (${(0, import_i18n35.__)("Required")})`;
23839 } else if (!isValid2?.required && markWhenOptional) {
23840 displayLabel = `${label} (${(0, import_i18n35.__)("Optional")})`;
23841 }
23842 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23843 ValidatedDateControl,
23844 {
23845 field,
23846 validity,
23847 inputRefs: validityTargetRef,
23848 isTouched,
23849 setIsTouched,
23850 children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23851 import_components32.BaseControl,
23852 {
23853 id,
23854 className: "dataviews-controls__date",
23855 label: displayLabel,
23856 help: description,
23857 hideLabelFromVision,
23858 children: /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(Stack, { direction: "column", gap: "lg", children: [
23859 /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(
23860 Stack,
23861 {
23862 direction: "row",
23863 gap: "sm",
23864 wrap: "wrap",
23865 justify: "flex-start",
23866 children: [
23867 DATE_PRESETS.map((preset) => {
23868 const isSelected2 = selectedPresetId === preset.id;
23869 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23870 import_components32.Button,
23871 {
23872 className: "dataviews-controls__date-preset",
23873 variant: "tertiary",
23874 isPressed: isSelected2,
23875 size: "small",
23876 disabled: disabled2,
23877 accessibleWhenDisabled: true,
23878 onClick: () => handlePresetClick(preset),
23879 children: preset.label
23880 },
23881 preset.id
23882 );
23883 }),
23884 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23885 import_components32.Button,
23886 {
23887 className: "dataviews-controls__date-preset",
23888 variant: "tertiary",
23889 isPressed: !selectedPresetId,
23890 size: "small",
23891 disabled: !!selectedPresetId || disabled2,
23892 accessibleWhenDisabled: true,
23893 children: (0, import_i18n35.__)("Custom")
23894 }
23895 )
23896 ]
23897 }
23898 ),
23899 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23900 import_components32.__experimentalInputControl,
23901 {
23902 ref: validityTargetRef,
23903 type: "date",
23904 label: (0, import_i18n35.__)("Date"),
23905 hideLabelFromVision: true,
23906 value,
23907 onChange: handleManualDateChange,
23908 required: !!field.isValid?.required,
23909 disabled: disabled2,
23910 min: minConstraint,
23911 max: maxConstraint
23912 }
23913 ),
23914 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
23915 DateCalendar2,
23916 {
23917 style: { width: "100%" },
23918 selected: value ? parseDate(value) || void 0 : void 0,
23919 onSelect: onSelectDate,
23920 month: calendarMonth,
23921 onMonthChange: setCalendarMonth,
23922 timeZone: timezoneString || void 0,
23923 weekStartsOn,
23924 disabled: disabled2 || disabledMatchers,
23925 disableNavigation: disabled2
23926 }
23927 )
23928 ] })
23929 }
23930 )
23931 }
23932 );
23933 }
23934 function CalendarDateRangeControl({
23935 data,
23936 field,
23937 onChange,
23938 hideLabelFromVision,
23939 markWhenOptional,
23940 validity
23941 }) {
23942 const {
23943 id,
23944 label,
23945 description,
23946 getValue,
23947 setValue,
23948 isValid: isValid2,
23949 format: fieldFormat
23950 } = field;
23951 const disabled2 = field.isDisabled({ item: data, field });
23952 let value;
23953 const fieldValue = getValue({ item: data });
23954 if (Array.isArray(fieldValue) && fieldValue.length === 2 && fieldValue.every((date) => typeof date === "string")) {
23955 value = fieldValue;
23956 }
23957 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
23958 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDate);
23959 const onChangeCallback = (0, import_element70.useCallback)(
23960 (newValue) => {
23961 onChange(
23962 setValue({
23963 item: data,
23964 value: newValue
23965 })
23966 );
23967 },
23968 [data, onChange, setValue]
23969 );
23970 const [selectedPresetId, setSelectedPresetId] = (0, import_element70.useState)(
23971 null
23972 );
23973 const selectedRange = (0, import_element70.useMemo)(() => {
23974 if (!value) {
23975 return { from: void 0, to: void 0 };
23976 }
23977 const [from, to] = value;
23978 return {
23979 from: parseDate(from) || void 0,
23980 to: parseDate(to) || void 0
23981 };
23982 }, [value]);
23983 const [calendarMonth, setCalendarMonth] = (0, import_element70.useState)(() => {
23984 return selectedRange.from || /* @__PURE__ */ new Date();
23985 });
23986 const [isTouched, setIsTouched] = (0, import_element70.useState)(false);
23987 const fromInputRef = (0, import_element70.useRef)(null);
23988 const toInputRef = (0, import_element70.useRef)(null);
23989 const updateDateRange = (0, import_element70.useCallback)(
23990 (fromDate, toDate2) => {
23991 if (fromDate && toDate2) {
23992 onChangeCallback([
23993 formatDate(fromDate),
23994 formatDate(toDate2)
23995 ]);
23996 } else if (!fromDate && !toDate2) {
23997 onChangeCallback(void 0);
23998 }
23999 },
24000 [onChangeCallback]
24001 );
24002 const onSelectCalendarRange = (0, import_element70.useCallback)(
24003 (newRange) => {
24004 updateDateRange(newRange?.from, newRange?.to);
24005 setSelectedPresetId(null);
24006 setIsTouched(true);
24007 },
24008 [updateDateRange]
24009 );
24010 const handlePresetClick = (0, import_element70.useCallback)(
24011 (preset) => {
24012 const [startDate, endDate] = preset.getValue();
24013 setCalendarMonth(startDate);
24014 updateDateRange(startDate, endDate);
24015 setSelectedPresetId(preset.id);
24016 setIsTouched(true);
24017 },
24018 [updateDateRange]
24019 );
24020 const handleManualDateChange = (0, import_element70.useCallback)(
24021 (fromOrTo, newValue) => {
24022 const [currentFrom, currentTo] = value || [
24023 void 0,
24024 void 0
24025 ];
24026 const updatedFrom = fromOrTo === "from" ? newValue : currentFrom;
24027 const updatedTo = fromOrTo === "to" ? newValue : currentTo;
24028 updateDateRange(updatedFrom, updatedTo);
24029 if (newValue) {
24030 const parsedDate = parseDate(newValue);
24031 if (parsedDate) {
24032 setCalendarMonth(parsedDate);
24033 }
24034 }
24035 setSelectedPresetId(null);
24036 setIsTouched(true);
24037 },
24038 [value, updateDateRange]
24039 );
24040 const { timezone } = (0, import_date4.getSettings)();
24041 let displayLabel = label;
24042 if (field.isValid?.required && !markWhenOptional) {
24043 displayLabel = `${label} (${(0, import_i18n35.__)("Required")})`;
24044 } else if (!field.isValid?.required && markWhenOptional) {
24045 displayLabel = `${label} (${(0, import_i18n35.__)("Optional")})`;
24046 }
24047 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24048 ValidatedDateControl,
24049 {
24050 field,
24051 validity,
24052 inputRefs: [fromInputRef, toInputRef],
24053 isTouched,
24054 setIsTouched,
24055 children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24056 import_components32.BaseControl,
24057 {
24058 id,
24059 className: "dataviews-controls__date",
24060 label: displayLabel,
24061 help: description,
24062 hideLabelFromVision,
24063 children: /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(Stack, { direction: "column", gap: "lg", children: [
24064 /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(
24065 Stack,
24066 {
24067 direction: "row",
24068 gap: "sm",
24069 wrap: "wrap",
24070 justify: "flex-start",
24071 children: [
24072 DATE_RANGE_PRESETS.map((preset) => {
24073 const isSelected2 = selectedPresetId === preset.id;
24074 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24075 import_components32.Button,
24076 {
24077 className: "dataviews-controls__date-preset",
24078 variant: "tertiary",
24079 isPressed: isSelected2,
24080 size: "small",
24081 disabled: disabled2,
24082 accessibleWhenDisabled: true,
24083 onClick: () => handlePresetClick(preset),
24084 children: preset.label
24085 },
24086 preset.id
24087 );
24088 }),
24089 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24090 import_components32.Button,
24091 {
24092 className: "dataviews-controls__date-preset",
24093 variant: "tertiary",
24094 isPressed: !selectedPresetId,
24095 size: "small",
24096 accessibleWhenDisabled: true,
24097 disabled: !!selectedPresetId || disabled2,
24098 children: (0, import_i18n35.__)("Custom")
24099 }
24100 )
24101 ]
24102 }
24103 ),
24104 /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(
24105 Stack,
24106 {
24107 direction: "row",
24108 gap: "sm",
24109 justify: "space-between",
24110 className: "dataviews-controls__date-range-inputs",
24111 children: [
24112 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24113 import_components32.__experimentalInputControl,
24114 {
24115 ref: fromInputRef,
24116 type: "date",
24117 label: (0, import_i18n35.__)("From"),
24118 hideLabelFromVision: true,
24119 value: value?.[0],
24120 onChange: (newValue) => handleManualDateChange("from", newValue),
24121 required: !!field.isValid?.required,
24122 disabled: disabled2,
24123 min: minConstraint,
24124 max: maxConstraint
24125 }
24126 ),
24127 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24128 import_components32.__experimentalInputControl,
24129 {
24130 ref: toInputRef,
24131 type: "date",
24132 label: (0, import_i18n35.__)("To"),
24133 hideLabelFromVision: true,
24134 value: value?.[1],
24135 onChange: (newValue) => handleManualDateChange("to", newValue),
24136 required: !!field.isValid?.required,
24137 disabled: disabled2,
24138 min: minConstraint,
24139 max: maxConstraint
24140 }
24141 )
24142 ]
24143 }
24144 ),
24145 /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24146 DateRangeCalendar,
24147 {
24148 style: { width: "100%" },
24149 selected: selectedRange,
24150 onSelect: onSelectCalendarRange,
24151 month: calendarMonth,
24152 onMonthChange: setCalendarMonth,
24153 timeZone: timezone.string || void 0,
24154 weekStartsOn,
24155 disabled: disabled2 || disabledMatchers
24156 }
24157 )
24158 ] })
24159 }
24160 )
24161 }
24162 );
24163 }
24164 function DateControl({
24165 data,
24166 field,
24167 onChange,
24168 hideLabelFromVision,
24169 markWhenOptional,
24170 operator,
24171 validity
24172 }) {
24173 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
24174 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24175 RelativeDateControl,
24176 {
24177 className: "dataviews-controls__date",
24178 data,
24179 field,
24180 onChange,
24181 hideLabelFromVision,
24182 operator
24183 }
24184 );
24185 }
24186 if (operator === OPERATOR_BETWEEN) {
24187 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24188 CalendarDateRangeControl,
24189 {
24190 data,
24191 field,
24192 onChange,
24193 hideLabelFromVision,
24194 markWhenOptional,
24195 validity
24196 }
24197 );
24198 }
24199 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
24200 CalendarDateControl,
24201 {
24202 data,
24203 field,
24204 onChange,
24205 hideLabelFromVision,
24206 markWhenOptional,
24207 validity
24208 }
24209 );
24210 }
24211
24212 // packages/dataviews/build-module/components/dataform-controls/select.mjs
24213 var import_components33 = __toESM(require_components(), 1);
24214 var import_element71 = __toESM(require_element(), 1);
24215 var import_jsx_runtime97 = __toESM(require_jsx_runtime(), 1);
24216 var { ValidatedSelectControl } = unlock2(import_components33.privateApis);
24217 function Select({
24218 data,
24219 field,
24220 onChange,
24221 hideLabelFromVision,
24222 markWhenOptional,
24223 validity
24224 }) {
24225 const { type, label, description, getValue, setValue, isValid: isValid2 } = field;
24226 const disabled2 = field.isDisabled({ item: data, field });
24227 const isMultiple = type === "array";
24228 const value = getValue({ item: data }) ?? (isMultiple ? [] : "");
24229 const onChangeControl = (0, import_element71.useCallback)(
24230 (newValue) => onChange(setValue({ item: data, value: newValue })),
24231 [data, onChange, setValue]
24232 );
24233 const { elements, isLoading } = useElements({
24234 elements: field.elements,
24235 getElements: field.getElements
24236 });
24237 if (isLoading) {
24238 return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(import_components33.Spinner, {});
24239 }
24240 return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
24241 ValidatedSelectControl,
24242 {
24243 required: !!field.isValid?.required,
24244 markWhenOptional,
24245 customValidity: getCustomValidity(isValid2, validity),
24246 label,
24247 value,
24248 help: description,
24249 options: elements,
24250 onChange: onChangeControl,
24251 hideLabelFromVision,
24252 multiple: isMultiple,
24253 disabled: disabled2
24254 }
24255 );
24256 }
24257
24258 // packages/dataviews/build-module/components/dataform-controls/adaptive-select.mjs
24259 var import_jsx_runtime98 = __toESM(require_jsx_runtime(), 1);
24260 var ELEMENTS_THRESHOLD = 10;
24261 function AdaptiveSelect(props) {
24262 const { field } = props;
24263 const { elements } = useElements({
24264 elements: field.elements,
24265 getElements: field.getElements
24266 });
24267 if (elements.length >= ELEMENTS_THRESHOLD) {
24268 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(Combobox3, { ...props });
24269 }
24270 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(Select, { ...props });
24271 }
24272
24273 // packages/dataviews/build-module/components/dataform-controls/email.mjs
24274 var import_components35 = __toESM(require_components(), 1);
24275
24276 // packages/dataviews/build-module/components/dataform-controls/utils/validated-input.mjs
24277 var import_components34 = __toESM(require_components(), 1);
24278 var import_element72 = __toESM(require_element(), 1);
24279 var import_jsx_runtime99 = __toESM(require_jsx_runtime(), 1);
24280 var { ValidatedInputControl: ValidatedInputControl2 } = unlock2(import_components34.privateApis);
24281 function ValidatedText({
24282 data,
24283 field,
24284 onChange,
24285 hideLabelFromVision,
24286 markWhenOptional,
24287 type,
24288 prefix,
24289 suffix,
24290 validity
24291 }) {
24292 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field;
24293 const value = getValue({ item: data });
24294 const disabled2 = field.isDisabled({ item: data, field });
24295 const onChangeControl = (0, import_element72.useCallback)(
24296 (newValue) => onChange(
24297 setValue({
24298 item: data,
24299 value: newValue
24300 })
24301 ),
24302 [data, setValue, onChange]
24303 );
24304 return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
24305 ValidatedInputControl2,
24306 {
24307 required: !!isValid2.required,
24308 markWhenOptional,
24309 customValidity: getCustomValidity(isValid2, validity),
24310 label,
24311 placeholder,
24312 value: value ?? "",
24313 help: description,
24314 onChange: onChangeControl,
24315 hideLabelFromVision,
24316 type,
24317 prefix,
24318 suffix,
24319 disabled: disabled2,
24320 pattern: isValid2.pattern ? isValid2.pattern.constraint : void 0,
24321 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
24322 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0
24323 }
24324 );
24325 }
24326
24327 // packages/dataviews/build-module/components/dataform-controls/email.mjs
24328 var import_jsx_runtime100 = __toESM(require_jsx_runtime(), 1);
24329 function Email({
24330 data,
24331 field,
24332 onChange,
24333 hideLabelFromVision,
24334 markWhenOptional,
24335 validity
24336 }) {
24337 return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
24338 ValidatedText,
24339 {
24340 ...{
24341 data,
24342 field,
24343 onChange,
24344 hideLabelFromVision,
24345 markWhenOptional,
24346 validity,
24347 type: "email",
24348 prefix: /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(import_components35.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(import_components35.Icon, { icon: envelope_default }) })
24349 }
24350 }
24351 );
24352 }
24353
24354 // packages/dataviews/build-module/components/dataform-controls/telephone.mjs
24355 var import_components36 = __toESM(require_components(), 1);
24356 var import_jsx_runtime101 = __toESM(require_jsx_runtime(), 1);
24357 function Telephone({
24358 data,
24359 field,
24360 onChange,
24361 hideLabelFromVision,
24362 markWhenOptional,
24363 validity
24364 }) {
24365 return /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(
24366 ValidatedText,
24367 {
24368 ...{
24369 data,
24370 field,
24371 onChange,
24372 hideLabelFromVision,
24373 markWhenOptional,
24374 validity,
24375 type: "tel",
24376 prefix: /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(import_components36.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(import_components36.Icon, { icon: mobile_default }) })
24377 }
24378 }
24379 );
24380 }
24381
24382 // packages/dataviews/build-module/components/dataform-controls/url.mjs
24383 var import_components37 = __toESM(require_components(), 1);
24384 var import_jsx_runtime102 = __toESM(require_jsx_runtime(), 1);
24385 function Url({
24386 data,
24387 field,
24388 onChange,
24389 hideLabelFromVision,
24390 markWhenOptional,
24391 validity
24392 }) {
24393 return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(
24394 ValidatedText,
24395 {
24396 ...{
24397 data,
24398 field,
24399 onChange,
24400 hideLabelFromVision,
24401 markWhenOptional,
24402 validity,
24403 type: "url",
24404 prefix: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(import_components37.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(import_components37.Icon, { icon: link_default }) })
24405 }
24406 }
24407 );
24408 }
24409
24410 // packages/dataviews/build-module/components/dataform-controls/utils/validated-number.mjs
24411 var import_components38 = __toESM(require_components(), 1);
24412 var import_element73 = __toESM(require_element(), 1);
24413 var import_i18n36 = __toESM(require_i18n(), 1);
24414 var import_jsx_runtime103 = __toESM(require_jsx_runtime(), 1);
24415 var { ValidatedNumberControl } = unlock2(import_components38.privateApis);
24416 function toNumberOrEmpty(value) {
24417 if (value === "" || value === void 0) {
24418 return "";
24419 }
24420 const number = Number(value);
24421 return Number.isFinite(number) ? number : "";
24422 }
24423 function BetweenControls({
24424 value,
24425 onChange,
24426 hideLabelFromVision,
24427 step
24428 }) {
24429 const [min2 = "", max2 = ""] = value;
24430 const onChangeMin = (0, import_element73.useCallback)(
24431 (newValue) => onChange([toNumberOrEmpty(newValue), max2]),
24432 [onChange, max2]
24433 );
24434 const onChangeMax = (0, import_element73.useCallback)(
24435 (newValue) => onChange([min2, toNumberOrEmpty(newValue)]),
24436 [onChange, min2]
24437 );
24438 return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
24439 import_components38.BaseControl,
24440 {
24441 help: (0, import_i18n36.__)("The max. value must be greater than the min. value."),
24442 children: /* @__PURE__ */ (0, import_jsx_runtime103.jsxs)(import_components38.Flex, { direction: "row", gap: 4, children: [
24443 /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
24444 import_components38.__experimentalNumberControl,
24445 {
24446 label: (0, import_i18n36.__)("Min."),
24447 value: min2,
24448 max: max2 ? Number(max2) - step : void 0,
24449 onChange: onChangeMin,
24450 hideLabelFromVision,
24451 step
24452 }
24453 ),
24454 /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
24455 import_components38.__experimentalNumberControl,
24456 {
24457 label: (0, import_i18n36.__)("Max."),
24458 value: max2,
24459 min: min2 ? Number(min2) + step : void 0,
24460 onChange: onChangeMax,
24461 hideLabelFromVision,
24462 step
24463 }
24464 )
24465 ] })
24466 }
24467 );
24468 }
24469 function ValidatedNumber({
24470 data,
24471 field,
24472 onChange,
24473 hideLabelFromVision,
24474 markWhenOptional,
24475 operator,
24476 validity
24477 }) {
24478 const decimals = field.format?.decimals ?? 0;
24479 const step = Math.pow(10, Math.abs(decimals) * -1);
24480 const { label, description, getValue, setValue, isValid: isValid2 } = field;
24481 const value = getValue({ item: data }) ?? "";
24482 const disabled2 = field.isDisabled({ item: data, field });
24483 const onChangeControl = (0, import_element73.useCallback)(
24484 (newValue) => {
24485 onChange(
24486 setValue({
24487 item: data,
24488 // Do not convert an empty string or undefined to a number,
24489 // otherwise there's a mismatch between the UI control (empty)
24490 // and the data relied by onChange (0).
24491 value: ["", void 0].includes(newValue) ? void 0 : Number(newValue)
24492 })
24493 );
24494 },
24495 [data, onChange, setValue]
24496 );
24497 const onChangeBetweenControls = (0, import_element73.useCallback)(
24498 (newValue) => {
24499 onChange(
24500 setValue({
24501 item: data,
24502 value: newValue
24503 })
24504 );
24505 },
24506 [data, onChange, setValue]
24507 );
24508 if (operator === OPERATOR_BETWEEN) {
24509 let valueBetween = ["", ""];
24510 if (Array.isArray(value) && value.length === 2 && value.every(
24511 (element) => typeof element === "number" || element === ""
24512 )) {
24513 valueBetween = value;
24514 }
24515 return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
24516 BetweenControls,
24517 {
24518 value: valueBetween,
24519 onChange: onChangeBetweenControls,
24520 hideLabelFromVision,
24521 step
24522 }
24523 );
24524 }
24525 return /* @__PURE__ */ (0, import_jsx_runtime103.jsx)(
24526 ValidatedNumberControl,
24527 {
24528 required: !!isValid2.required,
24529 markWhenOptional,
24530 customValidity: getCustomValidity(isValid2, validity),
24531 label,
24532 help: description,
24533 value,
24534 onChange: onChangeControl,
24535 hideLabelFromVision,
24536 step,
24537 min: isValid2.min ? isValid2.min.constraint : void 0,
24538 max: isValid2.max ? isValid2.max.constraint : void 0,
24539 disabled: disabled2
24540 }
24541 );
24542 }
24543
24544 // packages/dataviews/build-module/components/dataform-controls/integer.mjs
24545 var import_jsx_runtime104 = __toESM(require_jsx_runtime(), 1);
24546 function Integer(props) {
24547 return /* @__PURE__ */ (0, import_jsx_runtime104.jsx)(ValidatedNumber, { ...props });
24548 }
24549
24550 // packages/dataviews/build-module/components/dataform-controls/number.mjs
24551 var import_jsx_runtime105 = __toESM(require_jsx_runtime(), 1);
24552 function Number2(props) {
24553 return /* @__PURE__ */ (0, import_jsx_runtime105.jsx)(ValidatedNumber, { ...props });
24554 }
24555
24556 // packages/dataviews/build-module/components/dataform-controls/radio.mjs
24557 var import_components39 = __toESM(require_components(), 1);
24558 var import_element74 = __toESM(require_element(), 1);
24559 var import_jsx_runtime106 = __toESM(require_jsx_runtime(), 1);
24560 var { ValidatedRadioControl } = unlock2(import_components39.privateApis);
24561 function Radio({
24562 data,
24563 field,
24564 onChange,
24565 hideLabelFromVision,
24566 markWhenOptional,
24567 validity
24568 }) {
24569 const { label, description, getValue, setValue, isValid: isValid2 } = field;
24570 const disabled2 = field.isDisabled({ item: data, field });
24571 const { elements, isLoading } = useElements({
24572 elements: field.elements,
24573 getElements: field.getElements
24574 });
24575 const value = getValue({ item: data });
24576 const onChangeControl = (0, import_element74.useCallback)(
24577 (newValue) => onChange(setValue({ item: data, value: newValue })),
24578 [data, onChange, setValue]
24579 );
24580 if (isLoading) {
24581 return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(import_components39.Spinner, {});
24582 }
24583 return /* @__PURE__ */ (0, import_jsx_runtime106.jsx)(
24584 ValidatedRadioControl,
24585 {
24586 required: !!field.isValid?.required,
24587 markWhenOptional,
24588 customValidity: getCustomValidity(isValid2, validity),
24589 label,
24590 help: description,
24591 onChange: onChangeControl,
24592 options: elements,
24593 selected: value,
24594 hideLabelFromVision,
24595 disabled: disabled2
24596 }
24597 );
24598 }
24599
24600 // packages/dataviews/build-module/components/dataform-controls/text.mjs
24601 var import_element75 = __toESM(require_element(), 1);
24602 var import_jsx_runtime107 = __toESM(require_jsx_runtime(), 1);
24603 function Text3({
24604 data,
24605 field,
24606 onChange,
24607 hideLabelFromVision,
24608 markWhenOptional,
24609 config,
24610 validity
24611 }) {
24612 const { prefix, suffix } = config || {};
24613 return /* @__PURE__ */ (0, import_jsx_runtime107.jsx)(
24614 ValidatedText,
24615 {
24616 ...{
24617 data,
24618 field,
24619 onChange,
24620 hideLabelFromVision,
24621 markWhenOptional,
24622 validity,
24623 prefix: prefix ? (0, import_element75.createElement)(prefix) : void 0,
24624 suffix: suffix ? (0, import_element75.createElement)(suffix) : void 0
24625 }
24626 }
24627 );
24628 }
24629
24630 // packages/dataviews/build-module/components/dataform-controls/toggle.mjs
24631 var import_components40 = __toESM(require_components(), 1);
24632 var import_element76 = __toESM(require_element(), 1);
24633 var import_jsx_runtime108 = __toESM(require_jsx_runtime(), 1);
24634 var { ValidatedToggleControl } = unlock2(import_components40.privateApis);
24635 function Toggle({
24636 field,
24637 onChange,
24638 data,
24639 hideLabelFromVision,
24640 markWhenOptional,
24641 validity
24642 }) {
24643 const { label, description, getValue, setValue, isValid: isValid2 } = field;
24644 const disabled2 = field.isDisabled({ item: data, field });
24645 const onChangeControl = (0, import_element76.useCallback)(() => {
24646 onChange(
24647 setValue({ item: data, value: !getValue({ item: data }) })
24648 );
24649 }, [onChange, setValue, data, getValue]);
24650 return /* @__PURE__ */ (0, import_jsx_runtime108.jsx)(
24651 ValidatedToggleControl,
24652 {
24653 required: !!isValid2.required,
24654 markWhenOptional,
24655 customValidity: getCustomValidity(isValid2, validity),
24656 hidden: hideLabelFromVision,
24657 label,
24658 help: description,
24659 checked: getValue({ item: data }),
24660 onChange: onChangeControl,
24661 disabled: disabled2
24662 }
24663 );
24664 }
24665
24666 // packages/dataviews/build-module/components/dataform-controls/textarea.mjs
24667 var import_components41 = __toESM(require_components(), 1);
24668 var import_element77 = __toESM(require_element(), 1);
24669 var import_jsx_runtime109 = __toESM(require_jsx_runtime(), 1);
24670 var { ValidatedTextareaControl } = unlock2(import_components41.privateApis);
24671 function Textarea({
24672 data,
24673 field,
24674 onChange,
24675 hideLabelFromVision,
24676 markWhenOptional,
24677 config,
24678 validity
24679 }) {
24680 const { rows = 4 } = config || {};
24681 const disabled2 = field.isDisabled({ item: data, field });
24682 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
24683 const value = field.getValue({ item: data });
24684 const onChangeControl = (0, import_element77.useCallback)(
24685 (newValue) => onChange(setValue({ item: data, value: newValue })),
24686 [data, onChange, setValue]
24687 );
24688 return /* @__PURE__ */ (0, import_jsx_runtime109.jsx)(
24689 ValidatedTextareaControl,
24690 {
24691 required: !!isValid2.required,
24692 markWhenOptional,
24693 customValidity: getCustomValidity(isValid2, validity),
24694 label,
24695 placeholder,
24696 value: value ?? "",
24697 help: description,
24698 onChange: onChangeControl,
24699 rows,
24700 disabled: disabled2,
24701 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
24702 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0,
24703 hideLabelFromVision
24704 }
24705 );
24706 }
24707
24708 // packages/dataviews/build-module/components/dataform-controls/richtext/index.mjs
24709 var import_element79 = __toESM(require_element(), 1);
24710
24711 // packages/dataviews/build-module/components/dataform-controls/richtext/control.mjs
24712 var import_components42 = __toESM(require_components(), 1);
24713 var import_compose12 = __toESM(require_compose(), 1);
24714 var import_element78 = __toESM(require_element(), 1);
24715 var import_rich_text2 = __toESM(require_rich_text(), 1);
24716
24717 // packages/dataviews/build-module/components/dataform-controls/richtext/utils.mjs
24718 var EMPTY_ARRAY6 = [];
24719 function getAllowedFormats({
24720 allowedFormats,
24721 disableFormats
24722 }) {
24723 if (disableFormats) {
24724 return EMPTY_ARRAY6;
24725 }
24726 return allowedFormats;
24727 }
24728
24729 // packages/dataviews/build-module/components/dataform-controls/richtext/format-edit.mjs
24730 var import_rich_text = __toESM(require_rich_text(), 1);
24731 var import_jsx_runtime110 = __toESM(require_jsx_runtime(), 1);
24732 var import_react28 = __toESM(require_react(), 1);
24733 var EMPTY_CONTEXT = {};
24734 function Edit({
24735 onChange,
24736 onFocus,
24737 value,
24738 forwardedRef,
24739 settings,
24740 isVisible: isVisible2
24741 }) {
24742 const { name, edit: EditFunction } = settings;
24743 if (!EditFunction) {
24744 return null;
24745 }
24746 const activeFormat = (0, import_rich_text.getActiveFormat)(value, name);
24747 const isActive = activeFormat !== void 0;
24748 const activeObject = (0, import_rich_text.getActiveObject)(value);
24749 const isObjectActive = activeObject !== void 0 && activeObject.type === name;
24750 return /* @__PURE__ */ (0, import_jsx_runtime110.jsx)(
24751 EditFunction,
24752 {
24753 isActive,
24754 isVisible: isVisible2,
24755 activeAttributes: isActive ? activeFormat.attributes || {} : {},
24756 isObjectActive,
24757 activeObjectAttributes: isObjectActive ? activeObject.attributes || {} : {},
24758 value,
24759 onChange,
24760 onFocus,
24761 contentRef: forwardedRef,
24762 context: EMPTY_CONTEXT
24763 },
24764 name
24765 );
24766 }
24767 function FormatEdit({
24768 formatTypes,
24769 ...props
24770 }) {
24771 return formatTypes.map((settings) => /* @__PURE__ */ (0, import_react28.createElement)(Edit, { settings, ...props, key: settings.name }));
24772 }
24773
24774 // packages/dataviews/build-module/components/dataform-controls/richtext/control.mjs
24775 var import_jsx_runtime111 = __toESM(require_jsx_runtime(), 1);
24776 var {
24777 ValidatedContentEditableControl: RichTextControlShell,
24778 withIgnoreIMEEvents
24779 } = unlock2(import_components42.privateApis);
24780 var {
24781 useRichText,
24782 KeyboardShortcutContext,
24783 InputEventContext,
24784 shortcutsListener,
24785 inputEventsListener
24786 } = unlock2(import_rich_text2.privateApis);
24787 var EMPTY_COMPLETERS = [];
24788 function RichTextControl({
24789 label,
24790 value: attrValue,
24791 onChange,
24792 placeholder,
24793 id,
24794 clientId,
24795 className,
24796 hideLabelFromVision,
24797 help,
24798 disabled: disabled2,
24799 required,
24800 markWhenOptional,
24801 customValidity,
24802 allowedFormats,
24803 disableFormats,
24804 withoutInteractiveFormatting,
24805 preserveWhiteSpace,
24806 disableLineBreaks,
24807 focusOnMount,
24808 completers = EMPTY_COMPLETERS
24809 }) {
24810 const [selection, setSelection] = (0, import_element78.useState)({
24811 start: void 0,
24812 end: void 0
24813 });
24814 const [isSelected2, setIsSelected] = (0, import_element78.useState)(false);
24815 const anchorRef = (0, import_element78.useRef)(void 0);
24816 const inputEvents = (0, import_element78.useRef)(/* @__PURE__ */ new Set());
24817 const keyboardShortcuts = (0, import_element78.useRef)(
24818 /* @__PURE__ */ new Set()
24819 );
24820 const focusOutside = (0, import_compose12.__experimentalUseFocusOutside)(() => setIsSelected(false));
24821 const adjustedAllowedFormats = getAllowedFormats({
24822 allowedFormats,
24823 disableFormats
24824 });
24825 const {
24826 value,
24827 onChange: onRichTextChange,
24828 ref: richTextRef,
24829 formatTypes,
24830 getValue
24831 } = useRichText({
24832 value: attrValue,
24833 onChange,
24834 selectionStart: selection.start,
24835 selectionEnd: selection.end,
24836 onSelectionChange: (start, end) => setSelection({ start, end }),
24837 __unstableIsSelected: isSelected2,
24838 preserveWhiteSpace: !!preserveWhiteSpace,
24839 placeholder,
24840 __unstableDisableFormats: disableFormats,
24841 allowedFormats: adjustedAllowedFormats,
24842 withoutInteractiveFormatting,
24843 __unstableFormatTypeHandlerContext: (0, import_element78.useMemo)(
24844 () => ({
24845 richTextIdentifier: id,
24846 blockClientId: clientId
24847 }),
24848 [id, clientId]
24849 )
24850 });
24851 function onFocus() {
24852 anchorRef.current?.focus();
24853 }
24854 const eventListenersPropsRef = (0, import_element78.useRef)({
24855 keyboardShortcuts,
24856 inputEvents
24857 });
24858 const inputRulePropsRef = (0, import_element78.useRef)({
24859 formatTypes,
24860 getValue,
24861 onChange: onRichTextChange
24862 });
24863 (0, import_element78.useInsertionEffect)(() => {
24864 inputRulePropsRef.current = {
24865 formatTypes,
24866 getValue,
24867 onChange: onRichTextChange
24868 };
24869 });
24870 const enterRef = (0, import_compose12.useRefEffect)(
24871 (element) => {
24872 if (disabled2) {
24873 return;
24874 }
24875 const onKeyDown = withIgnoreIMEEvents((event) => {
24876 if (event.key !== "Enter" || event.defaultPrevented || event.metaKey || event.ctrlKey) {
24877 return;
24878 }
24879 event.preventDefault();
24880 if (disableLineBreaks) {
24881 return;
24882 }
24883 const { getValue: getCurrentValue2, onChange: handleChange } = inputRulePropsRef.current;
24884 const current = getCurrentValue2();
24885 handleChange(
24886 (0, import_rich_text2.insert)(
24887 current,
24888 "\n",
24889 current.start ?? current.text.length,
24890 current.end ?? current.text.length
24891 )
24892 );
24893 });
24894 element.addEventListener("keydown", onKeyDown);
24895 return () => element.removeEventListener("keydown", onKeyDown);
24896 },
24897 [disableLineBreaks, disabled2]
24898 );
24899 const eventListenersRef = (0, import_compose12.useRefEffect)(
24900 (element) => {
24901 if (!isSelected2) {
24902 return;
24903 }
24904 const cleanupShortcuts = shortcutsListener(
24905 eventListenersPropsRef
24906 )(element);
24907 const cleanupInputEvents = inputEventsListener(
24908 eventListenersPropsRef
24909 )(element);
24910 function onFormatInput(event) {
24911 if (event.inputType !== "insertText" && event.type !== "compositionend") {
24912 return;
24913 }
24914 const {
24915 formatTypes: types,
24916 getValue: getCurrentValue2,
24917 onChange: handleChange
24918 } = inputRulePropsRef.current;
24919 const current = getCurrentValue2();
24920 const transformed = types.reduce(
24921 (accumulator, {
24922 __unstableInputRule
24923 }) => __unstableInputRule ? __unstableInputRule(accumulator) : accumulator,
24924 current
24925 );
24926 if (transformed !== current) {
24927 handleChange({
24928 ...transformed,
24929 activeFormats: current.activeFormats
24930 });
24931 }
24932 }
24933 element.addEventListener("input", onFormatInput);
24934 element.addEventListener("compositionend", onFormatInput);
24935 return () => {
24936 cleanupShortcuts();
24937 cleanupInputEvents();
24938 element.removeEventListener("input", onFormatInput);
24939 element.removeEventListener("compositionend", onFormatInput);
24940 };
24941 },
24942 [isSelected2]
24943 );
24944 const { ref: autocompleteRef, ...autocompleteProps } = (0, import_components42.__unstableUseAutocompleteProps)(
24945 {
24946 completers,
24947 record: value,
24948 onChange: onRichTextChange,
24949 // This control's completers insert their completion into the value;
24950 // none replace the whole value, so the required `onReplace` is a
24951 // no-op here.
24952 onReplace: () => {
24953 }
24954 }
24955 );
24956 const focusOnMountRef = (0, import_compose12.useRefEffect)(
24957 (element) => {
24958 if (focusOnMount && !disabled2) {
24959 element.focus();
24960 }
24961 },
24962 [focusOnMount, disabled2]
24963 );
24964 const editableRef = (0, import_compose12.useMergeRefs)([
24965 richTextRef,
24966 anchorRef,
24967 eventListenersRef,
24968 enterRef,
24969 focusOnMountRef,
24970 autocompleteRef
24971 ]);
24972 return (
24973 // Focus boundary for the field's selection: `onFocus` selects on entry;
24974 // the spread `useFocusOutside` handlers deselect once focus leaves.
24975 /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
24976 "div",
24977 {
24978 ...focusOutside,
24979 onFocus: (event) => {
24980 setIsSelected(true);
24981 focusOutside.onFocus(event);
24982 },
24983 children: /* @__PURE__ */ (0, import_jsx_runtime111.jsxs)(import_components42.SlotFillProvider, { children: [
24984 /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
24985 RichTextControlShell,
24986 {
24987 label,
24988 id,
24989 className: clsx_default(
24990 "dataviews-controls__richtext",
24991 className
24992 ),
24993 placeholder,
24994 hideLabelFromVision,
24995 help,
24996 disabled: disabled2,
24997 required,
24998 markWhenOptional,
24999 customValidity,
25000 value: value.text,
25001 "aria-multiline": !disableLineBreaks,
25002 ...autocompleteProps,
25003 ref: editableRef
25004 }
25005 ),
25006 isSelected2 && !disabled2 && /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
25007 KeyboardShortcutContext.Provider,
25008 {
25009 value: keyboardShortcuts,
25010 children: /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(InputEventContext.Provider, { value: inputEvents, children: /* @__PURE__ */ (0, import_jsx_runtime111.jsx)(
25011 FormatEdit,
25012 {
25013 value,
25014 onChange: onRichTextChange,
25015 onFocus,
25016 formatTypes,
25017 forwardedRef: anchorRef,
25018 isVisible: true
25019 }
25020 ) })
25021 }
25022 )
25023 ] })
25024 }
25025 )
25026 );
25027 }
25028
25029 // packages/dataviews/build-module/components/dataform-controls/richtext/index.mjs
25030 var import_jsx_runtime112 = __toESM(require_jsx_runtime(), 1);
25031 function RichText({
25032 data,
25033 field,
25034 onChange,
25035 hideLabelFromVision,
25036 markWhenOptional,
25037 config,
25038 validity
25039 }) {
25040 const {
25041 className,
25042 clientId,
25043 allowedFormats,
25044 disableFormats,
25045 withoutInteractiveFormatting,
25046 preserveWhiteSpace,
25047 disableLineBreaks
25048 } = config || {};
25049 const disabled2 = field.isDisabled({ item: data, field });
25050 const { label, placeholder, description, id, setValue, isValid: isValid2 } = field;
25051 const value = field.getValue({ item: data }) ?? "";
25052 const onChangeControl = (0, import_element79.useCallback)(
25053 (newValue) => onChange(setValue({ item: data, value: newValue })),
25054 [data, onChange, setValue]
25055 );
25056 return /* @__PURE__ */ (0, import_jsx_runtime112.jsx)(
25057 RichTextControl,
25058 {
25059 label,
25060 value,
25061 onChange: onChangeControl,
25062 placeholder,
25063 id,
25064 hideLabelFromVision,
25065 help: description,
25066 disabled: disabled2,
25067 required: !!isValid2.required,
25068 markWhenOptional,
25069 customValidity: getCustomValidity(isValid2, validity),
25070 className,
25071 clientId,
25072 allowedFormats,
25073 disableFormats,
25074 withoutInteractiveFormatting,
25075 preserveWhiteSpace,
25076 disableLineBreaks
25077 }
25078 );
25079 }
25080
25081 // packages/dataviews/build-module/components/dataform-controls/toggle-group.mjs
25082 var import_components43 = __toESM(require_components(), 1);
25083 var import_element80 = __toESM(require_element(), 1);
25084 var import_jsx_runtime113 = __toESM(require_jsx_runtime(), 1);
25085 var { ValidatedToggleGroupControl } = unlock2(import_components43.privateApis);
25086 function ToggleGroup({
25087 data,
25088 field,
25089 onChange,
25090 hideLabelFromVision,
25091 markWhenOptional,
25092 validity
25093 }) {
25094 const { getValue, setValue, isValid: isValid2 } = field;
25095 const disabled2 = field.isDisabled({ item: data, field });
25096 const value = getValue({ item: data });
25097 const onChangeControl = (0, import_element80.useCallback)(
25098 (newValue) => onChange(setValue({ item: data, value: newValue })),
25099 [data, onChange, setValue]
25100 );
25101 const { elements, isLoading } = useElements({
25102 elements: field.elements,
25103 getElements: field.getElements
25104 });
25105 if (isLoading) {
25106 return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(import_components43.Spinner, {});
25107 }
25108 if (elements.length === 0) {
25109 return null;
25110 }
25111 const selectedOption = elements.find((el) => el.value === value);
25112 return /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
25113 ValidatedToggleGroupControl,
25114 {
25115 required: !!field.isValid?.required,
25116 markWhenOptional,
25117 customValidity: getCustomValidity(isValid2, validity),
25118 isBlock: true,
25119 label: field.label,
25120 help: selectedOption?.description || field.description,
25121 onChange: onChangeControl,
25122 value,
25123 hideLabelFromVision,
25124 children: elements.map((el) => /* @__PURE__ */ (0, import_jsx_runtime113.jsx)(
25125 import_components43.__experimentalToggleGroupControlOption,
25126 {
25127 label: el.label,
25128 value: el.value,
25129 disabled: disabled2
25130 },
25131 el.value
25132 ))
25133 }
25134 );
25135 }
25136
25137 // packages/dataviews/build-module/components/dataform-controls/array.mjs
25138 var import_components44 = __toESM(require_components(), 1);
25139 var import_element81 = __toESM(require_element(), 1);
25140 var import_jsx_runtime114 = __toESM(require_jsx_runtime(), 1);
25141 var { ValidatedFormTokenField } = unlock2(import_components44.privateApis);
25142 function ArrayControl({
25143 data,
25144 field,
25145 onChange,
25146 hideLabelFromVision,
25147 markWhenOptional,
25148 validity
25149 }) {
25150 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field;
25151 const value = getValue({ item: data });
25152 const disabled2 = field.isDisabled({ item: data, field });
25153 const { elements, isLoading } = useElements({
25154 elements: field.elements,
25155 getElements: field.getElements
25156 });
25157 const arrayValueAsElements = (0, import_element81.useMemo)(
25158 () => Array.isArray(value) ? value.map((token) => {
25159 const element = elements?.find(
25160 (suggestion) => suggestion.value === token
25161 );
25162 return element || { value: token, label: token };
25163 }) : [],
25164 [value, elements]
25165 );
25166 const onChangeControl = (0, import_element81.useCallback)(
25167 (tokens) => {
25168 const valueTokens = tokens.map((token) => {
25169 if (typeof token === "object" && "value" in token) {
25170 return token.value;
25171 }
25172 return token;
25173 });
25174 onChange(setValue({ item: data, value: valueTokens }));
25175 },
25176 [onChange, setValue, data]
25177 );
25178 if (isLoading) {
25179 return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(import_components44.Spinner, {});
25180 }
25181 return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(
25182 ValidatedFormTokenField,
25183 {
25184 required: !!isValid2?.required,
25185 markWhenOptional,
25186 customValidity: getCustomValidity(isValid2, validity),
25187 label: hideLabelFromVision ? void 0 : label,
25188 value: arrayValueAsElements,
25189 onChange: onChangeControl,
25190 placeholder,
25191 suggestions: elements?.map((element) => element.value),
25192 disabled: disabled2,
25193 __experimentalValidateInput: (token) => {
25194 if (field.isValid?.elements && elements) {
25195 return elements.some(
25196 (element) => element.value === token || element.label === token
25197 );
25198 }
25199 return true;
25200 },
25201 __experimentalExpandOnFocus: elements && elements.length > 0,
25202 help: description ?? (field.isValid?.elements ? "" : void 0),
25203 displayTransform: (token) => {
25204 if (typeof token === "object" && "label" in token) {
25205 return token.label;
25206 }
25207 if (typeof token === "string" && elements) {
25208 const element = elements.find(
25209 (el) => el.value === token
25210 );
25211 return element?.label || token;
25212 }
25213 return token;
25214 },
25215 __experimentalRenderItem: ({ item }) => {
25216 if (typeof item === "string" && elements) {
25217 const element = elements.find(
25218 (el) => el.value === item
25219 );
25220 return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)("span", { children: element?.label || item });
25221 }
25222 return /* @__PURE__ */ (0, import_jsx_runtime114.jsx)("span", { children: item });
25223 }
25224 }
25225 );
25226 }
25227
25228 // node_modules/colord/index.mjs
25229 var r2 = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) };
25230 var t = function(r3) {
25231 return "string" == typeof r3 ? r3.length > 0 : "number" == typeof r3;
25232 };
25233 var n = function(r3, t2, n2) {
25234 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r3) / n2 + 0;
25235 };
25236 var e = function(r3, t2, n2) {
25237 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r3 > n2 ? n2 : r3 > t2 ? r3 : t2;
25238 };
25239 var u = function(r3) {
25240 return (r3 = isFinite(r3) ? r3 % 360 : 0) > 0 ? r3 : r3 + 360;
25241 };
25242 var a = function(r3) {
25243 return { r: e(r3.r, 0, 255), g: e(r3.g, 0, 255), b: e(r3.b, 0, 255), a: e(r3.a) };
25244 };
25245 var o = function(r3) {
25246 return { r: n(r3.r), g: n(r3.g), b: n(r3.b), a: n(r3.a, 3) };
25247 };
25248 var i = /^#([0-9a-f]{3,8})$/i;
25249 var s = function(r3) {
25250 var t2 = r3.toString(16);
25251 return t2.length < 2 ? "0" + t2 : t2;
25252 };
25253 var h = function(r3) {
25254 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;
25255 return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 };
25256 };
25257 var b = function(r3) {
25258 var t2 = r3.h, n2 = r3.s, e2 = r3.v, u2 = r3.a;
25259 t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100;
25260 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;
25261 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 };
25262 };
25263 var g = function(r3) {
25264 return { h: u(r3.h), s: e(r3.s, 0, 100), l: e(r3.l, 0, 100), a: e(r3.a) };
25265 };
25266 var d = function(r3) {
25267 return { h: n(r3.h), s: n(r3.s), l: n(r3.l), a: n(r3.a, 3) };
25268 };
25269 var f = function(r3) {
25270 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 }));
25271 var t2, n2, e2;
25272 };
25273 var c = function(r3) {
25274 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 };
25275 var t2, n2, e2, u2;
25276 };
25277 var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25278 var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25279 var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25280 var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
25281 var y = { string: [[function(r3) {
25282 var t2 = i.exec(r3);
25283 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;
25284 }, "hex"], [function(r3) {
25285 var t2 = v.exec(r3) || m.exec(r3);
25286 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;
25287 }, "rgb"], [function(t2) {
25288 var n2 = l.exec(t2) || p.exec(t2);
25289 if (!n2) return null;
25290 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) });
25291 return f(a2);
25292 }, "hsl"]], object: [[function(r3) {
25293 var n2 = r3.r, e2 = r3.g, u2 = r3.b, o2 = r3.a, i2 = void 0 === o2 ? 1 : o2;
25294 return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null;
25295 }, "rgb"], [function(r3) {
25296 var n2 = r3.h, e2 = r3.s, u2 = r3.l, a2 = r3.a, o2 = void 0 === a2 ? 1 : a2;
25297 if (!t(n2) || !t(e2) || !t(u2)) return null;
25298 var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) });
25299 return f(i2);
25300 }, "hsl"], [function(r3) {
25301 var n2 = r3.h, a2 = r3.s, o2 = r3.v, i2 = r3.a, s2 = void 0 === i2 ? 1 : i2;
25302 if (!t(n2) || !t(a2) || !t(o2)) return null;
25303 var h2 = (function(r4) {
25304 return { h: u(r4.h), s: e(r4.s, 0, 100), v: e(r4.v, 0, 100), a: e(r4.a) };
25305 })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) });
25306 return b(h2);
25307 }, "hsv"]] };
25308 var N = function(r3, t2) {
25309 for (var n2 = 0; n2 < t2.length; n2++) {
25310 var e2 = t2[n2][0](r3);
25311 if (e2) return [e2, t2[n2][1]];
25312 }
25313 return [null, void 0];
25314 };
25315 var x = function(r3) {
25316 return "string" == typeof r3 ? N(r3.trim(), y.string) : "object" == typeof r3 && null !== r3 ? N(r3, y.object) : [null, void 0];
25317 };
25318 var M = function(r3, t2) {
25319 var n2 = c(r3);
25320 return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a };
25321 };
25322 var H = function(r3) {
25323 return (299 * r3.r + 587 * r3.g + 114 * r3.b) / 1e3 / 255;
25324 };
25325 var $ = function(r3, t2) {
25326 var n2 = c(r3);
25327 return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a };
25328 };
25329 var j = (function() {
25330 function r3(r4) {
25331 this.parsed = x(r4)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 };
25332 }
25333 return r3.prototype.isValid = function() {
25334 return null !== this.parsed;
25335 }, r3.prototype.brightness = function() {
25336 return n(H(this.rgba), 2);
25337 }, r3.prototype.isDark = function() {
25338 return H(this.rgba) < 0.5;
25339 }, r3.prototype.isLight = function() {
25340 return H(this.rgba) >= 0.5;
25341 }, r3.prototype.toHex = function() {
25342 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;
25343 var r4, t2, e2, u2, a2, i2;
25344 }, r3.prototype.toRgb = function() {
25345 return o(this.rgba);
25346 }, r3.prototype.toRgbString = function() {
25347 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 + ")";
25348 var r4, t2, n2, e2, u2;
25349 }, r3.prototype.toHsl = function() {
25350 return d(c(this.rgba));
25351 }, r3.prototype.toHslString = function() {
25352 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 + "%)";
25353 var r4, t2, n2, e2, u2;
25354 }, r3.prototype.toHsv = function() {
25355 return r4 = h(this.rgba), { h: n(r4.h), s: n(r4.s), v: n(r4.v), a: n(r4.a, 3) };
25356 var r4;
25357 }, r3.prototype.invert = function() {
25358 return w({ r: 255 - (r4 = this.rgba).r, g: 255 - r4.g, b: 255 - r4.b, a: r4.a });
25359 var r4;
25360 }, r3.prototype.saturate = function(r4) {
25361 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, r4));
25362 }, r3.prototype.desaturate = function(r4) {
25363 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, -r4));
25364 }, r3.prototype.grayscale = function() {
25365 return w(M(this.rgba, -1));
25366 }, r3.prototype.lighten = function(r4) {
25367 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, r4));
25368 }, r3.prototype.darken = function(r4) {
25369 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, -r4));
25370 }, r3.prototype.rotate = function(r4) {
25371 return void 0 === r4 && (r4 = 15), this.hue(this.hue() + r4);
25372 }, r3.prototype.alpha = function(r4) {
25373 return "number" == typeof r4 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r4 }) : n(this.rgba.a, 3);
25374 var t2;
25375 }, r3.prototype.hue = function(r4) {
25376 var t2 = c(this.rgba);
25377 return "number" == typeof r4 ? w({ h: r4, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h);
25378 }, r3.prototype.isEqual = function(r4) {
25379 return this.toHex() === w(r4).toHex();
25380 }, r3;
25381 })();
25382 var w = function(r3) {
25383 return r3 instanceof j ? r3 : new j(r3);
25384 };
25385
25386 // packages/dataviews/build-module/components/dataform-controls/color.mjs
25387 var import_components45 = __toESM(require_components(), 1);
25388 var import_element82 = __toESM(require_element(), 1);
25389 var import_i18n37 = __toESM(require_i18n(), 1);
25390 var import_jsx_runtime115 = __toESM(require_jsx_runtime(), 1);
25391 var { ValidatedInputControl: ValidatedInputControl3 } = unlock2(import_components45.privateApis);
25392 var ColorPickerDropdown = ({
25393 color,
25394 onColorChange,
25395 disabled: disabled2
25396 }) => {
25397 const validColor = color && w(color).isValid() ? color : "#ffffff";
25398 return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25399 import_components45.Dropdown,
25400 {
25401 className: "dataviews-controls__color-picker-dropdown",
25402 popoverProps: { resize: false },
25403 renderToggle: ({ onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25404 import_components45.Button,
25405 {
25406 onClick: onToggle,
25407 "aria-label": (0, import_i18n37.__)("Open color picker"),
25408 size: "small",
25409 disabled: disabled2,
25410 accessibleWhenDisabled: true,
25411 icon: () => /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(import_components45.ColorIndicator, { colorValue: validColor })
25412 }
25413 ),
25414 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(import_components45.__experimentalDropdownContentWrapper, { paddingSize: "none", children: /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25415 import_components45.ColorPicker,
25416 {
25417 color: validColor,
25418 onChange: onColorChange,
25419 enableAlpha: true
25420 }
25421 ) })
25422 }
25423 );
25424 };
25425 function Color({
25426 data,
25427 field,
25428 onChange,
25429 hideLabelFromVision,
25430 markWhenOptional,
25431 validity
25432 }) {
25433 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
25434 const disabled2 = field.isDisabled({ item: data, field });
25435 const value = field.getValue({ item: data }) || "";
25436 const handleColorChange = (0, import_element82.useCallback)(
25437 (newColor) => {
25438 onChange(setValue({ item: data, value: newColor }));
25439 },
25440 [data, onChange, setValue]
25441 );
25442 const handleInputChange = (0, import_element82.useCallback)(
25443 (newValue) => {
25444 onChange(setValue({ item: data, value: newValue || "" }));
25445 },
25446 [data, onChange, setValue]
25447 );
25448 return /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25449 ValidatedInputControl3,
25450 {
25451 required: !!field.isValid?.required,
25452 markWhenOptional,
25453 customValidity: getCustomValidity(isValid2, validity),
25454 label,
25455 placeholder,
25456 value,
25457 help: description,
25458 onChange: handleInputChange,
25459 hideLabelFromVision,
25460 type: "text",
25461 disabled: disabled2,
25462 prefix: /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(import_components45.__experimentalInputControlPrefixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime115.jsx)(
25463 ColorPickerDropdown,
25464 {
25465 color: value,
25466 onColorChange: handleColorChange,
25467 disabled: disabled2
25468 }
25469 ) })
25470 }
25471 );
25472 }
25473
25474 // packages/dataviews/build-module/components/dataform-controls/password.mjs
25475 var import_components46 = __toESM(require_components(), 1);
25476 var import_element83 = __toESM(require_element(), 1);
25477 var import_i18n38 = __toESM(require_i18n(), 1);
25478 var import_jsx_runtime116 = __toESM(require_jsx_runtime(), 1);
25479 function Password({
25480 data,
25481 field,
25482 onChange,
25483 hideLabelFromVision,
25484 markWhenOptional,
25485 validity
25486 }) {
25487 const [isVisible2, setIsVisible] = (0, import_element83.useState)(false);
25488 const disabled2 = field.isDisabled({ item: data, field });
25489 const toggleVisibility = (0, import_element83.useCallback)(() => {
25490 setIsVisible((prev) => !prev);
25491 }, []);
25492 return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(
25493 ValidatedText,
25494 {
25495 ...{
25496 data,
25497 field,
25498 onChange,
25499 hideLabelFromVision,
25500 markWhenOptional,
25501 validity,
25502 type: isVisible2 ? "text" : "password",
25503 suffix: /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(import_components46.__experimentalInputControlSuffixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(
25504 import_components46.Button,
25505 {
25506 icon: isVisible2 ? unseen_default : seen_default,
25507 onClick: toggleVisibility,
25508 size: "small",
25509 label: isVisible2 ? (0, import_i18n38.__)("Hide password") : (0, import_i18n38.__)("Show password"),
25510 disabled: disabled2,
25511 accessibleWhenDisabled: true
25512 }
25513 ) })
25514 }
25515 }
25516 );
25517 }
25518
25519 // packages/dataviews/build-module/field-types/utils/has-elements.mjs
25520 function hasElements(field) {
25521 return Array.isArray(field.elements) && field.elements.length > 0 || typeof field.getElements === "function";
25522 }
25523
25524 // packages/dataviews/build-module/components/dataform-controls/index.mjs
25525 var import_jsx_runtime117 = __toESM(require_jsx_runtime(), 1);
25526 var FORM_CONTROLS = {
25527 adaptiveSelect: AdaptiveSelect,
25528 array: ArrayControl,
25529 checkbox: Checkbox,
25530 color: Color,
25531 combobox: Combobox3,
25532 datetime: DateTime,
25533 date: DateControl,
25534 email: Email,
25535 telephone: Telephone,
25536 url: Url,
25537 integer: Integer,
25538 number: Number2,
25539 password: Password,
25540 radio: Radio,
25541 select: Select,
25542 text: Text3,
25543 toggle: Toggle,
25544 textarea: Textarea,
25545 richtext: RichText,
25546 toggleGroup: ToggleGroup
25547 };
25548 function isEditConfig(value) {
25549 return value && typeof value === "object" && typeof value.control === "string";
25550 }
25551 function createConfiguredControl(config) {
25552 const { control, ...controlConfig } = config;
25553 const BaseControlType = getControlByType(control);
25554 if (BaseControlType === null) {
25555 return null;
25556 }
25557 return function ConfiguredControl(props) {
25558 return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(BaseControlType, { ...props, config: controlConfig });
25559 };
25560 }
25561 function getControl(field, fallback) {
25562 if (typeof field.Edit === "function") {
25563 return field.Edit;
25564 }
25565 if (typeof field.Edit === "string") {
25566 return getControlByType(field.Edit);
25567 }
25568 if (isEditConfig(field.Edit)) {
25569 return createConfiguredControl(field.Edit);
25570 }
25571 if (hasElements(field) && field.type !== "array") {
25572 return getControlByType("adaptiveSelect");
25573 }
25574 if (fallback === null) {
25575 return null;
25576 }
25577 return getControlByType(fallback);
25578 }
25579 function getControlByType(type) {
25580 if (Object.keys(FORM_CONTROLS).includes(type)) {
25581 return FORM_CONTROLS[type];
25582 }
25583 return null;
25584 }
25585
25586 // packages/dataviews/build-module/field-types/utils/get-filter-by.mjs
25587 function getFilterBy(field, defaultOperators, validOperators) {
25588 if (field.filterBy === false) {
25589 return false;
25590 }
25591 const operators = field.filterBy?.operators?.filter(
25592 (op) => validOperators.includes(op)
25593 ) ?? defaultOperators;
25594 if (operators.length === 0) {
25595 return false;
25596 }
25597 return {
25598 isPrimary: !!field.filterBy?.isPrimary,
25599 operators
25600 };
25601 }
25602 var get_filter_by_default = getFilterBy;
25603
25604 // packages/dataviews/build-module/field-types/utils/get-value-from-id.mjs
25605 var getValueFromId = (id) => ({ item }) => {
25606 const path = id.split(".");
25607 let value = item;
25608 for (const segment of path) {
25609 if (value.hasOwnProperty(segment)) {
25610 value = value[segment];
25611 } else {
25612 value = void 0;
25613 }
25614 }
25615 return value;
25616 };
25617 var get_value_from_id_default = getValueFromId;
25618
25619 // packages/dataviews/build-module/field-types/utils/set-value-from-id.mjs
25620 var setValueFromId = (id) => ({ value }) => {
25621 const path = id.split(".");
25622 const result = {};
25623 let current = result;
25624 for (const segment of path.slice(0, -1)) {
25625 current[segment] = {};
25626 current = current[segment];
25627 }
25628 current[path.at(-1)] = value;
25629 return result;
25630 };
25631 var set_value_from_id_default = setValueFromId;
25632
25633 // packages/dataviews/build-module/field-types/email.mjs
25634 var import_i18n39 = __toESM(require_i18n(), 1);
25635
25636 // packages/dataviews/build-module/field-types/utils/render-from-elements.mjs
25637 function RenderFromElements({
25638 item,
25639 field
25640 }) {
25641 const { elements, isLoading } = useElements({
25642 elements: field.elements,
25643 getElements: field.getElements
25644 });
25645 const value = field.getValue({ item });
25646 if (isLoading) {
25647 return value;
25648 }
25649 if (elements.length === 0) {
25650 return value;
25651 }
25652 return elements?.find((element) => element.value === value)?.label || field.getValue({ item });
25653 }
25654
25655 // packages/dataviews/build-module/field-types/utils/render-default.mjs
25656 var import_jsx_runtime118 = __toESM(require_jsx_runtime(), 1);
25657 function render({
25658 item,
25659 field
25660 }) {
25661 if (field.hasElements) {
25662 return /* @__PURE__ */ (0, import_jsx_runtime118.jsx)(RenderFromElements, { item, field });
25663 }
25664 return field.getValueFormatted({ item, field });
25665 }
25666
25667 // packages/dataviews/build-module/field-types/utils/sort-text.mjs
25668 var sort_text_default = (a2, b2, direction) => {
25669 return direction === "asc" ? a2.localeCompare(b2) : b2.localeCompare(a2);
25670 };
25671
25672 // packages/dataviews/build-module/field-types/utils/is-valid-required.mjs
25673 function isValidRequired(item, field) {
25674 const value = field.getValue({ item });
25675 return ![void 0, "", null].includes(value);
25676 }
25677
25678 // packages/dataviews/build-module/field-types/utils/is-valid-min-length.mjs
25679 function isValidMinLength(item, field) {
25680 if (typeof field.isValid.minLength?.constraint !== "number") {
25681 return false;
25682 }
25683 const value = field.getValue({ item });
25684 if ([void 0, "", null].includes(value)) {
25685 return true;
25686 }
25687 return String(value).length >= field.isValid.minLength.constraint;
25688 }
25689
25690 // packages/dataviews/build-module/field-types/utils/is-valid-max-length.mjs
25691 function isValidMaxLength(item, field) {
25692 if (typeof field.isValid.maxLength?.constraint !== "number") {
25693 return false;
25694 }
25695 const value = field.getValue({ item });
25696 if ([void 0, "", null].includes(value)) {
25697 return true;
25698 }
25699 return String(value).length <= field.isValid.maxLength.constraint;
25700 }
25701
25702 // packages/dataviews/build-module/field-types/utils/is-valid-pattern.mjs
25703 function isValidPattern(item, field) {
25704 if (field.isValid.pattern?.constraint === void 0) {
25705 return true;
25706 }
25707 try {
25708 const regexp = new RegExp(field.isValid.pattern.constraint);
25709 const value = field.getValue({ item });
25710 if ([void 0, "", null].includes(value)) {
25711 return true;
25712 }
25713 return regexp.test(String(value));
25714 } catch {
25715 return false;
25716 }
25717 }
25718
25719 // packages/dataviews/build-module/field-types/utils/is-valid-elements.mjs
25720 function isValidElements(item, field) {
25721 const elements = field.elements ?? [];
25722 const validValues = elements.map((el) => el.value);
25723 if (validValues.length === 0) {
25724 return true;
25725 }
25726 const value = field.getValue({ item });
25727 return [].concat(value).every((v2) => validValues.includes(v2));
25728 }
25729
25730 // packages/dataviews/build-module/field-types/utils/get-value-formatted-default.mjs
25731 function getValueFormatted({
25732 item,
25733 field
25734 }) {
25735 return field.getValue({ item });
25736 }
25737 var get_value_formatted_default_default = getValueFormatted;
25738
25739 // packages/dataviews/build-module/field-types/email.mjs
25740 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])?)*$/;
25741 function isValidCustom(item, field) {
25742 const value = field.getValue({ item });
25743 if (![void 0, "", null].includes(value) && !emailRegex.test(value)) {
25744 return (0, import_i18n39.__)("Value must be a valid email address.");
25745 }
25746 return null;
25747 }
25748 var email_default = {
25749 type: "email",
25750 render,
25751 Edit: "email",
25752 sort: sort_text_default,
25753 enableSorting: true,
25754 enableGlobalSearch: false,
25755 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
25756 validOperators: [
25757 OPERATOR_IS,
25758 OPERATOR_IS_NOT,
25759 OPERATOR_CONTAINS,
25760 OPERATOR_NOT_CONTAINS,
25761 OPERATOR_STARTS_WITH,
25762 // Multiple selection
25763 OPERATOR_IS_ANY,
25764 OPERATOR_IS_NONE,
25765 OPERATOR_IS_ALL,
25766 OPERATOR_IS_NOT_ALL
25767 ],
25768 format: {},
25769 getValueFormatted: get_value_formatted_default_default,
25770 validate: {
25771 required: isValidRequired,
25772 pattern: isValidPattern,
25773 minLength: isValidMinLength,
25774 maxLength: isValidMaxLength,
25775 elements: isValidElements,
25776 custom: isValidCustom
25777 }
25778 };
25779
25780 // packages/dataviews/build-module/field-types/integer.mjs
25781 var import_i18n40 = __toESM(require_i18n(), 1);
25782
25783 // packages/dataviews/build-module/field-types/utils/sort-number.mjs
25784 var sort_number_default = (a2, b2, direction) => {
25785 return direction === "asc" ? a2 - b2 : b2 - a2;
25786 };
25787
25788 // packages/dataviews/build-module/field-types/utils/is-valid-min.mjs
25789 function isValidMin(item, field) {
25790 if (typeof field.isValid.min?.constraint !== "number") {
25791 return false;
25792 }
25793 const value = field.getValue({ item });
25794 if ([void 0, "", null].includes(value)) {
25795 return true;
25796 }
25797 return Number(value) >= field.isValid.min.constraint;
25798 }
25799
25800 // packages/dataviews/build-module/field-types/utils/is-valid-max.mjs
25801 function isValidMax(item, field) {
25802 if (typeof field.isValid.max?.constraint !== "number") {
25803 return false;
25804 }
25805 const value = field.getValue({ item });
25806 if ([void 0, "", null].includes(value)) {
25807 return true;
25808 }
25809 return Number(value) <= field.isValid.max.constraint;
25810 }
25811
25812 // packages/dataviews/build-module/field-types/integer.mjs
25813 var format2 = {
25814 separatorThousand: ","
25815 };
25816 function getValueFormatted2({
25817 item,
25818 field
25819 }) {
25820 let value = field.getValue({ item });
25821 if (value === null || value === void 0) {
25822 return "";
25823 }
25824 value = Number(value);
25825 if (!Number.isFinite(value)) {
25826 return String(value);
25827 }
25828 let formatInteger;
25829 if (field.type !== "integer") {
25830 formatInteger = format2;
25831 } else {
25832 formatInteger = field.format;
25833 }
25834 const { separatorThousand } = formatInteger;
25835 const integerValue = Math.trunc(value);
25836 if (!separatorThousand) {
25837 return String(integerValue);
25838 }
25839 return String(integerValue).replace(
25840 /\B(?=(\d{3})+(?!\d))/g,
25841 separatorThousand
25842 );
25843 }
25844 function isValidCustom2(item, field) {
25845 const value = field.getValue({ item });
25846 if (![void 0, "", null].includes(value) && !Number.isInteger(value)) {
25847 return (0, import_i18n40.__)("Value must be an integer.");
25848 }
25849 return null;
25850 }
25851 var integer_default = {
25852 type: "integer",
25853 render,
25854 Edit: "integer",
25855 sort: sort_number_default,
25856 enableSorting: true,
25857 enableGlobalSearch: false,
25858 defaultOperators: [
25859 OPERATOR_IS,
25860 OPERATOR_IS_NOT,
25861 OPERATOR_LESS_THAN,
25862 OPERATOR_GREATER_THAN,
25863 OPERATOR_LESS_THAN_OR_EQUAL,
25864 OPERATOR_GREATER_THAN_OR_EQUAL,
25865 OPERATOR_BETWEEN
25866 ],
25867 validOperators: [
25868 // Single-selection
25869 OPERATOR_IS,
25870 OPERATOR_IS_NOT,
25871 OPERATOR_LESS_THAN,
25872 OPERATOR_GREATER_THAN,
25873 OPERATOR_LESS_THAN_OR_EQUAL,
25874 OPERATOR_GREATER_THAN_OR_EQUAL,
25875 OPERATOR_BETWEEN,
25876 // Multiple-selection
25877 OPERATOR_IS_ANY,
25878 OPERATOR_IS_NONE,
25879 OPERATOR_IS_ALL,
25880 OPERATOR_IS_NOT_ALL
25881 ],
25882 format: format2,
25883 getValueFormatted: getValueFormatted2,
25884 validate: {
25885 required: isValidRequired,
25886 min: isValidMin,
25887 max: isValidMax,
25888 elements: isValidElements,
25889 custom: isValidCustom2
25890 }
25891 };
25892
25893 // packages/dataviews/build-module/field-types/number.mjs
25894 var import_i18n41 = __toESM(require_i18n(), 1);
25895 var format3 = {
25896 separatorThousand: ",",
25897 separatorDecimal: ".",
25898 decimals: 2
25899 };
25900 function getValueFormatted3({
25901 item,
25902 field
25903 }) {
25904 let value = field.getValue({ item });
25905 if (value === null || value === void 0) {
25906 return "";
25907 }
25908 value = Number(value);
25909 if (!Number.isFinite(value)) {
25910 return String(value);
25911 }
25912 let formatNumber;
25913 if (field.type !== "number") {
25914 formatNumber = format3;
25915 } else {
25916 formatNumber = field.format;
25917 }
25918 const { separatorThousand, separatorDecimal, decimals } = formatNumber;
25919 const fixedValue = value.toFixed(decimals);
25920 const [integerPart, decimalPart] = fixedValue.split(".");
25921 const formattedInteger = separatorThousand ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separatorThousand) : integerPart;
25922 return decimals === 0 ? formattedInteger : formattedInteger + separatorDecimal + decimalPart;
25923 }
25924 function isEmpty(value) {
25925 return value === "" || value === void 0 || value === null;
25926 }
25927 function isValidCustom3(item, field) {
25928 const value = field.getValue({ item });
25929 if (!isEmpty(value) && !Number.isFinite(value)) {
25930 return (0, import_i18n41.__)("Value must be a number.");
25931 }
25932 return null;
25933 }
25934 var number_default = {
25935 type: "number",
25936 render,
25937 Edit: "number",
25938 sort: sort_number_default,
25939 enableSorting: true,
25940 enableGlobalSearch: false,
25941 defaultOperators: [
25942 OPERATOR_IS,
25943 OPERATOR_IS_NOT,
25944 OPERATOR_LESS_THAN,
25945 OPERATOR_GREATER_THAN,
25946 OPERATOR_LESS_THAN_OR_EQUAL,
25947 OPERATOR_GREATER_THAN_OR_EQUAL,
25948 OPERATOR_BETWEEN
25949 ],
25950 validOperators: [
25951 // Single-selection
25952 OPERATOR_IS,
25953 OPERATOR_IS_NOT,
25954 OPERATOR_LESS_THAN,
25955 OPERATOR_GREATER_THAN,
25956 OPERATOR_LESS_THAN_OR_EQUAL,
25957 OPERATOR_GREATER_THAN_OR_EQUAL,
25958 OPERATOR_BETWEEN,
25959 // Multiple-selection
25960 OPERATOR_IS_ANY,
25961 OPERATOR_IS_NONE,
25962 OPERATOR_IS_ALL,
25963 OPERATOR_IS_NOT_ALL
25964 ],
25965 format: format3,
25966 getValueFormatted: getValueFormatted3,
25967 validate: {
25968 required: isValidRequired,
25969 min: isValidMin,
25970 max: isValidMax,
25971 elements: isValidElements,
25972 custom: isValidCustom3
25973 }
25974 };
25975
25976 // packages/dataviews/build-module/field-types/text.mjs
25977 var text_default = {
25978 type: "text",
25979 render,
25980 Edit: "text",
25981 sort: sort_text_default,
25982 enableSorting: true,
25983 enableGlobalSearch: false,
25984 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
25985 validOperators: [
25986 // Single selection
25987 OPERATOR_IS,
25988 OPERATOR_IS_NOT,
25989 OPERATOR_CONTAINS,
25990 OPERATOR_NOT_CONTAINS,
25991 OPERATOR_STARTS_WITH,
25992 // Multiple selection
25993 OPERATOR_IS_ANY,
25994 OPERATOR_IS_NONE,
25995 OPERATOR_IS_ALL,
25996 OPERATOR_IS_NOT_ALL
25997 ],
25998 format: {},
25999 getValueFormatted: get_value_formatted_default_default,
26000 validate: {
26001 required: isValidRequired,
26002 pattern: isValidPattern,
26003 minLength: isValidMinLength,
26004 maxLength: isValidMaxLength,
26005 elements: isValidElements
26006 }
26007 };
26008
26009 // packages/dataviews/build-module/field-types/datetime.mjs
26010 var import_date7 = __toESM(require_date(), 1);
26011
26012 // packages/dataviews/build-module/field-types/utils/is-valid-date-boundary.mjs
26013 var import_date6 = __toESM(require_date(), 1);
26014 function parseDateLike(value) {
26015 if (!value) {
26016 return null;
26017 }
26018 if (!isValid(new Date(value))) {
26019 return null;
26020 }
26021 const parsed = (0, import_date6.getDate)(value);
26022 return parsed && isValid(parsed) ? parsed : null;
26023 }
26024 function validateDateLikeBoundary(item, field, boundary) {
26025 const constraint = field.isValid[boundary]?.constraint;
26026 if (typeof constraint !== "string") {
26027 return false;
26028 }
26029 const value = field.getValue({ item });
26030 const boundaryValue = Array.isArray(value) ? value[boundary === "min" ? 0 : value.length - 1] : value;
26031 if (boundaryValue === void 0 || boundaryValue === null || boundaryValue === "") {
26032 return true;
26033 }
26034 const parsedConstraint = parseDateLike(constraint);
26035 const parsedValue = parseDateLike(String(boundaryValue));
26036 return !!parsedConstraint && !!parsedValue && (boundary === "min" ? parsedValue.getTime() >= parsedConstraint.getTime() : parsedValue.getTime() <= parsedConstraint.getTime());
26037 }
26038 function isValidMinDate(item, field) {
26039 return validateDateLikeBoundary(item, field, "min");
26040 }
26041 function isValidMaxDate(item, field) {
26042 return validateDateLikeBoundary(item, field, "max");
26043 }
26044
26045 // packages/dataviews/build-module/field-types/datetime.mjs
26046 var format4 = {
26047 datetime: (0, import_date7.getSettings)().formats.datetime,
26048 weekStartsOn: (0, import_date7.getSettings)().l10n.startOfWeek
26049 };
26050 function getValueFormatted4({
26051 item,
26052 field
26053 }) {
26054 const value = field.getValue({ item });
26055 if (["", void 0, null].includes(value)) {
26056 return "";
26057 }
26058 let formatDatetime;
26059 if (field.type !== "datetime") {
26060 formatDatetime = format4;
26061 } else {
26062 formatDatetime = field.format;
26063 }
26064 return (0, import_date7.dateI18n)(formatDatetime.datetime, (0, import_date7.getDate)(value));
26065 }
26066 var sort = (a2, b2, direction) => {
26067 const timeA = new Date(a2).getTime();
26068 const timeB = new Date(b2).getTime();
26069 return direction === "asc" ? timeA - timeB : timeB - timeA;
26070 };
26071 var datetime_default = {
26072 type: "datetime",
26073 render,
26074 Edit: "datetime",
26075 sort,
26076 enableSorting: true,
26077 enableGlobalSearch: false,
26078 defaultOperators: [
26079 OPERATOR_ON,
26080 OPERATOR_NOT_ON,
26081 OPERATOR_BEFORE,
26082 OPERATOR_AFTER,
26083 OPERATOR_BEFORE_INC,
26084 OPERATOR_AFTER_INC,
26085 OPERATOR_IN_THE_PAST,
26086 OPERATOR_OVER
26087 ],
26088 validOperators: [
26089 OPERATOR_ON,
26090 OPERATOR_NOT_ON,
26091 OPERATOR_BEFORE,
26092 OPERATOR_AFTER,
26093 OPERATOR_BEFORE_INC,
26094 OPERATOR_AFTER_INC,
26095 OPERATOR_IN_THE_PAST,
26096 OPERATOR_OVER
26097 ],
26098 format: format4,
26099 getValueFormatted: getValueFormatted4,
26100 validate: {
26101 required: isValidRequired,
26102 elements: isValidElements,
26103 min: isValidMinDate,
26104 max: isValidMaxDate
26105 }
26106 };
26107
26108 // packages/dataviews/build-module/field-types/date.mjs
26109 var import_date8 = __toESM(require_date(), 1);
26110 var format5 = {
26111 date: (0, import_date8.getSettings)().formats.date,
26112 weekStartsOn: (0, import_date8.getSettings)().l10n.startOfWeek
26113 };
26114 function getValueFormatted5({
26115 item,
26116 field
26117 }) {
26118 const value = field.getValue({ item });
26119 if (["", void 0, null].includes(value)) {
26120 return "";
26121 }
26122 let formatDate2;
26123 if (field.type !== "date") {
26124 formatDate2 = format5;
26125 } else {
26126 formatDate2 = field.format;
26127 }
26128 return (0, import_date8.dateI18n)(formatDate2.date, (0, import_date8.getDate)(value));
26129 }
26130 var sort2 = (a2, b2, direction) => {
26131 const timeA = new Date(a2).getTime();
26132 const timeB = new Date(b2).getTime();
26133 return direction === "asc" ? timeA - timeB : timeB - timeA;
26134 };
26135 var date_default = {
26136 type: "date",
26137 render,
26138 Edit: "date",
26139 sort: sort2,
26140 enableSorting: true,
26141 enableGlobalSearch: false,
26142 defaultOperators: [
26143 OPERATOR_ON,
26144 OPERATOR_NOT_ON,
26145 OPERATOR_BEFORE,
26146 OPERATOR_AFTER,
26147 OPERATOR_BEFORE_INC,
26148 OPERATOR_AFTER_INC,
26149 OPERATOR_IN_THE_PAST,
26150 OPERATOR_OVER,
26151 OPERATOR_BETWEEN
26152 ],
26153 validOperators: [
26154 OPERATOR_ON,
26155 OPERATOR_NOT_ON,
26156 OPERATOR_BEFORE,
26157 OPERATOR_AFTER,
26158 OPERATOR_BEFORE_INC,
26159 OPERATOR_AFTER_INC,
26160 OPERATOR_IN_THE_PAST,
26161 OPERATOR_OVER,
26162 OPERATOR_BETWEEN
26163 ],
26164 format: format5,
26165 getValueFormatted: getValueFormatted5,
26166 validate: {
26167 required: isValidRequired,
26168 elements: isValidElements,
26169 min: isValidMinDate,
26170 max: isValidMaxDate
26171 }
26172 };
26173
26174 // packages/dataviews/build-module/field-types/boolean.mjs
26175 var import_i18n42 = __toESM(require_i18n(), 1);
26176
26177 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-bool.mjs
26178 function isValidRequiredForBool(item, field) {
26179 const value = field.getValue({ item });
26180 return value === true;
26181 }
26182
26183 // packages/dataviews/build-module/field-types/boolean.mjs
26184 function getValueFormatted6({
26185 item,
26186 field
26187 }) {
26188 const value = field.getValue({ item });
26189 if (value === true) {
26190 return (0, import_i18n42.__)("True");
26191 }
26192 if (value === false) {
26193 return (0, import_i18n42.__)("False");
26194 }
26195 return "";
26196 }
26197 function isValidCustom4(item, field) {
26198 const value = field.getValue({ item });
26199 if (![void 0, "", null].includes(value) && ![true, false].includes(value)) {
26200 return (0, import_i18n42.__)("Value must be true, false, or undefined");
26201 }
26202 return null;
26203 }
26204 var sort3 = (a2, b2, direction) => {
26205 const boolA = Boolean(a2);
26206 const boolB = Boolean(b2);
26207 if (boolA === boolB) {
26208 return 0;
26209 }
26210 if (direction === "asc") {
26211 return boolA ? 1 : -1;
26212 }
26213 return boolA ? -1 : 1;
26214 };
26215 var boolean_default = {
26216 type: "boolean",
26217 render,
26218 Edit: "checkbox",
26219 sort: sort3,
26220 validate: {
26221 required: isValidRequiredForBool,
26222 elements: isValidElements,
26223 custom: isValidCustom4
26224 },
26225 enableSorting: true,
26226 enableGlobalSearch: false,
26227 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
26228 validOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
26229 format: {},
26230 getValueFormatted: getValueFormatted6
26231 };
26232
26233 // packages/dataviews/build-module/field-types/media.mjs
26234 var media_default = {
26235 type: "media",
26236 render: () => null,
26237 Edit: null,
26238 sort: () => 0,
26239 enableSorting: false,
26240 enableGlobalSearch: false,
26241 defaultOperators: [],
26242 validOperators: [],
26243 format: {},
26244 getValueFormatted: get_value_formatted_default_default,
26245 // cannot validate any constraint, so
26246 // the only available validation for the field author
26247 // would be providing a custom validator.
26248 validate: {}
26249 };
26250
26251 // packages/dataviews/build-module/field-types/array.mjs
26252 var import_i18n43 = __toESM(require_i18n(), 1);
26253
26254 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-array.mjs
26255 function isValidRequiredForArray(item, field) {
26256 const value = field.getValue({ item });
26257 return Array.isArray(value) && value.length > 0 && value.every(
26258 (element) => ![void 0, "", null].includes(element)
26259 );
26260 }
26261
26262 // packages/dataviews/build-module/field-types/array.mjs
26263 function getValueFormatted7({
26264 item,
26265 field
26266 }) {
26267 const value = field.getValue({ item });
26268 const arr = Array.isArray(value) ? value : [];
26269 return arr.join(", ");
26270 }
26271 function render2({ item, field }) {
26272 return getValueFormatted7({ item, field });
26273 }
26274 function isValidCustom5(item, field) {
26275 const value = field.getValue({ item });
26276 if (![void 0, "", null].includes(value) && !Array.isArray(value)) {
26277 return (0, import_i18n43.__)("Value must be an array.");
26278 }
26279 if (!value.every((v2) => typeof v2 === "string")) {
26280 return (0, import_i18n43.__)("Every value must be a string.");
26281 }
26282 return null;
26283 }
26284 var sort4 = (a2, b2, direction) => {
26285 const arrA = Array.isArray(a2) ? a2 : [];
26286 const arrB = Array.isArray(b2) ? b2 : [];
26287 if (arrA.length !== arrB.length) {
26288 return direction === "asc" ? arrA.length - arrB.length : arrB.length - arrA.length;
26289 }
26290 const joinedA = arrA.join(",");
26291 const joinedB = arrB.join(",");
26292 return direction === "asc" ? joinedA.localeCompare(joinedB) : joinedB.localeCompare(joinedA);
26293 };
26294 var array_default = {
26295 type: "array",
26296 render: render2,
26297 Edit: "array",
26298 sort: sort4,
26299 enableSorting: true,
26300 enableGlobalSearch: false,
26301 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26302 validOperators: [
26303 OPERATOR_IS_ANY,
26304 OPERATOR_IS_NONE,
26305 OPERATOR_IS_ALL,
26306 OPERATOR_IS_NOT_ALL
26307 ],
26308 format: {},
26309 getValueFormatted: getValueFormatted7,
26310 validate: {
26311 required: isValidRequiredForArray,
26312 elements: isValidElements,
26313 custom: isValidCustom5
26314 }
26315 };
26316
26317 // packages/dataviews/build-module/field-types/password.mjs
26318 function getValueFormatted8({
26319 item,
26320 field
26321 }) {
26322 return field.getValue({ item }) ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : "";
26323 }
26324 var password_default = {
26325 type: "password",
26326 render,
26327 Edit: "password",
26328 sort: () => 0,
26329 // Passwords should not be sortable for security reasons
26330 enableSorting: false,
26331 enableGlobalSearch: false,
26332 defaultOperators: [],
26333 validOperators: [],
26334 format: {},
26335 getValueFormatted: getValueFormatted8,
26336 validate: {
26337 required: isValidRequired,
26338 pattern: isValidPattern,
26339 minLength: isValidMinLength,
26340 maxLength: isValidMaxLength,
26341 elements: isValidElements
26342 }
26343 };
26344
26345 // packages/dataviews/build-module/field-types/telephone.mjs
26346 var telephone_default = {
26347 type: "telephone",
26348 render,
26349 Edit: "telephone",
26350 sort: sort_text_default,
26351 enableSorting: true,
26352 enableGlobalSearch: false,
26353 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26354 validOperators: [
26355 OPERATOR_IS,
26356 OPERATOR_IS_NOT,
26357 OPERATOR_CONTAINS,
26358 OPERATOR_NOT_CONTAINS,
26359 OPERATOR_STARTS_WITH,
26360 // Multiple selection
26361 OPERATOR_IS_ANY,
26362 OPERATOR_IS_NONE,
26363 OPERATOR_IS_ALL,
26364 OPERATOR_IS_NOT_ALL
26365 ],
26366 format: {},
26367 getValueFormatted: get_value_formatted_default_default,
26368 validate: {
26369 required: isValidRequired,
26370 pattern: isValidPattern,
26371 minLength: isValidMinLength,
26372 maxLength: isValidMaxLength,
26373 elements: isValidElements
26374 }
26375 };
26376
26377 // packages/dataviews/build-module/field-types/color.mjs
26378 var import_i18n44 = __toESM(require_i18n(), 1);
26379 var import_jsx_runtime119 = __toESM(require_jsx_runtime(), 1);
26380 function render3({ item, field }) {
26381 if (field.hasElements) {
26382 return /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(RenderFromElements, { item, field });
26383 }
26384 const value = get_value_formatted_default_default({ item, field });
26385 if (!value || !w(value).isValid()) {
26386 return value;
26387 }
26388 return /* @__PURE__ */ (0, import_jsx_runtime119.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
26389 /* @__PURE__ */ (0, import_jsx_runtime119.jsx)(
26390 "div",
26391 {
26392 style: {
26393 width: "16px",
26394 height: "16px",
26395 borderRadius: "50%",
26396 backgroundColor: value,
26397 border: "1px solid #ddd",
26398 flexShrink: 0
26399 }
26400 }
26401 ),
26402 /* @__PURE__ */ (0, import_jsx_runtime119.jsx)("span", { children: value })
26403 ] });
26404 }
26405 function isValidCustom6(item, field) {
26406 const value = field.getValue({ item });
26407 if (![void 0, "", null].includes(value) && !w(value).isValid()) {
26408 return (0, import_i18n44.__)("Value must be a valid color.");
26409 }
26410 return null;
26411 }
26412 var sort5 = (a2, b2, direction) => {
26413 const colorA = w(a2);
26414 const colorB = w(b2);
26415 if (!colorA.isValid() && !colorB.isValid()) {
26416 return 0;
26417 }
26418 if (!colorA.isValid()) {
26419 return direction === "asc" ? 1 : -1;
26420 }
26421 if (!colorB.isValid()) {
26422 return direction === "asc" ? -1 : 1;
26423 }
26424 const hslA = colorA.toHsl();
26425 const hslB = colorB.toHsl();
26426 if (hslA.h !== hslB.h) {
26427 return direction === "asc" ? hslA.h - hslB.h : hslB.h - hslA.h;
26428 }
26429 if (hslA.s !== hslB.s) {
26430 return direction === "asc" ? hslA.s - hslB.s : hslB.s - hslA.s;
26431 }
26432 return direction === "asc" ? hslA.l - hslB.l : hslB.l - hslA.l;
26433 };
26434 var color_default = {
26435 type: "color",
26436 render: render3,
26437 Edit: "color",
26438 sort: sort5,
26439 enableSorting: true,
26440 enableGlobalSearch: false,
26441 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26442 validOperators: [
26443 OPERATOR_IS,
26444 OPERATOR_IS_NOT,
26445 OPERATOR_IS_ANY,
26446 OPERATOR_IS_NONE
26447 ],
26448 format: {},
26449 getValueFormatted: get_value_formatted_default_default,
26450 validate: {
26451 required: isValidRequired,
26452 elements: isValidElements,
26453 custom: isValidCustom6
26454 }
26455 };
26456
26457 // packages/dataviews/build-module/field-types/url.mjs
26458 var url_default = {
26459 type: "url",
26460 render,
26461 Edit: "url",
26462 sort: sort_text_default,
26463 enableSorting: true,
26464 enableGlobalSearch: false,
26465 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
26466 validOperators: [
26467 OPERATOR_IS,
26468 OPERATOR_IS_NOT,
26469 OPERATOR_CONTAINS,
26470 OPERATOR_NOT_CONTAINS,
26471 OPERATOR_STARTS_WITH,
26472 // Multiple selection
26473 OPERATOR_IS_ANY,
26474 OPERATOR_IS_NONE,
26475 OPERATOR_IS_ALL,
26476 OPERATOR_IS_NOT_ALL
26477 ],
26478 format: {},
26479 getValueFormatted: get_value_formatted_default_default,
26480 validate: {
26481 required: isValidRequired,
26482 pattern: isValidPattern,
26483 minLength: isValidMinLength,
26484 maxLength: isValidMaxLength,
26485 elements: isValidElements
26486 }
26487 };
26488
26489 // packages/dataviews/build-module/field-types/no-type.mjs
26490 var sort6 = (a2, b2, direction) => {
26491 if (typeof a2 === "number" && typeof b2 === "number") {
26492 return sort_number_default(a2, b2, direction);
26493 }
26494 return sort_text_default(a2, b2, direction);
26495 };
26496 var no_type_default = {
26497 // type: no type for this one
26498 render,
26499 Edit: null,
26500 sort: sort6,
26501 enableSorting: true,
26502 enableGlobalSearch: false,
26503 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
26504 validOperators: getAllOperatorNames(),
26505 format: {},
26506 getValueFormatted: get_value_formatted_default_default,
26507 validate: {
26508 required: isValidRequired,
26509 elements: isValidElements
26510 }
26511 };
26512
26513 // packages/dataviews/build-module/field-types/utils/get-is-valid.mjs
26514 function supportsNumericRangeConstraint(type) {
26515 return type === "integer" || type === "number";
26516 }
26517 function supportsDateRangeConstraint(type) {
26518 return type === "date" || type === "datetime";
26519 }
26520 function normalizeRangeRule(value, fieldType, key) {
26521 const validator = fieldType.validate[key];
26522 if (validator && (typeof value === "number" && supportsNumericRangeConstraint(fieldType.type) || typeof value === "string" && supportsDateRangeConstraint(fieldType.type))) {
26523 return { constraint: value, validate: validator };
26524 }
26525 return void 0;
26526 }
26527 function getIsValid(field, fieldType) {
26528 const rules = field.isValid;
26529 let required;
26530 if (rules?.required === true && fieldType.validate.required !== void 0) {
26531 required = {
26532 constraint: true,
26533 validate: fieldType.validate.required
26534 };
26535 }
26536 let elements;
26537 if ((rules?.elements === true || // elements is enabled unless the field opts-out
26538 rules?.elements === void 0 && (!!field.elements || !!field.getElements)) && fieldType.validate.elements !== void 0) {
26539 elements = {
26540 constraint: true,
26541 validate: fieldType.validate.elements
26542 };
26543 }
26544 const min2 = normalizeRangeRule(rules?.min, fieldType, "min");
26545 const max2 = normalizeRangeRule(rules?.max, fieldType, "max");
26546 const minLengthValue = rules?.minLength;
26547 let minLength;
26548 if (typeof minLengthValue === "number" && fieldType.validate.minLength !== void 0) {
26549 minLength = {
26550 constraint: minLengthValue,
26551 validate: fieldType.validate.minLength
26552 };
26553 }
26554 const maxLengthValue = rules?.maxLength;
26555 let maxLength;
26556 if (typeof maxLengthValue === "number" && fieldType.validate.maxLength !== void 0) {
26557 maxLength = {
26558 constraint: maxLengthValue,
26559 validate: fieldType.validate.maxLength
26560 };
26561 }
26562 const patternValue = rules?.pattern;
26563 let pattern;
26564 if (patternValue !== void 0 && fieldType.validate.pattern !== void 0) {
26565 pattern = {
26566 constraint: patternValue,
26567 validate: fieldType.validate.pattern
26568 };
26569 }
26570 const custom = rules?.custom ?? fieldType.validate.custom;
26571 return {
26572 required,
26573 elements,
26574 min: min2,
26575 max: max2,
26576 minLength,
26577 maxLength,
26578 pattern,
26579 custom
26580 };
26581 }
26582
26583 // packages/dataviews/build-module/field-types/utils/get-filter.mjs
26584 function getFilter(fieldType) {
26585 return fieldType.validOperators.reduce((accumulator, operator) => {
26586 const operatorObj = getOperatorByName(operator);
26587 if (operatorObj?.filter) {
26588 accumulator[operator] = operatorObj.filter;
26589 }
26590 return accumulator;
26591 }, {});
26592 }
26593
26594 // packages/dataviews/build-module/field-types/utils/get-format.mjs
26595 function getFormat(field, fieldType) {
26596 return {
26597 ...fieldType.format,
26598 ...field.format
26599 };
26600 }
26601 var get_format_default = getFormat;
26602
26603 // packages/dataviews/build-module/field-types/index.mjs
26604 function getFieldTypeByName(type) {
26605 const found = [
26606 email_default,
26607 integer_default,
26608 number_default,
26609 text_default,
26610 datetime_default,
26611 date_default,
26612 boolean_default,
26613 media_default,
26614 array_default,
26615 password_default,
26616 telephone_default,
26617 color_default,
26618 url_default
26619 ].find((fieldType) => fieldType?.type === type);
26620 if (!!found) {
26621 return found;
26622 }
26623 return no_type_default;
26624 }
26625 function normalizeFields(fields) {
26626 return fields.map((field) => {
26627 const fieldType = getFieldTypeByName(field.type);
26628 const getValue = field.getValue || get_value_from_id_default(field.id);
26629 const sort7 = function(a2, b2, direction) {
26630 const aValue = getValue({ item: a2 });
26631 const bValue = getValue({ item: b2 });
26632 return field.sort ? field.sort(aValue, bValue, direction) : fieldType.sort(aValue, bValue, direction);
26633 };
26634 return {
26635 id: field.id,
26636 label: field.label || field.id,
26637 header: field.header || field.label || field.id,
26638 description: field.description,
26639 placeholder: field.placeholder,
26640 getValue,
26641 setValue: field.setValue || set_value_from_id_default(field.id),
26642 elements: field.elements,
26643 getElements: field.getElements,
26644 hasElements: hasElements(field),
26645 isVisible: field.isVisible,
26646 isDisabled: typeof field.isDisabled === "function" ? field.isDisabled : () => !!field.isDisabled,
26647 enableHiding: field.enableHiding ?? true,
26648 readOnly: field.readOnly ?? false,
26649 // The type provides defaults for the following props
26650 type: fieldType.type,
26651 render: field.render ?? fieldType.render,
26652 Edit: getControl(field, fieldType.Edit),
26653 sort: sort7,
26654 enableSorting: field.enableSorting ?? fieldType.enableSorting,
26655 enableGlobalSearch: field.enableGlobalSearch ?? fieldType.enableGlobalSearch,
26656 isValid: getIsValid(field, fieldType),
26657 filterBy: get_filter_by_default(
26658 field,
26659 fieldType.defaultOperators,
26660 fieldType.validOperators
26661 ),
26662 filter: getFilter(fieldType),
26663 format: get_format_default(field, fieldType),
26664 getValueFormatted: field.getValueFormatted ?? fieldType.getValueFormatted
26665 };
26666 });
26667 }
26668
26669 // packages/dataviews/build-module/hooks/use-data.mjs
26670 var import_element84 = __toESM(require_element(), 1);
26671 function useData({
26672 view,
26673 data: shownData,
26674 getItemId,
26675 isLoading,
26676 paginationInfo,
26677 selection
26678 }) {
26679 const isInfiniteScrollEnabled = view.infiniteScrollEnabled;
26680 const [hasInitiallyLoaded, setHasInitiallyLoaded] = (0, import_element84.useState)(
26681 !isLoading
26682 );
26683 (0, import_element84.useEffect)(() => {
26684 if (!isLoading) {
26685 setHasInitiallyLoaded(true);
26686 }
26687 }, [isLoading]);
26688 const previousDataRef = (0, import_element84.useRef)(shownData);
26689 const previousPaginationInfoRef = (0, import_element84.useRef)(paginationInfo);
26690 (0, import_element84.useEffect)(() => {
26691 if (!isLoading) {
26692 previousDataRef.current = shownData;
26693 previousPaginationInfoRef.current = paginationInfo;
26694 }
26695 }, [shownData, isLoading, paginationInfo]);
26696 const [visibleEntries, setVisibleEntries] = (0, import_element84.useState)([]);
26697 const positionMapRef = (0, import_element84.useRef)(/* @__PURE__ */ new Map());
26698 const allLoadedRecordsRef = (0, import_element84.useRef)([]);
26699 const prevViewParamsRef = (0, import_element84.useRef)({
26700 search: void 0,
26701 filters: void 0,
26702 perPage: void 0
26703 });
26704 const scrollDirectionRef = (0, import_element84.useRef)(void 0);
26705 const prevStartPositionRef = (0, import_element84.useRef)(void 0);
26706 const hasInitializedRef = (0, import_element84.useRef)(false);
26707 const allLoadedRecords = (0, import_element84.useMemo)(() => {
26708 if (view.startPosition !== void 0 && prevStartPositionRef.current !== void 0) {
26709 if (view.startPosition < prevStartPositionRef.current) {
26710 scrollDirectionRef.current = "up";
26711 } else if (view.startPosition > prevStartPositionRef.current) {
26712 scrollDirectionRef.current = "down";
26713 }
26714 }
26715 prevStartPositionRef.current = view.startPosition;
26716 const currentFiltersKey = JSON.stringify(view.filters ?? []);
26717 const prevFiltersKey = prevViewParamsRef.current.filters;
26718 const shouldReset = !hasInitializedRef.current || !view.infiniteScrollEnabled || view.search !== prevViewParamsRef.current.search || currentFiltersKey !== prevFiltersKey || view.perPage !== prevViewParamsRef.current.perPage;
26719 hasInitializedRef.current = true;
26720 prevViewParamsRef.current = {
26721 search: view.search,
26722 filters: currentFiltersKey,
26723 perPage: view.perPage
26724 };
26725 if (shouldReset) {
26726 positionMapRef.current.clear();
26727 scrollDirectionRef.current = void 0;
26728 const startPosition = view.search ? 1 : view.startPosition ?? 1;
26729 const records = shownData.map((record, index2) => {
26730 const position = startPosition + index2;
26731 positionMapRef.current.set(getItemId(record), position);
26732 return {
26733 ...record,
26734 position
26735 };
26736 });
26737 allLoadedRecordsRef.current = records;
26738 return records;
26739 }
26740 const prev = allLoadedRecordsRef.current;
26741 const shownDataIds = new Set(shownData.map(getItemId));
26742 const scrollDirection = scrollDirectionRef.current;
26743 const basePosition = view.search ? 1 : view.startPosition ?? 1;
26744 const newRecords = shownData.map((record, index2) => {
26745 const itemId = getItemId(record);
26746 const position = view.infiniteScrollEnabled ? basePosition + index2 : void 0;
26747 if (position !== void 0) {
26748 positionMapRef.current.set(itemId, position);
26749 }
26750 return {
26751 ...record,
26752 position
26753 };
26754 });
26755 if (newRecords.length === 0) {
26756 return prev;
26757 }
26758 const prevWithoutDuplicates = prev.filter(
26759 (record) => !shownDataIds.has(getItemId(record))
26760 );
26761 const allRecords = scrollDirection === "up" ? [...newRecords, ...prevWithoutDuplicates] : [...prevWithoutDuplicates, ...newRecords];
26762 allRecords.sort((a2, b2) => {
26763 const posA = a2.position;
26764 const posB = b2.position;
26765 return posA - posB;
26766 });
26767 let result = allRecords;
26768 if (visibleEntries.length > 0) {
26769 const visibleMin = Math.min(...visibleEntries);
26770 const visibleMax = Math.max(...visibleEntries);
26771 const buffer = 20;
26772 const recordPositions = allRecords.map(
26773 (r3) => r3.position
26774 );
26775 const minRecordPos = Math.min(...recordPositions);
26776 const maxRecordPos = Math.max(...recordPositions);
26777 const hasOverlap = !(maxRecordPos < visibleMin - buffer || minRecordPos > visibleMax + buffer);
26778 if (hasOverlap) {
26779 result = allRecords.filter((record) => {
26780 const itemId = getItemId(record);
26781 const isSelected2 = selection?.includes(itemId);
26782 if (isSelected2) {
26783 return true;
26784 }
26785 const itemPosition = record.position;
26786 if (scrollDirection === "up") {
26787 return itemPosition <= visibleMax + buffer;
26788 } else if (scrollDirection === "down") {
26789 return itemPosition >= visibleMin - buffer;
26790 }
26791 return itemPosition >= visibleMin - buffer && itemPosition <= visibleMax + buffer;
26792 });
26793 }
26794 }
26795 allLoadedRecordsRef.current = result;
26796 return result;
26797 }, [
26798 shownData,
26799 view.search,
26800 view.filters,
26801 view.perPage,
26802 view.startPosition,
26803 view.infiniteScrollEnabled,
26804 visibleEntries,
26805 selection,
26806 getItemId
26807 ]);
26808 if (!isInfiniteScrollEnabled) {
26809 const dataToReturn = isLoading && previousDataRef.current?.length ? previousDataRef.current : shownData;
26810 return {
26811 data: dataToReturn.map((item) => ({
26812 ...item,
26813 position: void 0
26814 })),
26815 paginationInfo: isLoading && previousDataRef.current?.length ? previousPaginationInfoRef.current : paginationInfo,
26816 hasInitiallyLoaded,
26817 setVisibleEntries: void 0
26818 };
26819 }
26820 return {
26821 data: allLoadedRecords,
26822 paginationInfo,
26823 hasInitiallyLoaded,
26824 setVisibleEntries
26825 };
26826 }
26827
26828 // packages/dataviews/build-module/hooks/use-infinite-scroll.mjs
26829 var import_element85 = __toESM(require_element(), 1);
26830 var import_compose13 = __toESM(require_compose(), 1);
26831 function captureAnchorElement(container, anchorElementRef, direction) {
26832 const containerRect = container.getBoundingClientRect();
26833 const centerY = containerRect.top + containerRect.height / 2;
26834 const items = Array.from(container.querySelectorAll("[aria-posinset]"));
26835 if (items.length === 0) {
26836 return false;
26837 }
26838 const bestAnchor = items.reduce((best, item) => {
26839 const itemRect = item.getBoundingClientRect();
26840 const itemCenterY = itemRect.top + itemRect.height / 2;
26841 const distance = Math.abs(itemCenterY - centerY);
26842 const bestRect = best.getBoundingClientRect();
26843 const bestCenterY = bestRect.top + bestRect.height / 2;
26844 const bestDistance = Math.abs(bestCenterY - centerY);
26845 return distance < bestDistance ? item : best;
26846 });
26847 const posinset = Number(bestAnchor.getAttribute("aria-posinset"));
26848 const anchorRect = bestAnchor.getBoundingClientRect();
26849 anchorElementRef.current = {
26850 posinset,
26851 viewportOffset: anchorRect.top - containerRect.top,
26852 scrollTop: container.scrollTop,
26853 direction
26854 };
26855 return true;
26856 }
26857 function useInfiniteScroll({
26858 view,
26859 onChangeView,
26860 isLoading,
26861 paginationInfo,
26862 containerRef,
26863 setVisibleEntries
26864 }) {
26865 const anchorElementRef = (0, import_element85.useRef)(null);
26866 const viewRef = (0, import_element85.useRef)(view);
26867 const isLoadingRef = (0, import_element85.useRef)(isLoading);
26868 const onChangeViewRef = (0, import_element85.useRef)(onChangeView);
26869 const totalItemsRef = (0, import_element85.useRef)(paginationInfo.totalItems);
26870 (0, import_element85.useLayoutEffect)(() => {
26871 viewRef.current = view;
26872 isLoadingRef.current = isLoading;
26873 onChangeViewRef.current = onChangeView;
26874 totalItemsRef.current = paginationInfo.totalItems;
26875 }, [view, isLoading, onChangeView, paginationInfo.totalItems]);
26876 const intersectionObserverCallback = (0, import_element85.useCallback)(
26877 (entries) => {
26878 if (!setVisibleEntries) {
26879 return;
26880 }
26881 setVisibleEntries((prev) => {
26882 const newVisibleEntries = new Set(prev);
26883 let hasChanged = false;
26884 entries.forEach((entry) => {
26885 const posInSet = Number(
26886 entry.target?.attributes?.getNamedItem(
26887 "aria-posinset"
26888 )?.value
26889 );
26890 if (isNaN(posInSet)) {
26891 return;
26892 }
26893 if (entry.isIntersecting) {
26894 if (!newVisibleEntries.has(posInSet)) {
26895 newVisibleEntries.add(posInSet);
26896 hasChanged = true;
26897 }
26898 } else if (newVisibleEntries.has(posInSet)) {
26899 newVisibleEntries.delete(posInSet);
26900 hasChanged = true;
26901 }
26902 });
26903 return hasChanged ? Array.from(newVisibleEntries).sort() : prev;
26904 });
26905 },
26906 [setVisibleEntries]
26907 );
26908 (0, import_element85.useLayoutEffect)(() => {
26909 const container = containerRef.current;
26910 const anchor = anchorElementRef.current;
26911 if (!container || !view.infiniteScrollEnabled || !anchor || isLoading) {
26912 return;
26913 }
26914 const anchorElement = container.querySelector(
26915 `[aria-posinset="${anchor.posinset}"]`
26916 );
26917 if (anchorElement) {
26918 const containerRect = container.getBoundingClientRect();
26919 const anchorRect = anchorElement.getBoundingClientRect();
26920 const currentOffset = anchorRect.top - containerRect.top;
26921 const scrollAdjustment = currentOffset - anchor.viewportOffset + (container.scrollTop - anchor.scrollTop);
26922 if (Math.abs(scrollAdjustment) > 1) {
26923 container.scrollTop += scrollAdjustment;
26924 }
26925 }
26926 anchorElementRef.current = null;
26927 }, [containerRef, isLoading, view.infiniteScrollEnabled]);
26928 const intersectionObserverRef = (0, import_element85.useRef)(
26929 null
26930 );
26931 (0, import_element85.useEffect)(() => {
26932 if (!view.infiniteScrollEnabled || !intersectionObserverCallback) {
26933 if (intersectionObserverRef.current) {
26934 intersectionObserverRef.current.disconnect();
26935 intersectionObserverRef.current = null;
26936 }
26937 return;
26938 }
26939 intersectionObserverRef.current = new IntersectionObserver(
26940 intersectionObserverCallback,
26941 { root: null, rootMargin: "0px", threshold: 0.1 }
26942 );
26943 return () => {
26944 if (intersectionObserverRef.current) {
26945 intersectionObserverRef.current.disconnect();
26946 intersectionObserverRef.current = null;
26947 }
26948 };
26949 }, [view.infiniteScrollEnabled, intersectionObserverCallback]);
26950 (0, import_element85.useEffect)(() => {
26951 if (!view.infiniteScrollEnabled || !containerRef.current) {
26952 return;
26953 }
26954 let lastScrollTop = 0;
26955 const BOTTOM_THRESHOLD = 600;
26956 const TOP_THRESHOLD = 800;
26957 const handleScroll = (0, import_compose13.throttle)((event) => {
26958 const currentView = viewRef.current;
26959 const totalItems = totalItemsRef.current;
26960 const target = event.target;
26961 const scrollTop = target.scrollTop;
26962 const scrollHeight = target.scrollHeight;
26963 const clientHeight = target.clientHeight;
26964 const scrollDirection = scrollTop > lastScrollTop ? "down" : "up";
26965 lastScrollTop = scrollTop;
26966 if (isLoadingRef.current) {
26967 return;
26968 }
26969 const currentStartPosition = currentView.startPosition || 1;
26970 const batchSize = currentView.perPage || 10;
26971 const currentEndPosition = Math.min(
26972 currentStartPosition + batchSize,
26973 totalItems
26974 );
26975 if (scrollDirection === "down" && scrollTop + clientHeight >= scrollHeight - BOTTOM_THRESHOLD) {
26976 if (currentEndPosition < totalItems) {
26977 const newStartPosition = currentEndPosition;
26978 captureAnchorElement(target, anchorElementRef, "down");
26979 onChangeViewRef.current({
26980 ...currentView,
26981 startPosition: newStartPosition
26982 });
26983 }
26984 }
26985 if (scrollDirection === "up" && scrollTop <= TOP_THRESHOLD) {
26986 if (currentStartPosition > 1) {
26987 const calculatedStartPosition = currentStartPosition - batchSize;
26988 const newStartPosition = calculatedStartPosition < 6 ? 1 : calculatedStartPosition;
26989 captureAnchorElement(target, anchorElementRef, "up");
26990 onChangeViewRef.current({
26991 ...currentView,
26992 startPosition: newStartPosition
26993 });
26994 }
26995 }
26996 }, 50);
26997 const container = containerRef.current;
26998 container.addEventListener("scroll", handleScroll);
26999 return () => {
27000 container.removeEventListener("scroll", handleScroll);
27001 handleScroll.cancel();
27002 };
27003 }, [containerRef, view.infiniteScrollEnabled]);
27004 return {
27005 intersectionObserver: intersectionObserverRef.current
27006 };
27007 }
27008
27009 // packages/dataviews/build-module/dataviews/index.mjs
27010 var import_jsx_runtime120 = __toESM(require_jsx_runtime(), 1);
27011 var defaultGetItemId = (item) => item.id;
27012 var defaultIsItemClickable = () => true;
27013 var EMPTY_ARRAY7 = [];
27014 var DEFAULT_LAYOUTS = { table: {}, grid: {}, list: {} };
27015 var dataViewsLayouts = VIEW_LAYOUTS.filter(
27016 (viewLayout) => !viewLayout.isPicker
27017 );
27018 function DefaultUI({
27019 header,
27020 search = true,
27021 searchLabel = void 0
27022 }) {
27023 const { view } = (0, import_element86.useContext)(dataviews_context_default);
27024 const isInfiniteScroll = view.infiniteScrollEnabled;
27025 return /* @__PURE__ */ (0, import_jsx_runtime120.jsxs)(import_jsx_runtime120.Fragment, { children: [
27026 /* @__PURE__ */ (0, import_jsx_runtime120.jsxs)(
27027 Stack,
27028 {
27029 direction: "row",
27030 align: "top",
27031 justify: "space-between",
27032 className: clsx_default("dataviews__view-actions", {
27033 "dataviews__view-actions--infinite-scroll": isInfiniteScroll
27034 }),
27035 gap: "xs",
27036 children: [
27037 /* @__PURE__ */ (0, import_jsx_runtime120.jsxs)(
27038 Stack,
27039 {
27040 direction: "row",
27041 justify: "start",
27042 gap: "sm",
27043 className: "dataviews__search",
27044 children: [
27045 search && /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(dataviews_search_default, { label: searchLabel }),
27046 /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(toggle_default, {})
27047 ]
27048 }
27049 ),
27050 /* @__PURE__ */ (0, import_jsx_runtime120.jsxs)(Stack, { direction: "row", gap: "xs", style: { flexShrink: 0 }, children: [
27051 /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(dataviews_view_config_default, {}),
27052 header
27053 ] })
27054 ]
27055 }
27056 ),
27057 /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(filters_toggled_default, { className: "dataviews-filters__container" }),
27058 /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(DataViewsLayout, {}),
27059 /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(DataViewsFooter, {})
27060 ] });
27061 }
27062 function DataViews({
27063 view,
27064 onChangeView,
27065 fields,
27066 search = true,
27067 searchLabel = void 0,
27068 actions = EMPTY_ARRAY7,
27069 data,
27070 getItemId = defaultGetItemId,
27071 getItemLevel,
27072 isLoading = false,
27073 paginationInfo,
27074 defaultLayouts: defaultLayoutsProperty = DEFAULT_LAYOUTS,
27075 selection: selectionProperty,
27076 onChangeSelection,
27077 onClickItem,
27078 renderItemLink,
27079 isItemClickable = defaultIsItemClickable,
27080 header,
27081 children,
27082 config = { perPageSizes: [10, 20, 50, 100] },
27083 empty,
27084 onReset
27085 }) {
27086 const [selectionState, setSelectionState] = (0, import_element86.useState)([]);
27087 const isUncontrolled = selectionProperty === void 0 || onChangeSelection === void 0;
27088 const selection = isUncontrolled ? selectionState : selectionProperty;
27089 const {
27090 data: displayData,
27091 paginationInfo: displayPaginationInfo,
27092 hasInitiallyLoaded,
27093 setVisibleEntries
27094 } = useData({
27095 view,
27096 data,
27097 getItemId,
27098 isLoading,
27099 selection,
27100 paginationInfo
27101 });
27102 const containerRef = (0, import_element86.useRef)(null);
27103 const [containerWidth, setContainerWidth] = (0, import_element86.useState)(0);
27104 const resizeObserverRef = (0, import_compose14.useResizeObserver)(
27105 (resizeObserverEntries) => {
27106 setContainerWidth(
27107 resizeObserverEntries[0].borderBoxSize[0].inlineSize
27108 );
27109 },
27110 { box: "border-box" }
27111 );
27112 const [openedFilter, setOpenedFilter] = (0, import_element86.useState)(null);
27113 function setSelectionWithChange(value) {
27114 const newValue = typeof value === "function" ? value(selection) : value;
27115 if (isUncontrolled) {
27116 setSelectionState(newValue);
27117 }
27118 if (onChangeSelection) {
27119 onChangeSelection(newValue);
27120 }
27121 }
27122 const _fields = (0, import_element86.useMemo)(() => normalizeFields(fields), [fields]);
27123 const _selection = (0, import_element86.useMemo)(() => {
27124 if (view.infiniteScrollEnabled) {
27125 return selection;
27126 }
27127 return selection.filter(
27128 (id) => data.some((item) => getItemId(item) === id)
27129 );
27130 }, [selection, data, getItemId, view.infiniteScrollEnabled]);
27131 const filters = use_filters_default(_fields, view);
27132 const hasPrimaryOrLockedFilters = (0, import_element86.useMemo)(
27133 () => (filters || []).some(
27134 (filter) => filter.isPrimary || filter.isLocked
27135 ),
27136 [filters]
27137 );
27138 const [isShowingFilter, setIsShowingFilter] = (0, import_element86.useState)(
27139 hasPrimaryOrLockedFilters
27140 );
27141 const { intersectionObserver } = useInfiniteScroll({
27142 view,
27143 onChangeView,
27144 isLoading,
27145 paginationInfo,
27146 containerRef,
27147 setVisibleEntries
27148 });
27149 (0, import_element86.useEffect)(() => {
27150 if (hasPrimaryOrLockedFilters && !isShowingFilter) {
27151 setIsShowingFilter(true);
27152 }
27153 }, [hasPrimaryOrLockedFilters, isShowingFilter]);
27154 const defaultLayouts = (0, import_element86.useMemo)(
27155 () => Object.fromEntries(
27156 Object.entries(defaultLayoutsProperty).filter(([layoutType]) => {
27157 return dataViewsLayouts.some(
27158 (viewLayout) => viewLayout.type === layoutType
27159 );
27160 }).map(([key, value]) => [
27161 key,
27162 value === true ? {} : value
27163 ])
27164 ),
27165 [defaultLayoutsProperty]
27166 );
27167 if (!defaultLayouts[view.type]) {
27168 return null;
27169 }
27170 return /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(
27171 dataviews_context_default.Provider,
27172 {
27173 value: {
27174 view,
27175 onChangeView,
27176 fields: _fields,
27177 actions,
27178 data: displayData,
27179 isLoading,
27180 paginationInfo: displayPaginationInfo,
27181 selection: _selection,
27182 onChangeSelection: setSelectionWithChange,
27183 openedFilter,
27184 setOpenedFilter,
27185 getItemId,
27186 getItemLevel,
27187 isItemClickable,
27188 onClickItem,
27189 renderItemLink,
27190 containerWidth,
27191 containerRef,
27192 resizeObserverRef,
27193 defaultLayouts,
27194 filters,
27195 isShowingFilter,
27196 setIsShowingFilter,
27197 config,
27198 empty,
27199 hasInitiallyLoaded,
27200 onReset,
27201 intersectionObserver
27202 },
27203 children: /* @__PURE__ */ (0, import_jsx_runtime120.jsx)("div", { className: "dataviews-wrapper", children: children ?? /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(
27204 DefaultUI,
27205 {
27206 header,
27207 search,
27208 searchLabel
27209 }
27210 ) })
27211 }
27212 );
27213 }
27214 var DataViewsSubComponents = DataViews;
27215 DataViewsSubComponents.BulkActionToolbar = BulkActionsFooter;
27216 DataViewsSubComponents.Filters = filters_default;
27217 DataViewsSubComponents.FiltersToggled = filters_toggled_default;
27218 DataViewsSubComponents.FiltersToggle = toggle_default;
27219 DataViewsSubComponents.Layout = DataViewsLayout;
27220 DataViewsSubComponents.LayoutSwitcher = ViewTypeMenu;
27221 DataViewsSubComponents.Pagination = DataViewsPagination;
27222 DataViewsSubComponents.Search = dataviews_search_default;
27223 DataViewsSubComponents.ViewConfig = DataviewsViewConfigDropdown;
27224 DataViewsSubComponents.Footer = DataViewsFooter;
27225 var dataviews_default = DataViewsSubComponents;
27226
27227 // packages/dataviews/build-module/utils/filter-sort-and-paginate.mjs
27228 var import_remove_accents2 = __toESM(require_remove_accents(), 1);
27229 var import_deprecated = __toESM(require_deprecated(), 1);
27230 function normalizeSearchInput2(input = "") {
27231 return (0, import_remove_accents2.default)(input.trim().toLowerCase());
27232 }
27233 var EMPTY_ARRAY8 = [];
27234 function filterSortAndPaginate(data, view, fields) {
27235 if (!data) {
27236 return {
27237 data: EMPTY_ARRAY8,
27238 paginationInfo: { totalItems: 0, totalPages: 0 }
27239 };
27240 }
27241 const _fields = normalizeFields(fields);
27242 let filteredData = [...data];
27243 if (view.search) {
27244 const normalizedSearch = normalizeSearchInput2(view.search);
27245 filteredData = filteredData.filter((item) => {
27246 return _fields.filter((field) => field.enableGlobalSearch).some((field) => {
27247 const fieldValue = field.getValue({ item });
27248 const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue];
27249 return values.some(
27250 (value) => normalizeSearchInput2(String(value)).includes(
27251 normalizedSearch
27252 )
27253 );
27254 });
27255 });
27256 }
27257 if (view.filters && view.filters?.length > 0) {
27258 view.filters.forEach((filter) => {
27259 const field = _fields.find(
27260 (_field) => _field.id === filter.field
27261 );
27262 if (field) {
27263 if (filter.operator === OPERATOR_IS_NOT_ALL) {
27264 (0, import_deprecated.default)("The 'isNotAll' filter operator", {
27265 since: "7.0",
27266 alternative: "'isNone'"
27267 });
27268 }
27269 const handler = field.filter[filter.operator];
27270 if (handler) {
27271 filteredData = filteredData.filter(
27272 (item) => handler(item, field, filter.value)
27273 );
27274 }
27275 }
27276 });
27277 }
27278 const sortByField = view.sort?.field ? _fields.find((field) => {
27279 return field.enableSorting !== false && field.id === view.sort?.field;
27280 }) : null;
27281 const groupByField = view.groupBy?.field ? _fields.find((field) => {
27282 return field.enableSorting !== false && field.id === view.groupBy?.field;
27283 }) : null;
27284 if (sortByField || groupByField) {
27285 filteredData.sort((a2, b2) => {
27286 if (groupByField) {
27287 const groupCompare = groupByField.sort(
27288 a2,
27289 b2,
27290 view.groupBy?.direction ?? "asc"
27291 );
27292 if (groupCompare !== 0) {
27293 return groupCompare;
27294 }
27295 }
27296 if (sortByField) {
27297 return sortByField.sort(a2, b2, view.sort?.direction ?? "desc");
27298 }
27299 return 0;
27300 });
27301 }
27302 let totalItems = filteredData.length;
27303 let totalPages = 1;
27304 if (view.infiniteScrollEnabled && view.startPosition !== void 0 && view.perPage !== void 0) {
27305 const start = view.startPosition - 1;
27306 const end = Math.min(start + view.perPage, totalItems);
27307 filteredData = filteredData?.slice(start, end);
27308 } else if (view.page !== void 0 && view.perPage !== void 0) {
27309 const start = (view.page - 1) * view.perPage;
27310 totalItems = filteredData?.length || 0;
27311 totalPages = Math.ceil(totalItems / view.perPage);
27312 filteredData = filteredData?.slice(start, start + view.perPage);
27313 }
27314 return {
27315 data: filteredData,
27316 paginationInfo: {
27317 totalItems,
27318 totalPages
27319 }
27320 };
27321 }
27322
27323 // widgets/activity/render.tsx
27324 var import_jsx_runtime121 = __toESM(require_jsx_runtime());
27325 function formatGroupDate(dateStr) {
27326 const now = (0, import_date10.getDate)();
27327 const today = (0, import_date10.dateI18n)("Y-m-d", now);
27328 if (dateStr === today) {
27329 return (0, import_i18n45.__)("Today");
27330 }
27331 const yesterday = (0, import_date10.getDate)();
27332 yesterday.setDate(yesterday.getDate() - 1);
27333 const yesterdayStr = (0, import_date10.dateI18n)("Y-m-d", yesterday);
27334 if (dateStr === yesterdayStr) {
27335 return (0, import_i18n45.__)("Yesterday");
27336 }
27337 const currentYear = (0, import_date10.dateI18n)("Y", now);
27338 if (dateStr.slice(0, 4) === currentYear) {
27339 return (0, import_date10.dateI18n)((0, import_i18n45.__)("M jS"), dateStr);
27340 }
27341 return (0, import_date10.dateI18n)((0, import_i18n45.__)("M jS Y"), dateStr);
27342 }
27343 function htmlToPlainText(html) {
27344 const { body } = new window.DOMParser().parseFromString(
27345 html,
27346 "text/html"
27347 );
27348 return (body.textContent ?? "").trim();
27349 }
27350 var FIELDS = [
27351 {
27352 id: "icon",
27353 label: (0, import_i18n45.__)("Icon"),
27354 type: "media",
27355 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(icon_default, { icon: item.kind === "comment" ? comment_default : post_list_default }),
27356 enableSorting: false,
27357 enableHiding: false
27358 },
27359 {
27360 id: "title",
27361 label: (0, import_i18n45.__)("Title"),
27362 type: "text",
27363 getValue: ({ item }) => item.title,
27364 enableSorting: false,
27365 enableGlobalSearch: true
27366 },
27367 {
27368 id: "description",
27369 label: (0, import_i18n45.__)("Description"),
27370 type: "text",
27371 getValue: ({ item }) => item.description,
27372 enableSorting: false,
27373 enableGlobalSearch: true
27374 },
27375 {
27376 id: "datetime",
27377 label: (0, import_i18n45.__)("Time"),
27378 getValue: ({ item }) => item.datetime,
27379 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime121.jsx)("span", { children: (0, import_date10.dateI18n)((0, import_i18n45.__)("g:i a"), item.datetime) }),
27380 enableSorting: true
27381 },
27382 {
27383 id: "date",
27384 label: (0, import_i18n45.__)("Date"),
27385 getValue: ({ item }) => item.datetime.split("T")[0],
27386 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime121.jsx)("span", { children: formatGroupDate(item.datetime.split("T")[0]) }),
27387 enableSorting: true,
27388 enableHiding: false
27389 }
27390 ];
27391 var DEFAULT_PER_PAGE = 5;
27392 var SOURCE_COUNT = 3;
27393 var DEFAULT_VIEW = {
27394 type: "activity",
27395 search: "",
27396 page: 1,
27397 perPage: DEFAULT_PER_PAGE,
27398 filters: [],
27399 fields: ["datetime"],
27400 titleField: "title",
27401 descriptionField: "description",
27402 mediaField: "icon",
27403 showMedia: true,
27404 sort: {
27405 field: "datetime",
27406 direction: "desc"
27407 },
27408 groupBy: {
27409 field: "date",
27410 direction: "desc",
27411 showLabel: false
27412 }
27413 };
27414 function Activity({ attributes }) {
27415 const perPage = Math.max(1, attributes?.perPage ?? DEFAULT_PER_PAGE);
27416 const [view, setView] = (0, import_element87.useState)(DEFAULT_VIEW);
27417 const queries = (0, import_element87.useMemo)(
27418 () => ({
27419 future: {
27420 status: "future",
27421 orderby: "date",
27422 order: "asc",
27423 per_page: perPage
27424 },
27425 recent: {
27426 status: "publish",
27427 orderby: "date",
27428 order: "desc",
27429 per_page: perPage
27430 },
27431 comments: { per_page: perPage }
27432 }),
27433 [perPage]
27434 );
27435 const { futurePosts, recentPosts, comments, isResolved } = (0, import_data6.useSelect)(
27436 (select) => {
27437 const coreData = select(import_core_data.store);
27438 return {
27439 futurePosts: coreData.getEntityRecords(
27440 "postType",
27441 "post",
27442 queries.future
27443 ),
27444 recentPosts: coreData.getEntityRecords(
27445 "postType",
27446 "post",
27447 queries.recent
27448 ),
27449 comments: coreData.getEntityRecords(
27450 "root",
27451 "comment",
27452 queries.comments
27453 ),
27454 isResolved: coreData.hasFinishedResolution("getEntityRecords", [
27455 "postType",
27456 "post",
27457 queries.future
27458 ]) && coreData.hasFinishedResolution("getEntityRecords", [
27459 "postType",
27460 "post",
27461 queries.recent
27462 ]) && coreData.hasFinishedResolution("getEntityRecords", [
27463 "root",
27464 "comment",
27465 queries.comments
27466 ])
27467 };
27468 },
27469 [queries]
27470 );
27471 const allEvents = (0, import_element87.useMemo)(() => {
27472 const events = [];
27473 for (const post of futurePosts ?? []) {
27474 events.push({
27475 id: `post-future-${post.id}`,
27476 datetime: post.date ?? "",
27477 title: (0, import_html_entities.decodeEntities)(
27478 post.title?.rendered ?? ""
27479 ),
27480 description: "",
27481 link: post.link ?? "",
27482 kind: "post-future"
27483 });
27484 }
27485 for (const post of recentPosts ?? []) {
27486 events.push({
27487 id: `post-published-${post.id}`,
27488 datetime: post.date ?? "",
27489 title: (0, import_html_entities.decodeEntities)(
27490 post.title?.rendered ?? ""
27491 ),
27492 description: "",
27493 link: post.link ?? "",
27494 kind: "post-published"
27495 });
27496 }
27497 for (const c2 of comments ?? []) {
27498 events.push({
27499 id: `comment-${c2.id}`,
27500 datetime: c2.date ?? "",
27501 title: (0, import_html_entities.decodeEntities)(c2.author_name ?? ""),
27502 description: htmlToPlainText(
27503 c2.content?.rendered ?? ""
27504 ),
27505 link: c2.link ?? "",
27506 kind: "comment"
27507 });
27508 }
27509 return events;
27510 }, [futurePosts, recentPosts, comments]);
27511 const resolvedView = (0, import_element87.useMemo)(
27512 () => ({ ...view, perPage: perPage * SOURCE_COUNT }),
27513 [view, perPage]
27514 );
27515 const { data: shownData, paginationInfo } = (0, import_element87.useMemo)(
27516 () => filterSortAndPaginate(allEvents, resolvedView, FIELDS),
27517 [allEvents, resolvedView]
27518 );
27519 if (!isResolved) {
27520 return /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
27521 Stack,
27522 {
27523 direction: "column",
27524 align: "center",
27525 justify: "center",
27526 style: { height: "100%" },
27527 children: /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(import_components47.Spinner, {})
27528 }
27529 );
27530 }
27531 if (allEvents.length === 0) {
27532 return /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
27533 Stack,
27534 {
27535 direction: "column",
27536 align: "center",
27537 justify: "center",
27538 style: { height: "100%" },
27539 children: /* @__PURE__ */ (0, import_jsx_runtime121.jsxs)(empty_state_exports.Root, { children: [
27540 /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(empty_state_exports.Icon, { icon: post_list_default }),
27541 /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(empty_state_exports.Title, { children: (0, import_i18n45.__)("No activity yet.") }),
27542 /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(empty_state_exports.Description, { children: (0, import_i18n45.__)(
27543 "When you publish posts or receive comments, they will appear here."
27544 ) })
27545 ] })
27546 }
27547 );
27548 }
27549 return /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
27550 dataviews_default,
27551 {
27552 data: shownData,
27553 fields: FIELDS,
27554 view: resolvedView,
27555 onChangeView: setView,
27556 paginationInfo,
27557 getItemId: (item) => item.id,
27558 search: false,
27559 isLoading: false,
27560 defaultLayouts: {
27561 activity: {
27562 sort: {
27563 field: "datetime",
27564 direction: "desc"
27565 }
27566 }
27567 },
27568 renderItemLink: ({ item, children, ...aProps }) => /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(Link, { href: item.link, ...aProps, children }),
27569 isItemClickable: (item) => !!item.link,
27570 children: /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(dataviews_default.Layout, {})
27571 }
27572 );
27573 }
27574 export {
27575 Activity as default
27576 };
27577 /*! Bundled license information:
27578
27579 use-sync-external-store/cjs/use-sync-external-store-shim.development.js:
27580 (**
27581 * @license React
27582 * use-sync-external-store-shim.development.js
27583 *
27584 * Copyright (c) Meta Platforms, Inc. and affiliates.
27585 *
27586 * This source code is licensed under the MIT license found in the
27587 * LICENSE file in the root directory of this source tree.
27588 *)
27589
27590 use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js:
27591 (**
27592 * @license React
27593 * use-sync-external-store-shim/with-selector.development.js
27594 *
27595 * Copyright (c) Meta Platforms, Inc. and affiliates.
27596 *
27597 * This source code is licensed under the MIT license found in the
27598 * LICENSE file in the root directory of this source tree.
27599 *)
27600 */
27601