PluginProbe
Gutenberg / 23.0.1
Gutenberg v23.0.1
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 / routes / pattern-list / content.js

content.js in Gutenberg 23.0.1, at build/routes/pattern-list/content.js

18,564 lines 619.2 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 __copyProps = (to, from, except, desc) => {
11 if (from && typeof from === "object" || typeof from === "function") {
12 for (let key of __getOwnPropNames(from))
13 if (!__hasOwnProp.call(to, key) && key !== except)
14 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15 }
16 return to;
17 };
18 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19 // If the importer is in node compatibility mode or this is not an ESM
20 // file that has been converted to a CommonJS file using a Babel-
21 // compatible transform (i.e. "__esModule" has not been set), then set
22 // "default" to the CommonJS "module.exports" for node compatibility.
23 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24 mod
25 ));
26
27 // package-external:@wordpress/element
28 var require_element = __commonJS({
29 "package-external:@wordpress/element"(exports, module) {
30 module.exports = window.wp.element;
31 }
32 });
33
34 // package-external:@wordpress/data
35 var require_data = __commonJS({
36 "package-external:@wordpress/data"(exports, module) {
37 module.exports = window.wp.data;
38 }
39 });
40
41 // package-external:@wordpress/preferences
42 var require_preferences = __commonJS({
43 "package-external:@wordpress/preferences"(exports, module) {
44 module.exports = window.wp.preferences;
45 }
46 });
47
48 // package-external:@wordpress/core-data
49 var require_core_data = __commonJS({
50 "package-external:@wordpress/core-data"(exports, module) {
51 module.exports = window.wp.coreData;
52 }
53 });
54
55 // package-external:@wordpress/private-apis
56 var require_private_apis = __commonJS({
57 "package-external:@wordpress/private-apis"(exports, module) {
58 module.exports = window.wp.privateApis;
59 }
60 });
61
62 // package-external:@wordpress/compose
63 var require_compose = __commonJS({
64 "package-external:@wordpress/compose"(exports, module) {
65 module.exports = window.wp.compose;
66 }
67 });
68
69 // vendor-external:react
70 var require_react = __commonJS({
71 "vendor-external:react"(exports, module) {
72 module.exports = window.React;
73 }
74 });
75
76 // vendor-external:react/jsx-runtime
77 var require_jsx_runtime = __commonJS({
78 "vendor-external:react/jsx-runtime"(exports, module) {
79 module.exports = window.ReactJSXRuntime;
80 }
81 });
82
83 // vendor-external:react-dom
84 var require_react_dom = __commonJS({
85 "vendor-external:react-dom"(exports, module) {
86 module.exports = window.ReactDOM;
87 }
88 });
89
90 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js
91 var require_use_sync_external_store_shim_development = __commonJS({
92 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) {
93 "use strict";
94 (function() {
95 function is(x2, y2) {
96 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
97 }
98 function useSyncExternalStore$2(subscribe2, getSnapshot) {
99 didWarnOld18Alpha || void 0 === React9.startTransition || (didWarnOld18Alpha = true, console.error(
100 "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."
101 ));
102 var value = getSnapshot();
103 if (!didWarnUncachedGetSnapshot) {
104 var cachedValue = getSnapshot();
105 objectIs(value, cachedValue) || (console.error(
106 "The result of getSnapshot should be cached to avoid an infinite loop"
107 ), didWarnUncachedGetSnapshot = true);
108 }
109 cachedValue = useState25({
110 inst: { value, getSnapshot }
111 });
112 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1];
113 useLayoutEffect3(
114 function() {
115 inst.value = value;
116 inst.getSnapshot = getSnapshot;
117 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
118 },
119 [subscribe2, value, getSnapshot]
120 );
121 useEffect21(
122 function() {
123 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
124 return subscribe2(function() {
125 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
126 });
127 },
128 [subscribe2]
129 );
130 useDebugValue(value);
131 return value;
132 }
133 function checkIfSnapshotChanged(inst) {
134 var latestGetSnapshot = inst.getSnapshot;
135 inst = inst.value;
136 try {
137 var nextValue = latestGetSnapshot();
138 return !objectIs(inst, nextValue);
139 } catch (error) {
140 return true;
141 }
142 }
143 function useSyncExternalStore$1(subscribe2, getSnapshot) {
144 return getSnapshot();
145 }
146 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
147 var React9 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState25 = React9.useState, useEffect21 = React9.useEffect, useLayoutEffect3 = React9.useLayoutEffect, useDebugValue = React9.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2;
148 exports.useSyncExternalStore = void 0 !== React9.useSyncExternalStore ? React9.useSyncExternalStore : shim;
149 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
150 })();
151 }
152 });
153
154 // node_modules/use-sync-external-store/shim/index.js
155 var require_shim = __commonJS({
156 "node_modules/use-sync-external-store/shim/index.js"(exports, module) {
157 "use strict";
158 if (false) {
159 module.exports = null;
160 } else {
161 module.exports = require_use_sync_external_store_shim_development();
162 }
163 }
164 });
165
166 // package-external:@wordpress/i18n
167 var require_i18n = __commonJS({
168 "package-external:@wordpress/i18n"(exports, module) {
169 module.exports = window.wp.i18n;
170 }
171 });
172
173 // package-external:@wordpress/primitives
174 var require_primitives = __commonJS({
175 "package-external:@wordpress/primitives"(exports, module) {
176 module.exports = window.wp.primitives;
177 }
178 });
179
180 // package-external:@wordpress/components
181 var require_components = __commonJS({
182 "package-external:@wordpress/components"(exports, module) {
183 module.exports = window.wp.components;
184 }
185 });
186
187 // package-external:@wordpress/keycodes
188 var require_keycodes = __commonJS({
189 "package-external:@wordpress/keycodes"(exports, module) {
190 module.exports = window.wp.keycodes;
191 }
192 });
193
194 // node_modules/remove-accents/index.js
195 var require_remove_accents = __commonJS({
196 "node_modules/remove-accents/index.js"(exports, module) {
197 var characterMap = {
198 "\xC0": "A",
199 "\xC1": "A",
200 "\xC2": "A",
201 "\xC3": "A",
202 "\xC4": "A",
203 "\xC5": "A",
204 "\u1EA4": "A",
205 "\u1EAE": "A",
206 "\u1EB2": "A",
207 "\u1EB4": "A",
208 "\u1EB6": "A",
209 "\xC6": "AE",
210 "\u1EA6": "A",
211 "\u1EB0": "A",
212 "\u0202": "A",
213 "\u1EA2": "A",
214 "\u1EA0": "A",
215 "\u1EA8": "A",
216 "\u1EAA": "A",
217 "\u1EAC": "A",
218 "\xC7": "C",
219 "\u1E08": "C",
220 "\xC8": "E",
221 "\xC9": "E",
222 "\xCA": "E",
223 "\xCB": "E",
224 "\u1EBE": "E",
225 "\u1E16": "E",
226 "\u1EC0": "E",
227 "\u1E14": "E",
228 "\u1E1C": "E",
229 "\u0206": "E",
230 "\u1EBA": "E",
231 "\u1EBC": "E",
232 "\u1EB8": "E",
233 "\u1EC2": "E",
234 "\u1EC4": "E",
235 "\u1EC6": "E",
236 "\xCC": "I",
237 "\xCD": "I",
238 "\xCE": "I",
239 "\xCF": "I",
240 "\u1E2E": "I",
241 "\u020A": "I",
242 "\u1EC8": "I",
243 "\u1ECA": "I",
244 "\xD0": "D",
245 "\xD1": "N",
246 "\xD2": "O",
247 "\xD3": "O",
248 "\xD4": "O",
249 "\xD5": "O",
250 "\xD6": "O",
251 "\xD8": "O",
252 "\u1ED0": "O",
253 "\u1E4C": "O",
254 "\u1E52": "O",
255 "\u020E": "O",
256 "\u1ECE": "O",
257 "\u1ECC": "O",
258 "\u1ED4": "O",
259 "\u1ED6": "O",
260 "\u1ED8": "O",
261 "\u1EDC": "O",
262 "\u1EDE": "O",
263 "\u1EE0": "O",
264 "\u1EDA": "O",
265 "\u1EE2": "O",
266 "\xD9": "U",
267 "\xDA": "U",
268 "\xDB": "U",
269 "\xDC": "U",
270 "\u1EE6": "U",
271 "\u1EE4": "U",
272 "\u1EEC": "U",
273 "\u1EEE": "U",
274 "\u1EF0": "U",
275 "\xDD": "Y",
276 "\xE0": "a",
277 "\xE1": "a",
278 "\xE2": "a",
279 "\xE3": "a",
280 "\xE4": "a",
281 "\xE5": "a",
282 "\u1EA5": "a",
283 "\u1EAF": "a",
284 "\u1EB3": "a",
285 "\u1EB5": "a",
286 "\u1EB7": "a",
287 "\xE6": "ae",
288 "\u1EA7": "a",
289 "\u1EB1": "a",
290 "\u0203": "a",
291 "\u1EA3": "a",
292 "\u1EA1": "a",
293 "\u1EA9": "a",
294 "\u1EAB": "a",
295 "\u1EAD": "a",
296 "\xE7": "c",
297 "\u1E09": "c",
298 "\xE8": "e",
299 "\xE9": "e",
300 "\xEA": "e",
301 "\xEB": "e",
302 "\u1EBF": "e",
303 "\u1E17": "e",
304 "\u1EC1": "e",
305 "\u1E15": "e",
306 "\u1E1D": "e",
307 "\u0207": "e",
308 "\u1EBB": "e",
309 "\u1EBD": "e",
310 "\u1EB9": "e",
311 "\u1EC3": "e",
312 "\u1EC5": "e",
313 "\u1EC7": "e",
314 "\xEC": "i",
315 "\xED": "i",
316 "\xEE": "i",
317 "\xEF": "i",
318 "\u1E2F": "i",
319 "\u020B": "i",
320 "\u1EC9": "i",
321 "\u1ECB": "i",
322 "\xF0": "d",
323 "\xF1": "n",
324 "\xF2": "o",
325 "\xF3": "o",
326 "\xF4": "o",
327 "\xF5": "o",
328 "\xF6": "o",
329 "\xF8": "o",
330 "\u1ED1": "o",
331 "\u1E4D": "o",
332 "\u1E53": "o",
333 "\u020F": "o",
334 "\u1ECF": "o",
335 "\u1ECD": "o",
336 "\u1ED5": "o",
337 "\u1ED7": "o",
338 "\u1ED9": "o",
339 "\u1EDD": "o",
340 "\u1EDF": "o",
341 "\u1EE1": "o",
342 "\u1EDB": "o",
343 "\u1EE3": "o",
344 "\xF9": "u",
345 "\xFA": "u",
346 "\xFB": "u",
347 "\xFC": "u",
348 "\u1EE7": "u",
349 "\u1EE5": "u",
350 "\u1EED": "u",
351 "\u1EEF": "u",
352 "\u1EF1": "u",
353 "\xFD": "y",
354 "\xFF": "y",
355 "\u0100": "A",
356 "\u0101": "a",
357 "\u0102": "A",
358 "\u0103": "a",
359 "\u0104": "A",
360 "\u0105": "a",
361 "\u0106": "C",
362 "\u0107": "c",
363 "\u0108": "C",
364 "\u0109": "c",
365 "\u010A": "C",
366 "\u010B": "c",
367 "\u010C": "C",
368 "\u010D": "c",
369 "C\u0306": "C",
370 "c\u0306": "c",
371 "\u010E": "D",
372 "\u010F": "d",
373 "\u0110": "D",
374 "\u0111": "d",
375 "\u0112": "E",
376 "\u0113": "e",
377 "\u0114": "E",
378 "\u0115": "e",
379 "\u0116": "E",
380 "\u0117": "e",
381 "\u0118": "E",
382 "\u0119": "e",
383 "\u011A": "E",
384 "\u011B": "e",
385 "\u011C": "G",
386 "\u01F4": "G",
387 "\u011D": "g",
388 "\u01F5": "g",
389 "\u011E": "G",
390 "\u011F": "g",
391 "\u0120": "G",
392 "\u0121": "g",
393 "\u0122": "G",
394 "\u0123": "g",
395 "\u0124": "H",
396 "\u0125": "h",
397 "\u0126": "H",
398 "\u0127": "h",
399 "\u1E2A": "H",
400 "\u1E2B": "h",
401 "\u0128": "I",
402 "\u0129": "i",
403 "\u012A": "I",
404 "\u012B": "i",
405 "\u012C": "I",
406 "\u012D": "i",
407 "\u012E": "I",
408 "\u012F": "i",
409 "\u0130": "I",
410 "\u0131": "i",
411 "\u0132": "IJ",
412 "\u0133": "ij",
413 "\u0134": "J",
414 "\u0135": "j",
415 "\u0136": "K",
416 "\u0137": "k",
417 "\u1E30": "K",
418 "\u1E31": "k",
419 "K\u0306": "K",
420 "k\u0306": "k",
421 "\u0139": "L",
422 "\u013A": "l",
423 "\u013B": "L",
424 "\u013C": "l",
425 "\u013D": "L",
426 "\u013E": "l",
427 "\u013F": "L",
428 "\u0140": "l",
429 "\u0141": "l",
430 "\u0142": "l",
431 "\u1E3E": "M",
432 "\u1E3F": "m",
433 "M\u0306": "M",
434 "m\u0306": "m",
435 "\u0143": "N",
436 "\u0144": "n",
437 "\u0145": "N",
438 "\u0146": "n",
439 "\u0147": "N",
440 "\u0148": "n",
441 "\u0149": "n",
442 "N\u0306": "N",
443 "n\u0306": "n",
444 "\u014C": "O",
445 "\u014D": "o",
446 "\u014E": "O",
447 "\u014F": "o",
448 "\u0150": "O",
449 "\u0151": "o",
450 "\u0152": "OE",
451 "\u0153": "oe",
452 "P\u0306": "P",
453 "p\u0306": "p",
454 "\u0154": "R",
455 "\u0155": "r",
456 "\u0156": "R",
457 "\u0157": "r",
458 "\u0158": "R",
459 "\u0159": "r",
460 "R\u0306": "R",
461 "r\u0306": "r",
462 "\u0212": "R",
463 "\u0213": "r",
464 "\u015A": "S",
465 "\u015B": "s",
466 "\u015C": "S",
467 "\u015D": "s",
468 "\u015E": "S",
469 "\u0218": "S",
470 "\u0219": "s",
471 "\u015F": "s",
472 "\u0160": "S",
473 "\u0161": "s",
474 "\u0162": "T",
475 "\u0163": "t",
476 "\u021B": "t",
477 "\u021A": "T",
478 "\u0164": "T",
479 "\u0165": "t",
480 "\u0166": "T",
481 "\u0167": "t",
482 "T\u0306": "T",
483 "t\u0306": "t",
484 "\u0168": "U",
485 "\u0169": "u",
486 "\u016A": "U",
487 "\u016B": "u",
488 "\u016C": "U",
489 "\u016D": "u",
490 "\u016E": "U",
491 "\u016F": "u",
492 "\u0170": "U",
493 "\u0171": "u",
494 "\u0172": "U",
495 "\u0173": "u",
496 "\u0216": "U",
497 "\u0217": "u",
498 "V\u0306": "V",
499 "v\u0306": "v",
500 "\u0174": "W",
501 "\u0175": "w",
502 "\u1E82": "W",
503 "\u1E83": "w",
504 "X\u0306": "X",
505 "x\u0306": "x",
506 "\u0176": "Y",
507 "\u0177": "y",
508 "\u0178": "Y",
509 "Y\u0306": "Y",
510 "y\u0306": "y",
511 "\u0179": "Z",
512 "\u017A": "z",
513 "\u017B": "Z",
514 "\u017C": "z",
515 "\u017D": "Z",
516 "\u017E": "z",
517 "\u017F": "s",
518 "\u0192": "f",
519 "\u01A0": "O",
520 "\u01A1": "o",
521 "\u01AF": "U",
522 "\u01B0": "u",
523 "\u01CD": "A",
524 "\u01CE": "a",
525 "\u01CF": "I",
526 "\u01D0": "i",
527 "\u01D1": "O",
528 "\u01D2": "o",
529 "\u01D3": "U",
530 "\u01D4": "u",
531 "\u01D5": "U",
532 "\u01D6": "u",
533 "\u01D7": "U",
534 "\u01D8": "u",
535 "\u01D9": "U",
536 "\u01DA": "u",
537 "\u01DB": "U",
538 "\u01DC": "u",
539 "\u1EE8": "U",
540 "\u1EE9": "u",
541 "\u1E78": "U",
542 "\u1E79": "u",
543 "\u01FA": "A",
544 "\u01FB": "a",
545 "\u01FC": "AE",
546 "\u01FD": "ae",
547 "\u01FE": "O",
548 "\u01FF": "o",
549 "\xDE": "TH",
550 "\xFE": "th",
551 "\u1E54": "P",
552 "\u1E55": "p",
553 "\u1E64": "S",
554 "\u1E65": "s",
555 "X\u0301": "X",
556 "x\u0301": "x",
557 "\u0403": "\u0413",
558 "\u0453": "\u0433",
559 "\u040C": "\u041A",
560 "\u045C": "\u043A",
561 "A\u030B": "A",
562 "a\u030B": "a",
563 "E\u030B": "E",
564 "e\u030B": "e",
565 "I\u030B": "I",
566 "i\u030B": "i",
567 "\u01F8": "N",
568 "\u01F9": "n",
569 "\u1ED2": "O",
570 "\u1ED3": "o",
571 "\u1E50": "O",
572 "\u1E51": "o",
573 "\u1EEA": "U",
574 "\u1EEB": "u",
575 "\u1E80": "W",
576 "\u1E81": "w",
577 "\u1EF2": "Y",
578 "\u1EF3": "y",
579 "\u0200": "A",
580 "\u0201": "a",
581 "\u0204": "E",
582 "\u0205": "e",
583 "\u0208": "I",
584 "\u0209": "i",
585 "\u020C": "O",
586 "\u020D": "o",
587 "\u0210": "R",
588 "\u0211": "r",
589 "\u0214": "U",
590 "\u0215": "u",
591 "B\u030C": "B",
592 "b\u030C": "b",
593 "\u010C\u0323": "C",
594 "\u010D\u0323": "c",
595 "\xCA\u030C": "E",
596 "\xEA\u030C": "e",
597 "F\u030C": "F",
598 "f\u030C": "f",
599 "\u01E6": "G",
600 "\u01E7": "g",
601 "\u021E": "H",
602 "\u021F": "h",
603 "J\u030C": "J",
604 "\u01F0": "j",
605 "\u01E8": "K",
606 "\u01E9": "k",
607 "M\u030C": "M",
608 "m\u030C": "m",
609 "P\u030C": "P",
610 "p\u030C": "p",
611 "Q\u030C": "Q",
612 "q\u030C": "q",
613 "\u0158\u0329": "R",
614 "\u0159\u0329": "r",
615 "\u1E66": "S",
616 "\u1E67": "s",
617 "V\u030C": "V",
618 "v\u030C": "v",
619 "W\u030C": "W",
620 "w\u030C": "w",
621 "X\u030C": "X",
622 "x\u030C": "x",
623 "Y\u030C": "Y",
624 "y\u030C": "y",
625 "A\u0327": "A",
626 "a\u0327": "a",
627 "B\u0327": "B",
628 "b\u0327": "b",
629 "\u1E10": "D",
630 "\u1E11": "d",
631 "\u0228": "E",
632 "\u0229": "e",
633 "\u0190\u0327": "E",
634 "\u025B\u0327": "e",
635 "\u1E28": "H",
636 "\u1E29": "h",
637 "I\u0327": "I",
638 "i\u0327": "i",
639 "\u0197\u0327": "I",
640 "\u0268\u0327": "i",
641 "M\u0327": "M",
642 "m\u0327": "m",
643 "O\u0327": "O",
644 "o\u0327": "o",
645 "Q\u0327": "Q",
646 "q\u0327": "q",
647 "U\u0327": "U",
648 "u\u0327": "u",
649 "X\u0327": "X",
650 "x\u0327": "x",
651 "Z\u0327": "Z",
652 "z\u0327": "z",
653 "\u0439": "\u0438",
654 "\u0419": "\u0418",
655 "\u0451": "\u0435",
656 "\u0401": "\u0415"
657 };
658 var chars = Object.keys(characterMap).join("|");
659 var allAccents = new RegExp(chars, "g");
660 var firstAccent = new RegExp(chars, "");
661 function matcher(match2) {
662 return characterMap[match2];
663 }
664 var removeAccents3 = function(string) {
665 return string.replace(allAccents, matcher);
666 };
667 var hasAccents = function(string) {
668 return !!string.match(firstAccent);
669 };
670 module.exports = removeAccents3;
671 module.exports.has = hasAccents;
672 module.exports.remove = removeAccents3;
673 }
674 });
675
676 // node_modules/fast-deep-equal/es6/index.js
677 var require_es6 = __commonJS({
678 "node_modules/fast-deep-equal/es6/index.js"(exports, module) {
679 "use strict";
680 module.exports = function equal(a2, b2) {
681 if (a2 === b2) return true;
682 if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") {
683 if (a2.constructor !== b2.constructor) return false;
684 var length, i2, keys;
685 if (Array.isArray(a2)) {
686 length = a2.length;
687 if (length != b2.length) return false;
688 for (i2 = length; i2-- !== 0; )
689 if (!equal(a2[i2], b2[i2])) return false;
690 return true;
691 }
692 if (a2 instanceof Map && b2 instanceof Map) {
693 if (a2.size !== b2.size) return false;
694 for (i2 of a2.entries())
695 if (!b2.has(i2[0])) return false;
696 for (i2 of a2.entries())
697 if (!equal(i2[1], b2.get(i2[0]))) return false;
698 return true;
699 }
700 if (a2 instanceof Set && b2 instanceof Set) {
701 if (a2.size !== b2.size) return false;
702 for (i2 of a2.entries())
703 if (!b2.has(i2[0])) return false;
704 return true;
705 }
706 if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) {
707 length = a2.length;
708 if (length != b2.length) return false;
709 for (i2 = length; i2-- !== 0; )
710 if (a2[i2] !== b2[i2]) return false;
711 return true;
712 }
713 if (a2.constructor === RegExp) return a2.source === b2.source && a2.flags === b2.flags;
714 if (a2.valueOf !== Object.prototype.valueOf) return a2.valueOf() === b2.valueOf();
715 if (a2.toString !== Object.prototype.toString) return a2.toString() === b2.toString();
716 keys = Object.keys(a2);
717 length = keys.length;
718 if (length !== Object.keys(b2).length) return false;
719 for (i2 = length; i2-- !== 0; )
720 if (!Object.prototype.hasOwnProperty.call(b2, keys[i2])) return false;
721 for (i2 = length; i2-- !== 0; ) {
722 var key = keys[i2];
723 if (!equal(a2[key], b2[key])) return false;
724 }
725 return true;
726 }
727 return a2 !== a2 && b2 !== b2;
728 };
729 }
730 });
731
732 // package-external:@wordpress/date
733 var require_date = __commonJS({
734 "package-external:@wordpress/date"(exports, module) {
735 module.exports = window.wp.date;
736 }
737 });
738
739 // package-external:@wordpress/warning
740 var require_warning = __commonJS({
741 "package-external:@wordpress/warning"(exports, module) {
742 module.exports = window.wp.warning;
743 }
744 });
745
746 // package-external:@wordpress/deprecated
747 var require_deprecated = __commonJS({
748 "package-external:@wordpress/deprecated"(exports, module) {
749 module.exports = window.wp.deprecated;
750 }
751 });
752
753 // package-external:@wordpress/editor
754 var require_editor = __commonJS({
755 "package-external:@wordpress/editor"(exports, module) {
756 module.exports = window.wp.editor;
757 }
758 });
759
760 // package-external:@wordpress/patterns
761 var require_patterns = __commonJS({
762 "package-external:@wordpress/patterns"(exports, module) {
763 module.exports = window.wp.patterns;
764 }
765 });
766
767 // package-external:@wordpress/block-editor
768 var require_block_editor = __commonJS({
769 "package-external:@wordpress/block-editor"(exports, module) {
770 module.exports = window.wp.blockEditor;
771 }
772 });
773
774 // routes/pattern-list/stage.tsx
775 import {
776 useParams,
777 useNavigate,
778 useSearch,
779 Link,
780 useInvalidate
781 } from "@wordpress/route";
782
783 // node_modules/dequal/dist/index.mjs
784 var has = Object.prototype.hasOwnProperty;
785 function find(iter, tar, key) {
786 for (key of iter.keys()) {
787 if (dequal(key, tar)) return key;
788 }
789 }
790 function dequal(foo, bar) {
791 var ctor, len, tmp;
792 if (foo === bar) return true;
793 if (foo && bar && (ctor = foo.constructor) === bar.constructor) {
794 if (ctor === Date) return foo.getTime() === bar.getTime();
795 if (ctor === RegExp) return foo.toString() === bar.toString();
796 if (ctor === Array) {
797 if ((len = foo.length) === bar.length) {
798 while (len-- && dequal(foo[len], bar[len])) ;
799 }
800 return len === -1;
801 }
802 if (ctor === Set) {
803 if (foo.size !== bar.size) {
804 return false;
805 }
806 for (len of foo) {
807 tmp = len;
808 if (tmp && typeof tmp === "object") {
809 tmp = find(bar, tmp);
810 if (!tmp) return false;
811 }
812 if (!bar.has(tmp)) return false;
813 }
814 return true;
815 }
816 if (ctor === Map) {
817 if (foo.size !== bar.size) {
818 return false;
819 }
820 for (len of foo) {
821 tmp = len[0];
822 if (tmp && typeof tmp === "object") {
823 tmp = find(bar, tmp);
824 if (!tmp) return false;
825 }
826 if (!dequal(len[1], bar.get(tmp))) {
827 return false;
828 }
829 }
830 return true;
831 }
832 if (ctor === ArrayBuffer) {
833 foo = new Uint8Array(foo);
834 bar = new Uint8Array(bar);
835 } else if (ctor === DataView) {
836 if ((len = foo.byteLength) === bar.byteLength) {
837 while (len-- && foo.getInt8(len) === bar.getInt8(len)) ;
838 }
839 return len === -1;
840 }
841 if (ArrayBuffer.isView(foo)) {
842 if ((len = foo.byteLength) === bar.byteLength) {
843 while (len-- && foo[len] === bar[len]) ;
844 }
845 return len === -1;
846 }
847 if (!ctor || typeof foo === "object") {
848 len = 0;
849 for (ctor in foo) {
850 if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;
851 if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;
852 }
853 return Object.keys(bar).length === len;
854 }
855 }
856 return foo !== foo && bar !== bar;
857 }
858
859 // packages/views/build-module/use-view.mjs
860 var import_element = __toESM(require_element(), 1);
861 var import_data = __toESM(require_data(), 1);
862 var import_preferences = __toESM(require_preferences(), 1);
863
864 // packages/views/build-module/preference-keys.mjs
865 function generatePreferenceKey(kind, name, slug) {
866 return `dataviews-${kind}-${name}-${slug}`;
867 }
868
869 // packages/views/build-module/filter-utils.mjs
870 var SCALAR_VALUES = [
871 "titleField",
872 "mediaField",
873 "descriptionField",
874 "showTitle",
875 "showMedia",
876 "showDescription",
877 "showLevels",
878 "infiniteScrollEnabled"
879 ];
880 function mergeActiveViewOverrides(view, activeViewOverrides, defaultView) {
881 if (!activeViewOverrides) {
882 return view;
883 }
884 let result = view;
885 for (const key of SCALAR_VALUES) {
886 if (key in activeViewOverrides) {
887 result = { ...result, [key]: activeViewOverrides[key] };
888 }
889 }
890 if (activeViewOverrides.filters && activeViewOverrides.filters.length > 0) {
891 const activeFields = new Set(
892 activeViewOverrides.filters.map((f2) => f2.field)
893 );
894 const preserved = (view.filters ?? []).filter(
895 (f2) => !activeFields.has(f2.field)
896 );
897 result = {
898 ...result,
899 filters: [...preserved, ...activeViewOverrides.filters]
900 };
901 }
902 if (activeViewOverrides.sort) {
903 const isDefaultSort = defaultView && view.sort?.field === defaultView.sort?.field && view.sort?.direction === defaultView.sort?.direction;
904 if (isDefaultSort) {
905 result = {
906 ...result,
907 sort: activeViewOverrides.sort
908 };
909 }
910 }
911 if (activeViewOverrides.layout) {
912 result = {
913 ...result,
914 layout: {
915 ...result.layout,
916 ...activeViewOverrides.layout
917 }
918 };
919 }
920 if (activeViewOverrides.groupBy) {
921 result = {
922 ...result,
923 groupBy: activeViewOverrides.groupBy
924 };
925 }
926 return result;
927 }
928 function stripActiveViewOverrides(view, activeViewOverrides, defaultView) {
929 if (!activeViewOverrides) {
930 return view;
931 }
932 let result = view;
933 for (const key of SCALAR_VALUES) {
934 if (key in activeViewOverrides) {
935 const { [key]: _, ...rest } = result;
936 result = rest;
937 }
938 }
939 if (activeViewOverrides.filters && activeViewOverrides.filters.length > 0) {
940 const activeFields = new Set(
941 activeViewOverrides.filters.map((f2) => f2.field)
942 );
943 result = {
944 ...result,
945 filters: (view.filters ?? []).filter(
946 (f2) => !activeFields.has(f2.field)
947 )
948 };
949 }
950 if (activeViewOverrides.sort && view.sort?.field === activeViewOverrides.sort.field && view.sort?.direction === activeViewOverrides.sort.direction) {
951 result = {
952 ...result,
953 sort: defaultView?.sort
954 };
955 }
956 if (activeViewOverrides.layout && "layout" in result && result.layout) {
957 const layout = { ...result.layout };
958 for (const key of Object.keys(activeViewOverrides.layout)) {
959 delete layout[key];
960 }
961 result = {
962 ...result,
963 layout: Object.keys(layout).length > 0 ? layout : void 0
964 };
965 }
966 if (activeViewOverrides.groupBy && "groupBy" in result) {
967 const { groupBy: _, ...rest } = result;
968 result = rest;
969 }
970 return result;
971 }
972
973 // packages/views/build-module/use-view.mjs
974 function omit(obj, keys) {
975 const result = { ...obj };
976 for (const key of keys) {
977 delete result[key];
978 }
979 return result;
980 }
981 function useView(config) {
982 const {
983 kind,
984 name,
985 slug,
986 defaultView,
987 activeViewOverrides,
988 queryParams,
989 onChangeQueryParams
990 } = config;
991 const preferenceKey = generatePreferenceKey(kind, name, slug);
992 const persistedView = (0, import_data.useSelect)(
993 (select2) => {
994 return select2(import_preferences.store).get(
995 "core/views",
996 preferenceKey
997 );
998 },
999 [preferenceKey]
1000 );
1001 const { set: set2 } = (0, import_data.useDispatch)(import_preferences.store);
1002 const baseView = (0, import_element.useMemo)(
1003 () => persistedView ?? defaultView ?? {},
1004 [persistedView, defaultView]
1005 );
1006 const page = Number(queryParams?.page ?? baseView.page ?? 1);
1007 const search = queryParams?.search ?? baseView.search ?? "";
1008 const combinedOverrides = (0, import_element.useMemo)(() => {
1009 const rawDefaults = config.defaultLayouts?.[baseView.type];
1010 const layoutTypeDefaults = !rawDefaults || rawDefaults === true ? {} : rawDefaults;
1011 return { ...layoutTypeDefaults, ...activeViewOverrides };
1012 }, [config.defaultLayouts, baseView.type, activeViewOverrides]);
1013 const view = (0, import_element.useMemo)(() => {
1014 return mergeActiveViewOverrides(
1015 {
1016 ...baseView,
1017 page,
1018 search
1019 },
1020 combinedOverrides,
1021 defaultView
1022 );
1023 }, [baseView, page, search, combinedOverrides, defaultView]);
1024 const isModified = !!persistedView;
1025 const updateView = (0, import_element.useCallback)(
1026 (newView) => {
1027 const urlParams = {
1028 page: newView?.page,
1029 search: newView?.search
1030 };
1031 const preferenceView = stripActiveViewOverrides(
1032 omit(newView, ["page", "search"]),
1033 combinedOverrides,
1034 defaultView
1035 );
1036 if (onChangeQueryParams && !dequal(urlParams, { page, search })) {
1037 onChangeQueryParams(urlParams);
1038 }
1039 const comparableBaseView = stripActiveViewOverrides(
1040 baseView,
1041 combinedOverrides,
1042 defaultView
1043 );
1044 const comparableDefaultView = stripActiveViewOverrides(
1045 defaultView,
1046 combinedOverrides,
1047 defaultView
1048 );
1049 if (!dequal(comparableBaseView, preferenceView)) {
1050 if (dequal(preferenceView, comparableDefaultView)) {
1051 set2("core/views", preferenceKey, void 0);
1052 } else {
1053 set2("core/views", preferenceKey, preferenceView);
1054 }
1055 }
1056 },
1057 [
1058 onChangeQueryParams,
1059 page,
1060 search,
1061 baseView,
1062 defaultView,
1063 combinedOverrides,
1064 set2,
1065 preferenceKey
1066 ]
1067 );
1068 const resetToDefault = (0, import_element.useCallback)(() => {
1069 set2("core/views", preferenceKey, void 0);
1070 }, [preferenceKey, set2]);
1071 return {
1072 view,
1073 isModified,
1074 updateView,
1075 resetToDefault
1076 };
1077 }
1078
1079 // packages/views/build-module/load-view.mjs
1080 var import_data2 = __toESM(require_data(), 1);
1081 var import_preferences2 = __toESM(require_preferences(), 1);
1082
1083 // packages/views/build-module/use-view-config.mjs
1084 var import_data3 = __toESM(require_data(), 1);
1085 var import_core_data = __toESM(require_core_data(), 1);
1086
1087 // packages/views/build-module/lock-unlock.mjs
1088 var import_private_apis = __toESM(require_private_apis(), 1);
1089 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
1090 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
1091 "@wordpress/views"
1092 );
1093
1094 // node_modules/clsx/dist/clsx.mjs
1095 function r(e2) {
1096 var t2, f2, n2 = "";
1097 if ("string" == typeof e2 || "number" == typeof e2) n2 += e2;
1098 else if ("object" == typeof e2) if (Array.isArray(e2)) {
1099 var o2 = e2.length;
1100 for (t2 = 0; t2 < o2; t2++) e2[t2] && (f2 = r(e2[t2])) && (n2 && (n2 += " "), n2 += f2);
1101 } else for (f2 in e2) e2[f2] && (n2 && (n2 += " "), n2 += f2);
1102 return n2;
1103 }
1104 function clsx() {
1105 for (var e2, t2, f2 = 0, n2 = "", o2 = arguments.length; f2 < o2; f2++) (e2 = arguments[f2]) && (t2 = r(e2)) && (n2 && (n2 += " "), n2 += t2);
1106 return n2;
1107 }
1108 var clsx_default = clsx;
1109
1110 // packages/dataviews/build-module/dataviews/index.mjs
1111 var import_element58 = __toESM(require_element(), 1);
1112 var import_compose12 = __toESM(require_compose(), 1);
1113
1114 // node_modules/@base-ui/utils/esm/useRefWithInit.js
1115 var React2 = __toESM(require_react(), 1);
1116 var UNINITIALIZED = {};
1117 function useRefWithInit(init2, initArg) {
1118 const ref = React2.useRef(UNINITIALIZED);
1119 if (ref.current === UNINITIALIZED) {
1120 ref.current = init2(initArg);
1121 }
1122 return ref;
1123 }
1124
1125 // node_modules/@base-ui/utils/esm/warn.js
1126 var set;
1127 if (true) {
1128 set = /* @__PURE__ */ new Set();
1129 }
1130 function warn(...messages) {
1131 if (true) {
1132 const messageKey = messages.join(" ");
1133 if (!set.has(messageKey)) {
1134 set.add(messageKey);
1135 console.warn(`Base UI: ${messageKey}`);
1136 }
1137 }
1138 }
1139
1140 // node_modules/@base-ui/react/esm/utils/useRenderElement.js
1141 var React5 = __toESM(require_react(), 1);
1142
1143 // node_modules/@base-ui/utils/esm/useMergedRefs.js
1144 function useMergedRefs(a2, b2, c2, d2) {
1145 const forkRef = useRefWithInit(createForkRef).current;
1146 if (didChange(forkRef, a2, b2, c2, d2)) {
1147 update(forkRef, [a2, b2, c2, d2]);
1148 }
1149 return forkRef.callback;
1150 }
1151 function useMergedRefsN(refs) {
1152 const forkRef = useRefWithInit(createForkRef).current;
1153 if (didChangeN(forkRef, refs)) {
1154 update(forkRef, refs);
1155 }
1156 return forkRef.callback;
1157 }
1158 function createForkRef() {
1159 return {
1160 callback: null,
1161 cleanup: null,
1162 refs: []
1163 };
1164 }
1165 function didChange(forkRef, a2, b2, c2, d2) {
1166 return forkRef.refs[0] !== a2 || forkRef.refs[1] !== b2 || forkRef.refs[2] !== c2 || forkRef.refs[3] !== d2;
1167 }
1168 function didChangeN(forkRef, newRefs) {
1169 return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index) => ref !== newRefs[index]);
1170 }
1171 function update(forkRef, refs) {
1172 forkRef.refs = refs;
1173 if (refs.every((ref) => ref == null)) {
1174 forkRef.callback = null;
1175 return;
1176 }
1177 forkRef.callback = (instance) => {
1178 if (forkRef.cleanup) {
1179 forkRef.cleanup();
1180 forkRef.cleanup = null;
1181 }
1182 if (instance != null) {
1183 const cleanupCallbacks = Array(refs.length).fill(null);
1184 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1185 const ref = refs[i2];
1186 if (ref == null) {
1187 continue;
1188 }
1189 switch (typeof ref) {
1190 case "function": {
1191 const refCleanup = ref(instance);
1192 if (typeof refCleanup === "function") {
1193 cleanupCallbacks[i2] = refCleanup;
1194 }
1195 break;
1196 }
1197 case "object": {
1198 ref.current = instance;
1199 break;
1200 }
1201 default:
1202 }
1203 }
1204 forkRef.cleanup = () => {
1205 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1206 const ref = refs[i2];
1207 if (ref == null) {
1208 continue;
1209 }
1210 switch (typeof ref) {
1211 case "function": {
1212 const cleanupCallback = cleanupCallbacks[i2];
1213 if (typeof cleanupCallback === "function") {
1214 cleanupCallback();
1215 } else {
1216 ref(null);
1217 }
1218 break;
1219 }
1220 case "object": {
1221 ref.current = null;
1222 break;
1223 }
1224 default:
1225 }
1226 }
1227 };
1228 }
1229 };
1230 }
1231
1232 // node_modules/@base-ui/utils/esm/getReactElementRef.js
1233 var React4 = __toESM(require_react(), 1);
1234
1235 // node_modules/@base-ui/utils/esm/reactVersion.js
1236 var React3 = __toESM(require_react(), 1);
1237 var majorVersion = parseInt(React3.version, 10);
1238 function isReactVersionAtLeast(reactVersionToCheck) {
1239 return majorVersion >= reactVersionToCheck;
1240 }
1241
1242 // node_modules/@base-ui/utils/esm/getReactElementRef.js
1243 function getReactElementRef(element) {
1244 if (!/* @__PURE__ */ React4.isValidElement(element)) {
1245 return null;
1246 }
1247 const reactElement = element;
1248 const propsWithRef = reactElement.props;
1249 return (isReactVersionAtLeast(19) ? propsWithRef?.ref : reactElement.ref) ?? null;
1250 }
1251
1252 // node_modules/@base-ui/utils/esm/mergeObjects.js
1253 function mergeObjects(a2, b2) {
1254 if (a2 && !b2) {
1255 return a2;
1256 }
1257 if (!a2 && b2) {
1258 return b2;
1259 }
1260 if (a2 || b2) {
1261 return {
1262 ...a2,
1263 ...b2
1264 };
1265 }
1266 return void 0;
1267 }
1268
1269 // node_modules/@base-ui/react/esm/utils/getStateAttributesProps.js
1270 function getStateAttributesProps(state, customMapping) {
1271 const props = {};
1272 for (const key in state) {
1273 const value = state[key];
1274 if (customMapping?.hasOwnProperty(key)) {
1275 const customProps = customMapping[key](value);
1276 if (customProps != null) {
1277 Object.assign(props, customProps);
1278 }
1279 continue;
1280 }
1281 if (value === true) {
1282 props[`data-${key.toLowerCase()}`] = "";
1283 } else if (value) {
1284 props[`data-${key.toLowerCase()}`] = value.toString();
1285 }
1286 }
1287 return props;
1288 }
1289
1290 // node_modules/@base-ui/react/esm/utils/resolveClassName.js
1291 function resolveClassName(className, state) {
1292 return typeof className === "function" ? className(state) : className;
1293 }
1294
1295 // node_modules/@base-ui/react/esm/utils/resolveStyle.js
1296 function resolveStyle(style, state) {
1297 return typeof style === "function" ? style(state) : style;
1298 }
1299
1300 // node_modules/@base-ui/react/esm/merge-props/mergeProps.js
1301 var EMPTY_PROPS = {};
1302 function mergeProps(a2, b2, c2, d2, e2) {
1303 if (!c2 && !d2 && !e2 && !a2) {
1304 return createInitialMergedProps(b2);
1305 }
1306 let merged = createInitialMergedProps(a2);
1307 if (b2) {
1308 merged = mergeInto(merged, b2);
1309 }
1310 if (c2) {
1311 merged = mergeInto(merged, c2);
1312 }
1313 if (d2) {
1314 merged = mergeInto(merged, d2);
1315 }
1316 if (e2) {
1317 merged = mergeInto(merged, e2);
1318 }
1319 return merged;
1320 }
1321 function mergePropsN(props) {
1322 if (props.length === 0) {
1323 return EMPTY_PROPS;
1324 }
1325 if (props.length === 1) {
1326 return createInitialMergedProps(props[0]);
1327 }
1328 let merged = createInitialMergedProps(props[0]);
1329 for (let i2 = 1; i2 < props.length; i2 += 1) {
1330 merged = mergeInto(merged, props[i2]);
1331 }
1332 return merged;
1333 }
1334 function createInitialMergedProps(inputProps) {
1335 if (isPropsGetter(inputProps)) {
1336 return {
1337 ...resolvePropsGetter(inputProps, EMPTY_PROPS)
1338 };
1339 }
1340 return copyInitialProps(inputProps);
1341 }
1342 function mergeInto(merged, inputProps) {
1343 if (isPropsGetter(inputProps)) {
1344 return resolvePropsGetter(inputProps, merged);
1345 }
1346 return mutablyMergeInto(merged, inputProps);
1347 }
1348 function copyInitialProps(inputProps) {
1349 const copiedProps = {
1350 ...inputProps
1351 };
1352 for (const propName in copiedProps) {
1353 const propValue = copiedProps[propName];
1354 if (isEventHandler(propName, propValue)) {
1355 copiedProps[propName] = wrapEventHandler(propValue);
1356 }
1357 }
1358 return copiedProps;
1359 }
1360 function mutablyMergeInto(mergedProps, externalProps) {
1361 if (!externalProps) {
1362 return mergedProps;
1363 }
1364 for (const propName in externalProps) {
1365 const externalPropValue = externalProps[propName];
1366 switch (propName) {
1367 case "style": {
1368 mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue);
1369 break;
1370 }
1371 case "className": {
1372 mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue);
1373 break;
1374 }
1375 default: {
1376 if (isEventHandler(propName, externalPropValue)) {
1377 mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue);
1378 } else {
1379 mergedProps[propName] = externalPropValue;
1380 }
1381 }
1382 }
1383 }
1384 return mergedProps;
1385 }
1386 function isEventHandler(key, value) {
1387 const code0 = key.charCodeAt(0);
1388 const code1 = key.charCodeAt(1);
1389 const code2 = key.charCodeAt(2);
1390 return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined");
1391 }
1392 function isPropsGetter(inputProps) {
1393 return typeof inputProps === "function";
1394 }
1395 function resolvePropsGetter(inputProps, previousProps) {
1396 if (isPropsGetter(inputProps)) {
1397 return inputProps(previousProps);
1398 }
1399 return inputProps ?? EMPTY_PROPS;
1400 }
1401 function mergeEventHandlers(ourHandler, theirHandler) {
1402 if (!theirHandler) {
1403 return ourHandler;
1404 }
1405 if (!ourHandler) {
1406 return wrapEventHandler(theirHandler);
1407 }
1408 return (event) => {
1409 if (isSyntheticEvent(event)) {
1410 const baseUIEvent = event;
1411 makeEventPreventable(baseUIEvent);
1412 const result2 = theirHandler(baseUIEvent);
1413 if (!baseUIEvent.baseUIHandlerPrevented) {
1414 ourHandler?.(baseUIEvent);
1415 }
1416 return result2;
1417 }
1418 const result = theirHandler(event);
1419 ourHandler?.(event);
1420 return result;
1421 };
1422 }
1423 function wrapEventHandler(handler) {
1424 if (!handler) {
1425 return handler;
1426 }
1427 return (event) => {
1428 if (isSyntheticEvent(event)) {
1429 makeEventPreventable(event);
1430 }
1431 return handler(event);
1432 };
1433 }
1434 function makeEventPreventable(event) {
1435 event.preventBaseUIHandler = () => {
1436 event.baseUIHandlerPrevented = true;
1437 };
1438 return event;
1439 }
1440 function mergeClassNames(ourClassName, theirClassName) {
1441 if (theirClassName) {
1442 if (ourClassName) {
1443 return theirClassName + " " + ourClassName;
1444 }
1445 return theirClassName;
1446 }
1447 return ourClassName;
1448 }
1449 function isSyntheticEvent(event) {
1450 return event != null && typeof event === "object" && "nativeEvent" in event;
1451 }
1452
1453 // node_modules/@base-ui/utils/esm/empty.js
1454 var EMPTY_ARRAY = Object.freeze([]);
1455 var EMPTY_OBJECT = Object.freeze({});
1456
1457 // node_modules/@base-ui/react/esm/utils/constants.js
1458 var BASE_UI_SWIPE_IGNORE_ATTRIBUTE = "data-base-ui-swipe-ignore";
1459 var LEGACY_SWIPE_IGNORE_ATTRIBUTE = "data-swipe-ignore";
1460 var BASE_UI_SWIPE_IGNORE_SELECTOR = `[${BASE_UI_SWIPE_IGNORE_ATTRIBUTE}]`;
1461 var LEGACY_SWIPE_IGNORE_SELECTOR = `[${LEGACY_SWIPE_IGNORE_ATTRIBUTE}]`;
1462
1463 // node_modules/@base-ui/react/esm/utils/useRenderElement.js
1464 var import_react = __toESM(require_react(), 1);
1465 function useRenderElement(element, componentProps, params = {}) {
1466 const renderProp = componentProps.render;
1467 const outProps = useRenderElementProps(componentProps, params);
1468 if (params.enabled === false) {
1469 return null;
1470 }
1471 const state = params.state ?? EMPTY_OBJECT;
1472 return evaluateRenderProp(element, renderProp, outProps, state);
1473 }
1474 function useRenderElementProps(componentProps, params = {}) {
1475 const {
1476 className: classNameProp,
1477 style: styleProp,
1478 render: renderProp
1479 } = componentProps;
1480 const {
1481 state = EMPTY_OBJECT,
1482 ref,
1483 props,
1484 stateAttributesMapping,
1485 enabled = true
1486 } = params;
1487 const className = enabled ? resolveClassName(classNameProp, state) : void 0;
1488 const style = enabled ? resolveStyle(styleProp, state) : void 0;
1489 const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping) : EMPTY_OBJECT;
1490 const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : void 0;
1491 const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT;
1492 if (typeof document !== "undefined") {
1493 if (!enabled) {
1494 useMergedRefs(null, null);
1495 } else if (Array.isArray(ref)) {
1496 outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]);
1497 } else {
1498 outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref);
1499 }
1500 }
1501 if (!enabled) {
1502 return EMPTY_OBJECT;
1503 }
1504 if (className !== void 0) {
1505 outProps.className = mergeClassNames(outProps.className, className);
1506 }
1507 if (style !== void 0) {
1508 outProps.style = mergeObjects(outProps.style, style);
1509 }
1510 return outProps;
1511 }
1512 function resolveRenderFunctionProps(props) {
1513 if (Array.isArray(props)) {
1514 return mergePropsN(props);
1515 }
1516 return mergeProps(void 0, props);
1517 }
1518 var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
1519 var COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/;
1520 var LOWERCASE_CHARACTER_PATTERN = /[a-z]/;
1521 function evaluateRenderProp(element, render4, props, state) {
1522 if (render4) {
1523 if (typeof render4 === "function") {
1524 if (true) {
1525 warnIfRenderPropLooksLikeComponent(render4);
1526 }
1527 return render4(props, state);
1528 }
1529 const mergedProps = mergeProps(props, render4.props);
1530 mergedProps.ref = props.ref;
1531 let newElement = render4;
1532 if (newElement?.$$typeof === REACT_LAZY_TYPE) {
1533 const children = React5.Children.toArray(render4);
1534 newElement = children[0];
1535 }
1536 if (true) {
1537 if (!/* @__PURE__ */ React5.isValidElement(newElement)) {
1538 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"));
1539 }
1540 }
1541 return /* @__PURE__ */ React5.cloneElement(newElement, mergedProps);
1542 }
1543 if (element) {
1544 if (typeof element === "string") {
1545 return renderTag(element, props);
1546 }
1547 }
1548 throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage_default(8));
1549 }
1550 function warnIfRenderPropLooksLikeComponent(renderFn) {
1551 const functionName = renderFn.name;
1552 if (functionName.length === 0) {
1553 return;
1554 }
1555 if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) {
1556 return;
1557 }
1558 if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) {
1559 return;
1560 }
1561 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");
1562 }
1563 function renderTag(Tag, props) {
1564 if (Tag === "button") {
1565 return /* @__PURE__ */ (0, import_react.createElement)("button", {
1566 type: "button",
1567 ...props,
1568 key: props.key
1569 });
1570 }
1571 if (Tag === "img") {
1572 return /* @__PURE__ */ (0, import_react.createElement)("img", {
1573 alt: "",
1574 ...props,
1575 key: props.key
1576 });
1577 }
1578 return /* @__PURE__ */ React5.createElement(Tag, props);
1579 }
1580
1581 // node_modules/@base-ui/react/esm/use-render/useRender.js
1582 function useRender(params) {
1583 return useRenderElement(params.defaultTagName ?? "div", params, params);
1584 }
1585
1586 // packages/icons/build-module/library/arrow-down.mjs
1587 var import_primitives = __toESM(require_primitives(), 1);
1588 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
1589 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", 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" }) });
1590
1591 // packages/icons/build-module/library/arrow-left.mjs
1592 var import_primitives2 = __toESM(require_primitives(), 1);
1593 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
1594 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", 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" }) });
1595
1596 // packages/icons/build-module/library/arrow-right.mjs
1597 var import_primitives3 = __toESM(require_primitives(), 1);
1598 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
1599 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", 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" }) });
1600
1601 // packages/icons/build-module/library/arrow-up.mjs
1602 var import_primitives4 = __toESM(require_primitives(), 1);
1603 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
1604 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", 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" }) });
1605
1606 // packages/icons/build-module/library/block-table.mjs
1607 var import_primitives5 = __toESM(require_primitives(), 1);
1608 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
1609 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", 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" }) });
1610
1611 // packages/icons/build-module/library/category.mjs
1612 var import_primitives6 = __toESM(require_primitives(), 1);
1613 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
1614 var category_default = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", 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" }) });
1615
1616 // packages/icons/build-module/library/check.mjs
1617 var import_primitives7 = __toESM(require_primitives(), 1);
1618 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
1619 var check_default = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", 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" }) });
1620
1621 // packages/icons/build-module/library/close-small.mjs
1622 var import_primitives8 = __toESM(require_primitives(), 1);
1623 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
1624 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", 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" }) });
1625
1626 // packages/icons/build-module/library/cog.mjs
1627 var import_primitives9 = __toESM(require_primitives(), 1);
1628 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
1629 var cog_default = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", 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" }) });
1630
1631 // packages/icons/build-module/library/envelope.mjs
1632 var import_primitives10 = __toESM(require_primitives(), 1);
1633 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
1634 var envelope_default = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.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" }) });
1635
1636 // packages/icons/build-module/library/error.mjs
1637 var import_primitives11 = __toESM(require_primitives(), 1);
1638 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
1639 var error_default = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.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" }) });
1640
1641 // packages/icons/build-module/library/format-list-bullets-rtl.mjs
1642 var import_primitives12 = __toESM(require_primitives(), 1);
1643 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
1644 var format_list_bullets_rtl_default = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.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" }) });
1645
1646 // packages/icons/build-module/library/format-list-bullets.mjs
1647 var import_primitives13 = __toESM(require_primitives(), 1);
1648 var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
1649 var format_list_bullets_default = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.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" }) });
1650
1651 // packages/icons/build-module/library/funnel.mjs
1652 var import_primitives14 = __toESM(require_primitives(), 1);
1653 var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
1654 var funnel_default = /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.Path, { d: "M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z" }) });
1655
1656 // packages/icons/build-module/library/link.mjs
1657 var import_primitives15 = __toESM(require_primitives(), 1);
1658 var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
1659 var link_default = /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_primitives15.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_primitives15.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" }) });
1660
1661 // packages/icons/build-module/library/mobile.mjs
1662 var import_primitives16 = __toESM(require_primitives(), 1);
1663 var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
1664 var mobile_default = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.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" }) });
1665
1666 // packages/icons/build-module/library/more-vertical.mjs
1667 var import_primitives17 = __toESM(require_primitives(), 1);
1668 var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
1669 var more_vertical_default = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.Path, { d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" }) });
1670
1671 // packages/icons/build-module/library/next.mjs
1672 var import_primitives18 = __toESM(require_primitives(), 1);
1673 var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
1674 var next_default = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_primitives18.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_primitives18.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" }) });
1675
1676 // packages/icons/build-module/library/previous.mjs
1677 var import_primitives19 = __toESM(require_primitives(), 1);
1678 var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1);
1679 var previous_default = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_primitives19.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_primitives19.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" }) });
1680
1681 // packages/icons/build-module/library/scheduled.mjs
1682 var import_primitives20 = __toESM(require_primitives(), 1);
1683 var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
1684 var scheduled_default = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_primitives20.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_primitives20.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" }) });
1685
1686 // packages/icons/build-module/library/search.mjs
1687 var import_primitives21 = __toESM(require_primitives(), 1);
1688 var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1);
1689 var search_default = /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_primitives21.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_primitives21.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" }) });
1690
1691 // packages/icons/build-module/library/seen.mjs
1692 var import_primitives22 = __toESM(require_primitives(), 1);
1693 var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1);
1694 var seen_default = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.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" }) });
1695
1696 // packages/icons/build-module/library/unseen.mjs
1697 var import_primitives23 = __toESM(require_primitives(), 1);
1698 var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1);
1699 var unseen_default = /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.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" }) });
1700
1701 // packages/ui/build-module/stack/stack.mjs
1702 var import_element2 = __toESM(require_element(), 1);
1703 if (typeof document !== "undefined" && true && !document.head.querySelector("style[data-wp-hash='b51ff41489']")) {
1704 const style = document.createElement("style");
1705 style.setAttribute("data-wp-hash", "b51ff41489");
1706 style.appendChild(document.createTextNode("@layer wp-ui-utilities, wp-ui-components, wp-ui-compositions, wp-ui-overrides;@layer wp-ui-components{._19ce0419607e1896__stack{display:flex}}"));
1707 document.head.appendChild(style);
1708 }
1709 var style_default = { "stack": "_19ce0419607e1896__stack" };
1710 var gapTokens = {
1711 xs: "var(--wpds-dimension-gap-xs, 4px)",
1712 sm: "var(--wpds-dimension-gap-sm, 8px)",
1713 md: "var(--wpds-dimension-gap-md, 12px)",
1714 lg: "var(--wpds-dimension-gap-lg, 16px)",
1715 xl: "var(--wpds-dimension-gap-xl, 24px)",
1716 "2xl": "var(--wpds-dimension-gap-2xl, 32px)",
1717 "3xl": "var(--wpds-dimension-gap-3xl, 40px)"
1718 };
1719 var Stack = (0, import_element2.forwardRef)(function Stack2({ direction, gap, align, justify, wrap, render: render4, ...props }, ref) {
1720 const style = {
1721 gap: gap && gapTokens[gap],
1722 alignItems: align,
1723 justifyContent: justify,
1724 flexDirection: direction,
1725 flexWrap: wrap
1726 };
1727 const element = useRender({
1728 render: render4,
1729 ref,
1730 props: mergeProps(props, { style, className: style_default.stack })
1731 });
1732 return element;
1733 });
1734
1735 // packages/dataviews/build-module/components/dataviews-context/index.mjs
1736 var import_element3 = __toESM(require_element(), 1);
1737
1738 // packages/dataviews/build-module/constants.mjs
1739 var import_i18n = __toESM(require_i18n(), 1);
1740 var OPERATOR_IS_ANY = "isAny";
1741 var OPERATOR_IS_NONE = "isNone";
1742 var OPERATOR_IS_ALL = "isAll";
1743 var OPERATOR_IS_NOT_ALL = "isNotAll";
1744 var OPERATOR_BETWEEN = "between";
1745 var OPERATOR_IN_THE_PAST = "inThePast";
1746 var OPERATOR_OVER = "over";
1747 var OPERATOR_IS = "is";
1748 var OPERATOR_IS_NOT = "isNot";
1749 var OPERATOR_LESS_THAN = "lessThan";
1750 var OPERATOR_GREATER_THAN = "greaterThan";
1751 var OPERATOR_LESS_THAN_OR_EQUAL = "lessThanOrEqual";
1752 var OPERATOR_GREATER_THAN_OR_EQUAL = "greaterThanOrEqual";
1753 var OPERATOR_BEFORE = "before";
1754 var OPERATOR_AFTER = "after";
1755 var OPERATOR_BEFORE_INC = "beforeInc";
1756 var OPERATOR_AFTER_INC = "afterInc";
1757 var OPERATOR_CONTAINS = "contains";
1758 var OPERATOR_NOT_CONTAINS = "notContains";
1759 var OPERATOR_STARTS_WITH = "startsWith";
1760 var OPERATOR_ON = "on";
1761 var OPERATOR_NOT_ON = "notOn";
1762 var SORTING_DIRECTIONS = ["asc", "desc"];
1763 var sortArrows = { asc: "\u2191", desc: "\u2193" };
1764 var sortValues = { asc: "ascending", desc: "descending" };
1765 var sortLabels = {
1766 asc: (0, import_i18n.__)("Sort ascending"),
1767 desc: (0, import_i18n.__)("Sort descending")
1768 };
1769 var sortIcons = {
1770 asc: arrow_up_default,
1771 desc: arrow_down_default
1772 };
1773 var LAYOUT_TABLE = "table";
1774 var LAYOUT_GRID = "grid";
1775 var LAYOUT_LIST = "list";
1776 var LAYOUT_ACTIVITY = "activity";
1777 var LAYOUT_PICKER_GRID = "pickerGrid";
1778 var LAYOUT_PICKER_TABLE = "pickerTable";
1779
1780 // packages/dataviews/build-module/components/dataviews-context/index.mjs
1781 var DataViewsContext = (0, import_element3.createContext)({
1782 view: { type: LAYOUT_TABLE },
1783 onChangeView: () => {
1784 },
1785 fields: [],
1786 data: [],
1787 paginationInfo: {
1788 totalItems: 0,
1789 totalPages: 0
1790 },
1791 selection: [],
1792 onChangeSelection: () => {
1793 },
1794 setOpenedFilter: () => {
1795 },
1796 openedFilter: null,
1797 getItemId: (item) => item.id,
1798 isItemClickable: () => true,
1799 renderItemLink: void 0,
1800 containerWidth: 0,
1801 containerRef: (0, import_element3.createRef)(),
1802 resizeObserverRef: () => {
1803 },
1804 defaultLayouts: { list: {}, grid: {}, table: {} },
1805 filters: [],
1806 isShowingFilter: false,
1807 setIsShowingFilter: () => {
1808 },
1809 hasInitiallyLoaded: false,
1810 config: {
1811 perPageSizes: []
1812 },
1813 intersectionObserver: null
1814 });
1815 DataViewsContext.displayName = "DataViewsContext";
1816 var dataviews_context_default = DataViewsContext;
1817
1818 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
1819 var import_i18n21 = __toESM(require_i18n(), 1);
1820
1821 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
1822 var import_i18n9 = __toESM(require_i18n(), 1);
1823 var import_components6 = __toESM(require_components(), 1);
1824 var import_element11 = __toESM(require_element(), 1);
1825 var import_keycodes = __toESM(require_keycodes(), 1);
1826
1827 // packages/dataviews/build-module/components/dataviews-selection-checkbox/index.mjs
1828 var import_components = __toESM(require_components(), 1);
1829 var import_i18n2 = __toESM(require_i18n(), 1);
1830 var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1);
1831 function DataViewsSelectionCheckbox({
1832 selection,
1833 onChangeSelection,
1834 item,
1835 getItemId,
1836 titleField,
1837 disabled,
1838 ...extraProps
1839 }) {
1840 const id = getItemId(item);
1841 const isInSelectionArray = selection.includes(id);
1842 const checked = !disabled && isInSelectionArray;
1843 const selectionLabel = titleField?.getValue?.({ item }) || (0, import_i18n2.__)("(no title)");
1844 return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1845 import_components.CheckboxControl,
1846 {
1847 className: "dataviews-selection-checkbox",
1848 "aria-label": selectionLabel,
1849 "aria-disabled": disabled,
1850 checked,
1851 onChange: () => {
1852 if (disabled) {
1853 return;
1854 }
1855 onChangeSelection(
1856 isInSelectionArray ? selection.filter((itemId) => id !== itemId) : [...selection, id]
1857 );
1858 },
1859 ...extraProps
1860 }
1861 );
1862 }
1863
1864 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
1865 var import_components2 = __toESM(require_components(), 1);
1866 var import_i18n3 = __toESM(require_i18n(), 1);
1867 var import_element4 = __toESM(require_element(), 1);
1868 var import_data4 = __toESM(require_data(), 1);
1869 var import_compose = __toESM(require_compose(), 1);
1870
1871 // packages/dataviews/build-module/lock-unlock.mjs
1872 var import_private_apis2 = __toESM(require_private_apis(), 1);
1873 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
1874 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
1875 "@wordpress/dataviews"
1876 );
1877
1878 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
1879 var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
1880 var { Menu, kebabCase } = unlock2(import_components2.privateApis);
1881 function ButtonTrigger({
1882 action,
1883 onClick,
1884 items,
1885 variant
1886 }) {
1887 const label = typeof action.label === "string" ? action.label : action.label(items);
1888 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1889 import_components2.Button,
1890 {
1891 disabled: !!action.disabled,
1892 accessibleWhenDisabled: true,
1893 size: "compact",
1894 variant,
1895 onClick,
1896 children: label
1897 }
1898 );
1899 }
1900 function MenuItemTrigger({
1901 action,
1902 onClick,
1903 items
1904 }) {
1905 const label = typeof action.label === "string" ? action.label : action.label(items);
1906 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Item, { disabled: action.disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.ItemLabel, { children: label }) });
1907 }
1908 function ActionModal({
1909 action,
1910 items,
1911 closeModal
1912 }) {
1913 const label = typeof action.label === "string" ? action.label : action.label(items);
1914 const modalHeader = typeof action.modalHeader === "function" ? action.modalHeader(items) : action.modalHeader;
1915 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1916 import_components2.Modal,
1917 {
1918 title: modalHeader || label,
1919 __experimentalHideHeader: !!action.hideModalHeader,
1920 onRequestClose: closeModal,
1921 focusOnMount: action.modalFocusOnMount ?? true,
1922 size: action.modalSize || "medium",
1923 overlayClassName: `dataviews-action-modal dataviews-action-modal__${kebabCase(
1924 action.id
1925 )}`,
1926 children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(action.RenderModal, { items, closeModal })
1927 }
1928 );
1929 }
1930 function ActionsMenuGroup({
1931 actions,
1932 item,
1933 registry,
1934 setActiveModalAction
1935 }) {
1936 const { primaryActions, regularActions } = (0, import_element4.useMemo)(() => {
1937 return actions.reduce(
1938 (acc, action) => {
1939 (action.isPrimary ? acc.primaryActions : acc.regularActions).push(action);
1940 return acc;
1941 },
1942 {
1943 primaryActions: [],
1944 regularActions: []
1945 }
1946 );
1947 }, [actions]);
1948 const renderActionGroup = (actionList) => actionList.map((action) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1949 MenuItemTrigger,
1950 {
1951 action,
1952 onClick: () => {
1953 if ("RenderModal" in action) {
1954 setActiveModalAction(action);
1955 return;
1956 }
1957 action.callback([item], { registry });
1958 },
1959 items: [item]
1960 },
1961 action.id
1962 ));
1963 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Menu.Group, { children: [
1964 renderActionGroup(primaryActions),
1965 renderActionGroup(regularActions)
1966 ] });
1967 }
1968 function ItemActions({
1969 item,
1970 actions,
1971 isCompact
1972 }) {
1973 const registry = (0, import_data4.useRegistry)();
1974 const { primaryActions, eligibleActions } = (0, import_element4.useMemo)(() => {
1975 const _eligibleActions = actions.filter(
1976 (action) => !action.isEligible || action.isEligible(item)
1977 );
1978 const _primaryActions = _eligibleActions.filter(
1979 (action) => action.isPrimary
1980 );
1981 return {
1982 primaryActions: _primaryActions,
1983 eligibleActions: _eligibleActions
1984 };
1985 }, [actions, item]);
1986 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
1987 if (isCompact) {
1988 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1989 CompactItemActions,
1990 {
1991 item,
1992 actions: eligibleActions,
1993 isSmall: true,
1994 registry
1995 }
1996 );
1997 }
1998 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1999 Stack,
2000 {
2001 direction: "row",
2002 justify: "flex-end",
2003 className: "dataviews-item-actions",
2004 style: {
2005 flexShrink: 0,
2006 width: "auto"
2007 },
2008 children: [
2009 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2010 PrimaryActions,
2011 {
2012 item,
2013 actions: primaryActions,
2014 registry
2015 }
2016 ),
2017 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
2018 // there if there are any actions at all.
2019 isMobileViewport) && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2020 CompactItemActions,
2021 {
2022 item,
2023 actions: eligibleActions,
2024 registry
2025 }
2026 )
2027 ]
2028 }
2029 );
2030 }
2031 function CompactItemActions({
2032 item,
2033 actions,
2034 isSmall,
2035 registry
2036 }) {
2037 const [activeModalAction, setActiveModalAction] = (0, import_element4.useState)(
2038 null
2039 );
2040 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
2041 /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Menu, { placement: "bottom-end", children: [
2042 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2043 Menu.TriggerButton,
2044 {
2045 render: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2046 import_components2.Button,
2047 {
2048 size: isSmall ? "small" : "compact",
2049 icon: more_vertical_default,
2050 label: (0, import_i18n3.__)("Actions"),
2051 accessibleWhenDisabled: true,
2052 disabled: !actions.length,
2053 className: "dataviews-all-actions-button"
2054 }
2055 )
2056 }
2057 ),
2058 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2059 ActionsMenuGroup,
2060 {
2061 actions,
2062 item,
2063 registry,
2064 setActiveModalAction
2065 }
2066 ) })
2067 ] }),
2068 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2069 ActionModal,
2070 {
2071 action: activeModalAction,
2072 items: [item],
2073 closeModal: () => setActiveModalAction(null)
2074 }
2075 )
2076 ] });
2077 }
2078 function PrimaryActions({
2079 item,
2080 actions,
2081 registry,
2082 buttonVariant
2083 }) {
2084 const [activeModalAction, setActiveModalAction] = (0, import_element4.useState)(null);
2085 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
2086 if (isMobileViewport) {
2087 return null;
2088 }
2089 if (!Array.isArray(actions) || actions.length === 0) {
2090 return null;
2091 }
2092 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
2093 actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2094 ButtonTrigger,
2095 {
2096 action,
2097 onClick: () => {
2098 if ("RenderModal" in action) {
2099 setActiveModalAction(action);
2100 return;
2101 }
2102 action.callback([item], { registry });
2103 },
2104 items: [item],
2105 variant: buttonVariant
2106 },
2107 action.id
2108 )),
2109 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2110 ActionModal,
2111 {
2112 action: activeModalAction,
2113 items: [item],
2114 closeModal: () => setActiveModalAction(null)
2115 }
2116 )
2117 ] });
2118 }
2119
2120 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
2121 var import_components3 = __toESM(require_components(), 1);
2122 var import_i18n5 = __toESM(require_i18n(), 1);
2123 var import_element5 = __toESM(require_element(), 1);
2124 var import_data5 = __toESM(require_data(), 1);
2125 var import_compose2 = __toESM(require_compose(), 1);
2126
2127 // packages/dataviews/build-module/utils/get-footer-message.mjs
2128 var import_i18n4 = __toESM(require_i18n(), 1);
2129 function getFooterMessage(selectionCount, itemsCount, totalItems, onlyTotalCount = false) {
2130 if (selectionCount > 0) {
2131 return (0, import_i18n4.sprintf)(
2132 /* translators: %d: number of items. */
2133 (0, import_i18n4._n)("%d Item selected", "%d Items selected", selectionCount),
2134 selectionCount
2135 );
2136 }
2137 if (onlyTotalCount || totalItems <= itemsCount) {
2138 return (0, import_i18n4.sprintf)(
2139 /* translators: %d: number of items. */
2140 (0, import_i18n4._n)("%d Item", "%d Items", totalItems),
2141 totalItems
2142 );
2143 }
2144 return (0, import_i18n4.sprintf)(
2145 /* translators: %1$d: number of items. %2$d: total number of items. */
2146 (0, import_i18n4._n)("%1$d of %2$d Item", "%1$d of %2$d Items", totalItems),
2147 itemsCount,
2148 totalItems
2149 );
2150 }
2151
2152 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
2153 var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
2154 function ActionWithModal({
2155 action,
2156 items,
2157 ActionTriggerComponent
2158 }) {
2159 const [isModalOpen, setIsModalOpen] = (0, import_element5.useState)(false);
2160 const actionTriggerProps = {
2161 action,
2162 onClick: () => {
2163 setIsModalOpen(true);
2164 },
2165 items
2166 };
2167 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2168 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ActionTriggerComponent, { ...actionTriggerProps }),
2169 isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2170 ActionModal,
2171 {
2172 action,
2173 items,
2174 closeModal: () => setIsModalOpen(false)
2175 }
2176 )
2177 ] });
2178 }
2179 function useHasAPossibleBulkAction(actions, item) {
2180 return (0, import_element5.useMemo)(() => {
2181 return actions.some((action) => {
2182 return action.supportsBulk && (!action.isEligible || action.isEligible(item));
2183 });
2184 }, [actions, item]);
2185 }
2186 function useSomeItemHasAPossibleBulkAction(actions, data) {
2187 return (0, import_element5.useMemo)(() => {
2188 return data.some((item) => {
2189 return actions.some((action) => {
2190 return action.supportsBulk && (!action.isEligible || action.isEligible(item));
2191 });
2192 });
2193 }, [actions, data]);
2194 }
2195 function BulkSelectionCheckbox({
2196 selection,
2197 onChangeSelection,
2198 data,
2199 actions,
2200 getItemId,
2201 disableSelectAll = false
2202 }) {
2203 const selectableItems = (0, import_element5.useMemo)(() => {
2204 return data.filter((item) => {
2205 return actions.some(
2206 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item))
2207 );
2208 });
2209 }, [data, actions]);
2210 const selectedItems = data.filter(
2211 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
2212 );
2213 const hasSelection = selection.length > 0;
2214 const areAllSelected = selectedItems.length === selectableItems.length;
2215 if (disableSelectAll) {
2216 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2217 import_components3.CheckboxControl,
2218 {
2219 className: "dataviews-view-table-selection-checkbox",
2220 checked: hasSelection,
2221 disabled: !hasSelection,
2222 onChange: () => {
2223 onChangeSelection([]);
2224 },
2225 "aria-label": (0, import_i18n5.__)("Deselect all")
2226 }
2227 );
2228 }
2229 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2230 import_components3.CheckboxControl,
2231 {
2232 className: "dataviews-view-table-selection-checkbox",
2233 checked: areAllSelected,
2234 indeterminate: !areAllSelected && !!selectedItems.length,
2235 onChange: () => {
2236 if (areAllSelected) {
2237 onChangeSelection([]);
2238 } else {
2239 onChangeSelection(
2240 selectableItems.map((item) => getItemId(item))
2241 );
2242 }
2243 },
2244 "aria-label": areAllSelected ? (0, import_i18n5.__)("Deselect all") : (0, import_i18n5.__)("Select all")
2245 }
2246 );
2247 }
2248 function ActionTrigger({
2249 action,
2250 onClick,
2251 isBusy,
2252 items
2253 }) {
2254 const label = typeof action.label === "string" ? action.label : action.label(items);
2255 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
2256 if (isMobile) {
2257 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2258 import_components3.Button,
2259 {
2260 disabled: isBusy,
2261 accessibleWhenDisabled: true,
2262 label,
2263 icon: action.icon,
2264 size: "compact",
2265 onClick,
2266 isBusy
2267 }
2268 );
2269 }
2270 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2271 import_components3.Button,
2272 {
2273 disabled: isBusy,
2274 accessibleWhenDisabled: true,
2275 size: "compact",
2276 onClick,
2277 isBusy,
2278 children: label
2279 }
2280 );
2281 }
2282 var EMPTY_ARRAY2 = [];
2283 function ActionButton({
2284 action,
2285 selectedItems,
2286 actionInProgress,
2287 setActionInProgress
2288 }) {
2289 const registry = (0, import_data5.useRegistry)();
2290 const selectedEligibleItems = (0, import_element5.useMemo)(() => {
2291 return selectedItems.filter((item) => {
2292 return !action.isEligible || action.isEligible(item);
2293 });
2294 }, [action, selectedItems]);
2295 if ("RenderModal" in action) {
2296 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2297 ActionWithModal,
2298 {
2299 action,
2300 items: selectedEligibleItems,
2301 ActionTriggerComponent: ActionTrigger
2302 },
2303 action.id
2304 );
2305 }
2306 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2307 ActionTrigger,
2308 {
2309 action,
2310 onClick: async () => {
2311 setActionInProgress(action.id);
2312 await action.callback(selectedItems, {
2313 registry
2314 });
2315 setActionInProgress(null);
2316 },
2317 items: selectedEligibleItems,
2318 isBusy: actionInProgress === action.id
2319 },
2320 action.id
2321 );
2322 }
2323 function renderFooterContent(data, actions, getItemId, isInfiniteScroll, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection, paginationInfo) {
2324 const message2 = getFooterMessage(
2325 selection.length,
2326 data.length,
2327 paginationInfo.totalItems,
2328 isInfiniteScroll
2329 );
2330 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2331 Stack,
2332 {
2333 direction: "row",
2334 className: "dataviews-bulk-actions-footer__container",
2335 gap: "md",
2336 align: "center",
2337 children: [
2338 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2339 BulkSelectionCheckbox,
2340 {
2341 selection,
2342 onChangeSelection,
2343 data,
2344 actions,
2345 getItemId,
2346 disableSelectAll: isInfiniteScroll
2347 }
2348 ),
2349 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "dataviews-bulk-actions-footer__item-count", children: message2 }),
2350 /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2351 Stack,
2352 {
2353 direction: "row",
2354 className: "dataviews-bulk-actions-footer__action-buttons",
2355 gap: "xs",
2356 children: [
2357 actionsToShow.map((action) => {
2358 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2359 ActionButton,
2360 {
2361 action,
2362 selectedItems,
2363 actionInProgress,
2364 setActionInProgress
2365 },
2366 action.id
2367 );
2368 }),
2369 selectedItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2370 import_components3.Button,
2371 {
2372 icon: close_small_default,
2373 showTooltip: true,
2374 tooltipPosition: "top",
2375 size: "compact",
2376 label: (0, import_i18n5.__)("Cancel"),
2377 disabled: !!actionInProgress,
2378 accessibleWhenDisabled: false,
2379 onClick: () => {
2380 onChangeSelection(EMPTY_ARRAY2);
2381 }
2382 }
2383 )
2384 ]
2385 }
2386 )
2387 ]
2388 }
2389 );
2390 }
2391 function FooterContent({
2392 selection,
2393 actions,
2394 onChangeSelection,
2395 data,
2396 getItemId,
2397 isInfiniteScroll,
2398 paginationInfo
2399 }) {
2400 const [actionInProgress, setActionInProgress] = (0, import_element5.useState)(
2401 null
2402 );
2403 const footerContentRef = (0, import_element5.useRef)(void 0);
2404 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
2405 const bulkActions = (0, import_element5.useMemo)(
2406 () => actions.filter((action) => action.supportsBulk),
2407 [actions]
2408 );
2409 const selectableItems = (0, import_element5.useMemo)(() => {
2410 return data.filter((item) => {
2411 return bulkActions.some(
2412 (action) => !action.isEligible || action.isEligible(item)
2413 );
2414 });
2415 }, [data, bulkActions]);
2416 const selectedItems = (0, import_element5.useMemo)(() => {
2417 return data.filter(
2418 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
2419 );
2420 }, [selection, data, getItemId, selectableItems]);
2421 const actionsToShow = (0, import_element5.useMemo)(
2422 () => actions.filter((action) => {
2423 return action.supportsBulk && (!isMobile || action.icon) && selectedItems.some(
2424 (item) => !action.isEligible || action.isEligible(item)
2425 );
2426 }),
2427 [actions, selectedItems, isMobile]
2428 );
2429 if (!actionInProgress) {
2430 if (footerContentRef.current) {
2431 footerContentRef.current = void 0;
2432 }
2433 return renderFooterContent(
2434 data,
2435 actions,
2436 getItemId,
2437 isInfiniteScroll,
2438 selection,
2439 actionsToShow,
2440 selectedItems,
2441 actionInProgress,
2442 setActionInProgress,
2443 onChangeSelection,
2444 paginationInfo
2445 );
2446 } else if (!footerContentRef.current) {
2447 footerContentRef.current = renderFooterContent(
2448 data,
2449 actions,
2450 getItemId,
2451 isInfiniteScroll,
2452 selection,
2453 actionsToShow,
2454 selectedItems,
2455 actionInProgress,
2456 setActionInProgress,
2457 onChangeSelection,
2458 paginationInfo
2459 );
2460 }
2461 return footerContentRef.current;
2462 }
2463 function BulkActionsFooter() {
2464 const {
2465 data,
2466 selection,
2467 actions = EMPTY_ARRAY2,
2468 onChangeSelection,
2469 getItemId,
2470 paginationInfo,
2471 view
2472 } = (0, import_element5.useContext)(dataviews_context_default);
2473 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2474 FooterContent,
2475 {
2476 selection,
2477 onChangeSelection,
2478 data,
2479 actions,
2480 getItemId,
2481 isInfiniteScroll: !!view.infiniteScrollEnabled,
2482 paginationInfo
2483 }
2484 );
2485 }
2486
2487 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
2488 var import_i18n6 = __toESM(require_i18n(), 1);
2489 var import_components4 = __toESM(require_components(), 1);
2490 var import_element6 = __toESM(require_element(), 1);
2491
2492 // packages/dataviews/build-module/utils/get-hideable-fields.mjs
2493 function getHideableFields(view, fields) {
2494 const togglableFields = [
2495 view?.titleField,
2496 view?.mediaField,
2497 view?.descriptionField
2498 ].filter(Boolean);
2499 return fields.filter(
2500 (f2) => !togglableFields.includes(f2.id) && f2.type !== "media" && f2.enableHiding !== false
2501 );
2502 }
2503
2504 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
2505 var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
2506 var { Menu: Menu2 } = unlock2(import_components4.privateApis);
2507 function WithMenuSeparators({ children }) {
2508 return import_element6.Children.toArray(children).filter(Boolean).map((child, i2) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_element6.Fragment, { children: [
2509 i2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Separator, {}),
2510 child
2511 ] }, i2));
2512 }
2513 var _HeaderMenu = (0, import_element6.forwardRef)(function HeaderMenu({
2514 fieldId,
2515 view,
2516 fields,
2517 onChangeView,
2518 onHide,
2519 setOpenedFilter,
2520 canMove = true,
2521 canInsertLeft = true,
2522 canInsertRight = true
2523 }, ref) {
2524 const visibleFieldIds = view.fields ?? [];
2525 const index = visibleFieldIds?.indexOf(fieldId);
2526 const isSorted = view.sort?.field === fieldId;
2527 let isHidable = false;
2528 let isSortable = false;
2529 let canAddFilter = false;
2530 let operators = [];
2531 const field = fields.find((f2) => f2.id === fieldId);
2532 const { setIsShowingFilter } = (0, import_element6.useContext)(dataviews_context_default);
2533 if (!field) {
2534 return null;
2535 }
2536 isHidable = field.enableHiding !== false;
2537 isSortable = field.enableSorting !== false;
2538 const header = field.header;
2539 operators = !!field.filterBy && field.filterBy?.operators || [];
2540 canAddFilter = !view.filters?.some((_filter) => fieldId === _filter.field) && !!(field.hasElements || field.Edit) && field.filterBy !== false && !field.filterBy?.isPrimary;
2541 if (!isSortable && !canMove && !isHidable && !canAddFilter) {
2542 return header;
2543 }
2544 const hiddenFields = getHideableFields(view, fields).filter(
2545 (f2) => !visibleFieldIds.includes(f2.id)
2546 );
2547 const canInsert = (canInsertLeft || canInsertRight) && !!hiddenFields.length;
2548 const isRtl = (0, import_i18n6.isRTL)();
2549 return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [
2550 /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
2551 Menu2.TriggerButton,
2552 {
2553 render: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2554 import_components4.Button,
2555 {
2556 size: "compact",
2557 className: "dataviews-view-table-header-button",
2558 ref,
2559 variant: "tertiary"
2560 }
2561 ),
2562 children: [
2563 header,
2564 view.sort && isSorted && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { "aria-hidden": "true", children: sortArrows[view.sort.direction] })
2565 ]
2566 }
2567 ),
2568 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { style: { minWidth: "240px" }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(WithMenuSeparators, { children: [
2569 isSortable && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Group, { children: SORTING_DIRECTIONS.map(
2570 (direction) => {
2571 const isChecked = view.sort && isSorted && view.sort.direction === direction;
2572 const value = `${fieldId}-${direction}`;
2573 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2574 Menu2.RadioItem,
2575 {
2576 name: "view-table-sorting",
2577 value,
2578 checked: isChecked,
2579 onChange: () => {
2580 onChangeView({
2581 ...view,
2582 sort: {
2583 field: fieldId,
2584 direction
2585 },
2586 showLevels: false
2587 });
2588 },
2589 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: sortLabels[direction] })
2590 },
2591 value
2592 );
2593 }
2594 ) }),
2595 canAddFilter && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2596 Menu2.Item,
2597 {
2598 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: funnel_default }),
2599 onClick: () => {
2600 setOpenedFilter(fieldId);
2601 setIsShowingFilter(true);
2602 onChangeView({
2603 ...view,
2604 page: 1,
2605 filters: [
2606 ...view.filters || [],
2607 {
2608 field: fieldId,
2609 value: void 0,
2610 operator: operators[0]
2611 }
2612 ]
2613 });
2614 },
2615 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Add filter") })
2616 }
2617 ) }),
2618 (canMove || isHidable || canInsert) && field && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2.Group, { children: [
2619 canMove && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2620 Menu2.Item,
2621 {
2622 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: arrow_left_default }),
2623 disabled: isRtl ? index >= visibleFieldIds.length - 1 : index < 1,
2624 onClick: () => {
2625 const targetIndex = isRtl ? index + 1 : index - 1;
2626 const newFields = [
2627 ...visibleFieldIds
2628 ];
2629 newFields.splice(index, 1);
2630 newFields.splice(
2631 targetIndex,
2632 0,
2633 fieldId
2634 );
2635 onChangeView({
2636 ...view,
2637 fields: newFields
2638 });
2639 },
2640 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Move left") })
2641 }
2642 ),
2643 canMove && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2644 Menu2.Item,
2645 {
2646 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: arrow_right_default }),
2647 disabled: isRtl ? index < 1 : index >= visibleFieldIds.length - 1,
2648 onClick: () => {
2649 const targetIndex = isRtl ? index - 1 : index + 1;
2650 const newFields = [
2651 ...visibleFieldIds
2652 ];
2653 newFields.splice(index, 1);
2654 newFields.splice(
2655 targetIndex,
2656 0,
2657 fieldId
2658 );
2659 onChangeView({
2660 ...view,
2661 fields: newFields
2662 });
2663 },
2664 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Move right") })
2665 }
2666 ),
2667 canInsertLeft && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [
2668 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Insert left") }) }),
2669 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
2670 const insertIndex = isRtl ? index + 1 : index;
2671 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2672 Menu2.Item,
2673 {
2674 onClick: () => {
2675 onChangeView({
2676 ...view,
2677 fields: [
2678 ...visibleFieldIds.slice(
2679 0,
2680 insertIndex
2681 ),
2682 hiddenField.id,
2683 ...visibleFieldIds.slice(
2684 insertIndex
2685 )
2686 ]
2687 });
2688 },
2689 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
2690 },
2691 hiddenField.id
2692 );
2693 }) })
2694 ] }),
2695 canInsertRight && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [
2696 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Insert right") }) }),
2697 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
2698 const insertIndex = isRtl ? index : index + 1;
2699 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2700 Menu2.Item,
2701 {
2702 onClick: () => {
2703 onChangeView({
2704 ...view,
2705 fields: [
2706 ...visibleFieldIds.slice(
2707 0,
2708 insertIndex
2709 ),
2710 hiddenField.id,
2711 ...visibleFieldIds.slice(
2712 insertIndex
2713 )
2714 ]
2715 });
2716 },
2717 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
2718 },
2719 hiddenField.id
2720 );
2721 }) })
2722 ] }),
2723 isHidable && field && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2724 Menu2.Item,
2725 {
2726 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: unseen_default }),
2727 onClick: () => {
2728 onHide(field);
2729 onChangeView({
2730 ...view,
2731 fields: visibleFieldIds.filter(
2732 (id) => id !== fieldId
2733 )
2734 });
2735 },
2736 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Hide column") })
2737 }
2738 )
2739 ] })
2740 ] }) })
2741 ] });
2742 });
2743 var ColumnHeaderMenu = _HeaderMenu;
2744 var column_header_menu_default = ColumnHeaderMenu;
2745
2746 // packages/dataviews/build-module/components/dataviews-layouts/utils/item-click-wrapper.mjs
2747 var import_element7 = __toESM(require_element(), 1);
2748 var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
2749 function getClickableItemProps({
2750 item,
2751 isItemClickable,
2752 onClickItem,
2753 className
2754 }) {
2755 if (!isItemClickable(item) || !onClickItem) {
2756 return { className };
2757 }
2758 return {
2759 className: className ? `${className} ${className}--clickable` : void 0,
2760 role: "button",
2761 tabIndex: 0,
2762 onClick: (event) => {
2763 event.stopPropagation();
2764 onClickItem(item);
2765 },
2766 onKeyDown: (event) => {
2767 if (event.key === "Enter" || event.key === "" || event.key === " ") {
2768 event.stopPropagation();
2769 onClickItem(item);
2770 }
2771 }
2772 };
2773 }
2774 function ItemClickWrapper({
2775 item,
2776 isItemClickable,
2777 onClickItem,
2778 renderItemLink,
2779 className,
2780 children,
2781 ...extraProps
2782 }) {
2783 if (!isItemClickable(item)) {
2784 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className, ...extraProps, children });
2785 }
2786 if (renderItemLink) {
2787 const renderedElement = renderItemLink({
2788 item,
2789 className: `${className} ${className}--clickable`,
2790 ...extraProps,
2791 children
2792 });
2793 return (0, import_element7.cloneElement)(renderedElement, {
2794 onClick: (event) => {
2795 event.stopPropagation();
2796 if (renderedElement.props.onClick) {
2797 renderedElement.props.onClick(event);
2798 }
2799 },
2800 onKeyDown: (event) => {
2801 if (event.key === "Enter" || event.key === "" || event.key === " ") {
2802 event.stopPropagation();
2803 if (renderedElement.props.onKeyDown) {
2804 renderedElement.props.onKeyDown(event);
2805 }
2806 }
2807 }
2808 });
2809 }
2810 const clickProps = getClickableItemProps({
2811 item,
2812 isItemClickable,
2813 onClickItem,
2814 className
2815 });
2816 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { ...clickProps, ...extraProps, children });
2817 }
2818
2819 // packages/dataviews/build-module/components/dataviews-layouts/table/column-primary.mjs
2820 var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
2821 function ColumnPrimary({
2822 item,
2823 level,
2824 titleField,
2825 mediaField,
2826 descriptionField,
2827 onClickItem,
2828 renderItemLink,
2829 isItemClickable
2830 }) {
2831 return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(Stack, { direction: "row", gap: "md", align: "flex-start", justify: "flex-start", children: [
2832 mediaField && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2833 ItemClickWrapper,
2834 {
2835 item,
2836 isItemClickable,
2837 onClickItem,
2838 renderItemLink,
2839 className: "dataviews-view-table__cell-content-wrapper dataviews-column-primary__media",
2840 "aria-label": isItemClickable(item) && (!!onClickItem || !!renderItemLink) && !!titleField ? titleField.getValue?.({ item }) : void 0,
2841 children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2842 mediaField.render,
2843 {
2844 item,
2845 field: mediaField,
2846 config: { sizes: "32px" }
2847 }
2848 )
2849 }
2850 ),
2851 /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
2852 Stack,
2853 {
2854 direction: "column",
2855 align: "flex-start",
2856 className: "dataviews-view-table__primary-column-content",
2857 children: [
2858 titleField && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
2859 ItemClickWrapper,
2860 {
2861 item,
2862 isItemClickable,
2863 onClickItem,
2864 renderItemLink,
2865 className: "dataviews-view-table__cell-content-wrapper dataviews-title-field",
2866 children: [
2867 level !== void 0 && level > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "dataviews-view-table__level", children: [
2868 Array(level).fill("\u2014").join(" "),
2869 "\xA0"
2870 ] }),
2871 /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(titleField.render, { item, field: titleField })
2872 ]
2873 }
2874 ),
2875 descriptionField && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2876 descriptionField.render,
2877 {
2878 item,
2879 field: descriptionField
2880 }
2881 )
2882 ]
2883 }
2884 )
2885 ] });
2886 }
2887 var column_primary_default = ColumnPrimary;
2888
2889 // packages/dataviews/build-module/components/dataviews-layouts/table/use-scroll-state.mjs
2890 var import_element8 = __toESM(require_element(), 1);
2891 var import_i18n7 = __toESM(require_i18n(), 1);
2892 var isScrolledToEnd = (element) => {
2893 if ((0, import_i18n7.isRTL)()) {
2894 const scrollLeft = Math.abs(element.scrollLeft);
2895 return scrollLeft <= 1;
2896 }
2897 return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
2898 };
2899 function useScrollState({
2900 scrollContainerRef,
2901 enabledHorizontal = false
2902 }) {
2903 const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = (0, import_element8.useState)(false);
2904 const [isVerticallyScrolled, setIsVerticallyScrolled] = (0, import_element8.useState)(false);
2905 const handleScroll = (0, import_element8.useCallback)(() => {
2906 const scrollContainer = scrollContainerRef.current;
2907 if (!scrollContainer) {
2908 return;
2909 }
2910 if (enabledHorizontal) {
2911 setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer));
2912 }
2913 setIsVerticallyScrolled(scrollContainer.scrollTop > 0);
2914 }, [scrollContainerRef, enabledHorizontal]);
2915 (0, import_element8.useEffect)(() => {
2916 if (typeof window === "undefined" || !scrollContainerRef.current) {
2917 return () => {
2918 };
2919 }
2920 const scrollContainer = scrollContainerRef.current;
2921 handleScroll();
2922 scrollContainer.addEventListener("scroll", handleScroll);
2923 window.addEventListener("resize", handleScroll);
2924 return () => {
2925 scrollContainer.removeEventListener("scroll", handleScroll);
2926 window.removeEventListener("resize", handleScroll);
2927 };
2928 }, [scrollContainerRef, enabledHorizontal, handleScroll]);
2929 return { isHorizontalScrollEnd, isVerticallyScrolled };
2930 }
2931
2932 // packages/dataviews/build-module/components/dataviews-layouts/utils/get-data-by-group.mjs
2933 function getDataByGroup(data, groupByField) {
2934 return data.reduce((groups, item) => {
2935 const groupName = groupByField.getValue({ item });
2936 if (!groups.has(groupName)) {
2937 groups.set(groupName, []);
2938 }
2939 groups.get(groupName)?.push(item);
2940 return groups;
2941 }, /* @__PURE__ */ new Map());
2942 }
2943
2944 // packages/dataviews/build-module/components/dataviews-view-config/properties-section.mjs
2945 var import_components5 = __toESM(require_components(), 1);
2946 var import_i18n8 = __toESM(require_i18n(), 1);
2947 var import_element9 = __toESM(require_element(), 1);
2948 var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1);
2949 function FieldItem({
2950 field,
2951 isVisible: isVisible2,
2952 onToggleVisibility
2953 }) {
2954 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components5.__experimentalItem, { onClick: field.enableHiding ? onToggleVisibility : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Stack, { direction: "row", gap: "sm", justify: "flex-start", align: "center", children: [
2955 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { style: { height: 24, width: 24 }, children: isVisible2 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components5.Icon, { icon: check_default }) }),
2956 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "dataviews-view-config__label", children: field.label })
2957 ] }) });
2958 }
2959 function isDefined(item) {
2960 return !!item;
2961 }
2962 function PropertiesSection({
2963 showLabel = true
2964 }) {
2965 const { view, fields, onChangeView } = (0, import_element9.useContext)(dataviews_context_default);
2966 const regularFields = getHideableFields(view, fields);
2967 if (!regularFields?.length) {
2968 return null;
2969 }
2970 const titleField = fields.find((f2) => f2.id === view.titleField);
2971 const previewField2 = fields.find((f2) => f2.id === view.mediaField);
2972 const descriptionField = fields.find(
2973 (f2) => f2.id === view.descriptionField
2974 );
2975 const lockedFields = [
2976 {
2977 field: titleField,
2978 isVisibleFlag: "showTitle"
2979 },
2980 {
2981 field: previewField2,
2982 isVisibleFlag: "showMedia"
2983 },
2984 {
2985 field: descriptionField,
2986 isVisibleFlag: "showDescription"
2987 }
2988 ].filter(({ field }) => isDefined(field));
2989 const visibleFieldIds = view.fields ?? [];
2990 const visibleRegularFieldsCount = regularFields.filter(
2991 (f2) => visibleFieldIds.includes(f2.id)
2992 ).length;
2993 const visibleLockedFields = lockedFields.filter(
2994 ({ isVisibleFlag }) => (
2995 // @ts-expect-error
2996 view[isVisibleFlag] ?? true
2997 )
2998 );
2999 const totalVisibleFields = visibleLockedFields.length + visibleRegularFieldsCount;
3000 const isSingleVisibleLockedField = totalVisibleFields === 1 && visibleLockedFields.length === 1;
3001 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Stack, { direction: "column", className: "dataviews-field-control", children: [
3002 showLabel && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components5.BaseControl.VisualLabel, { children: (0, import_i18n8.__)("Properties") }),
3003 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3004 Stack,
3005 {
3006 direction: "column",
3007 className: "dataviews-view-config__properties",
3008 children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_components5.__experimentalItemGroup, { isBordered: true, isSeparated: true, size: "medium", children: [
3009 lockedFields.map(({ field, isVisibleFlag }) => {
3010 const isVisible2 = view[isVisibleFlag] ?? true;
3011 const fieldToRender = isSingleVisibleLockedField && isVisible2 ? { ...field, enableHiding: false } : field;
3012 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3013 FieldItem,
3014 {
3015 field: fieldToRender,
3016 isVisible: isVisible2,
3017 onToggleVisibility: () => {
3018 onChangeView({
3019 ...view,
3020 [isVisibleFlag]: !isVisible2
3021 });
3022 }
3023 },
3024 field.id
3025 );
3026 }),
3027 regularFields.map((field) => {
3028 const isVisible2 = visibleFieldIds.includes(field.id);
3029 const fieldToRender = totalVisibleFields === 1 && isVisible2 ? { ...field, enableHiding: false } : field;
3030 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3031 FieldItem,
3032 {
3033 field: fieldToRender,
3034 isVisible: isVisible2,
3035 onToggleVisibility: () => {
3036 onChangeView({
3037 ...view,
3038 fields: isVisible2 ? visibleFieldIds.filter(
3039 (fieldId) => fieldId !== field.id
3040 ) : [...visibleFieldIds, field.id]
3041 });
3042 }
3043 },
3044 field.id
3045 );
3046 })
3047 ] })
3048 }
3049 )
3050 ] });
3051 }
3052
3053 // packages/dataviews/build-module/hooks/use-delayed-loading.mjs
3054 var import_element10 = __toESM(require_element(), 1);
3055 function useDelayedLoading(isLoading, options = { delay: 400 }) {
3056 const [showLoader, setShowLoader] = (0, import_element10.useState)(false);
3057 (0, import_element10.useEffect)(() => {
3058 if (!isLoading) {
3059 return;
3060 }
3061 const timeout = setTimeout(() => {
3062 setShowLoader(true);
3063 }, options.delay);
3064 return () => {
3065 clearTimeout(timeout);
3066 setShowLoader(false);
3067 };
3068 }, [isLoading, options.delay]);
3069 return showLoader;
3070 }
3071
3072 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
3073 var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1);
3074 function getEffectiveAlign(explicitAlign, fieldType) {
3075 if (explicitAlign) {
3076 return explicitAlign;
3077 }
3078 if (fieldType === "integer" || fieldType === "number") {
3079 return "end";
3080 }
3081 return void 0;
3082 }
3083 function TableColumnField({
3084 item,
3085 fields,
3086 column,
3087 align
3088 }) {
3089 const field = fields.find((f2) => f2.id === column);
3090 if (!field) {
3091 return null;
3092 }
3093 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
3094 "dataviews-view-table__cell-align-end": align === "end",
3095 "dataviews-view-table__cell-align-center": align === "center"
3096 });
3097 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(field.render, { item, field }) });
3098 }
3099 function TableRow({
3100 hasBulkActions,
3101 item,
3102 level,
3103 actions,
3104 fields,
3105 id,
3106 view,
3107 titleField,
3108 mediaField,
3109 descriptionField,
3110 selection,
3111 getItemId,
3112 isItemClickable,
3113 onClickItem,
3114 renderItemLink,
3115 onChangeSelection,
3116 isActionsColumnSticky,
3117 posinset
3118 }) {
3119 const { paginationInfo } = (0, import_element11.useContext)(dataviews_context_default);
3120 const hasPossibleBulkAction = useHasAPossibleBulkAction(actions, item);
3121 const isSelected2 = hasPossibleBulkAction && selection.includes(id);
3122 const {
3123 showTitle = true,
3124 showMedia = true,
3125 showDescription = true,
3126 infiniteScrollEnabled
3127 } = view;
3128 const isTouchDeviceRef = (0, import_element11.useRef)(false);
3129 const columns = view.fields ?? [];
3130 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
3131 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
3132 "tr",
3133 {
3134 className: clsx_default("dataviews-view-table__row", {
3135 "is-selected": hasPossibleBulkAction && isSelected2,
3136 "has-bulk-actions": hasPossibleBulkAction
3137 }),
3138 onTouchStart: () => {
3139 isTouchDeviceRef.current = true;
3140 },
3141 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
3142 "aria-posinset": posinset,
3143 role: infiniteScrollEnabled ? "article" : void 0,
3144 onMouseDown: (event) => {
3145 const isMetaClick = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey;
3146 if (event.button === 0 && isMetaClick && window.navigator.userAgent.toLowerCase().includes("firefox")) {
3147 event?.preventDefault();
3148 }
3149 },
3150 onClick: (event) => {
3151 if (!hasPossibleBulkAction) {
3152 return;
3153 }
3154 const isModifierKeyPressed = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey;
3155 if (isModifierKeyPressed && !isTouchDeviceRef.current && document.getSelection()?.type !== "Range") {
3156 onChangeSelection(
3157 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
3158 );
3159 }
3160 },
3161 children: [
3162 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("td", { className: "dataviews-view-table__checkbox-column", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3163 DataViewsSelectionCheckbox,
3164 {
3165 item,
3166 selection,
3167 onChangeSelection,
3168 getItemId,
3169 titleField,
3170 disabled: !hasPossibleBulkAction
3171 }
3172 ) }) }),
3173 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3174 column_primary_default,
3175 {
3176 item,
3177 level,
3178 titleField: showTitle ? titleField : void 0,
3179 mediaField: showMedia ? mediaField : void 0,
3180 descriptionField: showDescription ? descriptionField : void 0,
3181 isItemClickable,
3182 onClickItem,
3183 renderItemLink
3184 }
3185 ) }),
3186 columns.map((column) => {
3187 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
3188 const field = fields.find((f2) => f2.id === column);
3189 const effectiveAlign = getEffectiveAlign(align, field?.type);
3190 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3191 "td",
3192 {
3193 style: {
3194 width,
3195 maxWidth,
3196 minWidth
3197 },
3198 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3199 TableColumnField,
3200 {
3201 fields,
3202 item,
3203 column,
3204 align: effectiveAlign
3205 }
3206 )
3207 },
3208 column
3209 );
3210 }),
3211 !!actions?.length && // Disable reason: we are not making the element interactive,
3212 // but preventing any click events from bubbling up to the
3213 // table row. This allows us to add a click handler to the row
3214 // itself (to toggle row selection) without erroneously
3215 // intercepting click events from ItemActions.
3216 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3217 "td",
3218 {
3219 className: clsx_default("dataviews-view-table__actions-column", {
3220 "dataviews-view-table__actions-column--sticky": true,
3221 "dataviews-view-table__actions-column--stuck": isActionsColumnSticky
3222 }),
3223 onClick: (e2) => e2.stopPropagation(),
3224 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ItemActions, { item, actions })
3225 }
3226 )
3227 ]
3228 }
3229 );
3230 }
3231 function ViewTable({
3232 actions,
3233 data,
3234 fields,
3235 getItemId,
3236 getItemLevel,
3237 isLoading = false,
3238 onChangeView,
3239 onChangeSelection,
3240 selection,
3241 setOpenedFilter,
3242 onClickItem,
3243 isItemClickable,
3244 renderItemLink,
3245 view,
3246 className,
3247 empty
3248 }) {
3249 const { containerRef } = (0, import_element11.useContext)(dataviews_context_default);
3250 const isDelayedLoading = useDelayedLoading(isLoading);
3251 const headerMenuRefs = (0, import_element11.useRef)(/* @__PURE__ */ new Map());
3252 const headerMenuToFocusRef = (0, import_element11.useRef)(void 0);
3253 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element11.useState)();
3254 const [contextMenuAnchor, setContextMenuAnchor] = (0, import_element11.useState)(null);
3255 (0, import_element11.useEffect)(() => {
3256 if (headerMenuToFocusRef.current) {
3257 headerMenuToFocusRef.current.focus();
3258 headerMenuToFocusRef.current = void 0;
3259 }
3260 });
3261 const tableNoticeId = (0, import_element11.useId)();
3262 const { isHorizontalScrollEnd, isVerticallyScrolled } = useScrollState({
3263 scrollContainerRef: containerRef,
3264 enabledHorizontal: !!actions?.length
3265 });
3266 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
3267 if (nextHeaderMenuToFocus) {
3268 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
3269 setNextHeaderMenuToFocus(void 0);
3270 return;
3271 }
3272 const onHide = (field) => {
3273 const hidden = headerMenuRefs.current.get(field.id);
3274 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
3275 setNextHeaderMenuToFocus(fallback?.node);
3276 };
3277 const handleHeaderContextMenu = (event) => {
3278 event.preventDefault();
3279 event.stopPropagation();
3280 const virtualAnchor = {
3281 getBoundingClientRect: () => ({
3282 x: event.clientX,
3283 y: event.clientY,
3284 top: event.clientY,
3285 left: event.clientX,
3286 right: event.clientX,
3287 bottom: event.clientY,
3288 width: 0,
3289 height: 0,
3290 toJSON: () => ({})
3291 })
3292 };
3293 window.requestAnimationFrame(() => {
3294 setContextMenuAnchor(virtualAnchor);
3295 });
3296 };
3297 const hasData = !!data?.length;
3298 const titleField = fields.find((field) => field.id === view.titleField);
3299 const mediaField = fields.find((field) => field.id === view.mediaField);
3300 const descriptionField = fields.find(
3301 (field) => field.id === view.descriptionField
3302 );
3303 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
3304 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
3305 const { showTitle = true, showMedia = true, showDescription = true } = view;
3306 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
3307 const columns = view.fields ?? [];
3308 const headerMenuRef = (column, index) => (node) => {
3309 if (node) {
3310 headerMenuRefs.current.set(column, {
3311 node,
3312 fallback: columns[index > 0 ? index - 1 : 1]
3313 });
3314 } else {
3315 headerMenuRefs.current.delete(column);
3316 }
3317 };
3318 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
3319 const isRtl = (0, import_i18n9.isRTL)();
3320 if (!hasData) {
3321 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3322 "div",
3323 {
3324 className: clsx_default("dataviews-no-results", {
3325 "is-refreshing": isDelayedLoading
3326 }),
3327 id: tableNoticeId,
3328 children: empty
3329 }
3330 );
3331 }
3332 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
3333 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
3334 "table",
3335 {
3336 className: clsx_default("dataviews-view-table", className, {
3337 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
3338 view.layout.density
3339 ),
3340 "has-bulk-actions": hasBulkActions,
3341 "is-refreshing": !isInfiniteScroll && isDelayedLoading
3342 }),
3343 "aria-busy": isLoading,
3344 "aria-describedby": tableNoticeId,
3345 role: isInfiniteScroll ? "feed" : void 0,
3346 inert: !isInfiniteScroll && isLoading ? "true" : void 0,
3347 children: [
3348 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("colgroup", { children: [
3349 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-checkbox" }),
3350 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-first-data" }),
3351 columns.map((column, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3352 "col",
3353 {
3354 className: clsx_default(
3355 `dataviews-view-table__col-${column}`,
3356 {
3357 "dataviews-view-table__col-expand": !hasPrimaryColumn && index === columns.length - 1
3358 }
3359 )
3360 },
3361 `col-${column}`
3362 )),
3363 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-actions" })
3364 ] }),
3365 contextMenuAnchor && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3366 import_components6.Popover,
3367 {
3368 anchor: contextMenuAnchor,
3369 onClose: () => setContextMenuAnchor(null),
3370 placement: "bottom-start",
3371 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(PropertiesSection, { showLabel: false })
3372 }
3373 ),
3374 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3375 "thead",
3376 {
3377 className: clsx_default({
3378 "dataviews-view-table__thead--stuck": isVerticallyScrolled
3379 }),
3380 onContextMenu: handleHeaderContextMenu,
3381 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("tr", { className: "dataviews-view-table__row", children: [
3382 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3383 "th",
3384 {
3385 className: "dataviews-view-table__checkbox-column",
3386 scope: "col",
3387 onContextMenu: handleHeaderContextMenu,
3388 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3389 BulkSelectionCheckbox,
3390 {
3391 selection,
3392 onChangeSelection,
3393 data,
3394 actions,
3395 getItemId
3396 }
3397 )
3398 }
3399 ),
3400 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("th", { scope: "col", children: titleField && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3401 column_header_menu_default,
3402 {
3403 ref: headerMenuRef(
3404 titleField.id,
3405 0
3406 ),
3407 fieldId: titleField.id,
3408 view,
3409 fields,
3410 onChangeView,
3411 onHide,
3412 setOpenedFilter,
3413 canMove: false,
3414 canInsertLeft: isRtl ? view.layout?.enableMoving ?? true : false,
3415 canInsertRight: isRtl ? false : view.layout?.enableMoving ?? true
3416 }
3417 ) }),
3418 columns.map((column, index) => {
3419 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
3420 const field = fields.find(
3421 (f2) => f2.id === column
3422 );
3423 const effectiveAlign = getEffectiveAlign(
3424 align,
3425 field?.type
3426 );
3427 const canInsertOrMove = view.layout?.enableMoving ?? true;
3428 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3429 "th",
3430 {
3431 style: {
3432 width,
3433 maxWidth,
3434 minWidth,
3435 textAlign: effectiveAlign
3436 },
3437 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
3438 scope: "col",
3439 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3440 column_header_menu_default,
3441 {
3442 ref: headerMenuRef(column, index),
3443 fieldId: column,
3444 view,
3445 fields,
3446 onChangeView,
3447 onHide,
3448 setOpenedFilter,
3449 canMove: canInsertOrMove,
3450 canInsertLeft: canInsertOrMove,
3451 canInsertRight: canInsertOrMove
3452 }
3453 )
3454 },
3455 column
3456 );
3457 }),
3458 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3459 "th",
3460 {
3461 className: clsx_default(
3462 "dataviews-view-table__actions-column",
3463 {
3464 "dataviews-view-table__actions-column--sticky": true,
3465 "dataviews-view-table__actions-column--stuck": !isHorizontalScrollEnd
3466 }
3467 ),
3468 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "dataviews-view-table-header", children: (0, import_i18n9.__)("Actions") })
3469 }
3470 )
3471 ] })
3472 }
3473 ),
3474 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
3475 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("tbody", { children: [
3476 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tr", { className: "dataviews-view-table__group-header-row", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3477 "td",
3478 {
3479 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + (hasBulkActions ? 1 : 0) + (actions?.length ? 1 : 0),
3480 className: "dataviews-view-table__group-header-cell",
3481 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n9.sprintf)(
3482 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
3483 (0, import_i18n9.__)("%1$s: %2$s"),
3484 groupField.label,
3485 groupName
3486 )
3487 }
3488 ) }),
3489 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3490 TableRow,
3491 {
3492 item,
3493 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
3494 hasBulkActions,
3495 actions,
3496 fields,
3497 id: getItemId(item) || index.toString(),
3498 view,
3499 titleField,
3500 mediaField,
3501 descriptionField,
3502 selection,
3503 getItemId,
3504 onChangeSelection,
3505 onClickItem,
3506 renderItemLink,
3507 isItemClickable,
3508 isActionsColumnSticky: !isHorizontalScrollEnd
3509 },
3510 getItemId(item)
3511 ))
3512 ] }, `group-${groupName}`)
3513 ) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tbody", { children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3514 TableRow,
3515 {
3516 item,
3517 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
3518 hasBulkActions,
3519 actions,
3520 fields,
3521 id: getItemId(item) || index.toString(),
3522 view,
3523 titleField,
3524 mediaField,
3525 descriptionField,
3526 selection,
3527 getItemId,
3528 onChangeSelection,
3529 onClickItem,
3530 renderItemLink,
3531 isItemClickable,
3532 isActionsColumnSticky: !isHorizontalScrollEnd,
3533 posinset: isInfiniteScroll ? index + 1 : void 0
3534 },
3535 getItemId(item)
3536 )) })
3537 ]
3538 }
3539 ),
3540 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "dataviews-loading", id: tableNoticeId, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_components6.Spinner, {}) }) })
3541 ] });
3542 }
3543 var table_default = ViewTable;
3544
3545 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
3546 var import_components9 = __toESM(require_components(), 1);
3547 var import_i18n12 = __toESM(require_i18n(), 1);
3548
3549 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
3550 var import_components8 = __toESM(require_components(), 1);
3551 var import_i18n11 = __toESM(require_i18n(), 1);
3552 var import_compose3 = __toESM(require_compose(), 1);
3553 var import_keycodes2 = __toESM(require_keycodes(), 1);
3554 var import_element15 = __toESM(require_element(), 1);
3555
3556 // packages/dataviews/build-module/components/dataviews-layouts/grid/preview-size-picker.mjs
3557 var import_components7 = __toESM(require_components(), 1);
3558 var import_i18n10 = __toESM(require_i18n(), 1);
3559 var import_element12 = __toESM(require_element(), 1);
3560 var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
3561 var imageSizes = [
3562 {
3563 value: 120,
3564 breakpoint: 1
3565 },
3566 {
3567 value: 170,
3568 breakpoint: 1
3569 },
3570 {
3571 value: 230,
3572 breakpoint: 1
3573 },
3574 {
3575 value: 290,
3576 breakpoint: 1112
3577 // at minimum image width, 4 images display at this container size
3578 },
3579 {
3580 value: 350,
3581 breakpoint: 1636
3582 // at minimum image width, 6 images display at this container size
3583 },
3584 {
3585 value: 430,
3586 breakpoint: 588
3587 // at minimum image width, 2 images display at this container size
3588 }
3589 ];
3590 var DEFAULT_PREVIEW_SIZE = imageSizes[2].value;
3591 function useGridColumns() {
3592 const context = (0, import_element12.useContext)(dataviews_context_default);
3593 const view = context.view;
3594 return (0, import_element12.useMemo)(() => {
3595 const containerWidth = context.containerWidth;
3596 const gap = 32;
3597 const previewSize = view.layout?.previewSize ?? DEFAULT_PREVIEW_SIZE;
3598 const columns = Math.floor(
3599 (containerWidth + gap) / (previewSize + gap)
3600 );
3601 return Math.max(1, columns);
3602 }, [context.containerWidth, view.layout?.previewSize]);
3603 }
3604
3605 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-items.mjs
3606 var import_element13 = __toESM(require_element(), 1);
3607 var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1);
3608 var GridItems = (0, import_element13.forwardRef)(({ className, previewSize, ...props }, ref) => {
3609 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3610 "div",
3611 {
3612 ref,
3613 className: clsx_default("dataviews-view-grid-items", className),
3614 style: {
3615 gridTemplateColumns: previewSize && `repeat(auto-fill, minmax(${previewSize}px, 1fr))`
3616 },
3617 ...props
3618 }
3619 );
3620 });
3621
3622 // packages/dataviews/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs
3623 var import_element14 = __toESM(require_element(), 1);
3624 function useIntersectionObserver(elementRef, posinset) {
3625 const { intersectionObserver } = (0, import_element14.useContext)(dataviews_context_default);
3626 (0, import_element14.useEffect)(() => {
3627 const element = elementRef.current;
3628 if (!element || posinset === void 0 || !intersectionObserver) {
3629 return;
3630 }
3631 intersectionObserver.observe(element);
3632 return () => {
3633 intersectionObserver.unobserve(element);
3634 };
3635 }, [elementRef, intersectionObserver, posinset]);
3636 }
3637 function usePlaceholdersNeeded(data, isInfiniteScroll, gridColumns) {
3638 const hasData = !!data?.length;
3639 const firstItemPosition = hasData && isInfiniteScroll ? data[0].position : void 0;
3640 return firstItemPosition && gridColumns ? (firstItemPosition - 1) % gridColumns : 0;
3641 }
3642
3643 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
3644 var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1);
3645 var { Badge } = unlock2(import_components8.privateApis);
3646 function chunk(array, size) {
3647 const chunks = [];
3648 for (let i2 = 0, j2 = array.length; i2 < j2; i2 += size) {
3649 chunks.push(array.slice(i2, i2 + size));
3650 }
3651 return chunks;
3652 }
3653 var GridItem = (0, import_element15.forwardRef)(
3654 function GridItem2({
3655 view,
3656 selection,
3657 onChangeSelection,
3658 onClickItem,
3659 isItemClickable,
3660 renderItemLink,
3661 getItemId,
3662 item,
3663 actions,
3664 mediaField,
3665 titleField,
3666 descriptionField,
3667 regularFields,
3668 badgeFields,
3669 hasBulkActions,
3670 config,
3671 posinset,
3672 setsize,
3673 ...props
3674 }, forwardedRef) {
3675 const {
3676 showTitle = true,
3677 showMedia = true,
3678 showDescription = true
3679 } = view;
3680 const hasBulkAction = useHasAPossibleBulkAction(actions, item);
3681 const id = getItemId(item);
3682 const elementRef = (0, import_element15.useRef)(null);
3683 const setRefs = (0, import_element15.useCallback)(
3684 (node) => {
3685 elementRef.current = node;
3686 if (typeof forwardedRef === "function") {
3687 forwardedRef(node);
3688 } else if (forwardedRef) {
3689 forwardedRef.current = node;
3690 }
3691 },
3692 [forwardedRef]
3693 );
3694 useIntersectionObserver(elementRef, posinset);
3695 const instanceId = (0, import_compose3.useInstanceId)(GridItem2);
3696 const isSelected2 = selection.includes(id);
3697 const mediaPlaceholder = /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "dataviews-view-grid__media-placeholder" });
3698 const rendersMediaField = showMedia && mediaField?.render;
3699 const renderedMediaField = rendersMediaField ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3700 mediaField.render,
3701 {
3702 item,
3703 field: mediaField,
3704 config
3705 }
3706 ) : mediaPlaceholder;
3707 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(titleField.render, { item, field: titleField }) : null;
3708 let mediaA11yProps;
3709 let titleA11yProps;
3710 if (isItemClickable(item) && onClickItem) {
3711 if (renderedTitleField) {
3712 mediaA11yProps = {
3713 "aria-labelledby": `dataviews-view-grid__title-field-${instanceId}`
3714 };
3715 titleA11yProps = {
3716 id: `dataviews-view-grid__title-field-${instanceId}`
3717 };
3718 } else {
3719 mediaA11yProps = {
3720 "aria-label": (0, import_i18n11.__)("Navigate to item")
3721 };
3722 }
3723 }
3724 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
3725 Stack,
3726 {
3727 direction: "column",
3728 ...props,
3729 ref: setRefs,
3730 "aria-setsize": setsize,
3731 "aria-posinset": posinset,
3732 className: clsx_default(
3733 props.className,
3734 "dataviews-view-grid__row__gridcell",
3735 "dataviews-view-grid__card",
3736 {
3737 "is-selected": hasBulkAction && isSelected2
3738 }
3739 ),
3740 onClickCapture: (event) => {
3741 props.onClickCapture?.(event);
3742 if ((0, import_keycodes2.isAppleOS)() ? event.metaKey : event.ctrlKey) {
3743 event.stopPropagation();
3744 event.preventDefault();
3745 if (!hasBulkAction) {
3746 return;
3747 }
3748 onChangeSelection(
3749 isSelected2 ? selection.filter(
3750 (itemId) => id !== itemId
3751 ) : [...selection, id]
3752 );
3753 }
3754 },
3755 children: [
3756 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3757 ItemClickWrapper,
3758 {
3759 item,
3760 isItemClickable,
3761 onClickItem,
3762 renderItemLink,
3763 className: clsx_default("dataviews-view-grid__media", {
3764 "dataviews-view-grid__media--placeholder": !rendersMediaField
3765 }),
3766 ...mediaA11yProps,
3767 children: renderedMediaField
3768 }
3769 ),
3770 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3771 DataViewsSelectionCheckbox,
3772 {
3773 item,
3774 selection,
3775 onChangeSelection,
3776 getItemId,
3777 titleField,
3778 disabled: !hasBulkAction
3779 }
3780 ),
3781 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3782 ItemActions,
3783 {
3784 item,
3785 actions,
3786 isCompact: true
3787 }
3788 ) }),
3789 showTitle && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "dataviews-view-grid__title", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3790 ItemClickWrapper,
3791 {
3792 item,
3793 isItemClickable,
3794 onClickItem,
3795 renderItemLink,
3796 className: "dataviews-view-grid__title-field dataviews-title-field",
3797 ...titleA11yProps,
3798 title: titleField?.getValueFormatted({
3799 item,
3800 field: titleField
3801 }) || void 0,
3802 children: renderedTitleField
3803 }
3804 ) }),
3805 /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Stack, { direction: "column", gap: "xs", children: [
3806 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3807 descriptionField.render,
3808 {
3809 item,
3810 field: descriptionField
3811 }
3812 ),
3813 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3814 Stack,
3815 {
3816 direction: "row",
3817 className: "dataviews-view-grid__badge-fields",
3818 gap: "sm",
3819 wrap: "wrap",
3820 align: "top",
3821 justify: "flex-start",
3822 children: badgeFields.map((field) => {
3823 return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3824 Badge,
3825 {
3826 className: "dataviews-view-grid__field-value",
3827 children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3828 field.render,
3829 {
3830 item,
3831 field
3832 }
3833 )
3834 },
3835 field.id
3836 );
3837 })
3838 }
3839 ),
3840 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3841 Stack,
3842 {
3843 direction: "column",
3844 className: "dataviews-view-grid__fields",
3845 gap: "xs",
3846 children: regularFields.map((field) => {
3847 return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3848 import_components8.Flex,
3849 {
3850 className: "dataviews-view-grid__field",
3851 gap: 1,
3852 justify: "flex-start",
3853 expanded: true,
3854 style: { height: "auto" },
3855 direction: "row",
3856 children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
3857 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_components8.Tooltip, { text: field.label, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_components8.FlexItem, { className: "dataviews-view-grid__field-name", children: field.header }) }),
3858 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3859 import_components8.FlexItem,
3860 {
3861 className: "dataviews-view-grid__field-value",
3862 style: { maxHeight: "none" },
3863 children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3864 field.render,
3865 {
3866 item,
3867 field
3868 }
3869 )
3870 }
3871 )
3872 ] })
3873 },
3874 field.id
3875 );
3876 })
3877 }
3878 )
3879 ] })
3880 ]
3881 }
3882 );
3883 }
3884 );
3885 function CompositeGrid({
3886 data,
3887 isInfiniteScroll,
3888 className,
3889 inert,
3890 isLoading,
3891 view,
3892 fields,
3893 selection,
3894 onChangeSelection,
3895 onClickItem,
3896 isItemClickable,
3897 renderItemLink,
3898 getItemId,
3899 actions
3900 }) {
3901 const { paginationInfo, resizeObserverRef } = (0, import_element15.useContext)(dataviews_context_default);
3902 const gridColumns = useGridColumns();
3903 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
3904 const titleField = fields.find(
3905 (field) => field.id === view?.titleField
3906 );
3907 const mediaField = fields.find(
3908 (field) => field.id === view?.mediaField
3909 );
3910 const descriptionField = fields.find(
3911 (field) => field.id === view?.descriptionField
3912 );
3913 const otherFields = view.fields ?? [];
3914 const { regularFields, badgeFields } = otherFields.reduce(
3915 (accumulator, fieldId) => {
3916 const field = fields.find((f2) => f2.id === fieldId);
3917 if (!field) {
3918 return accumulator;
3919 }
3920 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
3921 accumulator[key].push(field);
3922 return accumulator;
3923 },
3924 { regularFields: [], badgeFields: [] }
3925 );
3926 const size = "900px";
3927 const totalRows = Math.ceil(data.length / gridColumns);
3928 const placeholdersNeeded = usePlaceholdersNeeded(
3929 data,
3930 isInfiniteScroll,
3931 gridColumns
3932 );
3933 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, {
3934 // Render infinite scroll layout (no rows, feed semantics)
3935 children: [
3936 isInfiniteScroll && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
3937 import_components8.Composite,
3938 {
3939 render: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3940 GridItems,
3941 {
3942 className: clsx_default(
3943 "dataviews-view-grid-infinite-scroll",
3944 className,
3945 {
3946 [`has-${view.layout?.density}-density`]: view.layout?.density && [
3947 "compact",
3948 "comfortable"
3949 ].includes(view.layout.density)
3950 }
3951 ),
3952 previewSize: view.layout?.previewSize,
3953 "aria-busy": isLoading,
3954 ref: resizeObserverRef
3955 }
3956 ),
3957 role: "feed",
3958 focusWrap: true,
3959 inert,
3960 children: [
3961 Array.from({ length: placeholdersNeeded }).map(
3962 (_, index) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3963 import_components8.Composite.Item,
3964 {
3965 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3966 Stack,
3967 {
3968 ...props,
3969 direction: "column",
3970 role: "article",
3971 className: "dataviews-view-grid__row__gridcell dataviews-view-grid__card dataviews-view-grid__placeholder"
3972 }
3973 ),
3974 "aria-hidden": true,
3975 tabIndex: -1
3976 },
3977 `placeholder-${index}`
3978 )
3979 ),
3980 data.map((item) => {
3981 const itemId = getItemId(item);
3982 const stablePosition = item.position;
3983 return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3984 import_components8.Composite.Item,
3985 {
3986 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3987 GridItem,
3988 {
3989 ...props,
3990 id: itemId,
3991 role: "article",
3992 view,
3993 selection,
3994 onChangeSelection,
3995 onClickItem,
3996 isItemClickable,
3997 renderItemLink,
3998 getItemId,
3999 item,
4000 actions,
4001 mediaField,
4002 titleField,
4003 descriptionField,
4004 regularFields,
4005 badgeFields,
4006 hasBulkActions,
4007 posinset: stablePosition,
4008 setsize: paginationInfo.totalItems,
4009 config: {
4010 sizes: size
4011 }
4012 }
4013 )
4014 },
4015 itemId
4016 );
4017 })
4018 ]
4019 }
4020 ),
4021 // Render standard grid layout (with rows, grid semantics)
4022 !isInfiniteScroll && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
4023 import_components8.Composite,
4024 {
4025 role: "grid",
4026 className: clsx_default("dataviews-view-grid", className, {
4027 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
4028 view.layout.density
4029 )
4030 }),
4031 focusWrap: true,
4032 "aria-busy": isLoading,
4033 "aria-rowcount": totalRows,
4034 ref: resizeObserverRef,
4035 inert,
4036 children: chunk(data, gridColumns).map((row, i2) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
4037 import_components8.Composite.Row,
4038 {
4039 render: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
4040 "div",
4041 {
4042 role: "row",
4043 "aria-rowindex": i2 + 1,
4044 "aria-label": (0, import_i18n11.sprintf)(
4045 /* translators: %d: The row number in the grid */
4046 (0, import_i18n11.__)("Row %d"),
4047 i2 + 1
4048 ),
4049 className: "dataviews-view-grid__row",
4050 style: {
4051 gridTemplateColumns: `repeat( ${gridColumns}, minmax(0, 1fr) )`
4052 }
4053 }
4054 ),
4055 children: row.map((item) => {
4056 const itemId = getItemId(item);
4057 return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
4058 import_components8.Composite.Item,
4059 {
4060 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
4061 GridItem,
4062 {
4063 ...props,
4064 id: itemId,
4065 role: "gridcell",
4066 view,
4067 selection,
4068 onChangeSelection,
4069 onClickItem,
4070 isItemClickable,
4071 renderItemLink,
4072 getItemId,
4073 item,
4074 actions,
4075 mediaField,
4076 titleField,
4077 descriptionField,
4078 regularFields,
4079 badgeFields,
4080 hasBulkActions,
4081 config: {
4082 sizes: size
4083 }
4084 }
4085 )
4086 },
4087 itemId
4088 );
4089 })
4090 },
4091 i2
4092 ))
4093 }
4094 )
4095 ]
4096 });
4097 }
4098
4099 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
4100 var import_jsx_runtime35 = __toESM(require_jsx_runtime(), 1);
4101 function ViewGrid({
4102 actions,
4103 data,
4104 fields,
4105 getItemId,
4106 isLoading,
4107 onChangeSelection,
4108 onClickItem,
4109 isItemClickable,
4110 renderItemLink,
4111 selection,
4112 view,
4113 className,
4114 empty
4115 }) {
4116 const isDelayedLoading = useDelayedLoading(!!isLoading);
4117 const hasData = !!data?.length;
4118 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
4119 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
4120 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
4121 if (!hasData) {
4122 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4123 "div",
4124 {
4125 className: clsx_default("dataviews-no-results", {
4126 "is-refreshing": isDelayedLoading
4127 }),
4128 children: empty
4129 }
4130 );
4131 }
4132 const gridProps = {
4133 className: clsx_default(className, {
4134 "is-refreshing": !isInfiniteScroll && isDelayedLoading
4135 }),
4136 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0,
4137 isLoading,
4138 view,
4139 fields,
4140 selection,
4141 onChangeSelection,
4142 onClickItem,
4143 isItemClickable,
4144 renderItemLink,
4145 getItemId,
4146 actions
4147 };
4148 return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, {
4149 // Render multiple groups.
4150 children: [
4151 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Stack, { direction: "column", gap: "lg", children: Array.from(dataByGroup.entries()).map(
4152 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4153 Stack,
4154 {
4155 direction: "column",
4156 gap: "sm",
4157 children: [
4158 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h3", { className: "dataviews-view-grid__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n12.sprintf)(
4159 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
4160 (0, import_i18n12.__)("%1$s: %2$s"),
4161 groupField.label,
4162 groupName
4163 ) }),
4164 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4165 CompositeGrid,
4166 {
4167 ...gridProps,
4168 data: groupItems,
4169 isInfiniteScroll: false
4170 }
4171 )
4172 ]
4173 },
4174 groupName
4175 )
4176 ) }),
4177 // Render a single grid with all data.
4178 !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4179 CompositeGrid,
4180 {
4181 ...gridProps,
4182 data,
4183 isInfiniteScroll: !!isInfiniteScroll
4184 }
4185 ),
4186 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components9.Spinner, {}) })
4187 ]
4188 });
4189 }
4190 var grid_default = ViewGrid;
4191
4192 // packages/dataviews/build-module/components/dataviews-layouts/list/index.mjs
4193 var import_compose4 = __toESM(require_compose(), 1);
4194 var import_components10 = __toESM(require_components(), 1);
4195 var import_element16 = __toESM(require_element(), 1);
4196 var import_i18n13 = __toESM(require_i18n(), 1);
4197 var import_data6 = __toESM(require_data(), 1);
4198 var import_jsx_runtime36 = __toESM(require_jsx_runtime(), 1);
4199 var { Menu: Menu3 } = unlock2(import_components10.privateApis);
4200 function generateItemWrapperCompositeId(idPrefix) {
4201 return `${idPrefix}-item-wrapper`;
4202 }
4203 function generatePrimaryActionCompositeId(idPrefix, primaryActionId) {
4204 return `${idPrefix}-primary-action-${primaryActionId}`;
4205 }
4206 function generateDropdownTriggerCompositeId(idPrefix) {
4207 return `${idPrefix}-dropdown`;
4208 }
4209 function PrimaryActionGridCell({
4210 idPrefix,
4211 primaryAction,
4212 item
4213 }) {
4214 const registry = (0, import_data6.useRegistry)();
4215 const [isModalOpen, setIsModalOpen] = (0, import_element16.useState)(false);
4216 const compositeItemId = generatePrimaryActionCompositeId(
4217 idPrefix,
4218 primaryAction.id
4219 );
4220 const label = typeof primaryAction.label === "string" ? primaryAction.label : primaryAction.label([item]);
4221 return "RenderModal" in primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4222 import_components10.Composite.Item,
4223 {
4224 id: compositeItemId,
4225 render: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4226 import_components10.Button,
4227 {
4228 disabled: !!primaryAction.disabled,
4229 accessibleWhenDisabled: true,
4230 text: label,
4231 size: "small",
4232 onClick: () => setIsModalOpen(true)
4233 }
4234 ),
4235 children: isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4236 ActionModal,
4237 {
4238 action: primaryAction,
4239 items: [item],
4240 closeModal: () => setIsModalOpen(false)
4241 }
4242 )
4243 }
4244 ) }, primaryAction.id) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4245 import_components10.Composite.Item,
4246 {
4247 id: compositeItemId,
4248 render: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4249 import_components10.Button,
4250 {
4251 disabled: !!primaryAction.disabled,
4252 accessibleWhenDisabled: true,
4253 size: "small",
4254 onClick: () => {
4255 primaryAction.callback([item], { registry });
4256 },
4257 children: label
4258 }
4259 )
4260 }
4261 ) }, primaryAction.id);
4262 }
4263 function ListItem({
4264 view,
4265 actions,
4266 idPrefix,
4267 isSelected: isSelected2,
4268 item,
4269 titleField,
4270 mediaField,
4271 descriptionField,
4272 onSelect,
4273 otherFields,
4274 onDropdownTriggerKeyDown,
4275 posinset
4276 }) {
4277 const {
4278 showTitle = true,
4279 showMedia = true,
4280 showDescription = true,
4281 infiniteScrollEnabled
4282 } = view;
4283 const itemRef = (0, import_element16.useRef)(null);
4284 const labelId = `${idPrefix}-label`;
4285 const descriptionId = `${idPrefix}-description`;
4286 const registry = (0, import_data6.useRegistry)();
4287 const [isHovered, setIsHovered] = (0, import_element16.useState)(false);
4288 const [activeModalAction, setActiveModalAction] = (0, import_element16.useState)(
4289 null
4290 );
4291 const handleHover = ({ type }) => {
4292 const isHover = type === "mouseenter";
4293 setIsHovered(isHover);
4294 };
4295 const { paginationInfo } = (0, import_element16.useContext)(dataviews_context_default);
4296 (0, import_element16.useEffect)(() => {
4297 if (isSelected2) {
4298 itemRef.current?.scrollIntoView({
4299 behavior: "auto",
4300 block: "nearest",
4301 inline: "nearest"
4302 });
4303 }
4304 }, [isSelected2]);
4305 const { primaryAction, eligibleActions } = (0, import_element16.useMemo)(() => {
4306 const _eligibleActions = actions.filter(
4307 (action) => !action.isEligible || action.isEligible(item)
4308 );
4309 const _primaryActions = _eligibleActions.filter(
4310 (action) => action.isPrimary
4311 );
4312 return {
4313 primaryAction: _primaryActions[0],
4314 eligibleActions: _eligibleActions
4315 };
4316 }, [actions, item]);
4317 const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1;
4318 const renderedMediaField = showMedia && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "dataviews-view-list__media-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4319 mediaField.render,
4320 {
4321 item,
4322 field: mediaField,
4323 config: { sizes: "52px" }
4324 }
4325 ) }) : null;
4326 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(titleField.render, { item, field: titleField }) : null;
4327 const renderDescription = showDescription && descriptionField?.render;
4328 const hasOnlyMediaAndTitle = !!renderedMediaField && !renderDescription && !otherFields.length;
4329 const usedActions = eligibleActions?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4330 Stack,
4331 {
4332 direction: "row",
4333 gap: "md",
4334 className: "dataviews-view-list__item-actions",
4335 children: [
4336 primaryAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4337 PrimaryActionGridCell,
4338 {
4339 idPrefix,
4340 primaryAction,
4341 item
4342 }
4343 ),
4344 !hasOnlyOnePrimaryAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { role: "gridcell", children: [
4345 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(Menu3, { placement: "bottom-end", children: [
4346 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4347 Menu3.TriggerButton,
4348 {
4349 render: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4350 import_components10.Composite.Item,
4351 {
4352 id: generateDropdownTriggerCompositeId(
4353 idPrefix
4354 ),
4355 render: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4356 import_components10.Button,
4357 {
4358 size: "small",
4359 icon: more_vertical_default,
4360 label: (0, import_i18n13.__)("Actions"),
4361 accessibleWhenDisabled: true,
4362 disabled: !actions.length,
4363 onKeyDown: onDropdownTriggerKeyDown
4364 }
4365 )
4366 }
4367 )
4368 }
4369 ),
4370 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Menu3.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4371 ActionsMenuGroup,
4372 {
4373 actions: eligibleActions,
4374 item,
4375 registry,
4376 setActiveModalAction
4377 }
4378 ) })
4379 ] }),
4380 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4381 ActionModal,
4382 {
4383 action: activeModalAction,
4384 items: [item],
4385 closeModal: () => setActiveModalAction(null)
4386 }
4387 )
4388 ] })
4389 ]
4390 }
4391 );
4392 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4393 import_components10.Composite.Row,
4394 {
4395 ref: itemRef,
4396 render: (
4397 /* aria-posinset breaks Composite.Row if passed to it directly. */
4398 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4399 "div",
4400 {
4401 "aria-posinset": posinset,
4402 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0
4403 }
4404 )
4405 ),
4406 role: infiniteScrollEnabled ? "article" : "row",
4407 className: clsx_default({
4408 "is-selected": isSelected2,
4409 "is-hovered": isHovered
4410 }),
4411 onMouseEnter: handleHover,
4412 onMouseLeave: handleHover,
4413 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4414 Stack,
4415 {
4416 direction: "row",
4417 className: "dataviews-view-list__item-wrapper",
4418 children: [
4419 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4420 import_components10.Composite.Item,
4421 {
4422 id: generateItemWrapperCompositeId(idPrefix),
4423 "aria-pressed": isSelected2,
4424 "aria-labelledby": labelId,
4425 "aria-describedby": descriptionId,
4426 className: "dataviews-view-list__item",
4427 onClick: () => onSelect(item)
4428 }
4429 ) }),
4430 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4431 Stack,
4432 {
4433 direction: "row",
4434 gap: "md",
4435 justify: "start",
4436 align: hasOnlyMediaAndTitle ? "center" : "flex-start",
4437 style: { flex: 1, minWidth: 0 },
4438 children: [
4439 renderedMediaField,
4440 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4441 Stack,
4442 {
4443 direction: "column",
4444 gap: "xs",
4445 className: "dataviews-view-list__field-wrapper",
4446 children: [
4447 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(Stack, { direction: "row", align: "center", children: [
4448 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4449 "div",
4450 {
4451 className: "dataviews-title-field dataviews-view-list__title-field",
4452 id: labelId,
4453 children: renderedTitleField
4454 }
4455 ),
4456 usedActions
4457 ] }),
4458 renderDescription && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "dataviews-view-list__field", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4459 descriptionField.render,
4460 {
4461 item,
4462 field: descriptionField
4463 }
4464 ) }),
4465 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4466 "div",
4467 {
4468 className: "dataviews-view-list__fields",
4469 id: descriptionId,
4470 children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4471 "div",
4472 {
4473 className: "dataviews-view-list__field",
4474 children: [
4475 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4476 import_components10.VisuallyHidden,
4477 {
4478 as: "span",
4479 className: "dataviews-view-list__field-label",
4480 children: field.label
4481 }
4482 ),
4483 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "dataviews-view-list__field-value", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4484 field.render,
4485 {
4486 item,
4487 field
4488 }
4489 ) })
4490 ]
4491 },
4492 field.id
4493 ))
4494 }
4495 )
4496 ]
4497 }
4498 )
4499 ]
4500 }
4501 )
4502 ]
4503 }
4504 )
4505 }
4506 );
4507 }
4508 function isDefined2(item) {
4509 return !!item;
4510 }
4511 function ViewList(props) {
4512 const {
4513 actions,
4514 data,
4515 fields,
4516 getItemId,
4517 isLoading,
4518 onChangeSelection,
4519 selection,
4520 view,
4521 className,
4522 empty
4523 } = props;
4524 const baseId = (0, import_compose4.useInstanceId)(ViewList, "view-list");
4525 const isDelayedLoading = useDelayedLoading(!!isLoading);
4526 const selectedItem = data?.findLast(
4527 (item) => selection.includes(getItemId(item))
4528 );
4529 const titleField = fields.find((field) => field.id === view.titleField);
4530 const mediaField = fields.find((field) => field.id === view.mediaField);
4531 const descriptionField = fields.find(
4532 (field) => field.id === view.descriptionField
4533 );
4534 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined2);
4535 const onSelect = (item) => onChangeSelection([getItemId(item)]);
4536 const generateCompositeItemIdPrefix = (0, import_element16.useCallback)(
4537 (item) => `${baseId}-${getItemId(item)}`,
4538 [baseId, getItemId]
4539 );
4540 const isActiveCompositeItem = (0, import_element16.useCallback)(
4541 (item, idToCheck) => {
4542 return idToCheck.startsWith(
4543 generateCompositeItemIdPrefix(item)
4544 );
4545 },
4546 [generateCompositeItemIdPrefix]
4547 );
4548 const [activeCompositeId, setActiveCompositeId] = (0, import_element16.useState)(void 0);
4549 const compositeRef = (0, import_element16.useRef)(null);
4550 (0, import_element16.useEffect)(() => {
4551 if (selectedItem) {
4552 setActiveCompositeId(
4553 generateItemWrapperCompositeId(
4554 generateCompositeItemIdPrefix(selectedItem)
4555 )
4556 );
4557 }
4558 }, [selectedItem, generateCompositeItemIdPrefix]);
4559 const activeItemIndex = data.findIndex(
4560 (item) => isActiveCompositeItem(item, activeCompositeId ?? "")
4561 );
4562 const previousActiveItemIndex = (0, import_compose4.usePrevious)(activeItemIndex);
4563 const isActiveIdInList = activeItemIndex !== -1;
4564 const selectCompositeItem = (0, import_element16.useCallback)(
4565 (targetIndex, generateCompositeId) => {
4566 const clampedIndex = Math.min(
4567 data.length - 1,
4568 Math.max(0, targetIndex)
4569 );
4570 if (!data[clampedIndex]) {
4571 return;
4572 }
4573 const itemIdPrefix = generateCompositeItemIdPrefix(
4574 data[clampedIndex]
4575 );
4576 const targetCompositeItemId = generateCompositeId(itemIdPrefix);
4577 setActiveCompositeId(targetCompositeItemId);
4578 if (compositeRef.current?.contains(
4579 compositeRef.current.ownerDocument.activeElement
4580 )) {
4581 document.getElementById(targetCompositeItemId)?.focus();
4582 }
4583 },
4584 [data, generateCompositeItemIdPrefix]
4585 );
4586 (0, import_element16.useEffect)(() => {
4587 const wasActiveIdInList = previousActiveItemIndex !== void 0 && previousActiveItemIndex !== -1;
4588 if (!isActiveIdInList && wasActiveIdInList) {
4589 selectCompositeItem(
4590 previousActiveItemIndex,
4591 generateItemWrapperCompositeId
4592 );
4593 }
4594 }, [isActiveIdInList, selectCompositeItem, previousActiveItemIndex]);
4595 const onDropdownTriggerKeyDown = (0, import_element16.useCallback)(
4596 (event) => {
4597 if (event.key === "ArrowDown") {
4598 event.preventDefault();
4599 selectCompositeItem(
4600 activeItemIndex + 1,
4601 generateDropdownTriggerCompositeId
4602 );
4603 }
4604 if (event.key === "ArrowUp") {
4605 event.preventDefault();
4606 selectCompositeItem(
4607 activeItemIndex - 1,
4608 generateDropdownTriggerCompositeId
4609 );
4610 }
4611 },
4612 [selectCompositeItem, activeItemIndex]
4613 );
4614 const hasData = !!data?.length;
4615 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
4616 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
4617 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
4618 if (!hasData) {
4619 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4620 "div",
4621 {
4622 className: clsx_default("dataviews-no-results", {
4623 "is-refreshing": isDelayedLoading
4624 }),
4625 children: empty
4626 }
4627 );
4628 }
4629 if (hasData && groupField && dataByGroup) {
4630 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4631 import_components10.Composite,
4632 {
4633 ref: compositeRef,
4634 id: `${baseId}`,
4635 render: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", {}),
4636 className: "dataviews-view-list__group",
4637 role: "grid",
4638 activeId: activeCompositeId,
4639 setActiveId: setActiveCompositeId,
4640 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4641 Stack,
4642 {
4643 direction: "column",
4644 gap: "lg",
4645 className: clsx_default("dataviews-view-list", className),
4646 children: Array.from(dataByGroup.entries()).map(
4647 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4648 Stack,
4649 {
4650 direction: "column",
4651 gap: "sm",
4652 children: [
4653 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("h3", { className: "dataviews-view-list__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n13.sprintf)(
4654 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
4655 (0, import_i18n13.__)("%1$s: %2$s"),
4656 groupField.label,
4657 groupName
4658 ) }),
4659 groupItems.map((item) => {
4660 const id = generateCompositeItemIdPrefix(item);
4661 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4662 ListItem,
4663 {
4664 view,
4665 idPrefix: id,
4666 actions,
4667 item,
4668 isSelected: item === selectedItem,
4669 onSelect,
4670 mediaField,
4671 titleField,
4672 descriptionField,
4673 otherFields,
4674 onDropdownTriggerKeyDown
4675 },
4676 id
4677 );
4678 })
4679 ]
4680 },
4681 groupName
4682 )
4683 )
4684 }
4685 )
4686 }
4687 );
4688 }
4689 return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
4690 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4691 import_components10.Composite,
4692 {
4693 ref: compositeRef,
4694 id: baseId,
4695 render: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", {}),
4696 className: clsx_default("dataviews-view-list", className, {
4697 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
4698 view.layout.density
4699 ),
4700 "is-refreshing": !isInfiniteScroll && isDelayedLoading
4701 }),
4702 role: view.infiniteScrollEnabled ? "feed" : "grid",
4703 activeId: activeCompositeId,
4704 setActiveId: setActiveCompositeId,
4705 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0,
4706 children: data.map((item, index) => {
4707 const id = generateCompositeItemIdPrefix(item);
4708 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4709 ListItem,
4710 {
4711 view,
4712 idPrefix: id,
4713 actions,
4714 item,
4715 isSelected: item === selectedItem,
4716 onSelect,
4717 mediaField,
4718 titleField,
4719 descriptionField,
4720 otherFields,
4721 onDropdownTriggerKeyDown,
4722 posinset: view.infiniteScrollEnabled ? index + 1 : void 0
4723 },
4724 id
4725 );
4726 })
4727 }
4728 ),
4729 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_components10.Spinner, {}) })
4730 ] });
4731 }
4732
4733 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
4734 var import_components12 = __toESM(require_components(), 1);
4735
4736 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-group.mjs
4737 var import_i18n14 = __toESM(require_i18n(), 1);
4738 var import_element17 = __toESM(require_element(), 1);
4739 var import_jsx_runtime37 = __toESM(require_jsx_runtime(), 1);
4740 function ActivityGroup({
4741 groupName,
4742 groupData,
4743 groupField,
4744 showLabel = true,
4745 children
4746 }) {
4747 const groupHeader = showLabel ? (0, import_element17.createInterpolateElement)(
4748 // translators: %s: The label of the field e.g. "Status".
4749 (0, import_i18n14.sprintf)((0, import_i18n14.__)("%s: <groupName />"), groupField.label).trim(),
4750 {
4751 groupName: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4752 groupField.render,
4753 {
4754 item: groupData[0],
4755 field: groupField
4756 }
4757 )
4758 }
4759 ) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(groupField.render, { item: groupData[0], field: groupField });
4760 return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
4761 Stack,
4762 {
4763 direction: "column",
4764 className: "dataviews-view-activity__group",
4765 children: [
4766 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h3", { className: "dataviews-view-activity__group-header", children: groupHeader }),
4767 children
4768 ]
4769 },
4770 groupName
4771 );
4772 }
4773
4774 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-item.mjs
4775 var import_components11 = __toESM(require_components(), 1);
4776 var import_element18 = __toESM(require_element(), 1);
4777 var import_data7 = __toESM(require_data(), 1);
4778 var import_compose5 = __toESM(require_compose(), 1);
4779 var import_jsx_runtime38 = __toESM(require_jsx_runtime(), 1);
4780 function ActivityItem(props) {
4781 const {
4782 view,
4783 actions,
4784 item,
4785 titleField,
4786 mediaField,
4787 descriptionField,
4788 otherFields,
4789 posinset,
4790 onClickItem,
4791 renderItemLink,
4792 isItemClickable
4793 } = props;
4794 const {
4795 showTitle = true,
4796 showMedia = true,
4797 showDescription = true,
4798 infiniteScrollEnabled
4799 } = view;
4800 const itemRef = (0, import_element18.useRef)(null);
4801 const registry = (0, import_data7.useRegistry)();
4802 const { paginationInfo } = (0, import_element18.useContext)(dataviews_context_default);
4803 const { primaryActions, eligibleActions } = (0, import_element18.useMemo)(() => {
4804 const _eligibleActions = actions.filter(
4805 (action) => !action.isEligible || action.isEligible(item)
4806 );
4807 const _primaryActions = _eligibleActions.filter(
4808 (action) => action.isPrimary
4809 );
4810 return {
4811 primaryActions: _primaryActions,
4812 eligibleActions: _eligibleActions
4813 };
4814 }, [actions, item]);
4815 const isMobileViewport = (0, import_compose5.useViewportMatch)("medium", "<");
4816 const density = view.layout?.density ?? "balanced";
4817 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4818 mediaField.render,
4819 {
4820 item,
4821 field: mediaField,
4822 config: {
4823 sizes: density === "comfortable" ? "32px" : "24px"
4824 }
4825 }
4826 ) : null;
4827 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "dataviews-view-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4828 "span",
4829 {
4830 className: "dataviews-view-activity__item-bullet",
4831 "aria-hidden": "true"
4832 }
4833 ) });
4834 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(titleField.render, { item, field: titleField }) : null;
4835 const verticalGap = (0, import_element18.useMemo)(() => {
4836 switch (density) {
4837 case "comfortable":
4838 return "md";
4839 default:
4840 return "sm";
4841 }
4842 }, [density]);
4843 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4844 "div",
4845 {
4846 ref: itemRef,
4847 role: infiniteScrollEnabled ? "article" : void 0,
4848 "aria-posinset": posinset,
4849 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
4850 className: clsx_default(
4851 "dataviews-view-activity__item",
4852 density === "compact" && "is-compact",
4853 density === "balanced" && "is-balanced",
4854 density === "comfortable" && "is-comfortable"
4855 ),
4856 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(Stack, { direction: "row", gap: "lg", justify: "start", align: "flex-start", children: [
4857 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4858 Stack,
4859 {
4860 direction: "column",
4861 gap: "xs",
4862 align: "center",
4863 className: "dataviews-view-activity__item-type",
4864 children: renderedMediaField
4865 }
4866 ),
4867 /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
4868 Stack,
4869 {
4870 direction: "column",
4871 gap: verticalGap,
4872 align: "flex-start",
4873 className: "dataviews-view-activity__item-content",
4874 children: [
4875 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4876 ItemClickWrapper,
4877 {
4878 item,
4879 isItemClickable,
4880 onClickItem,
4881 renderItemLink,
4882 className: "dataviews-view-activity__item-title",
4883 children: renderedTitleField
4884 }
4885 ),
4886 showDescription && descriptionField && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "dataviews-view-activity__item-description", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4887 descriptionField.render,
4888 {
4889 item,
4890 field: descriptionField
4891 }
4892 ) }),
4893 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "dataviews-view-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
4894 "div",
4895 {
4896 className: "dataviews-view-activity__item-field",
4897 children: [
4898 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4899 import_components11.VisuallyHidden,
4900 {
4901 as: "span",
4902 className: "dataviews-view-activity__item-field-label",
4903 children: field.label
4904 }
4905 ),
4906 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "dataviews-view-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4907 field.render,
4908 {
4909 item,
4910 field
4911 }
4912 ) })
4913 ]
4914 },
4915 field.id
4916 )) }),
4917 !!primaryActions?.length && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4918 PrimaryActions,
4919 {
4920 item,
4921 actions: primaryActions,
4922 registry,
4923 buttonVariant: "secondary"
4924 }
4925 )
4926 ]
4927 }
4928 ),
4929 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
4930 // there if there are any actions at all.
4931 isMobileViewport && // At the same time, only show the menu if there are actions to show.
4932 eligibleActions.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "dataviews-view-activity__item-actions", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4933 ItemActions,
4934 {
4935 item,
4936 actions: eligibleActions,
4937 isCompact: true
4938 }
4939 ) })
4940 ] })
4941 }
4942 );
4943 }
4944 var activity_item_default = ActivityItem;
4945
4946 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-items.mjs
4947 var import_react3 = __toESM(require_react(), 1);
4948 function isDefined3(item) {
4949 return !!item;
4950 }
4951 function ActivityItems(props) {
4952 const { data, fields, getItemId, view } = props;
4953 const titleField = fields.find((field) => field.id === view.titleField);
4954 const mediaField = fields.find((field) => field.id === view.mediaField);
4955 const descriptionField = fields.find(
4956 (field) => field.id === view.descriptionField
4957 );
4958 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined3);
4959 return data.map((item, index) => {
4960 return /* @__PURE__ */ (0, import_react3.createElement)(
4961 activity_item_default,
4962 {
4963 ...props,
4964 key: getItemId(item),
4965 item,
4966 mediaField,
4967 titleField,
4968 descriptionField,
4969 otherFields,
4970 posinset: view.infiniteScrollEnabled ? index + 1 : void 0
4971 }
4972 );
4973 });
4974 }
4975
4976 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
4977 var import_jsx_runtime39 = __toESM(require_jsx_runtime(), 1);
4978 function ViewActivity(props) {
4979 const { empty, data, fields, isLoading, view, className } = props;
4980 const isDelayedLoading = useDelayedLoading(!!isLoading);
4981 const hasData = !!data?.length;
4982 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
4983 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
4984 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
4985 if (!hasData) {
4986 return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
4987 "div",
4988 {
4989 className: clsx_default("dataviews-no-results", {
4990 "is-refreshing": isDelayedLoading
4991 }),
4992 children: empty
4993 }
4994 );
4995 }
4996 const isInert = !isInfiniteScroll && !!isLoading;
4997 const wrapperClassName = clsx_default("dataviews-view-activity", className, {
4998 "is-refreshing": !isInfiniteScroll && isDelayedLoading
4999 });
5000 const groupedEntries = dataByGroup ? Array.from(dataByGroup.entries()) : [];
5001 if (hasData && groupField && dataByGroup) {
5002 return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
5003 Stack,
5004 {
5005 direction: "column",
5006 gap: "sm",
5007 className: wrapperClassName,
5008 inert: isInert ? "true" : void 0,
5009 children: groupedEntries.map(
5010 ([groupName, groupData]) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
5011 ActivityGroup,
5012 {
5013 groupName,
5014 groupData,
5015 groupField,
5016 showLabel: view.groupBy?.showLabel !== false,
5017 children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
5018 ActivityItems,
5019 {
5020 ...props,
5021 data: groupData
5022 }
5023 )
5024 },
5025 groupName
5026 )
5027 )
5028 }
5029 );
5030 }
5031 return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
5032 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
5033 "div",
5034 {
5035 className: wrapperClassName,
5036 role: view.infiniteScrollEnabled ? "feed" : void 0,
5037 inert: isInert ? "true" : void 0,
5038 children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ActivityItems, { ...props })
5039 }
5040 ),
5041 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_components12.Spinner, {}) })
5042 ] });
5043 }
5044
5045 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
5046 var import_components15 = __toESM(require_components(), 1);
5047 var import_i18n17 = __toESM(require_i18n(), 1);
5048 var import_compose6 = __toESM(require_compose(), 1);
5049 var import_element21 = __toESM(require_element(), 1);
5050
5051 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
5052 var import_components14 = __toESM(require_components(), 1);
5053 var import_data8 = __toESM(require_data(), 1);
5054 var import_element20 = __toESM(require_element(), 1);
5055 var import_i18n16 = __toESM(require_i18n(), 1);
5056
5057 // packages/dataviews/build-module/components/dataviews-pagination/index.mjs
5058 var import_components13 = __toESM(require_components(), 1);
5059 var import_element19 = __toESM(require_element(), 1);
5060 var import_i18n15 = __toESM(require_i18n(), 1);
5061 var import_jsx_runtime40 = __toESM(require_jsx_runtime(), 1);
5062 function DataViewsPagination() {
5063 const {
5064 view,
5065 onChangeView,
5066 paginationInfo: { totalItems = 0, totalPages }
5067 } = (0, import_element19.useContext)(dataviews_context_default);
5068 if (!totalItems || !totalPages || view.infiniteScrollEnabled) {
5069 return null;
5070 }
5071 const currentPage = view.page ?? 1;
5072 const pageSelectOptions = Array.from(Array(totalPages)).map(
5073 (_, i2) => {
5074 const page = i2 + 1;
5075 return {
5076 value: page.toString(),
5077 label: page.toString(),
5078 "aria-label": currentPage === page ? (0, import_i18n15.sprintf)(
5079 // translators: 1: current page number. 2: total number of pages.
5080 (0, import_i18n15.__)("Page %1$d of %2$d"),
5081 currentPage,
5082 totalPages
5083 ) : page.toString()
5084 };
5085 }
5086 );
5087 return !!totalItems && totalPages !== 1 && /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
5088 Stack,
5089 {
5090 direction: "row",
5091 className: "dataviews-pagination",
5092 justify: "end",
5093 align: "center",
5094 gap: "xl",
5095 children: [
5096 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5097 Stack,
5098 {
5099 direction: "row",
5100 justify: "flex-start",
5101 align: "center",
5102 gap: "xs",
5103 className: "dataviews-pagination__page-select",
5104 children: (0, import_element19.createInterpolateElement)(
5105 (0, import_i18n15.sprintf)(
5106 // translators: 1: Current page number, 2: Total number of pages.
5107 (0, import_i18n15._x)(
5108 "<div>Page</div>%1$s<div>of %2$d</div>",
5109 "paging"
5110 ),
5111 "<CurrentPage />",
5112 totalPages
5113 ),
5114 {
5115 div: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { "aria-hidden": true }),
5116 // @ts-expect-error — Tag injected via sprintf argument, not visible in format string.
5117 CurrentPage: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5118 import_components13.SelectControl,
5119 {
5120 "aria-label": (0, import_i18n15.__)("Current page"),
5121 value: currentPage.toString(),
5122 options: pageSelectOptions,
5123 onChange: (newValue) => {
5124 onChangeView({
5125 ...view,
5126 page: +newValue
5127 });
5128 },
5129 size: "small",
5130 variant: "minimal"
5131 }
5132 )
5133 }
5134 )
5135 }
5136 ),
5137 /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(Stack, { direction: "row", gap: "xs", align: "center", children: [
5138 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5139 import_components13.Button,
5140 {
5141 onClick: () => onChangeView({
5142 ...view,
5143 page: currentPage - 1
5144 }),
5145 disabled: currentPage === 1,
5146 accessibleWhenDisabled: true,
5147 label: (0, import_i18n15.__)("Previous page"),
5148 icon: (0, import_i18n15.isRTL)() ? next_default : previous_default,
5149 showTooltip: true,
5150 size: "compact",
5151 tooltipPosition: "top"
5152 }
5153 ),
5154 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5155 import_components13.Button,
5156 {
5157 onClick: () => onChangeView({ ...view, page: currentPage + 1 }),
5158 disabled: currentPage >= totalPages,
5159 accessibleWhenDisabled: true,
5160 label: (0, import_i18n15.__)("Next page"),
5161 icon: (0, import_i18n15.isRTL)() ? previous_default : next_default,
5162 showTooltip: true,
5163 size: "compact",
5164 tooltipPosition: "top"
5165 }
5166 )
5167 ] })
5168 ]
5169 }
5170 );
5171 }
5172 var dataviews_pagination_default = (0, import_element19.memo)(DataViewsPagination);
5173
5174 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
5175 var import_jsx_runtime41 = __toESM(require_jsx_runtime(), 1);
5176 function useIsMultiselectPicker(actions) {
5177 return (0, import_element20.useMemo)(() => {
5178 return actions?.every((action) => action.supportsBulk);
5179 }, [actions]);
5180 }
5181
5182 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
5183 var import_jsx_runtime42 = __toESM(require_jsx_runtime(), 1);
5184 var { Badge: Badge2 } = unlock2(import_components15.privateApis);
5185 function GridItem3({
5186 view,
5187 multiselect,
5188 selection,
5189 onChangeSelection,
5190 getItemId,
5191 item,
5192 mediaField,
5193 titleField,
5194 descriptionField,
5195 regularFields,
5196 badgeFields,
5197 config,
5198 posinset,
5199 setsize
5200 }) {
5201 const { showTitle = true, showMedia = true, showDescription = true } = view;
5202 const id = getItemId(item);
5203 const elementRef = (0, import_element21.useRef)(null);
5204 const isSelected2 = selection.includes(id);
5205 useIntersectionObserver(elementRef, posinset);
5206 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5207 mediaField.render,
5208 {
5209 item,
5210 field: mediaField,
5211 config
5212 }
5213 ) : null;
5214 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(titleField.render, { item, field: titleField }) : null;
5215 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
5216 import_components15.Composite.Item,
5217 {
5218 ref: elementRef,
5219 "aria-label": titleField ? titleField.getValue({ item }) || (0, import_i18n17.__)("(no title)") : void 0,
5220 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Stack, { direction: "column", children, ...props }),
5221 role: "option",
5222 "aria-posinset": posinset,
5223 "aria-setsize": setsize,
5224 className: clsx_default("dataviews-view-picker-grid__card", {
5225 "is-selected": isSelected2
5226 }),
5227 "aria-selected": isSelected2,
5228 onClick: () => {
5229 if (isSelected2) {
5230 onChangeSelection(
5231 selection.filter((itemId) => id !== itemId)
5232 );
5233 } else {
5234 const newSelection = multiselect ? [...selection, id] : [id];
5235 onChangeSelection(newSelection);
5236 }
5237 },
5238 children: [
5239 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-picker-grid__media", children: renderedMediaField }),
5240 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5241 DataViewsSelectionCheckbox,
5242 {
5243 item,
5244 selection,
5245 onChangeSelection,
5246 getItemId,
5247 titleField,
5248 disabled: false,
5249 "aria-hidden": true,
5250 tabIndex: -1
5251 }
5252 ),
5253 showTitle && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5254 Stack,
5255 {
5256 direction: "row",
5257 justify: "space-between",
5258 className: "dataviews-view-picker-grid__title-actions",
5259 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-picker-grid__title-field dataviews-title-field", children: renderedTitleField })
5260 }
5261 ),
5262 /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(Stack, { direction: "column", gap: "xs", children: [
5263 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5264 descriptionField.render,
5265 {
5266 item,
5267 field: descriptionField
5268 }
5269 ),
5270 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5271 Stack,
5272 {
5273 direction: "row",
5274 className: "dataviews-view-picker-grid__badge-fields",
5275 gap: "sm",
5276 wrap: "wrap",
5277 align: "top",
5278 justify: "flex-start",
5279 children: badgeFields.map((field) => {
5280 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5281 Badge2,
5282 {
5283 className: "dataviews-view-picker-grid__field-value",
5284 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5285 field.render,
5286 {
5287 item,
5288 field
5289 }
5290 )
5291 },
5292 field.id
5293 );
5294 })
5295 }
5296 ),
5297 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5298 Stack,
5299 {
5300 direction: "column",
5301 className: "dataviews-view-picker-grid__fields",
5302 gap: "xs",
5303 children: regularFields.map((field) => {
5304 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5305 import_components15.Flex,
5306 {
5307 className: "dataviews-view-picker-grid__field",
5308 gap: 1,
5309 justify: "flex-start",
5310 expanded: true,
5311 style: { height: "auto" },
5312 direction: "row",
5313 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
5314 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components15.FlexItem, { className: "dataviews-view-picker-grid__field-name", children: field.header }),
5315 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5316 import_components15.FlexItem,
5317 {
5318 className: "dataviews-view-picker-grid__field-value",
5319 style: { maxHeight: "none" },
5320 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5321 field.render,
5322 {
5323 item,
5324 field
5325 }
5326 )
5327 }
5328 )
5329 ] })
5330 },
5331 field.id
5332 );
5333 })
5334 }
5335 )
5336 ] })
5337 ]
5338 },
5339 id
5340 );
5341 }
5342 function GridGroup({
5343 groupName,
5344 groupField,
5345 showLabel = true,
5346 children
5347 }) {
5348 const headerId = (0, import_compose6.useInstanceId)(
5349 GridGroup,
5350 "dataviews-view-picker-grid-group__header"
5351 );
5352 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
5353 Stack,
5354 {
5355 direction: "column",
5356 gap: "sm",
5357 role: "group",
5358 "aria-labelledby": headerId,
5359 children: [
5360 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5361 "h3",
5362 {
5363 className: "dataviews-view-picker-grid-group__header",
5364 id: headerId,
5365 children: showLabel ? (0, import_i18n17.sprintf)(
5366 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
5367 (0, import_i18n17.__)("%1$s: %2$s"),
5368 groupField.label,
5369 groupName
5370 ) : groupName
5371 }
5372 ),
5373 children
5374 ]
5375 },
5376 groupName
5377 );
5378 }
5379 function ViewPickerGrid({
5380 actions,
5381 data,
5382 fields,
5383 getItemId,
5384 isLoading,
5385 onChangeSelection,
5386 selection,
5387 view,
5388 className,
5389 empty
5390 }) {
5391 const { resizeObserverRef, paginationInfo, itemListLabel } = (0, import_element21.useContext)(dataviews_context_default);
5392 const titleField = fields.find(
5393 (field) => field.id === view?.titleField
5394 );
5395 const mediaField = fields.find(
5396 (field) => field.id === view?.mediaField
5397 );
5398 const descriptionField = fields.find(
5399 (field) => field.id === view?.descriptionField
5400 );
5401 const otherFields = view.fields ?? [];
5402 const { regularFields, badgeFields } = otherFields.reduce(
5403 (accumulator, fieldId) => {
5404 const field = fields.find((f2) => f2.id === fieldId);
5405 if (!field) {
5406 return accumulator;
5407 }
5408 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
5409 accumulator[key].push(field);
5410 return accumulator;
5411 },
5412 { regularFields: [], badgeFields: [] }
5413 );
5414 const hasData = !!data?.length;
5415 const usedPreviewSize = view.layout?.previewSize;
5416 const isMultiselect = useIsMultiselectPicker(actions);
5417 const size = "900px";
5418 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
5419 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
5420 const isInfiniteScroll = (view.infiniteScrollEnabled && !dataByGroup) ?? false;
5421 const currentPage = view?.page ?? 1;
5422 const perPage = view?.perPage ?? 0;
5423 const setSize = isInfiniteScroll ? paginationInfo?.totalItems : void 0;
5424 const gridColumns = useGridColumns();
5425 const placeholdersNeeded = usePlaceholdersNeeded(
5426 data,
5427 isInfiniteScroll,
5428 gridColumns
5429 );
5430 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, {
5431 // Render multiple groups.
5432 children: [
5433 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5434 import_components15.Composite,
5435 {
5436 virtualFocus: true,
5437 orientation: "horizontal",
5438 role: "listbox",
5439 "aria-multiselectable": isMultiselect,
5440 className: clsx_default(
5441 "dataviews-view-picker-grid",
5442 className,
5443 {
5444 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
5445 view.layout.density
5446 )
5447 }
5448 ),
5449 "aria-label": itemListLabel,
5450 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5451 Stack,
5452 {
5453 direction: "column",
5454 gap: "lg",
5455 children,
5456 ...props
5457 }
5458 ),
5459 children: Array.from(dataByGroup.entries()).map(
5460 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5461 GridGroup,
5462 {
5463 groupName,
5464 groupField,
5465 showLabel: view.groupBy?.showLabel !== false,
5466 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5467 GridItems,
5468 {
5469 previewSize: usedPreviewSize,
5470 style: {
5471 gridTemplateColumns: usedPreviewSize && `repeat(auto-fill, minmax(${usedPreviewSize}px, 1fr))`
5472 },
5473 "aria-busy": isLoading,
5474 ref: resizeObserverRef,
5475 children: groupItems.map((item) => {
5476 const posInSet = item.position ?? (currentPage - 1) * perPage + data.indexOf(item) + 1;
5477 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5478 GridItem3,
5479 {
5480 view,
5481 multiselect: isMultiselect,
5482 selection,
5483 onChangeSelection,
5484 getItemId,
5485 item,
5486 mediaField,
5487 titleField,
5488 descriptionField,
5489 regularFields,
5490 badgeFields,
5491 config: {
5492 sizes: size
5493 },
5494 posinset: posInSet,
5495 setsize: setSize
5496 },
5497 getItemId(item)
5498 );
5499 })
5500 }
5501 )
5502 },
5503 groupName
5504 )
5505 )
5506 }
5507 ),
5508 // Render a single grid with all data.
5509 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
5510 import_components15.Composite,
5511 {
5512 render: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5513 GridItems,
5514 {
5515 className: clsx_default(
5516 "dataviews-view-picker-grid",
5517 className,
5518 {
5519 [`has-${view.layout?.density}-density`]: view.layout?.density && [
5520 "compact",
5521 "comfortable"
5522 ].includes(view.layout.density)
5523 }
5524 ),
5525 previewSize: usedPreviewSize,
5526 "aria-busy": isLoading,
5527 ref: resizeObserverRef
5528 }
5529 ),
5530 virtualFocus: true,
5531 orientation: "horizontal",
5532 role: "listbox",
5533 "aria-multiselectable": isMultiselect,
5534 "aria-label": itemListLabel,
5535 children: [
5536 Array.from({ length: placeholdersNeeded }).map(
5537 (_, index) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5538 import_components15.Composite.Item,
5539 {
5540 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5541 Stack,
5542 {
5543 direction: "column",
5544 children,
5545 ...props
5546 }
5547 ),
5548 role: "option",
5549 "aria-hidden": true,
5550 tabIndex: -1,
5551 className: "dataviews-view-picker-grid__card dataviews-view-picker-grid__placeholder"
5552 },
5553 `placeholder-${index}`
5554 )
5555 ),
5556 data.map((item) => {
5557 const posinset = item.position;
5558 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5559 GridItem3,
5560 {
5561 view,
5562 multiselect: isMultiselect,
5563 selection,
5564 onChangeSelection,
5565 getItemId,
5566 item,
5567 mediaField,
5568 titleField,
5569 descriptionField,
5570 regularFields,
5571 badgeFields,
5572 config: {
5573 sizes: size
5574 },
5575 posinset,
5576 setsize: setSize
5577 },
5578 getItemId(item)
5579 );
5580 })
5581 ]
5582 }
5583 ),
5584 // Render empty state.
5585 !hasData && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5586 "div",
5587 {
5588 className: clsx_default({
5589 "dataviews-loading": isLoading,
5590 "dataviews-no-results": !isLoading
5591 }),
5592 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components15.Spinner, {}) }) : empty
5593 }
5594 ),
5595 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components15.Spinner, {}) })
5596 ]
5597 });
5598 }
5599 var picker_grid_default = ViewPickerGrid;
5600
5601 // packages/dataviews/build-module/components/dataviews-layouts/picker-table/index.mjs
5602 var import_i18n18 = __toESM(require_i18n(), 1);
5603 var import_components16 = __toESM(require_components(), 1);
5604 var import_element22 = __toESM(require_element(), 1);
5605 var import_jsx_runtime43 = __toESM(require_jsx_runtime(), 1);
5606 function TableColumnField2({
5607 item,
5608 fields,
5609 column,
5610 align
5611 }) {
5612 const field = fields.find((f2) => f2.id === column);
5613 if (!field) {
5614 return null;
5615 }
5616 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
5617 "dataviews-view-table__cell-align-end": align === "end",
5618 "dataviews-view-table__cell-align-center": align === "center"
5619 });
5620 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(field.render, { item, field }) });
5621 }
5622 function TableRow2({
5623 item,
5624 fields,
5625 id,
5626 view,
5627 titleField,
5628 mediaField,
5629 descriptionField,
5630 selection,
5631 getItemId,
5632 onChangeSelection,
5633 multiselect,
5634 posinset
5635 }) {
5636 const { paginationInfo } = (0, import_element22.useContext)(dataviews_context_default);
5637 const isSelected2 = selection.includes(id);
5638 const [isHovered, setIsHovered] = (0, import_element22.useState)(false);
5639 const elementRef = (0, import_element22.useRef)(null);
5640 useIntersectionObserver(elementRef, posinset);
5641 const {
5642 showTitle = true,
5643 showMedia = true,
5644 showDescription = true,
5645 infiniteScrollEnabled
5646 } = view;
5647 const handleMouseEnter = () => {
5648 setIsHovered(true);
5649 };
5650 const handleMouseLeave = () => {
5651 setIsHovered(false);
5652 };
5653 const columns = view.fields ?? [];
5654 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
5655 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5656 import_components16.Composite.Item,
5657 {
5658 ref: elementRef,
5659 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5660 "tr",
5661 {
5662 className: clsx_default("dataviews-view-table__row", {
5663 "is-selected": isSelected2,
5664 "is-hovered": isHovered
5665 }),
5666 onMouseEnter: handleMouseEnter,
5667 onMouseLeave: handleMouseLeave,
5668 children,
5669 ...props
5670 }
5671 ),
5672 "aria-selected": isSelected2,
5673 "aria-setsize": paginationInfo.totalItems || void 0,
5674 "aria-posinset": posinset,
5675 role: infiniteScrollEnabled ? "article" : "option",
5676 onClick: () => {
5677 if (isSelected2) {
5678 onChangeSelection(
5679 selection.filter((itemId) => id !== itemId)
5680 );
5681 } else {
5682 const newSelection = multiselect ? [...selection, id] : [id];
5683 onChangeSelection(newSelection);
5684 }
5685 },
5686 children: [
5687 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5688 "td",
5689 {
5690 className: "dataviews-view-table__checkbox-column",
5691 role: "presentation",
5692 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5693 DataViewsSelectionCheckbox,
5694 {
5695 item,
5696 selection,
5697 onChangeSelection,
5698 getItemId,
5699 titleField,
5700 disabled: false,
5701 "aria-hidden": true,
5702 tabIndex: -1
5703 }
5704 ) })
5705 }
5706 ),
5707 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5708 "td",
5709 {
5710 role: "presentation",
5711 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5712 column_primary_default,
5713 {
5714 item,
5715 titleField: showTitle ? titleField : void 0,
5716 mediaField: showMedia ? mediaField : void 0,
5717 descriptionField: showDescription ? descriptionField : void 0,
5718 isItemClickable: () => false
5719 }
5720 )
5721 }
5722 ),
5723 columns.map((column) => {
5724 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
5725 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5726 "td",
5727 {
5728 style: {
5729 width,
5730 maxWidth,
5731 minWidth
5732 },
5733 role: "presentation",
5734 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5735 TableColumnField2,
5736 {
5737 fields,
5738 item,
5739 column,
5740 align
5741 }
5742 )
5743 },
5744 column
5745 );
5746 })
5747 ]
5748 },
5749 id
5750 );
5751 }
5752 function ViewPickerTable({
5753 actions,
5754 data,
5755 fields,
5756 getItemId,
5757 isLoading = false,
5758 onChangeView,
5759 onChangeSelection,
5760 selection,
5761 setOpenedFilter,
5762 view,
5763 className,
5764 empty
5765 }) {
5766 const headerMenuRefs = (0, import_element22.useRef)(/* @__PURE__ */ new Map());
5767 const headerMenuToFocusRef = (0, import_element22.useRef)(void 0);
5768 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element22.useState)();
5769 const isMultiselect = useIsMultiselectPicker(actions) ?? false;
5770 (0, import_element22.useEffect)(() => {
5771 if (headerMenuToFocusRef.current) {
5772 headerMenuToFocusRef.current.focus();
5773 headerMenuToFocusRef.current = void 0;
5774 }
5775 });
5776 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
5777 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
5778 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
5779 const tableNoticeId = (0, import_element22.useId)();
5780 if (nextHeaderMenuToFocus) {
5781 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
5782 setNextHeaderMenuToFocus(void 0);
5783 return;
5784 }
5785 const onHide = (field) => {
5786 const hidden = headerMenuRefs.current.get(field.id);
5787 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
5788 setNextHeaderMenuToFocus(fallback?.node);
5789 };
5790 const hasData = !!data?.length;
5791 const titleField = fields.find((field) => field.id === view.titleField);
5792 const mediaField = fields.find((field) => field.id === view.mediaField);
5793 const descriptionField = fields.find(
5794 (field) => field.id === view.descriptionField
5795 );
5796 const { showTitle = true, showMedia = true, showDescription = true } = view;
5797 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
5798 const columns = view.fields ?? [];
5799 const headerMenuRef = (column, index) => (node) => {
5800 if (node) {
5801 headerMenuRefs.current.set(column, {
5802 node,
5803 fallback: columns[index > 0 ? index - 1 : 1]
5804 });
5805 } else {
5806 headerMenuRefs.current.delete(column);
5807 }
5808 };
5809 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_jsx_runtime43.Fragment, { children: [
5810 /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5811 "table",
5812 {
5813 className: clsx_default(
5814 "dataviews-view-table",
5815 "dataviews-view-picker-table",
5816 className,
5817 {
5818 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
5819 view.layout.density
5820 )
5821 }
5822 ),
5823 "aria-busy": isLoading,
5824 "aria-describedby": tableNoticeId,
5825 role: isInfiniteScroll ? "feed" : "listbox",
5826 children: [
5827 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("thead", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5828 "tr",
5829 {
5830 className: "dataviews-view-table__row",
5831 role: "presentation",
5832 children: [
5833 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("th", { className: "dataviews-view-table__checkbox-column", children: isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5834 BulkSelectionCheckbox,
5835 {
5836 selection,
5837 onChangeSelection,
5838 data,
5839 actions,
5840 getItemId,
5841 disableSelectAll: isInfiniteScroll
5842 }
5843 ) }),
5844 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("th", { children: titleField && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5845 column_header_menu_default,
5846 {
5847 ref: headerMenuRef(
5848 titleField.id,
5849 0
5850 ),
5851 fieldId: titleField.id,
5852 view,
5853 fields,
5854 onChangeView,
5855 onHide,
5856 setOpenedFilter,
5857 canMove: false
5858 }
5859 ) }),
5860 columns.map((column, index) => {
5861 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
5862 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5863 "th",
5864 {
5865 style: {
5866 width,
5867 maxWidth,
5868 minWidth,
5869 textAlign: align
5870 },
5871 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
5872 scope: "col",
5873 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5874 column_header_menu_default,
5875 {
5876 ref: headerMenuRef(column, index),
5877 fieldId: column,
5878 view,
5879 fields,
5880 onChangeView,
5881 onHide,
5882 setOpenedFilter,
5883 canMove: view.layout?.enableMoving ?? true
5884 }
5885 )
5886 },
5887 column
5888 );
5889 })
5890 ]
5891 }
5892 ) }),
5893 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
5894 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5895 import_components16.Composite,
5896 {
5897 virtualFocus: true,
5898 orientation: "vertical",
5899 render: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("tbody", { role: "group" }),
5900 children: [
5901 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5902 "tr",
5903 {
5904 className: "dataviews-view-table__group-header-row",
5905 role: "presentation",
5906 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5907 "td",
5908 {
5909 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + 1,
5910 className: "dataviews-view-table__group-header-cell",
5911 role: "presentation",
5912 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n18.sprintf)(
5913 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
5914 (0, import_i18n18.__)("%1$s: %2$s"),
5915 groupField.label,
5916 groupName
5917 )
5918 }
5919 )
5920 }
5921 ),
5922 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5923 TableRow2,
5924 {
5925 item,
5926 fields,
5927 id: getItemId(item) || index.toString(),
5928 view,
5929 titleField,
5930 mediaField,
5931 descriptionField,
5932 selection,
5933 getItemId,
5934 onChangeSelection,
5935 multiselect: isMultiselect
5936 },
5937 getItemId(item)
5938 ))
5939 ]
5940 },
5941 `group-${groupName}`
5942 )
5943 ) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5944 import_components16.Composite,
5945 {
5946 render: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("tbody", { role: "presentation" }),
5947 virtualFocus: true,
5948 orientation: "vertical",
5949 children: hasData && data.map((item, index) => {
5950 const itemId = getItemId(item);
5951 const posinset = item.position;
5952 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5953 TableRow2,
5954 {
5955 item,
5956 fields,
5957 id: itemId || index.toString(),
5958 view,
5959 titleField,
5960 mediaField,
5961 descriptionField,
5962 selection,
5963 getItemId,
5964 onChangeSelection,
5965 multiselect: isMultiselect,
5966 posinset
5967 },
5968 itemId
5969 );
5970 })
5971 }
5972 )
5973 ]
5974 }
5975 ),
5976 /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5977 "div",
5978 {
5979 className: clsx_default({
5980 "dataviews-loading": isLoading,
5981 "dataviews-no-results": !hasData && !isLoading
5982 }),
5983 id: tableNoticeId,
5984 children: [
5985 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components16.Spinner, {}) }) : empty),
5986 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components16.Spinner, {}) })
5987 ]
5988 }
5989 )
5990 ] });
5991 }
5992 var picker_table_default = ViewPickerTable;
5993
5994 // packages/dataviews/build-module/components/dataviews-layouts/utils/density-picker.mjs
5995 var import_components17 = __toESM(require_components(), 1);
5996 var import_i18n19 = __toESM(require_i18n(), 1);
5997 var import_element23 = __toESM(require_element(), 1);
5998 var import_jsx_runtime44 = __toESM(require_jsx_runtime(), 1);
5999 function DensityPicker() {
6000 const context = (0, import_element23.useContext)(dataviews_context_default);
6001 const view = context.view;
6002 return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
6003 import_components17.__experimentalToggleGroupControl,
6004 {
6005 size: "__unstable-large",
6006 label: (0, import_i18n19.__)("Density"),
6007 value: view.layout?.density || "balanced",
6008 onChange: (value) => {
6009 context.onChangeView({
6010 ...view,
6011 layout: {
6012 ...view.layout,
6013 density: value
6014 }
6015 });
6016 },
6017 isBlock: true,
6018 children: [
6019 /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
6020 import_components17.__experimentalToggleGroupControlOption,
6021 {
6022 value: "comfortable",
6023 label: (0, import_i18n19._x)(
6024 "Comfortable",
6025 "Density option for DataView layout"
6026 )
6027 },
6028 "comfortable"
6029 ),
6030 /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
6031 import_components17.__experimentalToggleGroupControlOption,
6032 {
6033 value: "balanced",
6034 label: (0, import_i18n19._x)("Balanced", "Density option for DataView layout")
6035 },
6036 "balanced"
6037 ),
6038 /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
6039 import_components17.__experimentalToggleGroupControlOption,
6040 {
6041 value: "compact",
6042 label: (0, import_i18n19._x)("Compact", "Density option for DataView layout")
6043 },
6044 "compact"
6045 )
6046 ]
6047 }
6048 );
6049 }
6050
6051 // packages/dataviews/build-module/components/dataviews-layouts/utils/preview-size-picker.mjs
6052 var import_components18 = __toESM(require_components(), 1);
6053 var import_i18n20 = __toESM(require_i18n(), 1);
6054 var import_element24 = __toESM(require_element(), 1);
6055 var import_jsx_runtime45 = __toESM(require_jsx_runtime(), 1);
6056 var imageSizes2 = [
6057 {
6058 value: 120,
6059 breakpoint: 1
6060 },
6061 {
6062 value: 170,
6063 breakpoint: 1
6064 },
6065 {
6066 value: 230,
6067 breakpoint: 1
6068 },
6069 {
6070 value: 290,
6071 breakpoint: 1112
6072 // at minimum image width, 4 images display at this container size
6073 },
6074 {
6075 value: 350,
6076 breakpoint: 1636
6077 // at minimum image width, 6 images display at this container size
6078 },
6079 {
6080 value: 430,
6081 breakpoint: 588
6082 // at minimum image width, 2 images display at this container size
6083 }
6084 ];
6085 function PreviewSizePicker() {
6086 const context = (0, import_element24.useContext)(dataviews_context_default);
6087 const view = context.view;
6088 const breakValues = imageSizes2.filter((size) => {
6089 return context.containerWidth >= size.breakpoint;
6090 });
6091 const layoutPreviewSize = view.layout?.previewSize ?? 230;
6092 const previewSizeToUse = breakValues.map((size, index) => ({ ...size, index })).filter((size) => size.value <= layoutPreviewSize).sort((a2, b2) => b2.value - a2.value)[0]?.index ?? 0;
6093 const marks = breakValues.map((size, index) => {
6094 return {
6095 value: index
6096 };
6097 });
6098 return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
6099 import_components18.RangeControl,
6100 {
6101 __next40pxDefaultSize: true,
6102 showTooltip: false,
6103 label: (0, import_i18n20.__)("Preview size"),
6104 value: previewSizeToUse,
6105 min: 0,
6106 max: breakValues.length - 1,
6107 withInputField: false,
6108 onChange: (value = 0) => {
6109 context.onChangeView({
6110 ...view,
6111 layout: {
6112 ...view.layout,
6113 previewSize: breakValues[value].value
6114 }
6115 });
6116 },
6117 step: 1,
6118 marks
6119 }
6120 );
6121 }
6122
6123 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-config-options.mjs
6124 var import_jsx_runtime46 = __toESM(require_jsx_runtime(), 1);
6125 function GridConfigOptions() {
6126 return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_jsx_runtime46.Fragment, { children: [
6127 /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(DensityPicker, {}),
6128 /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(PreviewSizePicker, {})
6129 ] });
6130 }
6131
6132 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
6133 var VIEW_LAYOUTS = [
6134 {
6135 type: LAYOUT_TABLE,
6136 label: (0, import_i18n21.__)("Table"),
6137 component: table_default,
6138 icon: block_table_default,
6139 viewConfigOptions: DensityPicker
6140 },
6141 {
6142 type: LAYOUT_GRID,
6143 label: (0, import_i18n21.__)("Grid"),
6144 component: grid_default,
6145 icon: category_default,
6146 viewConfigOptions: GridConfigOptions
6147 },
6148 {
6149 type: LAYOUT_LIST,
6150 label: (0, import_i18n21.__)("List"),
6151 component: ViewList,
6152 icon: (0, import_i18n21.isRTL)() ? format_list_bullets_rtl_default : format_list_bullets_default,
6153 viewConfigOptions: DensityPicker
6154 },
6155 {
6156 type: LAYOUT_ACTIVITY,
6157 label: (0, import_i18n21.__)("Activity"),
6158 component: ViewActivity,
6159 icon: scheduled_default,
6160 viewConfigOptions: DensityPicker
6161 },
6162 {
6163 type: LAYOUT_PICKER_GRID,
6164 label: (0, import_i18n21.__)("Grid"),
6165 component: picker_grid_default,
6166 icon: category_default,
6167 viewConfigOptions: GridConfigOptions,
6168 isPicker: true
6169 },
6170 {
6171 type: LAYOUT_PICKER_TABLE,
6172 label: (0, import_i18n21.__)("Table"),
6173 component: picker_table_default,
6174 icon: block_table_default,
6175 viewConfigOptions: DensityPicker,
6176 isPicker: true
6177 }
6178 ];
6179
6180 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
6181 var import_element32 = __toESM(require_element(), 1);
6182
6183 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
6184 var import_components21 = __toESM(require_components(), 1);
6185 var import_i18n24 = __toESM(require_i18n(), 1);
6186 var import_element29 = __toESM(require_element(), 1);
6187
6188 // node_modules/@ariakit/core/esm/__chunks/XMCVU3LR.js
6189 function noop(..._) {
6190 }
6191 function applyState(argument, currentValue) {
6192 if (isUpdater(argument)) {
6193 const value = isLazyValue(currentValue) ? currentValue() : currentValue;
6194 return argument(value);
6195 }
6196 return argument;
6197 }
6198 function isUpdater(argument) {
6199 return typeof argument === "function";
6200 }
6201 function isLazyValue(value) {
6202 return typeof value === "function";
6203 }
6204 function hasOwnProperty(object, prop) {
6205 if (typeof Object.hasOwn === "function") {
6206 return Object.hasOwn(object, prop);
6207 }
6208 return Object.prototype.hasOwnProperty.call(object, prop);
6209 }
6210 function chain(...fns) {
6211 return (...args) => {
6212 for (const fn of fns) {
6213 if (typeof fn === "function") {
6214 fn(...args);
6215 }
6216 }
6217 };
6218 }
6219 function normalizeString(str) {
6220 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
6221 }
6222 function omit2(object, keys) {
6223 const result = { ...object };
6224 for (const key of keys) {
6225 if (hasOwnProperty(result, key)) {
6226 delete result[key];
6227 }
6228 }
6229 return result;
6230 }
6231 function pick(object, paths) {
6232 const result = {};
6233 for (const key of paths) {
6234 if (hasOwnProperty(object, key)) {
6235 result[key] = object[key];
6236 }
6237 }
6238 return result;
6239 }
6240 function identity(value) {
6241 return value;
6242 }
6243 function invariant(condition, message2) {
6244 if (condition) return;
6245 if (typeof message2 !== "string") throw new Error("Invariant failed");
6246 throw new Error(message2);
6247 }
6248 function getKeys(obj) {
6249 return Object.keys(obj);
6250 }
6251 function isFalsyBooleanCallback(booleanOrCallback, ...args) {
6252 const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback;
6253 if (result == null) return false;
6254 return !result;
6255 }
6256 function disabledFromProps(props) {
6257 return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true";
6258 }
6259 function removeUndefinedValues(obj) {
6260 const result = {};
6261 for (const key in obj) {
6262 if (obj[key] !== void 0) {
6263 result[key] = obj[key];
6264 }
6265 }
6266 return result;
6267 }
6268 function defaultValue(...values) {
6269 for (const value of values) {
6270 if (value !== void 0) return value;
6271 }
6272 return void 0;
6273 }
6274
6275 // node_modules/@ariakit/react-core/esm/__chunks/YXGXYGQX.js
6276 var import_react4 = __toESM(require_react(), 1);
6277 function setRef(ref, value) {
6278 if (typeof ref === "function") {
6279 ref(value);
6280 } else if (ref) {
6281 ref.current = value;
6282 }
6283 }
6284 function isValidElementWithRef(element) {
6285 if (!element) return false;
6286 if (!(0, import_react4.isValidElement)(element)) return false;
6287 if ("ref" in element.props) return true;
6288 if ("ref" in element) return true;
6289 return false;
6290 }
6291 function getRefProperty(element) {
6292 if (!isValidElementWithRef(element)) return null;
6293 const props = { ...element.props };
6294 return props.ref || element.ref;
6295 }
6296 function mergeProps2(base, overrides) {
6297 const props = { ...base };
6298 for (const key in overrides) {
6299 if (!hasOwnProperty(overrides, key)) continue;
6300 if (key === "className") {
6301 const prop = "className";
6302 props[prop] = base[prop] ? `${base[prop]} ${overrides[prop]}` : overrides[prop];
6303 continue;
6304 }
6305 if (key === "style") {
6306 const prop = "style";
6307 props[prop] = base[prop] ? { ...base[prop], ...overrides[prop] } : overrides[prop];
6308 continue;
6309 }
6310 const overrideValue = overrides[key];
6311 if (typeof overrideValue === "function" && key.startsWith("on")) {
6312 const baseValue = base[key];
6313 if (typeof baseValue === "function") {
6314 props[key] = (...args) => {
6315 overrideValue(...args);
6316 baseValue(...args);
6317 };
6318 continue;
6319 }
6320 }
6321 props[key] = overrideValue;
6322 }
6323 return props;
6324 }
6325
6326 // node_modules/@ariakit/core/esm/__chunks/3DNM6L6E.js
6327 var canUseDOM = checkIsBrowser();
6328 function checkIsBrowser() {
6329 var _a;
6330 return typeof window !== "undefined" && !!((_a = window.document) == null ? void 0 : _a.createElement);
6331 }
6332 function getDocument(node) {
6333 if (!node) return document;
6334 if ("self" in node) return node.document;
6335 return node.ownerDocument || document;
6336 }
6337 function getActiveElement(node, activeDescendant = false) {
6338 var _a;
6339 const { activeElement } = getDocument(node);
6340 if (!(activeElement == null ? void 0 : activeElement.nodeName)) {
6341 return null;
6342 }
6343 if (isFrame(activeElement) && ((_a = activeElement.contentDocument) == null ? void 0 : _a.body)) {
6344 return getActiveElement(
6345 activeElement.contentDocument.body,
6346 activeDescendant
6347 );
6348 }
6349 if (activeDescendant) {
6350 const id = activeElement.getAttribute("aria-activedescendant");
6351 if (id) {
6352 const element = getDocument(activeElement).getElementById(id);
6353 if (element) {
6354 return element;
6355 }
6356 }
6357 }
6358 return activeElement;
6359 }
6360 function contains(parent, child) {
6361 return parent === child || parent.contains(child);
6362 }
6363 function isFrame(element) {
6364 return element.tagName === "IFRAME";
6365 }
6366 function isButton(element) {
6367 const tagName = element.tagName.toLowerCase();
6368 if (tagName === "button") return true;
6369 if (tagName === "input" && element.type) {
6370 return buttonInputTypes.indexOf(element.type) !== -1;
6371 }
6372 return false;
6373 }
6374 var buttonInputTypes = [
6375 "button",
6376 "color",
6377 "file",
6378 "image",
6379 "reset",
6380 "submit"
6381 ];
6382 function isVisible(element) {
6383 if (typeof element.checkVisibility === "function") {
6384 return element.checkVisibility();
6385 }
6386 const htmlElement = element;
6387 return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0;
6388 }
6389 function isTextField(element) {
6390 try {
6391 const isTextInput = element instanceof HTMLInputElement && element.selectionStart !== null;
6392 const isTextArea = element.tagName === "TEXTAREA";
6393 return isTextInput || isTextArea || false;
6394 } catch (_error) {
6395 return false;
6396 }
6397 }
6398 function isTextbox(element) {
6399 return element.isContentEditable || isTextField(element);
6400 }
6401 function getTextboxValue(element) {
6402 if (isTextField(element)) {
6403 return element.value;
6404 }
6405 if (element.isContentEditable) {
6406 const range = getDocument(element).createRange();
6407 range.selectNodeContents(element);
6408 return range.toString();
6409 }
6410 return "";
6411 }
6412 function getTextboxSelection(element) {
6413 let start = 0;
6414 let end = 0;
6415 if (isTextField(element)) {
6416 start = element.selectionStart || 0;
6417 end = element.selectionEnd || 0;
6418 } else if (element.isContentEditable) {
6419 const selection = getDocument(element).getSelection();
6420 if ((selection == null ? void 0 : selection.rangeCount) && selection.anchorNode && contains(element, selection.anchorNode) && selection.focusNode && contains(element, selection.focusNode)) {
6421 const range = selection.getRangeAt(0);
6422 const nextRange = range.cloneRange();
6423 nextRange.selectNodeContents(element);
6424 nextRange.setEnd(range.startContainer, range.startOffset);
6425 start = nextRange.toString().length;
6426 nextRange.setEnd(range.endContainer, range.endOffset);
6427 end = nextRange.toString().length;
6428 }
6429 }
6430 return { start, end };
6431 }
6432 function getPopupRole(element, fallback) {
6433 const allowedPopupRoles = ["dialog", "menu", "listbox", "tree", "grid"];
6434 const role = element == null ? void 0 : element.getAttribute("role");
6435 if (role && allowedPopupRoles.indexOf(role) !== -1) {
6436 return role;
6437 }
6438 return fallback;
6439 }
6440 function getScrollingElement(element) {
6441 if (!element) return null;
6442 const isScrollableOverflow = (overflow) => {
6443 if (overflow === "auto") return true;
6444 if (overflow === "scroll") return true;
6445 return false;
6446 };
6447 if (element.clientHeight && element.scrollHeight > element.clientHeight) {
6448 const { overflowY } = getComputedStyle(element);
6449 if (isScrollableOverflow(overflowY)) return element;
6450 } else if (element.clientWidth && element.scrollWidth > element.clientWidth) {
6451 const { overflowX } = getComputedStyle(element);
6452 if (isScrollableOverflow(overflowX)) return element;
6453 }
6454 return getScrollingElement(element.parentElement) || document.scrollingElement || document.body;
6455 }
6456 function setSelectionRange(element, ...args) {
6457 if (/text|search|password|tel|url/i.test(element.type)) {
6458 element.setSelectionRange(...args);
6459 }
6460 }
6461 function sortBasedOnDOMPosition(items, getElement) {
6462 const pairs = items.map((item, index) => [index, item]);
6463 let isOrderDifferent = false;
6464 pairs.sort(([indexA, a2], [indexB, b2]) => {
6465 const elementA = getElement(a2);
6466 const elementB = getElement(b2);
6467 if (elementA === elementB) return 0;
6468 if (!elementA || !elementB) return 0;
6469 if (isElementPreceding(elementA, elementB)) {
6470 if (indexA > indexB) {
6471 isOrderDifferent = true;
6472 }
6473 return -1;
6474 }
6475 if (indexA < indexB) {
6476 isOrderDifferent = true;
6477 }
6478 return 1;
6479 });
6480 if (isOrderDifferent) {
6481 return pairs.map(([_, item]) => item);
6482 }
6483 return items;
6484 }
6485 function isElementPreceding(a2, b2) {
6486 return Boolean(
6487 b2.compareDocumentPosition(a2) & Node.DOCUMENT_POSITION_PRECEDING
6488 );
6489 }
6490
6491 // node_modules/@ariakit/core/esm/__chunks/SNHYQNEZ.js
6492 function isTouchDevice() {
6493 return canUseDOM && !!navigator.maxTouchPoints;
6494 }
6495 function isApple() {
6496 if (!canUseDOM) return false;
6497 return /mac|iphone|ipad|ipod/i.test(navigator.platform);
6498 }
6499 function isSafari() {
6500 return canUseDOM && isApple() && /apple/i.test(navigator.vendor);
6501 }
6502 function isFirefox() {
6503 return canUseDOM && /firefox\//i.test(navigator.userAgent);
6504 }
6505
6506 // node_modules/@ariakit/core/esm/utils/events.js
6507 function isPortalEvent(event) {
6508 return Boolean(
6509 event.currentTarget && !contains(event.currentTarget, event.target)
6510 );
6511 }
6512 function isSelfTarget(event) {
6513 return event.target === event.currentTarget;
6514 }
6515 function isOpeningInNewTab(event) {
6516 const element = event.currentTarget;
6517 if (!element) return false;
6518 const isAppleDevice = isApple();
6519 if (isAppleDevice && !event.metaKey) return false;
6520 if (!isAppleDevice && !event.ctrlKey) return false;
6521 const tagName = element.tagName.toLowerCase();
6522 if (tagName === "a") return true;
6523 if (tagName === "button" && element.type === "submit") return true;
6524 if (tagName === "input" && element.type === "submit") return true;
6525 return false;
6526 }
6527 function isDownloading(event) {
6528 const element = event.currentTarget;
6529 if (!element) return false;
6530 const tagName = element.tagName.toLowerCase();
6531 if (!event.altKey) return false;
6532 if (tagName === "a") return true;
6533 if (tagName === "button" && element.type === "submit") return true;
6534 if (tagName === "input" && element.type === "submit") return true;
6535 return false;
6536 }
6537 function fireBlurEvent(element, eventInit) {
6538 const event = new FocusEvent("blur", eventInit);
6539 const defaultAllowed = element.dispatchEvent(event);
6540 const bubbleInit = { ...eventInit, bubbles: true };
6541 element.dispatchEvent(new FocusEvent("focusout", bubbleInit));
6542 return defaultAllowed;
6543 }
6544 function fireKeyboardEvent(element, type, eventInit) {
6545 const event = new KeyboardEvent(type, eventInit);
6546 return element.dispatchEvent(event);
6547 }
6548 function fireClickEvent(element, eventInit) {
6549 const event = new MouseEvent("click", eventInit);
6550 return element.dispatchEvent(event);
6551 }
6552 function isFocusEventOutside(event, container) {
6553 const containerElement = container || event.currentTarget;
6554 const relatedTarget = event.relatedTarget;
6555 return !relatedTarget || !contains(containerElement, relatedTarget);
6556 }
6557 function queueBeforeEvent(element, type, callback, timeout) {
6558 const createTimer = (callback2) => {
6559 if (timeout) {
6560 const timerId2 = setTimeout(callback2, timeout);
6561 return () => clearTimeout(timerId2);
6562 }
6563 const timerId = requestAnimationFrame(callback2);
6564 return () => cancelAnimationFrame(timerId);
6565 };
6566 const cancelTimer = createTimer(() => {
6567 element.removeEventListener(type, callSync, true);
6568 callback();
6569 });
6570 const callSync = () => {
6571 cancelTimer();
6572 callback();
6573 };
6574 element.addEventListener(type, callSync, { once: true, capture: true });
6575 return cancelTimer;
6576 }
6577 function addGlobalEventListener(type, listener, options, scope = window) {
6578 const children = [];
6579 try {
6580 scope.document.addEventListener(type, listener, options);
6581 for (const frame of Array.from(scope.frames)) {
6582 children.push(addGlobalEventListener(type, listener, options, frame));
6583 }
6584 } catch (e2) {
6585 }
6586 const removeEventListener = () => {
6587 try {
6588 scope.document.removeEventListener(type, listener, options);
6589 } catch (e2) {
6590 }
6591 for (const remove of children) {
6592 remove();
6593 }
6594 };
6595 return removeEventListener;
6596 }
6597
6598 // node_modules/@ariakit/react-core/esm/__chunks/KPHZR4MB.js
6599 var React6 = __toESM(require_react(), 1);
6600 var import_react5 = __toESM(require_react(), 1);
6601 var _React = { ...React6 };
6602 var useReactId = _React.useId;
6603 var useReactDeferredValue = _React.useDeferredValue;
6604 var useReactInsertionEffect = _React.useInsertionEffect;
6605 var useSafeLayoutEffect = canUseDOM ? import_react5.useLayoutEffect : import_react5.useEffect;
6606 function useInitialValue(value) {
6607 const [initialValue] = (0, import_react5.useState)(value);
6608 return initialValue;
6609 }
6610 function useLiveRef(value) {
6611 const ref = (0, import_react5.useRef)(value);
6612 useSafeLayoutEffect(() => {
6613 ref.current = value;
6614 });
6615 return ref;
6616 }
6617 function useEvent(callback) {
6618 const ref = (0, import_react5.useRef)(() => {
6619 throw new Error("Cannot call an event handler while rendering.");
6620 });
6621 if (useReactInsertionEffect) {
6622 useReactInsertionEffect(() => {
6623 ref.current = callback;
6624 });
6625 } else {
6626 ref.current = callback;
6627 }
6628 return (0, import_react5.useCallback)((...args) => {
6629 var _a;
6630 return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args);
6631 }, []);
6632 }
6633 function useTransactionState(callback) {
6634 const [state, setState] = (0, import_react5.useState)(null);
6635 useSafeLayoutEffect(() => {
6636 if (state == null) return;
6637 if (!callback) return;
6638 let prevState = null;
6639 callback((prev) => {
6640 prevState = prev;
6641 return state;
6642 });
6643 return () => {
6644 callback(prevState);
6645 };
6646 }, [state, callback]);
6647 return [state, setState];
6648 }
6649 function useMergeRefs(...refs) {
6650 return (0, import_react5.useMemo)(() => {
6651 if (!refs.some(Boolean)) return;
6652 return (value) => {
6653 for (const ref of refs) {
6654 setRef(ref, value);
6655 }
6656 };
6657 }, refs);
6658 }
6659 function useId3(defaultId) {
6660 if (useReactId) {
6661 const reactId = useReactId();
6662 if (defaultId) return defaultId;
6663 return reactId;
6664 }
6665 const [id, setId] = (0, import_react5.useState)(defaultId);
6666 useSafeLayoutEffect(() => {
6667 if (defaultId || id) return;
6668 const random = Math.random().toString(36).slice(2, 8);
6669 setId(`id-${random}`);
6670 }, [defaultId, id]);
6671 return defaultId || id;
6672 }
6673 function useTagName(refOrElement, type) {
6674 const stringOrUndefined = (type2) => {
6675 if (typeof type2 !== "string") return;
6676 return type2;
6677 };
6678 const [tagName, setTagName] = (0, import_react5.useState)(() => stringOrUndefined(type));
6679 useSafeLayoutEffect(() => {
6680 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement;
6681 setTagName((element == null ? void 0 : element.tagName.toLowerCase()) || stringOrUndefined(type));
6682 }, [refOrElement, type]);
6683 return tagName;
6684 }
6685 function useAttribute(refOrElement, attributeName, defaultValue2) {
6686 const initialValue = useInitialValue(defaultValue2);
6687 const [attribute, setAttribute] = (0, import_react5.useState)(initialValue);
6688 (0, import_react5.useEffect)(() => {
6689 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement;
6690 if (!element) return;
6691 const callback = () => {
6692 const value = element.getAttribute(attributeName);
6693 setAttribute(value == null ? initialValue : value);
6694 };
6695 const observer = new MutationObserver(callback);
6696 observer.observe(element, { attributeFilter: [attributeName] });
6697 callback();
6698 return () => observer.disconnect();
6699 }, [refOrElement, attributeName, initialValue]);
6700 return attribute;
6701 }
6702 function useUpdateEffect(effect, deps) {
6703 const mounted = (0, import_react5.useRef)(false);
6704 (0, import_react5.useEffect)(() => {
6705 if (mounted.current) {
6706 return effect();
6707 }
6708 mounted.current = true;
6709 }, deps);
6710 (0, import_react5.useEffect)(
6711 () => () => {
6712 mounted.current = false;
6713 },
6714 []
6715 );
6716 }
6717 function useUpdateLayoutEffect(effect, deps) {
6718 const mounted = (0, import_react5.useRef)(false);
6719 useSafeLayoutEffect(() => {
6720 if (mounted.current) {
6721 return effect();
6722 }
6723 mounted.current = true;
6724 }, deps);
6725 useSafeLayoutEffect(
6726 () => () => {
6727 mounted.current = false;
6728 },
6729 []
6730 );
6731 }
6732 function useForceUpdate() {
6733 return (0, import_react5.useReducer)(() => [], []);
6734 }
6735 function useBooleanEvent(booleanOrCallback) {
6736 return useEvent(
6737 typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback
6738 );
6739 }
6740 function useWrapElement(props, callback, deps = []) {
6741 const wrapElement = (0, import_react5.useCallback)(
6742 (element) => {
6743 if (props.wrapElement) {
6744 element = props.wrapElement(element);
6745 }
6746 return callback(element);
6747 },
6748 [...deps, props.wrapElement]
6749 );
6750 return { ...props, wrapElement };
6751 }
6752 function useMetadataProps(props, key, value) {
6753 const parent = props.onLoadedMetadataCapture;
6754 const onLoadedMetadataCapture = (0, import_react5.useMemo)(() => {
6755 return Object.assign(() => {
6756 }, { ...parent, [key]: value });
6757 }, [parent, key, value]);
6758 return [parent == null ? void 0 : parent[key], { onLoadedMetadataCapture }];
6759 }
6760 var hasInstalledGlobalEventListeners = false;
6761 function useIsMouseMoving() {
6762 (0, import_react5.useEffect)(() => {
6763 if (hasInstalledGlobalEventListeners) return;
6764 addGlobalEventListener("mousemove", setMouseMoving, true);
6765 addGlobalEventListener("mousedown", resetMouseMoving, true);
6766 addGlobalEventListener("mouseup", resetMouseMoving, true);
6767 addGlobalEventListener("keydown", resetMouseMoving, true);
6768 addGlobalEventListener("scroll", resetMouseMoving, true);
6769 hasInstalledGlobalEventListeners = true;
6770 }, []);
6771 const isMouseMoving = useEvent(() => mouseMoving);
6772 return isMouseMoving;
6773 }
6774 var mouseMoving = false;
6775 var previousScreenX = 0;
6776 var previousScreenY = 0;
6777 function hasMouseMovement(event) {
6778 const movementX = event.movementX || event.screenX - previousScreenX;
6779 const movementY = event.movementY || event.screenY - previousScreenY;
6780 previousScreenX = event.screenX;
6781 previousScreenY = event.screenY;
6782 return movementX || movementY || false;
6783 }
6784 function setMouseMoving(event) {
6785 if (!hasMouseMovement(event)) return;
6786 mouseMoving = true;
6787 }
6788 function resetMouseMoving() {
6789 mouseMoving = false;
6790 }
6791
6792 // node_modules/@ariakit/react-core/esm/__chunks/GWSL6KNJ.js
6793 var React7 = __toESM(require_react(), 1);
6794 var import_jsx_runtime47 = __toESM(require_jsx_runtime(), 1);
6795 function forwardRef22(render4) {
6796 const Role = React7.forwardRef(
6797 // @ts-ignore Incompatible with React 19 types. Ignore for now.
6798 (props, ref) => render4({ ...props, ref })
6799 );
6800 Role.displayName = render4.displayName || render4.name;
6801 return Role;
6802 }
6803 function memo22(Component, propsAreEqual) {
6804 return React7.memo(Component, propsAreEqual);
6805 }
6806 function createElement3(Type, props) {
6807 const { wrapElement, render: render4, ...rest } = props;
6808 const mergedRef = useMergeRefs(props.ref, getRefProperty(render4));
6809 let element;
6810 if (React7.isValidElement(render4)) {
6811 const renderProps = {
6812 // @ts-ignore Incompatible with React 19 types. Ignore for now.
6813 ...render4.props,
6814 ref: mergedRef
6815 };
6816 element = React7.cloneElement(render4, mergeProps2(rest, renderProps));
6817 } else if (render4) {
6818 element = render4(rest);
6819 } else {
6820 element = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Type, { ...rest });
6821 }
6822 if (wrapElement) {
6823 return wrapElement(element);
6824 }
6825 return element;
6826 }
6827 function createHook(useProps) {
6828 const useRole = (props = {}) => {
6829 return useProps(props);
6830 };
6831 useRole.displayName = useProps.name;
6832 return useRole;
6833 }
6834 function createStoreContext(providers = [], scopedProviders = []) {
6835 const context = React7.createContext(void 0);
6836 const scopedContext = React7.createContext(void 0);
6837 const useContext29 = () => React7.useContext(context);
6838 const useScopedContext = (onlyScoped = false) => {
6839 const scoped = React7.useContext(scopedContext);
6840 const store = useContext29();
6841 if (onlyScoped) return scoped;
6842 return scoped || store;
6843 };
6844 const useProviderContext = () => {
6845 const scoped = React7.useContext(scopedContext);
6846 const store = useContext29();
6847 if (scoped && scoped === store) return;
6848 return store;
6849 };
6850 const ContextProvider = (props) => {
6851 return providers.reduceRight(
6852 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Provider, { ...props, children }),
6853 /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(context.Provider, { ...props })
6854 );
6855 };
6856 const ScopedContextProvider = (props) => {
6857 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ContextProvider, { ...props, children: scopedProviders.reduceRight(
6858 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Provider, { ...props, children }),
6859 /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(scopedContext.Provider, { ...props })
6860 ) });
6861 };
6862 return {
6863 context,
6864 scopedContext,
6865 useContext: useContext29,
6866 useScopedContext,
6867 useProviderContext,
6868 ContextProvider,
6869 ScopedContextProvider
6870 };
6871 }
6872
6873 // node_modules/@ariakit/react-core/esm/__chunks/SMPCIMZM.js
6874 var ctx = createStoreContext();
6875 var useCollectionContext = ctx.useContext;
6876 var useCollectionScopedContext = ctx.useScopedContext;
6877 var useCollectionProviderContext = ctx.useProviderContext;
6878 var CollectionContextProvider = ctx.ContextProvider;
6879 var CollectionScopedContextProvider = ctx.ScopedContextProvider;
6880
6881 // node_modules/@ariakit/react-core/esm/__chunks/AVVXDJMZ.js
6882 var import_react6 = __toESM(require_react(), 1);
6883 var ctx2 = createStoreContext(
6884 [CollectionContextProvider],
6885 [CollectionScopedContextProvider]
6886 );
6887 var useCompositeContext = ctx2.useContext;
6888 var useCompositeScopedContext = ctx2.useScopedContext;
6889 var useCompositeProviderContext = ctx2.useProviderContext;
6890 var CompositeContextProvider = ctx2.ContextProvider;
6891 var CompositeScopedContextProvider = ctx2.ScopedContextProvider;
6892 var CompositeItemContext = (0, import_react6.createContext)(
6893 void 0
6894 );
6895 var CompositeRowContext = (0, import_react6.createContext)(
6896 void 0
6897 );
6898
6899 // node_modules/@ariakit/react-core/esm/__chunks/5VQZOHHZ.js
6900 function findFirstEnabledItem(items, excludeId) {
6901 return items.find((item) => {
6902 if (excludeId) {
6903 return !item.disabled && item.id !== excludeId;
6904 }
6905 return !item.disabled;
6906 });
6907 }
6908 function getEnabledItem(store, id) {
6909 if (!id) return null;
6910 return store.item(id) || null;
6911 }
6912 function groupItemsByRows(items) {
6913 const rows = [];
6914 for (const item of items) {
6915 const row = rows.find((currentRow) => {
6916 var _a;
6917 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId;
6918 });
6919 if (row) {
6920 row.push(item);
6921 } else {
6922 rows.push([item]);
6923 }
6924 }
6925 return rows;
6926 }
6927 function selectTextField(element, collapseToEnd = false) {
6928 if (isTextField(element)) {
6929 element.setSelectionRange(
6930 collapseToEnd ? element.value.length : 0,
6931 element.value.length
6932 );
6933 } else if (element.isContentEditable) {
6934 const selection = getDocument(element).getSelection();
6935 selection == null ? void 0 : selection.selectAllChildren(element);
6936 if (collapseToEnd) {
6937 selection == null ? void 0 : selection.collapseToEnd();
6938 }
6939 }
6940 }
6941 var FOCUS_SILENTLY = /* @__PURE__ */ Symbol("FOCUS_SILENTLY");
6942 function focusSilently(element) {
6943 element[FOCUS_SILENTLY] = true;
6944 element.focus({ preventScroll: true });
6945 }
6946 function silentlyFocused(element) {
6947 const isSilentlyFocused = element[FOCUS_SILENTLY];
6948 delete element[FOCUS_SILENTLY];
6949 return isSilentlyFocused;
6950 }
6951 function isItem(store, element, exclude) {
6952 if (!element) return false;
6953 if (element === exclude) return false;
6954 const item = store.item(element.id);
6955 if (!item) return false;
6956 if (exclude && item.element === exclude) return false;
6957 return true;
6958 }
6959
6960 // node_modules/@ariakit/react-core/esm/__chunks/Z2O3VLAQ.js
6961 var import_react7 = __toESM(require_react(), 1);
6962 var TagName = "div";
6963 var useCollectionItem = createHook(
6964 function useCollectionItem2({
6965 store,
6966 shouldRegisterItem = true,
6967 getItem = identity,
6968 // @ts-expect-error This prop may come from a collection renderer.
6969 element,
6970 ...props
6971 }) {
6972 const context = useCollectionContext();
6973 store = store || context;
6974 const id = useId3(props.id);
6975 const ref = (0, import_react7.useRef)(element);
6976 (0, import_react7.useEffect)(() => {
6977 const element2 = ref.current;
6978 if (!id) return;
6979 if (!element2) return;
6980 if (!shouldRegisterItem) return;
6981 const item = getItem({ id, element: element2 });
6982 return store == null ? void 0 : store.renderItem(item);
6983 }, [id, shouldRegisterItem, getItem, store]);
6984 props = {
6985 ...props,
6986 ref: useMergeRefs(ref, props.ref)
6987 };
6988 return removeUndefinedValues(props);
6989 }
6990 );
6991 var CollectionItem = forwardRef22(function CollectionItem2(props) {
6992 const htmlProps = useCollectionItem(props);
6993 return createElement3(TagName, htmlProps);
6994 });
6995
6996 // node_modules/@ariakit/react-core/esm/__chunks/SWN3JYXT.js
6997 var import_react8 = __toESM(require_react(), 1);
6998 var FocusableContext = (0, import_react8.createContext)(true);
6999
7000 // node_modules/@ariakit/core/esm/utils/focus.js
7001 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'])";
7002 function isFocusable(element) {
7003 if (!element.matches(selector)) return false;
7004 if (!isVisible(element)) return false;
7005 if (element.closest("[inert]")) return false;
7006 return true;
7007 }
7008 function getClosestFocusable(element) {
7009 while (element && !isFocusable(element)) {
7010 element = element.closest(selector);
7011 }
7012 return element || null;
7013 }
7014 function hasFocus(element) {
7015 const activeElement = getActiveElement(element);
7016 if (!activeElement) return false;
7017 if (activeElement === element) return true;
7018 const activeDescendant = activeElement.getAttribute("aria-activedescendant");
7019 if (!activeDescendant) return false;
7020 return activeDescendant === element.id;
7021 }
7022 function hasFocusWithin(element) {
7023 const activeElement = getActiveElement(element);
7024 if (!activeElement) return false;
7025 if (contains(element, activeElement)) return true;
7026 const activeDescendant = activeElement.getAttribute("aria-activedescendant");
7027 if (!activeDescendant) return false;
7028 if (!("id" in element)) return false;
7029 if (activeDescendant === element.id) return true;
7030 return !!element.querySelector(`#${CSS.escape(activeDescendant)}`);
7031 }
7032 function focusIfNeeded(element) {
7033 if (!hasFocusWithin(element) && isFocusable(element)) {
7034 element.focus();
7035 }
7036 }
7037 function focusIntoView(element, options) {
7038 if (!("scrollIntoView" in element)) {
7039 element.focus();
7040 } else {
7041 element.focus({ preventScroll: true });
7042 element.scrollIntoView({ block: "nearest", inline: "nearest", ...options });
7043 }
7044 }
7045
7046 // node_modules/@ariakit/react-core/esm/__chunks/U6HHPQDW.js
7047 var import_react9 = __toESM(require_react(), 1);
7048 var TagName2 = "div";
7049 var isSafariBrowser = isSafari();
7050 var alwaysFocusVisibleInputTypes = [
7051 "text",
7052 "search",
7053 "url",
7054 "tel",
7055 "email",
7056 "password",
7057 "number",
7058 "date",
7059 "month",
7060 "week",
7061 "time",
7062 "datetime",
7063 "datetime-local"
7064 ];
7065 var safariFocusAncestorSymbol = /* @__PURE__ */ Symbol("safariFocusAncestor");
7066 function markSafariFocusAncestor(element, value) {
7067 if (!element) return;
7068 element[safariFocusAncestorSymbol] = value;
7069 }
7070 function isAlwaysFocusVisible(element) {
7071 const { tagName, readOnly, type } = element;
7072 if (tagName === "TEXTAREA" && !readOnly) return true;
7073 if (tagName === "SELECT" && !readOnly) return true;
7074 if (tagName === "INPUT" && !readOnly) {
7075 return alwaysFocusVisibleInputTypes.includes(type);
7076 }
7077 if (element.isContentEditable) return true;
7078 const role = element.getAttribute("role");
7079 if (role === "combobox" && element.dataset.name) {
7080 return true;
7081 }
7082 return false;
7083 }
7084 function getLabels(element) {
7085 if ("labels" in element) {
7086 return element.labels;
7087 }
7088 return null;
7089 }
7090 function isNativeCheckboxOrRadio(element) {
7091 const tagName = element.tagName.toLowerCase();
7092 if (tagName === "input" && element.type) {
7093 return element.type === "radio" || element.type === "checkbox";
7094 }
7095 return false;
7096 }
7097 function isNativeTabbable(tagName) {
7098 if (!tagName) return true;
7099 return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a";
7100 }
7101 function supportsDisabledAttribute(tagName) {
7102 if (!tagName) return true;
7103 return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea";
7104 }
7105 function getTabIndex(focusable, trulyDisabled, nativeTabbable, supportsDisabled, tabIndexProp) {
7106 if (!focusable) {
7107 return tabIndexProp;
7108 }
7109 if (trulyDisabled) {
7110 if (nativeTabbable && !supportsDisabled) {
7111 return -1;
7112 }
7113 return;
7114 }
7115 if (nativeTabbable) {
7116 return tabIndexProp;
7117 }
7118 return tabIndexProp || 0;
7119 }
7120 function useDisableEvent(onEvent, disabled) {
7121 return useEvent((event) => {
7122 onEvent == null ? void 0 : onEvent(event);
7123 if (event.defaultPrevented) return;
7124 if (disabled) {
7125 event.stopPropagation();
7126 event.preventDefault();
7127 }
7128 });
7129 }
7130 var hasInstalledGlobalEventListeners2 = false;
7131 var isKeyboardModality = true;
7132 function onGlobalMouseDown(event) {
7133 const target = event.target;
7134 if (target && "hasAttribute" in target) {
7135 if (!target.hasAttribute("data-focus-visible")) {
7136 isKeyboardModality = false;
7137 }
7138 }
7139 }
7140 function onGlobalKeyDown(event) {
7141 if (event.metaKey) return;
7142 if (event.ctrlKey) return;
7143 if (event.altKey) return;
7144 isKeyboardModality = true;
7145 }
7146 var useFocusable = createHook(
7147 function useFocusable2({
7148 focusable = true,
7149 accessibleWhenDisabled,
7150 autoFocus,
7151 onFocusVisible,
7152 ...props
7153 }) {
7154 const ref = (0, import_react9.useRef)(null);
7155 (0, import_react9.useEffect)(() => {
7156 if (!focusable) return;
7157 if (hasInstalledGlobalEventListeners2) return;
7158 addGlobalEventListener("mousedown", onGlobalMouseDown, true);
7159 addGlobalEventListener("keydown", onGlobalKeyDown, true);
7160 hasInstalledGlobalEventListeners2 = true;
7161 }, [focusable]);
7162 if (isSafariBrowser) {
7163 (0, import_react9.useEffect)(() => {
7164 if (!focusable) return;
7165 const element = ref.current;
7166 if (!element) return;
7167 if (!isNativeCheckboxOrRadio(element)) return;
7168 const labels = getLabels(element);
7169 if (!labels) return;
7170 const onMouseUp = () => queueMicrotask(() => element.focus());
7171 for (const label of labels) {
7172 label.addEventListener("mouseup", onMouseUp);
7173 }
7174 return () => {
7175 for (const label of labels) {
7176 label.removeEventListener("mouseup", onMouseUp);
7177 }
7178 };
7179 }, [focusable]);
7180 }
7181 const disabled = focusable && disabledFromProps(props);
7182 const trulyDisabled = !!disabled && !accessibleWhenDisabled;
7183 const [focusVisible, setFocusVisible] = (0, import_react9.useState)(false);
7184 (0, import_react9.useEffect)(() => {
7185 if (!focusable) return;
7186 if (trulyDisabled && focusVisible) {
7187 setFocusVisible(false);
7188 }
7189 }, [focusable, trulyDisabled, focusVisible]);
7190 (0, import_react9.useEffect)(() => {
7191 if (!focusable) return;
7192 if (!focusVisible) return;
7193 const element = ref.current;
7194 if (!element) return;
7195 if (typeof IntersectionObserver === "undefined") return;
7196 const observer = new IntersectionObserver(() => {
7197 if (!isFocusable(element)) {
7198 setFocusVisible(false);
7199 }
7200 });
7201 observer.observe(element);
7202 return () => observer.disconnect();
7203 }, [focusable, focusVisible]);
7204 const onKeyPressCapture = useDisableEvent(
7205 props.onKeyPressCapture,
7206 disabled
7207 );
7208 const onMouseDownCapture = useDisableEvent(
7209 props.onMouseDownCapture,
7210 disabled
7211 );
7212 const onClickCapture = useDisableEvent(props.onClickCapture, disabled);
7213 const onMouseDownProp = props.onMouseDown;
7214 const onMouseDown = useEvent((event) => {
7215 onMouseDownProp == null ? void 0 : onMouseDownProp(event);
7216 if (event.defaultPrevented) return;
7217 if (!focusable) return;
7218 const element = event.currentTarget;
7219 if (!isSafariBrowser) return;
7220 if (isPortalEvent(event)) return;
7221 if (!isButton(element) && !isNativeCheckboxOrRadio(element)) return;
7222 let receivedFocus = false;
7223 const onFocus = () => {
7224 receivedFocus = true;
7225 };
7226 const options = { capture: true, once: true };
7227 element.addEventListener("focusin", onFocus, options);
7228 const focusableContainer = getClosestFocusable(element.parentElement);
7229 markSafariFocusAncestor(focusableContainer, true);
7230 queueBeforeEvent(element, "mouseup", () => {
7231 element.removeEventListener("focusin", onFocus, true);
7232 markSafariFocusAncestor(focusableContainer, false);
7233 if (receivedFocus) return;
7234 focusIfNeeded(element);
7235 });
7236 });
7237 const handleFocusVisible = (event, currentTarget) => {
7238 if (currentTarget) {
7239 event.currentTarget = currentTarget;
7240 }
7241 if (!focusable) return;
7242 const element = event.currentTarget;
7243 if (!element) return;
7244 if (!hasFocus(element)) return;
7245 onFocusVisible == null ? void 0 : onFocusVisible(event);
7246 if (event.defaultPrevented) return;
7247 element.dataset.focusVisible = "true";
7248 setFocusVisible(true);
7249 };
7250 const onKeyDownCaptureProp = props.onKeyDownCapture;
7251 const onKeyDownCapture = useEvent((event) => {
7252 onKeyDownCaptureProp == null ? void 0 : onKeyDownCaptureProp(event);
7253 if (event.defaultPrevented) return;
7254 if (!focusable) return;
7255 if (focusVisible) return;
7256 if (event.metaKey) return;
7257 if (event.altKey) return;
7258 if (event.ctrlKey) return;
7259 if (!isSelfTarget(event)) return;
7260 const element = event.currentTarget;
7261 const applyFocusVisible = () => handleFocusVisible(event, element);
7262 queueBeforeEvent(element, "focusout", applyFocusVisible);
7263 });
7264 const onFocusCaptureProp = props.onFocusCapture;
7265 const onFocusCapture = useEvent((event) => {
7266 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event);
7267 if (event.defaultPrevented) return;
7268 if (!focusable) return;
7269 if (!isSelfTarget(event)) {
7270 setFocusVisible(false);
7271 return;
7272 }
7273 const element = event.currentTarget;
7274 const applyFocusVisible = () => handleFocusVisible(event, element);
7275 if (isKeyboardModality || isAlwaysFocusVisible(event.target)) {
7276 queueBeforeEvent(event.target, "focusout", applyFocusVisible);
7277 } else {
7278 setFocusVisible(false);
7279 }
7280 });
7281 const onBlurProp = props.onBlur;
7282 const onBlur = useEvent((event) => {
7283 onBlurProp == null ? void 0 : onBlurProp(event);
7284 if (!focusable) return;
7285 if (!isFocusEventOutside(event)) return;
7286 event.currentTarget.removeAttribute("data-focus-visible");
7287 setFocusVisible(false);
7288 });
7289 const autoFocusOnShow = (0, import_react9.useContext)(FocusableContext);
7290 const autoFocusRef = useEvent((element) => {
7291 if (!focusable) return;
7292 if (!autoFocus) return;
7293 if (!element) return;
7294 if (!autoFocusOnShow) return;
7295 queueMicrotask(() => {
7296 if (hasFocus(element)) return;
7297 if (!isFocusable(element)) return;
7298 element.focus();
7299 });
7300 });
7301 const tagName = useTagName(ref);
7302 const nativeTabbable = focusable && isNativeTabbable(tagName);
7303 const supportsDisabled = focusable && supportsDisabledAttribute(tagName);
7304 const styleProp = props.style;
7305 const style = (0, import_react9.useMemo)(() => {
7306 if (trulyDisabled) {
7307 return { pointerEvents: "none", ...styleProp };
7308 }
7309 return styleProp;
7310 }, [trulyDisabled, styleProp]);
7311 props = {
7312 "data-focus-visible": focusable && focusVisible || void 0,
7313 "data-autofocus": autoFocus || void 0,
7314 "aria-disabled": disabled || void 0,
7315 ...props,
7316 ref: useMergeRefs(ref, autoFocusRef, props.ref),
7317 style,
7318 tabIndex: getTabIndex(
7319 focusable,
7320 trulyDisabled,
7321 nativeTabbable,
7322 supportsDisabled,
7323 props.tabIndex
7324 ),
7325 disabled: supportsDisabled && trulyDisabled ? true : void 0,
7326 // TODO: Test Focusable contentEditable.
7327 contentEditable: disabled ? void 0 : props.contentEditable,
7328 onKeyPressCapture,
7329 onClickCapture,
7330 onMouseDownCapture,
7331 onMouseDown,
7332 onKeyDownCapture,
7333 onFocusCapture,
7334 onBlur
7335 };
7336 return removeUndefinedValues(props);
7337 }
7338 );
7339 var Focusable = forwardRef22(function Focusable2(props) {
7340 const htmlProps = useFocusable(props);
7341 return createElement3(TagName2, htmlProps);
7342 });
7343
7344 // node_modules/@ariakit/react-core/esm/__chunks/PZ3OL7I2.js
7345 var import_react10 = __toESM(require_react(), 1);
7346 var TagName3 = "button";
7347 function isNativeClick(event) {
7348 if (!event.isTrusted) return false;
7349 const element = event.currentTarget;
7350 if (event.key === "Enter") {
7351 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A";
7352 }
7353 if (event.key === " ") {
7354 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT";
7355 }
7356 return false;
7357 }
7358 var symbol = /* @__PURE__ */ Symbol("command");
7359 var useCommand = createHook(
7360 function useCommand2({ clickOnEnter = true, clickOnSpace = true, ...props }) {
7361 const ref = (0, import_react10.useRef)(null);
7362 const [isNativeButton, setIsNativeButton] = (0, import_react10.useState)(false);
7363 (0, import_react10.useEffect)(() => {
7364 if (!ref.current) return;
7365 setIsNativeButton(isButton(ref.current));
7366 }, []);
7367 const [active, setActive] = (0, import_react10.useState)(false);
7368 const activeRef = (0, import_react10.useRef)(false);
7369 const disabled = disabledFromProps(props);
7370 const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true);
7371 const onKeyDownProp = props.onKeyDown;
7372 const onKeyDown = useEvent((event) => {
7373 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
7374 const element = event.currentTarget;
7375 if (event.defaultPrevented) return;
7376 if (isDuplicate) return;
7377 if (disabled) return;
7378 if (!isSelfTarget(event)) return;
7379 if (isTextField(element)) return;
7380 if (element.isContentEditable) return;
7381 const isEnter = clickOnEnter && event.key === "Enter";
7382 const isSpace = clickOnSpace && event.key === " ";
7383 const shouldPreventEnter = event.key === "Enter" && !clickOnEnter;
7384 const shouldPreventSpace = event.key === " " && !clickOnSpace;
7385 if (shouldPreventEnter || shouldPreventSpace) {
7386 event.preventDefault();
7387 return;
7388 }
7389 if (isEnter || isSpace) {
7390 const nativeClick = isNativeClick(event);
7391 if (isEnter) {
7392 if (!nativeClick) {
7393 event.preventDefault();
7394 const { view, ...eventInit } = event;
7395 const click = () => fireClickEvent(element, eventInit);
7396 if (isFirefox()) {
7397 queueBeforeEvent(element, "keyup", click);
7398 } else {
7399 queueMicrotask(click);
7400 }
7401 }
7402 } else if (isSpace) {
7403 activeRef.current = true;
7404 if (!nativeClick) {
7405 event.preventDefault();
7406 setActive(true);
7407 }
7408 }
7409 }
7410 });
7411 const onKeyUpProp = props.onKeyUp;
7412 const onKeyUp = useEvent((event) => {
7413 onKeyUpProp == null ? void 0 : onKeyUpProp(event);
7414 if (event.defaultPrevented) return;
7415 if (isDuplicate) return;
7416 if (disabled) return;
7417 if (event.metaKey) return;
7418 const isSpace = clickOnSpace && event.key === " ";
7419 if (activeRef.current && isSpace) {
7420 activeRef.current = false;
7421 if (!isNativeClick(event)) {
7422 event.preventDefault();
7423 setActive(false);
7424 const element = event.currentTarget;
7425 const { view, ...eventInit } = event;
7426 queueMicrotask(() => fireClickEvent(element, eventInit));
7427 }
7428 }
7429 });
7430 props = {
7431 "data-active": active || void 0,
7432 type: isNativeButton ? "button" : void 0,
7433 ...metadataProps,
7434 ...props,
7435 ref: useMergeRefs(ref, props.ref),
7436 onKeyDown,
7437 onKeyUp
7438 };
7439 props = useFocusable(props);
7440 return props;
7441 }
7442 );
7443 var Command = forwardRef22(function Command2(props) {
7444 const htmlProps = useCommand(props);
7445 return createElement3(TagName3, htmlProps);
7446 });
7447
7448 // node_modules/@ariakit/core/esm/__chunks/SXKM4CGU.js
7449 function getInternal(store, key) {
7450 const internals = store.__unstableInternals;
7451 invariant(internals, "Invalid store");
7452 return internals[key];
7453 }
7454 function createStore(initialState, ...stores) {
7455 let state = initialState;
7456 let prevStateBatch = state;
7457 let lastUpdate = /* @__PURE__ */ Symbol();
7458 let destroy = noop;
7459 const instances = /* @__PURE__ */ new Set();
7460 const updatedKeys = /* @__PURE__ */ new Set();
7461 const setups = /* @__PURE__ */ new Set();
7462 const listeners = /* @__PURE__ */ new Set();
7463 const batchListeners = /* @__PURE__ */ new Set();
7464 const disposables = /* @__PURE__ */ new WeakMap();
7465 const listenerKeys = /* @__PURE__ */ new WeakMap();
7466 const storeSetup = (callback) => {
7467 setups.add(callback);
7468 return () => setups.delete(callback);
7469 };
7470 const storeInit = () => {
7471 const initialized = instances.size;
7472 const instance = /* @__PURE__ */ Symbol();
7473 instances.add(instance);
7474 const maybeDestroy = () => {
7475 instances.delete(instance);
7476 if (instances.size) return;
7477 destroy();
7478 };
7479 if (initialized) return maybeDestroy;
7480 const desyncs = getKeys(state).map(
7481 (key) => chain(
7482 ...stores.map((store) => {
7483 var _a;
7484 const storeState = (_a = store == null ? void 0 : store.getState) == null ? void 0 : _a.call(store);
7485 if (!storeState) return;
7486 if (!hasOwnProperty(storeState, key)) return;
7487 return sync(store, [key], (state2) => {
7488 setState(
7489 key,
7490 state2[key],
7491 // @ts-expect-error - Not public API. This is just to prevent
7492 // infinite loops.
7493 true
7494 );
7495 });
7496 })
7497 )
7498 );
7499 const teardowns = [];
7500 for (const setup2 of setups) {
7501 teardowns.push(setup2());
7502 }
7503 const cleanups = stores.map(init);
7504 destroy = chain(...desyncs, ...teardowns, ...cleanups);
7505 return maybeDestroy;
7506 };
7507 const sub = (keys, listener, set2 = listeners) => {
7508 set2.add(listener);
7509 listenerKeys.set(listener, keys);
7510 return () => {
7511 var _a;
7512 (_a = disposables.get(listener)) == null ? void 0 : _a();
7513 disposables.delete(listener);
7514 listenerKeys.delete(listener);
7515 set2.delete(listener);
7516 };
7517 };
7518 const storeSubscribe = (keys, listener) => sub(keys, listener);
7519 const storeSync = (keys, listener) => {
7520 disposables.set(listener, listener(state, state));
7521 return sub(keys, listener);
7522 };
7523 const storeBatch = (keys, listener) => {
7524 disposables.set(listener, listener(state, prevStateBatch));
7525 return sub(keys, listener, batchListeners);
7526 };
7527 const storePick = (keys) => createStore(pick(state, keys), finalStore);
7528 const storeOmit = (keys) => createStore(omit2(state, keys), finalStore);
7529 const getState = () => state;
7530 const setState = (key, value, fromStores = false) => {
7531 var _a;
7532 if (!hasOwnProperty(state, key)) return;
7533 const nextValue = applyState(value, state[key]);
7534 if (nextValue === state[key]) return;
7535 if (!fromStores) {
7536 for (const store of stores) {
7537 (_a = store == null ? void 0 : store.setState) == null ? void 0 : _a.call(store, key, nextValue);
7538 }
7539 }
7540 const prevState = state;
7541 state = { ...state, [key]: nextValue };
7542 const thisUpdate = /* @__PURE__ */ Symbol();
7543 lastUpdate = thisUpdate;
7544 updatedKeys.add(key);
7545 const run = (listener, prev, uKeys) => {
7546 var _a2;
7547 const keys = listenerKeys.get(listener);
7548 const updated = (k) => uKeys ? uKeys.has(k) : k === key;
7549 if (!keys || keys.some(updated)) {
7550 (_a2 = disposables.get(listener)) == null ? void 0 : _a2();
7551 disposables.set(listener, listener(state, prev));
7552 }
7553 };
7554 for (const listener of listeners) {
7555 run(listener, prevState);
7556 }
7557 queueMicrotask(() => {
7558 if (lastUpdate !== thisUpdate) return;
7559 const snapshot = state;
7560 for (const listener of batchListeners) {
7561 run(listener, prevStateBatch, updatedKeys);
7562 }
7563 prevStateBatch = snapshot;
7564 updatedKeys.clear();
7565 });
7566 };
7567 const finalStore = {
7568 getState,
7569 setState,
7570 __unstableInternals: {
7571 setup: storeSetup,
7572 init: storeInit,
7573 subscribe: storeSubscribe,
7574 sync: storeSync,
7575 batch: storeBatch,
7576 pick: storePick,
7577 omit: storeOmit
7578 }
7579 };
7580 return finalStore;
7581 }
7582 function setup(store, ...args) {
7583 if (!store) return;
7584 return getInternal(store, "setup")(...args);
7585 }
7586 function init(store, ...args) {
7587 if (!store) return;
7588 return getInternal(store, "init")(...args);
7589 }
7590 function subscribe(store, ...args) {
7591 if (!store) return;
7592 return getInternal(store, "subscribe")(...args);
7593 }
7594 function sync(store, ...args) {
7595 if (!store) return;
7596 return getInternal(store, "sync")(...args);
7597 }
7598 function batch(store, ...args) {
7599 if (!store) return;
7600 return getInternal(store, "batch")(...args);
7601 }
7602 function omit22(store, ...args) {
7603 if (!store) return;
7604 return getInternal(store, "omit")(...args);
7605 }
7606 function pick2(store, ...args) {
7607 if (!store) return;
7608 return getInternal(store, "pick")(...args);
7609 }
7610 function mergeStore(...stores) {
7611 var _a;
7612 const initialState = {};
7613 for (const store2 of stores) {
7614 const nextState = (_a = store2 == null ? void 0 : store2.getState) == null ? void 0 : _a.call(store2);
7615 if (nextState) {
7616 Object.assign(initialState, nextState);
7617 }
7618 }
7619 const store = createStore(initialState, ...stores);
7620 return Object.assign({}, ...stores, store);
7621 }
7622 function throwOnConflictingProps(props, store) {
7623 if (false) return;
7624 if (!store) return;
7625 const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => {
7626 var _a;
7627 const stateKey = key.replace("default", "");
7628 return `${((_a = stateKey[0]) == null ? void 0 : _a.toLowerCase()) || ""}${stateKey.slice(1)}`;
7629 });
7630 if (!defaultKeys.length) return;
7631 const storeState = store.getState();
7632 const conflictingProps = defaultKeys.filter(
7633 (key) => hasOwnProperty(storeState, key)
7634 );
7635 if (!conflictingProps.length) return;
7636 throw new Error(
7637 `Passing a store prop in conjunction with a default state is not supported.
7638
7639 const store = useSelectStore();
7640 <SelectProvider store={store} defaultValue="Apple" />
7641 ^ ^
7642
7643 Instead, pass the default state to the topmost store:
7644
7645 const store = useSelectStore({ defaultValue: "Apple" });
7646 <SelectProvider store={store} />
7647
7648 See https://github.com/ariakit/ariakit/pull/2745 for more details.
7649
7650 If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit
7651 `
7652 );
7653 }
7654
7655 // node_modules/@ariakit/react-core/esm/__chunks/Q5W46E73.js
7656 var React8 = __toESM(require_react(), 1);
7657 var import_shim = __toESM(require_shim(), 1);
7658 var { useSyncExternalStore } = import_shim.default;
7659 var noopSubscribe = () => () => {
7660 };
7661 function useStoreState(store, keyOrSelector = identity) {
7662 const storeSubscribe = React8.useCallback(
7663 (callback) => {
7664 if (!store) return noopSubscribe();
7665 return subscribe(store, null, callback);
7666 },
7667 [store]
7668 );
7669 const getSnapshot = () => {
7670 const key = typeof keyOrSelector === "string" ? keyOrSelector : null;
7671 const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null;
7672 const state = store == null ? void 0 : store.getState();
7673 if (selector2) return selector2(state);
7674 if (!state) return;
7675 if (!key) return;
7676 if (!hasOwnProperty(state, key)) return;
7677 return state[key];
7678 };
7679 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot);
7680 }
7681 function useStoreStateObject(store, object) {
7682 const objRef = React8.useRef(
7683 {}
7684 );
7685 const storeSubscribe = React8.useCallback(
7686 (callback) => {
7687 if (!store) return noopSubscribe();
7688 return subscribe(store, null, callback);
7689 },
7690 [store]
7691 );
7692 const getSnapshot = () => {
7693 const state = store == null ? void 0 : store.getState();
7694 let updated = false;
7695 const obj = objRef.current;
7696 for (const prop in object) {
7697 const keyOrSelector = object[prop];
7698 if (typeof keyOrSelector === "function") {
7699 const value = keyOrSelector(state);
7700 if (value !== obj[prop]) {
7701 obj[prop] = value;
7702 updated = true;
7703 }
7704 }
7705 if (typeof keyOrSelector === "string") {
7706 if (!state) continue;
7707 if (!hasOwnProperty(state, keyOrSelector)) continue;
7708 const value = state[keyOrSelector];
7709 if (value !== obj[prop]) {
7710 obj[prop] = value;
7711 updated = true;
7712 }
7713 }
7714 }
7715 if (updated) {
7716 objRef.current = { ...obj };
7717 }
7718 return objRef.current;
7719 };
7720 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot);
7721 }
7722 function useStoreProps(store, props, key, setKey) {
7723 const value = hasOwnProperty(props, key) ? props[key] : void 0;
7724 const setValue = setKey ? props[setKey] : void 0;
7725 const propsRef = useLiveRef({ value, setValue });
7726 useSafeLayoutEffect(() => {
7727 return sync(store, [key], (state, prev) => {
7728 const { value: value2, setValue: setValue2 } = propsRef.current;
7729 if (!setValue2) return;
7730 if (state[key] === prev[key]) return;
7731 if (state[key] === value2) return;
7732 setValue2(state[key]);
7733 });
7734 }, [store, key]);
7735 useSafeLayoutEffect(() => {
7736 if (value === void 0) return;
7737 store.setState(key, value);
7738 return batch(store, [key], () => {
7739 if (value === void 0) return;
7740 store.setState(key, value);
7741 });
7742 });
7743 }
7744 function useStore(createStore2, props) {
7745 const [store, setStore] = React8.useState(() => createStore2(props));
7746 useSafeLayoutEffect(() => init(store), [store]);
7747 const useState25 = React8.useCallback(
7748 (keyOrSelector) => useStoreState(store, keyOrSelector),
7749 [store]
7750 );
7751 const memoizedStore = React8.useMemo(
7752 () => ({ ...store, useState: useState25 }),
7753 [store, useState25]
7754 );
7755 const updateStore = useEvent(() => {
7756 setStore((store2) => createStore2({ ...props, ...store2.getState() }));
7757 });
7758 return [memoizedStore, updateStore];
7759 }
7760
7761 // node_modules/@ariakit/react-core/esm/__chunks/WZWDIE3S.js
7762 var import_react11 = __toESM(require_react(), 1);
7763 var import_jsx_runtime48 = __toESM(require_jsx_runtime(), 1);
7764 var TagName4 = "button";
7765 function isEditableElement(element) {
7766 if (isTextbox(element)) return true;
7767 return element.tagName === "INPUT" && !isButton(element);
7768 }
7769 function getNextPageOffset(scrollingElement, pageUp = false) {
7770 const height = scrollingElement.clientHeight;
7771 const { top } = scrollingElement.getBoundingClientRect();
7772 const pageSize = Math.max(height * 0.875, height - 40) * 1.5;
7773 const pageOffset = pageUp ? height - pageSize + top : pageSize + top;
7774 if (scrollingElement.tagName === "HTML") {
7775 return pageOffset + scrollingElement.scrollTop;
7776 }
7777 return pageOffset;
7778 }
7779 function getItemOffset(itemElement, pageUp = false) {
7780 const { top } = itemElement.getBoundingClientRect();
7781 if (pageUp) {
7782 return top + itemElement.clientHeight;
7783 }
7784 return top;
7785 }
7786 function findNextPageItemId(element, store, next, pageUp = false) {
7787 var _a;
7788 if (!store) return;
7789 if (!next) return;
7790 const { renderedItems } = store.getState();
7791 const scrollingElement = getScrollingElement(element);
7792 if (!scrollingElement) return;
7793 const nextPageOffset = getNextPageOffset(scrollingElement, pageUp);
7794 let id;
7795 let prevDifference;
7796 for (let i2 = 0; i2 < renderedItems.length; i2 += 1) {
7797 const previousId = id;
7798 id = next(i2);
7799 if (!id) break;
7800 if (id === previousId) continue;
7801 const itemElement = (_a = getEnabledItem(store, id)) == null ? void 0 : _a.element;
7802 if (!itemElement) continue;
7803 const itemOffset = getItemOffset(itemElement, pageUp);
7804 const difference = itemOffset - nextPageOffset;
7805 const absDifference = Math.abs(difference);
7806 if (pageUp && difference <= 0 || !pageUp && difference >= 0) {
7807 if (prevDifference !== void 0 && prevDifference < absDifference) {
7808 id = previousId;
7809 }
7810 break;
7811 }
7812 prevDifference = absDifference;
7813 }
7814 return id;
7815 }
7816 function targetIsAnotherItem(event, store) {
7817 if (isSelfTarget(event)) return false;
7818 return isItem(store, event.target);
7819 }
7820 var useCompositeItem = createHook(
7821 function useCompositeItem2({
7822 store,
7823 rowId: rowIdProp,
7824 preventScrollOnKeyDown = false,
7825 moveOnKeyPress = true,
7826 tabbable = false,
7827 getItem: getItemProp,
7828 "aria-setsize": ariaSetSizeProp,
7829 "aria-posinset": ariaPosInSetProp,
7830 ...props
7831 }) {
7832 const context = useCompositeContext();
7833 store = store || context;
7834 const id = useId3(props.id);
7835 const ref = (0, import_react11.useRef)(null);
7836 const row = (0, import_react11.useContext)(CompositeRowContext);
7837 const disabled = disabledFromProps(props);
7838 const trulyDisabled = disabled && !props.accessibleWhenDisabled;
7839 const {
7840 rowId,
7841 baseElement,
7842 isActiveItem,
7843 ariaSetSize,
7844 ariaPosInSet,
7845 isTabbable
7846 } = useStoreStateObject(store, {
7847 rowId(state) {
7848 if (rowIdProp) return rowIdProp;
7849 if (!state) return;
7850 if (!(row == null ? void 0 : row.baseElement)) return;
7851 if (row.baseElement !== state.baseElement) return;
7852 return row.id;
7853 },
7854 baseElement(state) {
7855 return (state == null ? void 0 : state.baseElement) || void 0;
7856 },
7857 isActiveItem(state) {
7858 return !!state && state.activeId === id;
7859 },
7860 ariaSetSize(state) {
7861 if (ariaSetSizeProp != null) return ariaSetSizeProp;
7862 if (!state) return;
7863 if (!(row == null ? void 0 : row.ariaSetSize)) return;
7864 if (row.baseElement !== state.baseElement) return;
7865 return row.ariaSetSize;
7866 },
7867 ariaPosInSet(state) {
7868 if (ariaPosInSetProp != null) return ariaPosInSetProp;
7869 if (!state) return;
7870 if (!(row == null ? void 0 : row.ariaPosInSet)) return;
7871 if (row.baseElement !== state.baseElement) return;
7872 const itemsInRow = state.renderedItems.filter(
7873 (item) => item.rowId === rowId
7874 );
7875 return row.ariaPosInSet + itemsInRow.findIndex((item) => item.id === id);
7876 },
7877 isTabbable(state) {
7878 if (!(state == null ? void 0 : state.renderedItems.length)) return true;
7879 if (state.virtualFocus) return false;
7880 if (tabbable) return true;
7881 if (state.activeId === null) return false;
7882 const item = store == null ? void 0 : store.item(state.activeId);
7883 if (item == null ? void 0 : item.disabled) return true;
7884 if (!(item == null ? void 0 : item.element)) return true;
7885 return state.activeId === id;
7886 }
7887 });
7888 const getItem = (0, import_react11.useCallback)(
7889 (item) => {
7890 var _a;
7891 const nextItem = {
7892 ...item,
7893 id: id || item.id,
7894 rowId,
7895 disabled: !!trulyDisabled,
7896 children: (_a = item.element) == null ? void 0 : _a.textContent
7897 };
7898 if (getItemProp) {
7899 return getItemProp(nextItem);
7900 }
7901 return nextItem;
7902 },
7903 [id, rowId, trulyDisabled, getItemProp]
7904 );
7905 const onFocusProp = props.onFocus;
7906 const hasFocusedComposite = (0, import_react11.useRef)(false);
7907 const onFocus = useEvent((event) => {
7908 onFocusProp == null ? void 0 : onFocusProp(event);
7909 if (event.defaultPrevented) return;
7910 if (isPortalEvent(event)) return;
7911 if (!id) return;
7912 if (!store) return;
7913 if (targetIsAnotherItem(event, store)) return;
7914 const { virtualFocus, baseElement: baseElement2 } = store.getState();
7915 store.setActiveId(id);
7916 if (isTextbox(event.currentTarget)) {
7917 selectTextField(event.currentTarget);
7918 }
7919 if (!virtualFocus) return;
7920 if (!isSelfTarget(event)) return;
7921 if (isEditableElement(event.currentTarget)) return;
7922 if (!(baseElement2 == null ? void 0 : baseElement2.isConnected)) return;
7923 if (isSafari() && event.currentTarget.hasAttribute("data-autofocus")) {
7924 event.currentTarget.scrollIntoView({
7925 block: "nearest",
7926 inline: "nearest"
7927 });
7928 }
7929 hasFocusedComposite.current = true;
7930 const fromComposite = event.relatedTarget === baseElement2 || isItem(store, event.relatedTarget);
7931 if (fromComposite) {
7932 focusSilently(baseElement2);
7933 } else {
7934 baseElement2.focus();
7935 }
7936 });
7937 const onBlurCaptureProp = props.onBlurCapture;
7938 const onBlurCapture = useEvent((event) => {
7939 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event);
7940 if (event.defaultPrevented) return;
7941 const state = store == null ? void 0 : store.getState();
7942 if ((state == null ? void 0 : state.virtualFocus) && hasFocusedComposite.current) {
7943 hasFocusedComposite.current = false;
7944 event.preventDefault();
7945 event.stopPropagation();
7946 }
7947 });
7948 const onKeyDownProp = props.onKeyDown;
7949 const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown);
7950 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
7951 const onKeyDown = useEvent((event) => {
7952 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
7953 if (event.defaultPrevented) return;
7954 if (!isSelfTarget(event)) return;
7955 if (!store) return;
7956 const { currentTarget } = event;
7957 const state = store.getState();
7958 const item = store.item(id);
7959 const isGrid2 = !!(item == null ? void 0 : item.rowId);
7960 const isVertical = state.orientation !== "horizontal";
7961 const isHorizontal = state.orientation !== "vertical";
7962 const canHomeEnd = () => {
7963 if (isGrid2) return true;
7964 if (isHorizontal) return true;
7965 if (!state.baseElement) return true;
7966 if (!isTextField(state.baseElement)) return true;
7967 return false;
7968 };
7969 const keyMap = {
7970 ArrowUp: (isGrid2 || isVertical) && store.up,
7971 ArrowRight: (isGrid2 || isHorizontal) && store.next,
7972 ArrowDown: (isGrid2 || isVertical) && store.down,
7973 ArrowLeft: (isGrid2 || isHorizontal) && store.previous,
7974 Home: () => {
7975 if (!canHomeEnd()) return;
7976 if (!isGrid2 || event.ctrlKey) {
7977 return store == null ? void 0 : store.first();
7978 }
7979 return store == null ? void 0 : store.previous(-1);
7980 },
7981 End: () => {
7982 if (!canHomeEnd()) return;
7983 if (!isGrid2 || event.ctrlKey) {
7984 return store == null ? void 0 : store.last();
7985 }
7986 return store == null ? void 0 : store.next(-1);
7987 },
7988 PageUp: () => {
7989 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.up, true);
7990 },
7991 PageDown: () => {
7992 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.down);
7993 }
7994 };
7995 const action = keyMap[event.key];
7996 if (action) {
7997 if (isTextbox(currentTarget)) {
7998 const selection = getTextboxSelection(currentTarget);
7999 const isLeft = isHorizontal && event.key === "ArrowLeft";
8000 const isRight = isHorizontal && event.key === "ArrowRight";
8001 const isUp = isVertical && event.key === "ArrowUp";
8002 const isDown = isVertical && event.key === "ArrowDown";
8003 if (isRight || isDown) {
8004 const { length: valueLength } = getTextboxValue(currentTarget);
8005 if (selection.end !== valueLength) return;
8006 } else if ((isLeft || isUp) && selection.start !== 0) return;
8007 }
8008 const nextId = action();
8009 if (preventScrollOnKeyDownProp(event) || nextId !== void 0) {
8010 if (!moveOnKeyPressProp(event)) return;
8011 event.preventDefault();
8012 store.move(nextId);
8013 }
8014 }
8015 });
8016 const providerValue = (0, import_react11.useMemo)(
8017 () => ({ id, baseElement }),
8018 [id, baseElement]
8019 );
8020 props = useWrapElement(
8021 props,
8022 (element) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompositeItemContext.Provider, { value: providerValue, children: element }),
8023 [providerValue]
8024 );
8025 props = {
8026 id,
8027 "data-active-item": isActiveItem || void 0,
8028 ...props,
8029 ref: useMergeRefs(ref, props.ref),
8030 tabIndex: isTabbable ? props.tabIndex : -1,
8031 onFocus,
8032 onBlurCapture,
8033 onKeyDown
8034 };
8035 props = useCommand(props);
8036 props = useCollectionItem({
8037 store,
8038 ...props,
8039 getItem,
8040 shouldRegisterItem: id ? props.shouldRegisterItem : false
8041 });
8042 return removeUndefinedValues({
8043 ...props,
8044 "aria-setsize": ariaSetSize,
8045 "aria-posinset": ariaPosInSet
8046 });
8047 }
8048 );
8049 var CompositeItem = memo22(
8050 forwardRef22(function CompositeItem2(props) {
8051 const htmlProps = useCompositeItem(props);
8052 return createElement3(TagName4, htmlProps);
8053 })
8054 );
8055
8056 // node_modules/@ariakit/core/esm/__chunks/7PRQYBBV.js
8057 function toArray(arg) {
8058 if (Array.isArray(arg)) {
8059 return arg;
8060 }
8061 return typeof arg !== "undefined" ? [arg] : [];
8062 }
8063 function flatten2DArray(array) {
8064 const flattened = [];
8065 for (const row of array) {
8066 flattened.push(...row);
8067 }
8068 return flattened;
8069 }
8070 function reverseArray(array) {
8071 return array.slice().reverse();
8072 }
8073
8074 // node_modules/@ariakit/react-core/esm/__chunks/ZMWF7ASR.js
8075 var import_react12 = __toESM(require_react(), 1);
8076 var import_jsx_runtime49 = __toESM(require_jsx_runtime(), 1);
8077 var TagName5 = "div";
8078 function isGrid(items) {
8079 return items.some((item) => !!item.rowId);
8080 }
8081 function isPrintableKey(event) {
8082 const target = event.target;
8083 if (target && !isTextField(target)) return false;
8084 return event.key.length === 1 && !event.ctrlKey && !event.metaKey;
8085 }
8086 function isModifierKey(event) {
8087 return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta";
8088 }
8089 function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) {
8090 return useEvent((event) => {
8091 var _a;
8092 onKeyboardEvent == null ? void 0 : onKeyboardEvent(event);
8093 if (event.defaultPrevented) return;
8094 if (event.isPropagationStopped()) return;
8095 if (!isSelfTarget(event)) return;
8096 if (isModifierKey(event)) return;
8097 if (isPrintableKey(event)) return;
8098 const state = store.getState();
8099 const activeElement = (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.element;
8100 if (!activeElement) return;
8101 const { view, ...eventInit } = event;
8102 const previousElement = previousElementRef == null ? void 0 : previousElementRef.current;
8103 if (activeElement !== previousElement) {
8104 activeElement.focus();
8105 }
8106 if (!fireKeyboardEvent(activeElement, event.type, eventInit)) {
8107 event.preventDefault();
8108 }
8109 if (event.currentTarget.contains(activeElement)) {
8110 event.stopPropagation();
8111 }
8112 });
8113 }
8114 function findFirstEnabledItemInTheLastRow(items) {
8115 return findFirstEnabledItem(
8116 flatten2DArray(reverseArray(groupItemsByRows(items)))
8117 );
8118 }
8119 function useScheduleFocus(store) {
8120 const [scheduled, setScheduled] = (0, import_react12.useState)(false);
8121 const schedule = (0, import_react12.useCallback)(() => setScheduled(true), []);
8122 const activeItem = store.useState(
8123 (state) => getEnabledItem(store, state.activeId)
8124 );
8125 (0, import_react12.useEffect)(() => {
8126 const activeElement = activeItem == null ? void 0 : activeItem.element;
8127 if (!scheduled) return;
8128 if (!activeElement) return;
8129 setScheduled(false);
8130 activeElement.focus({ preventScroll: true });
8131 }, [activeItem, scheduled]);
8132 return schedule;
8133 }
8134 var useComposite = createHook(
8135 function useComposite2({
8136 store,
8137 composite = true,
8138 focusOnMove = composite,
8139 moveOnKeyPress = true,
8140 ...props
8141 }) {
8142 const context = useCompositeProviderContext();
8143 store = store || context;
8144 invariant(
8145 store,
8146 "Composite must receive a `store` prop or be wrapped in a CompositeProvider component."
8147 );
8148 const ref = (0, import_react12.useRef)(null);
8149 const previousElementRef = (0, import_react12.useRef)(null);
8150 const scheduleFocus = useScheduleFocus(store);
8151 const moves = store.useState("moves");
8152 const [, setBaseElement] = useTransactionState(
8153 composite ? store.setBaseElement : null
8154 );
8155 (0, import_react12.useEffect)(() => {
8156 var _a;
8157 if (!store) return;
8158 if (!moves) return;
8159 if (!composite) return;
8160 if (!focusOnMove) return;
8161 const { activeId: activeId2 } = store.getState();
8162 const itemElement = (_a = getEnabledItem(store, activeId2)) == null ? void 0 : _a.element;
8163 if (!itemElement) return;
8164 focusIntoView(itemElement);
8165 }, [store, moves, composite, focusOnMove]);
8166 useSafeLayoutEffect(() => {
8167 if (!store) return;
8168 if (!moves) return;
8169 if (!composite) return;
8170 const { baseElement, activeId: activeId2 } = store.getState();
8171 const isSelfAcive = activeId2 === null;
8172 if (!isSelfAcive) return;
8173 if (!baseElement) return;
8174 const previousElement = previousElementRef.current;
8175 previousElementRef.current = null;
8176 if (previousElement) {
8177 fireBlurEvent(previousElement, { relatedTarget: baseElement });
8178 }
8179 if (!hasFocus(baseElement)) {
8180 baseElement.focus();
8181 }
8182 }, [store, moves, composite]);
8183 const activeId = store.useState("activeId");
8184 const virtualFocus = store.useState("virtualFocus");
8185 useSafeLayoutEffect(() => {
8186 var _a;
8187 if (!store) return;
8188 if (!composite) return;
8189 if (!virtualFocus) return;
8190 const previousElement = previousElementRef.current;
8191 previousElementRef.current = null;
8192 if (!previousElement) return;
8193 const activeElement = (_a = getEnabledItem(store, activeId)) == null ? void 0 : _a.element;
8194 const relatedTarget = activeElement || getActiveElement(previousElement);
8195 if (relatedTarget === previousElement) return;
8196 fireBlurEvent(previousElement, { relatedTarget });
8197 }, [store, activeId, virtualFocus, composite]);
8198 const onKeyDownCapture = useKeyboardEventProxy(
8199 store,
8200 props.onKeyDownCapture,
8201 previousElementRef
8202 );
8203 const onKeyUpCapture = useKeyboardEventProxy(
8204 store,
8205 props.onKeyUpCapture,
8206 previousElementRef
8207 );
8208 const onFocusCaptureProp = props.onFocusCapture;
8209 const onFocusCapture = useEvent((event) => {
8210 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event);
8211 if (event.defaultPrevented) return;
8212 if (!store) return;
8213 const { virtualFocus: virtualFocus2 } = store.getState();
8214 if (!virtualFocus2) return;
8215 const previousActiveElement = event.relatedTarget;
8216 const isSilentlyFocused = silentlyFocused(event.currentTarget);
8217 if (isSelfTarget(event) && isSilentlyFocused) {
8218 event.stopPropagation();
8219 previousElementRef.current = previousActiveElement;
8220 }
8221 });
8222 const onFocusProp = props.onFocus;
8223 const onFocus = useEvent((event) => {
8224 onFocusProp == null ? void 0 : onFocusProp(event);
8225 if (event.defaultPrevented) return;
8226 if (!composite) return;
8227 if (!store) return;
8228 const { relatedTarget } = event;
8229 const { virtualFocus: virtualFocus2 } = store.getState();
8230 if (virtualFocus2) {
8231 if (isSelfTarget(event) && !isItem(store, relatedTarget)) {
8232 queueMicrotask(scheduleFocus);
8233 }
8234 } else if (isSelfTarget(event)) {
8235 store.setActiveId(null);
8236 }
8237 });
8238 const onBlurCaptureProp = props.onBlurCapture;
8239 const onBlurCapture = useEvent((event) => {
8240 var _a;
8241 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event);
8242 if (event.defaultPrevented) return;
8243 if (!store) return;
8244 const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState();
8245 if (!virtualFocus2) return;
8246 const activeElement = (_a = getEnabledItem(store, activeId2)) == null ? void 0 : _a.element;
8247 const nextActiveElement = event.relatedTarget;
8248 const nextActiveElementIsItem = isItem(store, nextActiveElement);
8249 const previousElement = previousElementRef.current;
8250 previousElementRef.current = null;
8251 if (isSelfTarget(event) && nextActiveElementIsItem) {
8252 if (nextActiveElement === activeElement) {
8253 if (previousElement && previousElement !== nextActiveElement) {
8254 fireBlurEvent(previousElement, event);
8255 }
8256 } else if (activeElement) {
8257 fireBlurEvent(activeElement, event);
8258 } else if (previousElement) {
8259 fireBlurEvent(previousElement, event);
8260 }
8261 event.stopPropagation();
8262 } else {
8263 const targetIsItem = isItem(store, event.target);
8264 if (!targetIsItem && activeElement) {
8265 fireBlurEvent(activeElement, event);
8266 }
8267 }
8268 });
8269 const onKeyDownProp = props.onKeyDown;
8270 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
8271 const onKeyDown = useEvent((event) => {
8272 var _a;
8273 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
8274 if (event.nativeEvent.isComposing) return;
8275 if (event.defaultPrevented) return;
8276 if (!store) return;
8277 if (!isSelfTarget(event)) return;
8278 const { orientation, renderedItems, activeId: activeId2 } = store.getState();
8279 const activeItem = getEnabledItem(store, activeId2);
8280 if ((_a = activeItem == null ? void 0 : activeItem.element) == null ? void 0 : _a.isConnected) return;
8281 const isVertical = orientation !== "horizontal";
8282 const isHorizontal = orientation !== "vertical";
8283 const grid = isGrid(renderedItems);
8284 const isHorizontalKey = event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End";
8285 if (isHorizontalKey && isTextField(event.currentTarget)) return;
8286 const up = () => {
8287 if (grid) {
8288 const item = findFirstEnabledItemInTheLastRow(renderedItems);
8289 return item == null ? void 0 : item.id;
8290 }
8291 return store == null ? void 0 : store.last();
8292 };
8293 const keyMap = {
8294 ArrowUp: (grid || isVertical) && up,
8295 ArrowRight: (grid || isHorizontal) && store.first,
8296 ArrowDown: (grid || isVertical) && store.first,
8297 ArrowLeft: (grid || isHorizontal) && store.last,
8298 Home: store.first,
8299 End: store.last,
8300 PageUp: store.first,
8301 PageDown: store.last
8302 };
8303 const action = keyMap[event.key];
8304 if (action) {
8305 const id = action();
8306 if (id !== void 0) {
8307 if (!moveOnKeyPressProp(event)) return;
8308 event.preventDefault();
8309 store.move(id);
8310 }
8311 }
8312 });
8313 props = useWrapElement(
8314 props,
8315 (element) => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(CompositeContextProvider, { value: store, children: element }),
8316 [store]
8317 );
8318 const activeDescendant = store.useState((state) => {
8319 var _a;
8320 if (!store) return;
8321 if (!composite) return;
8322 if (!state.virtualFocus) return;
8323 return (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.id;
8324 });
8325 props = {
8326 "aria-activedescendant": activeDescendant,
8327 ...props,
8328 ref: useMergeRefs(ref, setBaseElement, props.ref),
8329 onKeyDownCapture,
8330 onKeyUpCapture,
8331 onFocusCapture,
8332 onFocus,
8333 onBlurCapture,
8334 onKeyDown
8335 };
8336 const focusable = store.useState(
8337 (state) => composite && (state.virtualFocus || state.activeId === null)
8338 );
8339 props = useFocusable({ focusable, ...props });
8340 return props;
8341 }
8342 );
8343 var Composite5 = forwardRef22(function Composite22(props) {
8344 const htmlProps = useComposite(props);
8345 return createElement3(TagName5, htmlProps);
8346 });
8347
8348 // node_modules/@ariakit/react-core/esm/__chunks/LVDQFHCH.js
8349 var ctx3 = createStoreContext();
8350 var useDisclosureContext = ctx3.useContext;
8351 var useDisclosureScopedContext = ctx3.useScopedContext;
8352 var useDisclosureProviderContext = ctx3.useProviderContext;
8353 var DisclosureContextProvider = ctx3.ContextProvider;
8354 var DisclosureScopedContextProvider = ctx3.ScopedContextProvider;
8355
8356 // node_modules/@ariakit/react-core/esm/__chunks/A62MDFCW.js
8357 var import_react13 = __toESM(require_react(), 1);
8358 var ctx4 = createStoreContext(
8359 [DisclosureContextProvider],
8360 [DisclosureScopedContextProvider]
8361 );
8362 var useDialogContext = ctx4.useContext;
8363 var useDialogScopedContext = ctx4.useScopedContext;
8364 var useDialogProviderContext = ctx4.useProviderContext;
8365 var DialogContextProvider = ctx4.ContextProvider;
8366 var DialogScopedContextProvider = ctx4.ScopedContextProvider;
8367 var DialogHeadingContext = (0, import_react13.createContext)(void 0);
8368 var DialogDescriptionContext = (0, import_react13.createContext)(void 0);
8369
8370 // node_modules/@ariakit/react-core/esm/__chunks/6B3RXHKP.js
8371 var import_react14 = __toESM(require_react(), 1);
8372 var import_react_dom = __toESM(require_react_dom(), 1);
8373 var import_jsx_runtime50 = __toESM(require_jsx_runtime(), 1);
8374 var TagName6 = "div";
8375 function afterTimeout(timeoutMs, cb) {
8376 const timeoutId = setTimeout(cb, timeoutMs);
8377 return () => clearTimeout(timeoutId);
8378 }
8379 function afterPaint2(cb) {
8380 let raf = requestAnimationFrame(() => {
8381 raf = requestAnimationFrame(cb);
8382 });
8383 return () => cancelAnimationFrame(raf);
8384 }
8385 function parseCSSTime(...times) {
8386 return times.join(", ").split(", ").reduce((longestTime, currentTimeString) => {
8387 const multiplier = currentTimeString.endsWith("ms") ? 1 : 1e3;
8388 const currentTime = Number.parseFloat(currentTimeString || "0s") * multiplier;
8389 if (currentTime > longestTime) return currentTime;
8390 return longestTime;
8391 }, 0);
8392 }
8393 function isHidden(mounted, hidden, alwaysVisible) {
8394 return !alwaysVisible && hidden !== false && (!mounted || !!hidden);
8395 }
8396 var useDisclosureContent = createHook(function useDisclosureContent2({ store, alwaysVisible, ...props }) {
8397 const context = useDisclosureProviderContext();
8398 store = store || context;
8399 invariant(
8400 store,
8401 "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component."
8402 );
8403 const ref = (0, import_react14.useRef)(null);
8404 const id = useId3(props.id);
8405 const [transition, setTransition] = (0, import_react14.useState)(null);
8406 const open = store.useState("open");
8407 const mounted = store.useState("mounted");
8408 const animated = store.useState("animated");
8409 const contentElement = store.useState("contentElement");
8410 const otherElement = useStoreState(store.disclosure, "contentElement");
8411 useSafeLayoutEffect(() => {
8412 if (!ref.current) return;
8413 store == null ? void 0 : store.setContentElement(ref.current);
8414 }, [store]);
8415 useSafeLayoutEffect(() => {
8416 let previousAnimated;
8417 store == null ? void 0 : store.setState("animated", (animated2) => {
8418 previousAnimated = animated2;
8419 return true;
8420 });
8421 return () => {
8422 if (previousAnimated === void 0) return;
8423 store == null ? void 0 : store.setState("animated", previousAnimated);
8424 };
8425 }, [store]);
8426 useSafeLayoutEffect(() => {
8427 if (!animated) return;
8428 if (!(contentElement == null ? void 0 : contentElement.isConnected)) {
8429 setTransition(null);
8430 return;
8431 }
8432 return afterPaint2(() => {
8433 setTransition(open ? "enter" : mounted ? "leave" : null);
8434 });
8435 }, [animated, contentElement, open, mounted]);
8436 useSafeLayoutEffect(() => {
8437 if (!store) return;
8438 if (!animated) return;
8439 if (!transition) return;
8440 if (!contentElement) return;
8441 const stopAnimation = () => store == null ? void 0 : store.setState("animating", false);
8442 const stopAnimationSync = () => (0, import_react_dom.flushSync)(stopAnimation);
8443 if (transition === "leave" && open) return;
8444 if (transition === "enter" && !open) return;
8445 if (typeof animated === "number") {
8446 const timeout2 = animated;
8447 return afterTimeout(timeout2, stopAnimationSync);
8448 }
8449 const {
8450 transitionDuration,
8451 animationDuration,
8452 transitionDelay,
8453 animationDelay
8454 } = getComputedStyle(contentElement);
8455 const {
8456 transitionDuration: transitionDuration2 = "0",
8457 animationDuration: animationDuration2 = "0",
8458 transitionDelay: transitionDelay2 = "0",
8459 animationDelay: animationDelay2 = "0"
8460 } = otherElement ? getComputedStyle(otherElement) : {};
8461 const delay = parseCSSTime(
8462 transitionDelay,
8463 animationDelay,
8464 transitionDelay2,
8465 animationDelay2
8466 );
8467 const duration = parseCSSTime(
8468 transitionDuration,
8469 animationDuration,
8470 transitionDuration2,
8471 animationDuration2
8472 );
8473 const timeout = delay + duration;
8474 if (!timeout) {
8475 if (transition === "enter") {
8476 store.setState("animated", false);
8477 }
8478 stopAnimation();
8479 return;
8480 }
8481 const frameRate = 1e3 / 60;
8482 const maxTimeout = Math.max(timeout - frameRate, 0);
8483 return afterTimeout(maxTimeout, stopAnimationSync);
8484 }, [store, animated, contentElement, otherElement, open, transition]);
8485 props = useWrapElement(
8486 props,
8487 (element) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(DialogScopedContextProvider, { value: store, children: element }),
8488 [store]
8489 );
8490 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
8491 const styleProp = props.style;
8492 const style = (0, import_react14.useMemo)(() => {
8493 if (hidden) {
8494 return { ...styleProp, display: "none" };
8495 }
8496 return styleProp;
8497 }, [hidden, styleProp]);
8498 props = {
8499 id,
8500 "data-open": open || void 0,
8501 "data-enter": transition === "enter" || void 0,
8502 "data-leave": transition === "leave" || void 0,
8503 hidden,
8504 ...props,
8505 ref: useMergeRefs(id ? store.setContentElement : null, ref, props.ref),
8506 style
8507 };
8508 return removeUndefinedValues(props);
8509 });
8510 var DisclosureContentImpl = forwardRef22(function DisclosureContentImpl2(props) {
8511 const htmlProps = useDisclosureContent(props);
8512 return createElement3(TagName6, htmlProps);
8513 });
8514 var DisclosureContent = forwardRef22(function DisclosureContent2({
8515 unmountOnHide,
8516 ...props
8517 }) {
8518 const context = useDisclosureProviderContext();
8519 const store = props.store || context;
8520 const mounted = useStoreState(
8521 store,
8522 (state) => !unmountOnHide || (state == null ? void 0 : state.mounted)
8523 );
8524 if (mounted === false) return null;
8525 return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(DisclosureContentImpl, { ...props });
8526 });
8527
8528 // node_modules/@ariakit/core/esm/__chunks/75BJEVSH.js
8529 function createDisclosureStore(props = {}) {
8530 const store = mergeStore(
8531 props.store,
8532 omit22(props.disclosure, ["contentElement", "disclosureElement"])
8533 );
8534 throwOnConflictingProps(props, store);
8535 const syncState = store == null ? void 0 : store.getState();
8536 const open = defaultValue(
8537 props.open,
8538 syncState == null ? void 0 : syncState.open,
8539 props.defaultOpen,
8540 false
8541 );
8542 const animated = defaultValue(props.animated, syncState == null ? void 0 : syncState.animated, false);
8543 const initialState = {
8544 open,
8545 animated,
8546 animating: !!animated && open,
8547 mounted: open,
8548 contentElement: defaultValue(syncState == null ? void 0 : syncState.contentElement, null),
8549 disclosureElement: defaultValue(syncState == null ? void 0 : syncState.disclosureElement, null)
8550 };
8551 const disclosure = createStore(initialState, store);
8552 setup(
8553 disclosure,
8554 () => sync(disclosure, ["animated", "animating"], (state) => {
8555 if (state.animated) return;
8556 disclosure.setState("animating", false);
8557 })
8558 );
8559 setup(
8560 disclosure,
8561 () => subscribe(disclosure, ["open"], () => {
8562 if (!disclosure.getState().animated) return;
8563 disclosure.setState("animating", true);
8564 })
8565 );
8566 setup(
8567 disclosure,
8568 () => sync(disclosure, ["open", "animating"], (state) => {
8569 disclosure.setState("mounted", state.open || state.animating);
8570 })
8571 );
8572 return {
8573 ...disclosure,
8574 disclosure: props.disclosure,
8575 setOpen: (value) => disclosure.setState("open", value),
8576 show: () => disclosure.setState("open", true),
8577 hide: () => disclosure.setState("open", false),
8578 toggle: () => disclosure.setState("open", (open2) => !open2),
8579 stopAnimation: () => disclosure.setState("animating", false),
8580 setContentElement: (value) => disclosure.setState("contentElement", value),
8581 setDisclosureElement: (value) => disclosure.setState("disclosureElement", value)
8582 };
8583 }
8584
8585 // node_modules/@ariakit/react-core/esm/__chunks/WLZ6H5FH.js
8586 function useDisclosureStoreProps(store, update2, props) {
8587 useUpdateEffect(update2, [props.store, props.disclosure]);
8588 useStoreProps(store, props, "open", "setOpen");
8589 useStoreProps(store, props, "mounted", "setMounted");
8590 useStoreProps(store, props, "animated");
8591 return Object.assign(store, { disclosure: props.disclosure });
8592 }
8593
8594 // node_modules/@ariakit/react-core/esm/__chunks/JMU4N4M5.js
8595 var ctx5 = createStoreContext(
8596 [DialogContextProvider],
8597 [DialogScopedContextProvider]
8598 );
8599 var usePopoverContext = ctx5.useContext;
8600 var usePopoverScopedContext = ctx5.useScopedContext;
8601 var usePopoverProviderContext = ctx5.useProviderContext;
8602 var PopoverContextProvider = ctx5.ContextProvider;
8603 var PopoverScopedContextProvider = ctx5.ScopedContextProvider;
8604
8605 // node_modules/@ariakit/core/esm/__chunks/N5XGANPW.js
8606 function getCommonParent(items) {
8607 var _a;
8608 const firstItem = items.find((item) => !!item.element);
8609 const lastItem = [...items].reverse().find((item) => !!item.element);
8610 let parentElement = (_a = firstItem == null ? void 0 : firstItem.element) == null ? void 0 : _a.parentElement;
8611 while (parentElement && (lastItem == null ? void 0 : lastItem.element)) {
8612 const parent = parentElement;
8613 if (lastItem && parent.contains(lastItem.element)) {
8614 return parentElement;
8615 }
8616 parentElement = parentElement.parentElement;
8617 }
8618 return getDocument(parentElement).body;
8619 }
8620 function getPrivateStore(store) {
8621 return store == null ? void 0 : store.__unstablePrivateStore;
8622 }
8623 function createCollectionStore(props = {}) {
8624 var _a;
8625 throwOnConflictingProps(props, props.store);
8626 const syncState = (_a = props.store) == null ? void 0 : _a.getState();
8627 const items = defaultValue(
8628 props.items,
8629 syncState == null ? void 0 : syncState.items,
8630 props.defaultItems,
8631 []
8632 );
8633 const itemsMap = new Map(items.map((item) => [item.id, item]));
8634 const initialState = {
8635 items,
8636 renderedItems: defaultValue(syncState == null ? void 0 : syncState.renderedItems, [])
8637 };
8638 const syncPrivateStore = getPrivateStore(props.store);
8639 const privateStore = createStore(
8640 { items, renderedItems: initialState.renderedItems },
8641 syncPrivateStore
8642 );
8643 const collection = createStore(initialState, props.store);
8644 const sortItems = (renderedItems) => {
8645 const sortedItems = sortBasedOnDOMPosition(renderedItems, (i2) => i2.element);
8646 privateStore.setState("renderedItems", sortedItems);
8647 collection.setState("renderedItems", sortedItems);
8648 };
8649 setup(collection, () => init(privateStore));
8650 setup(privateStore, () => {
8651 return batch(privateStore, ["items"], (state) => {
8652 collection.setState("items", state.items);
8653 });
8654 });
8655 setup(privateStore, () => {
8656 return batch(privateStore, ["renderedItems"], (state) => {
8657 let firstRun = true;
8658 let raf = requestAnimationFrame(() => {
8659 const { renderedItems } = collection.getState();
8660 if (state.renderedItems === renderedItems) return;
8661 sortItems(state.renderedItems);
8662 });
8663 if (typeof IntersectionObserver !== "function") {
8664 return () => cancelAnimationFrame(raf);
8665 }
8666 const ioCallback = () => {
8667 if (firstRun) {
8668 firstRun = false;
8669 return;
8670 }
8671 cancelAnimationFrame(raf);
8672 raf = requestAnimationFrame(() => sortItems(state.renderedItems));
8673 };
8674 const root = getCommonParent(state.renderedItems);
8675 const observer = new IntersectionObserver(ioCallback, { root });
8676 for (const item of state.renderedItems) {
8677 if (!item.element) continue;
8678 observer.observe(item.element);
8679 }
8680 return () => {
8681 cancelAnimationFrame(raf);
8682 observer.disconnect();
8683 };
8684 });
8685 });
8686 const mergeItem = (item, setItems, canDeleteFromMap = false) => {
8687 let prevItem;
8688 setItems((items2) => {
8689 const index = items2.findIndex(({ id }) => id === item.id);
8690 const nextItems = items2.slice();
8691 if (index !== -1) {
8692 prevItem = items2[index];
8693 const nextItem = { ...prevItem, ...item };
8694 nextItems[index] = nextItem;
8695 itemsMap.set(item.id, nextItem);
8696 } else {
8697 nextItems.push(item);
8698 itemsMap.set(item.id, item);
8699 }
8700 return nextItems;
8701 });
8702 const unmergeItem = () => {
8703 setItems((items2) => {
8704 if (!prevItem) {
8705 if (canDeleteFromMap) {
8706 itemsMap.delete(item.id);
8707 }
8708 return items2.filter(({ id }) => id !== item.id);
8709 }
8710 const index = items2.findIndex(({ id }) => id === item.id);
8711 if (index === -1) return items2;
8712 const nextItems = items2.slice();
8713 nextItems[index] = prevItem;
8714 itemsMap.set(item.id, prevItem);
8715 return nextItems;
8716 });
8717 };
8718 return unmergeItem;
8719 };
8720 const registerItem = (item) => mergeItem(
8721 item,
8722 (getItems) => privateStore.setState("items", getItems),
8723 true
8724 );
8725 return {
8726 ...collection,
8727 registerItem,
8728 renderItem: (item) => chain(
8729 registerItem(item),
8730 mergeItem(
8731 item,
8732 (getItems) => privateStore.setState("renderedItems", getItems)
8733 )
8734 ),
8735 item: (id) => {
8736 if (!id) return null;
8737 let item = itemsMap.get(id);
8738 if (!item) {
8739 const { items: items2 } = privateStore.getState();
8740 item = items2.find((item2) => item2.id === id);
8741 if (item) {
8742 itemsMap.set(id, item);
8743 }
8744 }
8745 return item || null;
8746 },
8747 // @ts-expect-error Internal
8748 __unstablePrivateStore: privateStore
8749 };
8750 }
8751
8752 // node_modules/@ariakit/react-core/esm/__chunks/GVAFFF2B.js
8753 function useCollectionStoreProps(store, update2, props) {
8754 useUpdateEffect(update2, [props.store]);
8755 useStoreProps(store, props, "items", "setItems");
8756 return store;
8757 }
8758
8759 // node_modules/@ariakit/core/esm/__chunks/RVTIKFRL.js
8760 var NULL_ITEM = { id: null };
8761 function findFirstEnabledItem2(items, excludeId) {
8762 return items.find((item) => {
8763 if (excludeId) {
8764 return !item.disabled && item.id !== excludeId;
8765 }
8766 return !item.disabled;
8767 });
8768 }
8769 function getEnabledItems(items, excludeId) {
8770 return items.filter((item) => {
8771 if (excludeId) {
8772 return !item.disabled && item.id !== excludeId;
8773 }
8774 return !item.disabled;
8775 });
8776 }
8777 function getItemsInRow(items, rowId) {
8778 return items.filter((item) => item.rowId === rowId);
8779 }
8780 function flipItems(items, activeId, shouldInsertNullItem = false) {
8781 const index = items.findIndex((item) => item.id === activeId);
8782 return [
8783 ...items.slice(index + 1),
8784 ...shouldInsertNullItem ? [NULL_ITEM] : [],
8785 ...items.slice(0, index)
8786 ];
8787 }
8788 function groupItemsByRows2(items) {
8789 const rows = [];
8790 for (const item of items) {
8791 const row = rows.find((currentRow) => {
8792 var _a;
8793 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId;
8794 });
8795 if (row) {
8796 row.push(item);
8797 } else {
8798 rows.push([item]);
8799 }
8800 }
8801 return rows;
8802 }
8803 function getMaxRowLength(array) {
8804 let maxLength = 0;
8805 for (const { length } of array) {
8806 if (length > maxLength) {
8807 maxLength = length;
8808 }
8809 }
8810 return maxLength;
8811 }
8812 function createEmptyItem(rowId) {
8813 return {
8814 id: "__EMPTY_ITEM__",
8815 disabled: true,
8816 rowId
8817 };
8818 }
8819 function normalizeRows(rows, activeId, focusShift) {
8820 const maxLength = getMaxRowLength(rows);
8821 for (const row of rows) {
8822 for (let i2 = 0; i2 < maxLength; i2 += 1) {
8823 const item = row[i2];
8824 if (!item || focusShift && item.disabled) {
8825 const isFirst = i2 === 0;
8826 const previousItem = isFirst && focusShift ? findFirstEnabledItem2(row) : row[i2 - 1];
8827 row[i2] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem == null ? void 0 : previousItem.rowId);
8828 }
8829 }
8830 }
8831 return rows;
8832 }
8833 function verticalizeItems(items) {
8834 const rows = groupItemsByRows2(items);
8835 const maxLength = getMaxRowLength(rows);
8836 const verticalized = [];
8837 for (let i2 = 0; i2 < maxLength; i2 += 1) {
8838 for (const row of rows) {
8839 const item = row[i2];
8840 if (item) {
8841 verticalized.push({
8842 ...item,
8843 // If there's no rowId, it means that it's not a grid composite, but
8844 // a single row instead. So, instead of verticalizing it, that is,
8845 // assigning a different rowId based on the column index, we keep it
8846 // undefined so they will be part of the same row. This is useful
8847 // when using up/down on one-dimensional composites.
8848 rowId: item.rowId ? `${i2}` : void 0
8849 });
8850 }
8851 }
8852 }
8853 return verticalized;
8854 }
8855 function createCompositeStore(props = {}) {
8856 var _a;
8857 const syncState = (_a = props.store) == null ? void 0 : _a.getState();
8858 const collection = createCollectionStore(props);
8859 const activeId = defaultValue(
8860 props.activeId,
8861 syncState == null ? void 0 : syncState.activeId,
8862 props.defaultActiveId
8863 );
8864 const initialState = {
8865 ...collection.getState(),
8866 id: defaultValue(
8867 props.id,
8868 syncState == null ? void 0 : syncState.id,
8869 `id-${Math.random().toString(36).slice(2, 8)}`
8870 ),
8871 activeId,
8872 baseElement: defaultValue(syncState == null ? void 0 : syncState.baseElement, null),
8873 includesBaseElement: defaultValue(
8874 props.includesBaseElement,
8875 syncState == null ? void 0 : syncState.includesBaseElement,
8876 activeId === null
8877 ),
8878 moves: defaultValue(syncState == null ? void 0 : syncState.moves, 0),
8879 orientation: defaultValue(
8880 props.orientation,
8881 syncState == null ? void 0 : syncState.orientation,
8882 "both"
8883 ),
8884 rtl: defaultValue(props.rtl, syncState == null ? void 0 : syncState.rtl, false),
8885 virtualFocus: defaultValue(
8886 props.virtualFocus,
8887 syncState == null ? void 0 : syncState.virtualFocus,
8888 false
8889 ),
8890 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, false),
8891 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, false),
8892 focusShift: defaultValue(props.focusShift, syncState == null ? void 0 : syncState.focusShift, false)
8893 };
8894 const composite = createStore(initialState, collection, props.store);
8895 setup(
8896 composite,
8897 () => sync(composite, ["renderedItems", "activeId"], (state) => {
8898 composite.setState("activeId", (activeId2) => {
8899 var _a2;
8900 if (activeId2 !== void 0) return activeId2;
8901 return (_a2 = findFirstEnabledItem2(state.renderedItems)) == null ? void 0 : _a2.id;
8902 });
8903 })
8904 );
8905 const getNextId = (direction = "next", options = {}) => {
8906 var _a2, _b;
8907 const defaultState = composite.getState();
8908 const {
8909 skip = 0,
8910 activeId: activeId2 = defaultState.activeId,
8911 focusShift = defaultState.focusShift,
8912 focusLoop = defaultState.focusLoop,
8913 focusWrap = defaultState.focusWrap,
8914 includesBaseElement = defaultState.includesBaseElement,
8915 renderedItems = defaultState.renderedItems,
8916 rtl = defaultState.rtl
8917 } = options;
8918 const isVerticalDirection = direction === "up" || direction === "down";
8919 const isNextDirection = direction === "next" || direction === "down";
8920 const canReverse = isNextDirection ? rtl && !isVerticalDirection : !rtl || isVerticalDirection;
8921 const canShift = focusShift && !skip;
8922 let items = !isVerticalDirection ? renderedItems : flatten2DArray(
8923 normalizeRows(groupItemsByRows2(renderedItems), activeId2, canShift)
8924 );
8925 items = canReverse ? reverseArray(items) : items;
8926 items = isVerticalDirection ? verticalizeItems(items) : items;
8927 if (activeId2 == null) {
8928 return (_a2 = findFirstEnabledItem2(items)) == null ? void 0 : _a2.id;
8929 }
8930 const activeItem = items.find((item) => item.id === activeId2);
8931 if (!activeItem) {
8932 return (_b = findFirstEnabledItem2(items)) == null ? void 0 : _b.id;
8933 }
8934 const isGrid2 = items.some((item) => item.rowId);
8935 const activeIndex = items.indexOf(activeItem);
8936 const nextItems = items.slice(activeIndex + 1);
8937 const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId);
8938 if (skip) {
8939 const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2);
8940 const nextItem2 = nextEnabledItemsInRow.slice(skip)[0] || // If we can't find an item, just return the last one.
8941 nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1];
8942 return nextItem2 == null ? void 0 : nextItem2.id;
8943 }
8944 const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical");
8945 const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical");
8946 const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false;
8947 if (canLoop) {
8948 const loopItems = canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId);
8949 const sortedItems = flipItems(loopItems, activeId2, hasNullItem);
8950 const nextItem2 = findFirstEnabledItem2(sortedItems, activeId2);
8951 return nextItem2 == null ? void 0 : nextItem2.id;
8952 }
8953 if (canWrap) {
8954 const nextItem2 = findFirstEnabledItem2(
8955 // We can use nextItems, which contains all the next items, including
8956 // items from other rows, to wrap between rows. However, if there is a
8957 // null item (the composite container), we'll only use the next items in
8958 // the row. So moving next from the last item will focus on the
8959 // composite container. On grid composites, horizontal navigation never
8960 // focuses on the composite container, only vertical.
8961 hasNullItem ? nextItemsInRow : nextItems,
8962 activeId2
8963 );
8964 const nextId = hasNullItem ? (nextItem2 == null ? void 0 : nextItem2.id) || null : nextItem2 == null ? void 0 : nextItem2.id;
8965 return nextId;
8966 }
8967 const nextItem = findFirstEnabledItem2(nextItemsInRow, activeId2);
8968 if (!nextItem && hasNullItem) {
8969 return null;
8970 }
8971 return nextItem == null ? void 0 : nextItem.id;
8972 };
8973 return {
8974 ...collection,
8975 ...composite,
8976 setBaseElement: (element) => composite.setState("baseElement", element),
8977 setActiveId: (id) => composite.setState("activeId", id),
8978 move: (id) => {
8979 if (id === void 0) return;
8980 composite.setState("activeId", id);
8981 composite.setState("moves", (moves) => moves + 1);
8982 },
8983 first: () => {
8984 var _a2;
8985 return (_a2 = findFirstEnabledItem2(composite.getState().renderedItems)) == null ? void 0 : _a2.id;
8986 },
8987 last: () => {
8988 var _a2;
8989 return (_a2 = findFirstEnabledItem2(reverseArray(composite.getState().renderedItems))) == null ? void 0 : _a2.id;
8990 },
8991 next: (options) => {
8992 if (options !== void 0 && typeof options === "number") {
8993 options = { skip: options };
8994 }
8995 return getNextId("next", options);
8996 },
8997 previous: (options) => {
8998 if (options !== void 0 && typeof options === "number") {
8999 options = { skip: options };
9000 }
9001 return getNextId("previous", options);
9002 },
9003 down: (options) => {
9004 if (options !== void 0 && typeof options === "number") {
9005 options = { skip: options };
9006 }
9007 return getNextId("down", options);
9008 },
9009 up: (options) => {
9010 if (options !== void 0 && typeof options === "number") {
9011 options = { skip: options };
9012 }
9013 return getNextId("up", options);
9014 }
9015 };
9016 }
9017
9018 // node_modules/@ariakit/react-core/esm/__chunks/IQYAUKXT.js
9019 function useCompositeStoreOptions(props) {
9020 const id = useId3(props.id);
9021 return { id, ...props };
9022 }
9023 function useCompositeStoreProps(store, update2, props) {
9024 store = useCollectionStoreProps(store, update2, props);
9025 useStoreProps(store, props, "activeId", "setActiveId");
9026 useStoreProps(store, props, "includesBaseElement");
9027 useStoreProps(store, props, "virtualFocus");
9028 useStoreProps(store, props, "orientation");
9029 useStoreProps(store, props, "rtl");
9030 useStoreProps(store, props, "focusLoop");
9031 useStoreProps(store, props, "focusWrap");
9032 useStoreProps(store, props, "focusShift");
9033 return store;
9034 }
9035
9036 // node_modules/@ariakit/react-core/esm/__chunks/CVCFNOHX.js
9037 var import_react15 = __toESM(require_react(), 1);
9038 var ComboboxListRoleContext = (0, import_react15.createContext)(
9039 void 0
9040 );
9041 var ctx6 = createStoreContext(
9042 [PopoverContextProvider, CompositeContextProvider],
9043 [PopoverScopedContextProvider, CompositeScopedContextProvider]
9044 );
9045 var useComboboxContext = ctx6.useContext;
9046 var useComboboxScopedContext = ctx6.useScopedContext;
9047 var useComboboxProviderContext = ctx6.useProviderContext;
9048 var ComboboxContextProvider = ctx6.ContextProvider;
9049 var ComboboxScopedContextProvider = ctx6.ScopedContextProvider;
9050 var ComboboxItemValueContext = (0, import_react15.createContext)(
9051 void 0
9052 );
9053 var ComboboxItemCheckedContext = (0, import_react15.createContext)(false);
9054
9055 // node_modules/@ariakit/core/esm/__chunks/KMAUV3TY.js
9056 function createDialogStore(props = {}) {
9057 return createDisclosureStore(props);
9058 }
9059
9060 // node_modules/@ariakit/react-core/esm/__chunks/4NYSH4UO.js
9061 function useDialogStoreProps(store, update2, props) {
9062 return useDisclosureStoreProps(store, update2, props);
9063 }
9064
9065 // node_modules/@ariakit/core/esm/__chunks/BFGNM53A.js
9066 function createPopoverStore({
9067 popover: otherPopover,
9068 ...props
9069 } = {}) {
9070 const store = mergeStore(
9071 props.store,
9072 omit22(otherPopover, [
9073 "arrowElement",
9074 "anchorElement",
9075 "contentElement",
9076 "popoverElement",
9077 "disclosureElement"
9078 ])
9079 );
9080 throwOnConflictingProps(props, store);
9081 const syncState = store == null ? void 0 : store.getState();
9082 const dialog = createDialogStore({ ...props, store });
9083 const placement = defaultValue(
9084 props.placement,
9085 syncState == null ? void 0 : syncState.placement,
9086 "bottom"
9087 );
9088 const initialState = {
9089 ...dialog.getState(),
9090 placement,
9091 currentPlacement: placement,
9092 anchorElement: defaultValue(syncState == null ? void 0 : syncState.anchorElement, null),
9093 popoverElement: defaultValue(syncState == null ? void 0 : syncState.popoverElement, null),
9094 arrowElement: defaultValue(syncState == null ? void 0 : syncState.arrowElement, null),
9095 rendered: /* @__PURE__ */ Symbol("rendered")
9096 };
9097 const popover = createStore(initialState, dialog, store);
9098 return {
9099 ...dialog,
9100 ...popover,
9101 setAnchorElement: (element) => popover.setState("anchorElement", element),
9102 setPopoverElement: (element) => popover.setState("popoverElement", element),
9103 setArrowElement: (element) => popover.setState("arrowElement", element),
9104 render: () => popover.setState("rendered", /* @__PURE__ */ Symbol("rendered"))
9105 };
9106 }
9107
9108 // node_modules/@ariakit/react-core/esm/__chunks/B6FLPFJM.js
9109 function usePopoverStoreProps(store, update2, props) {
9110 useUpdateEffect(update2, [props.popover]);
9111 useStoreProps(store, props, "placement");
9112 return useDialogStoreProps(store, update2, props);
9113 }
9114
9115 // node_modules/@ariakit/react-core/esm/__chunks/4POTBZ2J.js
9116 var TagName7 = "div";
9117 var usePopoverAnchor = createHook(
9118 function usePopoverAnchor2({ store, ...props }) {
9119 const context = usePopoverProviderContext();
9120 store = store || context;
9121 props = {
9122 ...props,
9123 ref: useMergeRefs(store == null ? void 0 : store.setAnchorElement, props.ref)
9124 };
9125 return props;
9126 }
9127 );
9128 var PopoverAnchor = forwardRef22(function PopoverAnchor2(props) {
9129 const htmlProps = usePopoverAnchor(props);
9130 return createElement3(TagName7, htmlProps);
9131 });
9132
9133 // node_modules/@ariakit/react-core/esm/__chunks/X6LNAU2F.js
9134 var import_react16 = __toESM(require_react(), 1);
9135 var TagName8 = "div";
9136 function getMouseDestination(event) {
9137 const relatedTarget = event.relatedTarget;
9138 if ((relatedTarget == null ? void 0 : relatedTarget.nodeType) === Node.ELEMENT_NODE) {
9139 return relatedTarget;
9140 }
9141 return null;
9142 }
9143 function hoveringInside(event) {
9144 const nextElement = getMouseDestination(event);
9145 if (!nextElement) return false;
9146 return contains(event.currentTarget, nextElement);
9147 }
9148 var symbol2 = /* @__PURE__ */ Symbol("composite-hover");
9149 function movingToAnotherItem(event) {
9150 let dest = getMouseDestination(event);
9151 if (!dest) return false;
9152 do {
9153 if (hasOwnProperty(dest, symbol2) && dest[symbol2]) return true;
9154 dest = dest.parentElement;
9155 } while (dest);
9156 return false;
9157 }
9158 var useCompositeHover = createHook(
9159 function useCompositeHover2({
9160 store,
9161 focusOnHover = true,
9162 blurOnHoverEnd = !!focusOnHover,
9163 ...props
9164 }) {
9165 const context = useCompositeContext();
9166 store = store || context;
9167 invariant(
9168 store,
9169 "CompositeHover must be wrapped in a Composite component."
9170 );
9171 const isMouseMoving = useIsMouseMoving();
9172 const onMouseMoveProp = props.onMouseMove;
9173 const focusOnHoverProp = useBooleanEvent(focusOnHover);
9174 const onMouseMove = useEvent((event) => {
9175 onMouseMoveProp == null ? void 0 : onMouseMoveProp(event);
9176 if (event.defaultPrevented) return;
9177 if (!isMouseMoving()) return;
9178 if (!focusOnHoverProp(event)) return;
9179 if (!hasFocusWithin(event.currentTarget)) {
9180 const baseElement = store == null ? void 0 : store.getState().baseElement;
9181 if (baseElement && !hasFocus(baseElement)) {
9182 baseElement.focus();
9183 }
9184 }
9185 store == null ? void 0 : store.setActiveId(event.currentTarget.id);
9186 });
9187 const onMouseLeaveProp = props.onMouseLeave;
9188 const blurOnHoverEndProp = useBooleanEvent(blurOnHoverEnd);
9189 const onMouseLeave = useEvent((event) => {
9190 var _a;
9191 onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event);
9192 if (event.defaultPrevented) return;
9193 if (!isMouseMoving()) return;
9194 if (hoveringInside(event)) return;
9195 if (movingToAnotherItem(event)) return;
9196 if (!focusOnHoverProp(event)) return;
9197 if (!blurOnHoverEndProp(event)) return;
9198 store == null ? void 0 : store.setActiveId(null);
9199 (_a = store == null ? void 0 : store.getState().baseElement) == null ? void 0 : _a.focus();
9200 });
9201 const ref = (0, import_react16.useCallback)((element) => {
9202 if (!element) return;
9203 element[symbol2] = true;
9204 }, []);
9205 props = {
9206 ...props,
9207 ref: useMergeRefs(ref, props.ref),
9208 onMouseMove,
9209 onMouseLeave
9210 };
9211 return removeUndefinedValues(props);
9212 }
9213 );
9214 var CompositeHover = memo22(
9215 forwardRef22(function CompositeHover2(props) {
9216 const htmlProps = useCompositeHover(props);
9217 return createElement3(TagName8, htmlProps);
9218 })
9219 );
9220
9221 // node_modules/@ariakit/react-core/esm/combobox/combobox.js
9222 var import_react17 = __toESM(require_react(), 1);
9223 var TagName9 = "input";
9224 function isFirstItemAutoSelected(items, activeValue, autoSelect) {
9225 if (!autoSelect) return false;
9226 const firstItem = items.find((item) => !item.disabled && item.value);
9227 return (firstItem == null ? void 0 : firstItem.value) === activeValue;
9228 }
9229 function hasCompletionString(value, activeValue) {
9230 if (!activeValue) return false;
9231 if (value == null) return false;
9232 value = normalizeString(value);
9233 return activeValue.length > value.length && activeValue.toLowerCase().indexOf(value.toLowerCase()) === 0;
9234 }
9235 function isInputEvent(event) {
9236 return event.type === "input";
9237 }
9238 function isAriaAutoCompleteValue(value) {
9239 return value === "inline" || value === "list" || value === "both" || value === "none";
9240 }
9241 function getDefaultAutoSelectId(items) {
9242 const item = items.find((item2) => {
9243 var _a;
9244 if (item2.disabled) return false;
9245 return ((_a = item2.element) == null ? void 0 : _a.getAttribute("role")) !== "tab";
9246 });
9247 return item == null ? void 0 : item.id;
9248 }
9249 var useCombobox = createHook(
9250 function useCombobox2({
9251 store,
9252 focusable = true,
9253 autoSelect: autoSelectProp = false,
9254 getAutoSelectId,
9255 setValueOnChange,
9256 showMinLength = 0,
9257 showOnChange,
9258 showOnMouseDown,
9259 showOnClick = showOnMouseDown,
9260 showOnKeyDown,
9261 showOnKeyPress = showOnKeyDown,
9262 blurActiveItemOnClick,
9263 setValueOnClick = true,
9264 moveOnKeyPress = true,
9265 autoComplete = "list",
9266 ...props
9267 }) {
9268 const context = useComboboxProviderContext();
9269 store = store || context;
9270 invariant(
9271 store,
9272 "Combobox must receive a `store` prop or be wrapped in a ComboboxProvider component."
9273 );
9274 const ref = (0, import_react17.useRef)(null);
9275 const [valueUpdated, forceValueUpdate] = useForceUpdate();
9276 const canAutoSelectRef = (0, import_react17.useRef)(false);
9277 const composingRef = (0, import_react17.useRef)(false);
9278 const autoSelect = store.useState(
9279 (state) => state.virtualFocus && autoSelectProp
9280 );
9281 const inline = autoComplete === "inline" || autoComplete === "both";
9282 const [canInline, setCanInline] = (0, import_react17.useState)(inline);
9283 useUpdateLayoutEffect(() => {
9284 if (!inline) return;
9285 setCanInline(true);
9286 }, [inline]);
9287 const storeValue = store.useState("value");
9288 const prevSelectedValueRef = (0, import_react17.useRef)(void 0);
9289 (0, import_react17.useEffect)(() => {
9290 return sync(store, ["selectedValue", "activeId"], (_, prev) => {
9291 prevSelectedValueRef.current = prev.selectedValue;
9292 });
9293 }, []);
9294 const inlineActiveValue = store.useState((state) => {
9295 var _a;
9296 if (!inline) return;
9297 if (!canInline) return;
9298 if (state.activeValue && Array.isArray(state.selectedValue)) {
9299 if (state.selectedValue.includes(state.activeValue)) return;
9300 if ((_a = prevSelectedValueRef.current) == null ? void 0 : _a.includes(state.activeValue)) return;
9301 }
9302 return state.activeValue;
9303 });
9304 const items = store.useState("renderedItems");
9305 const open = store.useState("open");
9306 const contentElement = store.useState("contentElement");
9307 const value = (0, import_react17.useMemo)(() => {
9308 if (!inline) return storeValue;
9309 if (!canInline) return storeValue;
9310 const firstItemAutoSelected = isFirstItemAutoSelected(
9311 items,
9312 inlineActiveValue,
9313 autoSelect
9314 );
9315 if (firstItemAutoSelected) {
9316 if (hasCompletionString(storeValue, inlineActiveValue)) {
9317 const slice = (inlineActiveValue == null ? void 0 : inlineActiveValue.slice(storeValue.length)) || "";
9318 return storeValue + slice;
9319 }
9320 return storeValue;
9321 }
9322 return inlineActiveValue || storeValue;
9323 }, [inline, canInline, items, inlineActiveValue, autoSelect, storeValue]);
9324 (0, import_react17.useEffect)(() => {
9325 const element = ref.current;
9326 if (!element) return;
9327 const onCompositeItemMove = () => setCanInline(true);
9328 element.addEventListener("combobox-item-move", onCompositeItemMove);
9329 return () => {
9330 element.removeEventListener("combobox-item-move", onCompositeItemMove);
9331 };
9332 }, []);
9333 (0, import_react17.useEffect)(() => {
9334 if (!inline) return;
9335 if (!canInline) return;
9336 if (!inlineActiveValue) return;
9337 const firstItemAutoSelected = isFirstItemAutoSelected(
9338 items,
9339 inlineActiveValue,
9340 autoSelect
9341 );
9342 if (!firstItemAutoSelected) return;
9343 if (!hasCompletionString(storeValue, inlineActiveValue)) return;
9344 let cleanup = noop;
9345 queueMicrotask(() => {
9346 const element = ref.current;
9347 if (!element) return;
9348 const { start: prevStart, end: prevEnd } = getTextboxSelection(element);
9349 const nextStart = storeValue.length;
9350 const nextEnd = inlineActiveValue.length;
9351 setSelectionRange(element, nextStart, nextEnd);
9352 cleanup = () => {
9353 if (!hasFocus(element)) return;
9354 const { start, end } = getTextboxSelection(element);
9355 if (start !== nextStart) return;
9356 if (end !== nextEnd) return;
9357 setSelectionRange(element, prevStart, prevEnd);
9358 };
9359 });
9360 return () => cleanup();
9361 }, [
9362 valueUpdated,
9363 inline,
9364 canInline,
9365 inlineActiveValue,
9366 items,
9367 autoSelect,
9368 storeValue
9369 ]);
9370 const scrollingElementRef = (0, import_react17.useRef)(null);
9371 const getAutoSelectIdProp = useEvent(getAutoSelectId);
9372 const autoSelectIdRef = (0, import_react17.useRef)(null);
9373 (0, import_react17.useEffect)(() => {
9374 if (!open) return;
9375 if (!contentElement) return;
9376 const scrollingElement = getScrollingElement(contentElement);
9377 if (!scrollingElement) return;
9378 scrollingElementRef.current = scrollingElement;
9379 const onUserScroll = () => {
9380 canAutoSelectRef.current = false;
9381 };
9382 const onScroll = () => {
9383 if (!store) return;
9384 if (!canAutoSelectRef.current) return;
9385 const { activeId } = store.getState();
9386 if (activeId === null) return;
9387 if (activeId === autoSelectIdRef.current) return;
9388 canAutoSelectRef.current = false;
9389 };
9390 const options = { passive: true, capture: true };
9391 scrollingElement.addEventListener("wheel", onUserScroll, options);
9392 scrollingElement.addEventListener("touchmove", onUserScroll, options);
9393 scrollingElement.addEventListener("scroll", onScroll, options);
9394 return () => {
9395 scrollingElement.removeEventListener("wheel", onUserScroll, true);
9396 scrollingElement.removeEventListener("touchmove", onUserScroll, true);
9397 scrollingElement.removeEventListener("scroll", onScroll, true);
9398 };
9399 }, [open, contentElement, store]);
9400 useSafeLayoutEffect(() => {
9401 if (!storeValue) return;
9402 if (composingRef.current) return;
9403 canAutoSelectRef.current = true;
9404 }, [storeValue]);
9405 useSafeLayoutEffect(() => {
9406 if (autoSelect !== "always" && open) return;
9407 canAutoSelectRef.current = open;
9408 }, [autoSelect, open]);
9409 const resetValueOnSelect = store.useState("resetValueOnSelect");
9410 useUpdateEffect(() => {
9411 var _a, _b;
9412 const canAutoSelect = canAutoSelectRef.current;
9413 if (!store) return;
9414 if (!open) return;
9415 if (!canAutoSelect && !resetValueOnSelect) return;
9416 const { baseElement, contentElement: contentElement2, activeId } = store.getState();
9417 if (baseElement && !hasFocus(baseElement)) return;
9418 if (contentElement2 == null ? void 0 : contentElement2.hasAttribute("data-placing")) {
9419 const observer = new MutationObserver(forceValueUpdate);
9420 observer.observe(contentElement2, { attributeFilter: ["data-placing"] });
9421 return () => observer.disconnect();
9422 }
9423 if (autoSelect && canAutoSelect) {
9424 const userAutoSelectId = getAutoSelectIdProp(items);
9425 const autoSelectId = userAutoSelectId !== void 0 ? userAutoSelectId : (_a = getDefaultAutoSelectId(items)) != null ? _a : store.first();
9426 autoSelectIdRef.current = autoSelectId;
9427 store.move(autoSelectId != null ? autoSelectId : null);
9428 } else {
9429 const element = (_b = store.item(activeId || store.first())) == null ? void 0 : _b.element;
9430 if (element && "scrollIntoView" in element) {
9431 element.scrollIntoView({ block: "nearest", inline: "nearest" });
9432 }
9433 }
9434 return;
9435 }, [
9436 store,
9437 open,
9438 valueUpdated,
9439 storeValue,
9440 autoSelect,
9441 resetValueOnSelect,
9442 getAutoSelectIdProp,
9443 items
9444 ]);
9445 (0, import_react17.useEffect)(() => {
9446 if (!inline) return;
9447 const combobox = ref.current;
9448 if (!combobox) return;
9449 const elements = [combobox, contentElement].filter(
9450 (value2) => !!value2
9451 );
9452 const onBlur2 = (event) => {
9453 if (elements.every((el) => isFocusEventOutside(event, el))) {
9454 store == null ? void 0 : store.setValue(value);
9455 }
9456 };
9457 for (const element of elements) {
9458 element.addEventListener("focusout", onBlur2);
9459 }
9460 return () => {
9461 for (const element of elements) {
9462 element.removeEventListener("focusout", onBlur2);
9463 }
9464 };
9465 }, [inline, contentElement, store, value]);
9466 const canShow = (event) => {
9467 const currentTarget = event.currentTarget;
9468 return currentTarget.value.length >= showMinLength;
9469 };
9470 const onChangeProp = props.onChange;
9471 const showOnChangeProp = useBooleanEvent(showOnChange != null ? showOnChange : canShow);
9472 const setValueOnChangeProp = useBooleanEvent(
9473 // If the combobox is combined with tags, the value will be set by the tag
9474 // input component.
9475 setValueOnChange != null ? setValueOnChange : !store.tag
9476 );
9477 const onChange = useEvent((event) => {
9478 onChangeProp == null ? void 0 : onChangeProp(event);
9479 if (event.defaultPrevented) return;
9480 if (!store) return;
9481 const currentTarget = event.currentTarget;
9482 const { value: value2, selectionStart, selectionEnd } = currentTarget;
9483 const nativeEvent = event.nativeEvent;
9484 canAutoSelectRef.current = true;
9485 if (isInputEvent(nativeEvent)) {
9486 if (nativeEvent.isComposing) {
9487 canAutoSelectRef.current = false;
9488 composingRef.current = true;
9489 }
9490 if (inline) {
9491 const textInserted = nativeEvent.inputType === "insertText" || nativeEvent.inputType === "insertCompositionText";
9492 const caretAtEnd = selectionStart === value2.length;
9493 setCanInline(textInserted && caretAtEnd);
9494 }
9495 }
9496 if (setValueOnChangeProp(event)) {
9497 const isSameValue = value2 === store.getState().value;
9498 store.setValue(value2);
9499 queueMicrotask(() => {
9500 setSelectionRange(currentTarget, selectionStart, selectionEnd);
9501 });
9502 if (inline && autoSelect && isSameValue) {
9503 forceValueUpdate();
9504 }
9505 }
9506 if (showOnChangeProp(event)) {
9507 store.show();
9508 }
9509 if (!autoSelect || !canAutoSelectRef.current) {
9510 store.setActiveId(null);
9511 }
9512 });
9513 const onCompositionEndProp = props.onCompositionEnd;
9514 const onCompositionEnd = useEvent((event) => {
9515 canAutoSelectRef.current = true;
9516 composingRef.current = false;
9517 onCompositionEndProp == null ? void 0 : onCompositionEndProp(event);
9518 if (event.defaultPrevented) return;
9519 if (!autoSelect) return;
9520 forceValueUpdate();
9521 });
9522 const onMouseDownProp = props.onMouseDown;
9523 const blurActiveItemOnClickProp = useBooleanEvent(
9524 blurActiveItemOnClick != null ? blurActiveItemOnClick : (() => !!(store == null ? void 0 : store.getState().includesBaseElement))
9525 );
9526 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
9527 const showOnClickProp = useBooleanEvent(showOnClick != null ? showOnClick : canShow);
9528 const onMouseDown = useEvent((event) => {
9529 onMouseDownProp == null ? void 0 : onMouseDownProp(event);
9530 if (event.defaultPrevented) return;
9531 if (event.button) return;
9532 if (event.ctrlKey) return;
9533 if (!store) return;
9534 if (blurActiveItemOnClickProp(event)) {
9535 store.setActiveId(null);
9536 }
9537 if (setValueOnClickProp(event)) {
9538 store.setValue(value);
9539 }
9540 if (showOnClickProp(event)) {
9541 queueBeforeEvent(event.currentTarget, "mouseup", store.show);
9542 }
9543 });
9544 const onKeyDownProp = props.onKeyDown;
9545 const showOnKeyPressProp = useBooleanEvent(showOnKeyPress != null ? showOnKeyPress : canShow);
9546 const onKeyDown = useEvent((event) => {
9547 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
9548 if (!event.repeat) {
9549 canAutoSelectRef.current = false;
9550 }
9551 if (event.defaultPrevented) return;
9552 if (event.ctrlKey) return;
9553 if (event.altKey) return;
9554 if (event.shiftKey) return;
9555 if (event.metaKey) return;
9556 if (!store) return;
9557 const { open: open2 } = store.getState();
9558 if (open2) return;
9559 if (event.key === "ArrowUp" || event.key === "ArrowDown") {
9560 if (showOnKeyPressProp(event)) {
9561 event.preventDefault();
9562 store.show();
9563 }
9564 }
9565 });
9566 const onBlurProp = props.onBlur;
9567 const onBlur = useEvent((event) => {
9568 canAutoSelectRef.current = false;
9569 onBlurProp == null ? void 0 : onBlurProp(event);
9570 if (event.defaultPrevented) return;
9571 });
9572 const id = useId3(props.id);
9573 const ariaAutoComplete = isAriaAutoCompleteValue(autoComplete) ? autoComplete : void 0;
9574 const isActiveItem = store.useState((state) => state.activeId === null);
9575 props = {
9576 id,
9577 role: "combobox",
9578 "aria-autocomplete": ariaAutoComplete,
9579 "aria-haspopup": getPopupRole(contentElement, "listbox"),
9580 "aria-expanded": open,
9581 "aria-controls": contentElement == null ? void 0 : contentElement.id,
9582 "data-active-item": isActiveItem || void 0,
9583 value,
9584 ...props,
9585 ref: useMergeRefs(ref, props.ref),
9586 onChange,
9587 onCompositionEnd,
9588 onMouseDown,
9589 onKeyDown,
9590 onBlur
9591 };
9592 props = useComposite({
9593 store,
9594 focusable,
9595 ...props,
9596 // Enable inline autocomplete when the user moves from the combobox input
9597 // to an item.
9598 moveOnKeyPress: (event) => {
9599 if (isFalsyBooleanCallback(moveOnKeyPress, event)) return false;
9600 if (inline) setCanInline(true);
9601 return true;
9602 }
9603 });
9604 props = usePopoverAnchor({ store, ...props });
9605 return { autoComplete: "off", ...props };
9606 }
9607 );
9608 var Combobox = forwardRef22(function Combobox2(props) {
9609 const htmlProps = useCombobox(props);
9610 return createElement3(TagName9, htmlProps);
9611 });
9612
9613 // node_modules/@ariakit/react-core/esm/__chunks/IBXZ2LQC.js
9614 var import_react18 = __toESM(require_react(), 1);
9615 var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1);
9616 var TagName10 = "div";
9617 function isSelected(storeValue, itemValue) {
9618 if (itemValue == null) return;
9619 if (storeValue == null) return false;
9620 if (Array.isArray(storeValue)) {
9621 return storeValue.includes(itemValue);
9622 }
9623 return storeValue === itemValue;
9624 }
9625 function getItemRole(popupRole) {
9626 var _a;
9627 const itemRoleByPopupRole = {
9628 menu: "menuitem",
9629 listbox: "option",
9630 tree: "treeitem"
9631 };
9632 const key = popupRole;
9633 return (_a = itemRoleByPopupRole[key]) != null ? _a : "option";
9634 }
9635 var useComboboxItem = createHook(
9636 function useComboboxItem2({
9637 store,
9638 value,
9639 hideOnClick,
9640 setValueOnClick,
9641 selectValueOnClick = true,
9642 resetValueOnSelect,
9643 focusOnHover = false,
9644 moveOnKeyPress = true,
9645 getItem: getItemProp,
9646 ...props
9647 }) {
9648 var _a;
9649 const context = useComboboxScopedContext();
9650 store = store || context;
9651 invariant(
9652 store,
9653 "ComboboxItem must be wrapped in a ComboboxList or ComboboxPopover component."
9654 );
9655 const { resetValueOnSelectState, multiSelectable, selected } = useStoreStateObject(store, {
9656 resetValueOnSelectState: "resetValueOnSelect",
9657 multiSelectable(state) {
9658 return Array.isArray(state.selectedValue);
9659 },
9660 selected(state) {
9661 return isSelected(state.selectedValue, value);
9662 }
9663 });
9664 const getItem = (0, import_react18.useCallback)(
9665 (item) => {
9666 const nextItem = { ...item, value };
9667 if (getItemProp) {
9668 return getItemProp(nextItem);
9669 }
9670 return nextItem;
9671 },
9672 [value, getItemProp]
9673 );
9674 setValueOnClick = setValueOnClick != null ? setValueOnClick : !multiSelectable;
9675 hideOnClick = hideOnClick != null ? hideOnClick : value != null && !multiSelectable;
9676 const onClickProp = props.onClick;
9677 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
9678 const selectValueOnClickProp = useBooleanEvent(selectValueOnClick);
9679 const resetValueOnSelectProp = useBooleanEvent(
9680 (_a = resetValueOnSelect != null ? resetValueOnSelect : resetValueOnSelectState) != null ? _a : multiSelectable
9681 );
9682 const hideOnClickProp = useBooleanEvent(hideOnClick);
9683 const onClick = useEvent((event) => {
9684 onClickProp == null ? void 0 : onClickProp(event);
9685 if (event.defaultPrevented) return;
9686 if (isDownloading(event)) return;
9687 if (isOpeningInNewTab(event)) return;
9688 if (value != null) {
9689 if (selectValueOnClickProp(event)) {
9690 if (resetValueOnSelectProp(event)) {
9691 store == null ? void 0 : store.resetValue();
9692 }
9693 store == null ? void 0 : store.setSelectedValue((prevValue) => {
9694 if (!Array.isArray(prevValue)) return value;
9695 if (prevValue.includes(value)) {
9696 return prevValue.filter((v2) => v2 !== value);
9697 }
9698 return [...prevValue, value];
9699 });
9700 }
9701 if (setValueOnClickProp(event)) {
9702 store == null ? void 0 : store.setValue(value);
9703 }
9704 }
9705 if (hideOnClickProp(event)) {
9706 store == null ? void 0 : store.hide();
9707 }
9708 });
9709 const onKeyDownProp = props.onKeyDown;
9710 const onKeyDown = useEvent((event) => {
9711 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
9712 if (event.defaultPrevented) return;
9713 const baseElement = store == null ? void 0 : store.getState().baseElement;
9714 if (!baseElement) return;
9715 if (hasFocus(baseElement)) return;
9716 const printable = event.key.length === 1;
9717 if (printable || event.key === "Backspace" || event.key === "Delete") {
9718 queueMicrotask(() => baseElement.focus());
9719 if (isTextField(baseElement)) {
9720 store == null ? void 0 : store.setValue(baseElement.value);
9721 }
9722 }
9723 });
9724 if (multiSelectable && selected != null) {
9725 props = {
9726 "aria-selected": selected,
9727 ...props
9728 };
9729 }
9730 props = useWrapElement(
9731 props,
9732 (element) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ComboboxItemValueContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ComboboxItemCheckedContext.Provider, { value: selected != null ? selected : false, children: element }) }),
9733 [value, selected]
9734 );
9735 const popupRole = (0, import_react18.useContext)(ComboboxListRoleContext);
9736 props = {
9737 role: getItemRole(popupRole),
9738 children: value,
9739 ...props,
9740 onClick,
9741 onKeyDown
9742 };
9743 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
9744 props = useCompositeItem({
9745 store,
9746 ...props,
9747 getItem,
9748 // Dispatch a custom event on the combobox input when moving to an item
9749 // with the keyboard so the Combobox component can enable inline
9750 // autocompletion.
9751 moveOnKeyPress: (event) => {
9752 if (!moveOnKeyPressProp(event)) return false;
9753 const moveEvent = new Event("combobox-item-move");
9754 const baseElement = store == null ? void 0 : store.getState().baseElement;
9755 baseElement == null ? void 0 : baseElement.dispatchEvent(moveEvent);
9756 return true;
9757 }
9758 });
9759 props = useCompositeHover({ store, focusOnHover, ...props });
9760 return props;
9761 }
9762 );
9763 var ComboboxItem = memo22(
9764 forwardRef22(function ComboboxItem2(props) {
9765 const htmlProps = useComboboxItem(props);
9766 return createElement3(TagName10, htmlProps);
9767 })
9768 );
9769
9770 // node_modules/@ariakit/react-core/esm/combobox/combobox-item-value.js
9771 var import_react19 = __toESM(require_react(), 1);
9772 var import_jsx_runtime52 = __toESM(require_jsx_runtime(), 1);
9773 var TagName11 = "span";
9774 function normalizeValue(value) {
9775 return normalizeString(value).toLowerCase();
9776 }
9777 function getOffsets(string, values) {
9778 const offsets = [];
9779 for (const value of values) {
9780 let pos = 0;
9781 const length = value.length;
9782 while (string.indexOf(value, pos) !== -1) {
9783 const index = string.indexOf(value, pos);
9784 if (index !== -1) {
9785 offsets.push([index, length]);
9786 }
9787 pos = index + 1;
9788 }
9789 }
9790 return offsets;
9791 }
9792 function filterOverlappingOffsets(offsets) {
9793 return offsets.filter(([offset, length], i2, arr) => {
9794 return !arr.some(
9795 ([o2, l2], j2) => j2 !== i2 && o2 <= offset && o2 + l2 >= offset + length
9796 );
9797 });
9798 }
9799 function sortOffsets(offsets) {
9800 return offsets.sort(([a2], [b2]) => a2 - b2);
9801 }
9802 function splitValue(itemValue, userValue) {
9803 if (!itemValue) return itemValue;
9804 if (!userValue) return itemValue;
9805 const userValues = toArray(userValue).filter(Boolean).map(normalizeValue);
9806 const parts = [];
9807 const span = (value, autocomplete = false) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
9808 "span",
9809 {
9810 "data-autocomplete-value": autocomplete ? "" : void 0,
9811 "data-user-value": autocomplete ? void 0 : "",
9812 children: value
9813 },
9814 parts.length
9815 );
9816 const offsets = sortOffsets(
9817 filterOverlappingOffsets(
9818 // Convert userValues into a set to avoid duplicates
9819 getOffsets(normalizeValue(itemValue), new Set(userValues))
9820 )
9821 );
9822 if (!offsets.length) {
9823 parts.push(span(itemValue, true));
9824 return parts;
9825 }
9826 const [firstOffset] = offsets[0];
9827 const values = [
9828 itemValue.slice(0, firstOffset),
9829 ...offsets.flatMap(([offset, length], i2) => {
9830 var _a;
9831 const value = itemValue.slice(offset, offset + length);
9832 const nextOffset = (_a = offsets[i2 + 1]) == null ? void 0 : _a[0];
9833 const nextValue = itemValue.slice(offset + length, nextOffset);
9834 return [value, nextValue];
9835 })
9836 ];
9837 values.forEach((value, i2) => {
9838 if (!value) return;
9839 parts.push(span(value, i2 % 2 === 0));
9840 });
9841 return parts;
9842 }
9843 var useComboboxItemValue = createHook(function useComboboxItemValue2({ store, value, userValue, ...props }) {
9844 const context = useComboboxScopedContext();
9845 store = store || context;
9846 const itemContext = (0, import_react19.useContext)(ComboboxItemValueContext);
9847 const itemValue = value != null ? value : itemContext;
9848 const inputValue = useStoreState(store, (state) => userValue != null ? userValue : state == null ? void 0 : state.value);
9849 const children = (0, import_react19.useMemo)(() => {
9850 if (!itemValue) return;
9851 if (!inputValue) return itemValue;
9852 return splitValue(itemValue, inputValue);
9853 }, [itemValue, inputValue]);
9854 props = {
9855 children,
9856 ...props
9857 };
9858 return removeUndefinedValues(props);
9859 });
9860 var ComboboxItemValue = forwardRef22(function ComboboxItemValue2(props) {
9861 const htmlProps = useComboboxItemValue(props);
9862 return createElement3(TagName11, htmlProps);
9863 });
9864
9865 // node_modules/@ariakit/react-core/esm/combobox/combobox-label.js
9866 var TagName12 = "label";
9867 var useComboboxLabel = createHook(
9868 function useComboboxLabel2({ store, ...props }) {
9869 const context = useComboboxProviderContext();
9870 store = store || context;
9871 invariant(
9872 store,
9873 "ComboboxLabel must receive a `store` prop or be wrapped in a ComboboxProvider component."
9874 );
9875 const comboboxId = store.useState((state) => {
9876 var _a;
9877 return (_a = state.baseElement) == null ? void 0 : _a.id;
9878 });
9879 props = {
9880 htmlFor: comboboxId,
9881 ...props
9882 };
9883 return removeUndefinedValues(props);
9884 }
9885 );
9886 var ComboboxLabel = memo22(
9887 forwardRef22(function ComboboxLabel2(props) {
9888 const htmlProps = useComboboxLabel(props);
9889 return createElement3(TagName12, htmlProps);
9890 })
9891 );
9892
9893 // node_modules/@ariakit/react-core/esm/__chunks/2G6YEJT4.js
9894 var import_react20 = __toESM(require_react(), 1);
9895 var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1);
9896 var TagName13 = "div";
9897 var useComboboxList = createHook(
9898 function useComboboxList2({ store, alwaysVisible, ...props }) {
9899 const scopedContext = useComboboxScopedContext(true);
9900 const context = useComboboxContext();
9901 store = store || context;
9902 const scopedContextSameStore = !!store && store === scopedContext;
9903 invariant(
9904 store,
9905 "ComboboxList must receive a `store` prop or be wrapped in a ComboboxProvider component."
9906 );
9907 const ref = (0, import_react20.useRef)(null);
9908 const id = useId3(props.id);
9909 const mounted = store.useState("mounted");
9910 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
9911 const style = hidden ? { ...props.style, display: "none" } : props.style;
9912 const multiSelectable = store.useState(
9913 (state) => Array.isArray(state.selectedValue)
9914 );
9915 const role = useAttribute(ref, "role", props.role);
9916 const isCompositeRole = role === "listbox" || role === "tree" || role === "grid";
9917 const ariaMultiSelectable = isCompositeRole ? multiSelectable || void 0 : void 0;
9918 const [hasListboxInside, setHasListboxInside] = (0, import_react20.useState)(false);
9919 const contentElement = store.useState("contentElement");
9920 useSafeLayoutEffect(() => {
9921 if (!mounted) return;
9922 const element = ref.current;
9923 if (!element) return;
9924 if (contentElement !== element) return;
9925 const callback = () => {
9926 setHasListboxInside(!!element.querySelector("[role='listbox']"));
9927 };
9928 const observer = new MutationObserver(callback);
9929 observer.observe(element, {
9930 subtree: true,
9931 childList: true,
9932 attributeFilter: ["role"]
9933 });
9934 callback();
9935 return () => observer.disconnect();
9936 }, [mounted, contentElement]);
9937 if (!hasListboxInside) {
9938 props = {
9939 role: "listbox",
9940 "aria-multiselectable": ariaMultiSelectable,
9941 ...props
9942 };
9943 }
9944 props = useWrapElement(
9945 props,
9946 (element) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ComboboxScopedContextProvider, { value: store, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ComboboxListRoleContext.Provider, { value: role, children: element }) }),
9947 [store, role]
9948 );
9949 const setContentElement = id && (!scopedContext || !scopedContextSameStore) ? store.setContentElement : null;
9950 props = {
9951 id,
9952 hidden,
9953 ...props,
9954 ref: useMergeRefs(setContentElement, ref, props.ref),
9955 style
9956 };
9957 return removeUndefinedValues(props);
9958 }
9959 );
9960 var ComboboxList = forwardRef22(function ComboboxList2(props) {
9961 const htmlProps = useComboboxList(props);
9962 return createElement3(TagName13, htmlProps);
9963 });
9964
9965 // node_modules/@ariakit/react-core/esm/__chunks/XSIEPKGA.js
9966 var import_react21 = __toESM(require_react(), 1);
9967 var TagValueContext = (0, import_react21.createContext)(null);
9968 var TagRemoveIdContext = (0, import_react21.createContext)(
9969 null
9970 );
9971 var ctx7 = createStoreContext(
9972 [CompositeContextProvider],
9973 [CompositeScopedContextProvider]
9974 );
9975 var useTagContext = ctx7.useContext;
9976 var useTagScopedContext = ctx7.useScopedContext;
9977 var useTagProviderContext = ctx7.useProviderContext;
9978 var TagContextProvider = ctx7.ContextProvider;
9979 var TagScopedContextProvider = ctx7.ScopedContextProvider;
9980
9981 // node_modules/@ariakit/core/esm/combobox/combobox-store.js
9982 var isTouchSafari = isSafari() && isTouchDevice();
9983 function createComboboxStore({
9984 tag,
9985 ...props
9986 } = {}) {
9987 const store = mergeStore(props.store, pick2(tag, ["value", "rtl"]));
9988 throwOnConflictingProps(props, store);
9989 const tagState = tag == null ? void 0 : tag.getState();
9990 const syncState = store == null ? void 0 : store.getState();
9991 const activeId = defaultValue(
9992 props.activeId,
9993 syncState == null ? void 0 : syncState.activeId,
9994 props.defaultActiveId,
9995 null
9996 );
9997 const composite = createCompositeStore({
9998 ...props,
9999 activeId,
10000 includesBaseElement: defaultValue(
10001 props.includesBaseElement,
10002 syncState == null ? void 0 : syncState.includesBaseElement,
10003 true
10004 ),
10005 orientation: defaultValue(
10006 props.orientation,
10007 syncState == null ? void 0 : syncState.orientation,
10008 "vertical"
10009 ),
10010 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true),
10011 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, true),
10012 virtualFocus: defaultValue(
10013 props.virtualFocus,
10014 syncState == null ? void 0 : syncState.virtualFocus,
10015 true
10016 )
10017 });
10018 const popover = createPopoverStore({
10019 ...props,
10020 placement: defaultValue(
10021 props.placement,
10022 syncState == null ? void 0 : syncState.placement,
10023 "bottom-start"
10024 )
10025 });
10026 const value = defaultValue(
10027 props.value,
10028 syncState == null ? void 0 : syncState.value,
10029 props.defaultValue,
10030 ""
10031 );
10032 const selectedValue = defaultValue(
10033 props.selectedValue,
10034 syncState == null ? void 0 : syncState.selectedValue,
10035 tagState == null ? void 0 : tagState.values,
10036 props.defaultSelectedValue,
10037 ""
10038 );
10039 const multiSelectable = Array.isArray(selectedValue);
10040 const initialState = {
10041 ...composite.getState(),
10042 ...popover.getState(),
10043 value,
10044 selectedValue,
10045 resetValueOnSelect: defaultValue(
10046 props.resetValueOnSelect,
10047 syncState == null ? void 0 : syncState.resetValueOnSelect,
10048 multiSelectable
10049 ),
10050 resetValueOnHide: defaultValue(
10051 props.resetValueOnHide,
10052 syncState == null ? void 0 : syncState.resetValueOnHide,
10053 multiSelectable && !tag
10054 ),
10055 activeValue: syncState == null ? void 0 : syncState.activeValue
10056 };
10057 const combobox = createStore(initialState, composite, popover, store);
10058 if (isTouchSafari) {
10059 setup(
10060 combobox,
10061 () => sync(combobox, ["virtualFocus"], () => {
10062 combobox.setState("virtualFocus", false);
10063 })
10064 );
10065 }
10066 setup(combobox, () => {
10067 if (!tag) return;
10068 return chain(
10069 sync(combobox, ["selectedValue"], (state) => {
10070 if (!Array.isArray(state.selectedValue)) return;
10071 tag.setValues(state.selectedValue);
10072 }),
10073 sync(tag, ["values"], (state) => {
10074 combobox.setState("selectedValue", state.values);
10075 })
10076 );
10077 });
10078 setup(
10079 combobox,
10080 () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => {
10081 if (!state.resetValueOnHide) return;
10082 if (state.mounted) return;
10083 combobox.setState("value", value);
10084 })
10085 );
10086 setup(
10087 combobox,
10088 () => sync(combobox, ["open"], (state) => {
10089 if (state.open) return;
10090 combobox.setState("activeId", activeId);
10091 combobox.setState("moves", 0);
10092 })
10093 );
10094 setup(
10095 combobox,
10096 () => sync(combobox, ["moves", "activeId"], (state, prevState) => {
10097 if (state.moves === prevState.moves) {
10098 combobox.setState("activeValue", void 0);
10099 }
10100 })
10101 );
10102 setup(
10103 combobox,
10104 () => batch(combobox, ["moves", "renderedItems"], (state, prev) => {
10105 if (state.moves === prev.moves) return;
10106 const { activeId: activeId2 } = combobox.getState();
10107 const activeItem = composite.item(activeId2);
10108 combobox.setState("activeValue", activeItem == null ? void 0 : activeItem.value);
10109 })
10110 );
10111 return {
10112 ...popover,
10113 ...composite,
10114 ...combobox,
10115 tag,
10116 setValue: (value2) => combobox.setState("value", value2),
10117 resetValue: () => combobox.setState("value", initialState.value),
10118 setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2)
10119 };
10120 }
10121
10122 // node_modules/@ariakit/react-core/esm/__chunks/SVN33SY6.js
10123 function useComboboxStoreOptions(props) {
10124 const tag = useTagContext();
10125 props = {
10126 ...props,
10127 tag: props.tag !== void 0 ? props.tag : tag
10128 };
10129 return useCompositeStoreOptions(props);
10130 }
10131 function useComboboxStoreProps(store, update2, props) {
10132 useUpdateEffect(update2, [props.tag]);
10133 useStoreProps(store, props, "value", "setValue");
10134 useStoreProps(store, props, "selectedValue", "setSelectedValue");
10135 useStoreProps(store, props, "resetValueOnHide");
10136 useStoreProps(store, props, "resetValueOnSelect");
10137 return Object.assign(
10138 useCompositeStoreProps(
10139 usePopoverStoreProps(store, update2, props),
10140 update2,
10141 props
10142 ),
10143 { tag: props.tag }
10144 );
10145 }
10146 function useComboboxStore(props = {}) {
10147 props = useComboboxStoreOptions(props);
10148 const [store, update2] = useStore(createComboboxStore, props);
10149 return useComboboxStoreProps(store, update2, props);
10150 }
10151
10152 // node_modules/@ariakit/react-core/esm/combobox/combobox-provider.js
10153 var import_jsx_runtime54 = __toESM(require_jsx_runtime(), 1);
10154 function ComboboxProvider(props = {}) {
10155 const store = useComboboxStore(props);
10156 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ComboboxContextProvider, { value: store, children: props.children });
10157 }
10158
10159 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
10160 var import_remove_accents = __toESM(require_remove_accents(), 1);
10161 var import_compose7 = __toESM(require_compose(), 1);
10162 var import_i18n22 = __toESM(require_i18n(), 1);
10163 var import_element26 = __toESM(require_element(), 1);
10164 var import_components19 = __toESM(require_components(), 1);
10165
10166 // packages/dataviews/build-module/components/dataviews-filters/utils.mjs
10167 var EMPTY_ARRAY3 = [];
10168 var getCurrentValue = (filterDefinition, currentFilter) => {
10169 if (filterDefinition.singleSelection) {
10170 return currentFilter?.value;
10171 }
10172 if (Array.isArray(currentFilter?.value)) {
10173 return currentFilter.value;
10174 }
10175 if (!Array.isArray(currentFilter?.value) && !!currentFilter?.value) {
10176 return [currentFilter.value];
10177 }
10178 return EMPTY_ARRAY3;
10179 };
10180
10181 // packages/dataviews/build-module/hooks/use-elements.mjs
10182 var import_element25 = __toESM(require_element(), 1);
10183 var EMPTY_ARRAY4 = [];
10184 function useElements({
10185 elements,
10186 getElements
10187 }) {
10188 const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY4;
10189 const [records, setRecords] = (0, import_element25.useState)(staticElements);
10190 const [isLoading, setIsLoading] = (0, import_element25.useState)(false);
10191 (0, import_element25.useEffect)(() => {
10192 if (!getElements) {
10193 setRecords(staticElements);
10194 return;
10195 }
10196 let cancelled = false;
10197 setIsLoading(true);
10198 getElements().then((fetchedElements) => {
10199 if (!cancelled) {
10200 const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements;
10201 setRecords(dynamicElements);
10202 }
10203 }).catch(() => {
10204 if (!cancelled) {
10205 setRecords(staticElements);
10206 }
10207 }).finally(() => {
10208 if (!cancelled) {
10209 setIsLoading(false);
10210 }
10211 });
10212 return () => {
10213 cancelled = true;
10214 };
10215 }, [getElements, staticElements]);
10216 return {
10217 elements: records,
10218 isLoading
10219 };
10220 }
10221
10222 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
10223 var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1);
10224 function normalizeSearchInput(input = "") {
10225 return (0, import_remove_accents.default)(input.trim().toLowerCase());
10226 }
10227 var getNewValue = (filterDefinition, currentFilter, value) => {
10228 if (filterDefinition.singleSelection) {
10229 return value;
10230 }
10231 if (Array.isArray(currentFilter?.value)) {
10232 return currentFilter.value.includes(value) ? currentFilter.value.filter((v2) => v2 !== value) : [...currentFilter.value, value];
10233 }
10234 return [value];
10235 };
10236 function generateFilterElementCompositeItemId(prefix, filterElementValue) {
10237 return `${prefix}-${filterElementValue}`;
10238 }
10239 var MultiSelectionOption = ({ selected }) => {
10240 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10241 "span",
10242 {
10243 className: clsx_default(
10244 "dataviews-filters__search-widget-listitem-multi-selection",
10245 { "is-selected": selected }
10246 ),
10247 children: selected && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components19.Icon, { icon: check_default })
10248 }
10249 );
10250 };
10251 var SingleSelectionOption = ({ selected }) => {
10252 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10253 "span",
10254 {
10255 className: clsx_default(
10256 "dataviews-filters__search-widget-listitem-single-selection",
10257 { "is-selected": selected }
10258 )
10259 }
10260 );
10261 };
10262 function ListBox({ view, filter, onChangeView }) {
10263 const baseId = (0, import_compose7.useInstanceId)(ListBox, "dataviews-filter-list-box");
10264 const [activeCompositeId, setActiveCompositeId] = (0, import_element26.useState)(
10265 // When there are one or less operators, the first item is set as active
10266 // (by setting the initial `activeId` to `undefined`).
10267 // With 2 or more operators, the focus is moved on the operators control
10268 // (by setting the initial `activeId` to `null`), meaning that there won't
10269 // be an active item initially. Focus is then managed via the
10270 // `onFocusVisible` callback.
10271 filter.operators?.length === 1 ? void 0 : null
10272 );
10273 const currentFilter = view.filters?.find(
10274 (f2) => f2.field === filter.field
10275 );
10276 const currentValue = getCurrentValue(filter, currentFilter);
10277 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10278 import_components19.Composite,
10279 {
10280 virtualFocus: true,
10281 focusLoop: true,
10282 activeId: activeCompositeId,
10283 setActiveId: setActiveCompositeId,
10284 role: "listbox",
10285 className: "dataviews-filters__search-widget-listbox",
10286 "aria-label": (0, import_i18n22.sprintf)(
10287 /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */
10288 (0, import_i18n22.__)("List of: %1$s"),
10289 filter.name
10290 ),
10291 onFocusVisible: () => {
10292 if (!activeCompositeId && filter.elements.length) {
10293 setActiveCompositeId(
10294 generateFilterElementCompositeItemId(
10295 baseId,
10296 filter.elements[0].value
10297 )
10298 );
10299 }
10300 },
10301 render: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components19.Composite.Typeahead, {}),
10302 children: filter.elements.map((element) => /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
10303 import_components19.Composite.Hover,
10304 {
10305 render: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10306 import_components19.Composite.Item,
10307 {
10308 id: generateFilterElementCompositeItemId(
10309 baseId,
10310 element.value
10311 ),
10312 render: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10313 "div",
10314 {
10315 "aria-label": element.label,
10316 role: "option",
10317 className: "dataviews-filters__search-widget-listitem"
10318 }
10319 ),
10320 onClick: () => {
10321 const newFilters = currentFilter ? [
10322 ...(view.filters ?? []).map(
10323 (_filter) => {
10324 if (_filter.field === filter.field) {
10325 return {
10326 ..._filter,
10327 operator: currentFilter.operator || filter.operators[0],
10328 value: getNewValue(
10329 filter,
10330 currentFilter,
10331 element.value
10332 )
10333 };
10334 }
10335 return _filter;
10336 }
10337 )
10338 ] : [
10339 ...view.filters ?? [],
10340 {
10341 field: filter.field,
10342 operator: filter.operators[0],
10343 value: getNewValue(
10344 filter,
10345 currentFilter,
10346 element.value
10347 )
10348 }
10349 ];
10350 onChangeView({
10351 ...view,
10352 page: 1,
10353 filters: newFilters
10354 });
10355 }
10356 }
10357 ),
10358 children: [
10359 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10360 SingleSelectionOption,
10361 {
10362 selected: currentValue === element.value
10363 }
10364 ),
10365 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10366 MultiSelectionOption,
10367 {
10368 selected: currentValue.includes(element.value)
10369 }
10370 ),
10371 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10372 "span",
10373 {
10374 className: "dataviews-filters__search-widget-listitem-value",
10375 title: element.label,
10376 children: element.label
10377 }
10378 )
10379 ]
10380 },
10381 element.value
10382 ))
10383 }
10384 );
10385 }
10386 function ComboboxList22({ view, filter, onChangeView }) {
10387 const [searchValue, setSearchValue] = (0, import_element26.useState)("");
10388 const deferredSearchValue = (0, import_element26.useDeferredValue)(searchValue);
10389 const currentFilter = view.filters?.find(
10390 (_filter) => _filter.field === filter.field
10391 );
10392 const currentValue = getCurrentValue(filter, currentFilter);
10393 const matches = (0, import_element26.useMemo)(() => {
10394 const normalizedSearch = normalizeSearchInput(deferredSearchValue);
10395 return filter.elements.filter(
10396 (item) => normalizeSearchInput(item.label).includes(normalizedSearch)
10397 );
10398 }, [filter.elements, deferredSearchValue]);
10399 return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
10400 ComboboxProvider,
10401 {
10402 selectedValue: currentValue,
10403 setSelectedValue: (value) => {
10404 const newFilters = currentFilter ? [
10405 ...(view.filters ?? []).map((_filter) => {
10406 if (_filter.field === filter.field) {
10407 return {
10408 ..._filter,
10409 operator: currentFilter.operator || filter.operators[0],
10410 value
10411 };
10412 }
10413 return _filter;
10414 })
10415 ] : [
10416 ...view.filters ?? [],
10417 {
10418 field: filter.field,
10419 operator: filter.operators[0],
10420 value
10421 }
10422 ];
10423 onChangeView({
10424 ...view,
10425 page: 1,
10426 filters: newFilters
10427 });
10428 },
10429 setValue: setSearchValue,
10430 children: [
10431 /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "dataviews-filters__search-widget-filter-combobox__wrapper", children: [
10432 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10433 ComboboxLabel,
10434 {
10435 render: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components19.VisuallyHidden, { children: (0, import_i18n22.__)("Search items") }),
10436 children: (0, import_i18n22.__)("Search items")
10437 }
10438 ),
10439 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10440 Combobox,
10441 {
10442 autoSelect: "always",
10443 placeholder: (0, import_i18n22.__)("Search"),
10444 className: "dataviews-filters__search-widget-filter-combobox__input"
10445 }
10446 ),
10447 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "dataviews-filters__search-widget-filter-combobox__icon", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components19.Icon, { icon: search_default }) })
10448 ] }),
10449 /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
10450 ComboboxList,
10451 {
10452 className: "dataviews-filters__search-widget-filter-combobox-list",
10453 alwaysVisible: true,
10454 children: [
10455 matches.map((element) => {
10456 return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
10457 ComboboxItem,
10458 {
10459 resetValueOnSelect: false,
10460 value: element.value,
10461 className: "dataviews-filters__search-widget-listitem",
10462 hideOnClick: false,
10463 setValueOnClick: false,
10464 focusOnHover: true,
10465 children: [
10466 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10467 SingleSelectionOption,
10468 {
10469 selected: currentValue === element.value
10470 }
10471 ),
10472 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10473 MultiSelectionOption,
10474 {
10475 selected: currentValue.includes(
10476 element.value
10477 )
10478 }
10479 ),
10480 /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
10481 "span",
10482 {
10483 className: "dataviews-filters__search-widget-listitem-value",
10484 title: element.label,
10485 children: [
10486 /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10487 ComboboxItemValue,
10488 {
10489 className: "dataviews-filters__search-widget-filter-combobox-item-value",
10490 value: element.label
10491 }
10492 ),
10493 !!element.description && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "dataviews-filters__search-widget-listitem-description", children: element.description })
10494 ]
10495 }
10496 )
10497 ]
10498 },
10499 element.value
10500 );
10501 }),
10502 !matches.length && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { children: (0, import_i18n22.__)("No results found") })
10503 ]
10504 }
10505 )
10506 ]
10507 }
10508 );
10509 }
10510 function SearchWidget(props) {
10511 const { elements, isLoading } = useElements({
10512 elements: props.filter.elements,
10513 getElements: props.filter.getElements
10514 });
10515 if (isLoading) {
10516 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_components19.Spinner, {}) });
10517 }
10518 if (elements.length === 0) {
10519 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: (0, import_i18n22.__)("No elements found") });
10520 }
10521 const Widget = elements.length > 10 ? ComboboxList22 : ListBox;
10522 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Widget, { ...props, filter: { ...props.filter, elements } });
10523 }
10524
10525 // packages/dataviews/build-module/components/dataviews-filters/input-widget.mjs
10526 var import_es6 = __toESM(require_es6(), 1);
10527 var import_compose8 = __toESM(require_compose(), 1);
10528 var import_element27 = __toESM(require_element(), 1);
10529 var import_components20 = __toESM(require_components(), 1);
10530 var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1);
10531 function InputWidget({
10532 filter,
10533 view,
10534 onChangeView,
10535 fields
10536 }) {
10537 const currentFilter = view.filters?.find(
10538 (f2) => f2.field === filter.field
10539 );
10540 const currentValue = getCurrentValue(filter, currentFilter);
10541 const field = (0, import_element27.useMemo)(() => {
10542 const currentField = fields.find((f2) => f2.id === filter.field);
10543 if (currentField) {
10544 return {
10545 ...currentField,
10546 // Deactivate validation for filters.
10547 isValid: {},
10548 // Filter controls are always enabled.
10549 isDisabled: () => false,
10550 // Filter controls are always visible.
10551 isVisible: () => true,
10552 // Configure getValue/setValue as if Item was a plain object.
10553 getValue: ({ item }) => item[currentField.id],
10554 setValue: ({ value }) => ({
10555 [currentField.id]: value
10556 })
10557 };
10558 }
10559 return currentField;
10560 }, [fields, filter.field]);
10561 const data = (0, import_element27.useMemo)(() => {
10562 return (view.filters ?? []).reduce(
10563 (acc, activeFilter) => {
10564 acc[activeFilter.field] = activeFilter.value;
10565 return acc;
10566 },
10567 {}
10568 );
10569 }, [view.filters]);
10570 const handleChange = (0, import_compose8.useEvent)((updatedData) => {
10571 if (!field || !currentFilter) {
10572 return;
10573 }
10574 const nextValue = field.getValue({ item: updatedData });
10575 if ((0, import_es6.default)(nextValue, currentValue)) {
10576 return;
10577 }
10578 onChangeView({
10579 ...view,
10580 filters: (view.filters ?? []).map(
10581 (_filter) => _filter.field === filter.field ? {
10582 ..._filter,
10583 operator: currentFilter.operator || filter.operators[0],
10584 // Consider empty strings as undefined:
10585 //
10586 // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records
10587 // - empty string as value means "search empty string": returns only the records that have an empty string as value
10588 //
10589 // In practice, this means the filter will not be able to find an empty string as the value.
10590 value: nextValue === "" ? void 0 : nextValue
10591 } : _filter
10592 )
10593 });
10594 });
10595 if (!field || !field.Edit || !currentFilter) {
10596 return null;
10597 }
10598 return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
10599 import_components20.Flex,
10600 {
10601 className: "dataviews-filters__user-input-widget",
10602 gap: 2.5,
10603 direction: "column",
10604 children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
10605 field.Edit,
10606 {
10607 hideLabelFromVision: true,
10608 data,
10609 field,
10610 operator: currentFilter.operator,
10611 onChange: handleChange
10612 }
10613 )
10614 }
10615 );
10616 }
10617
10618 // packages/dataviews/node_modules/date-fns/constants.js
10619 var daysInYear = 365.2425;
10620 var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3;
10621 var minTime = -maxTime;
10622 var millisecondsInWeek = 6048e5;
10623 var millisecondsInDay = 864e5;
10624 var secondsInHour = 3600;
10625 var secondsInDay = secondsInHour * 24;
10626 var secondsInWeek = secondsInDay * 7;
10627 var secondsInYear = secondsInDay * daysInYear;
10628 var secondsInMonth = secondsInYear / 12;
10629 var secondsInQuarter = secondsInMonth * 3;
10630 var constructFromSymbol = /* @__PURE__ */ Symbol.for("constructDateFrom");
10631
10632 // packages/dataviews/node_modules/date-fns/constructFrom.js
10633 function constructFrom(date, value) {
10634 if (typeof date === "function") return date(value);
10635 if (date && typeof date === "object" && constructFromSymbol in date)
10636 return date[constructFromSymbol](value);
10637 if (date instanceof Date) return new date.constructor(value);
10638 return new Date(value);
10639 }
10640
10641 // packages/dataviews/node_modules/date-fns/toDate.js
10642 function toDate(argument, context) {
10643 return constructFrom(context || argument, argument);
10644 }
10645
10646 // packages/dataviews/node_modules/date-fns/addDays.js
10647 function addDays(date, amount, options) {
10648 const _date = toDate(date, options?.in);
10649 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
10650 if (!amount) return _date;
10651 _date.setDate(_date.getDate() + amount);
10652 return _date;
10653 }
10654
10655 // packages/dataviews/node_modules/date-fns/addMonths.js
10656 function addMonths(date, amount, options) {
10657 const _date = toDate(date, options?.in);
10658 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
10659 if (!amount) {
10660 return _date;
10661 }
10662 const dayOfMonth = _date.getDate();
10663 const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());
10664 endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
10665 const daysInMonth = endOfDesiredMonth.getDate();
10666 if (dayOfMonth >= daysInMonth) {
10667 return endOfDesiredMonth;
10668 } else {
10669 _date.setFullYear(
10670 endOfDesiredMonth.getFullYear(),
10671 endOfDesiredMonth.getMonth(),
10672 dayOfMonth
10673 );
10674 return _date;
10675 }
10676 }
10677
10678 // packages/dataviews/node_modules/date-fns/_lib/defaultOptions.js
10679 var defaultOptions = {};
10680 function getDefaultOptions() {
10681 return defaultOptions;
10682 }
10683
10684 // packages/dataviews/node_modules/date-fns/startOfWeek.js
10685 function startOfWeek(date, options) {
10686 const defaultOptions2 = getDefaultOptions();
10687 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
10688 const _date = toDate(date, options?.in);
10689 const day = _date.getDay();
10690 const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
10691 _date.setDate(_date.getDate() - diff);
10692 _date.setHours(0, 0, 0, 0);
10693 return _date;
10694 }
10695
10696 // packages/dataviews/node_modules/date-fns/startOfISOWeek.js
10697 function startOfISOWeek(date, options) {
10698 return startOfWeek(date, { ...options, weekStartsOn: 1 });
10699 }
10700
10701 // packages/dataviews/node_modules/date-fns/getISOWeekYear.js
10702 function getISOWeekYear(date, options) {
10703 const _date = toDate(date, options?.in);
10704 const year = _date.getFullYear();
10705 const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);
10706 fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
10707 fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
10708 const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
10709 const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);
10710 fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
10711 fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
10712 const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
10713 if (_date.getTime() >= startOfNextYear.getTime()) {
10714 return year + 1;
10715 } else if (_date.getTime() >= startOfThisYear.getTime()) {
10716 return year;
10717 } else {
10718 return year - 1;
10719 }
10720 }
10721
10722 // packages/dataviews/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js
10723 function getTimezoneOffsetInMilliseconds(date) {
10724 const _date = toDate(date);
10725 const utcDate = new Date(
10726 Date.UTC(
10727 _date.getFullYear(),
10728 _date.getMonth(),
10729 _date.getDate(),
10730 _date.getHours(),
10731 _date.getMinutes(),
10732 _date.getSeconds(),
10733 _date.getMilliseconds()
10734 )
10735 );
10736 utcDate.setUTCFullYear(_date.getFullYear());
10737 return +date - +utcDate;
10738 }
10739
10740 // packages/dataviews/node_modules/date-fns/_lib/normalizeDates.js
10741 function normalizeDates(context, ...dates) {
10742 const normalize = constructFrom.bind(
10743 null,
10744 context || dates.find((date) => typeof date === "object")
10745 );
10746 return dates.map(normalize);
10747 }
10748
10749 // packages/dataviews/node_modules/date-fns/startOfDay.js
10750 function startOfDay(date, options) {
10751 const _date = toDate(date, options?.in);
10752 _date.setHours(0, 0, 0, 0);
10753 return _date;
10754 }
10755
10756 // packages/dataviews/node_modules/date-fns/differenceInCalendarDays.js
10757 function differenceInCalendarDays(laterDate, earlierDate, options) {
10758 const [laterDate_, earlierDate_] = normalizeDates(
10759 options?.in,
10760 laterDate,
10761 earlierDate
10762 );
10763 const laterStartOfDay = startOfDay(laterDate_);
10764 const earlierStartOfDay = startOfDay(earlierDate_);
10765 const laterTimestamp = +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);
10766 const earlierTimestamp = +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);
10767 return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);
10768 }
10769
10770 // packages/dataviews/node_modules/date-fns/startOfISOWeekYear.js
10771 function startOfISOWeekYear(date, options) {
10772 const year = getISOWeekYear(date, options);
10773 const fourthOfJanuary = constructFrom(options?.in || date, 0);
10774 fourthOfJanuary.setFullYear(year, 0, 4);
10775 fourthOfJanuary.setHours(0, 0, 0, 0);
10776 return startOfISOWeek(fourthOfJanuary);
10777 }
10778
10779 // packages/dataviews/node_modules/date-fns/addWeeks.js
10780 function addWeeks(date, amount, options) {
10781 return addDays(date, amount * 7, options);
10782 }
10783
10784 // packages/dataviews/node_modules/date-fns/addYears.js
10785 function addYears(date, amount, options) {
10786 return addMonths(date, amount * 12, options);
10787 }
10788
10789 // packages/dataviews/node_modules/date-fns/isDate.js
10790 function isDate(value) {
10791 return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
10792 }
10793
10794 // packages/dataviews/node_modules/date-fns/isValid.js
10795 function isValid(date) {
10796 return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date)));
10797 }
10798
10799 // packages/dataviews/node_modules/date-fns/startOfMonth.js
10800 function startOfMonth(date, options) {
10801 const _date = toDate(date, options?.in);
10802 _date.setDate(1);
10803 _date.setHours(0, 0, 0, 0);
10804 return _date;
10805 }
10806
10807 // packages/dataviews/node_modules/date-fns/startOfYear.js
10808 function startOfYear(date, options) {
10809 const date_ = toDate(date, options?.in);
10810 date_.setFullYear(date_.getFullYear(), 0, 1);
10811 date_.setHours(0, 0, 0, 0);
10812 return date_;
10813 }
10814
10815 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatDistance.js
10816 var formatDistanceLocale = {
10817 lessThanXSeconds: {
10818 one: "less than a second",
10819 other: "less than {{count}} seconds"
10820 },
10821 xSeconds: {
10822 one: "1 second",
10823 other: "{{count}} seconds"
10824 },
10825 halfAMinute: "half a minute",
10826 lessThanXMinutes: {
10827 one: "less than a minute",
10828 other: "less than {{count}} minutes"
10829 },
10830 xMinutes: {
10831 one: "1 minute",
10832 other: "{{count}} minutes"
10833 },
10834 aboutXHours: {
10835 one: "about 1 hour",
10836 other: "about {{count}} hours"
10837 },
10838 xHours: {
10839 one: "1 hour",
10840 other: "{{count}} hours"
10841 },
10842 xDays: {
10843 one: "1 day",
10844 other: "{{count}} days"
10845 },
10846 aboutXWeeks: {
10847 one: "about 1 week",
10848 other: "about {{count}} weeks"
10849 },
10850 xWeeks: {
10851 one: "1 week",
10852 other: "{{count}} weeks"
10853 },
10854 aboutXMonths: {
10855 one: "about 1 month",
10856 other: "about {{count}} months"
10857 },
10858 xMonths: {
10859 one: "1 month",
10860 other: "{{count}} months"
10861 },
10862 aboutXYears: {
10863 one: "about 1 year",
10864 other: "about {{count}} years"
10865 },
10866 xYears: {
10867 one: "1 year",
10868 other: "{{count}} years"
10869 },
10870 overXYears: {
10871 one: "over 1 year",
10872 other: "over {{count}} years"
10873 },
10874 almostXYears: {
10875 one: "almost 1 year",
10876 other: "almost {{count}} years"
10877 }
10878 };
10879 var formatDistance = (token, count, options) => {
10880 let result;
10881 const tokenValue = formatDistanceLocale[token];
10882 if (typeof tokenValue === "string") {
10883 result = tokenValue;
10884 } else if (count === 1) {
10885 result = tokenValue.one;
10886 } else {
10887 result = tokenValue.other.replace("{{count}}", count.toString());
10888 }
10889 if (options?.addSuffix) {
10890 if (options.comparison && options.comparison > 0) {
10891 return "in " + result;
10892 } else {
10893 return result + " ago";
10894 }
10895 }
10896 return result;
10897 };
10898
10899 // packages/dataviews/node_modules/date-fns/locale/_lib/buildFormatLongFn.js
10900 function buildFormatLongFn(args) {
10901 return (options = {}) => {
10902 const width = options.width ? String(options.width) : args.defaultWidth;
10903 const format6 = args.formats[width] || args.formats[args.defaultWidth];
10904 return format6;
10905 };
10906 }
10907
10908 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatLong.js
10909 var dateFormats = {
10910 full: "EEEE, MMMM do, y",
10911 long: "MMMM do, y",
10912 medium: "MMM d, y",
10913 short: "MM/dd/yyyy"
10914 };
10915 var timeFormats = {
10916 full: "h:mm:ss a zzzz",
10917 long: "h:mm:ss a z",
10918 medium: "h:mm:ss a",
10919 short: "h:mm a"
10920 };
10921 var dateTimeFormats = {
10922 full: "{{date}} 'at' {{time}}",
10923 long: "{{date}} 'at' {{time}}",
10924 medium: "{{date}}, {{time}}",
10925 short: "{{date}}, {{time}}"
10926 };
10927 var formatLong = {
10928 date: buildFormatLongFn({
10929 formats: dateFormats,
10930 defaultWidth: "full"
10931 }),
10932 time: buildFormatLongFn({
10933 formats: timeFormats,
10934 defaultWidth: "full"
10935 }),
10936 dateTime: buildFormatLongFn({
10937 formats: dateTimeFormats,
10938 defaultWidth: "full"
10939 })
10940 };
10941
10942 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatRelative.js
10943 var formatRelativeLocale = {
10944 lastWeek: "'last' eeee 'at' p",
10945 yesterday: "'yesterday at' p",
10946 today: "'today at' p",
10947 tomorrow: "'tomorrow at' p",
10948 nextWeek: "eeee 'at' p",
10949 other: "P"
10950 };
10951 var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
10952
10953 // packages/dataviews/node_modules/date-fns/locale/_lib/buildLocalizeFn.js
10954 function buildLocalizeFn(args) {
10955 return (value, options) => {
10956 const context = options?.context ? String(options.context) : "standalone";
10957 let valuesArray;
10958 if (context === "formatting" && args.formattingValues) {
10959 const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
10960 const width = options?.width ? String(options.width) : defaultWidth;
10961 valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
10962 } else {
10963 const defaultWidth = args.defaultWidth;
10964 const width = options?.width ? String(options.width) : args.defaultWidth;
10965 valuesArray = args.values[width] || args.values[defaultWidth];
10966 }
10967 const index = args.argumentCallback ? args.argumentCallback(value) : value;
10968 return valuesArray[index];
10969 };
10970 }
10971
10972 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/localize.js
10973 var eraValues = {
10974 narrow: ["B", "A"],
10975 abbreviated: ["BC", "AD"],
10976 wide: ["Before Christ", "Anno Domini"]
10977 };
10978 var quarterValues = {
10979 narrow: ["1", "2", "3", "4"],
10980 abbreviated: ["Q1", "Q2", "Q3", "Q4"],
10981 wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
10982 };
10983 var monthValues = {
10984 narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
10985 abbreviated: [
10986 "Jan",
10987 "Feb",
10988 "Mar",
10989 "Apr",
10990 "May",
10991 "Jun",
10992 "Jul",
10993 "Aug",
10994 "Sep",
10995 "Oct",
10996 "Nov",
10997 "Dec"
10998 ],
10999 wide: [
11000 "January",
11001 "February",
11002 "March",
11003 "April",
11004 "May",
11005 "June",
11006 "July",
11007 "August",
11008 "September",
11009 "October",
11010 "November",
11011 "December"
11012 ]
11013 };
11014 var dayValues = {
11015 narrow: ["S", "M", "T", "W", "T", "F", "S"],
11016 short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
11017 abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
11018 wide: [
11019 "Sunday",
11020 "Monday",
11021 "Tuesday",
11022 "Wednesday",
11023 "Thursday",
11024 "Friday",
11025 "Saturday"
11026 ]
11027 };
11028 var dayPeriodValues = {
11029 narrow: {
11030 am: "a",
11031 pm: "p",
11032 midnight: "mi",
11033 noon: "n",
11034 morning: "morning",
11035 afternoon: "afternoon",
11036 evening: "evening",
11037 night: "night"
11038 },
11039 abbreviated: {
11040 am: "AM",
11041 pm: "PM",
11042 midnight: "midnight",
11043 noon: "noon",
11044 morning: "morning",
11045 afternoon: "afternoon",
11046 evening: "evening",
11047 night: "night"
11048 },
11049 wide: {
11050 am: "a.m.",
11051 pm: "p.m.",
11052 midnight: "midnight",
11053 noon: "noon",
11054 morning: "morning",
11055 afternoon: "afternoon",
11056 evening: "evening",
11057 night: "night"
11058 }
11059 };
11060 var formattingDayPeriodValues = {
11061 narrow: {
11062 am: "a",
11063 pm: "p",
11064 midnight: "mi",
11065 noon: "n",
11066 morning: "in the morning",
11067 afternoon: "in the afternoon",
11068 evening: "in the evening",
11069 night: "at night"
11070 },
11071 abbreviated: {
11072 am: "AM",
11073 pm: "PM",
11074 midnight: "midnight",
11075 noon: "noon",
11076 morning: "in the morning",
11077 afternoon: "in the afternoon",
11078 evening: "in the evening",
11079 night: "at night"
11080 },
11081 wide: {
11082 am: "a.m.",
11083 pm: "p.m.",
11084 midnight: "midnight",
11085 noon: "noon",
11086 morning: "in the morning",
11087 afternoon: "in the afternoon",
11088 evening: "in the evening",
11089 night: "at night"
11090 }
11091 };
11092 var ordinalNumber = (dirtyNumber, _options) => {
11093 const number = Number(dirtyNumber);
11094 const rem100 = number % 100;
11095 if (rem100 > 20 || rem100 < 10) {
11096 switch (rem100 % 10) {
11097 case 1:
11098 return number + "st";
11099 case 2:
11100 return number + "nd";
11101 case 3:
11102 return number + "rd";
11103 }
11104 }
11105 return number + "th";
11106 };
11107 var localize = {
11108 ordinalNumber,
11109 era: buildLocalizeFn({
11110 values: eraValues,
11111 defaultWidth: "wide"
11112 }),
11113 quarter: buildLocalizeFn({
11114 values: quarterValues,
11115 defaultWidth: "wide",
11116 argumentCallback: (quarter) => quarter - 1
11117 }),
11118 month: buildLocalizeFn({
11119 values: monthValues,
11120 defaultWidth: "wide"
11121 }),
11122 day: buildLocalizeFn({
11123 values: dayValues,
11124 defaultWidth: "wide"
11125 }),
11126 dayPeriod: buildLocalizeFn({
11127 values: dayPeriodValues,
11128 defaultWidth: "wide",
11129 formattingValues: formattingDayPeriodValues,
11130 defaultFormattingWidth: "wide"
11131 })
11132 };
11133
11134 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchFn.js
11135 function buildMatchFn(args) {
11136 return (string, options = {}) => {
11137 const width = options.width;
11138 const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
11139 const matchResult = string.match(matchPattern);
11140 if (!matchResult) {
11141 return null;
11142 }
11143 const matchedString = matchResult[0];
11144 const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
11145 const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : (
11146 // [TODO] -- I challenge you to fix the type
11147 findKey(parsePatterns, (pattern) => pattern.test(matchedString))
11148 );
11149 let value;
11150 value = args.valueCallback ? args.valueCallback(key) : key;
11151 value = options.valueCallback ? (
11152 // [TODO] -- I challenge you to fix the type
11153 options.valueCallback(value)
11154 ) : value;
11155 const rest = string.slice(matchedString.length);
11156 return { value, rest };
11157 };
11158 }
11159 function findKey(object, predicate) {
11160 for (const key in object) {
11161 if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) {
11162 return key;
11163 }
11164 }
11165 return void 0;
11166 }
11167 function findIndex(array, predicate) {
11168 for (let key = 0; key < array.length; key++) {
11169 if (predicate(array[key])) {
11170 return key;
11171 }
11172 }
11173 return void 0;
11174 }
11175
11176 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
11177 function buildMatchPatternFn(args) {
11178 return (string, options = {}) => {
11179 const matchResult = string.match(args.matchPattern);
11180 if (!matchResult) return null;
11181 const matchedString = matchResult[0];
11182 const parseResult = string.match(args.parsePattern);
11183 if (!parseResult) return null;
11184 let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
11185 value = options.valueCallback ? options.valueCallback(value) : value;
11186 const rest = string.slice(matchedString.length);
11187 return { value, rest };
11188 };
11189 }
11190
11191 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/match.js
11192 var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
11193 var parseOrdinalNumberPattern = /\d+/i;
11194 var matchEraPatterns = {
11195 narrow: /^(b|a)/i,
11196 abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
11197 wide: /^(before christ|before common era|anno domini|common era)/i
11198 };
11199 var parseEraPatterns = {
11200 any: [/^b/i, /^(a|c)/i]
11201 };
11202 var matchQuarterPatterns = {
11203 narrow: /^[1234]/i,
11204 abbreviated: /^q[1234]/i,
11205 wide: /^[1234](th|st|nd|rd)? quarter/i
11206 };
11207 var parseQuarterPatterns = {
11208 any: [/1/i, /2/i, /3/i, /4/i]
11209 };
11210 var matchMonthPatterns = {
11211 narrow: /^[jfmasond]/i,
11212 abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
11213 wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
11214 };
11215 var parseMonthPatterns = {
11216 narrow: [
11217 /^j/i,
11218 /^f/i,
11219 /^m/i,
11220 /^a/i,
11221 /^m/i,
11222 /^j/i,
11223 /^j/i,
11224 /^a/i,
11225 /^s/i,
11226 /^o/i,
11227 /^n/i,
11228 /^d/i
11229 ],
11230 any: [
11231 /^ja/i,
11232 /^f/i,
11233 /^mar/i,
11234 /^ap/i,
11235 /^may/i,
11236 /^jun/i,
11237 /^jul/i,
11238 /^au/i,
11239 /^s/i,
11240 /^o/i,
11241 /^n/i,
11242 /^d/i
11243 ]
11244 };
11245 var matchDayPatterns = {
11246 narrow: /^[smtwf]/i,
11247 short: /^(su|mo|tu|we|th|fr|sa)/i,
11248 abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
11249 wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
11250 };
11251 var parseDayPatterns = {
11252 narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
11253 any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
11254 };
11255 var matchDayPeriodPatterns = {
11256 narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
11257 any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
11258 };
11259 var parseDayPeriodPatterns = {
11260 any: {
11261 am: /^a/i,
11262 pm: /^p/i,
11263 midnight: /^mi/i,
11264 noon: /^no/i,
11265 morning: /morning/i,
11266 afternoon: /afternoon/i,
11267 evening: /evening/i,
11268 night: /night/i
11269 }
11270 };
11271 var match = {
11272 ordinalNumber: buildMatchPatternFn({
11273 matchPattern: matchOrdinalNumberPattern,
11274 parsePattern: parseOrdinalNumberPattern,
11275 valueCallback: (value) => parseInt(value, 10)
11276 }),
11277 era: buildMatchFn({
11278 matchPatterns: matchEraPatterns,
11279 defaultMatchWidth: "wide",
11280 parsePatterns: parseEraPatterns,
11281 defaultParseWidth: "any"
11282 }),
11283 quarter: buildMatchFn({
11284 matchPatterns: matchQuarterPatterns,
11285 defaultMatchWidth: "wide",
11286 parsePatterns: parseQuarterPatterns,
11287 defaultParseWidth: "any",
11288 valueCallback: (index) => index + 1
11289 }),
11290 month: buildMatchFn({
11291 matchPatterns: matchMonthPatterns,
11292 defaultMatchWidth: "wide",
11293 parsePatterns: parseMonthPatterns,
11294 defaultParseWidth: "any"
11295 }),
11296 day: buildMatchFn({
11297 matchPatterns: matchDayPatterns,
11298 defaultMatchWidth: "wide",
11299 parsePatterns: parseDayPatterns,
11300 defaultParseWidth: "any"
11301 }),
11302 dayPeriod: buildMatchFn({
11303 matchPatterns: matchDayPeriodPatterns,
11304 defaultMatchWidth: "any",
11305 parsePatterns: parseDayPeriodPatterns,
11306 defaultParseWidth: "any"
11307 })
11308 };
11309
11310 // packages/dataviews/node_modules/date-fns/locale/en-US.js
11311 var enUS = {
11312 code: "en-US",
11313 formatDistance,
11314 formatLong,
11315 formatRelative,
11316 localize,
11317 match,
11318 options: {
11319 weekStartsOn: 0,
11320 firstWeekContainsDate: 1
11321 }
11322 };
11323
11324 // packages/dataviews/node_modules/date-fns/getDayOfYear.js
11325 function getDayOfYear(date, options) {
11326 const _date = toDate(date, options?.in);
11327 const diff = differenceInCalendarDays(_date, startOfYear(_date));
11328 const dayOfYear = diff + 1;
11329 return dayOfYear;
11330 }
11331
11332 // packages/dataviews/node_modules/date-fns/getISOWeek.js
11333 function getISOWeek(date, options) {
11334 const _date = toDate(date, options?.in);
11335 const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
11336 return Math.round(diff / millisecondsInWeek) + 1;
11337 }
11338
11339 // packages/dataviews/node_modules/date-fns/getWeekYear.js
11340 function getWeekYear(date, options) {
11341 const _date = toDate(date, options?.in);
11342 const year = _date.getFullYear();
11343 const defaultOptions2 = getDefaultOptions();
11344 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
11345 const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
11346 firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
11347 firstWeekOfNextYear.setHours(0, 0, 0, 0);
11348 const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
11349 const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
11350 firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
11351 firstWeekOfThisYear.setHours(0, 0, 0, 0);
11352 const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
11353 if (+_date >= +startOfNextYear) {
11354 return year + 1;
11355 } else if (+_date >= +startOfThisYear) {
11356 return year;
11357 } else {
11358 return year - 1;
11359 }
11360 }
11361
11362 // packages/dataviews/node_modules/date-fns/startOfWeekYear.js
11363 function startOfWeekYear(date, options) {
11364 const defaultOptions2 = getDefaultOptions();
11365 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
11366 const year = getWeekYear(date, options);
11367 const firstWeek = constructFrom(options?.in || date, 0);
11368 firstWeek.setFullYear(year, 0, firstWeekContainsDate);
11369 firstWeek.setHours(0, 0, 0, 0);
11370 const _date = startOfWeek(firstWeek, options);
11371 return _date;
11372 }
11373
11374 // packages/dataviews/node_modules/date-fns/getWeek.js
11375 function getWeek(date, options) {
11376 const _date = toDate(date, options?.in);
11377 const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
11378 return Math.round(diff / millisecondsInWeek) + 1;
11379 }
11380
11381 // packages/dataviews/node_modules/date-fns/_lib/addLeadingZeros.js
11382 function addLeadingZeros(number, targetLength) {
11383 const sign = number < 0 ? "-" : "";
11384 const output = Math.abs(number).toString().padStart(targetLength, "0");
11385 return sign + output;
11386 }
11387
11388 // packages/dataviews/node_modules/date-fns/_lib/format/lightFormatters.js
11389 var lightFormatters = {
11390 // Year
11391 y(date, token) {
11392 const signedYear = date.getFullYear();
11393 const year = signedYear > 0 ? signedYear : 1 - signedYear;
11394 return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
11395 },
11396 // Month
11397 M(date, token) {
11398 const month = date.getMonth();
11399 return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
11400 },
11401 // Day of the month
11402 d(date, token) {
11403 return addLeadingZeros(date.getDate(), token.length);
11404 },
11405 // AM or PM
11406 a(date, token) {
11407 const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
11408 switch (token) {
11409 case "a":
11410 case "aa":
11411 return dayPeriodEnumValue.toUpperCase();
11412 case "aaa":
11413 return dayPeriodEnumValue;
11414 case "aaaaa":
11415 return dayPeriodEnumValue[0];
11416 case "aaaa":
11417 default:
11418 return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
11419 }
11420 },
11421 // Hour [1-12]
11422 h(date, token) {
11423 return addLeadingZeros(date.getHours() % 12 || 12, token.length);
11424 },
11425 // Hour [0-23]
11426 H(date, token) {
11427 return addLeadingZeros(date.getHours(), token.length);
11428 },
11429 // Minute
11430 m(date, token) {
11431 return addLeadingZeros(date.getMinutes(), token.length);
11432 },
11433 // Second
11434 s(date, token) {
11435 return addLeadingZeros(date.getSeconds(), token.length);
11436 },
11437 // Fraction of second
11438 S(date, token) {
11439 const numberOfDigits = token.length;
11440 const milliseconds = date.getMilliseconds();
11441 const fractionalSeconds = Math.trunc(
11442 milliseconds * Math.pow(10, numberOfDigits - 3)
11443 );
11444 return addLeadingZeros(fractionalSeconds, token.length);
11445 }
11446 };
11447
11448 // packages/dataviews/node_modules/date-fns/_lib/format/formatters.js
11449 var dayPeriodEnum = {
11450 am: "am",
11451 pm: "pm",
11452 midnight: "midnight",
11453 noon: "noon",
11454 morning: "morning",
11455 afternoon: "afternoon",
11456 evening: "evening",
11457 night: "night"
11458 };
11459 var formatters = {
11460 // Era
11461 G: function(date, token, localize2) {
11462 const era = date.getFullYear() > 0 ? 1 : 0;
11463 switch (token) {
11464 // AD, BC
11465 case "G":
11466 case "GG":
11467 case "GGG":
11468 return localize2.era(era, { width: "abbreviated" });
11469 // A, B
11470 case "GGGGG":
11471 return localize2.era(era, { width: "narrow" });
11472 // Anno Domini, Before Christ
11473 case "GGGG":
11474 default:
11475 return localize2.era(era, { width: "wide" });
11476 }
11477 },
11478 // Year
11479 y: function(date, token, localize2) {
11480 if (token === "yo") {
11481 const signedYear = date.getFullYear();
11482 const year = signedYear > 0 ? signedYear : 1 - signedYear;
11483 return localize2.ordinalNumber(year, { unit: "year" });
11484 }
11485 return lightFormatters.y(date, token);
11486 },
11487 // Local week-numbering year
11488 Y: function(date, token, localize2, options) {
11489 const signedWeekYear = getWeekYear(date, options);
11490 const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
11491 if (token === "YY") {
11492 const twoDigitYear = weekYear % 100;
11493 return addLeadingZeros(twoDigitYear, 2);
11494 }
11495 if (token === "Yo") {
11496 return localize2.ordinalNumber(weekYear, { unit: "year" });
11497 }
11498 return addLeadingZeros(weekYear, token.length);
11499 },
11500 // ISO week-numbering year
11501 R: function(date, token) {
11502 const isoWeekYear = getISOWeekYear(date);
11503 return addLeadingZeros(isoWeekYear, token.length);
11504 },
11505 // Extended year. This is a single number designating the year of this calendar system.
11506 // The main difference between `y` and `u` localizers are B.C. years:
11507 // | Year | `y` | `u` |
11508 // |------|-----|-----|
11509 // | AC 1 | 1 | 1 |
11510 // | BC 1 | 1 | 0 |
11511 // | BC 2 | 2 | -1 |
11512 // Also `yy` always returns the last two digits of a year,
11513 // while `uu` pads single digit years to 2 characters and returns other years unchanged.
11514 u: function(date, token) {
11515 const year = date.getFullYear();
11516 return addLeadingZeros(year, token.length);
11517 },
11518 // Quarter
11519 Q: function(date, token, localize2) {
11520 const quarter = Math.ceil((date.getMonth() + 1) / 3);
11521 switch (token) {
11522 // 1, 2, 3, 4
11523 case "Q":
11524 return String(quarter);
11525 // 01, 02, 03, 04
11526 case "QQ":
11527 return addLeadingZeros(quarter, 2);
11528 // 1st, 2nd, 3rd, 4th
11529 case "Qo":
11530 return localize2.ordinalNumber(quarter, { unit: "quarter" });
11531 // Q1, Q2, Q3, Q4
11532 case "QQQ":
11533 return localize2.quarter(quarter, {
11534 width: "abbreviated",
11535 context: "formatting"
11536 });
11537 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
11538 case "QQQQQ":
11539 return localize2.quarter(quarter, {
11540 width: "narrow",
11541 context: "formatting"
11542 });
11543 // 1st quarter, 2nd quarter, ...
11544 case "QQQQ":
11545 default:
11546 return localize2.quarter(quarter, {
11547 width: "wide",
11548 context: "formatting"
11549 });
11550 }
11551 },
11552 // Stand-alone quarter
11553 q: function(date, token, localize2) {
11554 const quarter = Math.ceil((date.getMonth() + 1) / 3);
11555 switch (token) {
11556 // 1, 2, 3, 4
11557 case "q":
11558 return String(quarter);
11559 // 01, 02, 03, 04
11560 case "qq":
11561 return addLeadingZeros(quarter, 2);
11562 // 1st, 2nd, 3rd, 4th
11563 case "qo":
11564 return localize2.ordinalNumber(quarter, { unit: "quarter" });
11565 // Q1, Q2, Q3, Q4
11566 case "qqq":
11567 return localize2.quarter(quarter, {
11568 width: "abbreviated",
11569 context: "standalone"
11570 });
11571 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
11572 case "qqqqq":
11573 return localize2.quarter(quarter, {
11574 width: "narrow",
11575 context: "standalone"
11576 });
11577 // 1st quarter, 2nd quarter, ...
11578 case "qqqq":
11579 default:
11580 return localize2.quarter(quarter, {
11581 width: "wide",
11582 context: "standalone"
11583 });
11584 }
11585 },
11586 // Month
11587 M: function(date, token, localize2) {
11588 const month = date.getMonth();
11589 switch (token) {
11590 case "M":
11591 case "MM":
11592 return lightFormatters.M(date, token);
11593 // 1st, 2nd, ..., 12th
11594 case "Mo":
11595 return localize2.ordinalNumber(month + 1, { unit: "month" });
11596 // Jan, Feb, ..., Dec
11597 case "MMM":
11598 return localize2.month(month, {
11599 width: "abbreviated",
11600 context: "formatting"
11601 });
11602 // J, F, ..., D
11603 case "MMMMM":
11604 return localize2.month(month, {
11605 width: "narrow",
11606 context: "formatting"
11607 });
11608 // January, February, ..., December
11609 case "MMMM":
11610 default:
11611 return localize2.month(month, { width: "wide", context: "formatting" });
11612 }
11613 },
11614 // Stand-alone month
11615 L: function(date, token, localize2) {
11616 const month = date.getMonth();
11617 switch (token) {
11618 // 1, 2, ..., 12
11619 case "L":
11620 return String(month + 1);
11621 // 01, 02, ..., 12
11622 case "LL":
11623 return addLeadingZeros(month + 1, 2);
11624 // 1st, 2nd, ..., 12th
11625 case "Lo":
11626 return localize2.ordinalNumber(month + 1, { unit: "month" });
11627 // Jan, Feb, ..., Dec
11628 case "LLL":
11629 return localize2.month(month, {
11630 width: "abbreviated",
11631 context: "standalone"
11632 });
11633 // J, F, ..., D
11634 case "LLLLL":
11635 return localize2.month(month, {
11636 width: "narrow",
11637 context: "standalone"
11638 });
11639 // January, February, ..., December
11640 case "LLLL":
11641 default:
11642 return localize2.month(month, { width: "wide", context: "standalone" });
11643 }
11644 },
11645 // Local week of year
11646 w: function(date, token, localize2, options) {
11647 const week = getWeek(date, options);
11648 if (token === "wo") {
11649 return localize2.ordinalNumber(week, { unit: "week" });
11650 }
11651 return addLeadingZeros(week, token.length);
11652 },
11653 // ISO week of year
11654 I: function(date, token, localize2) {
11655 const isoWeek = getISOWeek(date);
11656 if (token === "Io") {
11657 return localize2.ordinalNumber(isoWeek, { unit: "week" });
11658 }
11659 return addLeadingZeros(isoWeek, token.length);
11660 },
11661 // Day of the month
11662 d: function(date, token, localize2) {
11663 if (token === "do") {
11664 return localize2.ordinalNumber(date.getDate(), { unit: "date" });
11665 }
11666 return lightFormatters.d(date, token);
11667 },
11668 // Day of year
11669 D: function(date, token, localize2) {
11670 const dayOfYear = getDayOfYear(date);
11671 if (token === "Do") {
11672 return localize2.ordinalNumber(dayOfYear, { unit: "dayOfYear" });
11673 }
11674 return addLeadingZeros(dayOfYear, token.length);
11675 },
11676 // Day of week
11677 E: function(date, token, localize2) {
11678 const dayOfWeek = date.getDay();
11679 switch (token) {
11680 // Tue
11681 case "E":
11682 case "EE":
11683 case "EEE":
11684 return localize2.day(dayOfWeek, {
11685 width: "abbreviated",
11686 context: "formatting"
11687 });
11688 // T
11689 case "EEEEE":
11690 return localize2.day(dayOfWeek, {
11691 width: "narrow",
11692 context: "formatting"
11693 });
11694 // Tu
11695 case "EEEEEE":
11696 return localize2.day(dayOfWeek, {
11697 width: "short",
11698 context: "formatting"
11699 });
11700 // Tuesday
11701 case "EEEE":
11702 default:
11703 return localize2.day(dayOfWeek, {
11704 width: "wide",
11705 context: "formatting"
11706 });
11707 }
11708 },
11709 // Local day of week
11710 e: function(date, token, localize2, options) {
11711 const dayOfWeek = date.getDay();
11712 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
11713 switch (token) {
11714 // Numerical value (Nth day of week with current locale or weekStartsOn)
11715 case "e":
11716 return String(localDayOfWeek);
11717 // Padded numerical value
11718 case "ee":
11719 return addLeadingZeros(localDayOfWeek, 2);
11720 // 1st, 2nd, ..., 7th
11721 case "eo":
11722 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
11723 case "eee":
11724 return localize2.day(dayOfWeek, {
11725 width: "abbreviated",
11726 context: "formatting"
11727 });
11728 // T
11729 case "eeeee":
11730 return localize2.day(dayOfWeek, {
11731 width: "narrow",
11732 context: "formatting"
11733 });
11734 // Tu
11735 case "eeeeee":
11736 return localize2.day(dayOfWeek, {
11737 width: "short",
11738 context: "formatting"
11739 });
11740 // Tuesday
11741 case "eeee":
11742 default:
11743 return localize2.day(dayOfWeek, {
11744 width: "wide",
11745 context: "formatting"
11746 });
11747 }
11748 },
11749 // Stand-alone local day of week
11750 c: function(date, token, localize2, options) {
11751 const dayOfWeek = date.getDay();
11752 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
11753 switch (token) {
11754 // Numerical value (same as in `e`)
11755 case "c":
11756 return String(localDayOfWeek);
11757 // Padded numerical value
11758 case "cc":
11759 return addLeadingZeros(localDayOfWeek, token.length);
11760 // 1st, 2nd, ..., 7th
11761 case "co":
11762 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
11763 case "ccc":
11764 return localize2.day(dayOfWeek, {
11765 width: "abbreviated",
11766 context: "standalone"
11767 });
11768 // T
11769 case "ccccc":
11770 return localize2.day(dayOfWeek, {
11771 width: "narrow",
11772 context: "standalone"
11773 });
11774 // Tu
11775 case "cccccc":
11776 return localize2.day(dayOfWeek, {
11777 width: "short",
11778 context: "standalone"
11779 });
11780 // Tuesday
11781 case "cccc":
11782 default:
11783 return localize2.day(dayOfWeek, {
11784 width: "wide",
11785 context: "standalone"
11786 });
11787 }
11788 },
11789 // ISO day of week
11790 i: function(date, token, localize2) {
11791 const dayOfWeek = date.getDay();
11792 const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
11793 switch (token) {
11794 // 2
11795 case "i":
11796 return String(isoDayOfWeek);
11797 // 02
11798 case "ii":
11799 return addLeadingZeros(isoDayOfWeek, token.length);
11800 // 2nd
11801 case "io":
11802 return localize2.ordinalNumber(isoDayOfWeek, { unit: "day" });
11803 // Tue
11804 case "iii":
11805 return localize2.day(dayOfWeek, {
11806 width: "abbreviated",
11807 context: "formatting"
11808 });
11809 // T
11810 case "iiiii":
11811 return localize2.day(dayOfWeek, {
11812 width: "narrow",
11813 context: "formatting"
11814 });
11815 // Tu
11816 case "iiiiii":
11817 return localize2.day(dayOfWeek, {
11818 width: "short",
11819 context: "formatting"
11820 });
11821 // Tuesday
11822 case "iiii":
11823 default:
11824 return localize2.day(dayOfWeek, {
11825 width: "wide",
11826 context: "formatting"
11827 });
11828 }
11829 },
11830 // AM or PM
11831 a: function(date, token, localize2) {
11832 const hours = date.getHours();
11833 const dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
11834 switch (token) {
11835 case "a":
11836 case "aa":
11837 return localize2.dayPeriod(dayPeriodEnumValue, {
11838 width: "abbreviated",
11839 context: "formatting"
11840 });
11841 case "aaa":
11842 return localize2.dayPeriod(dayPeriodEnumValue, {
11843 width: "abbreviated",
11844 context: "formatting"
11845 }).toLowerCase();
11846 case "aaaaa":
11847 return localize2.dayPeriod(dayPeriodEnumValue, {
11848 width: "narrow",
11849 context: "formatting"
11850 });
11851 case "aaaa":
11852 default:
11853 return localize2.dayPeriod(dayPeriodEnumValue, {
11854 width: "wide",
11855 context: "formatting"
11856 });
11857 }
11858 },
11859 // AM, PM, midnight, noon
11860 b: function(date, token, localize2) {
11861 const hours = date.getHours();
11862 let dayPeriodEnumValue;
11863 if (hours === 12) {
11864 dayPeriodEnumValue = dayPeriodEnum.noon;
11865 } else if (hours === 0) {
11866 dayPeriodEnumValue = dayPeriodEnum.midnight;
11867 } else {
11868 dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
11869 }
11870 switch (token) {
11871 case "b":
11872 case "bb":
11873 return localize2.dayPeriod(dayPeriodEnumValue, {
11874 width: "abbreviated",
11875 context: "formatting"
11876 });
11877 case "bbb":
11878 return localize2.dayPeriod(dayPeriodEnumValue, {
11879 width: "abbreviated",
11880 context: "formatting"
11881 }).toLowerCase();
11882 case "bbbbb":
11883 return localize2.dayPeriod(dayPeriodEnumValue, {
11884 width: "narrow",
11885 context: "formatting"
11886 });
11887 case "bbbb":
11888 default:
11889 return localize2.dayPeriod(dayPeriodEnumValue, {
11890 width: "wide",
11891 context: "formatting"
11892 });
11893 }
11894 },
11895 // in the morning, in the afternoon, in the evening, at night
11896 B: function(date, token, localize2) {
11897 const hours = date.getHours();
11898 let dayPeriodEnumValue;
11899 if (hours >= 17) {
11900 dayPeriodEnumValue = dayPeriodEnum.evening;
11901 } else if (hours >= 12) {
11902 dayPeriodEnumValue = dayPeriodEnum.afternoon;
11903 } else if (hours >= 4) {
11904 dayPeriodEnumValue = dayPeriodEnum.morning;
11905 } else {
11906 dayPeriodEnumValue = dayPeriodEnum.night;
11907 }
11908 switch (token) {
11909 case "B":
11910 case "BB":
11911 case "BBB":
11912 return localize2.dayPeriod(dayPeriodEnumValue, {
11913 width: "abbreviated",
11914 context: "formatting"
11915 });
11916 case "BBBBB":
11917 return localize2.dayPeriod(dayPeriodEnumValue, {
11918 width: "narrow",
11919 context: "formatting"
11920 });
11921 case "BBBB":
11922 default:
11923 return localize2.dayPeriod(dayPeriodEnumValue, {
11924 width: "wide",
11925 context: "formatting"
11926 });
11927 }
11928 },
11929 // Hour [1-12]
11930 h: function(date, token, localize2) {
11931 if (token === "ho") {
11932 let hours = date.getHours() % 12;
11933 if (hours === 0) hours = 12;
11934 return localize2.ordinalNumber(hours, { unit: "hour" });
11935 }
11936 return lightFormatters.h(date, token);
11937 },
11938 // Hour [0-23]
11939 H: function(date, token, localize2) {
11940 if (token === "Ho") {
11941 return localize2.ordinalNumber(date.getHours(), { unit: "hour" });
11942 }
11943 return lightFormatters.H(date, token);
11944 },
11945 // Hour [0-11]
11946 K: function(date, token, localize2) {
11947 const hours = date.getHours() % 12;
11948 if (token === "Ko") {
11949 return localize2.ordinalNumber(hours, { unit: "hour" });
11950 }
11951 return addLeadingZeros(hours, token.length);
11952 },
11953 // Hour [1-24]
11954 k: function(date, token, localize2) {
11955 let hours = date.getHours();
11956 if (hours === 0) hours = 24;
11957 if (token === "ko") {
11958 return localize2.ordinalNumber(hours, { unit: "hour" });
11959 }
11960 return addLeadingZeros(hours, token.length);
11961 },
11962 // Minute
11963 m: function(date, token, localize2) {
11964 if (token === "mo") {
11965 return localize2.ordinalNumber(date.getMinutes(), { unit: "minute" });
11966 }
11967 return lightFormatters.m(date, token);
11968 },
11969 // Second
11970 s: function(date, token, localize2) {
11971 if (token === "so") {
11972 return localize2.ordinalNumber(date.getSeconds(), { unit: "second" });
11973 }
11974 return lightFormatters.s(date, token);
11975 },
11976 // Fraction of second
11977 S: function(date, token) {
11978 return lightFormatters.S(date, token);
11979 },
11980 // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)
11981 X: function(date, token, _localize) {
11982 const timezoneOffset = date.getTimezoneOffset();
11983 if (timezoneOffset === 0) {
11984 return "Z";
11985 }
11986 switch (token) {
11987 // Hours and optional minutes
11988 case "X":
11989 return formatTimezoneWithOptionalMinutes(timezoneOffset);
11990 // Hours, minutes and optional seconds without `:` delimiter
11991 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
11992 // so this token always has the same output as `XX`
11993 case "XXXX":
11994 case "XX":
11995 return formatTimezone(timezoneOffset);
11996 // Hours, minutes and optional seconds with `:` delimiter
11997 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
11998 // so this token always has the same output as `XXX`
11999 case "XXXXX":
12000 case "XXX":
12001 // Hours and minutes with `:` delimiter
12002 default:
12003 return formatTimezone(timezoneOffset, ":");
12004 }
12005 },
12006 // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)
12007 x: function(date, token, _localize) {
12008 const timezoneOffset = date.getTimezoneOffset();
12009 switch (token) {
12010 // Hours and optional minutes
12011 case "x":
12012 return formatTimezoneWithOptionalMinutes(timezoneOffset);
12013 // Hours, minutes and optional seconds without `:` delimiter
12014 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
12015 // so this token always has the same output as `xx`
12016 case "xxxx":
12017 case "xx":
12018 return formatTimezone(timezoneOffset);
12019 // Hours, minutes and optional seconds with `:` delimiter
12020 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
12021 // so this token always has the same output as `xxx`
12022 case "xxxxx":
12023 case "xxx":
12024 // Hours and minutes with `:` delimiter
12025 default:
12026 return formatTimezone(timezoneOffset, ":");
12027 }
12028 },
12029 // Timezone (GMT)
12030 O: function(date, token, _localize) {
12031 const timezoneOffset = date.getTimezoneOffset();
12032 switch (token) {
12033 // Short
12034 case "O":
12035 case "OO":
12036 case "OOO":
12037 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
12038 // Long
12039 case "OOOO":
12040 default:
12041 return "GMT" + formatTimezone(timezoneOffset, ":");
12042 }
12043 },
12044 // Timezone (specific non-location)
12045 z: function(date, token, _localize) {
12046 const timezoneOffset = date.getTimezoneOffset();
12047 switch (token) {
12048 // Short
12049 case "z":
12050 case "zz":
12051 case "zzz":
12052 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
12053 // Long
12054 case "zzzz":
12055 default:
12056 return "GMT" + formatTimezone(timezoneOffset, ":");
12057 }
12058 },
12059 // Seconds timestamp
12060 t: function(date, token, _localize) {
12061 const timestamp = Math.trunc(+date / 1e3);
12062 return addLeadingZeros(timestamp, token.length);
12063 },
12064 // Milliseconds timestamp
12065 T: function(date, token, _localize) {
12066 return addLeadingZeros(+date, token.length);
12067 }
12068 };
12069 function formatTimezoneShort(offset, delimiter = "") {
12070 const sign = offset > 0 ? "-" : "+";
12071 const absOffset = Math.abs(offset);
12072 const hours = Math.trunc(absOffset / 60);
12073 const minutes = absOffset % 60;
12074 if (minutes === 0) {
12075 return sign + String(hours);
12076 }
12077 return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
12078 }
12079 function formatTimezoneWithOptionalMinutes(offset, delimiter) {
12080 if (offset % 60 === 0) {
12081 const sign = offset > 0 ? "-" : "+";
12082 return sign + addLeadingZeros(Math.abs(offset) / 60, 2);
12083 }
12084 return formatTimezone(offset, delimiter);
12085 }
12086 function formatTimezone(offset, delimiter = "") {
12087 const sign = offset > 0 ? "-" : "+";
12088 const absOffset = Math.abs(offset);
12089 const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);
12090 const minutes = addLeadingZeros(absOffset % 60, 2);
12091 return sign + hours + delimiter + minutes;
12092 }
12093
12094 // packages/dataviews/node_modules/date-fns/_lib/format/longFormatters.js
12095 var dateLongFormatter = (pattern, formatLong2) => {
12096 switch (pattern) {
12097 case "P":
12098 return formatLong2.date({ width: "short" });
12099 case "PP":
12100 return formatLong2.date({ width: "medium" });
12101 case "PPP":
12102 return formatLong2.date({ width: "long" });
12103 case "PPPP":
12104 default:
12105 return formatLong2.date({ width: "full" });
12106 }
12107 };
12108 var timeLongFormatter = (pattern, formatLong2) => {
12109 switch (pattern) {
12110 case "p":
12111 return formatLong2.time({ width: "short" });
12112 case "pp":
12113 return formatLong2.time({ width: "medium" });
12114 case "ppp":
12115 return formatLong2.time({ width: "long" });
12116 case "pppp":
12117 default:
12118 return formatLong2.time({ width: "full" });
12119 }
12120 };
12121 var dateTimeLongFormatter = (pattern, formatLong2) => {
12122 const matchResult = pattern.match(/(P+)(p+)?/) || [];
12123 const datePattern = matchResult[1];
12124 const timePattern = matchResult[2];
12125 if (!timePattern) {
12126 return dateLongFormatter(pattern, formatLong2);
12127 }
12128 let dateTimeFormat;
12129 switch (datePattern) {
12130 case "P":
12131 dateTimeFormat = formatLong2.dateTime({ width: "short" });
12132 break;
12133 case "PP":
12134 dateTimeFormat = formatLong2.dateTime({ width: "medium" });
12135 break;
12136 case "PPP":
12137 dateTimeFormat = formatLong2.dateTime({ width: "long" });
12138 break;
12139 case "PPPP":
12140 default:
12141 dateTimeFormat = formatLong2.dateTime({ width: "full" });
12142 break;
12143 }
12144 return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
12145 };
12146 var longFormatters = {
12147 p: timeLongFormatter,
12148 P: dateTimeLongFormatter
12149 };
12150
12151 // packages/dataviews/node_modules/date-fns/_lib/protectedTokens.js
12152 var dayOfYearTokenRE = /^D+$/;
12153 var weekYearTokenRE = /^Y+$/;
12154 var throwTokens = ["D", "DD", "YY", "YYYY"];
12155 function isProtectedDayOfYearToken(token) {
12156 return dayOfYearTokenRE.test(token);
12157 }
12158 function isProtectedWeekYearToken(token) {
12159 return weekYearTokenRE.test(token);
12160 }
12161 function warnOrThrowProtectedError(token, format6, input) {
12162 const _message = message(token, format6, input);
12163 console.warn(_message);
12164 if (throwTokens.includes(token)) throw new RangeError(_message);
12165 }
12166 function message(token, format6, input) {
12167 const subject = token[0] === "Y" ? "years" : "days of the month";
12168 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`;
12169 }
12170
12171 // packages/dataviews/node_modules/date-fns/format.js
12172 var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
12173 var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
12174 var escapedStringRegExp = /^'([^]*?)'?$/;
12175 var doubleQuoteRegExp = /''/g;
12176 var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
12177 function format(date, formatStr, options) {
12178 const defaultOptions2 = getDefaultOptions();
12179 const locale = options?.locale ?? defaultOptions2.locale ?? enUS;
12180 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
12181 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
12182 const originalDate = toDate(date, options?.in);
12183 if (!isValid(originalDate)) {
12184 throw new RangeError("Invalid time value");
12185 }
12186 let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => {
12187 const firstCharacter = substring[0];
12188 if (firstCharacter === "p" || firstCharacter === "P") {
12189 const longFormatter = longFormatters[firstCharacter];
12190 return longFormatter(substring, locale.formatLong);
12191 }
12192 return substring;
12193 }).join("").match(formattingTokensRegExp).map((substring) => {
12194 if (substring === "''") {
12195 return { isToken: false, value: "'" };
12196 }
12197 const firstCharacter = substring[0];
12198 if (firstCharacter === "'") {
12199 return { isToken: false, value: cleanEscapedString(substring) };
12200 }
12201 if (formatters[firstCharacter]) {
12202 return { isToken: true, value: substring };
12203 }
12204 if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
12205 throw new RangeError(
12206 "Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"
12207 );
12208 }
12209 return { isToken: false, value: substring };
12210 });
12211 if (locale.localize.preprocessor) {
12212 parts = locale.localize.preprocessor(originalDate, parts);
12213 }
12214 const formatterOptions = {
12215 firstWeekContainsDate,
12216 weekStartsOn,
12217 locale
12218 };
12219 return parts.map((part) => {
12220 if (!part.isToken) return part.value;
12221 const token = part.value;
12222 if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) {
12223 warnOrThrowProtectedError(token, formatStr, String(date));
12224 }
12225 const formatter = formatters[token[0]];
12226 return formatter(originalDate, token, locale.localize, formatterOptions);
12227 }).join("");
12228 }
12229 function cleanEscapedString(input) {
12230 const matched = input.match(escapedStringRegExp);
12231 if (!matched) {
12232 return input;
12233 }
12234 return matched[1].replace(doubleQuoteRegExp, "'");
12235 }
12236
12237 // packages/dataviews/node_modules/date-fns/subDays.js
12238 function subDays(date, amount, options) {
12239 return addDays(date, -amount, options);
12240 }
12241
12242 // packages/dataviews/node_modules/date-fns/subMonths.js
12243 function subMonths(date, amount, options) {
12244 return addMonths(date, -amount, options);
12245 }
12246
12247 // packages/dataviews/node_modules/date-fns/subWeeks.js
12248 function subWeeks(date, amount, options) {
12249 return addWeeks(date, -amount, options);
12250 }
12251
12252 // packages/dataviews/node_modules/date-fns/subYears.js
12253 function subYears(date, amount, options) {
12254 return addYears(date, -amount, options);
12255 }
12256
12257 // packages/dataviews/build-module/utils/operators.mjs
12258 var import_i18n23 = __toESM(require_i18n(), 1);
12259 var import_element28 = __toESM(require_element(), 1);
12260 var import_date = __toESM(require_date(), 1);
12261 var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1);
12262 var filterTextWrappers = {
12263 Name: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "dataviews-filters__summary-filter-text-name" }),
12264 Value: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "dataviews-filters__summary-filter-text-value" })
12265 };
12266 function getRelativeDate(value, unit) {
12267 switch (unit) {
12268 case "days":
12269 return subDays(/* @__PURE__ */ new Date(), value);
12270 case "weeks":
12271 return subWeeks(/* @__PURE__ */ new Date(), value);
12272 case "months":
12273 return subMonths(/* @__PURE__ */ new Date(), value);
12274 case "years":
12275 return subYears(/* @__PURE__ */ new Date(), value);
12276 default:
12277 return /* @__PURE__ */ new Date();
12278 }
12279 }
12280 var isNoneOperatorDefinition = {
12281 /* translators: DataViews operator name */
12282 label: (0, import_i18n23.__)("Is none of"),
12283 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12284 (0, import_i18n23.sprintf)(
12285 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */
12286 (0, import_i18n23.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"),
12287 filter.name,
12288 activeElements.map((element) => element.label).join(", ")
12289 ),
12290 filterTextWrappers
12291 ),
12292 filter: ((item, field, filterValue) => {
12293 if (!filterValue?.length) {
12294 return true;
12295 }
12296 const fieldValue = field.getValue({ item });
12297 if (Array.isArray(fieldValue)) {
12298 return !filterValue.some(
12299 (fv) => fieldValue.includes(fv)
12300 );
12301 } else if (typeof fieldValue === "string") {
12302 return !filterValue.includes(fieldValue);
12303 }
12304 return false;
12305 }),
12306 selection: "multi"
12307 };
12308 var OPERATORS = [
12309 {
12310 name: OPERATOR_IS_ANY,
12311 /* translators: DataViews operator name */
12312 label: (0, import_i18n23.__)("Includes"),
12313 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12314 (0, import_i18n23.sprintf)(
12315 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is any: Admin, Editor". */
12316 (0, import_i18n23.__)("<Name>%1$s includes: </Name><Value>%2$s</Value>"),
12317 filter.name,
12318 activeElements.map((element) => element.label).join(", ")
12319 ),
12320 filterTextWrappers
12321 ),
12322 filter(item, field, filterValue) {
12323 if (!filterValue?.length) {
12324 return true;
12325 }
12326 const fieldValue = field.getValue({ item });
12327 if (Array.isArray(fieldValue)) {
12328 return filterValue.some(
12329 (fv) => fieldValue.includes(fv)
12330 );
12331 } else if (typeof fieldValue === "string") {
12332 return filterValue.includes(fieldValue);
12333 }
12334 return false;
12335 },
12336 selection: "multi"
12337 },
12338 {
12339 name: OPERATOR_IS_NONE,
12340 ...isNoneOperatorDefinition
12341 },
12342 {
12343 name: OPERATOR_IS_ALL,
12344 /* translators: DataViews operator name */
12345 label: (0, import_i18n23.__)("Includes all"),
12346 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12347 (0, import_i18n23.sprintf)(
12348 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author includes all: Admin, Editor". */
12349 (0, import_i18n23.__)("<Name>%1$s includes all: </Name><Value>%2$s</Value>"),
12350 filter.name,
12351 activeElements.map((element) => element.label).join(", ")
12352 ),
12353 filterTextWrappers
12354 ),
12355 filter(item, field, filterValue) {
12356 if (!filterValue?.length) {
12357 return true;
12358 }
12359 return filterValue.every((value) => {
12360 return field.getValue({ item })?.includes(value);
12361 });
12362 },
12363 selection: "multi"
12364 },
12365 {
12366 name: OPERATOR_IS_NOT_ALL,
12367 ...isNoneOperatorDefinition
12368 },
12369 {
12370 name: OPERATOR_BETWEEN,
12371 /* translators: DataViews operator name */
12372 label: (0, import_i18n23.__)("Between (inc)"),
12373 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12374 (0, import_i18n23.sprintf)(
12375 /* 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". */
12376 (0, import_i18n23.__)(
12377 "<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>"
12378 ),
12379 filter.name,
12380 activeElements[0].label[0],
12381 activeElements[0].label[1]
12382 ),
12383 filterTextWrappers
12384 ),
12385 filter(item, field, filterValue) {
12386 if (!Array.isArray(filterValue) || filterValue.length !== 2 || filterValue[0] === void 0 || filterValue[1] === void 0) {
12387 return true;
12388 }
12389 const fieldValue = field.getValue({ item });
12390 if (typeof fieldValue === "number" || fieldValue instanceof Date || typeof fieldValue === "string") {
12391 return fieldValue >= filterValue[0] && fieldValue <= filterValue[1];
12392 }
12393 return false;
12394 },
12395 selection: "custom"
12396 },
12397 {
12398 name: OPERATOR_IN_THE_PAST,
12399 /* translators: DataViews operator name */
12400 label: (0, import_i18n23.__)("In the past"),
12401 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12402 (0, import_i18n23.sprintf)(
12403 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is in the past: 7 days". */
12404 (0, import_i18n23.__)(
12405 "<Name>%1$s is in the past: </Name><Value>%2$s</Value>"
12406 ),
12407 filter.name,
12408 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
12409 ),
12410 filterTextWrappers
12411 ),
12412 filter(item, field, filterValue) {
12413 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
12414 return true;
12415 }
12416 const targetDate = getRelativeDate(
12417 filterValue.value,
12418 filterValue.unit
12419 );
12420 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
12421 return fieldValue >= targetDate && fieldValue <= /* @__PURE__ */ new Date();
12422 },
12423 selection: "custom"
12424 },
12425 {
12426 name: OPERATOR_OVER,
12427 /* translators: DataViews operator name */
12428 label: (0, import_i18n23.__)("Over"),
12429 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12430 (0, import_i18n23.sprintf)(
12431 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is over: 7 days". */
12432 (0, import_i18n23.__)("<Name>%1$s is over: </Name><Value>%2$s</Value>"),
12433 filter.name,
12434 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
12435 ),
12436 filterTextWrappers
12437 ),
12438 filter(item, field, filterValue) {
12439 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
12440 return true;
12441 }
12442 const targetDate = getRelativeDate(
12443 filterValue.value,
12444 filterValue.unit
12445 );
12446 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
12447 return fieldValue < targetDate;
12448 },
12449 selection: "custom"
12450 },
12451 {
12452 name: OPERATOR_IS,
12453 /* translators: DataViews operator name */
12454 label: (0, import_i18n23.__)("Is"),
12455 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12456 (0, import_i18n23.sprintf)(
12457 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is: Admin". */
12458 (0, import_i18n23.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
12459 filter.name,
12460 activeElements[0].label
12461 ),
12462 filterTextWrappers
12463 ),
12464 filter(item, field, filterValue) {
12465 return filterValue === field.getValue({ item }) || filterValue === void 0;
12466 },
12467 selection: "single"
12468 },
12469 {
12470 name: OPERATOR_IS_NOT,
12471 /* translators: DataViews operator name */
12472 label: (0, import_i18n23.__)("Is not"),
12473 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12474 (0, import_i18n23.sprintf)(
12475 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is not: Admin". */
12476 (0, import_i18n23.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
12477 filter.name,
12478 activeElements[0].label
12479 ),
12480 filterTextWrappers
12481 ),
12482 filter(item, field, filterValue) {
12483 return filterValue !== field.getValue({ item });
12484 },
12485 selection: "single"
12486 },
12487 {
12488 name: OPERATOR_LESS_THAN,
12489 /* translators: DataViews operator name */
12490 label: (0, import_i18n23.__)("Less than"),
12491 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12492 (0, import_i18n23.sprintf)(
12493 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than: 10". */
12494 (0, import_i18n23.__)("<Name>%1$s is less than: </Name><Value>%2$s</Value>"),
12495 filter.name,
12496 activeElements[0].label
12497 ),
12498 filterTextWrappers
12499 ),
12500 filter(item, field, filterValue) {
12501 if (filterValue === void 0) {
12502 return true;
12503 }
12504 const fieldValue = field.getValue({ item });
12505 return fieldValue < filterValue;
12506 },
12507 selection: "single"
12508 },
12509 {
12510 name: OPERATOR_GREATER_THAN,
12511 /* translators: DataViews operator name */
12512 label: (0, import_i18n23.__)("Greater than"),
12513 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12514 (0, import_i18n23.sprintf)(
12515 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than: 10". */
12516 (0, import_i18n23.__)(
12517 "<Name>%1$s is greater than: </Name><Value>%2$s</Value>"
12518 ),
12519 filter.name,
12520 activeElements[0].label
12521 ),
12522 filterTextWrappers
12523 ),
12524 filter(item, field, filterValue) {
12525 if (filterValue === void 0) {
12526 return true;
12527 }
12528 const fieldValue = field.getValue({ item });
12529 return fieldValue > filterValue;
12530 },
12531 selection: "single"
12532 },
12533 {
12534 name: OPERATOR_LESS_THAN_OR_EQUAL,
12535 /* translators: DataViews operator name */
12536 label: (0, import_i18n23.__)("Less than or equal"),
12537 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12538 (0, import_i18n23.sprintf)(
12539 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than or equal to: 10". */
12540 (0, import_i18n23.__)(
12541 "<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>"
12542 ),
12543 filter.name,
12544 activeElements[0].label
12545 ),
12546 filterTextWrappers
12547 ),
12548 filter(item, field, filterValue) {
12549 if (filterValue === void 0) {
12550 return true;
12551 }
12552 const fieldValue = field.getValue({ item });
12553 return fieldValue <= filterValue;
12554 },
12555 selection: "single"
12556 },
12557 {
12558 name: OPERATOR_GREATER_THAN_OR_EQUAL,
12559 /* translators: DataViews operator name */
12560 label: (0, import_i18n23.__)("Greater than or equal"),
12561 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12562 (0, import_i18n23.sprintf)(
12563 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than or equal to: 10". */
12564 (0, import_i18n23.__)(
12565 "<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>"
12566 ),
12567 filter.name,
12568 activeElements[0].label
12569 ),
12570 filterTextWrappers
12571 ),
12572 filter(item, field, filterValue) {
12573 if (filterValue === void 0) {
12574 return true;
12575 }
12576 const fieldValue = field.getValue({ item });
12577 return fieldValue >= filterValue;
12578 },
12579 selection: "single"
12580 },
12581 {
12582 name: OPERATOR_BEFORE,
12583 /* translators: DataViews operator name */
12584 label: (0, import_i18n23.__)("Before"),
12585 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12586 (0, import_i18n23.sprintf)(
12587 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is before: 2024-01-01". */
12588 (0, import_i18n23.__)("<Name>%1$s is before: </Name><Value>%2$s</Value>"),
12589 filter.name,
12590 activeElements[0].label
12591 ),
12592 filterTextWrappers
12593 ),
12594 filter(item, field, filterValue) {
12595 if (filterValue === void 0) {
12596 return true;
12597 }
12598 const filterDate = (0, import_date.getDate)(filterValue);
12599 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12600 return fieldDate < filterDate;
12601 },
12602 selection: "single"
12603 },
12604 {
12605 name: OPERATOR_AFTER,
12606 /* translators: DataViews operator name */
12607 label: (0, import_i18n23.__)("After"),
12608 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12609 (0, import_i18n23.sprintf)(
12610 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is after: 2024-01-01". */
12611 (0, import_i18n23.__)("<Name>%1$s is after: </Name><Value>%2$s</Value>"),
12612 filter.name,
12613 activeElements[0].label
12614 ),
12615 filterTextWrappers
12616 ),
12617 filter(item, field, filterValue) {
12618 if (filterValue === void 0) {
12619 return true;
12620 }
12621 const filterDate = (0, import_date.getDate)(filterValue);
12622 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12623 return fieldDate > filterDate;
12624 },
12625 selection: "single"
12626 },
12627 {
12628 name: OPERATOR_BEFORE_INC,
12629 /* translators: DataViews operator name */
12630 label: (0, import_i18n23.__)("Before (inc)"),
12631 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12632 (0, import_i18n23.sprintf)(
12633 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or before: 2024-01-01". */
12634 (0, import_i18n23.__)(
12635 "<Name>%1$s is on or before: </Name><Value>%2$s</Value>"
12636 ),
12637 filter.name,
12638 activeElements[0].label
12639 ),
12640 filterTextWrappers
12641 ),
12642 filter(item, field, filterValue) {
12643 if (filterValue === void 0) {
12644 return true;
12645 }
12646 const filterDate = (0, import_date.getDate)(filterValue);
12647 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12648 return fieldDate <= filterDate;
12649 },
12650 selection: "single"
12651 },
12652 {
12653 name: OPERATOR_AFTER_INC,
12654 /* translators: DataViews operator name */
12655 label: (0, import_i18n23.__)("After (inc)"),
12656 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12657 (0, import_i18n23.sprintf)(
12658 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or after: 2024-01-01". */
12659 (0, import_i18n23.__)(
12660 "<Name>%1$s is on or after: </Name><Value>%2$s</Value>"
12661 ),
12662 filter.name,
12663 activeElements[0].label
12664 ),
12665 filterTextWrappers
12666 ),
12667 filter(item, field, filterValue) {
12668 if (filterValue === void 0) {
12669 return true;
12670 }
12671 const filterDate = (0, import_date.getDate)(filterValue);
12672 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12673 return fieldDate >= filterDate;
12674 },
12675 selection: "single"
12676 },
12677 {
12678 name: OPERATOR_CONTAINS,
12679 /* translators: DataViews operator name */
12680 label: (0, import_i18n23.__)("Contains"),
12681 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12682 (0, import_i18n23.sprintf)(
12683 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title contains: Hello". */
12684 (0, import_i18n23.__)("<Name>%1$s contains: </Name><Value>%2$s</Value>"),
12685 filter.name,
12686 activeElements[0].label
12687 ),
12688 filterTextWrappers
12689 ),
12690 filter(item, field, filterValue) {
12691 if (filterValue === void 0) {
12692 return true;
12693 }
12694 const fieldValue = field.getValue({ item });
12695 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
12696 },
12697 selection: "single"
12698 },
12699 {
12700 name: OPERATOR_NOT_CONTAINS,
12701 /* translators: DataViews operator name */
12702 label: (0, import_i18n23.__)("Doesn't contain"),
12703 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12704 (0, import_i18n23.sprintf)(
12705 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title doesn't contain: Hello". */
12706 (0, import_i18n23.__)(
12707 "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>"
12708 ),
12709 filter.name,
12710 activeElements[0].label
12711 ),
12712 filterTextWrappers
12713 ),
12714 filter(item, field, filterValue) {
12715 if (filterValue === void 0) {
12716 return true;
12717 }
12718 const fieldValue = field.getValue({ item });
12719 return typeof fieldValue === "string" && filterValue && !fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
12720 },
12721 selection: "single"
12722 },
12723 {
12724 name: OPERATOR_STARTS_WITH,
12725 /* translators: DataViews operator name */
12726 label: (0, import_i18n23.__)("Starts with"),
12727 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12728 (0, import_i18n23.sprintf)(
12729 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title starts with: Hello". */
12730 (0, import_i18n23.__)("<Name>%1$s starts with: </Name><Value>%2$s</Value>"),
12731 filter.name,
12732 activeElements[0].label
12733 ),
12734 filterTextWrappers
12735 ),
12736 filter(item, field, filterValue) {
12737 if (filterValue === void 0) {
12738 return true;
12739 }
12740 const fieldValue = field.getValue({ item });
12741 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().startsWith(String(filterValue).toLowerCase());
12742 },
12743 selection: "single"
12744 },
12745 {
12746 name: OPERATOR_ON,
12747 /* translators: DataViews operator name */
12748 label: (0, import_i18n23.__)("On"),
12749 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12750 (0, import_i18n23.sprintf)(
12751 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is: 2024-01-01". */
12752 (0, import_i18n23.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
12753 filter.name,
12754 activeElements[0].label
12755 ),
12756 filterTextWrappers
12757 ),
12758 filter(item, field, filterValue) {
12759 if (filterValue === void 0) {
12760 return true;
12761 }
12762 const filterDate = (0, import_date.getDate)(filterValue);
12763 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12764 return filterDate.getTime() === fieldDate.getTime();
12765 },
12766 selection: "single"
12767 },
12768 {
12769 name: OPERATOR_NOT_ON,
12770 /* translators: DataViews operator name */
12771 label: (0, import_i18n23.__)("Not on"),
12772 filterText: (filter, activeElements) => (0, import_element28.createInterpolateElement)(
12773 (0, import_i18n23.sprintf)(
12774 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is not: 2024-01-01". */
12775 (0, import_i18n23.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
12776 filter.name,
12777 activeElements[0].label
12778 ),
12779 filterTextWrappers
12780 ),
12781 filter(item, field, filterValue) {
12782 if (filterValue === void 0) {
12783 return true;
12784 }
12785 const filterDate = (0, import_date.getDate)(filterValue);
12786 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12787 return filterDate.getTime() !== fieldDate.getTime();
12788 },
12789 selection: "single"
12790 }
12791 ];
12792 var getOperatorByName = (name) => OPERATORS.find((op) => op.name === name);
12793 var getAllOperatorNames = () => OPERATORS.map((op) => op.name);
12794 var isSingleSelectionOperator = (name) => OPERATORS.filter((op) => op.selection === "single").some(
12795 (op) => op.name === name
12796 );
12797 var isRegisteredOperator = (name) => OPERATORS.some((op) => op.name === name);
12798
12799 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
12800 var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1);
12801 var ENTER = "Enter";
12802 var SPACE = " ";
12803 var FilterText = ({
12804 activeElements,
12805 filterInView,
12806 filter
12807 }) => {
12808 if (activeElements === void 0 || activeElements.length === 0) {
12809 return filter.name;
12810 }
12811 const operator = getOperatorByName(filterInView?.operator);
12812 if (operator !== void 0) {
12813 return operator.filterText(filter, activeElements);
12814 }
12815 return (0, import_i18n24.sprintf)(
12816 /* translators: 1: Filter name e.g.: "Unknown status for Author". */
12817 (0, import_i18n24.__)("Unknown status for %1$s"),
12818 filter.name
12819 );
12820 };
12821 function OperatorSelector({
12822 filter,
12823 view,
12824 onChangeView
12825 }) {
12826 const operatorOptions = filter.operators?.map((operator) => ({
12827 value: operator,
12828 label: getOperatorByName(operator)?.label || operator
12829 }));
12830 const currentFilter = view.filters?.find(
12831 (_filter) => _filter.field === filter.field
12832 );
12833 const value = currentFilter?.operator || filter.operators[0];
12834 return operatorOptions.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
12835 Stack,
12836 {
12837 direction: "row",
12838 gap: "sm",
12839 justify: "flex-start",
12840 className: "dataviews-filters__summary-operators-container",
12841 align: "center",
12842 children: [
12843 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_components21.FlexItem, { className: "dataviews-filters__summary-operators-filter-name", children: filter.name }),
12844 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12845 import_components21.SelectControl,
12846 {
12847 className: "dataviews-filters__summary-operators-filter-select",
12848 label: (0, import_i18n24.__)("Conditions"),
12849 value,
12850 options: operatorOptions,
12851 onChange: (newValue) => {
12852 const newOperator = newValue;
12853 const currentOperator = currentFilter?.operator;
12854 const newFilters = currentFilter ? [
12855 ...(view.filters ?? []).map(
12856 (_filter) => {
12857 if (_filter.field === filter.field) {
12858 const currentOpSelectionModel = getOperatorByName(
12859 currentOperator
12860 )?.selection;
12861 const newOpSelectionModel = getOperatorByName(
12862 newOperator
12863 )?.selection;
12864 const shouldResetValue = currentOpSelectionModel !== newOpSelectionModel || [
12865 currentOpSelectionModel,
12866 newOpSelectionModel
12867 ].includes("custom");
12868 return {
12869 ..._filter,
12870 value: shouldResetValue ? void 0 : _filter.value,
12871 operator: newOperator
12872 };
12873 }
12874 return _filter;
12875 }
12876 )
12877 ] : [
12878 ...view.filters ?? [],
12879 {
12880 field: filter.field,
12881 operator: newOperator,
12882 value: void 0
12883 }
12884 ];
12885 onChangeView({
12886 ...view,
12887 page: 1,
12888 filters: newFilters
12889 });
12890 },
12891 size: "small",
12892 variant: "minimal",
12893 hideLabelFromVision: true
12894 }
12895 )
12896 ]
12897 }
12898 );
12899 }
12900 function Filter({
12901 addFilterRef,
12902 openedFilter,
12903 fields,
12904 ...commonProps
12905 }) {
12906 const toggleRef = (0, import_element29.useRef)(null);
12907 const { filter, view, onChangeView } = commonProps;
12908 const filterInView = view.filters?.find(
12909 (f2) => f2.field === filter.field
12910 );
12911 let activeElements = [];
12912 const field = (0, import_element29.useMemo)(() => {
12913 const currentField = fields.find((f2) => f2.id === filter.field);
12914 if (currentField) {
12915 return {
12916 ...currentField,
12917 // Configure getValue as if Item was a plain object.
12918 // See related input-widget.tsx
12919 getValue: ({ item }) => item[currentField.id]
12920 };
12921 }
12922 return currentField;
12923 }, [fields, filter.field]);
12924 const { elements } = useElements({
12925 elements: filter.elements,
12926 getElements: filter.getElements
12927 });
12928 if (elements.length > 0) {
12929 activeElements = elements.filter((element) => {
12930 if (filter.singleSelection) {
12931 return element.value === filterInView?.value;
12932 }
12933 return filterInView?.value?.includes(element.value);
12934 });
12935 } else if (Array.isArray(filterInView?.value)) {
12936 const label = filterInView.value.map((v2) => {
12937 const formattedValue = field?.getValueFormatted({
12938 item: { [field.id]: v2 },
12939 field
12940 });
12941 return formattedValue || String(v2);
12942 });
12943 activeElements = [
12944 {
12945 value: filterInView.value,
12946 // @ts-ignore
12947 label
12948 }
12949 ];
12950 } else if (typeof filterInView?.value === "object") {
12951 activeElements = [
12952 { value: filterInView.value, label: filterInView.value }
12953 ];
12954 } else if (filterInView?.value !== void 0) {
12955 const label = field !== void 0 ? field.getValueFormatted({
12956 item: { [field.id]: filterInView.value },
12957 field
12958 }) : String(filterInView.value);
12959 activeElements = [
12960 {
12961 value: filterInView.value,
12962 label
12963 }
12964 ];
12965 }
12966 const isPrimary = filter.isPrimary;
12967 const isLocked = filterInView?.isLocked;
12968 const hasValues = !isLocked && filterInView?.value !== void 0;
12969 const canResetOrRemove = !isLocked && (!isPrimary || hasValues);
12970 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12971 import_components21.Dropdown,
12972 {
12973 defaultOpen: openedFilter === filter.field,
12974 contentClassName: "dataviews-filters__summary-popover",
12975 popoverProps: { placement: "bottom-start", role: "dialog" },
12976 onClose: () => {
12977 toggleRef.current?.focus();
12978 },
12979 renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "dataviews-filters__summary-chip-container", children: [
12980 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12981 import_components21.Tooltip,
12982 {
12983 text: (0, import_i18n24.sprintf)(
12984 /* translators: 1: Filter name. */
12985 (0, import_i18n24.__)("Filter by: %1$s"),
12986 filter.name.toLowerCase()
12987 ),
12988 placement: "top",
12989 children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12990 "div",
12991 {
12992 className: clsx_default(
12993 "dataviews-filters__summary-chip",
12994 {
12995 "has-reset": canResetOrRemove,
12996 "has-values": hasValues,
12997 "is-not-clickable": isLocked
12998 }
12999 ),
13000 role: "button",
13001 tabIndex: isLocked ? -1 : 0,
13002 onClick: () => {
13003 if (!isLocked) {
13004 onToggle();
13005 }
13006 },
13007 onKeyDown: (event) => {
13008 if (!isLocked && [ENTER, SPACE].includes(event.key)) {
13009 onToggle();
13010 event.preventDefault();
13011 }
13012 },
13013 "aria-disabled": isLocked,
13014 "aria-pressed": isOpen,
13015 "aria-expanded": isOpen,
13016 ref: toggleRef,
13017 children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13018 FilterText,
13019 {
13020 activeElements,
13021 filterInView,
13022 filter
13023 }
13024 )
13025 }
13026 )
13027 }
13028 ),
13029 canResetOrRemove && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13030 import_components21.Tooltip,
13031 {
13032 text: isPrimary ? (0, import_i18n24.__)("Reset") : (0, import_i18n24.__)("Remove"),
13033 placement: "top",
13034 children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13035 "button",
13036 {
13037 className: clsx_default(
13038 "dataviews-filters__summary-chip-remove",
13039 { "has-values": hasValues }
13040 ),
13041 onClick: () => {
13042 onChangeView({
13043 ...view,
13044 page: 1,
13045 filters: view.filters?.filter(
13046 (_filter) => _filter.field !== filter.field
13047 )
13048 });
13049 if (!isPrimary) {
13050 addFilterRef.current?.focus();
13051 } else {
13052 toggleRef.current?.focus();
13053 }
13054 },
13055 children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_components21.Icon, { icon: close_small_default })
13056 }
13057 )
13058 }
13059 )
13060 ] }),
13061 renderContent: () => {
13062 return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Stack, { direction: "column", justify: "flex-start", children: [
13063 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(OperatorSelector, { ...commonProps }),
13064 commonProps.filter.hasElements ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
13065 SearchWidget,
13066 {
13067 ...commonProps,
13068 filter: {
13069 ...commonProps.filter,
13070 elements
13071 }
13072 }
13073 ) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(InputWidget, { ...commonProps, fields })
13074 ] });
13075 }
13076 }
13077 );
13078 }
13079
13080 // packages/dataviews/build-module/components/dataviews-filters/add-filter.mjs
13081 var import_components22 = __toESM(require_components(), 1);
13082 var import_i18n25 = __toESM(require_i18n(), 1);
13083 var import_element30 = __toESM(require_element(), 1);
13084 var import_jsx_runtime59 = __toESM(require_jsx_runtime(), 1);
13085 var { Menu: Menu4 } = unlock2(import_components22.privateApis);
13086 function AddFilterMenu({
13087 filters,
13088 view,
13089 onChangeView,
13090 setOpenedFilter,
13091 triggerProps
13092 }) {
13093 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
13094 return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Menu4, { children: [
13095 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Menu4.TriggerButton, { ...triggerProps }),
13096 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Menu4.Popover, { children: inactiveFilters.map((filter) => {
13097 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13098 Menu4.Item,
13099 {
13100 onClick: () => {
13101 setOpenedFilter(filter.field);
13102 onChangeView({
13103 ...view,
13104 page: 1,
13105 filters: [
13106 ...view.filters || [],
13107 {
13108 field: filter.field,
13109 value: void 0,
13110 operator: filter.operators[0]
13111 }
13112 ]
13113 });
13114 },
13115 children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Menu4.ItemLabel, { children: filter.name })
13116 },
13117 filter.field
13118 );
13119 }) })
13120 ] });
13121 }
13122 function AddFilter({ filters, view, onChangeView, setOpenedFilter }, ref) {
13123 if (!filters.length || filters.every(({ isPrimary }) => isPrimary)) {
13124 return null;
13125 }
13126 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
13127 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13128 AddFilterMenu,
13129 {
13130 triggerProps: {
13131 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
13132 import_components22.Button,
13133 {
13134 accessibleWhenDisabled: true,
13135 size: "compact",
13136 className: "dataviews-filters-button",
13137 variant: "tertiary",
13138 disabled: !inactiveFilters.length,
13139 ref
13140 }
13141 ),
13142 children: (0, import_i18n25.__)("Add filter")
13143 },
13144 ...{ filters, view, onChangeView, setOpenedFilter }
13145 }
13146 );
13147 }
13148 var add_filter_default = (0, import_element30.forwardRef)(AddFilter);
13149
13150 // packages/dataviews/build-module/components/dataviews-filters/reset-filters.mjs
13151 var import_components23 = __toESM(require_components(), 1);
13152 var import_i18n26 = __toESM(require_i18n(), 1);
13153 var import_jsx_runtime60 = __toESM(require_jsx_runtime(), 1);
13154 function ResetFilter({
13155 filters,
13156 view,
13157 onChangeView
13158 }) {
13159 const isPrimary = (field) => filters.some(
13160 (_filter) => _filter.field === field && _filter.isPrimary
13161 );
13162 const isDisabled = !view.search && !view.filters?.some(
13163 (_filter) => !_filter.isLocked && (_filter.value !== void 0 || !isPrimary(_filter.field))
13164 );
13165 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
13166 import_components23.Button,
13167 {
13168 disabled: isDisabled,
13169 accessibleWhenDisabled: true,
13170 size: "compact",
13171 variant: "tertiary",
13172 className: "dataviews-filters__reset-button",
13173 onClick: () => {
13174 onChangeView({
13175 ...view,
13176 page: 1,
13177 search: "",
13178 filters: view.filters?.filter((f2) => !!f2.isLocked) || []
13179 });
13180 },
13181 children: (0, import_i18n26.__)("Reset")
13182 }
13183 );
13184 }
13185
13186 // packages/dataviews/build-module/components/dataviews-filters/use-filters.mjs
13187 var import_element31 = __toESM(require_element(), 1);
13188 function useFilters(fields, view) {
13189 return (0, import_element31.useMemo)(() => {
13190 const filters = [];
13191 fields.forEach((field) => {
13192 if (field.filterBy === false || !field.hasElements && !field.Edit) {
13193 return;
13194 }
13195 const operators = field.filterBy.operators;
13196 const isPrimary = !!field.filterBy?.isPrimary;
13197 const isLocked = view.filters?.some(
13198 (f2) => f2.field === field.id && !!f2.isLocked
13199 ) ?? false;
13200 filters.push({
13201 field: field.id,
13202 name: field.label,
13203 elements: field.elements,
13204 getElements: field.getElements,
13205 hasElements: field.hasElements,
13206 singleSelection: operators.some(
13207 (op) => isSingleSelectionOperator(op)
13208 ),
13209 operators,
13210 isVisible: isLocked || isPrimary || !!view.filters?.some(
13211 (f2) => f2.field === field.id && isRegisteredOperator(f2.operator)
13212 ),
13213 isPrimary,
13214 isLocked
13215 });
13216 });
13217 filters.sort((a2, b2) => {
13218 if (a2.isLocked && !b2.isLocked) {
13219 return -1;
13220 }
13221 if (!a2.isLocked && b2.isLocked) {
13222 return 1;
13223 }
13224 if (a2.isPrimary && !b2.isPrimary) {
13225 return -1;
13226 }
13227 if (!a2.isPrimary && b2.isPrimary) {
13228 return 1;
13229 }
13230 return a2.name.localeCompare(b2.name);
13231 });
13232 return filters;
13233 }, [fields, view]);
13234 }
13235 var use_filters_default = useFilters;
13236
13237 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
13238 var import_jsx_runtime61 = __toESM(require_jsx_runtime(), 1);
13239 function Filters({ className }) {
13240 const { fields, view, onChangeView, openedFilter, setOpenedFilter } = (0, import_element32.useContext)(dataviews_context_default);
13241 const addFilterRef = (0, import_element32.useRef)(null);
13242 const filters = use_filters_default(fields, view);
13243 const addFilter = /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13244 add_filter_default,
13245 {
13246 filters,
13247 view,
13248 onChangeView,
13249 ref: addFilterRef,
13250 setOpenedFilter
13251 },
13252 "add-filter"
13253 );
13254 const visibleFilters = filters.filter((filter) => filter.isVisible);
13255 if (visibleFilters.length === 0) {
13256 return null;
13257 }
13258 const filterComponents = [
13259 ...visibleFilters.map((filter) => {
13260 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13261 Filter,
13262 {
13263 filter,
13264 view,
13265 fields,
13266 onChangeView,
13267 addFilterRef,
13268 openedFilter
13269 },
13270 filter.field
13271 );
13272 }),
13273 addFilter
13274 ];
13275 filterComponents.push(
13276 /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13277 ResetFilter,
13278 {
13279 filters,
13280 view,
13281 onChangeView
13282 },
13283 "reset-filters"
13284 )
13285 );
13286 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13287 Stack,
13288 {
13289 direction: "row",
13290 justify: "flex-start",
13291 gap: "sm",
13292 style: { width: "fit-content" },
13293 wrap: "wrap",
13294 className,
13295 children: filterComponents
13296 }
13297 );
13298 }
13299 var filters_default = (0, import_element32.memo)(Filters);
13300
13301 // packages/dataviews/build-module/components/dataviews-filters/toggle.mjs
13302 var import_element33 = __toESM(require_element(), 1);
13303 var import_components24 = __toESM(require_components(), 1);
13304 var import_i18n27 = __toESM(require_i18n(), 1);
13305 var import_jsx_runtime62 = __toESM(require_jsx_runtime(), 1);
13306 function FiltersToggle() {
13307 const {
13308 filters,
13309 view,
13310 onChangeView,
13311 setOpenedFilter,
13312 isShowingFilter,
13313 setIsShowingFilter
13314 } = (0, import_element33.useContext)(dataviews_context_default);
13315 const buttonRef = (0, import_element33.useRef)(null);
13316 const onChangeViewWithFilterVisibility = (0, import_element33.useCallback)(
13317 (_view) => {
13318 onChangeView(_view);
13319 setIsShowingFilter(true);
13320 },
13321 [onChangeView, setIsShowingFilter]
13322 );
13323 if (filters.length === 0) {
13324 return null;
13325 }
13326 const hasVisibleFilters = filters.some((filter) => filter.isVisible);
13327 const addFilterButtonProps = {
13328 label: (0, import_i18n27.__)("Add filter"),
13329 "aria-expanded": false,
13330 isPressed: false
13331 };
13332 const toggleFiltersButtonProps = {
13333 label: (0, import_i18n27._x)("Filter", "verb"),
13334 "aria-expanded": isShowingFilter,
13335 isPressed: isShowingFilter,
13336 onClick: () => {
13337 if (!isShowingFilter) {
13338 setOpenedFilter(null);
13339 }
13340 setIsShowingFilter(!isShowingFilter);
13341 }
13342 };
13343 const hasPrimaryOrLockedFilters = filters.some(
13344 (filter) => filter.isPrimary || filter.isLocked
13345 );
13346 const buttonComponent = /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
13347 import_components24.Button,
13348 {
13349 ref: buttonRef,
13350 className: "dataviews-filters__visibility-toggle",
13351 size: "compact",
13352 icon: funnel_default,
13353 disabled: hasPrimaryOrLockedFilters,
13354 accessibleWhenDisabled: true,
13355 ...hasVisibleFilters ? toggleFiltersButtonProps : addFilterButtonProps
13356 }
13357 );
13358 return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "dataviews-filters__container-visibility-toggle", children: !hasVisibleFilters ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
13359 AddFilterMenu,
13360 {
13361 filters,
13362 view,
13363 onChangeView: onChangeViewWithFilterVisibility,
13364 setOpenedFilter,
13365 triggerProps: { render: buttonComponent }
13366 }
13367 ) : /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
13368 FilterVisibilityToggle,
13369 {
13370 buttonRef,
13371 filtersCount: view.filters?.length,
13372 children: buttonComponent
13373 }
13374 ) });
13375 }
13376 function FilterVisibilityToggle({
13377 buttonRef,
13378 filtersCount,
13379 children
13380 }) {
13381 (0, import_element33.useEffect)(
13382 () => () => {
13383 buttonRef.current?.focus();
13384 },
13385 [buttonRef]
13386 );
13387 return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_jsx_runtime62.Fragment, { children: [
13388 children,
13389 !!filtersCount && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("span", { className: "dataviews-filters-toggle__count", children: filtersCount })
13390 ] });
13391 }
13392 var toggle_default = FiltersToggle;
13393
13394 // packages/dataviews/build-module/components/dataviews-filters/filters-toggled.mjs
13395 var import_element34 = __toESM(require_element(), 1);
13396 var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
13397 function FiltersToggled(props) {
13398 const { isShowingFilter } = (0, import_element34.useContext)(dataviews_context_default);
13399 if (!isShowingFilter) {
13400 return null;
13401 }
13402 return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(filters_default, { ...props });
13403 }
13404 var filters_toggled_default = FiltersToggled;
13405
13406 // packages/dataviews/build-module/components/dataviews-layout/index.mjs
13407 var import_element35 = __toESM(require_element(), 1);
13408 var import_components25 = __toESM(require_components(), 1);
13409 var import_i18n28 = __toESM(require_i18n(), 1);
13410 var import_jsx_runtime64 = __toESM(require_jsx_runtime(), 1);
13411 function DataViewsLayout({ className }) {
13412 const {
13413 actions = [],
13414 data,
13415 fields,
13416 getItemId,
13417 getItemLevel,
13418 hasInitiallyLoaded,
13419 isLoading,
13420 view,
13421 onChangeView,
13422 selection,
13423 onChangeSelection,
13424 setOpenedFilter,
13425 onClickItem,
13426 isItemClickable,
13427 renderItemLink,
13428 defaultLayouts,
13429 containerRef,
13430 empty = /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("p", { children: (0, import_i18n28.__)("No results") })
13431 } = (0, import_element35.useContext)(dataviews_context_default);
13432 const isDelayedInitialLoading = useDelayedLoading(!hasInitiallyLoaded, {
13433 delay: 200
13434 });
13435 if (!hasInitiallyLoaded) {
13436 if (!isDelayedInitialLoading) {
13437 return null;
13438 }
13439 return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("div", { className: "dataviews-loading", children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(import_components25.Spinner, {}) }) });
13440 }
13441 const ViewComponent = VIEW_LAYOUTS.find(
13442 (v2) => v2.type === view.type && defaultLayouts[v2.type]
13443 )?.component;
13444 return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("div", { className: "dataviews-layout__container", ref: containerRef, children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
13445 ViewComponent,
13446 {
13447 className,
13448 actions,
13449 data,
13450 fields,
13451 getItemId,
13452 getItemLevel,
13453 isLoading,
13454 onChangeView,
13455 onChangeSelection,
13456 selection,
13457 setOpenedFilter,
13458 onClickItem,
13459 renderItemLink,
13460 isItemClickable,
13461 view,
13462 empty
13463 }
13464 ) });
13465 }
13466
13467 // packages/dataviews/build-module/components/dataviews-footer/index.mjs
13468 var import_element36 = __toESM(require_element(), 1);
13469 var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
13470 var EMPTY_ARRAY5 = [];
13471 function DataViewsFooter() {
13472 const {
13473 view,
13474 paginationInfo: { totalItems = 0, totalPages },
13475 data,
13476 actions = EMPTY_ARRAY5,
13477 isLoading,
13478 hasInitiallyLoaded
13479 } = (0, import_element36.useContext)(dataviews_context_default);
13480 const isRefreshing = !!isLoading && hasInitiallyLoaded && !!data?.length;
13481 const isDelayedRefreshing = useDelayedLoading(!!isRefreshing);
13482 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data) && [LAYOUT_TABLE, LAYOUT_GRID].includes(view.type);
13483 if (!isRefreshing && (!totalItems || !totalPages || totalPages <= 1 && !hasBulkActions)) {
13484 return null;
13485 }
13486 return (!!totalItems || isRefreshing) && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
13487 "div",
13488 {
13489 className: "dataviews-footer",
13490 inert: isRefreshing ? "true" : void 0,
13491 children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
13492 Stack,
13493 {
13494 direction: "row",
13495 justify: "end",
13496 align: "center",
13497 className: clsx_default("dataviews-footer__content", {
13498 "is-refreshing": isDelayedRefreshing
13499 }),
13500 gap: "sm",
13501 children: [
13502 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(BulkActionsFooter, {}),
13503 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(dataviews_pagination_default, {})
13504 ]
13505 }
13506 )
13507 }
13508 );
13509 }
13510
13511 // packages/dataviews/build-module/components/dataviews-search/index.mjs
13512 var import_i18n29 = __toESM(require_i18n(), 1);
13513 var import_element37 = __toESM(require_element(), 1);
13514 var import_components26 = __toESM(require_components(), 1);
13515 var import_compose9 = __toESM(require_compose(), 1);
13516 var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
13517 var DataViewsSearch = (0, import_element37.memo)(function Search({ label }) {
13518 const { view, onChangeView } = (0, import_element37.useContext)(dataviews_context_default);
13519 const [search, setSearch, debouncedSearch] = (0, import_compose9.useDebouncedInput)(
13520 view.search
13521 );
13522 (0, import_element37.useEffect)(() => {
13523 if (view.search !== debouncedSearch) {
13524 setSearch(view.search ?? "");
13525 }
13526 }, [view.search, setSearch]);
13527 const onChangeViewRef = (0, import_element37.useRef)(onChangeView);
13528 const viewRef = (0, import_element37.useRef)(view);
13529 (0, import_element37.useEffect)(() => {
13530 onChangeViewRef.current = onChangeView;
13531 viewRef.current = view;
13532 }, [onChangeView, view]);
13533 (0, import_element37.useEffect)(() => {
13534 if (debouncedSearch !== viewRef.current?.search) {
13535 onChangeViewRef.current({
13536 ...viewRef.current,
13537 page: view.page ? 1 : void 0,
13538 startPosition: view.startPosition ? 1 : void 0,
13539 search: debouncedSearch
13540 });
13541 }
13542 }, [debouncedSearch]);
13543 const searchLabel = label || (0, import_i18n29.__)("Search");
13544 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
13545 import_components26.SearchControl,
13546 {
13547 className: "dataviews-search",
13548 onChange: setSearch,
13549 value: search,
13550 label: searchLabel,
13551 placeholder: searchLabel,
13552 size: "compact"
13553 }
13554 );
13555 });
13556 var dataviews_search_default = DataViewsSearch;
13557
13558 // packages/dataviews/build-module/components/dataviews-view-config/index.mjs
13559 var import_components27 = __toESM(require_components(), 1);
13560 var import_i18n30 = __toESM(require_i18n(), 1);
13561 var import_element38 = __toESM(require_element(), 1);
13562 var import_warning = __toESM(require_warning(), 1);
13563 var import_compose10 = __toESM(require_compose(), 1);
13564 var import_jsx_runtime67 = __toESM(require_jsx_runtime(), 1);
13565 var { Menu: Menu5 } = unlock2(import_components27.privateApis);
13566 var DATAVIEWS_CONFIG_POPOVER_PROPS = {
13567 className: "dataviews-config__popover",
13568 placement: "bottom-end",
13569 offset: 9
13570 };
13571 function ViewTypeMenu() {
13572 const { view, onChangeView, defaultLayouts } = (0, import_element38.useContext)(dataviews_context_default);
13573 const availableLayouts = Object.keys(defaultLayouts);
13574 if (availableLayouts.length <= 1) {
13575 return null;
13576 }
13577 const activeView = VIEW_LAYOUTS.find((v2) => view.type === v2.type);
13578 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Menu5, { children: [
13579 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13580 Menu5.TriggerButton,
13581 {
13582 render: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13583 import_components27.Button,
13584 {
13585 size: "compact",
13586 icon: activeView?.icon,
13587 label: (0, import_i18n30.__)("Layout")
13588 }
13589 )
13590 }
13591 ),
13592 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Menu5.Popover, { children: availableLayouts.map((layout) => {
13593 const config = VIEW_LAYOUTS.find(
13594 (v2) => v2.type === layout
13595 );
13596 if (!config) {
13597 return null;
13598 }
13599 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13600 Menu5.RadioItem,
13601 {
13602 value: layout,
13603 name: "view-actions-available-view",
13604 checked: layout === view.type,
13605 hideOnClick: true,
13606 onChange: (e2) => {
13607 switch (e2.target.value) {
13608 case "list":
13609 case "grid":
13610 case "table":
13611 case "pickerGrid":
13612 case "pickerTable":
13613 case "activity":
13614 const viewWithoutLayout = { ...view };
13615 if ("layout" in viewWithoutLayout) {
13616 delete viewWithoutLayout.layout;
13617 }
13618 return onChangeView({
13619 ...viewWithoutLayout,
13620 type: e2.target.value,
13621 ...defaultLayouts[e2.target.value]
13622 });
13623 }
13624 (0, import_warning.default)("Invalid dataview");
13625 },
13626 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Menu5.ItemLabel, { children: config.label })
13627 },
13628 layout
13629 );
13630 }) })
13631 ] });
13632 }
13633 function SortFieldControl() {
13634 const { view, fields, onChangeView } = (0, import_element38.useContext)(dataviews_context_default);
13635 const orderOptions = (0, import_element38.useMemo)(() => {
13636 const sortableFields = fields.filter(
13637 (field) => field.enableSorting !== false
13638 );
13639 return sortableFields.map((field) => {
13640 return {
13641 label: field.label,
13642 value: field.id
13643 };
13644 });
13645 }, [fields]);
13646 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13647 import_components27.SelectControl,
13648 {
13649 __next40pxDefaultSize: true,
13650 label: (0, import_i18n30.__)("Sort by"),
13651 value: view.sort?.field,
13652 options: orderOptions,
13653 onChange: (value) => {
13654 onChangeView({
13655 ...view,
13656 sort: {
13657 direction: view?.sort?.direction || "desc",
13658 field: value
13659 },
13660 showLevels: false
13661 });
13662 }
13663 }
13664 );
13665 }
13666 function SortDirectionControl() {
13667 const { view, fields, onChangeView } = (0, import_element38.useContext)(dataviews_context_default);
13668 const sortableFields = fields.filter(
13669 (field) => field.enableSorting !== false
13670 );
13671 if (sortableFields.length === 0) {
13672 return null;
13673 }
13674 let value = view.sort?.direction;
13675 if (!value && view.sort?.field) {
13676 value = "desc";
13677 }
13678 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13679 import_components27.__experimentalToggleGroupControl,
13680 {
13681 className: "dataviews-view-config__sort-direction",
13682 __next40pxDefaultSize: true,
13683 isBlock: true,
13684 label: (0, import_i18n30.__)("Order"),
13685 value,
13686 onChange: (newDirection) => {
13687 if (newDirection === "asc" || newDirection === "desc") {
13688 onChangeView({
13689 ...view,
13690 sort: {
13691 direction: newDirection,
13692 field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field.
13693 fields.find(
13694 (field) => field.enableSorting !== false
13695 )?.id || ""
13696 },
13697 showLevels: false
13698 });
13699 return;
13700 }
13701 (0, import_warning.default)("Invalid direction");
13702 },
13703 children: SORTING_DIRECTIONS.map((direction) => {
13704 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13705 import_components27.__experimentalToggleGroupControlOptionIcon,
13706 {
13707 value: direction,
13708 icon: sortIcons[direction],
13709 label: sortLabels[direction]
13710 },
13711 direction
13712 );
13713 })
13714 }
13715 );
13716 }
13717 function ItemsPerPageControl() {
13718 const { view, config, onChangeView } = (0, import_element38.useContext)(dataviews_context_default);
13719 const { infiniteScrollEnabled } = view;
13720 if (!config || !config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled) {
13721 return null;
13722 }
13723 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13724 import_components27.__experimentalToggleGroupControl,
13725 {
13726 __next40pxDefaultSize: true,
13727 isBlock: true,
13728 label: (0, import_i18n30.__)("Items per page"),
13729 value: view.perPage || 10,
13730 disabled: !view?.sort?.field,
13731 onChange: (newItemsPerPage) => {
13732 const newItemsPerPageNumber = typeof newItemsPerPage === "number" || newItemsPerPage === void 0 ? newItemsPerPage : parseInt(newItemsPerPage, 10);
13733 onChangeView({
13734 ...view,
13735 perPage: newItemsPerPageNumber,
13736 page: 1
13737 });
13738 },
13739 children: config.perPageSizes.map((value) => {
13740 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13741 import_components27.__experimentalToggleGroupControlOption,
13742 {
13743 value,
13744 label: value.toString()
13745 },
13746 value
13747 );
13748 })
13749 }
13750 );
13751 }
13752 function ResetViewButton() {
13753 const { onReset } = (0, import_element38.useContext)(dataviews_context_default);
13754 if (onReset === void 0) {
13755 return null;
13756 }
13757 const isDisabled = onReset === false;
13758 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13759 import_components27.Button,
13760 {
13761 variant: "tertiary",
13762 size: "compact",
13763 disabled: isDisabled,
13764 accessibleWhenDisabled: true,
13765 className: "dataviews-view-config__reset-button",
13766 onClick: () => {
13767 if (typeof onReset === "function") {
13768 onReset();
13769 }
13770 },
13771 children: (0, import_i18n30.__)("Reset view")
13772 }
13773 );
13774 }
13775 function DataviewsViewConfigDropdown() {
13776 const { view, onReset } = (0, import_element38.useContext)(dataviews_context_default);
13777 const popoverId = (0, import_compose10.useInstanceId)(
13778 _DataViewsViewConfig,
13779 "dataviews-view-config-dropdown"
13780 );
13781 const activeLayout = VIEW_LAYOUTS.find(
13782 (layout) => layout.type === view.type
13783 );
13784 const isModified = typeof onReset === "function";
13785 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13786 import_components27.Dropdown,
13787 {
13788 expandOnMobile: true,
13789 popoverProps: {
13790 ...DATAVIEWS_CONFIG_POPOVER_PROPS,
13791 id: popoverId
13792 },
13793 renderToggle: ({ onToggle, isOpen }) => {
13794 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "dataviews-view-config__toggle-wrapper", children: [
13795 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13796 import_components27.Button,
13797 {
13798 size: "compact",
13799 icon: cog_default,
13800 label: (0, import_i18n30._x)(
13801 "View options",
13802 "View is used as a noun"
13803 ),
13804 onClick: onToggle,
13805 "aria-expanded": isOpen ? "true" : "false",
13806 "aria-controls": popoverId
13807 }
13808 ),
13809 isModified && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("span", { className: "dataviews-view-config__modified-indicator" })
13810 ] });
13811 },
13812 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13813 import_components27.__experimentalDropdownContentWrapper,
13814 {
13815 paddingSize: "medium",
13816 className: "dataviews-config__popover-content-wrapper",
13817 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
13818 Stack,
13819 {
13820 direction: "column",
13821 className: "dataviews-view-config",
13822 gap: "xl",
13823 children: [
13824 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
13825 Stack,
13826 {
13827 direction: "row",
13828 justify: "space-between",
13829 align: "center",
13830 className: "dataviews-view-config__header",
13831 children: [
13832 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13833 import_components27.__experimentalHeading,
13834 {
13835 level: 2,
13836 className: "dataviews-settings-section__title",
13837 children: (0, import_i18n30.__)("Appearance")
13838 }
13839 ),
13840 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ResetViewButton, {})
13841 ]
13842 }
13843 ),
13844 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Stack, { direction: "column", gap: "lg", children: [
13845 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
13846 Stack,
13847 {
13848 direction: "row",
13849 gap: "sm",
13850 className: "dataviews-view-config__sort-controls",
13851 children: [
13852 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(SortFieldControl, {}),
13853 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(SortDirectionControl, {})
13854 ]
13855 }
13856 ),
13857 !!activeLayout?.viewConfigOptions && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(activeLayout.viewConfigOptions, {}),
13858 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ItemsPerPageControl, {}),
13859 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PropertiesSection, {})
13860 ] })
13861 ]
13862 }
13863 )
13864 }
13865 )
13866 }
13867 );
13868 }
13869 function _DataViewsViewConfig() {
13870 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
13871 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ViewTypeMenu, {}),
13872 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(DataviewsViewConfigDropdown, {})
13873 ] });
13874 }
13875 var DataViewsViewConfig = (0, import_element38.memo)(_DataViewsViewConfig);
13876 var dataviews_view_config_default = DataViewsViewConfig;
13877
13878 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
13879 var import_components28 = __toESM(require_components(), 1);
13880 var import_element39 = __toESM(require_element(), 1);
13881
13882 // packages/dataviews/build-module/components/dataform-controls/utils/get-custom-validity.mjs
13883 function getCustomValidity(isValid2, validity) {
13884 let customValidity;
13885 if (isValid2?.required && validity?.required) {
13886 customValidity = validity?.required?.message ? validity.required : void 0;
13887 } else if (isValid2?.pattern && validity?.pattern) {
13888 customValidity = validity.pattern;
13889 } else if (isValid2?.min && validity?.min) {
13890 customValidity = validity.min;
13891 } else if (isValid2?.max && validity?.max) {
13892 customValidity = validity.max;
13893 } else if (isValid2?.minLength && validity?.minLength) {
13894 customValidity = validity.minLength;
13895 } else if (isValid2?.maxLength && validity?.maxLength) {
13896 customValidity = validity.maxLength;
13897 } else if (isValid2?.elements && validity?.elements) {
13898 customValidity = validity.elements;
13899 } else if (validity?.custom) {
13900 customValidity = validity.custom;
13901 }
13902 return customValidity;
13903 }
13904
13905 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
13906 var import_jsx_runtime68 = __toESM(require_jsx_runtime(), 1);
13907 var { ValidatedCheckboxControl } = unlock2(import_components28.privateApis);
13908 function Checkbox({
13909 field,
13910 onChange,
13911 data,
13912 hideLabelFromVision,
13913 markWhenOptional,
13914 validity
13915 }) {
13916 const { getValue, setValue, label, description, isValid: isValid2 } = field;
13917 const disabled = field.isDisabled({ item: data, field });
13918 const onChangeControl = (0, import_element39.useCallback)(() => {
13919 onChange(
13920 setValue({ item: data, value: !getValue({ item: data }) })
13921 );
13922 }, [data, getValue, onChange, setValue]);
13923 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
13924 ValidatedCheckboxControl,
13925 {
13926 required: !!field.isValid?.required,
13927 markWhenOptional,
13928 customValidity: getCustomValidity(isValid2, validity),
13929 hidden: hideLabelFromVision,
13930 label,
13931 help: description,
13932 checked: getValue({ item: data }),
13933 onChange: onChangeControl,
13934 disabled
13935 }
13936 );
13937 }
13938
13939 // packages/dataviews/build-module/components/dataform-controls/combobox.mjs
13940 var import_components29 = __toESM(require_components(), 1);
13941 var import_element40 = __toESM(require_element(), 1);
13942 var import_jsx_runtime69 = __toESM(require_jsx_runtime(), 1);
13943 var { ValidatedComboboxControl } = unlock2(import_components29.privateApis);
13944 function Combobox3({
13945 data,
13946 field,
13947 onChange,
13948 hideLabelFromVision,
13949 validity
13950 }) {
13951 const { label, description, placeholder, getValue, setValue, isValid: isValid2 } = field;
13952 const value = getValue({ item: data }) ?? "";
13953 const onChangeControl = (0, import_element40.useCallback)(
13954 (newValue) => onChange(setValue({ item: data, value: newValue ?? "" })),
13955 [data, onChange, setValue]
13956 );
13957 const { elements, isLoading } = useElements({
13958 elements: field.elements,
13959 getElements: field.getElements
13960 });
13961 if (isLoading) {
13962 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_components29.Spinner, {});
13963 }
13964 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
13965 ValidatedComboboxControl,
13966 {
13967 required: !!field.isValid?.required,
13968 customValidity: getCustomValidity(isValid2, validity),
13969 label,
13970 value,
13971 help: description,
13972 placeholder,
13973 options: elements,
13974 onChange: onChangeControl,
13975 hideLabelFromVision,
13976 allowReset: true,
13977 expandOnFocus: true
13978 }
13979 );
13980 }
13981
13982 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
13983 var import_components31 = __toESM(require_components(), 1);
13984 var import_element43 = __toESM(require_element(), 1);
13985 var import_i18n32 = __toESM(require_i18n(), 1);
13986 var import_date3 = __toESM(require_date(), 1);
13987
13988 // packages/dataviews/build-module/components/dataform-controls/utils/relative-date-control.mjs
13989 var import_components30 = __toESM(require_components(), 1);
13990 var import_element41 = __toESM(require_element(), 1);
13991 var import_i18n31 = __toESM(require_i18n(), 1);
13992 var import_jsx_runtime70 = __toESM(require_jsx_runtime(), 1);
13993 var TIME_UNITS_OPTIONS = {
13994 [OPERATOR_IN_THE_PAST]: [
13995 { value: "days", label: (0, import_i18n31.__)("Days") },
13996 { value: "weeks", label: (0, import_i18n31.__)("Weeks") },
13997 { value: "months", label: (0, import_i18n31.__)("Months") },
13998 { value: "years", label: (0, import_i18n31.__)("Years") }
13999 ],
14000 [OPERATOR_OVER]: [
14001 { value: "days", label: (0, import_i18n31.__)("Days ago") },
14002 { value: "weeks", label: (0, import_i18n31.__)("Weeks ago") },
14003 { value: "months", label: (0, import_i18n31.__)("Months ago") },
14004 { value: "years", label: (0, import_i18n31.__)("Years ago") }
14005 ]
14006 };
14007 function RelativeDateControl({
14008 className,
14009 data,
14010 field,
14011 onChange,
14012 hideLabelFromVision,
14013 operator
14014 }) {
14015 const options = TIME_UNITS_OPTIONS[operator === OPERATOR_IN_THE_PAST ? "inThePast" : "over"];
14016 const { id, label, description, getValue, setValue } = field;
14017 const disabled = field.isDisabled({ item: data, field });
14018 const fieldValue = getValue({ item: data });
14019 const { value: relValue = "", unit = options[0].value } = fieldValue && typeof fieldValue === "object" ? fieldValue : {};
14020 const onChangeValue = (0, import_element41.useCallback)(
14021 (newValue) => onChange(
14022 setValue({
14023 item: data,
14024 value: { value: Number(newValue), unit }
14025 })
14026 ),
14027 [onChange, setValue, data, unit]
14028 );
14029 const onChangeUnit = (0, import_element41.useCallback)(
14030 (newUnit) => onChange(
14031 setValue({
14032 item: data,
14033 value: { value: relValue, unit: newUnit }
14034 })
14035 ),
14036 [onChange, setValue, data, relValue]
14037 );
14038 return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
14039 import_components30.BaseControl,
14040 {
14041 id,
14042 className: clsx_default(className, "dataviews-controls__relative-date"),
14043 label,
14044 hideLabelFromVision,
14045 help: description,
14046 children: /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(Stack, { direction: "row", gap: "sm", children: [
14047 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
14048 import_components30.__experimentalNumberControl,
14049 {
14050 __next40pxDefaultSize: true,
14051 className: "dataviews-controls__relative-date-number",
14052 spinControls: "none",
14053 min: 1,
14054 step: 1,
14055 value: relValue,
14056 onChange: onChangeValue,
14057 disabled
14058 }
14059 ),
14060 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
14061 import_components30.SelectControl,
14062 {
14063 className: "dataviews-controls__relative-date-unit",
14064 __next40pxDefaultSize: true,
14065 label: (0, import_i18n31.__)("Unit"),
14066 value: unit,
14067 options,
14068 onChange: onChangeUnit,
14069 hideLabelFromVision: true,
14070 disabled
14071 }
14072 )
14073 ] })
14074 }
14075 );
14076 }
14077
14078 // packages/dataviews/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs
14079 var import_element42 = __toESM(require_element(), 1);
14080 function useDisabledDateMatchers(isValid2, parseDateFn) {
14081 const minConstraint = typeof isValid2.min?.constraint === "string" ? isValid2.min.constraint : void 0;
14082 const maxConstraint = typeof isValid2.max?.constraint === "string" ? isValid2.max.constraint : void 0;
14083 const disabledMatchers = (0, import_element42.useMemo)(() => {
14084 const matchers = [];
14085 if (minConstraint) {
14086 const minDate = parseDateFn(minConstraint);
14087 if (minDate) {
14088 matchers.push({ before: minDate });
14089 }
14090 }
14091 if (maxConstraint) {
14092 const maxDate = parseDateFn(maxConstraint);
14093 if (maxDate) {
14094 matchers.push({ after: maxDate });
14095 }
14096 }
14097 return matchers.length > 0 ? matchers : void 0;
14098 }, [minConstraint, maxConstraint, parseDateFn]);
14099 return { minConstraint, maxConstraint, disabledMatchers };
14100 }
14101
14102 // packages/dataviews/build-module/field-types/utils/parse-date-time.mjs
14103 var import_date2 = __toESM(require_date(), 1);
14104 function parseDateTime(dateTimeString) {
14105 if (!dateTimeString) {
14106 return null;
14107 }
14108 const parsed = (0, import_date2.getDate)(dateTimeString);
14109 return parsed && isValid(parsed) ? parsed : null;
14110 }
14111
14112 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
14113 var import_jsx_runtime71 = __toESM(require_jsx_runtime(), 1);
14114 var { DateCalendar, ValidatedInputControl } = unlock2(import_components31.privateApis);
14115 var formatDateTime = (value) => {
14116 if (!value) {
14117 return "";
14118 }
14119 return (0, import_date3.dateI18n)("Y-m-d\\TH:i", (0, import_date3.getDate)(value));
14120 };
14121 function CalendarDateTimeControl({
14122 data,
14123 field,
14124 onChange,
14125 hideLabelFromVision,
14126 markWhenOptional,
14127 validity,
14128 config
14129 }) {
14130 const { compact } = config || {};
14131 const { id, label, description, setValue, getValue, isValid: isValid2 } = field;
14132 const disabled = field.isDisabled({ item: data, field });
14133 const fieldValue = getValue({ item: data });
14134 const value = typeof fieldValue === "string" ? fieldValue : void 0;
14135 const [calendarMonth, setCalendarMonth] = (0, import_element43.useState)(() => {
14136 const parsedDate = parseDateTime(value);
14137 return parsedDate || /* @__PURE__ */ new Date();
14138 });
14139 const inputControlRef = (0, import_element43.useRef)(null);
14140 const validationTimeoutRef = (0, import_element43.useRef)(void 0);
14141 const previousFocusRef = (0, import_element43.useRef)(null);
14142 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDateTime);
14143 const onChangeCallback = (0, import_element43.useCallback)(
14144 (newValue) => onChange(setValue({ item: data, value: newValue })),
14145 [data, onChange, setValue]
14146 );
14147 (0, import_element43.useEffect)(() => {
14148 return () => {
14149 if (validationTimeoutRef.current) {
14150 clearTimeout(validationTimeoutRef.current);
14151 }
14152 };
14153 }, []);
14154 const onSelectDate = (0, import_element43.useCallback)(
14155 (newDate) => {
14156 let dateTimeValue;
14157 if (newDate) {
14158 const wpDate = (0, import_date3.dateI18n)("Y-m-d", newDate);
14159 let wpTime;
14160 if (value) {
14161 wpTime = (0, import_date3.dateI18n)("H:i", (0, import_date3.getDate)(value));
14162 } else {
14163 wpTime = (0, import_date3.dateI18n)("H:i", newDate);
14164 }
14165 const finalDateTime = (0, import_date3.getDate)(`${wpDate}T${wpTime}`);
14166 dateTimeValue = finalDateTime.toISOString();
14167 onChangeCallback(dateTimeValue);
14168 if (validationTimeoutRef.current) {
14169 clearTimeout(validationTimeoutRef.current);
14170 }
14171 } else {
14172 onChangeCallback(void 0);
14173 }
14174 previousFocusRef.current = inputControlRef.current && inputControlRef.current.ownerDocument.activeElement;
14175 validationTimeoutRef.current = setTimeout(() => {
14176 if (inputControlRef.current) {
14177 inputControlRef.current.focus();
14178 inputControlRef.current.blur();
14179 onChangeCallback(dateTimeValue);
14180 if (previousFocusRef.current && previousFocusRef.current instanceof HTMLElement) {
14181 previousFocusRef.current.focus();
14182 }
14183 }
14184 }, 0);
14185 },
14186 [onChangeCallback, value]
14187 );
14188 const handleManualDateTimeChange = (0, import_element43.useCallback)(
14189 (newValue) => {
14190 if (newValue) {
14191 const dateTime = (0, import_date3.getDate)(newValue);
14192 onChangeCallback(dateTime.toISOString());
14193 const parsedDate = parseDateTime(dateTime.toISOString());
14194 if (parsedDate) {
14195 setCalendarMonth(parsedDate);
14196 }
14197 } else {
14198 onChangeCallback(void 0);
14199 }
14200 },
14201 [onChangeCallback]
14202 );
14203 const { format: fieldFormat } = field;
14204 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek;
14205 const {
14206 timezone: { string: timezoneString }
14207 } = (0, import_date3.getSettings)();
14208 let displayLabel = label;
14209 if (isValid2?.required && !markWhenOptional && !hideLabelFromVision) {
14210 displayLabel = `${label} (${(0, import_i18n32.__)("Required")})`;
14211 } else if (!isValid2?.required && markWhenOptional && !hideLabelFromVision) {
14212 displayLabel = `${label} (${(0, import_i18n32.__)("Optional")})`;
14213 }
14214 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
14215 import_components31.BaseControl,
14216 {
14217 id,
14218 label: displayLabel,
14219 help: description,
14220 hideLabelFromVision,
14221 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(Stack, { direction: "column", gap: "lg", children: [
14222 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
14223 ValidatedInputControl,
14224 {
14225 ref: inputControlRef,
14226 __next40pxDefaultSize: true,
14227 required: !!isValid2?.required,
14228 customValidity: getCustomValidity(isValid2, validity),
14229 type: "datetime-local",
14230 label: (0, import_i18n32.__)("Date time"),
14231 hideLabelFromVision: true,
14232 value: formatDateTime(value),
14233 onChange: handleManualDateTimeChange,
14234 disabled,
14235 min: minConstraint ? formatDateTime(minConstraint) : void 0,
14236 max: maxConstraint ? formatDateTime(maxConstraint) : void 0
14237 }
14238 ),
14239 !compact && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
14240 DateCalendar,
14241 {
14242 style: { width: "100%" },
14243 selected: value ? parseDateTime(value) || void 0 : void 0,
14244 onSelect: onSelectDate,
14245 month: calendarMonth,
14246 onMonthChange: setCalendarMonth,
14247 timeZone: timezoneString || void 0,
14248 weekStartsOn,
14249 disabled: disabled || disabledMatchers
14250 }
14251 )
14252 ] })
14253 }
14254 );
14255 }
14256 function DateTime({
14257 data,
14258 field,
14259 onChange,
14260 hideLabelFromVision,
14261 markWhenOptional,
14262 operator,
14263 validity,
14264 config
14265 }) {
14266 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
14267 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
14268 RelativeDateControl,
14269 {
14270 className: "dataviews-controls__datetime",
14271 data,
14272 field,
14273 onChange,
14274 hideLabelFromVision,
14275 operator
14276 }
14277 );
14278 }
14279 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
14280 CalendarDateTimeControl,
14281 {
14282 data,
14283 field,
14284 onChange,
14285 hideLabelFromVision,
14286 markWhenOptional,
14287 validity,
14288 config
14289 }
14290 );
14291 }
14292
14293 // packages/dataviews/build-module/components/dataform-controls/date.mjs
14294 var import_components32 = __toESM(require_components(), 1);
14295 var import_element44 = __toESM(require_element(), 1);
14296 var import_i18n33 = __toESM(require_i18n(), 1);
14297 var import_date4 = __toESM(require_date(), 1);
14298 var import_jsx_runtime72 = __toESM(require_jsx_runtime(), 1);
14299 var { DateCalendar: DateCalendar2, DateRangeCalendar } = unlock2(import_components32.privateApis);
14300 var DATE_PRESETS = [
14301 {
14302 id: "today",
14303 label: (0, import_i18n33.__)("Today"),
14304 getValue: () => (0, import_date4.getDate)(null)
14305 },
14306 {
14307 id: "yesterday",
14308 label: (0, import_i18n33.__)("Yesterday"),
14309 getValue: () => {
14310 const today = (0, import_date4.getDate)(null);
14311 return subDays(today, 1);
14312 }
14313 },
14314 {
14315 id: "past-week",
14316 label: (0, import_i18n33.__)("Past week"),
14317 getValue: () => {
14318 const today = (0, import_date4.getDate)(null);
14319 return subDays(today, 7);
14320 }
14321 },
14322 {
14323 id: "past-month",
14324 label: (0, import_i18n33.__)("Past month"),
14325 getValue: () => {
14326 const today = (0, import_date4.getDate)(null);
14327 return subMonths(today, 1);
14328 }
14329 }
14330 ];
14331 var DATE_RANGE_PRESETS = [
14332 {
14333 id: "last-7-days",
14334 label: (0, import_i18n33.__)("Last 7 days"),
14335 getValue: () => {
14336 const today = (0, import_date4.getDate)(null);
14337 return [subDays(today, 7), today];
14338 }
14339 },
14340 {
14341 id: "last-30-days",
14342 label: (0, import_i18n33.__)("Last 30 days"),
14343 getValue: () => {
14344 const today = (0, import_date4.getDate)(null);
14345 return [subDays(today, 30), today];
14346 }
14347 },
14348 {
14349 id: "month-to-date",
14350 label: (0, import_i18n33.__)("Month to date"),
14351 getValue: () => {
14352 const today = (0, import_date4.getDate)(null);
14353 return [startOfMonth(today), today];
14354 }
14355 },
14356 {
14357 id: "last-year",
14358 label: (0, import_i18n33.__)("Last year"),
14359 getValue: () => {
14360 const today = (0, import_date4.getDate)(null);
14361 return [subYears(today, 1), today];
14362 }
14363 },
14364 {
14365 id: "year-to-date",
14366 label: (0, import_i18n33.__)("Year to date"),
14367 getValue: () => {
14368 const today = (0, import_date4.getDate)(null);
14369 return [startOfYear(today), today];
14370 }
14371 }
14372 ];
14373 var parseDate = (dateString) => {
14374 if (!dateString) {
14375 return null;
14376 }
14377 const parsed = (0, import_date4.getDate)(dateString);
14378 return parsed && isValid(parsed) ? parsed : null;
14379 };
14380 var formatDate = (date) => {
14381 if (!date) {
14382 return "";
14383 }
14384 return typeof date === "string" ? date : format(date, "yyyy-MM-dd");
14385 };
14386 function ValidatedDateControl({
14387 field,
14388 validity,
14389 inputRefs,
14390 isTouched,
14391 setIsTouched,
14392 children
14393 }) {
14394 const { isValid: isValid2 } = field;
14395 const [customValidity, setCustomValidity] = (0, import_element44.useState)(void 0);
14396 const validateRefs = (0, import_element44.useCallback)(() => {
14397 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
14398 for (const ref of refs) {
14399 const input = ref.current;
14400 if (input && !input.validity.valid) {
14401 setCustomValidity({
14402 type: "invalid",
14403 message: input.validationMessage
14404 });
14405 return;
14406 }
14407 }
14408 setCustomValidity(void 0);
14409 }, [inputRefs]);
14410 (0, import_element44.useEffect)(() => {
14411 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
14412 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
14413 for (const ref of refs) {
14414 const input = ref.current;
14415 if (input) {
14416 input.setCustomValidity(
14417 result?.type === "invalid" && result.message ? result.message : ""
14418 );
14419 }
14420 }
14421 }, [inputRefs, isValid2, validity]);
14422 (0, import_element44.useEffect)(() => {
14423 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
14424 const handleInvalid = (event) => {
14425 event.preventDefault();
14426 setIsTouched(true);
14427 };
14428 for (const ref of refs) {
14429 ref.current?.addEventListener("invalid", handleInvalid);
14430 }
14431 return () => {
14432 for (const ref of refs) {
14433 ref.current?.removeEventListener("invalid", handleInvalid);
14434 }
14435 };
14436 }, [inputRefs, setIsTouched]);
14437 (0, import_element44.useEffect)(() => {
14438 if (!isTouched) {
14439 return;
14440 }
14441 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
14442 if (result) {
14443 setCustomValidity(result);
14444 } else {
14445 validateRefs();
14446 }
14447 }, [isTouched, isValid2, validity, validateRefs]);
14448 const onBlur = (event) => {
14449 if (isTouched) {
14450 return;
14451 }
14452 if (!event.relatedTarget || !event.currentTarget.contains(event.relatedTarget)) {
14453 setIsTouched(true);
14454 }
14455 };
14456 return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { onBlur, children: [
14457 children,
14458 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { "aria-live": "polite", children: customValidity && /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14459 "p",
14460 {
14461 className: clsx_default(
14462 "components-validated-control__indicator",
14463 customValidity.type === "invalid" ? "is-invalid" : void 0
14464 ),
14465 children: [
14466 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14467 import_components32.Icon,
14468 {
14469 className: "components-validated-control__indicator-icon",
14470 icon: error_default,
14471 size: 16,
14472 fill: "currentColor"
14473 }
14474 ),
14475 customValidity.message
14476 ]
14477 }
14478 ) })
14479 ] });
14480 }
14481 function CalendarDateControl({
14482 data,
14483 field,
14484 onChange,
14485 hideLabelFromVision,
14486 markWhenOptional,
14487 validity
14488 }) {
14489 const {
14490 id,
14491 label,
14492 description,
14493 setValue,
14494 getValue,
14495 isValid: isValid2,
14496 format: fieldFormat
14497 } = field;
14498 const disabled = field.isDisabled({ item: data, field });
14499 const [selectedPresetId, setSelectedPresetId] = (0, import_element44.useState)(
14500 null
14501 );
14502 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
14503 const fieldValue = getValue({ item: data });
14504 const value = typeof fieldValue === "string" ? fieldValue : void 0;
14505 const [calendarMonth, setCalendarMonth] = (0, import_element44.useState)(() => {
14506 const parsedDate = parseDate(value);
14507 return parsedDate || /* @__PURE__ */ new Date();
14508 });
14509 const [isTouched, setIsTouched] = (0, import_element44.useState)(false);
14510 const validityTargetRef = (0, import_element44.useRef)(null);
14511 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDate);
14512 const onChangeCallback = (0, import_element44.useCallback)(
14513 (newValue) => onChange(setValue({ item: data, value: newValue })),
14514 [data, onChange, setValue]
14515 );
14516 const onSelectDate = (0, import_element44.useCallback)(
14517 (newDate) => {
14518 const dateValue = newDate ? format(newDate, "yyyy-MM-dd") : void 0;
14519 onChangeCallback(dateValue);
14520 setSelectedPresetId(null);
14521 setIsTouched(true);
14522 },
14523 [onChangeCallback]
14524 );
14525 const handlePresetClick = (0, import_element44.useCallback)(
14526 (preset) => {
14527 const presetDate = preset.getValue();
14528 const dateValue = formatDate(presetDate);
14529 setCalendarMonth(presetDate);
14530 onChangeCallback(dateValue);
14531 setSelectedPresetId(preset.id);
14532 setIsTouched(true);
14533 },
14534 [onChangeCallback]
14535 );
14536 const handleManualDateChange = (0, import_element44.useCallback)(
14537 (newValue) => {
14538 onChangeCallback(newValue);
14539 if (newValue) {
14540 const parsedDate = parseDate(newValue);
14541 if (parsedDate) {
14542 setCalendarMonth(parsedDate);
14543 }
14544 }
14545 setSelectedPresetId(null);
14546 setIsTouched(true);
14547 },
14548 [onChangeCallback]
14549 );
14550 const {
14551 timezone: { string: timezoneString }
14552 } = (0, import_date4.getSettings)();
14553 let displayLabel = label;
14554 if (isValid2?.required && !markWhenOptional) {
14555 displayLabel = `${label} (${(0, import_i18n33.__)("Required")})`;
14556 } else if (!isValid2?.required && markWhenOptional) {
14557 displayLabel = `${label} (${(0, import_i18n33.__)("Optional")})`;
14558 }
14559 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14560 ValidatedDateControl,
14561 {
14562 field,
14563 validity,
14564 inputRefs: validityTargetRef,
14565 isTouched,
14566 setIsTouched,
14567 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14568 import_components32.BaseControl,
14569 {
14570 id,
14571 className: "dataviews-controls__date",
14572 label: displayLabel,
14573 help: description,
14574 hideLabelFromVision,
14575 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(Stack, { direction: "column", gap: "lg", children: [
14576 /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14577 Stack,
14578 {
14579 direction: "row",
14580 gap: "sm",
14581 wrap: "wrap",
14582 justify: "flex-start",
14583 children: [
14584 DATE_PRESETS.map((preset) => {
14585 const isSelected2 = selectedPresetId === preset.id;
14586 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14587 import_components32.Button,
14588 {
14589 className: "dataviews-controls__date-preset",
14590 variant: "tertiary",
14591 isPressed: isSelected2,
14592 size: "small",
14593 disabled,
14594 accessibleWhenDisabled: true,
14595 onClick: () => handlePresetClick(preset),
14596 children: preset.label
14597 },
14598 preset.id
14599 );
14600 }),
14601 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14602 import_components32.Button,
14603 {
14604 className: "dataviews-controls__date-preset",
14605 variant: "tertiary",
14606 isPressed: !selectedPresetId,
14607 size: "small",
14608 disabled: !!selectedPresetId || disabled,
14609 accessibleWhenDisabled: true,
14610 children: (0, import_i18n33.__)("Custom")
14611 }
14612 )
14613 ]
14614 }
14615 ),
14616 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14617 import_components32.__experimentalInputControl,
14618 {
14619 __next40pxDefaultSize: true,
14620 ref: validityTargetRef,
14621 type: "date",
14622 label: (0, import_i18n33.__)("Date"),
14623 hideLabelFromVision: true,
14624 value,
14625 onChange: handleManualDateChange,
14626 required: !!field.isValid?.required,
14627 disabled,
14628 min: minConstraint,
14629 max: maxConstraint
14630 }
14631 ),
14632 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14633 DateCalendar2,
14634 {
14635 style: { width: "100%" },
14636 selected: value ? parseDate(value) || void 0 : void 0,
14637 onSelect: onSelectDate,
14638 month: calendarMonth,
14639 onMonthChange: setCalendarMonth,
14640 timeZone: timezoneString || void 0,
14641 weekStartsOn,
14642 disabled: disabled || disabledMatchers,
14643 disableNavigation: disabled
14644 }
14645 )
14646 ] })
14647 }
14648 )
14649 }
14650 );
14651 }
14652 function CalendarDateRangeControl({
14653 data,
14654 field,
14655 onChange,
14656 hideLabelFromVision,
14657 markWhenOptional,
14658 validity
14659 }) {
14660 const {
14661 id,
14662 label,
14663 description,
14664 getValue,
14665 setValue,
14666 isValid: isValid2,
14667 format: fieldFormat
14668 } = field;
14669 const disabled = field.isDisabled({ item: data, field });
14670 let value;
14671 const fieldValue = getValue({ item: data });
14672 if (Array.isArray(fieldValue) && fieldValue.length === 2 && fieldValue.every((date) => typeof date === "string")) {
14673 value = fieldValue;
14674 }
14675 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
14676 const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid2, parseDate);
14677 const onChangeCallback = (0, import_element44.useCallback)(
14678 (newValue) => {
14679 onChange(
14680 setValue({
14681 item: data,
14682 value: newValue
14683 })
14684 );
14685 },
14686 [data, onChange, setValue]
14687 );
14688 const [selectedPresetId, setSelectedPresetId] = (0, import_element44.useState)(
14689 null
14690 );
14691 const selectedRange = (0, import_element44.useMemo)(() => {
14692 if (!value) {
14693 return { from: void 0, to: void 0 };
14694 }
14695 const [from, to] = value;
14696 return {
14697 from: parseDate(from) || void 0,
14698 to: parseDate(to) || void 0
14699 };
14700 }, [value]);
14701 const [calendarMonth, setCalendarMonth] = (0, import_element44.useState)(() => {
14702 return selectedRange.from || /* @__PURE__ */ new Date();
14703 });
14704 const [isTouched, setIsTouched] = (0, import_element44.useState)(false);
14705 const fromInputRef = (0, import_element44.useRef)(null);
14706 const toInputRef = (0, import_element44.useRef)(null);
14707 const updateDateRange = (0, import_element44.useCallback)(
14708 (fromDate, toDate2) => {
14709 if (fromDate && toDate2) {
14710 onChangeCallback([
14711 formatDate(fromDate),
14712 formatDate(toDate2)
14713 ]);
14714 } else if (!fromDate && !toDate2) {
14715 onChangeCallback(void 0);
14716 }
14717 },
14718 [onChangeCallback]
14719 );
14720 const onSelectCalendarRange = (0, import_element44.useCallback)(
14721 (newRange) => {
14722 updateDateRange(newRange?.from, newRange?.to);
14723 setSelectedPresetId(null);
14724 setIsTouched(true);
14725 },
14726 [updateDateRange]
14727 );
14728 const handlePresetClick = (0, import_element44.useCallback)(
14729 (preset) => {
14730 const [startDate, endDate] = preset.getValue();
14731 setCalendarMonth(startDate);
14732 updateDateRange(startDate, endDate);
14733 setSelectedPresetId(preset.id);
14734 setIsTouched(true);
14735 },
14736 [updateDateRange]
14737 );
14738 const handleManualDateChange = (0, import_element44.useCallback)(
14739 (fromOrTo, newValue) => {
14740 const [currentFrom, currentTo] = value || [
14741 void 0,
14742 void 0
14743 ];
14744 const updatedFrom = fromOrTo === "from" ? newValue : currentFrom;
14745 const updatedTo = fromOrTo === "to" ? newValue : currentTo;
14746 updateDateRange(updatedFrom, updatedTo);
14747 if (newValue) {
14748 const parsedDate = parseDate(newValue);
14749 if (parsedDate) {
14750 setCalendarMonth(parsedDate);
14751 }
14752 }
14753 setSelectedPresetId(null);
14754 setIsTouched(true);
14755 },
14756 [value, updateDateRange]
14757 );
14758 const { timezone } = (0, import_date4.getSettings)();
14759 let displayLabel = label;
14760 if (field.isValid?.required && !markWhenOptional) {
14761 displayLabel = `${label} (${(0, import_i18n33.__)("Required")})`;
14762 } else if (!field.isValid?.required && markWhenOptional) {
14763 displayLabel = `${label} (${(0, import_i18n33.__)("Optional")})`;
14764 }
14765 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14766 ValidatedDateControl,
14767 {
14768 field,
14769 validity,
14770 inputRefs: [fromInputRef, toInputRef],
14771 isTouched,
14772 setIsTouched,
14773 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14774 import_components32.BaseControl,
14775 {
14776 id,
14777 className: "dataviews-controls__date",
14778 label: displayLabel,
14779 help: description,
14780 hideLabelFromVision,
14781 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(Stack, { direction: "column", gap: "lg", children: [
14782 /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14783 Stack,
14784 {
14785 direction: "row",
14786 gap: "sm",
14787 wrap: "wrap",
14788 justify: "flex-start",
14789 children: [
14790 DATE_RANGE_PRESETS.map((preset) => {
14791 const isSelected2 = selectedPresetId === preset.id;
14792 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14793 import_components32.Button,
14794 {
14795 className: "dataviews-controls__date-preset",
14796 variant: "tertiary",
14797 isPressed: isSelected2,
14798 size: "small",
14799 disabled,
14800 accessibleWhenDisabled: true,
14801 onClick: () => handlePresetClick(preset),
14802 children: preset.label
14803 },
14804 preset.id
14805 );
14806 }),
14807 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14808 import_components32.Button,
14809 {
14810 className: "dataviews-controls__date-preset",
14811 variant: "tertiary",
14812 isPressed: !selectedPresetId,
14813 size: "small",
14814 accessibleWhenDisabled: true,
14815 disabled: !!selectedPresetId || disabled,
14816 children: (0, import_i18n33.__)("Custom")
14817 }
14818 )
14819 ]
14820 }
14821 ),
14822 /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14823 Stack,
14824 {
14825 direction: "row",
14826 gap: "sm",
14827 justify: "space-between",
14828 className: "dataviews-controls__date-range-inputs",
14829 children: [
14830 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14831 import_components32.__experimentalInputControl,
14832 {
14833 __next40pxDefaultSize: true,
14834 ref: fromInputRef,
14835 type: "date",
14836 label: (0, import_i18n33.__)("From"),
14837 hideLabelFromVision: true,
14838 value: value?.[0],
14839 onChange: (newValue) => handleManualDateChange("from", newValue),
14840 required: !!field.isValid?.required,
14841 disabled,
14842 min: minConstraint,
14843 max: maxConstraint
14844 }
14845 ),
14846 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14847 import_components32.__experimentalInputControl,
14848 {
14849 __next40pxDefaultSize: true,
14850 ref: toInputRef,
14851 type: "date",
14852 label: (0, import_i18n33.__)("To"),
14853 hideLabelFromVision: true,
14854 value: value?.[1],
14855 onChange: (newValue) => handleManualDateChange("to", newValue),
14856 required: !!field.isValid?.required,
14857 disabled,
14858 min: minConstraint,
14859 max: maxConstraint
14860 }
14861 )
14862 ]
14863 }
14864 ),
14865 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14866 DateRangeCalendar,
14867 {
14868 style: { width: "100%" },
14869 selected: selectedRange,
14870 onSelect: onSelectCalendarRange,
14871 month: calendarMonth,
14872 onMonthChange: setCalendarMonth,
14873 timeZone: timezone.string || void 0,
14874 weekStartsOn,
14875 disabled: disabled || disabledMatchers
14876 }
14877 )
14878 ] })
14879 }
14880 )
14881 }
14882 );
14883 }
14884 function DateControl({
14885 data,
14886 field,
14887 onChange,
14888 hideLabelFromVision,
14889 markWhenOptional,
14890 operator,
14891 validity
14892 }) {
14893 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
14894 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14895 RelativeDateControl,
14896 {
14897 className: "dataviews-controls__date",
14898 data,
14899 field,
14900 onChange,
14901 hideLabelFromVision,
14902 operator
14903 }
14904 );
14905 }
14906 if (operator === OPERATOR_BETWEEN) {
14907 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14908 CalendarDateRangeControl,
14909 {
14910 data,
14911 field,
14912 onChange,
14913 hideLabelFromVision,
14914 markWhenOptional,
14915 validity
14916 }
14917 );
14918 }
14919 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14920 CalendarDateControl,
14921 {
14922 data,
14923 field,
14924 onChange,
14925 hideLabelFromVision,
14926 markWhenOptional,
14927 validity
14928 }
14929 );
14930 }
14931
14932 // packages/dataviews/build-module/components/dataform-controls/select.mjs
14933 var import_components33 = __toESM(require_components(), 1);
14934 var import_element45 = __toESM(require_element(), 1);
14935 var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
14936 var { ValidatedSelectControl } = unlock2(import_components33.privateApis);
14937 function Select({
14938 data,
14939 field,
14940 onChange,
14941 hideLabelFromVision,
14942 markWhenOptional,
14943 validity
14944 }) {
14945 const { type, label, description, getValue, setValue, isValid: isValid2 } = field;
14946 const disabled = field.isDisabled({ item: data, field });
14947 const isMultiple = type === "array";
14948 const value = getValue({ item: data }) ?? (isMultiple ? [] : "");
14949 const onChangeControl = (0, import_element45.useCallback)(
14950 (newValue) => onChange(setValue({ item: data, value: newValue })),
14951 [data, onChange, setValue]
14952 );
14953 const { elements, isLoading } = useElements({
14954 elements: field.elements,
14955 getElements: field.getElements
14956 });
14957 if (isLoading) {
14958 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_components33.Spinner, {});
14959 }
14960 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
14961 ValidatedSelectControl,
14962 {
14963 required: !!field.isValid?.required,
14964 markWhenOptional,
14965 customValidity: getCustomValidity(isValid2, validity),
14966 label,
14967 value,
14968 help: description,
14969 options: elements,
14970 onChange: onChangeControl,
14971 __next40pxDefaultSize: true,
14972 hideLabelFromVision,
14973 multiple: isMultiple,
14974 disabled
14975 }
14976 );
14977 }
14978
14979 // packages/dataviews/build-module/components/dataform-controls/adaptive-select.mjs
14980 var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
14981 var ELEMENTS_THRESHOLD = 10;
14982 function AdaptiveSelect(props) {
14983 const { field } = props;
14984 const { elements } = useElements({
14985 elements: field.elements,
14986 getElements: field.getElements
14987 });
14988 if (elements.length >= ELEMENTS_THRESHOLD) {
14989 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(Combobox3, { ...props });
14990 }
14991 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(Select, { ...props });
14992 }
14993
14994 // packages/dataviews/build-module/components/dataform-controls/email.mjs
14995 var import_components35 = __toESM(require_components(), 1);
14996
14997 // packages/dataviews/build-module/components/dataform-controls/utils/validated-input.mjs
14998 var import_components34 = __toESM(require_components(), 1);
14999 var import_element46 = __toESM(require_element(), 1);
15000 var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
15001 var { ValidatedInputControl: ValidatedInputControl2 } = unlock2(import_components34.privateApis);
15002 function ValidatedText({
15003 data,
15004 field,
15005 onChange,
15006 hideLabelFromVision,
15007 markWhenOptional,
15008 type,
15009 prefix,
15010 suffix,
15011 validity
15012 }) {
15013 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field;
15014 const value = getValue({ item: data });
15015 const disabled = field.isDisabled({ item: data, field });
15016 const onChangeControl = (0, import_element46.useCallback)(
15017 (newValue) => onChange(
15018 setValue({
15019 item: data,
15020 value: newValue
15021 })
15022 ),
15023 [data, setValue, onChange]
15024 );
15025 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
15026 ValidatedInputControl2,
15027 {
15028 required: !!isValid2.required,
15029 markWhenOptional,
15030 customValidity: getCustomValidity(isValid2, validity),
15031 label,
15032 placeholder,
15033 value: value ?? "",
15034 help: description,
15035 onChange: onChangeControl,
15036 hideLabelFromVision,
15037 type,
15038 prefix,
15039 suffix,
15040 disabled,
15041 pattern: isValid2.pattern ? isValid2.pattern.constraint : void 0,
15042 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
15043 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0,
15044 __next40pxDefaultSize: true
15045 }
15046 );
15047 }
15048
15049 // packages/dataviews/build-module/components/dataform-controls/email.mjs
15050 var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
15051 function Email({
15052 data,
15053 field,
15054 onChange,
15055 hideLabelFromVision,
15056 markWhenOptional,
15057 validity
15058 }) {
15059 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
15060 ValidatedText,
15061 {
15062 ...{
15063 data,
15064 field,
15065 onChange,
15066 hideLabelFromVision,
15067 markWhenOptional,
15068 validity,
15069 type: "email",
15070 prefix: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(import_components35.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(import_components35.Icon, { icon: envelope_default }) })
15071 }
15072 }
15073 );
15074 }
15075
15076 // packages/dataviews/build-module/components/dataform-controls/telephone.mjs
15077 var import_components36 = __toESM(require_components(), 1);
15078 var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
15079 function Telephone({
15080 data,
15081 field,
15082 onChange,
15083 hideLabelFromVision,
15084 markWhenOptional,
15085 validity
15086 }) {
15087 return /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
15088 ValidatedText,
15089 {
15090 ...{
15091 data,
15092 field,
15093 onChange,
15094 hideLabelFromVision,
15095 markWhenOptional,
15096 validity,
15097 type: "tel",
15098 prefix: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(import_components36.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(import_components36.Icon, { icon: mobile_default }) })
15099 }
15100 }
15101 );
15102 }
15103
15104 // packages/dataviews/build-module/components/dataform-controls/url.mjs
15105 var import_components37 = __toESM(require_components(), 1);
15106 var import_jsx_runtime78 = __toESM(require_jsx_runtime(), 1);
15107 function Url({
15108 data,
15109 field,
15110 onChange,
15111 hideLabelFromVision,
15112 markWhenOptional,
15113 validity
15114 }) {
15115 return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
15116 ValidatedText,
15117 {
15118 ...{
15119 data,
15120 field,
15121 onChange,
15122 hideLabelFromVision,
15123 markWhenOptional,
15124 validity,
15125 type: "url",
15126 prefix: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_components37.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_components37.Icon, { icon: link_default }) })
15127 }
15128 }
15129 );
15130 }
15131
15132 // packages/dataviews/build-module/components/dataform-controls/utils/validated-number.mjs
15133 var import_components38 = __toESM(require_components(), 1);
15134 var import_element47 = __toESM(require_element(), 1);
15135 var import_i18n34 = __toESM(require_i18n(), 1);
15136 var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
15137 var { ValidatedNumberControl } = unlock2(import_components38.privateApis);
15138 function toNumberOrEmpty(value) {
15139 if (value === "" || value === void 0) {
15140 return "";
15141 }
15142 const number = Number(value);
15143 return Number.isFinite(number) ? number : "";
15144 }
15145 function BetweenControls({
15146 value,
15147 onChange,
15148 hideLabelFromVision,
15149 step
15150 }) {
15151 const [min = "", max = ""] = value;
15152 const onChangeMin = (0, import_element47.useCallback)(
15153 (newValue) => onChange([toNumberOrEmpty(newValue), max]),
15154 [onChange, max]
15155 );
15156 const onChangeMax = (0, import_element47.useCallback)(
15157 (newValue) => onChange([min, toNumberOrEmpty(newValue)]),
15158 [onChange, min]
15159 );
15160 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
15161 import_components38.BaseControl,
15162 {
15163 help: (0, import_i18n34.__)("The max. value must be greater than the min. value."),
15164 children: /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(import_components38.Flex, { direction: "row", gap: 4, children: [
15165 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
15166 import_components38.__experimentalNumberControl,
15167 {
15168 label: (0, import_i18n34.__)("Min."),
15169 value: min,
15170 max: max ? Number(max) - step : void 0,
15171 onChange: onChangeMin,
15172 __next40pxDefaultSize: true,
15173 hideLabelFromVision,
15174 step
15175 }
15176 ),
15177 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
15178 import_components38.__experimentalNumberControl,
15179 {
15180 label: (0, import_i18n34.__)("Max."),
15181 value: max,
15182 min: min ? Number(min) + step : void 0,
15183 onChange: onChangeMax,
15184 __next40pxDefaultSize: true,
15185 hideLabelFromVision,
15186 step
15187 }
15188 )
15189 ] })
15190 }
15191 );
15192 }
15193 function ValidatedNumber({
15194 data,
15195 field,
15196 onChange,
15197 hideLabelFromVision,
15198 markWhenOptional,
15199 operator,
15200 validity
15201 }) {
15202 const decimals = field.format?.decimals ?? 0;
15203 const step = Math.pow(10, Math.abs(decimals) * -1);
15204 const { label, description, getValue, setValue, isValid: isValid2 } = field;
15205 const value = getValue({ item: data }) ?? "";
15206 const disabled = field.isDisabled({ item: data, field });
15207 const onChangeControl = (0, import_element47.useCallback)(
15208 (newValue) => {
15209 onChange(
15210 setValue({
15211 item: data,
15212 // Do not convert an empty string or undefined to a number,
15213 // otherwise there's a mismatch between the UI control (empty)
15214 // and the data relied by onChange (0).
15215 value: ["", void 0].includes(newValue) ? void 0 : Number(newValue)
15216 })
15217 );
15218 },
15219 [data, onChange, setValue]
15220 );
15221 const onChangeBetweenControls = (0, import_element47.useCallback)(
15222 (newValue) => {
15223 onChange(
15224 setValue({
15225 item: data,
15226 value: newValue
15227 })
15228 );
15229 },
15230 [data, onChange, setValue]
15231 );
15232 if (operator === OPERATOR_BETWEEN) {
15233 let valueBetween = ["", ""];
15234 if (Array.isArray(value) && value.length === 2 && value.every(
15235 (element) => typeof element === "number" || element === ""
15236 )) {
15237 valueBetween = value;
15238 }
15239 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
15240 BetweenControls,
15241 {
15242 value: valueBetween,
15243 onChange: onChangeBetweenControls,
15244 hideLabelFromVision,
15245 step
15246 }
15247 );
15248 }
15249 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
15250 ValidatedNumberControl,
15251 {
15252 required: !!isValid2.required,
15253 markWhenOptional,
15254 customValidity: getCustomValidity(isValid2, validity),
15255 label,
15256 help: description,
15257 value,
15258 onChange: onChangeControl,
15259 __next40pxDefaultSize: true,
15260 hideLabelFromVision,
15261 step,
15262 min: isValid2.min ? isValid2.min.constraint : void 0,
15263 max: isValid2.max ? isValid2.max.constraint : void 0,
15264 disabled
15265 }
15266 );
15267 }
15268
15269 // packages/dataviews/build-module/components/dataform-controls/integer.mjs
15270 var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
15271 function Integer(props) {
15272 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(ValidatedNumber, { ...props });
15273 }
15274
15275 // packages/dataviews/build-module/components/dataform-controls/number.mjs
15276 var import_jsx_runtime81 = __toESM(require_jsx_runtime(), 1);
15277 function Number2(props) {
15278 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ValidatedNumber, { ...props });
15279 }
15280
15281 // packages/dataviews/build-module/components/dataform-controls/radio.mjs
15282 var import_components39 = __toESM(require_components(), 1);
15283 var import_element48 = __toESM(require_element(), 1);
15284 var import_jsx_runtime82 = __toESM(require_jsx_runtime(), 1);
15285 var { ValidatedRadioControl } = unlock2(import_components39.privateApis);
15286 function Radio({
15287 data,
15288 field,
15289 onChange,
15290 hideLabelFromVision,
15291 markWhenOptional,
15292 validity
15293 }) {
15294 const { label, description, getValue, setValue, isValid: isValid2 } = field;
15295 const disabled = field.isDisabled({ item: data, field });
15296 const { elements, isLoading } = useElements({
15297 elements: field.elements,
15298 getElements: field.getElements
15299 });
15300 const value = getValue({ item: data });
15301 const onChangeControl = (0, import_element48.useCallback)(
15302 (newValue) => onChange(setValue({ item: data, value: newValue })),
15303 [data, onChange, setValue]
15304 );
15305 if (isLoading) {
15306 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_components39.Spinner, {});
15307 }
15308 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
15309 ValidatedRadioControl,
15310 {
15311 required: !!field.isValid?.required,
15312 markWhenOptional,
15313 customValidity: getCustomValidity(isValid2, validity),
15314 label,
15315 help: description,
15316 onChange: onChangeControl,
15317 options: elements,
15318 selected: value,
15319 hideLabelFromVision,
15320 disabled
15321 }
15322 );
15323 }
15324
15325 // packages/dataviews/build-module/components/dataform-controls/text.mjs
15326 var import_element49 = __toESM(require_element(), 1);
15327 var import_jsx_runtime83 = __toESM(require_jsx_runtime(), 1);
15328 function Text({
15329 data,
15330 field,
15331 onChange,
15332 hideLabelFromVision,
15333 markWhenOptional,
15334 config,
15335 validity
15336 }) {
15337 const { prefix, suffix } = config || {};
15338 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(
15339 ValidatedText,
15340 {
15341 ...{
15342 data,
15343 field,
15344 onChange,
15345 hideLabelFromVision,
15346 markWhenOptional,
15347 validity,
15348 prefix: prefix ? (0, import_element49.createElement)(prefix) : void 0,
15349 suffix: suffix ? (0, import_element49.createElement)(suffix) : void 0
15350 }
15351 }
15352 );
15353 }
15354
15355 // packages/dataviews/build-module/components/dataform-controls/toggle.mjs
15356 var import_components40 = __toESM(require_components(), 1);
15357 var import_element50 = __toESM(require_element(), 1);
15358 var import_jsx_runtime84 = __toESM(require_jsx_runtime(), 1);
15359 var { ValidatedToggleControl } = unlock2(import_components40.privateApis);
15360 function Toggle({
15361 field,
15362 onChange,
15363 data,
15364 hideLabelFromVision,
15365 markWhenOptional,
15366 validity
15367 }) {
15368 const { label, description, getValue, setValue, isValid: isValid2 } = field;
15369 const disabled = field.isDisabled({ item: data, field });
15370 const onChangeControl = (0, import_element50.useCallback)(() => {
15371 onChange(
15372 setValue({ item: data, value: !getValue({ item: data }) })
15373 );
15374 }, [onChange, setValue, data, getValue]);
15375 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
15376 ValidatedToggleControl,
15377 {
15378 required: !!isValid2.required,
15379 markWhenOptional,
15380 customValidity: getCustomValidity(isValid2, validity),
15381 hidden: hideLabelFromVision,
15382 label,
15383 help: description,
15384 checked: getValue({ item: data }),
15385 onChange: onChangeControl,
15386 disabled
15387 }
15388 );
15389 }
15390
15391 // packages/dataviews/build-module/components/dataform-controls/textarea.mjs
15392 var import_components41 = __toESM(require_components(), 1);
15393 var import_element51 = __toESM(require_element(), 1);
15394 var import_jsx_runtime85 = __toESM(require_jsx_runtime(), 1);
15395 var { ValidatedTextareaControl } = unlock2(import_components41.privateApis);
15396 function Textarea({
15397 data,
15398 field,
15399 onChange,
15400 hideLabelFromVision,
15401 markWhenOptional,
15402 config,
15403 validity
15404 }) {
15405 const { rows = 4 } = config || {};
15406 const disabled = field.isDisabled({ item: data, field });
15407 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
15408 const value = field.getValue({ item: data });
15409 const onChangeControl = (0, import_element51.useCallback)(
15410 (newValue) => onChange(setValue({ item: data, value: newValue })),
15411 [data, onChange, setValue]
15412 );
15413 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
15414 ValidatedTextareaControl,
15415 {
15416 required: !!isValid2.required,
15417 markWhenOptional,
15418 customValidity: getCustomValidity(isValid2, validity),
15419 label,
15420 placeholder,
15421 value: value ?? "",
15422 help: description,
15423 onChange: onChangeControl,
15424 rows,
15425 disabled,
15426 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
15427 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0,
15428 __next40pxDefaultSize: true,
15429 hideLabelFromVision
15430 }
15431 );
15432 }
15433
15434 // packages/dataviews/build-module/components/dataform-controls/toggle-group.mjs
15435 var import_components42 = __toESM(require_components(), 1);
15436 var import_element52 = __toESM(require_element(), 1);
15437 var import_jsx_runtime86 = __toESM(require_jsx_runtime(), 1);
15438 var { ValidatedToggleGroupControl } = unlock2(import_components42.privateApis);
15439 function ToggleGroup({
15440 data,
15441 field,
15442 onChange,
15443 hideLabelFromVision,
15444 markWhenOptional,
15445 validity
15446 }) {
15447 const { getValue, setValue, isValid: isValid2 } = field;
15448 const disabled = field.isDisabled({ item: data, field });
15449 const value = getValue({ item: data });
15450 const onChangeControl = (0, import_element52.useCallback)(
15451 (newValue) => onChange(setValue({ item: data, value: newValue })),
15452 [data, onChange, setValue]
15453 );
15454 const { elements, isLoading } = useElements({
15455 elements: field.elements,
15456 getElements: field.getElements
15457 });
15458 if (isLoading) {
15459 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_components42.Spinner, {});
15460 }
15461 if (elements.length === 0) {
15462 return null;
15463 }
15464 const selectedOption = elements.find((el) => el.value === value);
15465 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
15466 ValidatedToggleGroupControl,
15467 {
15468 required: !!field.isValid?.required,
15469 markWhenOptional,
15470 customValidity: getCustomValidity(isValid2, validity),
15471 __next40pxDefaultSize: true,
15472 isBlock: true,
15473 label: field.label,
15474 help: selectedOption?.description || field.description,
15475 onChange: onChangeControl,
15476 value,
15477 hideLabelFromVision,
15478 children: elements.map((el) => /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
15479 import_components42.__experimentalToggleGroupControlOption,
15480 {
15481 label: el.label,
15482 value: el.value,
15483 disabled
15484 },
15485 el.value
15486 ))
15487 }
15488 );
15489 }
15490
15491 // packages/dataviews/build-module/components/dataform-controls/array.mjs
15492 var import_components43 = __toESM(require_components(), 1);
15493 var import_element53 = __toESM(require_element(), 1);
15494 var import_jsx_runtime87 = __toESM(require_jsx_runtime(), 1);
15495 var { ValidatedFormTokenField } = unlock2(import_components43.privateApis);
15496 function ArrayControl({
15497 data,
15498 field,
15499 onChange,
15500 hideLabelFromVision,
15501 markWhenOptional,
15502 validity
15503 }) {
15504 const { label, placeholder, getValue, setValue, isValid: isValid2 } = field;
15505 const value = getValue({ item: data });
15506 const disabled = field.isDisabled({ item: data, field });
15507 const { elements, isLoading } = useElements({
15508 elements: field.elements,
15509 getElements: field.getElements
15510 });
15511 const arrayValueAsElements = (0, import_element53.useMemo)(
15512 () => Array.isArray(value) ? value.map((token) => {
15513 const element = elements?.find(
15514 (suggestion) => suggestion.value === token
15515 );
15516 return element || { value: token, label: token };
15517 }) : [],
15518 [value, elements]
15519 );
15520 const onChangeControl = (0, import_element53.useCallback)(
15521 (tokens) => {
15522 const valueTokens = tokens.map((token) => {
15523 if (typeof token === "object" && "value" in token) {
15524 return token.value;
15525 }
15526 return token;
15527 });
15528 onChange(setValue({ item: data, value: valueTokens }));
15529 },
15530 [onChange, setValue, data]
15531 );
15532 if (isLoading) {
15533 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(import_components43.Spinner, {});
15534 }
15535 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
15536 ValidatedFormTokenField,
15537 {
15538 required: !!isValid2?.required,
15539 markWhenOptional,
15540 customValidity: getCustomValidity(isValid2, validity),
15541 label: hideLabelFromVision ? void 0 : label,
15542 value: arrayValueAsElements,
15543 onChange: onChangeControl,
15544 placeholder,
15545 suggestions: elements?.map((element) => element.value),
15546 disabled,
15547 __experimentalValidateInput: (token) => {
15548 if (field.isValid?.elements && elements) {
15549 return elements.some(
15550 (element) => element.value === token || element.label === token
15551 );
15552 }
15553 return true;
15554 },
15555 __experimentalExpandOnFocus: elements && elements.length > 0,
15556 __experimentalShowHowTo: !field.isValid?.elements,
15557 displayTransform: (token) => {
15558 if (typeof token === "object" && "label" in token) {
15559 return token.label;
15560 }
15561 if (typeof token === "string" && elements) {
15562 const element = elements.find(
15563 (el) => el.value === token
15564 );
15565 return element?.label || token;
15566 }
15567 return token;
15568 },
15569 __experimentalRenderItem: ({ item }) => {
15570 if (typeof item === "string" && elements) {
15571 const element = elements.find(
15572 (el) => el.value === item
15573 );
15574 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)("span", { children: element?.label || item });
15575 }
15576 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)("span", { children: item });
15577 }
15578 }
15579 );
15580 }
15581
15582 // node_modules/colord/index.mjs
15583 var r2 = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) };
15584 var t = function(r3) {
15585 return "string" == typeof r3 ? r3.length > 0 : "number" == typeof r3;
15586 };
15587 var n = function(r3, t2, n2) {
15588 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r3) / n2 + 0;
15589 };
15590 var e = function(r3, t2, n2) {
15591 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r3 > n2 ? n2 : r3 > t2 ? r3 : t2;
15592 };
15593 var u = function(r3) {
15594 return (r3 = isFinite(r3) ? r3 % 360 : 0) > 0 ? r3 : r3 + 360;
15595 };
15596 var a = function(r3) {
15597 return { r: e(r3.r, 0, 255), g: e(r3.g, 0, 255), b: e(r3.b, 0, 255), a: e(r3.a) };
15598 };
15599 var o = function(r3) {
15600 return { r: n(r3.r), g: n(r3.g), b: n(r3.b), a: n(r3.a, 3) };
15601 };
15602 var i = /^#([0-9a-f]{3,8})$/i;
15603 var s = function(r3) {
15604 var t2 = r3.toString(16);
15605 return t2.length < 2 ? "0" + t2 : t2;
15606 };
15607 var h = function(r3) {
15608 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;
15609 return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 };
15610 };
15611 var b = function(r3) {
15612 var t2 = r3.h, n2 = r3.s, e2 = r3.v, u2 = r3.a;
15613 t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100;
15614 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;
15615 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 };
15616 };
15617 var g = function(r3) {
15618 return { h: u(r3.h), s: e(r3.s, 0, 100), l: e(r3.l, 0, 100), a: e(r3.a) };
15619 };
15620 var d = function(r3) {
15621 return { h: n(r3.h), s: n(r3.s), l: n(r3.l), a: n(r3.a, 3) };
15622 };
15623 var f = function(r3) {
15624 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 }));
15625 var t2, n2, e2;
15626 };
15627 var c = function(r3) {
15628 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 };
15629 var t2, n2, e2, u2;
15630 };
15631 var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15632 var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15633 var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15634 var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15635 var y = { string: [[function(r3) {
15636 var t2 = i.exec(r3);
15637 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;
15638 }, "hex"], [function(r3) {
15639 var t2 = v.exec(r3) || m.exec(r3);
15640 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;
15641 }, "rgb"], [function(t2) {
15642 var n2 = l.exec(t2) || p.exec(t2);
15643 if (!n2) return null;
15644 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) });
15645 return f(a2);
15646 }, "hsl"]], object: [[function(r3) {
15647 var n2 = r3.r, e2 = r3.g, u2 = r3.b, o2 = r3.a, i2 = void 0 === o2 ? 1 : o2;
15648 return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null;
15649 }, "rgb"], [function(r3) {
15650 var n2 = r3.h, e2 = r3.s, u2 = r3.l, a2 = r3.a, o2 = void 0 === a2 ? 1 : a2;
15651 if (!t(n2) || !t(e2) || !t(u2)) return null;
15652 var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) });
15653 return f(i2);
15654 }, "hsl"], [function(r3) {
15655 var n2 = r3.h, a2 = r3.s, o2 = r3.v, i2 = r3.a, s2 = void 0 === i2 ? 1 : i2;
15656 if (!t(n2) || !t(a2) || !t(o2)) return null;
15657 var h2 = (function(r4) {
15658 return { h: u(r4.h), s: e(r4.s, 0, 100), v: e(r4.v, 0, 100), a: e(r4.a) };
15659 })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) });
15660 return b(h2);
15661 }, "hsv"]] };
15662 var N = function(r3, t2) {
15663 for (var n2 = 0; n2 < t2.length; n2++) {
15664 var e2 = t2[n2][0](r3);
15665 if (e2) return [e2, t2[n2][1]];
15666 }
15667 return [null, void 0];
15668 };
15669 var x = function(r3) {
15670 return "string" == typeof r3 ? N(r3.trim(), y.string) : "object" == typeof r3 && null !== r3 ? N(r3, y.object) : [null, void 0];
15671 };
15672 var M = function(r3, t2) {
15673 var n2 = c(r3);
15674 return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a };
15675 };
15676 var H = function(r3) {
15677 return (299 * r3.r + 587 * r3.g + 114 * r3.b) / 1e3 / 255;
15678 };
15679 var $ = function(r3, t2) {
15680 var n2 = c(r3);
15681 return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a };
15682 };
15683 var j = (function() {
15684 function r3(r4) {
15685 this.parsed = x(r4)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 };
15686 }
15687 return r3.prototype.isValid = function() {
15688 return null !== this.parsed;
15689 }, r3.prototype.brightness = function() {
15690 return n(H(this.rgba), 2);
15691 }, r3.prototype.isDark = function() {
15692 return H(this.rgba) < 0.5;
15693 }, r3.prototype.isLight = function() {
15694 return H(this.rgba) >= 0.5;
15695 }, r3.prototype.toHex = function() {
15696 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;
15697 var r4, t2, e2, u2, a2, i2;
15698 }, r3.prototype.toRgb = function() {
15699 return o(this.rgba);
15700 }, r3.prototype.toRgbString = function() {
15701 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 + ")";
15702 var r4, t2, n2, e2, u2;
15703 }, r3.prototype.toHsl = function() {
15704 return d(c(this.rgba));
15705 }, r3.prototype.toHslString = function() {
15706 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 + "%)";
15707 var r4, t2, n2, e2, u2;
15708 }, r3.prototype.toHsv = function() {
15709 return r4 = h(this.rgba), { h: n(r4.h), s: n(r4.s), v: n(r4.v), a: n(r4.a, 3) };
15710 var r4;
15711 }, r3.prototype.invert = function() {
15712 return w({ r: 255 - (r4 = this.rgba).r, g: 255 - r4.g, b: 255 - r4.b, a: r4.a });
15713 var r4;
15714 }, r3.prototype.saturate = function(r4) {
15715 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, r4));
15716 }, r3.prototype.desaturate = function(r4) {
15717 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, -r4));
15718 }, r3.prototype.grayscale = function() {
15719 return w(M(this.rgba, -1));
15720 }, r3.prototype.lighten = function(r4) {
15721 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, r4));
15722 }, r3.prototype.darken = function(r4) {
15723 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, -r4));
15724 }, r3.prototype.rotate = function(r4) {
15725 return void 0 === r4 && (r4 = 15), this.hue(this.hue() + r4);
15726 }, r3.prototype.alpha = function(r4) {
15727 return "number" == typeof r4 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r4 }) : n(this.rgba.a, 3);
15728 var t2;
15729 }, r3.prototype.hue = function(r4) {
15730 var t2 = c(this.rgba);
15731 return "number" == typeof r4 ? w({ h: r4, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h);
15732 }, r3.prototype.isEqual = function(r4) {
15733 return this.toHex() === w(r4).toHex();
15734 }, r3;
15735 })();
15736 var w = function(r3) {
15737 return r3 instanceof j ? r3 : new j(r3);
15738 };
15739
15740 // packages/dataviews/build-module/components/dataform-controls/color.mjs
15741 var import_components44 = __toESM(require_components(), 1);
15742 var import_element54 = __toESM(require_element(), 1);
15743 var import_i18n35 = __toESM(require_i18n(), 1);
15744 var import_jsx_runtime88 = __toESM(require_jsx_runtime(), 1);
15745 var { ValidatedInputControl: ValidatedInputControl3 } = unlock2(import_components44.privateApis);
15746 var ColorPickerDropdown = ({
15747 color,
15748 onColorChange,
15749 disabled
15750 }) => {
15751 const validColor = color && w(color).isValid() ? color : "#ffffff";
15752 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15753 import_components44.Dropdown,
15754 {
15755 className: "dataviews-controls__color-picker-dropdown",
15756 popoverProps: { resize: false },
15757 renderToggle: ({ onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15758 import_components44.Button,
15759 {
15760 onClick: onToggle,
15761 "aria-label": (0, import_i18n35.__)("Open color picker"),
15762 size: "small",
15763 disabled,
15764 accessibleWhenDisabled: true,
15765 icon: () => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.ColorIndicator, { colorValue: validColor })
15766 }
15767 ),
15768 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.__experimentalDropdownContentWrapper, { paddingSize: "none", children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15769 import_components44.ColorPicker,
15770 {
15771 color: validColor,
15772 onChange: onColorChange,
15773 enableAlpha: true
15774 }
15775 ) })
15776 }
15777 );
15778 };
15779 function Color({
15780 data,
15781 field,
15782 onChange,
15783 hideLabelFromVision,
15784 markWhenOptional,
15785 validity
15786 }) {
15787 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
15788 const disabled = field.isDisabled({ item: data, field });
15789 const value = field.getValue({ item: data }) || "";
15790 const handleColorChange = (0, import_element54.useCallback)(
15791 (newColor) => {
15792 onChange(setValue({ item: data, value: newColor }));
15793 },
15794 [data, onChange, setValue]
15795 );
15796 const handleInputChange = (0, import_element54.useCallback)(
15797 (newValue) => {
15798 onChange(setValue({ item: data, value: newValue || "" }));
15799 },
15800 [data, onChange, setValue]
15801 );
15802 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15803 ValidatedInputControl3,
15804 {
15805 required: !!field.isValid?.required,
15806 markWhenOptional,
15807 customValidity: getCustomValidity(isValid2, validity),
15808 label,
15809 placeholder,
15810 value,
15811 help: description,
15812 onChange: handleInputChange,
15813 hideLabelFromVision,
15814 type: "text",
15815 disabled,
15816 prefix: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.__experimentalInputControlPrefixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15817 ColorPickerDropdown,
15818 {
15819 color: value,
15820 onColorChange: handleColorChange,
15821 disabled
15822 }
15823 ) })
15824 }
15825 );
15826 }
15827
15828 // packages/dataviews/build-module/components/dataform-controls/password.mjs
15829 var import_components45 = __toESM(require_components(), 1);
15830 var import_element55 = __toESM(require_element(), 1);
15831 var import_i18n36 = __toESM(require_i18n(), 1);
15832 var import_jsx_runtime89 = __toESM(require_jsx_runtime(), 1);
15833 function Password({
15834 data,
15835 field,
15836 onChange,
15837 hideLabelFromVision,
15838 markWhenOptional,
15839 validity
15840 }) {
15841 const [isVisible2, setIsVisible] = (0, import_element55.useState)(false);
15842 const disabled = field.isDisabled({ item: data, field });
15843 const toggleVisibility = (0, import_element55.useCallback)(() => {
15844 setIsVisible((prev) => !prev);
15845 }, []);
15846 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(
15847 ValidatedText,
15848 {
15849 ...{
15850 data,
15851 field,
15852 onChange,
15853 hideLabelFromVision,
15854 markWhenOptional,
15855 validity,
15856 type: isVisible2 ? "text" : "password",
15857 suffix: /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(import_components45.__experimentalInputControlSuffixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(
15858 import_components45.Button,
15859 {
15860 icon: isVisible2 ? unseen_default : seen_default,
15861 onClick: toggleVisibility,
15862 size: "small",
15863 label: isVisible2 ? (0, import_i18n36.__)("Hide password") : (0, import_i18n36.__)("Show password"),
15864 disabled,
15865 accessibleWhenDisabled: true
15866 }
15867 ) })
15868 }
15869 }
15870 );
15871 }
15872
15873 // packages/dataviews/build-module/field-types/utils/has-elements.mjs
15874 function hasElements(field) {
15875 return Array.isArray(field.elements) && field.elements.length > 0 || typeof field.getElements === "function";
15876 }
15877
15878 // packages/dataviews/build-module/components/dataform-controls/index.mjs
15879 var import_jsx_runtime90 = __toESM(require_jsx_runtime(), 1);
15880 var FORM_CONTROLS = {
15881 adaptiveSelect: AdaptiveSelect,
15882 array: ArrayControl,
15883 checkbox: Checkbox,
15884 color: Color,
15885 combobox: Combobox3,
15886 datetime: DateTime,
15887 date: DateControl,
15888 email: Email,
15889 telephone: Telephone,
15890 url: Url,
15891 integer: Integer,
15892 number: Number2,
15893 password: Password,
15894 radio: Radio,
15895 select: Select,
15896 text: Text,
15897 toggle: Toggle,
15898 textarea: Textarea,
15899 toggleGroup: ToggleGroup
15900 };
15901 function isEditConfig(value) {
15902 return value && typeof value === "object" && typeof value.control === "string";
15903 }
15904 function createConfiguredControl(config) {
15905 const { control, ...controlConfig } = config;
15906 const BaseControlType = getControlByType(control);
15907 if (BaseControlType === null) {
15908 return null;
15909 }
15910 return function ConfiguredControl(props) {
15911 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(BaseControlType, { ...props, config: controlConfig });
15912 };
15913 }
15914 function getControl(field, fallback) {
15915 if (typeof field.Edit === "function") {
15916 return field.Edit;
15917 }
15918 if (typeof field.Edit === "string") {
15919 return getControlByType(field.Edit);
15920 }
15921 if (isEditConfig(field.Edit)) {
15922 return createConfiguredControl(field.Edit);
15923 }
15924 if (hasElements(field) && field.type !== "array") {
15925 return getControlByType("adaptiveSelect");
15926 }
15927 if (fallback === null) {
15928 return null;
15929 }
15930 return getControlByType(fallback);
15931 }
15932 function getControlByType(type) {
15933 if (Object.keys(FORM_CONTROLS).includes(type)) {
15934 return FORM_CONTROLS[type];
15935 }
15936 return null;
15937 }
15938
15939 // packages/dataviews/build-module/field-types/utils/get-filter-by.mjs
15940 function getFilterBy(field, defaultOperators, validOperators) {
15941 if (field.filterBy === false) {
15942 return false;
15943 }
15944 const operators = field.filterBy?.operators?.filter(
15945 (op) => validOperators.includes(op)
15946 ) ?? defaultOperators;
15947 if (operators.length === 0) {
15948 return false;
15949 }
15950 return {
15951 isPrimary: !!field.filterBy?.isPrimary,
15952 operators
15953 };
15954 }
15955 var get_filter_by_default = getFilterBy;
15956
15957 // packages/dataviews/build-module/field-types/utils/get-value-from-id.mjs
15958 var getValueFromId = (id) => ({ item }) => {
15959 const path = id.split(".");
15960 let value = item;
15961 for (const segment of path) {
15962 if (value.hasOwnProperty(segment)) {
15963 value = value[segment];
15964 } else {
15965 value = void 0;
15966 }
15967 }
15968 return value;
15969 };
15970 var get_value_from_id_default = getValueFromId;
15971
15972 // packages/dataviews/build-module/field-types/utils/set-value-from-id.mjs
15973 var setValueFromId = (id) => ({ value }) => {
15974 const path = id.split(".");
15975 const result = {};
15976 let current = result;
15977 for (const segment of path.slice(0, -1)) {
15978 current[segment] = {};
15979 current = current[segment];
15980 }
15981 current[path.at(-1)] = value;
15982 return result;
15983 };
15984 var set_value_from_id_default = setValueFromId;
15985
15986 // packages/dataviews/build-module/field-types/email.mjs
15987 var import_i18n37 = __toESM(require_i18n(), 1);
15988
15989 // packages/dataviews/build-module/field-types/utils/render-from-elements.mjs
15990 function RenderFromElements({
15991 item,
15992 field
15993 }) {
15994 const { elements, isLoading } = useElements({
15995 elements: field.elements,
15996 getElements: field.getElements
15997 });
15998 const value = field.getValue({ item });
15999 if (isLoading) {
16000 return value;
16001 }
16002 if (elements.length === 0) {
16003 return value;
16004 }
16005 return elements?.find((element) => element.value === value)?.label || field.getValue({ item });
16006 }
16007
16008 // packages/dataviews/build-module/field-types/utils/render-default.mjs
16009 var import_jsx_runtime91 = __toESM(require_jsx_runtime(), 1);
16010 function render({
16011 item,
16012 field
16013 }) {
16014 if (field.hasElements) {
16015 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(RenderFromElements, { item, field });
16016 }
16017 return field.getValueFormatted({ item, field });
16018 }
16019
16020 // packages/dataviews/build-module/field-types/utils/sort-text.mjs
16021 var sort_text_default = (a2, b2, direction) => {
16022 return direction === "asc" ? a2.localeCompare(b2) : b2.localeCompare(a2);
16023 };
16024
16025 // packages/dataviews/build-module/field-types/utils/is-valid-required.mjs
16026 function isValidRequired(item, field) {
16027 const value = field.getValue({ item });
16028 return ![void 0, "", null].includes(value);
16029 }
16030
16031 // packages/dataviews/build-module/field-types/utils/is-valid-min-length.mjs
16032 function isValidMinLength(item, field) {
16033 if (typeof field.isValid.minLength?.constraint !== "number") {
16034 return false;
16035 }
16036 const value = field.getValue({ item });
16037 if ([void 0, "", null].includes(value)) {
16038 return true;
16039 }
16040 return String(value).length >= field.isValid.minLength.constraint;
16041 }
16042
16043 // packages/dataviews/build-module/field-types/utils/is-valid-max-length.mjs
16044 function isValidMaxLength(item, field) {
16045 if (typeof field.isValid.maxLength?.constraint !== "number") {
16046 return false;
16047 }
16048 const value = field.getValue({ item });
16049 if ([void 0, "", null].includes(value)) {
16050 return true;
16051 }
16052 return String(value).length <= field.isValid.maxLength.constraint;
16053 }
16054
16055 // packages/dataviews/build-module/field-types/utils/is-valid-pattern.mjs
16056 function isValidPattern(item, field) {
16057 if (field.isValid.pattern?.constraint === void 0) {
16058 return true;
16059 }
16060 try {
16061 const regexp = new RegExp(field.isValid.pattern.constraint);
16062 const value = field.getValue({ item });
16063 if ([void 0, "", null].includes(value)) {
16064 return true;
16065 }
16066 return regexp.test(String(value));
16067 } catch {
16068 return false;
16069 }
16070 }
16071
16072 // packages/dataviews/build-module/field-types/utils/is-valid-elements.mjs
16073 function isValidElements(item, field) {
16074 const elements = field.elements ?? [];
16075 const validValues = elements.map((el) => el.value);
16076 if (validValues.length === 0) {
16077 return true;
16078 }
16079 const value = field.getValue({ item });
16080 return [].concat(value).every((v2) => validValues.includes(v2));
16081 }
16082
16083 // packages/dataviews/build-module/field-types/utils/get-value-formatted-default.mjs
16084 function getValueFormatted({
16085 item,
16086 field
16087 }) {
16088 return field.getValue({ item });
16089 }
16090 var get_value_formatted_default_default = getValueFormatted;
16091
16092 // packages/dataviews/build-module/field-types/email.mjs
16093 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])?)*$/;
16094 function isValidCustom(item, field) {
16095 const value = field.getValue({ item });
16096 if (![void 0, "", null].includes(value) && !emailRegex.test(value)) {
16097 return (0, import_i18n37.__)("Value must be a valid email address.");
16098 }
16099 return null;
16100 }
16101 var email_default = {
16102 type: "email",
16103 render,
16104 Edit: "email",
16105 sort: sort_text_default,
16106 enableSorting: true,
16107 enableGlobalSearch: false,
16108 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16109 validOperators: [
16110 OPERATOR_IS,
16111 OPERATOR_IS_NOT,
16112 OPERATOR_CONTAINS,
16113 OPERATOR_NOT_CONTAINS,
16114 OPERATOR_STARTS_WITH,
16115 // Multiple selection
16116 OPERATOR_IS_ANY,
16117 OPERATOR_IS_NONE,
16118 OPERATOR_IS_ALL,
16119 OPERATOR_IS_NOT_ALL
16120 ],
16121 format: {},
16122 getValueFormatted: get_value_formatted_default_default,
16123 validate: {
16124 required: isValidRequired,
16125 pattern: isValidPattern,
16126 minLength: isValidMinLength,
16127 maxLength: isValidMaxLength,
16128 elements: isValidElements,
16129 custom: isValidCustom
16130 }
16131 };
16132
16133 // packages/dataviews/build-module/field-types/integer.mjs
16134 var import_i18n38 = __toESM(require_i18n(), 1);
16135
16136 // packages/dataviews/build-module/field-types/utils/sort-number.mjs
16137 var sort_number_default = (a2, b2, direction) => {
16138 return direction === "asc" ? a2 - b2 : b2 - a2;
16139 };
16140
16141 // packages/dataviews/build-module/field-types/utils/is-valid-min.mjs
16142 function isValidMin(item, field) {
16143 if (typeof field.isValid.min?.constraint !== "number") {
16144 return false;
16145 }
16146 const value = field.getValue({ item });
16147 if ([void 0, "", null].includes(value)) {
16148 return true;
16149 }
16150 return Number(value) >= field.isValid.min.constraint;
16151 }
16152
16153 // packages/dataviews/build-module/field-types/utils/is-valid-max.mjs
16154 function isValidMax(item, field) {
16155 if (typeof field.isValid.max?.constraint !== "number") {
16156 return false;
16157 }
16158 const value = field.getValue({ item });
16159 if ([void 0, "", null].includes(value)) {
16160 return true;
16161 }
16162 return Number(value) <= field.isValid.max.constraint;
16163 }
16164
16165 // packages/dataviews/build-module/field-types/integer.mjs
16166 var format2 = {
16167 separatorThousand: ","
16168 };
16169 function getValueFormatted2({
16170 item,
16171 field
16172 }) {
16173 let value = field.getValue({ item });
16174 if (value === null || value === void 0) {
16175 return "";
16176 }
16177 value = Number(value);
16178 if (!Number.isFinite(value)) {
16179 return String(value);
16180 }
16181 let formatInteger;
16182 if (field.type !== "integer") {
16183 formatInteger = format2;
16184 } else {
16185 formatInteger = field.format;
16186 }
16187 const { separatorThousand } = formatInteger;
16188 const integerValue = Math.trunc(value);
16189 if (!separatorThousand) {
16190 return String(integerValue);
16191 }
16192 return String(integerValue).replace(
16193 /\B(?=(\d{3})+(?!\d))/g,
16194 separatorThousand
16195 );
16196 }
16197 function isValidCustom2(item, field) {
16198 const value = field.getValue({ item });
16199 if (![void 0, "", null].includes(value) && !Number.isInteger(value)) {
16200 return (0, import_i18n38.__)("Value must be an integer.");
16201 }
16202 return null;
16203 }
16204 var integer_default = {
16205 type: "integer",
16206 render,
16207 Edit: "integer",
16208 sort: sort_number_default,
16209 enableSorting: true,
16210 enableGlobalSearch: false,
16211 defaultOperators: [
16212 OPERATOR_IS,
16213 OPERATOR_IS_NOT,
16214 OPERATOR_LESS_THAN,
16215 OPERATOR_GREATER_THAN,
16216 OPERATOR_LESS_THAN_OR_EQUAL,
16217 OPERATOR_GREATER_THAN_OR_EQUAL,
16218 OPERATOR_BETWEEN
16219 ],
16220 validOperators: [
16221 // Single-selection
16222 OPERATOR_IS,
16223 OPERATOR_IS_NOT,
16224 OPERATOR_LESS_THAN,
16225 OPERATOR_GREATER_THAN,
16226 OPERATOR_LESS_THAN_OR_EQUAL,
16227 OPERATOR_GREATER_THAN_OR_EQUAL,
16228 OPERATOR_BETWEEN,
16229 // Multiple-selection
16230 OPERATOR_IS_ANY,
16231 OPERATOR_IS_NONE,
16232 OPERATOR_IS_ALL,
16233 OPERATOR_IS_NOT_ALL
16234 ],
16235 format: format2,
16236 getValueFormatted: getValueFormatted2,
16237 validate: {
16238 required: isValidRequired,
16239 min: isValidMin,
16240 max: isValidMax,
16241 elements: isValidElements,
16242 custom: isValidCustom2
16243 }
16244 };
16245
16246 // packages/dataviews/build-module/field-types/number.mjs
16247 var import_i18n39 = __toESM(require_i18n(), 1);
16248 var format3 = {
16249 separatorThousand: ",",
16250 separatorDecimal: ".",
16251 decimals: 2
16252 };
16253 function getValueFormatted3({
16254 item,
16255 field
16256 }) {
16257 let value = field.getValue({ item });
16258 if (value === null || value === void 0) {
16259 return "";
16260 }
16261 value = Number(value);
16262 if (!Number.isFinite(value)) {
16263 return String(value);
16264 }
16265 let formatNumber;
16266 if (field.type !== "number") {
16267 formatNumber = format3;
16268 } else {
16269 formatNumber = field.format;
16270 }
16271 const { separatorThousand, separatorDecimal, decimals } = formatNumber;
16272 const fixedValue = value.toFixed(decimals);
16273 const [integerPart, decimalPart] = fixedValue.split(".");
16274 const formattedInteger = separatorThousand ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separatorThousand) : integerPart;
16275 return decimals === 0 ? formattedInteger : formattedInteger + separatorDecimal + decimalPart;
16276 }
16277 function isEmpty2(value) {
16278 return value === "" || value === void 0 || value === null;
16279 }
16280 function isValidCustom3(item, field) {
16281 const value = field.getValue({ item });
16282 if (!isEmpty2(value) && !Number.isFinite(value)) {
16283 return (0, import_i18n39.__)("Value must be a number.");
16284 }
16285 return null;
16286 }
16287 var number_default = {
16288 type: "number",
16289 render,
16290 Edit: "number",
16291 sort: sort_number_default,
16292 enableSorting: true,
16293 enableGlobalSearch: false,
16294 defaultOperators: [
16295 OPERATOR_IS,
16296 OPERATOR_IS_NOT,
16297 OPERATOR_LESS_THAN,
16298 OPERATOR_GREATER_THAN,
16299 OPERATOR_LESS_THAN_OR_EQUAL,
16300 OPERATOR_GREATER_THAN_OR_EQUAL,
16301 OPERATOR_BETWEEN
16302 ],
16303 validOperators: [
16304 // Single-selection
16305 OPERATOR_IS,
16306 OPERATOR_IS_NOT,
16307 OPERATOR_LESS_THAN,
16308 OPERATOR_GREATER_THAN,
16309 OPERATOR_LESS_THAN_OR_EQUAL,
16310 OPERATOR_GREATER_THAN_OR_EQUAL,
16311 OPERATOR_BETWEEN,
16312 // Multiple-selection
16313 OPERATOR_IS_ANY,
16314 OPERATOR_IS_NONE,
16315 OPERATOR_IS_ALL,
16316 OPERATOR_IS_NOT_ALL
16317 ],
16318 format: format3,
16319 getValueFormatted: getValueFormatted3,
16320 validate: {
16321 required: isValidRequired,
16322 min: isValidMin,
16323 max: isValidMax,
16324 elements: isValidElements,
16325 custom: isValidCustom3
16326 }
16327 };
16328
16329 // packages/dataviews/build-module/field-types/text.mjs
16330 var text_default = {
16331 type: "text",
16332 render,
16333 Edit: "text",
16334 sort: sort_text_default,
16335 enableSorting: true,
16336 enableGlobalSearch: false,
16337 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16338 validOperators: [
16339 // Single selection
16340 OPERATOR_IS,
16341 OPERATOR_IS_NOT,
16342 OPERATOR_CONTAINS,
16343 OPERATOR_NOT_CONTAINS,
16344 OPERATOR_STARTS_WITH,
16345 // Multiple selection
16346 OPERATOR_IS_ANY,
16347 OPERATOR_IS_NONE,
16348 OPERATOR_IS_ALL,
16349 OPERATOR_IS_NOT_ALL
16350 ],
16351 format: {},
16352 getValueFormatted: get_value_formatted_default_default,
16353 validate: {
16354 required: isValidRequired,
16355 pattern: isValidPattern,
16356 minLength: isValidMinLength,
16357 maxLength: isValidMaxLength,
16358 elements: isValidElements
16359 }
16360 };
16361
16362 // packages/dataviews/build-module/field-types/datetime.mjs
16363 var import_date7 = __toESM(require_date(), 1);
16364
16365 // packages/dataviews/build-module/field-types/utils/is-valid-date-boundary.mjs
16366 var import_date6 = __toESM(require_date(), 1);
16367 function parseDateLike(value) {
16368 if (!value) {
16369 return null;
16370 }
16371 if (!isValid(new Date(value))) {
16372 return null;
16373 }
16374 const parsed = (0, import_date6.getDate)(value);
16375 return parsed && isValid(parsed) ? parsed : null;
16376 }
16377 function validateDateLikeBoundary(item, field, boundary) {
16378 const constraint = field.isValid[boundary]?.constraint;
16379 if (typeof constraint !== "string") {
16380 return false;
16381 }
16382 const value = field.getValue({ item });
16383 const boundaryValue = Array.isArray(value) ? value[boundary === "min" ? 0 : value.length - 1] : value;
16384 if (boundaryValue === void 0 || boundaryValue === null || boundaryValue === "") {
16385 return true;
16386 }
16387 const parsedConstraint = parseDateLike(constraint);
16388 const parsedValue = parseDateLike(String(boundaryValue));
16389 return !!parsedConstraint && !!parsedValue && (boundary === "min" ? parsedValue.getTime() >= parsedConstraint.getTime() : parsedValue.getTime() <= parsedConstraint.getTime());
16390 }
16391 function isValidMinDate(item, field) {
16392 return validateDateLikeBoundary(item, field, "min");
16393 }
16394 function isValidMaxDate(item, field) {
16395 return validateDateLikeBoundary(item, field, "max");
16396 }
16397
16398 // packages/dataviews/build-module/field-types/datetime.mjs
16399 var format4 = {
16400 datetime: (0, import_date7.getSettings)().formats.datetime,
16401 weekStartsOn: (0, import_date7.getSettings)().l10n.startOfWeek
16402 };
16403 function getValueFormatted4({
16404 item,
16405 field
16406 }) {
16407 const value = field.getValue({ item });
16408 if (["", void 0, null].includes(value)) {
16409 return "";
16410 }
16411 let formatDatetime;
16412 if (field.type !== "datetime") {
16413 formatDatetime = format4;
16414 } else {
16415 formatDatetime = field.format;
16416 }
16417 return (0, import_date7.dateI18n)(formatDatetime.datetime, (0, import_date7.getDate)(value));
16418 }
16419 var sort = (a2, b2, direction) => {
16420 const timeA = new Date(a2).getTime();
16421 const timeB = new Date(b2).getTime();
16422 return direction === "asc" ? timeA - timeB : timeB - timeA;
16423 };
16424 var datetime_default = {
16425 type: "datetime",
16426 render,
16427 Edit: "datetime",
16428 sort,
16429 enableSorting: true,
16430 enableGlobalSearch: false,
16431 defaultOperators: [
16432 OPERATOR_ON,
16433 OPERATOR_NOT_ON,
16434 OPERATOR_BEFORE,
16435 OPERATOR_AFTER,
16436 OPERATOR_BEFORE_INC,
16437 OPERATOR_AFTER_INC,
16438 OPERATOR_IN_THE_PAST,
16439 OPERATOR_OVER
16440 ],
16441 validOperators: [
16442 OPERATOR_ON,
16443 OPERATOR_NOT_ON,
16444 OPERATOR_BEFORE,
16445 OPERATOR_AFTER,
16446 OPERATOR_BEFORE_INC,
16447 OPERATOR_AFTER_INC,
16448 OPERATOR_IN_THE_PAST,
16449 OPERATOR_OVER
16450 ],
16451 format: format4,
16452 getValueFormatted: getValueFormatted4,
16453 validate: {
16454 required: isValidRequired,
16455 elements: isValidElements,
16456 min: isValidMinDate,
16457 max: isValidMaxDate
16458 }
16459 };
16460
16461 // packages/dataviews/build-module/field-types/date.mjs
16462 var import_date8 = __toESM(require_date(), 1);
16463 var format5 = {
16464 date: (0, import_date8.getSettings)().formats.date,
16465 weekStartsOn: (0, import_date8.getSettings)().l10n.startOfWeek
16466 };
16467 function getValueFormatted5({
16468 item,
16469 field
16470 }) {
16471 const value = field.getValue({ item });
16472 if (["", void 0, null].includes(value)) {
16473 return "";
16474 }
16475 let formatDate2;
16476 if (field.type !== "date") {
16477 formatDate2 = format5;
16478 } else {
16479 formatDate2 = field.format;
16480 }
16481 return (0, import_date8.dateI18n)(formatDate2.date, (0, import_date8.getDate)(value));
16482 }
16483 var sort2 = (a2, b2, direction) => {
16484 const timeA = new Date(a2).getTime();
16485 const timeB = new Date(b2).getTime();
16486 return direction === "asc" ? timeA - timeB : timeB - timeA;
16487 };
16488 var date_default = {
16489 type: "date",
16490 render,
16491 Edit: "date",
16492 sort: sort2,
16493 enableSorting: true,
16494 enableGlobalSearch: false,
16495 defaultOperators: [
16496 OPERATOR_ON,
16497 OPERATOR_NOT_ON,
16498 OPERATOR_BEFORE,
16499 OPERATOR_AFTER,
16500 OPERATOR_BEFORE_INC,
16501 OPERATOR_AFTER_INC,
16502 OPERATOR_IN_THE_PAST,
16503 OPERATOR_OVER,
16504 OPERATOR_BETWEEN
16505 ],
16506 validOperators: [
16507 OPERATOR_ON,
16508 OPERATOR_NOT_ON,
16509 OPERATOR_BEFORE,
16510 OPERATOR_AFTER,
16511 OPERATOR_BEFORE_INC,
16512 OPERATOR_AFTER_INC,
16513 OPERATOR_IN_THE_PAST,
16514 OPERATOR_OVER,
16515 OPERATOR_BETWEEN
16516 ],
16517 format: format5,
16518 getValueFormatted: getValueFormatted5,
16519 validate: {
16520 required: isValidRequired,
16521 elements: isValidElements,
16522 min: isValidMinDate,
16523 max: isValidMaxDate
16524 }
16525 };
16526
16527 // packages/dataviews/build-module/field-types/boolean.mjs
16528 var import_i18n40 = __toESM(require_i18n(), 1);
16529
16530 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-bool.mjs
16531 function isValidRequiredForBool(item, field) {
16532 const value = field.getValue({ item });
16533 return value === true;
16534 }
16535
16536 // packages/dataviews/build-module/field-types/boolean.mjs
16537 function getValueFormatted6({
16538 item,
16539 field
16540 }) {
16541 const value = field.getValue({ item });
16542 if (value === true) {
16543 return (0, import_i18n40.__)("True");
16544 }
16545 if (value === false) {
16546 return (0, import_i18n40.__)("False");
16547 }
16548 return "";
16549 }
16550 function isValidCustom4(item, field) {
16551 const value = field.getValue({ item });
16552 if (![void 0, "", null].includes(value) && ![true, false].includes(value)) {
16553 return (0, import_i18n40.__)("Value must be true, false, or undefined");
16554 }
16555 return null;
16556 }
16557 var sort3 = (a2, b2, direction) => {
16558 const boolA = Boolean(a2);
16559 const boolB = Boolean(b2);
16560 if (boolA === boolB) {
16561 return 0;
16562 }
16563 if (direction === "asc") {
16564 return boolA ? 1 : -1;
16565 }
16566 return boolA ? -1 : 1;
16567 };
16568 var boolean_default = {
16569 type: "boolean",
16570 render,
16571 Edit: "checkbox",
16572 sort: sort3,
16573 validate: {
16574 required: isValidRequiredForBool,
16575 elements: isValidElements,
16576 custom: isValidCustom4
16577 },
16578 enableSorting: true,
16579 enableGlobalSearch: false,
16580 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
16581 validOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
16582 format: {},
16583 getValueFormatted: getValueFormatted6
16584 };
16585
16586 // packages/dataviews/build-module/field-types/media.mjs
16587 var media_default = {
16588 type: "media",
16589 render: () => null,
16590 Edit: null,
16591 sort: () => 0,
16592 enableSorting: false,
16593 enableGlobalSearch: false,
16594 defaultOperators: [],
16595 validOperators: [],
16596 format: {},
16597 getValueFormatted: get_value_formatted_default_default,
16598 // cannot validate any constraint, so
16599 // the only available validation for the field author
16600 // would be providing a custom validator.
16601 validate: {}
16602 };
16603
16604 // packages/dataviews/build-module/field-types/array.mjs
16605 var import_i18n41 = __toESM(require_i18n(), 1);
16606
16607 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-array.mjs
16608 function isValidRequiredForArray(item, field) {
16609 const value = field.getValue({ item });
16610 return Array.isArray(value) && value.length > 0 && value.every(
16611 (element) => ![void 0, "", null].includes(element)
16612 );
16613 }
16614
16615 // packages/dataviews/build-module/field-types/array.mjs
16616 function getValueFormatted7({
16617 item,
16618 field
16619 }) {
16620 const value = field.getValue({ item });
16621 const arr = Array.isArray(value) ? value : [];
16622 return arr.join(", ");
16623 }
16624 function render2({ item, field }) {
16625 return getValueFormatted7({ item, field });
16626 }
16627 function isValidCustom5(item, field) {
16628 const value = field.getValue({ item });
16629 if (![void 0, "", null].includes(value) && !Array.isArray(value)) {
16630 return (0, import_i18n41.__)("Value must be an array.");
16631 }
16632 if (!value.every((v2) => typeof v2 === "string")) {
16633 return (0, import_i18n41.__)("Every value must be a string.");
16634 }
16635 return null;
16636 }
16637 var sort4 = (a2, b2, direction) => {
16638 const arrA = Array.isArray(a2) ? a2 : [];
16639 const arrB = Array.isArray(b2) ? b2 : [];
16640 if (arrA.length !== arrB.length) {
16641 return direction === "asc" ? arrA.length - arrB.length : arrB.length - arrA.length;
16642 }
16643 const joinedA = arrA.join(",");
16644 const joinedB = arrB.join(",");
16645 return direction === "asc" ? joinedA.localeCompare(joinedB) : joinedB.localeCompare(joinedA);
16646 };
16647 var array_default = {
16648 type: "array",
16649 render: render2,
16650 Edit: "array",
16651 sort: sort4,
16652 enableSorting: true,
16653 enableGlobalSearch: false,
16654 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16655 validOperators: [
16656 OPERATOR_IS_ANY,
16657 OPERATOR_IS_NONE,
16658 OPERATOR_IS_ALL,
16659 OPERATOR_IS_NOT_ALL
16660 ],
16661 format: {},
16662 getValueFormatted: getValueFormatted7,
16663 validate: {
16664 required: isValidRequiredForArray,
16665 elements: isValidElements,
16666 custom: isValidCustom5
16667 }
16668 };
16669
16670 // packages/dataviews/build-module/field-types/password.mjs
16671 function getValueFormatted8({
16672 item,
16673 field
16674 }) {
16675 return field.getValue({ item }) ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : "";
16676 }
16677 var password_default = {
16678 type: "password",
16679 render,
16680 Edit: "password",
16681 sort: () => 0,
16682 // Passwords should not be sortable for security reasons
16683 enableSorting: false,
16684 enableGlobalSearch: false,
16685 defaultOperators: [],
16686 validOperators: [],
16687 format: {},
16688 getValueFormatted: getValueFormatted8,
16689 validate: {
16690 required: isValidRequired,
16691 pattern: isValidPattern,
16692 minLength: isValidMinLength,
16693 maxLength: isValidMaxLength,
16694 elements: isValidElements
16695 }
16696 };
16697
16698 // packages/dataviews/build-module/field-types/telephone.mjs
16699 var telephone_default = {
16700 type: "telephone",
16701 render,
16702 Edit: "telephone",
16703 sort: sort_text_default,
16704 enableSorting: true,
16705 enableGlobalSearch: false,
16706 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16707 validOperators: [
16708 OPERATOR_IS,
16709 OPERATOR_IS_NOT,
16710 OPERATOR_CONTAINS,
16711 OPERATOR_NOT_CONTAINS,
16712 OPERATOR_STARTS_WITH,
16713 // Multiple selection
16714 OPERATOR_IS_ANY,
16715 OPERATOR_IS_NONE,
16716 OPERATOR_IS_ALL,
16717 OPERATOR_IS_NOT_ALL
16718 ],
16719 format: {},
16720 getValueFormatted: get_value_formatted_default_default,
16721 validate: {
16722 required: isValidRequired,
16723 pattern: isValidPattern,
16724 minLength: isValidMinLength,
16725 maxLength: isValidMaxLength,
16726 elements: isValidElements
16727 }
16728 };
16729
16730 // packages/dataviews/build-module/field-types/color.mjs
16731 var import_i18n42 = __toESM(require_i18n(), 1);
16732 var import_jsx_runtime92 = __toESM(require_jsx_runtime(), 1);
16733 function render3({ item, field }) {
16734 if (field.hasElements) {
16735 return /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(RenderFromElements, { item, field });
16736 }
16737 const value = get_value_formatted_default_default({ item, field });
16738 if (!value || !w(value).isValid()) {
16739 return value;
16740 }
16741 return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
16742 /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
16743 "div",
16744 {
16745 style: {
16746 width: "16px",
16747 height: "16px",
16748 borderRadius: "50%",
16749 backgroundColor: value,
16750 border: "1px solid #ddd",
16751 flexShrink: 0
16752 }
16753 }
16754 ),
16755 /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { children: value })
16756 ] });
16757 }
16758 function isValidCustom6(item, field) {
16759 const value = field.getValue({ item });
16760 if (![void 0, "", null].includes(value) && !w(value).isValid()) {
16761 return (0, import_i18n42.__)("Value must be a valid color.");
16762 }
16763 return null;
16764 }
16765 var sort5 = (a2, b2, direction) => {
16766 const colorA = w(a2);
16767 const colorB = w(b2);
16768 if (!colorA.isValid() && !colorB.isValid()) {
16769 return 0;
16770 }
16771 if (!colorA.isValid()) {
16772 return direction === "asc" ? 1 : -1;
16773 }
16774 if (!colorB.isValid()) {
16775 return direction === "asc" ? -1 : 1;
16776 }
16777 const hslA = colorA.toHsl();
16778 const hslB = colorB.toHsl();
16779 if (hslA.h !== hslB.h) {
16780 return direction === "asc" ? hslA.h - hslB.h : hslB.h - hslA.h;
16781 }
16782 if (hslA.s !== hslB.s) {
16783 return direction === "asc" ? hslA.s - hslB.s : hslB.s - hslA.s;
16784 }
16785 return direction === "asc" ? hslA.l - hslB.l : hslB.l - hslA.l;
16786 };
16787 var color_default = {
16788 type: "color",
16789 render: render3,
16790 Edit: "color",
16791 sort: sort5,
16792 enableSorting: true,
16793 enableGlobalSearch: false,
16794 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16795 validOperators: [
16796 OPERATOR_IS,
16797 OPERATOR_IS_NOT,
16798 OPERATOR_IS_ANY,
16799 OPERATOR_IS_NONE
16800 ],
16801 format: {},
16802 getValueFormatted: get_value_formatted_default_default,
16803 validate: {
16804 required: isValidRequired,
16805 elements: isValidElements,
16806 custom: isValidCustom6
16807 }
16808 };
16809
16810 // packages/dataviews/build-module/field-types/url.mjs
16811 var url_default = {
16812 type: "url",
16813 render,
16814 Edit: "url",
16815 sort: sort_text_default,
16816 enableSorting: true,
16817 enableGlobalSearch: false,
16818 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16819 validOperators: [
16820 OPERATOR_IS,
16821 OPERATOR_IS_NOT,
16822 OPERATOR_CONTAINS,
16823 OPERATOR_NOT_CONTAINS,
16824 OPERATOR_STARTS_WITH,
16825 // Multiple selection
16826 OPERATOR_IS_ANY,
16827 OPERATOR_IS_NONE,
16828 OPERATOR_IS_ALL,
16829 OPERATOR_IS_NOT_ALL
16830 ],
16831 format: {},
16832 getValueFormatted: get_value_formatted_default_default,
16833 validate: {
16834 required: isValidRequired,
16835 pattern: isValidPattern,
16836 minLength: isValidMinLength,
16837 maxLength: isValidMaxLength,
16838 elements: isValidElements
16839 }
16840 };
16841
16842 // packages/dataviews/build-module/field-types/no-type.mjs
16843 var sort6 = (a2, b2, direction) => {
16844 if (typeof a2 === "number" && typeof b2 === "number") {
16845 return sort_number_default(a2, b2, direction);
16846 }
16847 return sort_text_default(a2, b2, direction);
16848 };
16849 var no_type_default = {
16850 // type: no type for this one
16851 render,
16852 Edit: null,
16853 sort: sort6,
16854 enableSorting: true,
16855 enableGlobalSearch: false,
16856 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
16857 validOperators: getAllOperatorNames(),
16858 format: {},
16859 getValueFormatted: get_value_formatted_default_default,
16860 validate: {
16861 required: isValidRequired,
16862 elements: isValidElements
16863 }
16864 };
16865
16866 // packages/dataviews/build-module/field-types/utils/get-is-valid.mjs
16867 function supportsNumericRangeConstraint(type) {
16868 return type === "integer" || type === "number";
16869 }
16870 function supportsDateRangeConstraint(type) {
16871 return type === "date" || type === "datetime";
16872 }
16873 function normalizeRangeRule(value, fieldType, key) {
16874 const validator = fieldType.validate[key];
16875 if (validator && (typeof value === "number" && supportsNumericRangeConstraint(fieldType.type) || typeof value === "string" && supportsDateRangeConstraint(fieldType.type))) {
16876 return { constraint: value, validate: validator };
16877 }
16878 return void 0;
16879 }
16880 function getIsValid(field, fieldType) {
16881 const rules = field.isValid;
16882 let required;
16883 if (rules?.required === true && fieldType.validate.required !== void 0) {
16884 required = {
16885 constraint: true,
16886 validate: fieldType.validate.required
16887 };
16888 }
16889 let elements;
16890 if ((rules?.elements === true || // elements is enabled unless the field opts-out
16891 rules?.elements === void 0 && (!!field.elements || !!field.getElements)) && fieldType.validate.elements !== void 0) {
16892 elements = {
16893 constraint: true,
16894 validate: fieldType.validate.elements
16895 };
16896 }
16897 const min = normalizeRangeRule(rules?.min, fieldType, "min");
16898 const max = normalizeRangeRule(rules?.max, fieldType, "max");
16899 const minLengthValue = rules?.minLength;
16900 let minLength;
16901 if (typeof minLengthValue === "number" && fieldType.validate.minLength !== void 0) {
16902 minLength = {
16903 constraint: minLengthValue,
16904 validate: fieldType.validate.minLength
16905 };
16906 }
16907 const maxLengthValue = rules?.maxLength;
16908 let maxLength;
16909 if (typeof maxLengthValue === "number" && fieldType.validate.maxLength !== void 0) {
16910 maxLength = {
16911 constraint: maxLengthValue,
16912 validate: fieldType.validate.maxLength
16913 };
16914 }
16915 const patternValue = rules?.pattern;
16916 let pattern;
16917 if (patternValue !== void 0 && fieldType.validate.pattern !== void 0) {
16918 pattern = {
16919 constraint: patternValue,
16920 validate: fieldType.validate.pattern
16921 };
16922 }
16923 const custom = rules?.custom ?? fieldType.validate.custom;
16924 return {
16925 required,
16926 elements,
16927 min,
16928 max,
16929 minLength,
16930 maxLength,
16931 pattern,
16932 custom
16933 };
16934 }
16935
16936 // packages/dataviews/build-module/field-types/utils/get-filter.mjs
16937 function getFilter(fieldType) {
16938 return fieldType.validOperators.reduce((accumulator, operator) => {
16939 const operatorObj = getOperatorByName(operator);
16940 if (operatorObj?.filter) {
16941 accumulator[operator] = operatorObj.filter;
16942 }
16943 return accumulator;
16944 }, {});
16945 }
16946
16947 // packages/dataviews/build-module/field-types/utils/get-format.mjs
16948 function getFormat(field, fieldType) {
16949 return {
16950 ...fieldType.format,
16951 ...field.format
16952 };
16953 }
16954 var get_format_default = getFormat;
16955
16956 // packages/dataviews/build-module/field-types/index.mjs
16957 function getFieldTypeByName(type) {
16958 const found = [
16959 email_default,
16960 integer_default,
16961 number_default,
16962 text_default,
16963 datetime_default,
16964 date_default,
16965 boolean_default,
16966 media_default,
16967 array_default,
16968 password_default,
16969 telephone_default,
16970 color_default,
16971 url_default
16972 ].find((fieldType) => fieldType?.type === type);
16973 if (!!found) {
16974 return found;
16975 }
16976 return no_type_default;
16977 }
16978 function normalizeFields(fields) {
16979 return fields.map((field) => {
16980 const fieldType = getFieldTypeByName(field.type);
16981 const getValue = field.getValue || get_value_from_id_default(field.id);
16982 const sort7 = function(a2, b2, direction) {
16983 const aValue = getValue({ item: a2 });
16984 const bValue = getValue({ item: b2 });
16985 return field.sort ? field.sort(aValue, bValue, direction) : fieldType.sort(aValue, bValue, direction);
16986 };
16987 return {
16988 id: field.id,
16989 label: field.label || field.id,
16990 header: field.header || field.label || field.id,
16991 description: field.description,
16992 placeholder: field.placeholder,
16993 getValue,
16994 setValue: field.setValue || set_value_from_id_default(field.id),
16995 elements: field.elements,
16996 getElements: field.getElements,
16997 hasElements: hasElements(field),
16998 isVisible: field.isVisible,
16999 isDisabled: typeof field.isDisabled === "function" ? field.isDisabled : () => !!field.isDisabled,
17000 enableHiding: field.enableHiding ?? true,
17001 readOnly: field.readOnly ?? false,
17002 // The type provides defaults for the following props
17003 type: fieldType.type,
17004 render: field.render ?? fieldType.render,
17005 Edit: getControl(field, fieldType.Edit),
17006 sort: sort7,
17007 enableSorting: field.enableSorting ?? fieldType.enableSorting,
17008 enableGlobalSearch: field.enableGlobalSearch ?? fieldType.enableGlobalSearch,
17009 isValid: getIsValid(field, fieldType),
17010 filterBy: get_filter_by_default(
17011 field,
17012 fieldType.defaultOperators,
17013 fieldType.validOperators
17014 ),
17015 filter: getFilter(fieldType),
17016 format: get_format_default(field, fieldType),
17017 getValueFormatted: field.getValueFormatted ?? fieldType.getValueFormatted
17018 };
17019 });
17020 }
17021
17022 // packages/dataviews/build-module/hooks/use-data.mjs
17023 var import_element56 = __toESM(require_element(), 1);
17024 function useData({
17025 view,
17026 data: shownData,
17027 getItemId,
17028 isLoading,
17029 paginationInfo,
17030 selection
17031 }) {
17032 const isInfiniteScrollEnabled = view.infiniteScrollEnabled;
17033 const [hasInitiallyLoaded, setHasInitiallyLoaded] = (0, import_element56.useState)(
17034 !isLoading
17035 );
17036 (0, import_element56.useEffect)(() => {
17037 if (!isLoading) {
17038 setHasInitiallyLoaded(true);
17039 }
17040 }, [isLoading]);
17041 const previousDataRef = (0, import_element56.useRef)(shownData);
17042 const previousPaginationInfoRef = (0, import_element56.useRef)(paginationInfo);
17043 (0, import_element56.useEffect)(() => {
17044 if (!isLoading) {
17045 previousDataRef.current = shownData;
17046 previousPaginationInfoRef.current = paginationInfo;
17047 }
17048 }, [shownData, isLoading, paginationInfo]);
17049 const [visibleEntries, setVisibleEntries] = (0, import_element56.useState)([]);
17050 const positionMapRef = (0, import_element56.useRef)(/* @__PURE__ */ new Map());
17051 const allLoadedRecordsRef = (0, import_element56.useRef)([]);
17052 const prevViewParamsRef = (0, import_element56.useRef)({
17053 search: void 0,
17054 filters: void 0,
17055 perPage: void 0
17056 });
17057 const scrollDirectionRef = (0, import_element56.useRef)(void 0);
17058 const prevStartPositionRef = (0, import_element56.useRef)(void 0);
17059 const hasInitializedRef = (0, import_element56.useRef)(false);
17060 const allLoadedRecords = (0, import_element56.useMemo)(() => {
17061 if (view.startPosition !== void 0 && prevStartPositionRef.current !== void 0) {
17062 if (view.startPosition < prevStartPositionRef.current) {
17063 scrollDirectionRef.current = "up";
17064 } else if (view.startPosition > prevStartPositionRef.current) {
17065 scrollDirectionRef.current = "down";
17066 }
17067 }
17068 prevStartPositionRef.current = view.startPosition;
17069 const currentFiltersKey = JSON.stringify(view.filters ?? []);
17070 const prevFiltersKey = prevViewParamsRef.current.filters;
17071 const shouldReset = !hasInitializedRef.current || !view.infiniteScrollEnabled || view.search !== prevViewParamsRef.current.search || currentFiltersKey !== prevFiltersKey || view.perPage !== prevViewParamsRef.current.perPage;
17072 hasInitializedRef.current = true;
17073 prevViewParamsRef.current = {
17074 search: view.search,
17075 filters: currentFiltersKey,
17076 perPage: view.perPage
17077 };
17078 if (shouldReset) {
17079 positionMapRef.current.clear();
17080 scrollDirectionRef.current = void 0;
17081 const startPosition = view.search ? 1 : view.startPosition ?? 1;
17082 const records = shownData.map((record, index) => {
17083 const position = startPosition + index;
17084 positionMapRef.current.set(getItemId(record), position);
17085 return {
17086 ...record,
17087 position
17088 };
17089 });
17090 allLoadedRecordsRef.current = records;
17091 return records;
17092 }
17093 const prev = allLoadedRecordsRef.current;
17094 const shownDataIds = new Set(shownData.map(getItemId));
17095 const scrollDirection = scrollDirectionRef.current;
17096 const basePosition = view.search ? 1 : view.startPosition ?? 1;
17097 const newRecords = shownData.map((record, index) => {
17098 const itemId = getItemId(record);
17099 const position = view.infiniteScrollEnabled ? basePosition + index : void 0;
17100 if (position !== void 0) {
17101 positionMapRef.current.set(itemId, position);
17102 }
17103 return {
17104 ...record,
17105 position
17106 };
17107 });
17108 if (newRecords.length === 0) {
17109 return prev;
17110 }
17111 const prevWithoutDuplicates = prev.filter(
17112 (record) => !shownDataIds.has(getItemId(record))
17113 );
17114 const allRecords = scrollDirection === "up" ? [...newRecords, ...prevWithoutDuplicates] : [...prevWithoutDuplicates, ...newRecords];
17115 allRecords.sort((a2, b2) => {
17116 const posA = a2.position;
17117 const posB = b2.position;
17118 return posA - posB;
17119 });
17120 let result = allRecords;
17121 if (visibleEntries.length > 0) {
17122 const visibleMin = Math.min(...visibleEntries);
17123 const visibleMax = Math.max(...visibleEntries);
17124 const buffer = 20;
17125 const recordPositions = allRecords.map(
17126 (r3) => r3.position
17127 );
17128 const minRecordPos = Math.min(...recordPositions);
17129 const maxRecordPos = Math.max(...recordPositions);
17130 const hasOverlap = !(maxRecordPos < visibleMin - buffer || minRecordPos > visibleMax + buffer);
17131 if (hasOverlap) {
17132 result = allRecords.filter((record) => {
17133 const itemId = getItemId(record);
17134 const isSelected2 = selection?.includes(itemId);
17135 if (isSelected2) {
17136 return true;
17137 }
17138 const itemPosition = record.position;
17139 if (scrollDirection === "up") {
17140 return itemPosition <= visibleMax + buffer;
17141 } else if (scrollDirection === "down") {
17142 return itemPosition >= visibleMin - buffer;
17143 }
17144 return itemPosition >= visibleMin - buffer && itemPosition <= visibleMax + buffer;
17145 });
17146 }
17147 }
17148 allLoadedRecordsRef.current = result;
17149 return result;
17150 }, [
17151 shownData,
17152 view.search,
17153 view.filters,
17154 view.perPage,
17155 view.startPosition,
17156 view.infiniteScrollEnabled,
17157 visibleEntries,
17158 selection,
17159 getItemId
17160 ]);
17161 if (!isInfiniteScrollEnabled) {
17162 const dataToReturn = isLoading && previousDataRef.current?.length ? previousDataRef.current : shownData;
17163 return {
17164 data: dataToReturn.map((item) => ({
17165 ...item,
17166 position: void 0
17167 })),
17168 paginationInfo: isLoading && previousDataRef.current?.length ? previousPaginationInfoRef.current : paginationInfo,
17169 hasInitiallyLoaded,
17170 setVisibleEntries: void 0
17171 };
17172 }
17173 return {
17174 data: allLoadedRecords,
17175 paginationInfo,
17176 hasInitiallyLoaded,
17177 setVisibleEntries
17178 };
17179 }
17180
17181 // packages/dataviews/build-module/hooks/use-infinite-scroll.mjs
17182 var import_element57 = __toESM(require_element(), 1);
17183 var import_compose11 = __toESM(require_compose(), 1);
17184 function captureAnchorElement(container, anchorElementRef, direction) {
17185 const containerRect = container.getBoundingClientRect();
17186 const centerY = containerRect.top + containerRect.height / 2;
17187 const items = Array.from(container.querySelectorAll("[aria-posinset]"));
17188 if (items.length === 0) {
17189 return false;
17190 }
17191 const bestAnchor = items.reduce((best, item) => {
17192 const itemRect = item.getBoundingClientRect();
17193 const itemCenterY = itemRect.top + itemRect.height / 2;
17194 const distance = Math.abs(itemCenterY - centerY);
17195 const bestRect = best.getBoundingClientRect();
17196 const bestCenterY = bestRect.top + bestRect.height / 2;
17197 const bestDistance = Math.abs(bestCenterY - centerY);
17198 return distance < bestDistance ? item : best;
17199 });
17200 const posinset = Number(bestAnchor.getAttribute("aria-posinset"));
17201 const anchorRect = bestAnchor.getBoundingClientRect();
17202 anchorElementRef.current = {
17203 posinset,
17204 viewportOffset: anchorRect.top - containerRect.top,
17205 direction
17206 };
17207 return true;
17208 }
17209 function useInfiniteScroll({
17210 view,
17211 onChangeView,
17212 isLoading,
17213 paginationInfo,
17214 containerRef,
17215 setVisibleEntries
17216 }) {
17217 const anchorElementRef = (0, import_element57.useRef)(null);
17218 const viewRef = (0, import_element57.useRef)(view);
17219 const isLoadingRef = (0, import_element57.useRef)(isLoading);
17220 const onChangeViewRef = (0, import_element57.useRef)(onChangeView);
17221 const totalItemsRef = (0, import_element57.useRef)(paginationInfo.totalItems);
17222 (0, import_element57.useLayoutEffect)(() => {
17223 viewRef.current = view;
17224 isLoadingRef.current = isLoading;
17225 onChangeViewRef.current = onChangeView;
17226 totalItemsRef.current = paginationInfo.totalItems;
17227 }, [view, isLoading, onChangeView, paginationInfo.totalItems]);
17228 const intersectionObserverCallback = (0, import_element57.useCallback)(
17229 (entries) => {
17230 if (!setVisibleEntries) {
17231 return;
17232 }
17233 setVisibleEntries((prev) => {
17234 const newVisibleEntries = new Set(prev);
17235 let hasChanged = false;
17236 entries.forEach((entry) => {
17237 const posInSet = Number(
17238 entry.target?.attributes?.getNamedItem(
17239 "aria-posinset"
17240 )?.value
17241 );
17242 if (isNaN(posInSet)) {
17243 return;
17244 }
17245 if (entry.isIntersecting) {
17246 if (!newVisibleEntries.has(posInSet)) {
17247 newVisibleEntries.add(posInSet);
17248 hasChanged = true;
17249 }
17250 } else if (newVisibleEntries.has(posInSet)) {
17251 newVisibleEntries.delete(posInSet);
17252 hasChanged = true;
17253 }
17254 });
17255 return hasChanged ? Array.from(newVisibleEntries).sort() : prev;
17256 });
17257 },
17258 [setVisibleEntries]
17259 );
17260 (0, import_element57.useLayoutEffect)(() => {
17261 const container = containerRef.current;
17262 const anchor = anchorElementRef.current;
17263 if (!container || !view.infiniteScrollEnabled || !anchor || isLoading) {
17264 return;
17265 }
17266 const anchorElement = container.querySelector(
17267 `[aria-posinset="${anchor.posinset}"]`
17268 );
17269 if (anchorElement) {
17270 const containerRect = container.getBoundingClientRect();
17271 const anchorRect = anchorElement.getBoundingClientRect();
17272 const currentOffset = anchorRect.top - containerRect.top;
17273 const scrollAdjustment = currentOffset - anchor.viewportOffset;
17274 if (Math.abs(scrollAdjustment) > 1) {
17275 container.scrollTop += scrollAdjustment;
17276 }
17277 }
17278 anchorElementRef.current = null;
17279 }, [containerRef, isLoading, view.infiniteScrollEnabled]);
17280 const intersectionObserverRef = (0, import_element57.useRef)(
17281 null
17282 );
17283 (0, import_element57.useEffect)(() => {
17284 if (!view.infiniteScrollEnabled || !intersectionObserverCallback) {
17285 if (intersectionObserverRef.current) {
17286 intersectionObserverRef.current.disconnect();
17287 intersectionObserverRef.current = null;
17288 }
17289 return;
17290 }
17291 intersectionObserverRef.current = new IntersectionObserver(
17292 intersectionObserverCallback,
17293 { root: null, rootMargin: "0px", threshold: 0.1 }
17294 );
17295 return () => {
17296 if (intersectionObserverRef.current) {
17297 intersectionObserverRef.current.disconnect();
17298 intersectionObserverRef.current = null;
17299 }
17300 };
17301 }, [view.infiniteScrollEnabled, intersectionObserverCallback]);
17302 (0, import_element57.useEffect)(() => {
17303 if (!view.infiniteScrollEnabled || !containerRef.current) {
17304 return;
17305 }
17306 let lastScrollTop = 0;
17307 const BOTTOM_THRESHOLD = 600;
17308 const TOP_THRESHOLD = 800;
17309 const handleScroll = (0, import_compose11.throttle)((event) => {
17310 const currentView = viewRef.current;
17311 const totalItems = totalItemsRef.current;
17312 const target = event.target;
17313 const scrollTop = target.scrollTop;
17314 const scrollHeight = target.scrollHeight;
17315 const clientHeight = target.clientHeight;
17316 const scrollDirection = scrollTop > lastScrollTop ? "down" : "up";
17317 lastScrollTop = scrollTop;
17318 if (isLoadingRef.current) {
17319 return;
17320 }
17321 const currentStartPosition = currentView.startPosition || 1;
17322 const batchSize = currentView.perPage || 10;
17323 const currentEndPosition = Math.min(
17324 currentStartPosition + batchSize,
17325 totalItems
17326 );
17327 if (scrollDirection === "down" && scrollTop + clientHeight >= scrollHeight - BOTTOM_THRESHOLD) {
17328 if (currentEndPosition < totalItems) {
17329 const newStartPosition = currentEndPosition;
17330 captureAnchorElement(target, anchorElementRef, "down");
17331 onChangeViewRef.current({
17332 ...currentView,
17333 startPosition: newStartPosition
17334 });
17335 }
17336 }
17337 if (scrollDirection === "up" && scrollTop <= TOP_THRESHOLD) {
17338 if (currentStartPosition > 1) {
17339 const calculatedStartPosition = currentStartPosition - batchSize;
17340 const newStartPosition = calculatedStartPosition < 6 ? 1 : calculatedStartPosition;
17341 captureAnchorElement(target, anchorElementRef, "up");
17342 onChangeViewRef.current({
17343 ...currentView,
17344 startPosition: newStartPosition
17345 });
17346 }
17347 }
17348 }, 50);
17349 const container = containerRef.current;
17350 container.addEventListener("scroll", handleScroll);
17351 return () => {
17352 container.removeEventListener("scroll", handleScroll);
17353 handleScroll.cancel();
17354 };
17355 }, [containerRef, view.infiniteScrollEnabled]);
17356 return {
17357 intersectionObserver: intersectionObserverRef.current
17358 };
17359 }
17360
17361 // packages/dataviews/build-module/dataviews/index.mjs
17362 var import_jsx_runtime93 = __toESM(require_jsx_runtime(), 1);
17363 var defaultGetItemId = (item) => item.id;
17364 var defaultIsItemClickable = () => true;
17365 var EMPTY_ARRAY6 = [];
17366 var DEFAULT_LAYOUTS = { table: {}, grid: {}, list: {} };
17367 var dataViewsLayouts = VIEW_LAYOUTS.filter(
17368 (viewLayout) => !viewLayout.isPicker
17369 );
17370 function DefaultUI({
17371 header,
17372 search = true,
17373 searchLabel = void 0
17374 }) {
17375 const { view } = (0, import_element58.useContext)(dataviews_context_default);
17376 const isInfiniteScroll = view.infiniteScrollEnabled;
17377 return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_jsx_runtime93.Fragment, { children: [
17378 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
17379 Stack,
17380 {
17381 direction: "row",
17382 align: "top",
17383 justify: "space-between",
17384 className: clsx_default("dataviews__view-actions", {
17385 "dataviews__view-actions--infinite-scroll": isInfiniteScroll
17386 }),
17387 gap: "xs",
17388 children: [
17389 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
17390 Stack,
17391 {
17392 direction: "row",
17393 justify: "start",
17394 gap: "sm",
17395 className: "dataviews__search",
17396 children: [
17397 search && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(dataviews_search_default, { label: searchLabel }),
17398 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(toggle_default, {})
17399 ]
17400 }
17401 ),
17402 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(Stack, { direction: "row", gap: "xs", style: { flexShrink: 0 }, children: [
17403 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(dataviews_view_config_default, {}),
17404 header
17405 ] })
17406 ]
17407 }
17408 ),
17409 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(filters_toggled_default, { className: "dataviews-filters__container" }),
17410 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(DataViewsLayout, {}),
17411 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(DataViewsFooter, {})
17412 ] });
17413 }
17414 function DataViews({
17415 view,
17416 onChangeView,
17417 fields,
17418 search = true,
17419 searchLabel = void 0,
17420 actions = EMPTY_ARRAY6,
17421 data,
17422 getItemId = defaultGetItemId,
17423 getItemLevel,
17424 isLoading = false,
17425 paginationInfo,
17426 defaultLayouts: defaultLayoutsProperty = DEFAULT_LAYOUTS,
17427 selection: selectionProperty,
17428 onChangeSelection,
17429 onClickItem,
17430 renderItemLink,
17431 isItemClickable = defaultIsItemClickable,
17432 header,
17433 children,
17434 config = { perPageSizes: [10, 20, 50, 100] },
17435 empty,
17436 onReset
17437 }) {
17438 const [selectionState, setSelectionState] = (0, import_element58.useState)([]);
17439 const isUncontrolled = selectionProperty === void 0 || onChangeSelection === void 0;
17440 const selection = isUncontrolled ? selectionState : selectionProperty;
17441 const {
17442 data: displayData,
17443 paginationInfo: displayPaginationInfo,
17444 hasInitiallyLoaded,
17445 setVisibleEntries
17446 } = useData({
17447 view,
17448 data,
17449 getItemId,
17450 isLoading,
17451 selection,
17452 paginationInfo
17453 });
17454 const containerRef = (0, import_element58.useRef)(null);
17455 const [containerWidth, setContainerWidth] = (0, import_element58.useState)(0);
17456 const resizeObserverRef = (0, import_compose12.useResizeObserver)(
17457 (resizeObserverEntries) => {
17458 setContainerWidth(
17459 resizeObserverEntries[0].borderBoxSize[0].inlineSize
17460 );
17461 },
17462 { box: "border-box" }
17463 );
17464 const [openedFilter, setOpenedFilter] = (0, import_element58.useState)(null);
17465 function setSelectionWithChange(value) {
17466 const newValue = typeof value === "function" ? value(selection) : value;
17467 if (isUncontrolled) {
17468 setSelectionState(newValue);
17469 }
17470 if (onChangeSelection) {
17471 onChangeSelection(newValue);
17472 }
17473 }
17474 const _fields = (0, import_element58.useMemo)(() => normalizeFields(fields), [fields]);
17475 const _selection = (0, import_element58.useMemo)(() => {
17476 if (view.infiniteScrollEnabled) {
17477 return selection;
17478 }
17479 return selection.filter(
17480 (id) => data.some((item) => getItemId(item) === id)
17481 );
17482 }, [selection, data, getItemId, view.infiniteScrollEnabled]);
17483 const filters = use_filters_default(_fields, view);
17484 const hasPrimaryOrLockedFilters = (0, import_element58.useMemo)(
17485 () => (filters || []).some(
17486 (filter) => filter.isPrimary || filter.isLocked
17487 ),
17488 [filters]
17489 );
17490 const [isShowingFilter, setIsShowingFilter] = (0, import_element58.useState)(
17491 hasPrimaryOrLockedFilters
17492 );
17493 const { intersectionObserver } = useInfiniteScroll({
17494 view,
17495 onChangeView,
17496 isLoading,
17497 paginationInfo,
17498 containerRef,
17499 setVisibleEntries
17500 });
17501 (0, import_element58.useEffect)(() => {
17502 if (hasPrimaryOrLockedFilters && !isShowingFilter) {
17503 setIsShowingFilter(true);
17504 }
17505 }, [hasPrimaryOrLockedFilters, isShowingFilter]);
17506 const defaultLayouts = (0, import_element58.useMemo)(
17507 () => Object.fromEntries(
17508 Object.entries(defaultLayoutsProperty).filter(([layoutType]) => {
17509 return dataViewsLayouts.some(
17510 (viewLayout) => viewLayout.type === layoutType
17511 );
17512 }).map(([key, value]) => [
17513 key,
17514 value === true ? {} : value
17515 ])
17516 ),
17517 [defaultLayoutsProperty]
17518 );
17519 if (!defaultLayouts[view.type]) {
17520 return null;
17521 }
17522 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
17523 dataviews_context_default.Provider,
17524 {
17525 value: {
17526 view,
17527 onChangeView,
17528 fields: _fields,
17529 actions,
17530 data: displayData,
17531 isLoading,
17532 paginationInfo: displayPaginationInfo,
17533 selection: _selection,
17534 onChangeSelection: setSelectionWithChange,
17535 openedFilter,
17536 setOpenedFilter,
17537 getItemId,
17538 getItemLevel,
17539 isItemClickable,
17540 onClickItem,
17541 renderItemLink,
17542 containerWidth,
17543 containerRef,
17544 resizeObserverRef,
17545 defaultLayouts,
17546 filters,
17547 isShowingFilter,
17548 setIsShowingFilter,
17549 config,
17550 empty,
17551 hasInitiallyLoaded,
17552 onReset,
17553 intersectionObserver
17554 },
17555 children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "dataviews-wrapper", children: children ?? /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
17556 DefaultUI,
17557 {
17558 header,
17559 search,
17560 searchLabel
17561 }
17562 ) })
17563 }
17564 );
17565 }
17566 var DataViewsSubComponents = DataViews;
17567 DataViewsSubComponents.BulkActionToolbar = BulkActionsFooter;
17568 DataViewsSubComponents.Filters = filters_default;
17569 DataViewsSubComponents.FiltersToggled = filters_toggled_default;
17570 DataViewsSubComponents.FiltersToggle = toggle_default;
17571 DataViewsSubComponents.Layout = DataViewsLayout;
17572 DataViewsSubComponents.LayoutSwitcher = ViewTypeMenu;
17573 DataViewsSubComponents.Pagination = DataViewsPagination;
17574 DataViewsSubComponents.Search = dataviews_search_default;
17575 DataViewsSubComponents.ViewConfig = DataviewsViewConfigDropdown;
17576 DataViewsSubComponents.Footer = DataViewsFooter;
17577 var dataviews_default = DataViewsSubComponents;
17578
17579 // packages/dataviews/build-module/utils/filter-sort-and-paginate.mjs
17580 var import_remove_accents2 = __toESM(require_remove_accents(), 1);
17581 var import_deprecated = __toESM(require_deprecated(), 1);
17582 function normalizeSearchInput2(input = "") {
17583 return (0, import_remove_accents2.default)(input.trim().toLowerCase());
17584 }
17585 var EMPTY_ARRAY7 = [];
17586 function filterSortAndPaginate(data, view, fields) {
17587 if (!data) {
17588 return {
17589 data: EMPTY_ARRAY7,
17590 paginationInfo: { totalItems: 0, totalPages: 0 }
17591 };
17592 }
17593 const _fields = normalizeFields(fields);
17594 let filteredData = [...data];
17595 if (view.search) {
17596 const normalizedSearch = normalizeSearchInput2(view.search);
17597 filteredData = filteredData.filter((item) => {
17598 return _fields.filter((field) => field.enableGlobalSearch).some((field) => {
17599 const fieldValue = field.getValue({ item });
17600 const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue];
17601 return values.some(
17602 (value) => normalizeSearchInput2(String(value)).includes(
17603 normalizedSearch
17604 )
17605 );
17606 });
17607 });
17608 }
17609 if (view.filters && view.filters?.length > 0) {
17610 view.filters.forEach((filter) => {
17611 const field = _fields.find(
17612 (_field) => _field.id === filter.field
17613 );
17614 if (field) {
17615 if (filter.operator === OPERATOR_IS_NOT_ALL) {
17616 (0, import_deprecated.default)("The 'isNotAll' filter operator", {
17617 since: "7.0",
17618 alternative: "'isNone'"
17619 });
17620 }
17621 const handler = field.filter[filter.operator];
17622 if (handler) {
17623 filteredData = filteredData.filter(
17624 (item) => handler(item, field, filter.value)
17625 );
17626 }
17627 }
17628 });
17629 }
17630 const sortByField = view.sort?.field ? _fields.find((field) => {
17631 return field.enableSorting !== false && field.id === view.sort?.field;
17632 }) : null;
17633 const groupByField = view.groupBy?.field ? _fields.find((field) => {
17634 return field.enableSorting !== false && field.id === view.groupBy?.field;
17635 }) : null;
17636 if (sortByField || groupByField) {
17637 filteredData.sort((a2, b2) => {
17638 if (groupByField) {
17639 const groupCompare = groupByField.sort(
17640 a2,
17641 b2,
17642 view.groupBy?.direction ?? "asc"
17643 );
17644 if (groupCompare !== 0) {
17645 return groupCompare;
17646 }
17647 }
17648 if (sortByField) {
17649 return sortByField.sort(a2, b2, view.sort?.direction ?? "desc");
17650 }
17651 return 0;
17652 });
17653 }
17654 let totalItems = filteredData.length;
17655 let totalPages = 1;
17656 if (view.infiniteScrollEnabled && view.startPosition !== void 0 && view.perPage !== void 0) {
17657 const start = view.startPosition - 1;
17658 const end = Math.min(start + view.perPage, totalItems);
17659 filteredData = filteredData?.slice(start, end);
17660 } else if (view.page !== void 0 && view.perPage !== void 0) {
17661 const start = (view.page - 1) * view.perPage;
17662 totalItems = filteredData?.length || 0;
17663 totalPages = Math.ceil(totalItems / view.perPage);
17664 filteredData = filteredData?.slice(start, start + view.perPage);
17665 }
17666 return {
17667 data: filteredData,
17668 paginationInfo: {
17669 totalItems,
17670 totalPages
17671 }
17672 };
17673 }
17674
17675 // packages/admin-ui/build-module/navigable-region/index.mjs
17676 var import_element59 = __toESM(require_element(), 1);
17677 var import_jsx_runtime94 = __toESM(require_jsx_runtime(), 1);
17678 var NavigableRegion = (0, import_element59.forwardRef)(
17679 ({ children, className, ariaLabel, as: Tag = "div", ...props }, ref) => {
17680 return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
17681 Tag,
17682 {
17683 ref,
17684 className: clsx_default("admin-ui-navigable-region", className),
17685 "aria-label": ariaLabel,
17686 role: "region",
17687 tabIndex: "-1",
17688 ...props,
17689 children
17690 }
17691 );
17692 }
17693 );
17694 NavigableRegion.displayName = "NavigableRegion";
17695 var navigable_region_default = NavigableRegion;
17696
17697 // packages/admin-ui/build-module/page/sidebar-toggle-slot.mjs
17698 var import_components46 = __toESM(require_components(), 1);
17699 var { Fill: SidebarToggleFill, Slot: SidebarToggleSlot } = (0, import_components46.createSlotFill)("SidebarToggle");
17700
17701 // packages/admin-ui/build-module/page/header.mjs
17702 var import_jsx_runtime95 = __toESM(require_jsx_runtime(), 1);
17703 function Header({
17704 headingLevel = 2,
17705 breadcrumbs,
17706 badges,
17707 title,
17708 subTitle,
17709 actions,
17710 showSidebarToggle = true
17711 }) {
17712 const HeadingTag = `h${headingLevel}`;
17713 return /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(
17714 Stack,
17715 {
17716 direction: "column",
17717 className: "admin-ui-page__header",
17718 render: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("header", {}),
17719 children: [
17720 /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(Stack, { direction: "row", justify: "space-between", gap: "sm", children: [
17721 /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(Stack, { direction: "row", gap: "sm", align: "center", justify: "start", children: [
17722 showSidebarToggle && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
17723 SidebarToggleSlot,
17724 {
17725 bubblesVirtually: true,
17726 className: "admin-ui-page__sidebar-toggle-slot"
17727 }
17728 ),
17729 title && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(HeadingTag, { className: "admin-ui-page__header-title", children: title }),
17730 breadcrumbs,
17731 badges
17732 ] }),
17733 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
17734 Stack,
17735 {
17736 direction: "row",
17737 gap: "sm",
17738 style: { width: "auto", flexShrink: 0 },
17739 className: "admin-ui-page__header-actions",
17740 align: "center",
17741 children: actions
17742 }
17743 )
17744 ] }),
17745 subTitle && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("p", { className: "admin-ui-page__header-subtitle", children: subTitle })
17746 ]
17747 }
17748 );
17749 }
17750
17751 // packages/admin-ui/build-module/page/index.mjs
17752 var import_jsx_runtime96 = __toESM(require_jsx_runtime(), 1);
17753 function Page({
17754 headingLevel,
17755 breadcrumbs,
17756 badges,
17757 title,
17758 subTitle,
17759 children,
17760 className,
17761 actions,
17762 ariaLabel,
17763 hasPadding = false,
17764 showSidebarToggle = true
17765 }) {
17766 const classes = clsx_default("admin-ui-page", className);
17767 const effectiveAriaLabel = ariaLabel ?? (typeof title === "string" ? title : "");
17768 return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(navigable_region_default, { className: classes, ariaLabel: effectiveAriaLabel, children: [
17769 (title || breadcrumbs || badges || actions) && /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
17770 Header,
17771 {
17772 headingLevel,
17773 breadcrumbs,
17774 badges,
17775 title,
17776 subTitle,
17777 actions,
17778 showSidebarToggle
17779 }
17780 ),
17781 hasPadding ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "admin-ui-page__content has-padding", children }) : children
17782 ] });
17783 }
17784 Page.SidebarToggleFill = SidebarToggleFill;
17785 var page_default = Page;
17786
17787 // routes/pattern-list/stage.tsx
17788 var import_core_data4 = __toESM(require_core_data());
17789 var import_components47 = __toESM(require_components());
17790 var import_data11 = __toESM(require_data());
17791 var import_element62 = __toESM(require_element());
17792 var import_editor = __toESM(require_editor());
17793 var import_patterns3 = __toESM(require_patterns());
17794 var import_i18n47 = __toESM(require_i18n());
17795
17796 // routes/lock-unlock.ts
17797 var import_private_apis3 = __toESM(require_private_apis());
17798 var { lock: lock3, unlock: unlock3 } = (0, import_private_apis3.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
17799 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
17800 "@wordpress/routes"
17801 );
17802
17803 // routes/pattern-list/view-utils.ts
17804 var import_i18n43 = __toESM(require_i18n());
17805 var LAYOUT_GRID2 = "grid";
17806 var LAYOUT_TABLE2 = "table";
17807 var DEFAULT_VIEW = {
17808 type: LAYOUT_GRID2,
17809 perPage: 20,
17810 sort: {
17811 field: "title",
17812 direction: "asc"
17813 },
17814 filters: [],
17815 fields: ["sync-status"],
17816 layout: {
17817 badgeFields: ["sync-status"]
17818 },
17819 titleField: "title",
17820 mediaField: "preview"
17821 };
17822 var DEFAULT_VIEWS = [
17823 {
17824 slug: "all",
17825 label: (0, import_i18n43.__)("All patterns")
17826 },
17827 {
17828 slug: "my-patterns",
17829 label: (0, import_i18n43.__)("My patterns")
17830 },
17831 {
17832 slug: "registered",
17833 label: (0, import_i18n43.__)("Registered")
17834 }
17835 ];
17836 var DEFAULT_LAYOUTS2 = {
17837 [LAYOUT_TABLE2]: true,
17838 [LAYOUT_GRID2]: {
17839 layout: {
17840 badgeFields: ["sync-status"]
17841 }
17842 }
17843 };
17844
17845 // routes/pattern-list/fields/preview.tsx
17846 var import_i18n44 = __toESM(require_i18n());
17847 import { Preview } from "@wordpress/lazy-editor";
17848 function PreviewField({ item }) {
17849 return /* @__PURE__ */ React.createElement(
17850 Preview,
17851 {
17852 blocks: item.blocks,
17853 content: item.content,
17854 description: item.description
17855 }
17856 );
17857 }
17858 var previewField = {
17859 label: (0, import_i18n44.__)("Preview"),
17860 id: "preview",
17861 render: PreviewField,
17862 enableSorting: false
17863 };
17864
17865 // routes/pattern-list/fields/sync-status.tsx
17866 var import_i18n45 = __toESM(require_i18n());
17867 var import_patterns = __toESM(require_patterns());
17868 var { PATTERN_SYNC_TYPES } = unlock3(import_patterns.privateApis);
17869 var OPERATOR_IS2 = "is";
17870 var SYNC_FILTERS = [
17871 {
17872 value: PATTERN_SYNC_TYPES.full,
17873 label: (0, import_i18n45._x)("Synced", "pattern (singular)"),
17874 description: (0, import_i18n45.__)("Patterns that are kept in sync across the site.")
17875 },
17876 {
17877 value: PATTERN_SYNC_TYPES.unsynced,
17878 label: (0, import_i18n45._x)("Not synced", "pattern (singular)"),
17879 description: (0, import_i18n45.__)(
17880 "Patterns that can be changed freely without affecting the site."
17881 )
17882 }
17883 ];
17884 var patternStatusField = {
17885 label: (0, import_i18n45.__)("Sync status"),
17886 id: "sync-status",
17887 render: ({ item }) => {
17888 const syncStatus = item.syncStatus;
17889 return /* @__PURE__ */ React.createElement(
17890 "span",
17891 {
17892 className: `routes-pattern-list__field-sync-status-${syncStatus}`
17893 },
17894 SYNC_FILTERS.find(({ value }) => value === syncStatus)?.label
17895 );
17896 },
17897 elements: SYNC_FILTERS,
17898 filterBy: {
17899 operators: [OPERATOR_IS2],
17900 isPrimary: true
17901 },
17902 enableSorting: false
17903 };
17904
17905 // routes/pattern-list/fields/category.tsx
17906 var import_i18n46 = __toESM(require_i18n());
17907 var import_data9 = __toESM(require_data());
17908 var import_core_data2 = __toESM(require_core_data());
17909 var import_element60 = __toESM(require_element());
17910 var OPERATOR_IS3 = "is";
17911 function CategoryField({ item }) {
17912 const blockPatternCategories = (0, import_data9.useSelect)(
17913 (select2) => select2(import_core_data2.store).getBlockPatternCategories(),
17914 []
17915 );
17916 const categoryLabels = (0, import_element60.useMemo)(() => {
17917 if (!item.categories || !Array.isArray(item.categories)) {
17918 return [];
17919 }
17920 return item.categories.map((catSlug) => {
17921 const category = blockPatternCategories?.find(
17922 (cat) => cat.name === catSlug
17923 );
17924 return category ? category.label || category.name : null;
17925 }).filter(Boolean);
17926 }, [item.categories, blockPatternCategories]);
17927 if (categoryLabels.length === 0) {
17928 return /* @__PURE__ */ React.createElement("span", { className: "pattern-category-field__empty" }, "\u2014");
17929 }
17930 return /* @__PURE__ */ React.createElement("span", { className: "pattern-category-field" }, categoryLabels.join(", "));
17931 }
17932 function usePatternCategories() {
17933 const userPatternCategories = (0, import_data9.useSelect)(
17934 (select2) => select2(import_core_data2.store).getUserPatternCategories(),
17935 []
17936 );
17937 const blockPatternCategories = (0, import_data9.useSelect)(
17938 (select2) => select2(import_core_data2.store).getBlockPatternCategories(),
17939 []
17940 );
17941 return (0, import_element60.useMemo)(() => {
17942 const categoryMap = /* @__PURE__ */ new Map();
17943 userPatternCategories?.forEach((cat) => {
17944 if (!categoryMap.has(cat.name)) {
17945 categoryMap.set(cat.name, {
17946 value: cat.name,
17947 label: cat.label || cat.name
17948 });
17949 }
17950 });
17951 blockPatternCategories?.forEach((cat) => {
17952 if (!categoryMap.has(cat.name)) {
17953 categoryMap.set(cat.name, {
17954 value: cat.name,
17955 label: cat.label || cat.name
17956 });
17957 }
17958 });
17959 return Array.from(categoryMap.values()).sort(
17960 (a2, b2) => a2.label.localeCompare(b2.label)
17961 );
17962 }, [userPatternCategories, blockPatternCategories]);
17963 }
17964 function usePatternCategoryField() {
17965 const categories = usePatternCategories();
17966 return {
17967 label: (0, import_i18n46.__)("Category"),
17968 id: "category",
17969 render: CategoryField,
17970 elements: categories,
17971 getValue: ({ item }) => {
17972 return item.categories;
17973 },
17974 filterBy: {
17975 operators: [OPERATOR_IS3],
17976 isPrimary: true
17977 },
17978 enableSorting: false
17979 };
17980 }
17981
17982 // routes/pattern-list/use-patterns.ts
17983 var import_data10 = __toESM(require_data());
17984 var import_core_data3 = __toESM(require_core_data());
17985 var import_element61 = __toESM(require_element());
17986 var import_patterns2 = __toESM(require_patterns());
17987 var import_block_editor = __toESM(require_block_editor());
17988
17989 // routes/pattern-list/utils.ts
17990 var filterOutDuplicatesByName = (currentItem, index, items) => index === items.findIndex((item) => currentItem.name === item.name);
17991
17992 // routes/pattern-list/use-patterns.ts
17993 var {
17994 PATTERN_TYPES,
17995 PATTERN_SYNC_TYPES: PATTERN_SYNC_TYPES2,
17996 EXCLUDED_PATTERN_SOURCES,
17997 PATTERN_DEFAULT_CATEGORY
17998 } = unlock3(import_patterns2.privateApis);
17999 var { extractWords, getNormalizedSearchTerms, normalizeString: normalizeString2 } = unlock3(
18000 import_block_editor.privateApis
18001 );
18002 function normalizeThemePattern(pattern) {
18003 return {
18004 id: pattern.name,
18005 title: pattern.title,
18006 content: pattern.content,
18007 keywords: pattern.keywords || [],
18008 type: PATTERN_TYPES.theme,
18009 // Normalize categories to always be an array of slugs
18010 categories: pattern.categories || [],
18011 // Theme patterns are always unsynced
18012 syncStatus: PATTERN_SYNC_TYPES2.unsynced,
18013 description: pattern.description || ""
18014 };
18015 }
18016 function normalizeUserPattern(pattern, userPatternCategories) {
18017 const categories = [];
18018 if (pattern.wp_pattern_category && Array.isArray(pattern.wp_pattern_category)) {
18019 pattern.wp_pattern_category.forEach((catId) => {
18020 const category = userPatternCategories?.find(
18021 (cat) => cat.id === catId
18022 );
18023 if (category) {
18024 categories.push(category.name);
18025 }
18026 });
18027 }
18028 const numericId = pattern.id;
18029 return {
18030 id: pattern.name || pattern.id.toString(),
18031 _recordId: numericId,
18032 // Keep numeric ID for permissions lookup
18033 keywords: [],
18034 type: PATTERN_TYPES.user,
18035 // Normalize categories to always be an array of slugs
18036 categories,
18037 // Normalize sync status
18038 syncStatus: pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES2.full,
18039 title: typeof pattern.title === "string" ? pattern.title : pattern.title.raw,
18040 content: typeof pattern.content === "string" ? pattern.content : pattern.content.raw,
18041 description: pattern.excerpt?.raw || "",
18042 blocks: pattern.blocks
18043 };
18044 }
18045 var removeMatchingTerms = (unmatchedTerms, unprocessedTerms) => {
18046 return unmatchedTerms.filter(
18047 (term) => !getNormalizedSearchTerms(unprocessedTerms).some(
18048 (unprocessedTerm) => unprocessedTerm.includes(term)
18049 )
18050 );
18051 };
18052 function getItemSearchRank(item, searchTerm, config) {
18053 const { categoryId, hasCategory, onlyFilterByCategory } = config;
18054 let rank = categoryId === PATTERN_DEFAULT_CATEGORY || categoryId === "my-patterns" && item.type === PATTERN_TYPES.user || hasCategory && hasCategory(item, categoryId || "") ? 1 : 0;
18055 if (!rank || onlyFilterByCategory) {
18056 return rank;
18057 }
18058 const normalizedSearchInput = normalizeString2(searchTerm);
18059 const normalizedTitle = normalizeString2(item.title);
18060 if (normalizedSearchInput === normalizedTitle) {
18061 rank += 30;
18062 } else if (normalizedTitle.startsWith(normalizedSearchInput)) {
18063 rank += 20;
18064 } else {
18065 const terms = [
18066 item.id,
18067 item.title,
18068 item.description,
18069 ...item.keywords
18070 ].join(" ");
18071 const normalizedSearchTerms = extractWords(normalizedSearchInput);
18072 const unmatchedTerms = removeMatchingTerms(
18073 normalizedSearchTerms,
18074 terms
18075 );
18076 if (unmatchedTerms.length === 0) {
18077 rank += 10;
18078 }
18079 }
18080 return rank;
18081 }
18082 function searchItems(items = [], searchInput = "", config = {}) {
18083 const normalizedSearchTerms = getNormalizedSearchTerms(searchInput);
18084 const onlyFilterByCategory = config.categoryId !== PATTERN_DEFAULT_CATEGORY && !normalizedSearchTerms.length;
18085 const searchRankConfig = { ...config, onlyFilterByCategory };
18086 const threshold = onlyFilterByCategory ? 0 : 1;
18087 const rankedItems = items.map((item) => {
18088 return [
18089 item,
18090 getItemSearchRank(item, searchInput, searchRankConfig)
18091 ];
18092 }).filter(([, rank]) => rank > threshold);
18093 if (normalizedSearchTerms.length === 0) {
18094 return rankedItems.map(([item]) => item);
18095 }
18096 rankedItems.sort(([, rank1], [, rank2]) => rank2 - rank1);
18097 return rankedItems.map(([item]) => item);
18098 }
18099 var selectThemePatterns = (0, import_data10.createSelector)(
18100 (select2) => {
18101 const { getBlockPatterns } = select2(import_core_data3.store);
18102 const { isResolving: isResolvingSelector } = select2(import_core_data3.store);
18103 const restBlockPatterns = getBlockPatterns();
18104 const patterns = (restBlockPatterns || []).filter(
18105 (pattern) => !EXCLUDED_PATTERN_SOURCES.includes(pattern.source)
18106 ).filter(filterOutDuplicatesByName).filter((pattern) => pattern.inserter !== false).map(normalizeThemePattern);
18107 return {
18108 patterns,
18109 isResolving: isResolvingSelector("getBlockPatterns")
18110 };
18111 },
18112 (select2) => [
18113 select2(import_core_data3.store).getBlockPatterns(),
18114 select2(import_core_data3.store).isResolving("getBlockPatterns")
18115 ]
18116 );
18117 var selectUserPatterns = (0, import_data10.createSelector)(
18118 (select2, syncStatus = void 0, search = "") => {
18119 const {
18120 getEntityRecords,
18121 isResolving: isResolvingSelector,
18122 getUserPatternCategories
18123 } = select2(import_core_data3.store);
18124 const query = { per_page: -1 };
18125 const patternPosts = getEntityRecords(
18126 "postType",
18127 PATTERN_TYPES.user,
18128 query
18129 );
18130 const userPatternCategories = getUserPatternCategories();
18131 let patterns = (patternPosts ?? []).map(
18132 (pattern) => normalizeUserPattern(pattern, userPatternCategories)
18133 );
18134 const isResolving = isResolvingSelector("getEntityRecords", [
18135 "postType",
18136 PATTERN_TYPES.user,
18137 query
18138 ]);
18139 if (syncStatus) {
18140 patterns = patterns.filter(
18141 (pattern) => pattern.syncStatus === syncStatus
18142 );
18143 }
18144 patterns = searchItems(patterns, search, {
18145 // We exit user pattern retrieval early if we aren't in the
18146 // catch-all category for user created patterns, so it has
18147 // to be in the category.
18148 categoryId: PATTERN_DEFAULT_CATEGORY,
18149 hasCategory: () => true
18150 });
18151 return {
18152 patterns,
18153 isResolving,
18154 categories: userPatternCategories
18155 };
18156 },
18157 (select2) => [
18158 select2(import_core_data3.store).getEntityRecords("postType", PATTERN_TYPES.user, {
18159 per_page: -1
18160 }),
18161 select2(import_core_data3.store).isResolving("getEntityRecords", [
18162 "postType",
18163 PATTERN_TYPES.user,
18164 { per_page: -1 }
18165 ]),
18166 select2(import_core_data3.store).getUserPatternCategories()
18167 ]
18168 );
18169 var selectPatterns = (0, import_data10.createSelector)(
18170 (select2, categoryId, syncStatus, search = "") => {
18171 const {
18172 patterns: themePatterns,
18173 isResolving: isResolvingThemePatterns
18174 } = selectThemePatterns(select2);
18175 const { patterns: userPatterns, isResolving: isResolvingUserPatterns } = selectUserPatterns(select2);
18176 let patterns = [
18177 ...themePatterns || [],
18178 ...userPatterns || []
18179 ];
18180 if (syncStatus) {
18181 patterns = patterns.filter(
18182 (pattern) => pattern.syncStatus === syncStatus
18183 );
18184 }
18185 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) {
18186 patterns = searchItems(patterns, search, {
18187 categoryId,
18188 hasCategory: (item, currentCategory) => {
18189 return item.categories?.includes(currentCategory);
18190 }
18191 });
18192 } else {
18193 patterns = searchItems(patterns, search, {
18194 categoryId: PATTERN_DEFAULT_CATEGORY,
18195 hasCategory: () => true
18196 });
18197 }
18198 return {
18199 patterns,
18200 isResolving: isResolvingThemePatterns || isResolvingUserPatterns
18201 };
18202 },
18203 (select2) => [
18204 selectThemePatterns(select2),
18205 selectUserPatterns(select2)
18206 ]
18207 );
18208 function useAugmentPatternsWithPermissions(patterns) {
18209 const idsAndTypes = (0, import_element61.useMemo)(
18210 () => patterns?.filter((record) => record.type !== PATTERN_TYPES.theme).map((record) => [
18211 record.type,
18212 record._recordId,
18213 record.id
18214 ]) ?? [],
18215 [patterns]
18216 );
18217 const permissions = (0, import_data10.useSelect)(
18218 (select2) => {
18219 const { getEntityRecordPermissions } = unlock3(
18220 select2(import_core_data3.store)
18221 );
18222 return idsAndTypes.reduce(
18223 (acc, [type, numericId, stringId]) => {
18224 acc[stringId] = getEntityRecordPermissions(
18225 "postType",
18226 type,
18227 numericId
18228 );
18229 return acc;
18230 },
18231 {}
18232 );
18233 },
18234 [idsAndTypes]
18235 );
18236 return (0, import_element61.useMemo)(
18237 () => patterns?.map((record) => ({
18238 ...record,
18239 permissions: permissions?.[record.id] ?? {}
18240 })) ?? [],
18241 [patterns, permissions]
18242 );
18243 }
18244 var usePatterns = (postType, categoryId, { search = "", syncStatus } = {}) => {
18245 return (0, import_data10.useSelect)(
18246 (select2) => {
18247 if (postType === PATTERN_TYPES.user) {
18248 const result = selectUserPatterns(select2, syncStatus, search);
18249 let { patterns } = result;
18250 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) {
18251 patterns = patterns.filter(
18252 (pattern) => pattern.categories.includes(categoryId)
18253 );
18254 }
18255 return {
18256 patterns,
18257 isResolving: result.isResolving
18258 };
18259 } else if (postType === PATTERN_TYPES.theme) {
18260 const result = selectThemePatterns(select2);
18261 let { patterns } = result;
18262 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) {
18263 patterns = patterns.filter(
18264 (pattern) => pattern.categories.includes(categoryId)
18265 );
18266 }
18267 patterns = searchItems(patterns, search, {
18268 categoryId: categoryId || PATTERN_DEFAULT_CATEGORY,
18269 hasCategory: () => true
18270 });
18271 return {
18272 patterns,
18273 isResolving: result.isResolving
18274 };
18275 }
18276 return selectPatterns(select2, categoryId, syncStatus, search);
18277 },
18278 [categoryId, postType, search, syncStatus]
18279 );
18280 };
18281 var use_patterns_default = usePatterns;
18282
18283 // routes/pattern-list/style.scss
18284 if (typeof document !== "undefined" && true && !document.head.querySelector("style[data-wp-hash='c329396b1f']")) {
18285 const style = document.createElement("style");
18286 style.setAttribute("data-wp-hash", "c329396b1f");
18287 style.appendChild(document.createTextNode(":root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.patterns-menu-items__convert-modal{z-index:1000001}.patterns-menu-items__convert-modal [role=dialog]>[role=document]{width:350px}.patterns-menu-items__convert-modal .patterns-menu-items__convert-modal-categories{position:relative}.patterns-menu-items__convert-modal .components-form-token-field__suggestions-list:not(:empty){background-color:#fff;border:1px solid var(--wp-admin-theme-color);border-bottom-left-radius:2px;border-bottom-right-radius:2px;box-shadow:0 0 .5px .5px var(--wp-admin-theme-color);box-sizing:border-box;left:-1px;max-height:96px;min-width:auto;position:absolute;width:calc(100% + 2px);z-index:1}.patterns-create-modal__name-input input[type=text]{margin:0}.patterns-rename-pattern-category-modal__validation-message{color:#cc1818}@media (min-width:782px){.patterns-rename-pattern-category-modal__validation-message{width:320px}}.pattern-overrides-control__allow-overrides-button{justify-content:center;width:100%}.routes-pattern-list__tabs-wrapper{border-bottom:1px solid #f0f0f0;padding:0 24px}.dataviews-view-grid__badge-fields .dataviews-view-grid__field-value:has(.routes-pattern-list__field-sync-status-fully){background:rgba(var(--wp-block-synced-color--rgb),.04);color:var(--wp-block-synced-color)}"));
18288 document.head.appendChild(style);
18289 }
18290
18291 // routes/pattern-list/stage.tsx
18292 var { usePostActions, patternTitleField } = unlock3(import_editor.privateApis);
18293 var { Tabs } = unlock3(import_components47.privateApis);
18294 var { PATTERN_TYPES: PATTERN_TYPES2, CreatePatternModal } = unlock3(import_patterns3.privateApis);
18295 function PatternList() {
18296 const invalidate = useInvalidate();
18297 const { type = "all" } = useParams({
18298 from: "/patterns/list/$type"
18299 });
18300 const navigate = useNavigate();
18301 const searchParams = useSearch({ from: "/patterns/list/$type" });
18302 const postTypeObject = (0, import_data11.useSelect)(
18303 (select2) => select2(import_core_data4.store).getPostType("wp_block"),
18304 []
18305 );
18306 const labels = postTypeObject?.labels;
18307 const canCreateRecord = (0, import_data11.useSelect)(
18308 (select2) => select2(import_core_data4.store).canUser("create", {
18309 kind: "postType",
18310 name: "wp_block"
18311 }),
18312 []
18313 );
18314 const [showPatternModal, setShowPatternModal] = (0, import_element62.useState)(false);
18315 const handleQueryParamsChange = (0, import_element62.useCallback)(
18316 (params) => {
18317 navigate({
18318 search: {
18319 ...searchParams,
18320 ...params
18321 }
18322 });
18323 },
18324 [searchParams, navigate]
18325 );
18326 const { view, isModified, updateView, resetToDefault } = useView({
18327 kind: "postType",
18328 name: "wp_block",
18329 slug: "default-new",
18330 defaultView: DEFAULT_VIEW,
18331 queryParams: searchParams,
18332 onChangeQueryParams: handleQueryParamsChange
18333 });
18334 const onReset = () => {
18335 resetToDefault();
18336 invalidate();
18337 };
18338 const onChangeView = (newView) => {
18339 updateView(newView);
18340 if (newView.type !== view.type) {
18341 invalidate();
18342 }
18343 };
18344 const categoryFilter = (0, import_element62.useMemo)(() => {
18345 const filter = view.filters?.find((f2) => f2.field === "category");
18346 return filter?.value || "all-patterns";
18347 }, [view.filters]);
18348 const syncStatusFilter = (0, import_element62.useMemo)(() => {
18349 const filter = view.filters?.find((f2) => f2.field === "sync-status");
18350 return filter?.value;
18351 }, [view.filters]);
18352 const patternType = (0, import_element62.useMemo)(() => {
18353 if (type === "my-patterns") {
18354 return PATTERN_TYPES2.user;
18355 } else if (type === "registered") {
18356 return PATTERN_TYPES2.theme;
18357 }
18358 return null;
18359 }, [type]);
18360 const { patterns, isResolving } = use_patterns_default(
18361 patternType,
18362 categoryFilter,
18363 {
18364 search: view.search,
18365 syncStatus: syncStatusFilter
18366 }
18367 );
18368 const patternsWithPermissions = useAugmentPatternsWithPermissions(patterns);
18369 const patternCategoryField = usePatternCategoryField();
18370 const fields = (0, import_element62.useMemo)(() => {
18371 const patternFields = [
18372 previewField,
18373 patternTitleField,
18374 patternCategoryField
18375 ];
18376 if (type === "my-patterns" || type === "all") {
18377 patternFields.push(patternStatusField);
18378 }
18379 return patternFields;
18380 }, [type, patternCategoryField]);
18381 const { data: posts, paginationInfo } = (0, import_element62.useMemo)(() => {
18382 const viewWithoutFilters = { ...view };
18383 delete viewWithoutFilters.search;
18384 viewWithoutFilters.filters = [];
18385 return filterSortAndPaginate(
18386 patternsWithPermissions,
18387 viewWithoutFilters,
18388 fields
18389 );
18390 }, [patternsWithPermissions, view, fields]);
18391 const { totalItems, totalPages } = paginationInfo;
18392 const cleanupDeletedPostIdsFromUrl = (0, import_element62.useCallback)(
18393 (deletedItems) => {
18394 const deletedIds = deletedItems.map((item) => item.id);
18395 const currentPostIds = searchParams.postIds || [];
18396 const remainingPostIds = currentPostIds.filter(
18397 (id) => !deletedIds.includes(id)
18398 );
18399 if (remainingPostIds.length !== currentPostIds.length) {
18400 navigate({
18401 search: {
18402 ...searchParams,
18403 postIds: remainingPostIds.length > 0 ? remainingPostIds : void 0
18404 }
18405 });
18406 } else {
18407 invalidate();
18408 }
18409 },
18410 [invalidate, searchParams, navigate]
18411 );
18412 const postTypeActions = usePostActions({
18413 postType: "wp_block",
18414 context: "list",
18415 onActionPerformed: (actionId, items) => {
18416 if (actionId === "move-to-trash" || actionId === "permanently-delete") {
18417 cleanupDeletedPostIdsFromUrl(items);
18418 }
18419 }
18420 });
18421 const actions = (0, import_element62.useMemo)(() => {
18422 return [
18423 ...postTypeActions?.flatMap((action) => {
18424 if (action.id === "view-post-revisions") {
18425 return [];
18426 }
18427 return [action];
18428 })
18429 ];
18430 }, [postTypeActions]);
18431 const handleTabChange = (0, import_element62.useCallback)(
18432 (typeSlug) => {
18433 navigate({
18434 to: `/patterns/list/${typeSlug}`
18435 });
18436 },
18437 [navigate]
18438 );
18439 if (!postTypeObject) {
18440 return null;
18441 }
18442 const selection = searchParams.postIds ?? [];
18443 if (view.type === "list" && selection.length === 0 && posts?.length > 0) {
18444 selection.push(posts[0].id);
18445 }
18446 if (view.type === "list") {
18447 selection.splice(1);
18448 }
18449 return /* @__PURE__ */ React.createElement(
18450 page_default,
18451 {
18452 title: (0, import_i18n47.__)("Patterns"),
18453 subTitle: (0, import_i18n47.__)(
18454 "Reusable design elements for your site. Create once, use everywhere."
18455 ),
18456 className: "pattern-page",
18457 actions: labels?.add_new_item && canCreateRecord && /* @__PURE__ */ React.createElement(
18458 import_components47.Button,
18459 {
18460 variant: "primary",
18461 onClick: () => setShowPatternModal(true),
18462 size: "compact"
18463 },
18464 labels.add_new_item
18465 ),
18466 hasPadding: false
18467 },
18468 DEFAULT_VIEWS.length > 1 && /* @__PURE__ */ React.createElement("div", { className: "routes-pattern-list__tabs-wrapper" }, /* @__PURE__ */ React.createElement(
18469 Tabs,
18470 {
18471 onSelect: handleTabChange,
18472 selectedTabId: type ?? "all"
18473 },
18474 /* @__PURE__ */ React.createElement(Tabs.TabList, null, DEFAULT_VIEWS.map(
18475 (filter) => /* @__PURE__ */ React.createElement(
18476 Tabs.Tab,
18477 {
18478 tabId: filter.slug,
18479 key: filter.slug
18480 },
18481 filter.label
18482 )
18483 ))
18484 )),
18485 /* @__PURE__ */ React.createElement(
18486 dataviews_default,
18487 {
18488 data: posts,
18489 fields,
18490 view,
18491 onChangeView,
18492 actions,
18493 isLoading: isResolving,
18494 paginationInfo: {
18495 totalItems,
18496 totalPages
18497 },
18498 defaultLayouts: DEFAULT_LAYOUTS2,
18499 selection,
18500 onReset: isModified ? onReset : false,
18501 onChangeSelection: (items) => {
18502 navigate({
18503 search: {
18504 ...searchParams,
18505 postIds: items.length > 0 ? items : void 0,
18506 edit: items.length === 0 ? void 0 : searchParams.edit
18507 }
18508 });
18509 },
18510 isItemClickable: (item) => item.type !== PATTERN_TYPES2.theme,
18511 renderItemLink: ({
18512 item,
18513 ...props
18514 }) => /* @__PURE__ */ React.createElement(
18515 Link,
18516 {
18517 to: `/types/wp_block/edit/${encodeURIComponent(
18518 item.id
18519 )}`,
18520 ...props,
18521 onClick: (event) => {
18522 event.stopPropagation();
18523 }
18524 }
18525 )
18526 }
18527 ),
18528 showPatternModal && /* @__PURE__ */ React.createElement(
18529 CreatePatternModal,
18530 {
18531 onClose: () => setShowPatternModal(false),
18532 onSuccess: ({
18533 pattern
18534 }) => {
18535 setShowPatternModal(false);
18536 navigate({
18537 to: `/types/wp_block/edit/${encodeURIComponent(
18538 pattern.id
18539 )}`
18540 });
18541 },
18542 content: []
18543 }
18544 )
18545 );
18546 }
18547 var stage = PatternList;
18548 export {
18549 stage
18550 };
18551 /*! Bundled license information:
18552
18553 use-sync-external-store/cjs/use-sync-external-store-shim.development.js:
18554 (**
18555 * @license React
18556 * use-sync-external-store-shim.development.js
18557 *
18558 * Copyright (c) Meta Platforms, Inc. and affiliates.
18559 *
18560 * This source code is licensed under the MIT license found in the
18561 * LICENSE file in the root directory of this source tree.
18562 *)
18563 */
18564