PluginProbe
Gutenberg / 22.7.0
Gutenberg v22.7.0
24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 All 403 releases
gutenberg / build / routes / pattern-list / content.js

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

17,778 lines 590.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 var __create = Object.create;
2 var __defProp = Object.defineProperty;
3 var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4 var __getOwnPropNames = Object.getOwnPropertyNames;
5 var __getProtoOf = Object.getPrototypeOf;
6 var __hasOwnProp = Object.prototype.hasOwnProperty;
7 var __commonJS = (cb, mod) => function __require() {
8 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9 };
10 var __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/compose
49 var require_compose = __commonJS({
50 "package-external:@wordpress/compose"(exports, module) {
51 module.exports = window.wp.compose;
52 }
53 });
54
55 // vendor-external:react
56 var require_react = __commonJS({
57 "vendor-external:react"(exports, module) {
58 module.exports = window.React;
59 }
60 });
61
62 // vendor-external:react/jsx-runtime
63 var require_jsx_runtime = __commonJS({
64 "vendor-external:react/jsx-runtime"(exports, module) {
65 module.exports = window.ReactJSXRuntime;
66 }
67 });
68
69 // vendor-external:react-dom
70 var require_react_dom = __commonJS({
71 "vendor-external:react-dom"(exports, module) {
72 module.exports = window.ReactDOM;
73 }
74 });
75
76 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js
77 var require_use_sync_external_store_shim_development = __commonJS({
78 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) {
79 "use strict";
80 (function() {
81 function is(x2, y2) {
82 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2;
83 }
84 function useSyncExternalStore$2(subscribe2, getSnapshot) {
85 didWarnOld18Alpha || void 0 === React9.startTransition || (didWarnOld18Alpha = true, console.error(
86 "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."
87 ));
88 var value = getSnapshot();
89 if (!didWarnUncachedGetSnapshot) {
90 var cachedValue = getSnapshot();
91 objectIs(value, cachedValue) || (console.error(
92 "The result of getSnapshot should be cached to avoid an infinite loop"
93 ), didWarnUncachedGetSnapshot = true);
94 }
95 cachedValue = useState25({
96 inst: { value, getSnapshot }
97 });
98 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1];
99 useLayoutEffect2(
100 function() {
101 inst.value = value;
102 inst.getSnapshot = getSnapshot;
103 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
104 },
105 [subscribe2, value, getSnapshot]
106 );
107 useEffect19(
108 function() {
109 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
110 return subscribe2(function() {
111 checkIfSnapshotChanged(inst) && forceUpdate({ inst });
112 });
113 },
114 [subscribe2]
115 );
116 useDebugValue(value);
117 return value;
118 }
119 function checkIfSnapshotChanged(inst) {
120 var latestGetSnapshot = inst.getSnapshot;
121 inst = inst.value;
122 try {
123 var nextValue = latestGetSnapshot();
124 return !objectIs(inst, nextValue);
125 } catch (error) {
126 return true;
127 }
128 }
129 function useSyncExternalStore$1(subscribe2, getSnapshot) {
130 return getSnapshot();
131 }
132 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
133 var React9 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState25 = React9.useState, useEffect19 = React9.useEffect, useLayoutEffect2 = 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;
134 exports.useSyncExternalStore = void 0 !== React9.useSyncExternalStore ? React9.useSyncExternalStore : shim;
135 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
136 })();
137 }
138 });
139
140 // node_modules/use-sync-external-store/shim/index.js
141 var require_shim = __commonJS({
142 "node_modules/use-sync-external-store/shim/index.js"(exports, module) {
143 "use strict";
144 if (false) {
145 module.exports = null;
146 } else {
147 module.exports = require_use_sync_external_store_shim_development();
148 }
149 }
150 });
151
152 // package-external:@wordpress/i18n
153 var require_i18n = __commonJS({
154 "package-external:@wordpress/i18n"(exports, module) {
155 module.exports = window.wp.i18n;
156 }
157 });
158
159 // package-external:@wordpress/primitives
160 var require_primitives = __commonJS({
161 "package-external:@wordpress/primitives"(exports, module) {
162 module.exports = window.wp.primitives;
163 }
164 });
165
166 // package-external:@wordpress/private-apis
167 var require_private_apis = __commonJS({
168 "package-external:@wordpress/private-apis"(exports, module) {
169 module.exports = window.wp.privateApis;
170 }
171 });
172
173 // package-external:@wordpress/components
174 var require_components = __commonJS({
175 "package-external:@wordpress/components"(exports, module) {
176 module.exports = window.wp.components;
177 }
178 });
179
180 // package-external:@wordpress/keycodes
181 var require_keycodes = __commonJS({
182 "package-external:@wordpress/keycodes"(exports, module) {
183 module.exports = window.wp.keycodes;
184 }
185 });
186
187 // node_modules/remove-accents/index.js
188 var require_remove_accents = __commonJS({
189 "node_modules/remove-accents/index.js"(exports, module) {
190 var characterMap = {
191 "\xC0": "A",
192 "\xC1": "A",
193 "\xC2": "A",
194 "\xC3": "A",
195 "\xC4": "A",
196 "\xC5": "A",
197 "\u1EA4": "A",
198 "\u1EAE": "A",
199 "\u1EB2": "A",
200 "\u1EB4": "A",
201 "\u1EB6": "A",
202 "\xC6": "AE",
203 "\u1EA6": "A",
204 "\u1EB0": "A",
205 "\u0202": "A",
206 "\u1EA2": "A",
207 "\u1EA0": "A",
208 "\u1EA8": "A",
209 "\u1EAA": "A",
210 "\u1EAC": "A",
211 "\xC7": "C",
212 "\u1E08": "C",
213 "\xC8": "E",
214 "\xC9": "E",
215 "\xCA": "E",
216 "\xCB": "E",
217 "\u1EBE": "E",
218 "\u1E16": "E",
219 "\u1EC0": "E",
220 "\u1E14": "E",
221 "\u1E1C": "E",
222 "\u0206": "E",
223 "\u1EBA": "E",
224 "\u1EBC": "E",
225 "\u1EB8": "E",
226 "\u1EC2": "E",
227 "\u1EC4": "E",
228 "\u1EC6": "E",
229 "\xCC": "I",
230 "\xCD": "I",
231 "\xCE": "I",
232 "\xCF": "I",
233 "\u1E2E": "I",
234 "\u020A": "I",
235 "\u1EC8": "I",
236 "\u1ECA": "I",
237 "\xD0": "D",
238 "\xD1": "N",
239 "\xD2": "O",
240 "\xD3": "O",
241 "\xD4": "O",
242 "\xD5": "O",
243 "\xD6": "O",
244 "\xD8": "O",
245 "\u1ED0": "O",
246 "\u1E4C": "O",
247 "\u1E52": "O",
248 "\u020E": "O",
249 "\u1ECE": "O",
250 "\u1ECC": "O",
251 "\u1ED4": "O",
252 "\u1ED6": "O",
253 "\u1ED8": "O",
254 "\u1EDC": "O",
255 "\u1EDE": "O",
256 "\u1EE0": "O",
257 "\u1EDA": "O",
258 "\u1EE2": "O",
259 "\xD9": "U",
260 "\xDA": "U",
261 "\xDB": "U",
262 "\xDC": "U",
263 "\u1EE6": "U",
264 "\u1EE4": "U",
265 "\u1EEC": "U",
266 "\u1EEE": "U",
267 "\u1EF0": "U",
268 "\xDD": "Y",
269 "\xE0": "a",
270 "\xE1": "a",
271 "\xE2": "a",
272 "\xE3": "a",
273 "\xE4": "a",
274 "\xE5": "a",
275 "\u1EA5": "a",
276 "\u1EAF": "a",
277 "\u1EB3": "a",
278 "\u1EB5": "a",
279 "\u1EB7": "a",
280 "\xE6": "ae",
281 "\u1EA7": "a",
282 "\u1EB1": "a",
283 "\u0203": "a",
284 "\u1EA3": "a",
285 "\u1EA1": "a",
286 "\u1EA9": "a",
287 "\u1EAB": "a",
288 "\u1EAD": "a",
289 "\xE7": "c",
290 "\u1E09": "c",
291 "\xE8": "e",
292 "\xE9": "e",
293 "\xEA": "e",
294 "\xEB": "e",
295 "\u1EBF": "e",
296 "\u1E17": "e",
297 "\u1EC1": "e",
298 "\u1E15": "e",
299 "\u1E1D": "e",
300 "\u0207": "e",
301 "\u1EBB": "e",
302 "\u1EBD": "e",
303 "\u1EB9": "e",
304 "\u1EC3": "e",
305 "\u1EC5": "e",
306 "\u1EC7": "e",
307 "\xEC": "i",
308 "\xED": "i",
309 "\xEE": "i",
310 "\xEF": "i",
311 "\u1E2F": "i",
312 "\u020B": "i",
313 "\u1EC9": "i",
314 "\u1ECB": "i",
315 "\xF0": "d",
316 "\xF1": "n",
317 "\xF2": "o",
318 "\xF3": "o",
319 "\xF4": "o",
320 "\xF5": "o",
321 "\xF6": "o",
322 "\xF8": "o",
323 "\u1ED1": "o",
324 "\u1E4D": "o",
325 "\u1E53": "o",
326 "\u020F": "o",
327 "\u1ECF": "o",
328 "\u1ECD": "o",
329 "\u1ED5": "o",
330 "\u1ED7": "o",
331 "\u1ED9": "o",
332 "\u1EDD": "o",
333 "\u1EDF": "o",
334 "\u1EE1": "o",
335 "\u1EDB": "o",
336 "\u1EE3": "o",
337 "\xF9": "u",
338 "\xFA": "u",
339 "\xFB": "u",
340 "\xFC": "u",
341 "\u1EE7": "u",
342 "\u1EE5": "u",
343 "\u1EED": "u",
344 "\u1EEF": "u",
345 "\u1EF1": "u",
346 "\xFD": "y",
347 "\xFF": "y",
348 "\u0100": "A",
349 "\u0101": "a",
350 "\u0102": "A",
351 "\u0103": "a",
352 "\u0104": "A",
353 "\u0105": "a",
354 "\u0106": "C",
355 "\u0107": "c",
356 "\u0108": "C",
357 "\u0109": "c",
358 "\u010A": "C",
359 "\u010B": "c",
360 "\u010C": "C",
361 "\u010D": "c",
362 "C\u0306": "C",
363 "c\u0306": "c",
364 "\u010E": "D",
365 "\u010F": "d",
366 "\u0110": "D",
367 "\u0111": "d",
368 "\u0112": "E",
369 "\u0113": "e",
370 "\u0114": "E",
371 "\u0115": "e",
372 "\u0116": "E",
373 "\u0117": "e",
374 "\u0118": "E",
375 "\u0119": "e",
376 "\u011A": "E",
377 "\u011B": "e",
378 "\u011C": "G",
379 "\u01F4": "G",
380 "\u011D": "g",
381 "\u01F5": "g",
382 "\u011E": "G",
383 "\u011F": "g",
384 "\u0120": "G",
385 "\u0121": "g",
386 "\u0122": "G",
387 "\u0123": "g",
388 "\u0124": "H",
389 "\u0125": "h",
390 "\u0126": "H",
391 "\u0127": "h",
392 "\u1E2A": "H",
393 "\u1E2B": "h",
394 "\u0128": "I",
395 "\u0129": "i",
396 "\u012A": "I",
397 "\u012B": "i",
398 "\u012C": "I",
399 "\u012D": "i",
400 "\u012E": "I",
401 "\u012F": "i",
402 "\u0130": "I",
403 "\u0131": "i",
404 "\u0132": "IJ",
405 "\u0133": "ij",
406 "\u0134": "J",
407 "\u0135": "j",
408 "\u0136": "K",
409 "\u0137": "k",
410 "\u1E30": "K",
411 "\u1E31": "k",
412 "K\u0306": "K",
413 "k\u0306": "k",
414 "\u0139": "L",
415 "\u013A": "l",
416 "\u013B": "L",
417 "\u013C": "l",
418 "\u013D": "L",
419 "\u013E": "l",
420 "\u013F": "L",
421 "\u0140": "l",
422 "\u0141": "l",
423 "\u0142": "l",
424 "\u1E3E": "M",
425 "\u1E3F": "m",
426 "M\u0306": "M",
427 "m\u0306": "m",
428 "\u0143": "N",
429 "\u0144": "n",
430 "\u0145": "N",
431 "\u0146": "n",
432 "\u0147": "N",
433 "\u0148": "n",
434 "\u0149": "n",
435 "N\u0306": "N",
436 "n\u0306": "n",
437 "\u014C": "O",
438 "\u014D": "o",
439 "\u014E": "O",
440 "\u014F": "o",
441 "\u0150": "O",
442 "\u0151": "o",
443 "\u0152": "OE",
444 "\u0153": "oe",
445 "P\u0306": "P",
446 "p\u0306": "p",
447 "\u0154": "R",
448 "\u0155": "r",
449 "\u0156": "R",
450 "\u0157": "r",
451 "\u0158": "R",
452 "\u0159": "r",
453 "R\u0306": "R",
454 "r\u0306": "r",
455 "\u0212": "R",
456 "\u0213": "r",
457 "\u015A": "S",
458 "\u015B": "s",
459 "\u015C": "S",
460 "\u015D": "s",
461 "\u015E": "S",
462 "\u0218": "S",
463 "\u0219": "s",
464 "\u015F": "s",
465 "\u0160": "S",
466 "\u0161": "s",
467 "\u0162": "T",
468 "\u0163": "t",
469 "\u021B": "t",
470 "\u021A": "T",
471 "\u0164": "T",
472 "\u0165": "t",
473 "\u0166": "T",
474 "\u0167": "t",
475 "T\u0306": "T",
476 "t\u0306": "t",
477 "\u0168": "U",
478 "\u0169": "u",
479 "\u016A": "U",
480 "\u016B": "u",
481 "\u016C": "U",
482 "\u016D": "u",
483 "\u016E": "U",
484 "\u016F": "u",
485 "\u0170": "U",
486 "\u0171": "u",
487 "\u0172": "U",
488 "\u0173": "u",
489 "\u0216": "U",
490 "\u0217": "u",
491 "V\u0306": "V",
492 "v\u0306": "v",
493 "\u0174": "W",
494 "\u0175": "w",
495 "\u1E82": "W",
496 "\u1E83": "w",
497 "X\u0306": "X",
498 "x\u0306": "x",
499 "\u0176": "Y",
500 "\u0177": "y",
501 "\u0178": "Y",
502 "Y\u0306": "Y",
503 "y\u0306": "y",
504 "\u0179": "Z",
505 "\u017A": "z",
506 "\u017B": "Z",
507 "\u017C": "z",
508 "\u017D": "Z",
509 "\u017E": "z",
510 "\u017F": "s",
511 "\u0192": "f",
512 "\u01A0": "O",
513 "\u01A1": "o",
514 "\u01AF": "U",
515 "\u01B0": "u",
516 "\u01CD": "A",
517 "\u01CE": "a",
518 "\u01CF": "I",
519 "\u01D0": "i",
520 "\u01D1": "O",
521 "\u01D2": "o",
522 "\u01D3": "U",
523 "\u01D4": "u",
524 "\u01D5": "U",
525 "\u01D6": "u",
526 "\u01D7": "U",
527 "\u01D8": "u",
528 "\u01D9": "U",
529 "\u01DA": "u",
530 "\u01DB": "U",
531 "\u01DC": "u",
532 "\u1EE8": "U",
533 "\u1EE9": "u",
534 "\u1E78": "U",
535 "\u1E79": "u",
536 "\u01FA": "A",
537 "\u01FB": "a",
538 "\u01FC": "AE",
539 "\u01FD": "ae",
540 "\u01FE": "O",
541 "\u01FF": "o",
542 "\xDE": "TH",
543 "\xFE": "th",
544 "\u1E54": "P",
545 "\u1E55": "p",
546 "\u1E64": "S",
547 "\u1E65": "s",
548 "X\u0301": "X",
549 "x\u0301": "x",
550 "\u0403": "\u0413",
551 "\u0453": "\u0433",
552 "\u040C": "\u041A",
553 "\u045C": "\u043A",
554 "A\u030B": "A",
555 "a\u030B": "a",
556 "E\u030B": "E",
557 "e\u030B": "e",
558 "I\u030B": "I",
559 "i\u030B": "i",
560 "\u01F8": "N",
561 "\u01F9": "n",
562 "\u1ED2": "O",
563 "\u1ED3": "o",
564 "\u1E50": "O",
565 "\u1E51": "o",
566 "\u1EEA": "U",
567 "\u1EEB": "u",
568 "\u1E80": "W",
569 "\u1E81": "w",
570 "\u1EF2": "Y",
571 "\u1EF3": "y",
572 "\u0200": "A",
573 "\u0201": "a",
574 "\u0204": "E",
575 "\u0205": "e",
576 "\u0208": "I",
577 "\u0209": "i",
578 "\u020C": "O",
579 "\u020D": "o",
580 "\u0210": "R",
581 "\u0211": "r",
582 "\u0214": "U",
583 "\u0215": "u",
584 "B\u030C": "B",
585 "b\u030C": "b",
586 "\u010C\u0323": "C",
587 "\u010D\u0323": "c",
588 "\xCA\u030C": "E",
589 "\xEA\u030C": "e",
590 "F\u030C": "F",
591 "f\u030C": "f",
592 "\u01E6": "G",
593 "\u01E7": "g",
594 "\u021E": "H",
595 "\u021F": "h",
596 "J\u030C": "J",
597 "\u01F0": "j",
598 "\u01E8": "K",
599 "\u01E9": "k",
600 "M\u030C": "M",
601 "m\u030C": "m",
602 "P\u030C": "P",
603 "p\u030C": "p",
604 "Q\u030C": "Q",
605 "q\u030C": "q",
606 "\u0158\u0329": "R",
607 "\u0159\u0329": "r",
608 "\u1E66": "S",
609 "\u1E67": "s",
610 "V\u030C": "V",
611 "v\u030C": "v",
612 "W\u030C": "W",
613 "w\u030C": "w",
614 "X\u030C": "X",
615 "x\u030C": "x",
616 "Y\u030C": "Y",
617 "y\u030C": "y",
618 "A\u0327": "A",
619 "a\u0327": "a",
620 "B\u0327": "B",
621 "b\u0327": "b",
622 "\u1E10": "D",
623 "\u1E11": "d",
624 "\u0228": "E",
625 "\u0229": "e",
626 "\u0190\u0327": "E",
627 "\u025B\u0327": "e",
628 "\u1E28": "H",
629 "\u1E29": "h",
630 "I\u0327": "I",
631 "i\u0327": "i",
632 "\u0197\u0327": "I",
633 "\u0268\u0327": "i",
634 "M\u0327": "M",
635 "m\u0327": "m",
636 "O\u0327": "O",
637 "o\u0327": "o",
638 "Q\u0327": "Q",
639 "q\u0327": "q",
640 "U\u0327": "U",
641 "u\u0327": "u",
642 "X\u0327": "X",
643 "x\u0327": "x",
644 "Z\u0327": "Z",
645 "z\u0327": "z",
646 "\u0439": "\u0438",
647 "\u0419": "\u0418",
648 "\u0451": "\u0435",
649 "\u0401": "\u0415"
650 };
651 var chars = Object.keys(characterMap).join("|");
652 var allAccents = new RegExp(chars, "g");
653 var firstAccent = new RegExp(chars, "");
654 function matcher(match2) {
655 return characterMap[match2];
656 }
657 var removeAccents3 = function(string) {
658 return string.replace(allAccents, matcher);
659 };
660 var hasAccents = function(string) {
661 return !!string.match(firstAccent);
662 };
663 module.exports = removeAccents3;
664 module.exports.has = hasAccents;
665 module.exports.remove = removeAccents3;
666 }
667 });
668
669 // node_modules/fast-deep-equal/es6/index.js
670 var require_es6 = __commonJS({
671 "node_modules/fast-deep-equal/es6/index.js"(exports, module) {
672 "use strict";
673 module.exports = function equal(a2, b2) {
674 if (a2 === b2) return true;
675 if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") {
676 if (a2.constructor !== b2.constructor) return false;
677 var length, i2, keys;
678 if (Array.isArray(a2)) {
679 length = a2.length;
680 if (length != b2.length) return false;
681 for (i2 = length; i2-- !== 0; )
682 if (!equal(a2[i2], b2[i2])) return false;
683 return true;
684 }
685 if (a2 instanceof Map && b2 instanceof Map) {
686 if (a2.size !== b2.size) return false;
687 for (i2 of a2.entries())
688 if (!b2.has(i2[0])) return false;
689 for (i2 of a2.entries())
690 if (!equal(i2[1], b2.get(i2[0]))) return false;
691 return true;
692 }
693 if (a2 instanceof Set && b2 instanceof Set) {
694 if (a2.size !== b2.size) return false;
695 for (i2 of a2.entries())
696 if (!b2.has(i2[0])) return false;
697 return true;
698 }
699 if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) {
700 length = a2.length;
701 if (length != b2.length) return false;
702 for (i2 = length; i2-- !== 0; )
703 if (a2[i2] !== b2[i2]) return false;
704 return true;
705 }
706 if (a2.constructor === RegExp) return a2.source === b2.source && a2.flags === b2.flags;
707 if (a2.valueOf !== Object.prototype.valueOf) return a2.valueOf() === b2.valueOf();
708 if (a2.toString !== Object.prototype.toString) return a2.toString() === b2.toString();
709 keys = Object.keys(a2);
710 length = keys.length;
711 if (length !== Object.keys(b2).length) return false;
712 for (i2 = length; i2-- !== 0; )
713 if (!Object.prototype.hasOwnProperty.call(b2, keys[i2])) return false;
714 for (i2 = length; i2-- !== 0; ) {
715 var key = keys[i2];
716 if (!equal(a2[key], b2[key])) return false;
717 }
718 return true;
719 }
720 return a2 !== a2 && b2 !== b2;
721 };
722 }
723 });
724
725 // package-external:@wordpress/date
726 var require_date = __commonJS({
727 "package-external:@wordpress/date"(exports, module) {
728 module.exports = window.wp.date;
729 }
730 });
731
732 // package-external:@wordpress/warning
733 var require_warning = __commonJS({
734 "package-external:@wordpress/warning"(exports, module) {
735 module.exports = window.wp.warning;
736 }
737 });
738
739 // package-external:@wordpress/deprecated
740 var require_deprecated = __commonJS({
741 "package-external:@wordpress/deprecated"(exports, module) {
742 module.exports = window.wp.deprecated;
743 }
744 });
745
746 // package-external:@wordpress/core-data
747 var require_core_data = __commonJS({
748 "package-external:@wordpress/core-data"(exports, module) {
749 module.exports = window.wp.coreData;
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 } = (0, import_data.useDispatch)(import_preferences.store);
1002 const baseView = persistedView ?? defaultView;
1003 const page = Number(queryParams?.page ?? baseView.page ?? 1);
1004 const search = queryParams?.search ?? baseView.search ?? "";
1005 const view = (0, import_element.useMemo)(() => {
1006 return mergeActiveViewOverrides(
1007 {
1008 ...baseView,
1009 page,
1010 search
1011 },
1012 activeViewOverrides,
1013 defaultView
1014 );
1015 }, [baseView, page, search, activeViewOverrides, defaultView]);
1016 const isModified = !!persistedView;
1017 const updateView = (0, import_element.useCallback)(
1018 (newView) => {
1019 const urlParams = {
1020 page: newView?.page,
1021 search: newView?.search
1022 };
1023 const preferenceView = stripActiveViewOverrides(
1024 omit(newView, ["page", "search"]),
1025 activeViewOverrides,
1026 defaultView
1027 );
1028 if (onChangeQueryParams && !dequal(urlParams, { page, search })) {
1029 onChangeQueryParams(urlParams);
1030 }
1031 const comparableBaseView = stripActiveViewOverrides(
1032 baseView,
1033 activeViewOverrides,
1034 defaultView
1035 );
1036 const comparableDefaultView = stripActiveViewOverrides(
1037 defaultView,
1038 activeViewOverrides,
1039 defaultView
1040 );
1041 if (!dequal(comparableBaseView, preferenceView)) {
1042 if (dequal(preferenceView, comparableDefaultView)) {
1043 set("core/views", preferenceKey, void 0);
1044 } else {
1045 set("core/views", preferenceKey, preferenceView);
1046 }
1047 }
1048 },
1049 [
1050 onChangeQueryParams,
1051 page,
1052 search,
1053 baseView,
1054 defaultView,
1055 activeViewOverrides,
1056 set,
1057 preferenceKey
1058 ]
1059 );
1060 const resetToDefault = (0, import_element.useCallback)(() => {
1061 set("core/views", preferenceKey, void 0);
1062 }, [preferenceKey, set]);
1063 return {
1064 view,
1065 isModified,
1066 updateView,
1067 resetToDefault
1068 };
1069 }
1070
1071 // packages/views/build-module/load-view.mjs
1072 var import_data2 = __toESM(require_data(), 1);
1073 var import_preferences2 = __toESM(require_preferences(), 1);
1074
1075 // packages/dataviews/build-module/dataviews/index.mjs
1076 var import_element56 = __toESM(require_element(), 1);
1077 var import_compose12 = __toESM(require_compose(), 1);
1078
1079 // node_modules/@base-ui/utils/esm/useRefWithInit.js
1080 var React2 = __toESM(require_react(), 1);
1081 var UNINITIALIZED = {};
1082 function useRefWithInit(init2, initArg) {
1083 const ref = React2.useRef(UNINITIALIZED);
1084 if (ref.current === UNINITIALIZED) {
1085 ref.current = init2(initArg);
1086 }
1087 return ref;
1088 }
1089
1090 // node_modules/@base-ui/react/esm/utils/useRenderElement.js
1091 var React5 = __toESM(require_react(), 1);
1092
1093 // node_modules/@base-ui/utils/esm/useMergedRefs.js
1094 function useMergedRefs(a2, b2, c2, d2) {
1095 const forkRef = useRefWithInit(createForkRef).current;
1096 if (didChange(forkRef, a2, b2, c2, d2)) {
1097 update(forkRef, [a2, b2, c2, d2]);
1098 }
1099 return forkRef.callback;
1100 }
1101 function useMergedRefsN(refs) {
1102 const forkRef = useRefWithInit(createForkRef).current;
1103 if (didChangeN(forkRef, refs)) {
1104 update(forkRef, refs);
1105 }
1106 return forkRef.callback;
1107 }
1108 function createForkRef() {
1109 return {
1110 callback: null,
1111 cleanup: null,
1112 refs: []
1113 };
1114 }
1115 function didChange(forkRef, a2, b2, c2, d2) {
1116 return forkRef.refs[0] !== a2 || forkRef.refs[1] !== b2 || forkRef.refs[2] !== c2 || forkRef.refs[3] !== d2;
1117 }
1118 function didChangeN(forkRef, newRefs) {
1119 return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index) => ref !== newRefs[index]);
1120 }
1121 function update(forkRef, refs) {
1122 forkRef.refs = refs;
1123 if (refs.every((ref) => ref == null)) {
1124 forkRef.callback = null;
1125 return;
1126 }
1127 forkRef.callback = (instance) => {
1128 if (forkRef.cleanup) {
1129 forkRef.cleanup();
1130 forkRef.cleanup = null;
1131 }
1132 if (instance != null) {
1133 const cleanupCallbacks = Array(refs.length).fill(null);
1134 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1135 const ref = refs[i2];
1136 if (ref == null) {
1137 continue;
1138 }
1139 switch (typeof ref) {
1140 case "function": {
1141 const refCleanup = ref(instance);
1142 if (typeof refCleanup === "function") {
1143 cleanupCallbacks[i2] = refCleanup;
1144 }
1145 break;
1146 }
1147 case "object": {
1148 ref.current = instance;
1149 break;
1150 }
1151 default:
1152 }
1153 }
1154 forkRef.cleanup = () => {
1155 for (let i2 = 0; i2 < refs.length; i2 += 1) {
1156 const ref = refs[i2];
1157 if (ref == null) {
1158 continue;
1159 }
1160 switch (typeof ref) {
1161 case "function": {
1162 const cleanupCallback = cleanupCallbacks[i2];
1163 if (typeof cleanupCallback === "function") {
1164 cleanupCallback();
1165 } else {
1166 ref(null);
1167 }
1168 break;
1169 }
1170 case "object": {
1171 ref.current = null;
1172 break;
1173 }
1174 default:
1175 }
1176 }
1177 };
1178 }
1179 };
1180 }
1181
1182 // node_modules/@base-ui/utils/esm/getReactElementRef.js
1183 var React4 = __toESM(require_react(), 1);
1184
1185 // node_modules/@base-ui/utils/esm/reactVersion.js
1186 var React3 = __toESM(require_react(), 1);
1187 var majorVersion = parseInt(React3.version, 10);
1188 function isReactVersionAtLeast(reactVersionToCheck) {
1189 return majorVersion >= reactVersionToCheck;
1190 }
1191
1192 // node_modules/@base-ui/utils/esm/getReactElementRef.js
1193 function getReactElementRef(element) {
1194 if (!/* @__PURE__ */ React4.isValidElement(element)) {
1195 return null;
1196 }
1197 const reactElement = element;
1198 const propsWithRef = reactElement.props;
1199 return (isReactVersionAtLeast(19) ? propsWithRef?.ref : reactElement.ref) ?? null;
1200 }
1201
1202 // node_modules/@base-ui/utils/esm/mergeObjects.js
1203 function mergeObjects(a2, b2) {
1204 if (a2 && !b2) {
1205 return a2;
1206 }
1207 if (!a2 && b2) {
1208 return b2;
1209 }
1210 if (a2 || b2) {
1211 return {
1212 ...a2,
1213 ...b2
1214 };
1215 }
1216 return void 0;
1217 }
1218
1219 // node_modules/@base-ui/react/esm/utils/getStateAttributesProps.js
1220 function getStateAttributesProps(state, customMapping) {
1221 const props = {};
1222 for (const key in state) {
1223 const value = state[key];
1224 if (customMapping?.hasOwnProperty(key)) {
1225 const customProps = customMapping[key](value);
1226 if (customProps != null) {
1227 Object.assign(props, customProps);
1228 }
1229 continue;
1230 }
1231 if (value === true) {
1232 props[`data-${key.toLowerCase()}`] = "";
1233 } else if (value) {
1234 props[`data-${key.toLowerCase()}`] = value.toString();
1235 }
1236 }
1237 return props;
1238 }
1239
1240 // node_modules/@base-ui/react/esm/utils/resolveClassName.js
1241 function resolveClassName(className, state) {
1242 return typeof className === "function" ? className(state) : className;
1243 }
1244
1245 // node_modules/@base-ui/react/esm/utils/resolveStyle.js
1246 function resolveStyle(style, state) {
1247 return typeof style === "function" ? style(state) : style;
1248 }
1249
1250 // node_modules/@base-ui/react/esm/merge-props/mergeProps.js
1251 var EMPTY_PROPS = {};
1252 function mergeProps(a2, b2, c2, d2, e2) {
1253 let merged = {
1254 ...resolvePropsGetter(a2, EMPTY_PROPS)
1255 };
1256 if (b2) {
1257 merged = mergeOne(merged, b2);
1258 }
1259 if (c2) {
1260 merged = mergeOne(merged, c2);
1261 }
1262 if (d2) {
1263 merged = mergeOne(merged, d2);
1264 }
1265 if (e2) {
1266 merged = mergeOne(merged, e2);
1267 }
1268 return merged;
1269 }
1270 function mergePropsN(props) {
1271 if (props.length === 0) {
1272 return EMPTY_PROPS;
1273 }
1274 if (props.length === 1) {
1275 return resolvePropsGetter(props[0], EMPTY_PROPS);
1276 }
1277 let merged = {
1278 ...resolvePropsGetter(props[0], EMPTY_PROPS)
1279 };
1280 for (let i2 = 1; i2 < props.length; i2 += 1) {
1281 merged = mergeOne(merged, props[i2]);
1282 }
1283 return merged;
1284 }
1285 function mergeOne(merged, inputProps) {
1286 if (isPropsGetter(inputProps)) {
1287 return inputProps(merged);
1288 }
1289 return mutablyMergeInto(merged, inputProps);
1290 }
1291 function mutablyMergeInto(mergedProps, externalProps) {
1292 if (!externalProps) {
1293 return mergedProps;
1294 }
1295 for (const propName in externalProps) {
1296 const externalPropValue = externalProps[propName];
1297 switch (propName) {
1298 case "style": {
1299 mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue);
1300 break;
1301 }
1302 case "className": {
1303 mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue);
1304 break;
1305 }
1306 default: {
1307 if (isEventHandler(propName, externalPropValue)) {
1308 mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue);
1309 } else {
1310 mergedProps[propName] = externalPropValue;
1311 }
1312 }
1313 }
1314 }
1315 return mergedProps;
1316 }
1317 function isEventHandler(key, value) {
1318 const code0 = key.charCodeAt(0);
1319 const code1 = key.charCodeAt(1);
1320 const code2 = key.charCodeAt(2);
1321 return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined");
1322 }
1323 function isPropsGetter(inputProps) {
1324 return typeof inputProps === "function";
1325 }
1326 function resolvePropsGetter(inputProps, previousProps) {
1327 if (isPropsGetter(inputProps)) {
1328 return inputProps(previousProps);
1329 }
1330 return inputProps ?? EMPTY_PROPS;
1331 }
1332 function mergeEventHandlers(ourHandler, theirHandler) {
1333 if (!theirHandler) {
1334 return ourHandler;
1335 }
1336 if (!ourHandler) {
1337 return theirHandler;
1338 }
1339 return (event) => {
1340 if (isSyntheticEvent(event)) {
1341 const baseUIEvent = event;
1342 makeEventPreventable(baseUIEvent);
1343 const result2 = theirHandler(baseUIEvent);
1344 if (!baseUIEvent.baseUIHandlerPrevented) {
1345 ourHandler?.(baseUIEvent);
1346 }
1347 return result2;
1348 }
1349 const result = theirHandler(event);
1350 ourHandler?.(event);
1351 return result;
1352 };
1353 }
1354 function makeEventPreventable(event) {
1355 event.preventBaseUIHandler = () => {
1356 event.baseUIHandlerPrevented = true;
1357 };
1358 return event;
1359 }
1360 function mergeClassNames(ourClassName, theirClassName) {
1361 if (theirClassName) {
1362 if (ourClassName) {
1363 return theirClassName + " " + ourClassName;
1364 }
1365 return theirClassName;
1366 }
1367 return ourClassName;
1368 }
1369 function isSyntheticEvent(event) {
1370 return event != null && typeof event === "object" && "nativeEvent" in event;
1371 }
1372
1373 // node_modules/@base-ui/utils/esm/empty.js
1374 var EMPTY_ARRAY = Object.freeze([]);
1375 var EMPTY_OBJECT = Object.freeze({});
1376
1377 // node_modules/@base-ui/react/esm/utils/useRenderElement.js
1378 var import_react = __toESM(require_react(), 1);
1379 function useRenderElement(element, componentProps, params = {}) {
1380 const renderProp = componentProps.render;
1381 const outProps = useRenderElementProps(componentProps, params);
1382 if (params.enabled === false) {
1383 return null;
1384 }
1385 const state = params.state ?? EMPTY_OBJECT;
1386 return evaluateRenderProp(element, renderProp, outProps, state);
1387 }
1388 function useRenderElementProps(componentProps, params = {}) {
1389 const {
1390 className: classNameProp,
1391 style: styleProp,
1392 render: renderProp
1393 } = componentProps;
1394 const {
1395 state = EMPTY_OBJECT,
1396 ref,
1397 props,
1398 stateAttributesMapping,
1399 enabled = true
1400 } = params;
1401 const className = enabled ? resolveClassName(classNameProp, state) : void 0;
1402 const style = enabled ? resolveStyle(styleProp, state) : void 0;
1403 const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping) : EMPTY_OBJECT;
1404 const outProps = enabled ? mergeObjects(stateProps, Array.isArray(props) ? mergePropsN(props) : props) ?? EMPTY_OBJECT : EMPTY_OBJECT;
1405 if (typeof document !== "undefined") {
1406 if (!enabled) {
1407 useMergedRefs(null, null);
1408 } else if (Array.isArray(ref)) {
1409 outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]);
1410 } else {
1411 outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref);
1412 }
1413 }
1414 if (!enabled) {
1415 return EMPTY_OBJECT;
1416 }
1417 if (className !== void 0) {
1418 outProps.className = mergeClassNames(outProps.className, className);
1419 }
1420 if (style !== void 0) {
1421 outProps.style = mergeObjects(outProps.style, style);
1422 }
1423 return outProps;
1424 }
1425 var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
1426 function evaluateRenderProp(element, render4, props, state) {
1427 if (render4) {
1428 if (typeof render4 === "function") {
1429 return render4(props, state);
1430 }
1431 const mergedProps = mergeProps(props, render4.props);
1432 mergedProps.ref = props.ref;
1433 let newElement = render4;
1434 if (newElement?.$$typeof === REACT_LAZY_TYPE) {
1435 const children = React5.Children.toArray(render4);
1436 newElement = children[0];
1437 }
1438 if (true) {
1439 if (!/* @__PURE__ */ React5.isValidElement(newElement)) {
1440 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"));
1441 }
1442 }
1443 return /* @__PURE__ */ React5.cloneElement(newElement, mergedProps);
1444 }
1445 if (element) {
1446 if (typeof element === "string") {
1447 return renderTag(element, props);
1448 }
1449 }
1450 throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage(8));
1451 }
1452 function renderTag(Tag, props) {
1453 if (Tag === "button") {
1454 return /* @__PURE__ */ (0, import_react.createElement)("button", {
1455 type: "button",
1456 ...props,
1457 key: props.key
1458 });
1459 }
1460 if (Tag === "img") {
1461 return /* @__PURE__ */ (0, import_react.createElement)("img", {
1462 alt: "",
1463 ...props,
1464 key: props.key
1465 });
1466 }
1467 return /* @__PURE__ */ React5.createElement(Tag, props);
1468 }
1469
1470 // node_modules/@base-ui/react/esm/use-render/useRender.js
1471 function useRender(params) {
1472 return useRenderElement(params.defaultTagName ?? "div", params, params);
1473 }
1474
1475 // node_modules/clsx/dist/clsx.mjs
1476 function r(e2) {
1477 var t2, f2, n2 = "";
1478 if ("string" == typeof e2 || "number" == typeof e2) n2 += e2;
1479 else if ("object" == typeof e2) if (Array.isArray(e2)) {
1480 var o2 = e2.length;
1481 for (t2 = 0; t2 < o2; t2++) e2[t2] && (f2 = r(e2[t2])) && (n2 && (n2 += " "), n2 += f2);
1482 } else for (f2 in e2) e2[f2] && (n2 && (n2 += " "), n2 += f2);
1483 return n2;
1484 }
1485 function clsx() {
1486 for (var e2, t2, f2 = 0, n2 = "", o2 = arguments.length; f2 < o2; f2++) (e2 = arguments[f2]) && (t2 = r(e2)) && (n2 && (n2 += " "), n2 += t2);
1487 return n2;
1488 }
1489 var clsx_default = clsx;
1490
1491 // packages/icons/build-module/library/arrow-down.mjs
1492 var import_primitives = __toESM(require_primitives(), 1);
1493 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
1494 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" }) });
1495
1496 // packages/icons/build-module/library/arrow-left.mjs
1497 var import_primitives2 = __toESM(require_primitives(), 1);
1498 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
1499 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" }) });
1500
1501 // packages/icons/build-module/library/arrow-right.mjs
1502 var import_primitives3 = __toESM(require_primitives(), 1);
1503 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
1504 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" }) });
1505
1506 // packages/icons/build-module/library/arrow-up.mjs
1507 var import_primitives4 = __toESM(require_primitives(), 1);
1508 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
1509 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" }) });
1510
1511 // packages/icons/build-module/library/block-table.mjs
1512 var import_primitives5 = __toESM(require_primitives(), 1);
1513 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
1514 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" }) });
1515
1516 // packages/icons/build-module/library/category.mjs
1517 var import_primitives6 = __toESM(require_primitives(), 1);
1518 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
1519 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" }) });
1520
1521 // packages/icons/build-module/library/check.mjs
1522 var import_primitives7 = __toESM(require_primitives(), 1);
1523 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
1524 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" }) });
1525
1526 // packages/icons/build-module/library/close-small.mjs
1527 var import_primitives8 = __toESM(require_primitives(), 1);
1528 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
1529 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" }) });
1530
1531 // packages/icons/build-module/library/cog.mjs
1532 var import_primitives9 = __toESM(require_primitives(), 1);
1533 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
1534 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" }) });
1535
1536 // packages/icons/build-module/library/envelope.mjs
1537 var import_primitives10 = __toESM(require_primitives(), 1);
1538 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
1539 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" }) });
1540
1541 // packages/icons/build-module/library/error.mjs
1542 var import_primitives11 = __toESM(require_primitives(), 1);
1543 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
1544 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" }) });
1545
1546 // packages/icons/build-module/library/format-list-bullets-rtl.mjs
1547 var import_primitives12 = __toESM(require_primitives(), 1);
1548 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
1549 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" }) });
1550
1551 // packages/icons/build-module/library/format-list-bullets.mjs
1552 var import_primitives13 = __toESM(require_primitives(), 1);
1553 var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
1554 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" }) });
1555
1556 // packages/icons/build-module/library/funnel.mjs
1557 var import_primitives14 = __toESM(require_primitives(), 1);
1558 var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
1559 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" }) });
1560
1561 // packages/icons/build-module/library/link.mjs
1562 var import_primitives15 = __toESM(require_primitives(), 1);
1563 var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
1564 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" }) });
1565
1566 // packages/icons/build-module/library/mobile.mjs
1567 var import_primitives16 = __toESM(require_primitives(), 1);
1568 var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
1569 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" }) });
1570
1571 // packages/icons/build-module/library/more-vertical.mjs
1572 var import_primitives17 = __toESM(require_primitives(), 1);
1573 var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
1574 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" }) });
1575
1576 // packages/icons/build-module/library/next.mjs
1577 var import_primitives18 = __toESM(require_primitives(), 1);
1578 var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
1579 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" }) });
1580
1581 // packages/icons/build-module/library/previous.mjs
1582 var import_primitives19 = __toESM(require_primitives(), 1);
1583 var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1);
1584 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" }) });
1585
1586 // packages/icons/build-module/library/scheduled.mjs
1587 var import_primitives20 = __toESM(require_primitives(), 1);
1588 var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
1589 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" }) });
1590
1591 // packages/icons/build-module/library/search.mjs
1592 var import_primitives21 = __toESM(require_primitives(), 1);
1593 var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1);
1594 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" }) });
1595
1596 // packages/icons/build-module/library/seen.mjs
1597 var import_primitives22 = __toESM(require_primitives(), 1);
1598 var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1);
1599 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" }) });
1600
1601 // packages/icons/build-module/library/unseen.mjs
1602 var import_primitives23 = __toESM(require_primitives(), 1);
1603 var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1);
1604 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" }) });
1605
1606 // packages/ui/build-module/stack/stack.mjs
1607 var import_element2 = __toESM(require_element(), 1);
1608 if (typeof document !== "undefined" && true && !document.head.querySelector("style[data-wp-hash='71d20935c2']")) {
1609 const style = document.createElement("style");
1610 style.setAttribute("data-wp-hash", "71d20935c2");
1611 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}}"));
1612 document.head.appendChild(style);
1613 }
1614 var style_default = { "stack": "_19ce0419607e1896__stack" };
1615 var gapTokens = {
1616 xs: "var(--wpds-dimension-gap-xs, 4px)",
1617 sm: "var(--wpds-dimension-gap-sm, 8px)",
1618 md: "var(--wpds-dimension-gap-md, 12px)",
1619 lg: "var(--wpds-dimension-gap-lg, 16px)",
1620 xl: "var(--wpds-dimension-gap-xl, 24px)",
1621 "2xl": "var(--wpds-dimension-gap-2xl, 32px)",
1622 "3xl": "var(--wpds-dimension-gap-3xl, 40px)"
1623 };
1624 var Stack = (0, import_element2.forwardRef)(function Stack2({ direction, gap, align, justify, wrap, render: render4, ...props }, ref) {
1625 const style = {
1626 gap: gap && gapTokens[gap],
1627 alignItems: align,
1628 justifyContent: justify,
1629 flexDirection: direction,
1630 flexWrap: wrap
1631 };
1632 const element = useRender({
1633 render: render4,
1634 ref,
1635 props: mergeProps(props, { style, className: style_default.stack })
1636 });
1637 return element;
1638 });
1639
1640 // packages/dataviews/build-module/components/dataviews-context/index.mjs
1641 var import_element3 = __toESM(require_element(), 1);
1642
1643 // packages/dataviews/build-module/constants.mjs
1644 var import_i18n = __toESM(require_i18n(), 1);
1645 var OPERATOR_IS_ANY = "isAny";
1646 var OPERATOR_IS_NONE = "isNone";
1647 var OPERATOR_IS_ALL = "isAll";
1648 var OPERATOR_IS_NOT_ALL = "isNotAll";
1649 var OPERATOR_BETWEEN = "between";
1650 var OPERATOR_IN_THE_PAST = "inThePast";
1651 var OPERATOR_OVER = "over";
1652 var OPERATOR_IS = "is";
1653 var OPERATOR_IS_NOT = "isNot";
1654 var OPERATOR_LESS_THAN = "lessThan";
1655 var OPERATOR_GREATER_THAN = "greaterThan";
1656 var OPERATOR_LESS_THAN_OR_EQUAL = "lessThanOrEqual";
1657 var OPERATOR_GREATER_THAN_OR_EQUAL = "greaterThanOrEqual";
1658 var OPERATOR_BEFORE = "before";
1659 var OPERATOR_AFTER = "after";
1660 var OPERATOR_BEFORE_INC = "beforeInc";
1661 var OPERATOR_AFTER_INC = "afterInc";
1662 var OPERATOR_CONTAINS = "contains";
1663 var OPERATOR_NOT_CONTAINS = "notContains";
1664 var OPERATOR_STARTS_WITH = "startsWith";
1665 var OPERATOR_ON = "on";
1666 var OPERATOR_NOT_ON = "notOn";
1667 var SORTING_DIRECTIONS = ["asc", "desc"];
1668 var sortArrows = { asc: "\u2191", desc: "\u2193" };
1669 var sortValues = { asc: "ascending", desc: "descending" };
1670 var sortLabels = {
1671 asc: (0, import_i18n.__)("Sort ascending"),
1672 desc: (0, import_i18n.__)("Sort descending")
1673 };
1674 var sortIcons = {
1675 asc: arrow_up_default,
1676 desc: arrow_down_default
1677 };
1678 var LAYOUT_TABLE = "table";
1679 var LAYOUT_GRID = "grid";
1680 var LAYOUT_LIST = "list";
1681 var LAYOUT_ACTIVITY = "activity";
1682 var LAYOUT_PICKER_GRID = "pickerGrid";
1683 var LAYOUT_PICKER_TABLE = "pickerTable";
1684
1685 // packages/dataviews/build-module/components/dataviews-context/index.mjs
1686 var DataViewsContext = (0, import_element3.createContext)({
1687 view: { type: LAYOUT_TABLE },
1688 onChangeView: () => {
1689 },
1690 fields: [],
1691 data: [],
1692 paginationInfo: {
1693 totalItems: 0,
1694 totalPages: 0
1695 },
1696 selection: [],
1697 onChangeSelection: () => {
1698 },
1699 setOpenedFilter: () => {
1700 },
1701 openedFilter: null,
1702 getItemId: (item) => item.id,
1703 isItemClickable: () => true,
1704 renderItemLink: void 0,
1705 containerWidth: 0,
1706 containerRef: (0, import_element3.createRef)(),
1707 resizeObserverRef: () => {
1708 },
1709 defaultLayouts: { list: {}, grid: {}, table: {} },
1710 filters: [],
1711 isShowingFilter: false,
1712 setIsShowingFilter: () => {
1713 },
1714 hasInitiallyLoaded: false,
1715 hasInfiniteScrollHandler: false,
1716 config: {
1717 perPageSizes: []
1718 }
1719 });
1720 DataViewsContext.displayName = "DataViewsContext";
1721 var dataviews_context_default = DataViewsContext;
1722
1723 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
1724 var import_i18n21 = __toESM(require_i18n(), 1);
1725
1726 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
1727 var import_i18n9 = __toESM(require_i18n(), 1);
1728 var import_components6 = __toESM(require_components(), 1);
1729 var import_element11 = __toESM(require_element(), 1);
1730 var import_keycodes = __toESM(require_keycodes(), 1);
1731
1732 // packages/dataviews/build-module/components/dataviews-selection-checkbox/index.mjs
1733 var import_components = __toESM(require_components(), 1);
1734 var import_i18n2 = __toESM(require_i18n(), 1);
1735 var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1);
1736 function DataViewsSelectionCheckbox({
1737 selection,
1738 onChangeSelection,
1739 item,
1740 getItemId,
1741 titleField,
1742 disabled,
1743 ...extraProps
1744 }) {
1745 const id = getItemId(item);
1746 const checked = !disabled && selection.includes(id);
1747 const selectionLabel = titleField?.getValue?.({ item }) || (0, import_i18n2.__)("(no title)");
1748 return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1749 import_components.CheckboxControl,
1750 {
1751 className: "dataviews-selection-checkbox",
1752 "aria-label": selectionLabel,
1753 "aria-disabled": disabled,
1754 checked,
1755 onChange: () => {
1756 if (disabled) {
1757 return;
1758 }
1759 onChangeSelection(
1760 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
1761 );
1762 },
1763 ...extraProps
1764 }
1765 );
1766 }
1767
1768 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
1769 var import_components2 = __toESM(require_components(), 1);
1770 var import_i18n3 = __toESM(require_i18n(), 1);
1771 var import_element4 = __toESM(require_element(), 1);
1772 var import_data3 = __toESM(require_data(), 1);
1773 var import_compose = __toESM(require_compose(), 1);
1774
1775 // packages/dataviews/build-module/lock-unlock.mjs
1776 var import_private_apis = __toESM(require_private_apis(), 1);
1777 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
1778 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
1779 "@wordpress/dataviews"
1780 );
1781
1782 // packages/dataviews/build-module/components/dataviews-item-actions/index.mjs
1783 var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
1784 var { Menu, kebabCase } = unlock(import_components2.privateApis);
1785 function ButtonTrigger({
1786 action,
1787 onClick,
1788 items,
1789 variant
1790 }) {
1791 const label = typeof action.label === "string" ? action.label : action.label(items);
1792 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1793 import_components2.Button,
1794 {
1795 disabled: !!action.disabled,
1796 accessibleWhenDisabled: true,
1797 size: "compact",
1798 variant,
1799 onClick,
1800 children: label
1801 }
1802 );
1803 }
1804 function MenuItemTrigger({
1805 action,
1806 onClick,
1807 items
1808 }) {
1809 const label = typeof action.label === "string" ? action.label : action.label(items);
1810 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Item, { disabled: action.disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.ItemLabel, { children: label }) });
1811 }
1812 function ActionModal({
1813 action,
1814 items,
1815 closeModal
1816 }) {
1817 const label = typeof action.label === "string" ? action.label : action.label(items);
1818 const modalHeader = typeof action.modalHeader === "function" ? action.modalHeader(items) : action.modalHeader;
1819 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1820 import_components2.Modal,
1821 {
1822 title: modalHeader || label,
1823 __experimentalHideHeader: !!action.hideModalHeader,
1824 onRequestClose: closeModal,
1825 focusOnMount: action.modalFocusOnMount ?? true,
1826 size: action.modalSize || "medium",
1827 overlayClassName: `dataviews-action-modal dataviews-action-modal__${kebabCase(
1828 action.id
1829 )}`,
1830 children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(action.RenderModal, { items, closeModal })
1831 }
1832 );
1833 }
1834 function ActionsMenuGroup({
1835 actions,
1836 item,
1837 registry,
1838 setActiveModalAction
1839 }) {
1840 const { primaryActions, regularActions } = (0, import_element4.useMemo)(() => {
1841 return actions.reduce(
1842 (acc, action) => {
1843 (action.isPrimary ? acc.primaryActions : acc.regularActions).push(action);
1844 return acc;
1845 },
1846 {
1847 primaryActions: [],
1848 regularActions: []
1849 }
1850 );
1851 }, [actions]);
1852 const renderActionGroup = (actionList) => actionList.map((action) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1853 MenuItemTrigger,
1854 {
1855 action,
1856 onClick: () => {
1857 if ("RenderModal" in action) {
1858 setActiveModalAction(action);
1859 return;
1860 }
1861 action.callback([item], { registry });
1862 },
1863 items: [item]
1864 },
1865 action.id
1866 ));
1867 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Menu.Group, { children: [
1868 renderActionGroup(primaryActions),
1869 renderActionGroup(regularActions)
1870 ] });
1871 }
1872 function ItemActions({
1873 item,
1874 actions,
1875 isCompact
1876 }) {
1877 const registry = (0, import_data3.useRegistry)();
1878 const { primaryActions, eligibleActions } = (0, import_element4.useMemo)(() => {
1879 const _eligibleActions = actions.filter(
1880 (action) => !action.isEligible || action.isEligible(item)
1881 );
1882 const _primaryActions = _eligibleActions.filter(
1883 (action) => action.isPrimary
1884 );
1885 return {
1886 primaryActions: _primaryActions,
1887 eligibleActions: _eligibleActions
1888 };
1889 }, [actions, item]);
1890 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
1891 if (isCompact) {
1892 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1893 CompactItemActions,
1894 {
1895 item,
1896 actions: eligibleActions,
1897 isSmall: true,
1898 registry
1899 }
1900 );
1901 }
1902 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1903 Stack,
1904 {
1905 direction: "row",
1906 justify: "flex-end",
1907 className: "dataviews-item-actions",
1908 style: {
1909 flexShrink: 0,
1910 width: "auto"
1911 },
1912 children: [
1913 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1914 PrimaryActions,
1915 {
1916 item,
1917 actions: primaryActions,
1918 registry
1919 }
1920 ),
1921 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
1922 // there if there are any actions at all.
1923 isMobileViewport) && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1924 CompactItemActions,
1925 {
1926 item,
1927 actions: eligibleActions,
1928 registry
1929 }
1930 )
1931 ]
1932 }
1933 );
1934 }
1935 function CompactItemActions({
1936 item,
1937 actions,
1938 isSmall,
1939 registry
1940 }) {
1941 const [activeModalAction, setActiveModalAction] = (0, import_element4.useState)(
1942 null
1943 );
1944 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1945 /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Menu, { placement: "bottom-end", children: [
1946 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1947 Menu.TriggerButton,
1948 {
1949 render: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1950 import_components2.Button,
1951 {
1952 size: isSmall ? "small" : "compact",
1953 icon: more_vertical_default,
1954 label: (0, import_i18n3.__)("Actions"),
1955 accessibleWhenDisabled: true,
1956 disabled: !actions.length,
1957 className: "dataviews-all-actions-button"
1958 }
1959 )
1960 }
1961 ),
1962 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1963 ActionsMenuGroup,
1964 {
1965 actions,
1966 item,
1967 registry,
1968 setActiveModalAction
1969 }
1970 ) })
1971 ] }),
1972 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1973 ActionModal,
1974 {
1975 action: activeModalAction,
1976 items: [item],
1977 closeModal: () => setActiveModalAction(null)
1978 }
1979 )
1980 ] });
1981 }
1982 function PrimaryActions({
1983 item,
1984 actions,
1985 registry,
1986 buttonVariant
1987 }) {
1988 const [activeModalAction, setActiveModalAction] = (0, import_element4.useState)(null);
1989 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<");
1990 if (isMobileViewport) {
1991 return null;
1992 }
1993 if (!Array.isArray(actions) || actions.length === 0) {
1994 return null;
1995 }
1996 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1997 actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1998 ButtonTrigger,
1999 {
2000 action,
2001 onClick: () => {
2002 if ("RenderModal" in action) {
2003 setActiveModalAction(action);
2004 return;
2005 }
2006 action.callback([item], { registry });
2007 },
2008 items: [item],
2009 variant: buttonVariant
2010 },
2011 action.id
2012 )),
2013 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2014 ActionModal,
2015 {
2016 action: activeModalAction,
2017 items: [item],
2018 closeModal: () => setActiveModalAction(null)
2019 }
2020 )
2021 ] });
2022 }
2023
2024 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
2025 var import_components3 = __toESM(require_components(), 1);
2026 var import_i18n5 = __toESM(require_i18n(), 1);
2027 var import_element5 = __toESM(require_element(), 1);
2028 var import_data4 = __toESM(require_data(), 1);
2029 var import_compose2 = __toESM(require_compose(), 1);
2030
2031 // packages/dataviews/build-module/utils/get-footer-message.mjs
2032 var import_i18n4 = __toESM(require_i18n(), 1);
2033 function getFooterMessage(selectionCount, itemsCount, totalItems) {
2034 if (selectionCount > 0) {
2035 return (0, import_i18n4.sprintf)(
2036 /* translators: %d: number of items. */
2037 (0, import_i18n4._n)("%d Item selected", "%d Items selected", selectionCount),
2038 selectionCount
2039 );
2040 }
2041 if (totalItems > itemsCount) {
2042 return (0, import_i18n4.sprintf)(
2043 /* translators: %1$d: number of items. %2$d: total number of items. */
2044 (0, import_i18n4._n)("%1$d of %2$d Item", "%1$d of %2$d Items", totalItems),
2045 itemsCount,
2046 totalItems
2047 );
2048 }
2049 return (0, import_i18n4.sprintf)(
2050 /* translators: %d: number of items. */
2051 (0, import_i18n4._n)("%d Item", "%d Items", itemsCount),
2052 itemsCount
2053 );
2054 }
2055
2056 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.mjs
2057 var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
2058 function ActionWithModal({
2059 action,
2060 items,
2061 ActionTriggerComponent
2062 }) {
2063 const [isModalOpen, setIsModalOpen] = (0, import_element5.useState)(false);
2064 const actionTriggerProps = {
2065 action,
2066 onClick: () => {
2067 setIsModalOpen(true);
2068 },
2069 items
2070 };
2071 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2072 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ActionTriggerComponent, { ...actionTriggerProps }),
2073 isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2074 ActionModal,
2075 {
2076 action,
2077 items,
2078 closeModal: () => setIsModalOpen(false)
2079 }
2080 )
2081 ] });
2082 }
2083 function useHasAPossibleBulkAction(actions, item) {
2084 return (0, import_element5.useMemo)(() => {
2085 return actions.some((action) => {
2086 return action.supportsBulk && (!action.isEligible || action.isEligible(item));
2087 });
2088 }, [actions, item]);
2089 }
2090 function useSomeItemHasAPossibleBulkAction(actions, data) {
2091 return (0, import_element5.useMemo)(() => {
2092 return data.some((item) => {
2093 return actions.some((action) => {
2094 return action.supportsBulk && (!action.isEligible || action.isEligible(item));
2095 });
2096 });
2097 }, [actions, data]);
2098 }
2099 function BulkSelectionCheckbox({
2100 selection,
2101 onChangeSelection,
2102 data,
2103 actions,
2104 getItemId
2105 }) {
2106 const selectableItems = (0, import_element5.useMemo)(() => {
2107 return data.filter((item) => {
2108 return actions.some(
2109 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item))
2110 );
2111 });
2112 }, [data, actions]);
2113 const selectedItems = data.filter(
2114 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
2115 );
2116 const areAllSelected = selectedItems.length === selectableItems.length;
2117 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2118 import_components3.CheckboxControl,
2119 {
2120 className: "dataviews-view-table-selection-checkbox",
2121 checked: areAllSelected,
2122 indeterminate: !areAllSelected && !!selectedItems.length,
2123 onChange: () => {
2124 if (areAllSelected) {
2125 onChangeSelection([]);
2126 } else {
2127 onChangeSelection(
2128 selectableItems.map((item) => getItemId(item))
2129 );
2130 }
2131 },
2132 "aria-label": areAllSelected ? (0, import_i18n5.__)("Deselect all") : (0, import_i18n5.__)("Select all")
2133 }
2134 );
2135 }
2136 function ActionTrigger({
2137 action,
2138 onClick,
2139 isBusy,
2140 items
2141 }) {
2142 const label = typeof action.label === "string" ? action.label : action.label(items);
2143 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
2144 if (isMobile) {
2145 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2146 import_components3.Button,
2147 {
2148 disabled: isBusy,
2149 accessibleWhenDisabled: true,
2150 label,
2151 icon: action.icon,
2152 size: "compact",
2153 onClick,
2154 isBusy
2155 }
2156 );
2157 }
2158 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2159 import_components3.Button,
2160 {
2161 disabled: isBusy,
2162 accessibleWhenDisabled: true,
2163 size: "compact",
2164 onClick,
2165 isBusy,
2166 children: label
2167 }
2168 );
2169 }
2170 var EMPTY_ARRAY2 = [];
2171 function ActionButton({
2172 action,
2173 selectedItems,
2174 actionInProgress,
2175 setActionInProgress
2176 }) {
2177 const registry = (0, import_data4.useRegistry)();
2178 const selectedEligibleItems = (0, import_element5.useMemo)(() => {
2179 return selectedItems.filter((item) => {
2180 return !action.isEligible || action.isEligible(item);
2181 });
2182 }, [action, selectedItems]);
2183 if ("RenderModal" in action) {
2184 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2185 ActionWithModal,
2186 {
2187 action,
2188 items: selectedEligibleItems,
2189 ActionTriggerComponent: ActionTrigger
2190 },
2191 action.id
2192 );
2193 }
2194 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2195 ActionTrigger,
2196 {
2197 action,
2198 onClick: async () => {
2199 setActionInProgress(action.id);
2200 await action.callback(selectedItems, {
2201 registry
2202 });
2203 setActionInProgress(null);
2204 },
2205 items: selectedEligibleItems,
2206 isBusy: actionInProgress === action.id
2207 },
2208 action.id
2209 );
2210 }
2211 function renderFooterContent(data, actions, getItemId, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection, paginationInfo) {
2212 const message2 = getFooterMessage(
2213 selection.length,
2214 data.length,
2215 paginationInfo.totalItems
2216 );
2217 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2218 Stack,
2219 {
2220 direction: "row",
2221 className: "dataviews-bulk-actions-footer__container",
2222 gap: "md",
2223 align: "center",
2224 children: [
2225 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2226 BulkSelectionCheckbox,
2227 {
2228 selection,
2229 onChangeSelection,
2230 data,
2231 actions,
2232 getItemId
2233 }
2234 ),
2235 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "dataviews-bulk-actions-footer__item-count", children: message2 }),
2236 /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2237 Stack,
2238 {
2239 direction: "row",
2240 className: "dataviews-bulk-actions-footer__action-buttons",
2241 gap: "xs",
2242 children: [
2243 actionsToShow.map((action) => {
2244 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2245 ActionButton,
2246 {
2247 action,
2248 selectedItems,
2249 actionInProgress,
2250 setActionInProgress
2251 },
2252 action.id
2253 );
2254 }),
2255 selectedItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2256 import_components3.Button,
2257 {
2258 icon: close_small_default,
2259 showTooltip: true,
2260 tooltipPosition: "top",
2261 size: "compact",
2262 label: (0, import_i18n5.__)("Cancel"),
2263 disabled: !!actionInProgress,
2264 accessibleWhenDisabled: false,
2265 onClick: () => {
2266 onChangeSelection(EMPTY_ARRAY2);
2267 }
2268 }
2269 )
2270 ]
2271 }
2272 )
2273 ]
2274 }
2275 );
2276 }
2277 function FooterContent({
2278 selection,
2279 actions,
2280 onChangeSelection,
2281 data,
2282 getItemId,
2283 paginationInfo
2284 }) {
2285 const [actionInProgress, setActionInProgress] = (0, import_element5.useState)(
2286 null
2287 );
2288 const footerContentRef = (0, import_element5.useRef)(void 0);
2289 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<");
2290 const bulkActions = (0, import_element5.useMemo)(
2291 () => actions.filter((action) => action.supportsBulk),
2292 [actions]
2293 );
2294 const selectableItems = (0, import_element5.useMemo)(() => {
2295 return data.filter((item) => {
2296 return bulkActions.some(
2297 (action) => !action.isEligible || action.isEligible(item)
2298 );
2299 });
2300 }, [data, bulkActions]);
2301 const selectedItems = (0, import_element5.useMemo)(() => {
2302 return data.filter(
2303 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
2304 );
2305 }, [selection, data, getItemId, selectableItems]);
2306 const actionsToShow = (0, import_element5.useMemo)(
2307 () => actions.filter((action) => {
2308 return action.supportsBulk && (!isMobile || action.icon) && selectedItems.some(
2309 (item) => !action.isEligible || action.isEligible(item)
2310 );
2311 }),
2312 [actions, selectedItems, isMobile]
2313 );
2314 if (!actionInProgress) {
2315 if (footerContentRef.current) {
2316 footerContentRef.current = void 0;
2317 }
2318 return renderFooterContent(
2319 data,
2320 actions,
2321 getItemId,
2322 selection,
2323 actionsToShow,
2324 selectedItems,
2325 actionInProgress,
2326 setActionInProgress,
2327 onChangeSelection,
2328 paginationInfo
2329 );
2330 } else if (!footerContentRef.current) {
2331 footerContentRef.current = renderFooterContent(
2332 data,
2333 actions,
2334 getItemId,
2335 selection,
2336 actionsToShow,
2337 selectedItems,
2338 actionInProgress,
2339 setActionInProgress,
2340 onChangeSelection,
2341 paginationInfo
2342 );
2343 }
2344 return footerContentRef.current;
2345 }
2346 function BulkActionsFooter() {
2347 const {
2348 data,
2349 selection,
2350 actions = EMPTY_ARRAY2,
2351 onChangeSelection,
2352 getItemId,
2353 paginationInfo
2354 } = (0, import_element5.useContext)(dataviews_context_default);
2355 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2356 FooterContent,
2357 {
2358 selection,
2359 onChangeSelection,
2360 data,
2361 actions,
2362 getItemId,
2363 paginationInfo
2364 }
2365 );
2366 }
2367
2368 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
2369 var import_i18n6 = __toESM(require_i18n(), 1);
2370 var import_components4 = __toESM(require_components(), 1);
2371 var import_element6 = __toESM(require_element(), 1);
2372
2373 // packages/dataviews/build-module/utils/get-hideable-fields.mjs
2374 function getHideableFields(view, fields) {
2375 const togglableFields = [
2376 view?.titleField,
2377 view?.mediaField,
2378 view?.descriptionField
2379 ].filter(Boolean);
2380 return fields.filter(
2381 (f2) => !togglableFields.includes(f2.id) && f2.type !== "media" && f2.enableHiding !== false
2382 );
2383 }
2384
2385 // packages/dataviews/build-module/components/dataviews-layouts/table/column-header-menu.mjs
2386 var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
2387 var { Menu: Menu2 } = unlock(import_components4.privateApis);
2388 function WithMenuSeparators({ children }) {
2389 return import_element6.Children.toArray(children).filter(Boolean).map((child, i2) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_element6.Fragment, { children: [
2390 i2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Separator, {}),
2391 child
2392 ] }, i2));
2393 }
2394 var _HeaderMenu = (0, import_element6.forwardRef)(function HeaderMenu({
2395 fieldId,
2396 view,
2397 fields,
2398 onChangeView,
2399 onHide,
2400 setOpenedFilter,
2401 canMove = true,
2402 canInsertLeft = true,
2403 canInsertRight = true
2404 }, ref) {
2405 const visibleFieldIds = view.fields ?? [];
2406 const index = visibleFieldIds?.indexOf(fieldId);
2407 const isSorted = view.sort?.field === fieldId;
2408 let isHidable = false;
2409 let isSortable = false;
2410 let canAddFilter = false;
2411 let operators = [];
2412 const field = fields.find((f2) => f2.id === fieldId);
2413 const { setIsShowingFilter } = (0, import_element6.useContext)(dataviews_context_default);
2414 if (!field) {
2415 return null;
2416 }
2417 isHidable = field.enableHiding !== false;
2418 isSortable = field.enableSorting !== false;
2419 const header = field.header;
2420 operators = !!field.filterBy && field.filterBy?.operators || [];
2421 canAddFilter = !view.filters?.some((_filter) => fieldId === _filter.field) && !!(field.hasElements || field.Edit) && field.filterBy !== false && !field.filterBy?.isPrimary;
2422 if (!isSortable && !canMove && !isHidable && !canAddFilter) {
2423 return header;
2424 }
2425 const hiddenFields = getHideableFields(view, fields).filter(
2426 (f2) => !visibleFieldIds.includes(f2.id)
2427 );
2428 const canInsert = (canInsertLeft || canInsertRight) && !!hiddenFields.length;
2429 const isRtl = (0, import_i18n6.isRTL)();
2430 return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [
2431 /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
2432 Menu2.TriggerButton,
2433 {
2434 render: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2435 import_components4.Button,
2436 {
2437 size: "compact",
2438 className: "dataviews-view-table-header-button",
2439 ref,
2440 variant: "tertiary"
2441 }
2442 ),
2443 children: [
2444 header,
2445 view.sort && isSorted && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { "aria-hidden": "true", children: sortArrows[view.sort.direction] })
2446 ]
2447 }
2448 ),
2449 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { style: { minWidth: "240px" }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(WithMenuSeparators, { children: [
2450 isSortable && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Group, { children: SORTING_DIRECTIONS.map(
2451 (direction) => {
2452 const isChecked = view.sort && isSorted && view.sort.direction === direction;
2453 const value = `${fieldId}-${direction}`;
2454 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2455 Menu2.RadioItem,
2456 {
2457 name: "view-table-sorting",
2458 value,
2459 checked: isChecked,
2460 onChange: () => {
2461 onChangeView({
2462 ...view,
2463 sort: {
2464 field: fieldId,
2465 direction
2466 },
2467 showLevels: false
2468 });
2469 },
2470 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: sortLabels[direction] })
2471 },
2472 value
2473 );
2474 }
2475 ) }),
2476 canAddFilter && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2477 Menu2.Item,
2478 {
2479 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: funnel_default }),
2480 onClick: () => {
2481 setOpenedFilter(fieldId);
2482 setIsShowingFilter(true);
2483 onChangeView({
2484 ...view,
2485 page: 1,
2486 filters: [
2487 ...view.filters || [],
2488 {
2489 field: fieldId,
2490 value: void 0,
2491 operator: operators[0]
2492 }
2493 ]
2494 });
2495 },
2496 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Add filter") })
2497 }
2498 ) }),
2499 (canMove || isHidable || canInsert) && field && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2.Group, { children: [
2500 canMove && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2501 Menu2.Item,
2502 {
2503 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: arrow_left_default }),
2504 disabled: isRtl ? index >= visibleFieldIds.length - 1 : index < 1,
2505 onClick: () => {
2506 const targetIndex = isRtl ? index + 1 : index - 1;
2507 const newFields = [
2508 ...visibleFieldIds
2509 ];
2510 newFields.splice(index, 1);
2511 newFields.splice(
2512 targetIndex,
2513 0,
2514 fieldId
2515 );
2516 onChangeView({
2517 ...view,
2518 fields: newFields
2519 });
2520 },
2521 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Move left") })
2522 }
2523 ),
2524 canMove && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2525 Menu2.Item,
2526 {
2527 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: arrow_right_default }),
2528 disabled: isRtl ? index < 1 : index >= visibleFieldIds.length - 1,
2529 onClick: () => {
2530 const targetIndex = isRtl ? index - 1 : index + 1;
2531 const newFields = [
2532 ...visibleFieldIds
2533 ];
2534 newFields.splice(index, 1);
2535 newFields.splice(
2536 targetIndex,
2537 0,
2538 fieldId
2539 );
2540 onChangeView({
2541 ...view,
2542 fields: newFields
2543 });
2544 },
2545 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Move right") })
2546 }
2547 ),
2548 canInsertLeft && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [
2549 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Insert left") }) }),
2550 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
2551 const insertIndex = isRtl ? index + 1 : index;
2552 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2553 Menu2.Item,
2554 {
2555 onClick: () => {
2556 onChangeView({
2557 ...view,
2558 fields: [
2559 ...visibleFieldIds.slice(
2560 0,
2561 insertIndex
2562 ),
2563 hiddenField.id,
2564 ...visibleFieldIds.slice(
2565 insertIndex
2566 )
2567 ]
2568 });
2569 },
2570 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
2571 },
2572 hiddenField.id
2573 );
2574 }) })
2575 ] }),
2576 canInsertRight && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [
2577 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Insert right") }) }),
2578 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => {
2579 const insertIndex = isRtl ? index : index + 1;
2580 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2581 Menu2.Item,
2582 {
2583 onClick: () => {
2584 onChangeView({
2585 ...view,
2586 fields: [
2587 ...visibleFieldIds.slice(
2588 0,
2589 insertIndex
2590 ),
2591 hiddenField.id,
2592 ...visibleFieldIds.slice(
2593 insertIndex
2594 )
2595 ]
2596 });
2597 },
2598 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: hiddenField.label })
2599 },
2600 hiddenField.id
2601 );
2602 }) })
2603 ] }),
2604 isHidable && field && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2605 Menu2.Item,
2606 {
2607 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: unseen_default }),
2608 onClick: () => {
2609 onHide(field);
2610 onChangeView({
2611 ...view,
2612 fields: visibleFieldIds.filter(
2613 (id) => id !== fieldId
2614 )
2615 });
2616 },
2617 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n6.__)("Hide column") })
2618 }
2619 )
2620 ] })
2621 ] }) })
2622 ] });
2623 });
2624 var ColumnHeaderMenu = _HeaderMenu;
2625 var column_header_menu_default = ColumnHeaderMenu;
2626
2627 // packages/dataviews/build-module/components/dataviews-layouts/utils/item-click-wrapper.mjs
2628 var import_element7 = __toESM(require_element(), 1);
2629 var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
2630 function getClickableItemProps({
2631 item,
2632 isItemClickable,
2633 onClickItem,
2634 className
2635 }) {
2636 if (!isItemClickable(item) || !onClickItem) {
2637 return { className };
2638 }
2639 return {
2640 className: className ? `${className} ${className}--clickable` : void 0,
2641 role: "button",
2642 tabIndex: 0,
2643 onClick: (event) => {
2644 event.stopPropagation();
2645 onClickItem(item);
2646 },
2647 onKeyDown: (event) => {
2648 if (event.key === "Enter" || event.key === "" || event.key === " ") {
2649 event.stopPropagation();
2650 onClickItem(item);
2651 }
2652 }
2653 };
2654 }
2655 function ItemClickWrapper({
2656 item,
2657 isItemClickable,
2658 onClickItem,
2659 renderItemLink,
2660 className,
2661 children,
2662 ...extraProps
2663 }) {
2664 if (!isItemClickable(item)) {
2665 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className, ...extraProps, children });
2666 }
2667 if (renderItemLink) {
2668 const renderedElement = renderItemLink({
2669 item,
2670 className: `${className} ${className}--clickable`,
2671 ...extraProps,
2672 children
2673 });
2674 return (0, import_element7.cloneElement)(renderedElement, {
2675 onClick: (event) => {
2676 event.stopPropagation();
2677 if (renderedElement.props.onClick) {
2678 renderedElement.props.onClick(event);
2679 }
2680 },
2681 onKeyDown: (event) => {
2682 if (event.key === "Enter" || event.key === "" || event.key === " ") {
2683 event.stopPropagation();
2684 if (renderedElement.props.onKeyDown) {
2685 renderedElement.props.onKeyDown(event);
2686 }
2687 }
2688 }
2689 });
2690 }
2691 const clickProps = getClickableItemProps({
2692 item,
2693 isItemClickable,
2694 onClickItem,
2695 className
2696 });
2697 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { ...clickProps, ...extraProps, children });
2698 }
2699
2700 // packages/dataviews/build-module/components/dataviews-layouts/table/column-primary.mjs
2701 var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
2702 function ColumnPrimary({
2703 item,
2704 level,
2705 titleField,
2706 mediaField,
2707 descriptionField,
2708 onClickItem,
2709 renderItemLink,
2710 isItemClickable
2711 }) {
2712 return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(Stack, { direction: "row", gap: "md", align: "flex-start", justify: "flex-start", children: [
2713 mediaField && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2714 ItemClickWrapper,
2715 {
2716 item,
2717 isItemClickable,
2718 onClickItem,
2719 renderItemLink,
2720 className: "dataviews-view-table__cell-content-wrapper dataviews-column-primary__media",
2721 "aria-label": isItemClickable(item) && (!!onClickItem || !!renderItemLink) && !!titleField ? titleField.getValue?.({ item }) : void 0,
2722 children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2723 mediaField.render,
2724 {
2725 item,
2726 field: mediaField,
2727 config: { sizes: "32px" }
2728 }
2729 )
2730 }
2731 ),
2732 /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
2733 Stack,
2734 {
2735 direction: "column",
2736 align: "flex-start",
2737 className: "dataviews-view-table__primary-column-content",
2738 children: [
2739 titleField && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
2740 ItemClickWrapper,
2741 {
2742 item,
2743 isItemClickable,
2744 onClickItem,
2745 renderItemLink,
2746 className: "dataviews-view-table__cell-content-wrapper dataviews-title-field",
2747 children: [
2748 level !== void 0 && level > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "dataviews-view-table__level", children: [
2749 Array(level).fill("\u2014").join(" "),
2750 "\xA0"
2751 ] }),
2752 /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(titleField.render, { item, field: titleField })
2753 ]
2754 }
2755 ),
2756 descriptionField && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2757 descriptionField.render,
2758 {
2759 item,
2760 field: descriptionField
2761 }
2762 )
2763 ]
2764 }
2765 )
2766 ] });
2767 }
2768 var column_primary_default = ColumnPrimary;
2769
2770 // packages/dataviews/build-module/components/dataviews-layouts/table/use-is-horizontal-scroll-end.mjs
2771 var import_compose3 = __toESM(require_compose(), 1);
2772 var import_element8 = __toESM(require_element(), 1);
2773 var import_i18n7 = __toESM(require_i18n(), 1);
2774 var isScrolledToEnd = (element) => {
2775 if ((0, import_i18n7.isRTL)()) {
2776 const scrollLeft = Math.abs(element.scrollLeft);
2777 return scrollLeft <= 1;
2778 }
2779 return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
2780 };
2781 function useIsHorizontalScrollEnd({
2782 scrollContainerRef,
2783 enabled = false
2784 }) {
2785 const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = (0, import_element8.useState)(false);
2786 const handleIsHorizontalScrollEnd = (0, import_compose3.useDebounce)(
2787 (0, import_element8.useCallback)(() => {
2788 const scrollContainer = scrollContainerRef.current;
2789 if (scrollContainer) {
2790 setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer));
2791 }
2792 }, [scrollContainerRef, setIsHorizontalScrollEnd]),
2793 200
2794 );
2795 (0, import_element8.useEffect)(() => {
2796 if (typeof window === "undefined" || !enabled || !scrollContainerRef.current) {
2797 return () => {
2798 };
2799 }
2800 handleIsHorizontalScrollEnd();
2801 scrollContainerRef.current.addEventListener(
2802 "scroll",
2803 handleIsHorizontalScrollEnd
2804 );
2805 window.addEventListener("resize", handleIsHorizontalScrollEnd);
2806 return () => {
2807 scrollContainerRef.current?.removeEventListener(
2808 "scroll",
2809 handleIsHorizontalScrollEnd
2810 );
2811 window.removeEventListener("resize", handleIsHorizontalScrollEnd);
2812 };
2813 }, [scrollContainerRef, enabled]);
2814 return isHorizontalScrollEnd;
2815 }
2816
2817 // packages/dataviews/build-module/components/dataviews-layouts/utils/get-data-by-group.mjs
2818 function getDataByGroup(data, groupByField) {
2819 return data.reduce((groups, item) => {
2820 const groupName = groupByField.getValue({ item });
2821 if (!groups.has(groupName)) {
2822 groups.set(groupName, []);
2823 }
2824 groups.get(groupName)?.push(item);
2825 return groups;
2826 }, /* @__PURE__ */ new Map());
2827 }
2828
2829 // packages/dataviews/build-module/components/dataviews-view-config/properties-section.mjs
2830 var import_components5 = __toESM(require_components(), 1);
2831 var import_i18n8 = __toESM(require_i18n(), 1);
2832 var import_element9 = __toESM(require_element(), 1);
2833 var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1);
2834 function FieldItem({
2835 field,
2836 isVisible: isVisible2,
2837 onToggleVisibility
2838 }) {
2839 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: [
2840 /* @__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 }) }),
2841 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "dataviews-view-config__label", children: field.label })
2842 ] }) });
2843 }
2844 function isDefined(item) {
2845 return !!item;
2846 }
2847 function PropertiesSection({
2848 showLabel = true
2849 }) {
2850 const { view, fields, onChangeView } = (0, import_element9.useContext)(dataviews_context_default);
2851 const regularFields = getHideableFields(view, fields);
2852 if (!regularFields?.length) {
2853 return null;
2854 }
2855 const titleField = fields.find((f2) => f2.id === view.titleField);
2856 const previewField2 = fields.find((f2) => f2.id === view.mediaField);
2857 const descriptionField = fields.find(
2858 (f2) => f2.id === view.descriptionField
2859 );
2860 const lockedFields = [
2861 {
2862 field: titleField,
2863 isVisibleFlag: "showTitle"
2864 },
2865 {
2866 field: previewField2,
2867 isVisibleFlag: "showMedia"
2868 },
2869 {
2870 field: descriptionField,
2871 isVisibleFlag: "showDescription"
2872 }
2873 ].filter(({ field }) => isDefined(field));
2874 const visibleFieldIds = view.fields ?? [];
2875 const visibleRegularFieldsCount = regularFields.filter(
2876 (f2) => visibleFieldIds.includes(f2.id)
2877 ).length;
2878 const visibleLockedFields = lockedFields.filter(
2879 ({ isVisibleFlag }) => (
2880 // @ts-expect-error
2881 view[isVisibleFlag] ?? true
2882 )
2883 );
2884 const totalVisibleFields = visibleLockedFields.length + visibleRegularFieldsCount;
2885 const isSingleVisibleLockedField = totalVisibleFields === 1 && visibleLockedFields.length === 1;
2886 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Stack, { direction: "column", className: "dataviews-field-control", children: [
2887 showLabel && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components5.BaseControl.VisualLabel, { children: (0, import_i18n8.__)("Properties") }),
2888 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2889 Stack,
2890 {
2891 direction: "column",
2892 className: "dataviews-view-config__properties",
2893 children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_components5.__experimentalItemGroup, { isBordered: true, isSeparated: true, size: "medium", children: [
2894 lockedFields.map(({ field, isVisibleFlag }) => {
2895 const isVisible2 = view[isVisibleFlag] ?? true;
2896 const fieldToRender = isSingleVisibleLockedField && isVisible2 ? { ...field, enableHiding: false } : field;
2897 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2898 FieldItem,
2899 {
2900 field: fieldToRender,
2901 isVisible: isVisible2,
2902 onToggleVisibility: () => {
2903 onChangeView({
2904 ...view,
2905 [isVisibleFlag]: !isVisible2
2906 });
2907 }
2908 },
2909 field.id
2910 );
2911 }),
2912 regularFields.map((field) => {
2913 const isVisible2 = visibleFieldIds.includes(field.id);
2914 const fieldToRender = totalVisibleFields === 1 && isVisible2 ? { ...field, enableHiding: false } : field;
2915 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2916 FieldItem,
2917 {
2918 field: fieldToRender,
2919 isVisible: isVisible2,
2920 onToggleVisibility: () => {
2921 onChangeView({
2922 ...view,
2923 fields: isVisible2 ? visibleFieldIds.filter(
2924 (fieldId) => fieldId !== field.id
2925 ) : [...visibleFieldIds, field.id]
2926 });
2927 }
2928 },
2929 field.id
2930 );
2931 })
2932 ] })
2933 }
2934 )
2935 ] });
2936 }
2937
2938 // packages/dataviews/build-module/hooks/use-delayed-loading.mjs
2939 var import_element10 = __toESM(require_element(), 1);
2940 function useDelayedLoading(isLoading, options = { delay: 400 }) {
2941 const [showLoader, setShowLoader] = (0, import_element10.useState)(false);
2942 (0, import_element10.useEffect)(() => {
2943 if (!isLoading) {
2944 return;
2945 }
2946 const timeout = setTimeout(() => {
2947 setShowLoader(true);
2948 }, options.delay);
2949 return () => {
2950 clearTimeout(timeout);
2951 setShowLoader(false);
2952 };
2953 }, [isLoading, options.delay]);
2954 return showLoader;
2955 }
2956
2957 // packages/dataviews/build-module/components/dataviews-layouts/table/index.mjs
2958 var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1);
2959 function getEffectiveAlign(explicitAlign, fieldType) {
2960 if (explicitAlign) {
2961 return explicitAlign;
2962 }
2963 if (fieldType === "integer" || fieldType === "number") {
2964 return "end";
2965 }
2966 return void 0;
2967 }
2968 function TableColumnField({
2969 item,
2970 fields,
2971 column,
2972 align
2973 }) {
2974 const field = fields.find((f2) => f2.id === column);
2975 if (!field) {
2976 return null;
2977 }
2978 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
2979 "dataviews-view-table__cell-align-end": align === "end",
2980 "dataviews-view-table__cell-align-center": align === "center"
2981 });
2982 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(field.render, { item, field }) });
2983 }
2984 function TableRow({
2985 hasBulkActions,
2986 item,
2987 level,
2988 actions,
2989 fields,
2990 id,
2991 view,
2992 titleField,
2993 mediaField,
2994 descriptionField,
2995 selection,
2996 getItemId,
2997 isItemClickable,
2998 onClickItem,
2999 renderItemLink,
3000 onChangeSelection,
3001 isActionsColumnSticky,
3002 posinset
3003 }) {
3004 const { paginationInfo } = (0, import_element11.useContext)(dataviews_context_default);
3005 const hasPossibleBulkAction = useHasAPossibleBulkAction(actions, item);
3006 const isSelected2 = hasPossibleBulkAction && selection.includes(id);
3007 const {
3008 showTitle = true,
3009 showMedia = true,
3010 showDescription = true,
3011 infiniteScrollEnabled
3012 } = view;
3013 const isTouchDeviceRef = (0, import_element11.useRef)(false);
3014 const columns = view.fields ?? [];
3015 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
3016 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
3017 "tr",
3018 {
3019 className: clsx_default("dataviews-view-table__row", {
3020 "is-selected": hasPossibleBulkAction && isSelected2,
3021 "has-bulk-actions": hasPossibleBulkAction
3022 }),
3023 onTouchStart: () => {
3024 isTouchDeviceRef.current = true;
3025 },
3026 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
3027 "aria-posinset": posinset,
3028 role: infiniteScrollEnabled ? "article" : void 0,
3029 onMouseDown: (event) => {
3030 const isMetaClick = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey;
3031 if (event.button === 0 && isMetaClick && window.navigator.userAgent.toLowerCase().includes("firefox")) {
3032 event?.preventDefault();
3033 }
3034 },
3035 onClick: (event) => {
3036 if (!hasPossibleBulkAction) {
3037 return;
3038 }
3039 const isModifierKeyPressed = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey;
3040 if (isModifierKeyPressed && !isTouchDeviceRef.current && document.getSelection()?.type !== "Range") {
3041 onChangeSelection(
3042 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
3043 );
3044 }
3045 },
3046 children: [
3047 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)(
3048 DataViewsSelectionCheckbox,
3049 {
3050 item,
3051 selection,
3052 onChangeSelection,
3053 getItemId,
3054 titleField,
3055 disabled: !hasPossibleBulkAction
3056 }
3057 ) }) }),
3058 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3059 column_primary_default,
3060 {
3061 item,
3062 level,
3063 titleField: showTitle ? titleField : void 0,
3064 mediaField: showMedia ? mediaField : void 0,
3065 descriptionField: showDescription ? descriptionField : void 0,
3066 isItemClickable,
3067 onClickItem,
3068 renderItemLink
3069 }
3070 ) }),
3071 columns.map((column) => {
3072 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
3073 const field = fields.find((f2) => f2.id === column);
3074 const effectiveAlign = getEffectiveAlign(align, field?.type);
3075 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3076 "td",
3077 {
3078 style: {
3079 width,
3080 maxWidth,
3081 minWidth
3082 },
3083 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3084 TableColumnField,
3085 {
3086 fields,
3087 item,
3088 column,
3089 align: effectiveAlign
3090 }
3091 )
3092 },
3093 column
3094 );
3095 }),
3096 !!actions?.length && // Disable reason: we are not making the element interactive,
3097 // but preventing any click events from bubbling up to the
3098 // table row. This allows us to add a click handler to the row
3099 // itself (to toggle row selection) without erroneously
3100 // intercepting click events from ItemActions.
3101 /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
3102 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3103 "td",
3104 {
3105 className: clsx_default("dataviews-view-table__actions-column", {
3106 "dataviews-view-table__actions-column--sticky": true,
3107 "dataviews-view-table__actions-column--stuck": isActionsColumnSticky
3108 }),
3109 onClick: (e2) => e2.stopPropagation(),
3110 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ItemActions, { item, actions })
3111 }
3112 )
3113 ]
3114 }
3115 );
3116 }
3117 function ViewTable({
3118 actions,
3119 data,
3120 fields,
3121 getItemId,
3122 getItemLevel,
3123 isLoading = false,
3124 onChangeView,
3125 onChangeSelection,
3126 selection,
3127 setOpenedFilter,
3128 onClickItem,
3129 isItemClickable,
3130 renderItemLink,
3131 view,
3132 className,
3133 empty
3134 }) {
3135 const { containerRef } = (0, import_element11.useContext)(dataviews_context_default);
3136 const isDelayedLoading = useDelayedLoading(isLoading);
3137 const headerMenuRefs = (0, import_element11.useRef)(/* @__PURE__ */ new Map());
3138 const headerMenuToFocusRef = (0, import_element11.useRef)(void 0);
3139 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element11.useState)();
3140 const [contextMenuAnchor, setContextMenuAnchor] = (0, import_element11.useState)(null);
3141 (0, import_element11.useEffect)(() => {
3142 if (headerMenuToFocusRef.current) {
3143 headerMenuToFocusRef.current.focus();
3144 headerMenuToFocusRef.current = void 0;
3145 }
3146 });
3147 const tableNoticeId = (0, import_element11.useId)();
3148 const isHorizontalScrollEnd = useIsHorizontalScrollEnd({
3149 scrollContainerRef: containerRef,
3150 enabled: !!actions?.length
3151 });
3152 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
3153 if (nextHeaderMenuToFocus) {
3154 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
3155 setNextHeaderMenuToFocus(void 0);
3156 return;
3157 }
3158 const onHide = (field) => {
3159 const hidden = headerMenuRefs.current.get(field.id);
3160 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
3161 setNextHeaderMenuToFocus(fallback?.node);
3162 };
3163 const handleHeaderContextMenu = (event) => {
3164 event.preventDefault();
3165 event.stopPropagation();
3166 const virtualAnchor = {
3167 getBoundingClientRect: () => ({
3168 x: event.clientX,
3169 y: event.clientY,
3170 top: event.clientY,
3171 left: event.clientX,
3172 right: event.clientX,
3173 bottom: event.clientY,
3174 width: 0,
3175 height: 0,
3176 toJSON: () => ({})
3177 })
3178 };
3179 window.requestAnimationFrame(() => {
3180 setContextMenuAnchor(virtualAnchor);
3181 });
3182 };
3183 const hasData = !!data?.length;
3184 const titleField = fields.find((field) => field.id === view.titleField);
3185 const mediaField = fields.find((field) => field.id === view.mediaField);
3186 const descriptionField = fields.find(
3187 (field) => field.id === view.descriptionField
3188 );
3189 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
3190 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
3191 const { showTitle = true, showMedia = true, showDescription = true } = view;
3192 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
3193 const columns = view.fields ?? [];
3194 const headerMenuRef = (column, index) => (node) => {
3195 if (node) {
3196 headerMenuRefs.current.set(column, {
3197 node,
3198 fallback: columns[index > 0 ? index - 1 : 1]
3199 });
3200 } else {
3201 headerMenuRefs.current.delete(column);
3202 }
3203 };
3204 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
3205 const isRtl = (0, import_i18n9.isRTL)();
3206 if (!hasData) {
3207 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3208 "div",
3209 {
3210 className: clsx_default("dataviews-no-results", {
3211 "is-refreshing": isDelayedLoading
3212 }),
3213 id: tableNoticeId,
3214 children: empty
3215 }
3216 );
3217 }
3218 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
3219 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
3220 "table",
3221 {
3222 className: clsx_default("dataviews-view-table", className, {
3223 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
3224 view.layout.density
3225 ),
3226 "has-bulk-actions": hasBulkActions,
3227 "is-refreshing": !isInfiniteScroll && isDelayedLoading
3228 }),
3229 "aria-busy": isLoading,
3230 "aria-describedby": tableNoticeId,
3231 role: isInfiniteScroll ? "feed" : void 0,
3232 inert: !isInfiniteScroll && isLoading ? "true" : void 0,
3233 children: [
3234 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("colgroup", { children: [
3235 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-checkbox" }),
3236 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-first-data" }),
3237 columns.map((column, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3238 "col",
3239 {
3240 className: clsx_default(
3241 `dataviews-view-table__col-${column}`,
3242 {
3243 "dataviews-view-table__col-first-expand": !hasPrimaryColumn && index === columns.length - 1
3244 }
3245 )
3246 },
3247 `col-${column}`
3248 )),
3249 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-actions" })
3250 ] }),
3251 contextMenuAnchor && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3252 import_components6.Popover,
3253 {
3254 anchor: contextMenuAnchor,
3255 onClose: () => setContextMenuAnchor(null),
3256 placement: "bottom-start",
3257 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(PropertiesSection, { showLabel: false })
3258 }
3259 ),
3260 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("thead", { onContextMenu: handleHeaderContextMenu, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("tr", { className: "dataviews-view-table__row", children: [
3261 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3262 "th",
3263 {
3264 className: "dataviews-view-table__checkbox-column",
3265 scope: "col",
3266 onContextMenu: handleHeaderContextMenu,
3267 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3268 BulkSelectionCheckbox,
3269 {
3270 selection,
3271 onChangeSelection,
3272 data,
3273 actions,
3274 getItemId
3275 }
3276 )
3277 }
3278 ),
3279 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("th", { scope: "col", children: titleField && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3280 column_header_menu_default,
3281 {
3282 ref: headerMenuRef(
3283 titleField.id,
3284 0
3285 ),
3286 fieldId: titleField.id,
3287 view,
3288 fields,
3289 onChangeView,
3290 onHide,
3291 setOpenedFilter,
3292 canMove: false,
3293 canInsertLeft: isRtl ? view.layout?.enableMoving ?? true : false,
3294 canInsertRight: isRtl ? false : view.layout?.enableMoving ?? true
3295 }
3296 ) }),
3297 columns.map((column, index) => {
3298 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
3299 const field = fields.find(
3300 (f2) => f2.id === column
3301 );
3302 const effectiveAlign = getEffectiveAlign(
3303 align,
3304 field?.type
3305 );
3306 const canInsertOrMove = view.layout?.enableMoving ?? true;
3307 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3308 "th",
3309 {
3310 style: {
3311 width,
3312 maxWidth,
3313 minWidth,
3314 textAlign: effectiveAlign
3315 },
3316 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
3317 scope: "col",
3318 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3319 column_header_menu_default,
3320 {
3321 ref: headerMenuRef(column, index),
3322 fieldId: column,
3323 view,
3324 fields,
3325 onChangeView,
3326 onHide,
3327 setOpenedFilter,
3328 canMove: canInsertOrMove,
3329 canInsertLeft: canInsertOrMove,
3330 canInsertRight: canInsertOrMove
3331 }
3332 )
3333 },
3334 column
3335 );
3336 }),
3337 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3338 "th",
3339 {
3340 className: clsx_default(
3341 "dataviews-view-table__actions-column",
3342 {
3343 "dataviews-view-table__actions-column--sticky": true,
3344 "dataviews-view-table__actions-column--stuck": !isHorizontalScrollEnd
3345 }
3346 ),
3347 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "dataviews-view-table-header", children: (0, import_i18n9.__)("Actions") })
3348 }
3349 )
3350 ] }) }),
3351 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
3352 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("tbody", { children: [
3353 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tr", { className: "dataviews-view-table__group-header-row", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3354 "td",
3355 {
3356 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + (hasBulkActions ? 1 : 0) + (actions?.length ? 1 : 0),
3357 className: "dataviews-view-table__group-header-cell",
3358 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n9.sprintf)(
3359 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
3360 (0, import_i18n9.__)("%1$s: %2$s"),
3361 groupField.label,
3362 groupName
3363 )
3364 }
3365 ) }),
3366 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3367 TableRow,
3368 {
3369 item,
3370 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
3371 hasBulkActions,
3372 actions,
3373 fields,
3374 id: getItemId(item) || index.toString(),
3375 view,
3376 titleField,
3377 mediaField,
3378 descriptionField,
3379 selection,
3380 getItemId,
3381 onChangeSelection,
3382 onClickItem,
3383 renderItemLink,
3384 isItemClickable,
3385 isActionsColumnSticky: !isHorizontalScrollEnd
3386 },
3387 getItemId(item)
3388 ))
3389 ] }, `group-${groupName}`)
3390 ) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tbody", { children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3391 TableRow,
3392 {
3393 item,
3394 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0,
3395 hasBulkActions,
3396 actions,
3397 fields,
3398 id: getItemId(item) || index.toString(),
3399 view,
3400 titleField,
3401 mediaField,
3402 descriptionField,
3403 selection,
3404 getItemId,
3405 onChangeSelection,
3406 onClickItem,
3407 renderItemLink,
3408 isItemClickable,
3409 isActionsColumnSticky: !isHorizontalScrollEnd,
3410 posinset: isInfiniteScroll ? index + 1 : void 0
3411 },
3412 getItemId(item)
3413 )) })
3414 ]
3415 }
3416 ),
3417 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, {}) }) })
3418 ] });
3419 }
3420 var table_default = ViewTable;
3421
3422 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
3423 var import_components9 = __toESM(require_components(), 1);
3424 var import_i18n12 = __toESM(require_i18n(), 1);
3425
3426 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
3427 var import_components8 = __toESM(require_components(), 1);
3428 var import_i18n11 = __toESM(require_i18n(), 1);
3429 var import_compose4 = __toESM(require_compose(), 1);
3430 var import_keycodes2 = __toESM(require_keycodes(), 1);
3431 var import_element13 = __toESM(require_element(), 1);
3432
3433 // packages/dataviews/build-module/components/dataviews-layouts/grid/preview-size-picker.mjs
3434 var import_components7 = __toESM(require_components(), 1);
3435 var import_i18n10 = __toESM(require_i18n(), 1);
3436 var import_element12 = __toESM(require_element(), 1);
3437 var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
3438 var imageSizes = [
3439 {
3440 value: 120,
3441 breakpoint: 1
3442 },
3443 {
3444 value: 170,
3445 breakpoint: 1
3446 },
3447 {
3448 value: 230,
3449 breakpoint: 1
3450 },
3451 {
3452 value: 290,
3453 breakpoint: 1112
3454 // at minimum image width, 4 images display at this container size
3455 },
3456 {
3457 value: 350,
3458 breakpoint: 1636
3459 // at minimum image width, 6 images display at this container size
3460 },
3461 {
3462 value: 430,
3463 breakpoint: 588
3464 // at minimum image width, 2 images display at this container size
3465 }
3466 ];
3467 var DEFAULT_PREVIEW_SIZE = imageSizes[2].value;
3468 function useGridColumns() {
3469 const context = (0, import_element12.useContext)(dataviews_context_default);
3470 const view = context.view;
3471 return (0, import_element12.useMemo)(() => {
3472 const containerWidth = context.containerWidth;
3473 const gap = 32;
3474 const previewSize = view.layout?.previewSize ?? DEFAULT_PREVIEW_SIZE;
3475 const columns = Math.floor(
3476 (containerWidth + gap) / (previewSize + gap)
3477 );
3478 return Math.max(1, columns);
3479 }, [context.containerWidth, view.layout?.previewSize]);
3480 }
3481
3482 // packages/dataviews/build-module/components/dataviews-layouts/grid/composite-grid.mjs
3483 var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1);
3484 var { Badge } = unlock(import_components8.privateApis);
3485 function chunk(array, size) {
3486 const chunks = [];
3487 for (let i2 = 0, j2 = array.length; i2 < j2; i2 += size) {
3488 chunks.push(array.slice(i2, i2 + size));
3489 }
3490 return chunks;
3491 }
3492 var GridItem = (0, import_element13.forwardRef)(function GridItem2({
3493 view,
3494 selection,
3495 onChangeSelection,
3496 onClickItem,
3497 isItemClickable,
3498 renderItemLink,
3499 getItemId,
3500 item,
3501 actions,
3502 mediaField,
3503 titleField,
3504 descriptionField,
3505 regularFields,
3506 badgeFields,
3507 hasBulkActions,
3508 config,
3509 ...props
3510 }, ref) {
3511 const { showTitle = true, showMedia = true, showDescription = true } = view;
3512 const hasBulkAction = useHasAPossibleBulkAction(actions, item);
3513 const id = getItemId(item);
3514 const instanceId = (0, import_compose4.useInstanceId)(GridItem2);
3515 const isSelected2 = selection.includes(id);
3516 const mediaPlaceholder = /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "dataviews-view-grid__media-placeholder" });
3517 const rendersMediaField = showMedia && mediaField?.render;
3518 const renderedMediaField = rendersMediaField ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3519 mediaField.render,
3520 {
3521 item,
3522 field: mediaField,
3523 config
3524 }
3525 ) : mediaPlaceholder;
3526 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(titleField.render, { item, field: titleField }) : null;
3527 let mediaA11yProps;
3528 let titleA11yProps;
3529 if (isItemClickable(item) && onClickItem) {
3530 if (renderedTitleField) {
3531 mediaA11yProps = {
3532 "aria-labelledby": `dataviews-view-grid__title-field-${instanceId}`
3533 };
3534 titleA11yProps = {
3535 id: `dataviews-view-grid__title-field-${instanceId}`
3536 };
3537 } else {
3538 mediaA11yProps = {
3539 "aria-label": (0, import_i18n11.__)("Navigate to item")
3540 };
3541 }
3542 }
3543 return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
3544 Stack,
3545 {
3546 direction: "column",
3547 ...props,
3548 ref,
3549 className: clsx_default(
3550 props.className,
3551 "dataviews-view-grid__row__gridcell",
3552 "dataviews-view-grid__card",
3553 {
3554 "is-selected": hasBulkAction && isSelected2
3555 }
3556 ),
3557 onClickCapture: (event) => {
3558 props.onClickCapture?.(event);
3559 if ((0, import_keycodes2.isAppleOS)() ? event.metaKey : event.ctrlKey) {
3560 event.stopPropagation();
3561 event.preventDefault();
3562 if (!hasBulkAction) {
3563 return;
3564 }
3565 onChangeSelection(
3566 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id]
3567 );
3568 }
3569 },
3570 children: [
3571 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3572 ItemClickWrapper,
3573 {
3574 item,
3575 isItemClickable,
3576 onClickItem,
3577 renderItemLink,
3578 className: clsx_default("dataviews-view-grid__media", {
3579 "dataviews-view-grid__media--placeholder": !rendersMediaField
3580 }),
3581 ...mediaA11yProps,
3582 children: renderedMediaField
3583 }
3584 ),
3585 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3586 DataViewsSelectionCheckbox,
3587 {
3588 item,
3589 selection,
3590 onChangeSelection,
3591 getItemId,
3592 titleField,
3593 disabled: !hasBulkAction
3594 }
3595 ),
3596 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ItemActions, { item, actions, isCompact: true }) }),
3597 showTitle && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "dataviews-view-grid__title", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3598 ItemClickWrapper,
3599 {
3600 item,
3601 isItemClickable,
3602 onClickItem,
3603 renderItemLink,
3604 className: "dataviews-view-grid__title-field dataviews-title-field",
3605 ...titleA11yProps,
3606 title: titleField?.getValueFormatted({
3607 item,
3608 field: titleField
3609 }) || void 0,
3610 children: renderedTitleField
3611 }
3612 ) }),
3613 /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(Stack, { direction: "column", gap: "xs", children: [
3614 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3615 descriptionField.render,
3616 {
3617 item,
3618 field: descriptionField
3619 }
3620 ),
3621 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3622 Stack,
3623 {
3624 direction: "row",
3625 className: "dataviews-view-grid__badge-fields",
3626 gap: "sm",
3627 wrap: "wrap",
3628 align: "top",
3629 justify: "flex-start",
3630 children: badgeFields.map((field) => {
3631 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3632 Badge,
3633 {
3634 className: "dataviews-view-grid__field-value",
3635 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3636 field.render,
3637 {
3638 item,
3639 field
3640 }
3641 )
3642 },
3643 field.id
3644 );
3645 })
3646 }
3647 ),
3648 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3649 Stack,
3650 {
3651 direction: "column",
3652 className: "dataviews-view-grid__fields",
3653 gap: "xs",
3654 children: regularFields.map((field) => {
3655 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3656 import_components8.Flex,
3657 {
3658 className: "dataviews-view-grid__field",
3659 gap: 1,
3660 justify: "flex-start",
3661 expanded: true,
3662 style: { height: "auto" },
3663 direction: "row",
3664 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
3665 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_components8.Tooltip, { text: field.label, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_components8.FlexItem, { className: "dataviews-view-grid__field-name", children: field.header }) }),
3666 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3667 import_components8.FlexItem,
3668 {
3669 className: "dataviews-view-grid__field-value",
3670 style: { maxHeight: "none" },
3671 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3672 field.render,
3673 {
3674 item,
3675 field
3676 }
3677 )
3678 }
3679 )
3680 ] })
3681 },
3682 field.id
3683 );
3684 })
3685 }
3686 )
3687 ] })
3688 ]
3689 }
3690 );
3691 });
3692 function CompositeGrid({
3693 data,
3694 isInfiniteScroll,
3695 className,
3696 inert,
3697 isLoading,
3698 view,
3699 fields,
3700 selection,
3701 onChangeSelection,
3702 onClickItem,
3703 isItemClickable,
3704 renderItemLink,
3705 getItemId,
3706 actions
3707 }) {
3708 const { paginationInfo, resizeObserverRef } = (0, import_element13.useContext)(dataviews_context_default);
3709 const gridColumns = useGridColumns();
3710 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data);
3711 const titleField = fields.find(
3712 (field) => field.id === view?.titleField
3713 );
3714 const mediaField = fields.find(
3715 (field) => field.id === view?.mediaField
3716 );
3717 const descriptionField = fields.find(
3718 (field) => field.id === view?.descriptionField
3719 );
3720 const otherFields = view.fields ?? [];
3721 const { regularFields, badgeFields } = otherFields.reduce(
3722 (accumulator, fieldId) => {
3723 const field = fields.find((f2) => f2.id === fieldId);
3724 if (!field) {
3725 return accumulator;
3726 }
3727 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
3728 accumulator[key].push(field);
3729 return accumulator;
3730 },
3731 { regularFields: [], badgeFields: [] }
3732 );
3733 const size = "900px";
3734 const totalRows = Math.ceil(data.length / gridColumns);
3735 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3736 import_components8.Composite,
3737 {
3738 role: isInfiniteScroll ? "feed" : "grid",
3739 className: clsx_default("dataviews-view-grid", className),
3740 focusWrap: true,
3741 "aria-busy": isLoading,
3742 "aria-rowcount": isInfiniteScroll ? void 0 : totalRows,
3743 ref: resizeObserverRef,
3744 inert,
3745 children: chunk(data, gridColumns).map((row, i2) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3746 import_components8.Composite.Row,
3747 {
3748 render: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3749 "div",
3750 {
3751 role: "row",
3752 "aria-rowindex": i2 + 1,
3753 "aria-label": (0, import_i18n11.sprintf)(
3754 /* translators: %d: The row number in the grid */
3755 (0, import_i18n11.__)("Row %d"),
3756 i2 + 1
3757 ),
3758 className: "dataviews-view-grid__row",
3759 style: {
3760 gridTemplateColumns: `repeat( ${gridColumns}, minmax(0, 1fr) )`
3761 }
3762 }
3763 ),
3764 children: row.map((item, indexInRow) => {
3765 const index = i2 * gridColumns + indexInRow;
3766 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3767 import_components8.Composite.Item,
3768 {
3769 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3770 GridItem,
3771 {
3772 ...props,
3773 role: isInfiniteScroll ? "article" : "gridcell",
3774 "aria-setsize": isInfiniteScroll ? paginationInfo.totalItems : void 0,
3775 "aria-posinset": isInfiniteScroll ? index + 1 : void 0,
3776 view,
3777 selection,
3778 onChangeSelection,
3779 onClickItem,
3780 isItemClickable,
3781 renderItemLink,
3782 getItemId,
3783 item,
3784 actions,
3785 mediaField,
3786 titleField,
3787 descriptionField,
3788 regularFields,
3789 badgeFields,
3790 hasBulkActions,
3791 config: {
3792 sizes: size
3793 }
3794 }
3795 )
3796 },
3797 getItemId(item)
3798 );
3799 })
3800 },
3801 i2
3802 ))
3803 }
3804 );
3805 }
3806
3807 // packages/dataviews/build-module/components/dataviews-layouts/grid/index.mjs
3808 var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1);
3809 function ViewGrid({
3810 actions,
3811 data,
3812 fields,
3813 getItemId,
3814 isLoading,
3815 onChangeSelection,
3816 onClickItem,
3817 isItemClickable,
3818 renderItemLink,
3819 selection,
3820 view,
3821 className,
3822 empty
3823 }) {
3824 const isDelayedLoading = useDelayedLoading(!!isLoading);
3825 const hasData = !!data?.length;
3826 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
3827 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
3828 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
3829 if (!hasData) {
3830 return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3831 "div",
3832 {
3833 className: clsx_default("dataviews-no-results", {
3834 "is-refreshing": isDelayedLoading
3835 }),
3836 children: empty
3837 }
3838 );
3839 }
3840 const gridProps = {
3841 className: clsx_default(className, {
3842 "is-refreshing": !isInfiniteScroll && isDelayedLoading
3843 }),
3844 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0,
3845 isLoading,
3846 view,
3847 fields,
3848 selection,
3849 onChangeSelection,
3850 onClickItem,
3851 isItemClickable,
3852 renderItemLink,
3853 getItemId,
3854 actions
3855 };
3856 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, {
3857 // Render multiple groups.
3858 children: [
3859 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Stack, { direction: "column", gap: "lg", children: Array.from(dataByGroup.entries()).map(
3860 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
3861 Stack,
3862 {
3863 direction: "column",
3864 gap: "sm",
3865 children: [
3866 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("h3", { className: "dataviews-view-grid__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n12.sprintf)(
3867 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
3868 (0, import_i18n12.__)("%1$s: %2$s"),
3869 groupField.label,
3870 groupName
3871 ) }),
3872 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3873 CompositeGrid,
3874 {
3875 ...gridProps,
3876 data: groupItems,
3877 isInfiniteScroll: false
3878 }
3879 )
3880 ]
3881 },
3882 groupName
3883 )
3884 ) }),
3885 // Render a single grid with all data.
3886 !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3887 CompositeGrid,
3888 {
3889 ...gridProps,
3890 data,
3891 isInfiniteScroll: !!isInfiniteScroll
3892 }
3893 ),
3894 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_components9.Spinner, {}) })
3895 ]
3896 });
3897 }
3898 var grid_default = ViewGrid;
3899
3900 // packages/dataviews/build-module/components/dataviews-layouts/list/index.mjs
3901 var import_compose5 = __toESM(require_compose(), 1);
3902 var import_components10 = __toESM(require_components(), 1);
3903 var import_element14 = __toESM(require_element(), 1);
3904 var import_i18n13 = __toESM(require_i18n(), 1);
3905 var import_data5 = __toESM(require_data(), 1);
3906 var import_jsx_runtime35 = __toESM(require_jsx_runtime(), 1);
3907 var { Menu: Menu3 } = unlock(import_components10.privateApis);
3908 function generateItemWrapperCompositeId(idPrefix) {
3909 return `${idPrefix}-item-wrapper`;
3910 }
3911 function generatePrimaryActionCompositeId(idPrefix, primaryActionId) {
3912 return `${idPrefix}-primary-action-${primaryActionId}`;
3913 }
3914 function generateDropdownTriggerCompositeId(idPrefix) {
3915 return `${idPrefix}-dropdown`;
3916 }
3917 function PrimaryActionGridCell({
3918 idPrefix,
3919 primaryAction,
3920 item
3921 }) {
3922 const registry = (0, import_data5.useRegistry)();
3923 const [isModalOpen, setIsModalOpen] = (0, import_element14.useState)(false);
3924 const compositeItemId = generatePrimaryActionCompositeId(
3925 idPrefix,
3926 primaryAction.id
3927 );
3928 const label = typeof primaryAction.label === "string" ? primaryAction.label : primaryAction.label([item]);
3929 return "RenderModal" in primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3930 import_components10.Composite.Item,
3931 {
3932 id: compositeItemId,
3933 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3934 import_components10.Button,
3935 {
3936 disabled: !!primaryAction.disabled,
3937 accessibleWhenDisabled: true,
3938 text: label,
3939 size: "small",
3940 onClick: () => setIsModalOpen(true)
3941 }
3942 ),
3943 children: isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3944 ActionModal,
3945 {
3946 action: primaryAction,
3947 items: [item],
3948 closeModal: () => setIsModalOpen(false)
3949 }
3950 )
3951 }
3952 ) }, primaryAction.id) : /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3953 import_components10.Composite.Item,
3954 {
3955 id: compositeItemId,
3956 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3957 import_components10.Button,
3958 {
3959 disabled: !!primaryAction.disabled,
3960 accessibleWhenDisabled: true,
3961 size: "small",
3962 onClick: () => {
3963 primaryAction.callback([item], { registry });
3964 },
3965 children: label
3966 }
3967 )
3968 }
3969 ) }, primaryAction.id);
3970 }
3971 function ListItem({
3972 view,
3973 actions,
3974 idPrefix,
3975 isSelected: isSelected2,
3976 item,
3977 titleField,
3978 mediaField,
3979 descriptionField,
3980 onSelect,
3981 otherFields,
3982 onDropdownTriggerKeyDown,
3983 posinset
3984 }) {
3985 const {
3986 showTitle = true,
3987 showMedia = true,
3988 showDescription = true,
3989 infiniteScrollEnabled
3990 } = view;
3991 const itemRef = (0, import_element14.useRef)(null);
3992 const labelId = `${idPrefix}-label`;
3993 const descriptionId = `${idPrefix}-description`;
3994 const registry = (0, import_data5.useRegistry)();
3995 const [isHovered, setIsHovered] = (0, import_element14.useState)(false);
3996 const [activeModalAction, setActiveModalAction] = (0, import_element14.useState)(
3997 null
3998 );
3999 const handleHover = ({ type }) => {
4000 const isHover = type === "mouseenter";
4001 setIsHovered(isHover);
4002 };
4003 const { paginationInfo } = (0, import_element14.useContext)(dataviews_context_default);
4004 (0, import_element14.useEffect)(() => {
4005 if (isSelected2) {
4006 itemRef.current?.scrollIntoView({
4007 behavior: "auto",
4008 block: "nearest",
4009 inline: "nearest"
4010 });
4011 }
4012 }, [isSelected2]);
4013 const { primaryAction, eligibleActions } = (0, import_element14.useMemo)(() => {
4014 const _eligibleActions = actions.filter(
4015 (action) => !action.isEligible || action.isEligible(item)
4016 );
4017 const _primaryActions = _eligibleActions.filter(
4018 (action) => action.isPrimary
4019 );
4020 return {
4021 primaryAction: _primaryActions[0],
4022 eligibleActions: _eligibleActions
4023 };
4024 }, [actions, item]);
4025 const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1;
4026 const renderedMediaField = showMedia && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "dataviews-view-list__media-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4027 mediaField.render,
4028 {
4029 item,
4030 field: mediaField,
4031 config: { sizes: "52px" }
4032 }
4033 ) }) : null;
4034 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(titleField.render, { item, field: titleField }) : null;
4035 const renderDescription = showDescription && descriptionField?.render;
4036 const hasOnlyMediaAndTitle = !!renderedMediaField && !renderDescription && !otherFields.length;
4037 const usedActions = eligibleActions?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4038 Stack,
4039 {
4040 direction: "row",
4041 gap: "md",
4042 className: "dataviews-view-list__item-actions",
4043 children: [
4044 primaryAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4045 PrimaryActionGridCell,
4046 {
4047 idPrefix,
4048 primaryAction,
4049 item
4050 }
4051 ),
4052 !hasOnlyOnePrimaryAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { role: "gridcell", children: [
4053 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(Menu3, { placement: "bottom-end", children: [
4054 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4055 Menu3.TriggerButton,
4056 {
4057 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4058 import_components10.Composite.Item,
4059 {
4060 id: generateDropdownTriggerCompositeId(
4061 idPrefix
4062 ),
4063 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4064 import_components10.Button,
4065 {
4066 size: "small",
4067 icon: more_vertical_default,
4068 label: (0, import_i18n13.__)("Actions"),
4069 accessibleWhenDisabled: true,
4070 disabled: !actions.length,
4071 onKeyDown: onDropdownTriggerKeyDown
4072 }
4073 )
4074 }
4075 )
4076 }
4077 ),
4078 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Menu3.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4079 ActionsMenuGroup,
4080 {
4081 actions: eligibleActions,
4082 item,
4083 registry,
4084 setActiveModalAction
4085 }
4086 ) })
4087 ] }),
4088 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4089 ActionModal,
4090 {
4091 action: activeModalAction,
4092 items: [item],
4093 closeModal: () => setActiveModalAction(null)
4094 }
4095 )
4096 ] })
4097 ]
4098 }
4099 );
4100 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4101 import_components10.Composite.Row,
4102 {
4103 ref: itemRef,
4104 render: (
4105 /* aria-posinset breaks Composite.Row if passed to it directly. */
4106 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4107 "div",
4108 {
4109 "aria-posinset": posinset,
4110 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0
4111 }
4112 )
4113 ),
4114 role: infiniteScrollEnabled ? "article" : "row",
4115 className: clsx_default({
4116 "is-selected": isSelected2,
4117 "is-hovered": isHovered
4118 }),
4119 onMouseEnter: handleHover,
4120 onMouseLeave: handleHover,
4121 children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4122 Stack,
4123 {
4124 direction: "row",
4125 className: "dataviews-view-list__item-wrapper",
4126 children: [
4127 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4128 import_components10.Composite.Item,
4129 {
4130 id: generateItemWrapperCompositeId(idPrefix),
4131 "aria-pressed": isSelected2,
4132 "aria-labelledby": labelId,
4133 "aria-describedby": descriptionId,
4134 className: "dataviews-view-list__item",
4135 onClick: () => onSelect(item)
4136 }
4137 ) }),
4138 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4139 Stack,
4140 {
4141 direction: "row",
4142 gap: "md",
4143 justify: "start",
4144 align: hasOnlyMediaAndTitle ? "center" : "flex-start",
4145 style: { flex: 1, minWidth: 0 },
4146 children: [
4147 renderedMediaField,
4148 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4149 Stack,
4150 {
4151 direction: "column",
4152 gap: "xs",
4153 className: "dataviews-view-list__field-wrapper",
4154 children: [
4155 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(Stack, { direction: "row", align: "center", children: [
4156 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4157 "div",
4158 {
4159 className: "dataviews-title-field dataviews-view-list__title-field",
4160 id: labelId,
4161 children: renderedTitleField
4162 }
4163 ),
4164 usedActions
4165 ] }),
4166 renderDescription && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "dataviews-view-list__field", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4167 descriptionField.render,
4168 {
4169 item,
4170 field: descriptionField
4171 }
4172 ) }),
4173 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4174 "div",
4175 {
4176 className: "dataviews-view-list__fields",
4177 id: descriptionId,
4178 children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4179 "div",
4180 {
4181 className: "dataviews-view-list__field",
4182 children: [
4183 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4184 import_components10.VisuallyHidden,
4185 {
4186 as: "span",
4187 className: "dataviews-view-list__field-label",
4188 children: field.label
4189 }
4190 ),
4191 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "dataviews-view-list__field-value", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4192 field.render,
4193 {
4194 item,
4195 field
4196 }
4197 ) })
4198 ]
4199 },
4200 field.id
4201 ))
4202 }
4203 )
4204 ]
4205 }
4206 )
4207 ]
4208 }
4209 )
4210 ]
4211 }
4212 )
4213 }
4214 );
4215 }
4216 function isDefined2(item) {
4217 return !!item;
4218 }
4219 function ViewList(props) {
4220 const {
4221 actions,
4222 data,
4223 fields,
4224 getItemId,
4225 isLoading,
4226 onChangeSelection,
4227 selection,
4228 view,
4229 className,
4230 empty
4231 } = props;
4232 const baseId = (0, import_compose5.useInstanceId)(ViewList, "view-list");
4233 const isDelayedLoading = useDelayedLoading(!!isLoading);
4234 const selectedItem = data?.findLast(
4235 (item) => selection.includes(getItemId(item))
4236 );
4237 const titleField = fields.find((field) => field.id === view.titleField);
4238 const mediaField = fields.find((field) => field.id === view.mediaField);
4239 const descriptionField = fields.find(
4240 (field) => field.id === view.descriptionField
4241 );
4242 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined2);
4243 const onSelect = (item) => onChangeSelection([getItemId(item)]);
4244 const generateCompositeItemIdPrefix = (0, import_element14.useCallback)(
4245 (item) => `${baseId}-${getItemId(item)}`,
4246 [baseId, getItemId]
4247 );
4248 const isActiveCompositeItem = (0, import_element14.useCallback)(
4249 (item, idToCheck) => {
4250 return idToCheck.startsWith(
4251 generateCompositeItemIdPrefix(item)
4252 );
4253 },
4254 [generateCompositeItemIdPrefix]
4255 );
4256 const [activeCompositeId, setActiveCompositeId] = (0, import_element14.useState)(void 0);
4257 const compositeRef = (0, import_element14.useRef)(null);
4258 (0, import_element14.useEffect)(() => {
4259 if (selectedItem) {
4260 setActiveCompositeId(
4261 generateItemWrapperCompositeId(
4262 generateCompositeItemIdPrefix(selectedItem)
4263 )
4264 );
4265 }
4266 }, [selectedItem, generateCompositeItemIdPrefix]);
4267 const activeItemIndex = data.findIndex(
4268 (item) => isActiveCompositeItem(item, activeCompositeId ?? "")
4269 );
4270 const previousActiveItemIndex = (0, import_compose5.usePrevious)(activeItemIndex);
4271 const isActiveIdInList = activeItemIndex !== -1;
4272 const selectCompositeItem = (0, import_element14.useCallback)(
4273 (targetIndex, generateCompositeId) => {
4274 const clampedIndex = Math.min(
4275 data.length - 1,
4276 Math.max(0, targetIndex)
4277 );
4278 if (!data[clampedIndex]) {
4279 return;
4280 }
4281 const itemIdPrefix = generateCompositeItemIdPrefix(
4282 data[clampedIndex]
4283 );
4284 const targetCompositeItemId = generateCompositeId(itemIdPrefix);
4285 setActiveCompositeId(targetCompositeItemId);
4286 if (compositeRef.current?.contains(
4287 compositeRef.current.ownerDocument.activeElement
4288 )) {
4289 document.getElementById(targetCompositeItemId)?.focus();
4290 }
4291 },
4292 [data, generateCompositeItemIdPrefix]
4293 );
4294 (0, import_element14.useEffect)(() => {
4295 const wasActiveIdInList = previousActiveItemIndex !== void 0 && previousActiveItemIndex !== -1;
4296 if (!isActiveIdInList && wasActiveIdInList) {
4297 selectCompositeItem(
4298 previousActiveItemIndex,
4299 generateItemWrapperCompositeId
4300 );
4301 }
4302 }, [isActiveIdInList, selectCompositeItem, previousActiveItemIndex]);
4303 const onDropdownTriggerKeyDown = (0, import_element14.useCallback)(
4304 (event) => {
4305 if (event.key === "ArrowDown") {
4306 event.preventDefault();
4307 selectCompositeItem(
4308 activeItemIndex + 1,
4309 generateDropdownTriggerCompositeId
4310 );
4311 }
4312 if (event.key === "ArrowUp") {
4313 event.preventDefault();
4314 selectCompositeItem(
4315 activeItemIndex - 1,
4316 generateDropdownTriggerCompositeId
4317 );
4318 }
4319 },
4320 [selectCompositeItem, activeItemIndex]
4321 );
4322 const hasData = !!data?.length;
4323 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
4324 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
4325 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
4326 if (!hasData) {
4327 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4328 "div",
4329 {
4330 className: clsx_default("dataviews-no-results", {
4331 "is-refreshing": isDelayedLoading
4332 }),
4333 children: empty
4334 }
4335 );
4336 }
4337 if (hasData && groupField && dataByGroup) {
4338 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4339 import_components10.Composite,
4340 {
4341 ref: compositeRef,
4342 id: `${baseId}`,
4343 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", {}),
4344 className: "dataviews-view-list__group",
4345 role: "grid",
4346 activeId: activeCompositeId,
4347 setActiveId: setActiveCompositeId,
4348 children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4349 Stack,
4350 {
4351 direction: "column",
4352 gap: "lg",
4353 className: clsx_default("dataviews-view-list", className),
4354 children: Array.from(dataByGroup.entries()).map(
4355 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4356 Stack,
4357 {
4358 direction: "column",
4359 gap: "sm",
4360 children: [
4361 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h3", { className: "dataviews-view-list__group-header", children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n13.sprintf)(
4362 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
4363 (0, import_i18n13.__)("%1$s: %2$s"),
4364 groupField.label,
4365 groupName
4366 ) }),
4367 groupItems.map((item) => {
4368 const id = generateCompositeItemIdPrefix(item);
4369 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4370 ListItem,
4371 {
4372 view,
4373 idPrefix: id,
4374 actions,
4375 item,
4376 isSelected: item === selectedItem,
4377 onSelect,
4378 mediaField,
4379 titleField,
4380 descriptionField,
4381 otherFields,
4382 onDropdownTriggerKeyDown
4383 },
4384 id
4385 );
4386 })
4387 ]
4388 },
4389 groupName
4390 )
4391 )
4392 }
4393 )
4394 }
4395 );
4396 }
4397 return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
4398 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4399 import_components10.Composite,
4400 {
4401 ref: compositeRef,
4402 id: baseId,
4403 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", {}),
4404 className: clsx_default("dataviews-view-list", className, {
4405 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
4406 view.layout.density
4407 ),
4408 "is-refreshing": !isInfiniteScroll && isDelayedLoading
4409 }),
4410 role: view.infiniteScrollEnabled ? "feed" : "grid",
4411 activeId: activeCompositeId,
4412 setActiveId: setActiveCompositeId,
4413 inert: !isInfiniteScroll && !!isLoading ? "true" : void 0,
4414 children: data.map((item, index) => {
4415 const id = generateCompositeItemIdPrefix(item);
4416 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4417 ListItem,
4418 {
4419 view,
4420 idPrefix: id,
4421 actions,
4422 item,
4423 isSelected: item === selectedItem,
4424 onSelect,
4425 mediaField,
4426 titleField,
4427 descriptionField,
4428 otherFields,
4429 onDropdownTriggerKeyDown,
4430 posinset: view.infiniteScrollEnabled ? index + 1 : void 0
4431 },
4432 id
4433 );
4434 })
4435 }
4436 ),
4437 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components10.Spinner, {}) })
4438 ] });
4439 }
4440
4441 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
4442 var import_components12 = __toESM(require_components(), 1);
4443
4444 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-group.mjs
4445 var import_i18n14 = __toESM(require_i18n(), 1);
4446 var import_element15 = __toESM(require_element(), 1);
4447 var import_jsx_runtime36 = __toESM(require_jsx_runtime(), 1);
4448 function ActivityGroup({
4449 groupName,
4450 groupData,
4451 groupField,
4452 showLabel = true,
4453 children
4454 }) {
4455 const groupHeader = showLabel ? (0, import_element15.createInterpolateElement)(
4456 // translators: %s: The label of the field e.g. "Status".
4457 (0, import_i18n14.sprintf)((0, import_i18n14.__)("%s: <groupName />"), groupField.label).trim(),
4458 {
4459 groupName: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4460 groupField.render,
4461 {
4462 item: groupData[0],
4463 field: groupField
4464 }
4465 )
4466 }
4467 ) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(groupField.render, { item: groupData[0], field: groupField });
4468 return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4469 Stack,
4470 {
4471 direction: "column",
4472 className: "dataviews-view-activity__group",
4473 children: [
4474 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("h3", { className: "dataviews-view-activity__group-header", children: groupHeader }),
4475 children
4476 ]
4477 },
4478 groupName
4479 );
4480 }
4481
4482 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-item.mjs
4483 var import_components11 = __toESM(require_components(), 1);
4484 var import_element16 = __toESM(require_element(), 1);
4485 var import_data6 = __toESM(require_data(), 1);
4486 var import_compose6 = __toESM(require_compose(), 1);
4487 var import_jsx_runtime37 = __toESM(require_jsx_runtime(), 1);
4488 function ActivityItem(props) {
4489 const {
4490 view,
4491 actions,
4492 item,
4493 titleField,
4494 mediaField,
4495 descriptionField,
4496 otherFields,
4497 posinset,
4498 onClickItem,
4499 renderItemLink,
4500 isItemClickable
4501 } = props;
4502 const {
4503 showTitle = true,
4504 showMedia = true,
4505 showDescription = true,
4506 infiniteScrollEnabled
4507 } = view;
4508 const itemRef = (0, import_element16.useRef)(null);
4509 const registry = (0, import_data6.useRegistry)();
4510 const { paginationInfo } = (0, import_element16.useContext)(dataviews_context_default);
4511 const { primaryActions, eligibleActions } = (0, import_element16.useMemo)(() => {
4512 const _eligibleActions = actions.filter(
4513 (action) => !action.isEligible || action.isEligible(item)
4514 );
4515 const _primaryActions = _eligibleActions.filter(
4516 (action) => action.isPrimary
4517 );
4518 return {
4519 primaryActions: _primaryActions,
4520 eligibleActions: _eligibleActions
4521 };
4522 }, [actions, item]);
4523 const isMobileViewport = (0, import_compose6.useViewportMatch)("medium", "<");
4524 const density = view.layout?.density ?? "balanced";
4525 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4526 mediaField.render,
4527 {
4528 item,
4529 field: mediaField,
4530 config: {
4531 sizes: density === "comfortable" ? "32px" : "24px"
4532 }
4533 }
4534 ) : null;
4535 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4536 "span",
4537 {
4538 className: "dataviews-view-activity__item-bullet",
4539 "aria-hidden": "true"
4540 }
4541 ) });
4542 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(titleField.render, { item, field: titleField }) : null;
4543 const verticalGap = (0, import_element16.useMemo)(() => {
4544 switch (density) {
4545 case "comfortable":
4546 return "md";
4547 default:
4548 return "sm";
4549 }
4550 }, [density]);
4551 return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4552 "div",
4553 {
4554 ref: itemRef,
4555 role: infiniteScrollEnabled ? "article" : void 0,
4556 "aria-posinset": posinset,
4557 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0,
4558 className: clsx_default(
4559 "dataviews-view-activity__item",
4560 density === "compact" && "is-compact",
4561 density === "balanced" && "is-balanced",
4562 density === "comfortable" && "is-comfortable"
4563 ),
4564 children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(Stack, { direction: "row", gap: "lg", justify: "start", align: "flex-start", children: [
4565 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4566 Stack,
4567 {
4568 direction: "column",
4569 gap: "xs",
4570 align: "center",
4571 className: "dataviews-view-activity__item-type",
4572 children: renderedMediaField
4573 }
4574 ),
4575 /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
4576 Stack,
4577 {
4578 direction: "column",
4579 gap: verticalGap,
4580 align: "flex-start",
4581 className: "dataviews-view-activity__item-content",
4582 children: [
4583 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4584 ItemClickWrapper,
4585 {
4586 item,
4587 isItemClickable,
4588 onClickItem,
4589 renderItemLink,
4590 className: "dataviews-view-activity__item-title",
4591 children: renderedTitleField
4592 }
4593 ),
4594 showDescription && descriptionField && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-description", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4595 descriptionField.render,
4596 {
4597 item,
4598 field: descriptionField
4599 }
4600 ) }),
4601 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
4602 "div",
4603 {
4604 className: "dataviews-view-activity__item-field",
4605 children: [
4606 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4607 import_components11.VisuallyHidden,
4608 {
4609 as: "span",
4610 className: "dataviews-view-activity__item-field-label",
4611 children: field.label
4612 }
4613 ),
4614 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "dataviews-view-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4615 field.render,
4616 {
4617 item,
4618 field
4619 }
4620 ) })
4621 ]
4622 },
4623 field.id
4624 )) }),
4625 !!primaryActions?.length && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4626 PrimaryActions,
4627 {
4628 item,
4629 actions: primaryActions,
4630 registry,
4631 buttonVariant: "secondary"
4632 }
4633 )
4634 ]
4635 }
4636 ),
4637 (primaryActions.length < eligibleActions.length || // Since we hide primary actions on mobile, we need to show the menu
4638 // there if there are any actions at all.
4639 isMobileViewport && // At the same time, only show the menu if there are actions to show.
4640 eligibleActions.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-actions", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4641 ItemActions,
4642 {
4643 item,
4644 actions: eligibleActions,
4645 isCompact: true
4646 }
4647 ) })
4648 ] })
4649 }
4650 );
4651 }
4652 var activity_item_default = ActivityItem;
4653
4654 // packages/dataviews/build-module/components/dataviews-layouts/activity/activity-items.mjs
4655 var import_react3 = __toESM(require_react(), 1);
4656 function isDefined3(item) {
4657 return !!item;
4658 }
4659 function ActivityItems(props) {
4660 const { data, fields, getItemId, view } = props;
4661 const titleField = fields.find((field) => field.id === view.titleField);
4662 const mediaField = fields.find((field) => field.id === view.mediaField);
4663 const descriptionField = fields.find(
4664 (field) => field.id === view.descriptionField
4665 );
4666 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined3);
4667 return data.map((item, index) => {
4668 return /* @__PURE__ */ (0, import_react3.createElement)(
4669 activity_item_default,
4670 {
4671 ...props,
4672 key: getItemId(item),
4673 item,
4674 mediaField,
4675 titleField,
4676 descriptionField,
4677 otherFields,
4678 posinset: view.infiniteScrollEnabled ? index + 1 : void 0
4679 }
4680 );
4681 });
4682 }
4683
4684 // packages/dataviews/build-module/components/dataviews-layouts/activity/index.mjs
4685 var import_jsx_runtime38 = __toESM(require_jsx_runtime(), 1);
4686 function ViewActivity(props) {
4687 const { empty, data, fields, isLoading, view, className } = props;
4688 const isDelayedLoading = useDelayedLoading(!!isLoading);
4689 const hasData = !!data?.length;
4690 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null;
4691 const dataByGroup = hasData && groupField ? getDataByGroup(data, groupField) : null;
4692 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
4693 if (!hasData) {
4694 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4695 "div",
4696 {
4697 className: clsx_default("dataviews-no-results", {
4698 "is-refreshing": isDelayedLoading
4699 }),
4700 children: empty
4701 }
4702 );
4703 }
4704 const isInert = !isInfiniteScroll && !!isLoading;
4705 const wrapperClassName = clsx_default("dataviews-view-activity", className, {
4706 "is-refreshing": !isInfiniteScroll && isDelayedLoading
4707 });
4708 const groupedEntries = dataByGroup ? Array.from(dataByGroup.entries()) : [];
4709 if (hasData && groupField && dataByGroup) {
4710 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4711 Stack,
4712 {
4713 direction: "column",
4714 gap: "sm",
4715 className: wrapperClassName,
4716 inert: isInert ? "true" : void 0,
4717 children: groupedEntries.map(
4718 ([groupName, groupData]) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4719 ActivityGroup,
4720 {
4721 groupName,
4722 groupData,
4723 groupField,
4724 showLabel: view.groupBy?.showLabel !== false,
4725 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4726 ActivityItems,
4727 {
4728 ...props,
4729 data: groupData
4730 }
4731 )
4732 },
4733 groupName
4734 )
4735 )
4736 }
4737 );
4738 }
4739 return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
4740 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
4741 "div",
4742 {
4743 className: wrapperClassName,
4744 role: view.infiniteScrollEnabled ? "feed" : void 0,
4745 inert: isInert ? "true" : void 0,
4746 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ActivityItems, { ...props })
4747 }
4748 ),
4749 isInfiniteScroll && isLoading && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_components12.Spinner, {}) })
4750 ] });
4751 }
4752
4753 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
4754 var import_components15 = __toESM(require_components(), 1);
4755 var import_i18n17 = __toESM(require_i18n(), 1);
4756 var import_compose7 = __toESM(require_compose(), 1);
4757 var import_element20 = __toESM(require_element(), 1);
4758
4759 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
4760 var import_components14 = __toESM(require_components(), 1);
4761 var import_data7 = __toESM(require_data(), 1);
4762 var import_element18 = __toESM(require_element(), 1);
4763 var import_i18n16 = __toESM(require_i18n(), 1);
4764
4765 // packages/dataviews/build-module/components/dataviews-pagination/index.mjs
4766 var import_components13 = __toESM(require_components(), 1);
4767 var import_element17 = __toESM(require_element(), 1);
4768 var import_i18n15 = __toESM(require_i18n(), 1);
4769 var import_jsx_runtime39 = __toESM(require_jsx_runtime(), 1);
4770 function DataViewsPagination() {
4771 const {
4772 view,
4773 onChangeView,
4774 paginationInfo: { totalItems = 0, totalPages }
4775 } = (0, import_element17.useContext)(dataviews_context_default);
4776 if (!totalItems || !totalPages || view.infiniteScrollEnabled) {
4777 return null;
4778 }
4779 const currentPage = view.page ?? 1;
4780 const pageSelectOptions = Array.from(Array(totalPages)).map(
4781 (_, i2) => {
4782 const page = i2 + 1;
4783 return {
4784 value: page.toString(),
4785 label: page.toString(),
4786 "aria-label": currentPage === page ? (0, import_i18n15.sprintf)(
4787 // translators: 1: current page number. 2: total number of pages.
4788 (0, import_i18n15.__)("Page %1$d of %2$d"),
4789 currentPage,
4790 totalPages
4791 ) : page.toString()
4792 };
4793 }
4794 );
4795 return !!totalItems && totalPages !== 1 && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
4796 Stack,
4797 {
4798 direction: "row",
4799 className: "dataviews-pagination",
4800 justify: "end",
4801 align: "center",
4802 gap: "xl",
4803 children: [
4804 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
4805 Stack,
4806 {
4807 direction: "row",
4808 justify: "flex-start",
4809 align: "center",
4810 gap: "xs",
4811 className: "dataviews-pagination__page-select",
4812 children: (0, import_element17.createInterpolateElement)(
4813 (0, import_i18n15.sprintf)(
4814 // translators: 1: Current page number, 2: Total number of pages.
4815 (0, import_i18n15._x)(
4816 "<div>Page</div>%1$s<div>of %2$d</div>",
4817 "paging"
4818 ),
4819 "<CurrentPage />",
4820 totalPages
4821 ),
4822 {
4823 div: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { "aria-hidden": true }),
4824 CurrentPage: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
4825 import_components13.SelectControl,
4826 {
4827 "aria-label": (0, import_i18n15.__)("Current page"),
4828 value: currentPage.toString(),
4829 options: pageSelectOptions,
4830 onChange: (newValue) => {
4831 onChangeView({
4832 ...view,
4833 page: +newValue
4834 });
4835 },
4836 size: "small",
4837 variant: "minimal"
4838 }
4839 )
4840 }
4841 )
4842 }
4843 ),
4844 /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(Stack, { direction: "row", gap: "xs", align: "center", children: [
4845 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
4846 import_components13.Button,
4847 {
4848 onClick: () => onChangeView({
4849 ...view,
4850 page: currentPage - 1
4851 }),
4852 disabled: currentPage === 1,
4853 accessibleWhenDisabled: true,
4854 label: (0, import_i18n15.__)("Previous page"),
4855 icon: (0, import_i18n15.isRTL)() ? next_default : previous_default,
4856 showTooltip: true,
4857 size: "compact",
4858 tooltipPosition: "top"
4859 }
4860 ),
4861 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
4862 import_components13.Button,
4863 {
4864 onClick: () => onChangeView({ ...view, page: currentPage + 1 }),
4865 disabled: currentPage >= totalPages,
4866 accessibleWhenDisabled: true,
4867 label: (0, import_i18n15.__)("Next page"),
4868 icon: (0, import_i18n15.isRTL)() ? previous_default : next_default,
4869 showTooltip: true,
4870 size: "compact",
4871 tooltipPosition: "top"
4872 }
4873 )
4874 ] })
4875 ]
4876 }
4877 );
4878 }
4879 var dataviews_pagination_default = (0, import_element17.memo)(DataViewsPagination);
4880
4881 // packages/dataviews/build-module/components/dataviews-picker-footer/index.mjs
4882 var import_jsx_runtime40 = __toESM(require_jsx_runtime(), 1);
4883 function useIsMultiselectPicker(actions) {
4884 return (0, import_element18.useMemo)(() => {
4885 return actions?.every((action) => action.supportsBulk);
4886 }, [actions]);
4887 }
4888
4889 // packages/dataviews/build-module/components/dataviews-layouts/utils/grid-items.mjs
4890 var import_element19 = __toESM(require_element(), 1);
4891 var import_jsx_runtime41 = __toESM(require_jsx_runtime(), 1);
4892 var GridItems = (0, import_element19.forwardRef)(({ className, previewSize, ...props }, ref) => {
4893 return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
4894 "div",
4895 {
4896 ref,
4897 className: clsx_default("dataviews-view-grid-items", className),
4898 style: {
4899 gridTemplateColumns: previewSize && `repeat(auto-fill, minmax(${previewSize}px, 1fr))`
4900 },
4901 ...props
4902 }
4903 );
4904 });
4905
4906 // packages/dataviews/build-module/components/dataviews-layouts/picker-grid/index.mjs
4907 var import_jsx_runtime42 = __toESM(require_jsx_runtime(), 1);
4908 var { Badge: Badge2 } = unlock(import_components15.privateApis);
4909 function GridItem3({
4910 view,
4911 multiselect,
4912 selection,
4913 onChangeSelection,
4914 getItemId,
4915 item,
4916 mediaField,
4917 titleField,
4918 descriptionField,
4919 regularFields,
4920 badgeFields,
4921 config,
4922 posinset,
4923 setsize
4924 }) {
4925 const { showTitle = true, showMedia = true, showDescription = true } = view;
4926 const id = getItemId(item);
4927 const isSelected2 = selection.includes(id);
4928 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4929 mediaField.render,
4930 {
4931 item,
4932 field: mediaField,
4933 config
4934 }
4935 ) : null;
4936 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(titleField.render, { item, field: titleField }) : null;
4937 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
4938 import_components15.Composite.Item,
4939 {
4940 "aria-label": titleField ? titleField.getValue({ item }) || (0, import_i18n17.__)("(no title)") : void 0,
4941 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Stack, { direction: "column", children, ...props }),
4942 role: "option",
4943 "aria-posinset": posinset,
4944 "aria-setsize": setsize,
4945 className: clsx_default("dataviews-view-picker-grid__card", {
4946 "is-selected": isSelected2
4947 }),
4948 "aria-selected": isSelected2,
4949 onClick: () => {
4950 if (isSelected2) {
4951 onChangeSelection(
4952 selection.filter((itemId) => id !== itemId)
4953 );
4954 } else {
4955 const newSelection = multiselect ? [...selection, id] : [id];
4956 onChangeSelection(newSelection);
4957 }
4958 },
4959 children: [
4960 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-picker-grid__media", children: renderedMediaField }),
4961 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4962 DataViewsSelectionCheckbox,
4963 {
4964 item,
4965 selection,
4966 onChangeSelection,
4967 getItemId,
4968 titleField,
4969 disabled: false,
4970 "aria-hidden": true,
4971 tabIndex: -1
4972 }
4973 ),
4974 showTitle && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4975 Stack,
4976 {
4977 direction: "row",
4978 justify: "space-between",
4979 className: "dataviews-view-picker-grid__title-actions",
4980 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-picker-grid__title-field dataviews-title-field", children: renderedTitleField })
4981 }
4982 ),
4983 /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(Stack, { direction: "column", gap: "xs", children: [
4984 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4985 descriptionField.render,
4986 {
4987 item,
4988 field: descriptionField
4989 }
4990 ),
4991 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4992 Stack,
4993 {
4994 direction: "row",
4995 className: "dataviews-view-picker-grid__badge-fields",
4996 gap: "sm",
4997 wrap: "wrap",
4998 align: "top",
4999 justify: "flex-start",
5000 children: badgeFields.map((field) => {
5001 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5002 Badge2,
5003 {
5004 className: "dataviews-view-picker-grid__field-value",
5005 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5006 field.render,
5007 {
5008 item,
5009 field
5010 }
5011 )
5012 },
5013 field.id
5014 );
5015 })
5016 }
5017 ),
5018 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5019 Stack,
5020 {
5021 direction: "column",
5022 className: "dataviews-view-picker-grid__fields",
5023 gap: "xs",
5024 children: regularFields.map((field) => {
5025 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5026 import_components15.Flex,
5027 {
5028 className: "dataviews-view-picker-grid__field",
5029 gap: 1,
5030 justify: "flex-start",
5031 expanded: true,
5032 style: { height: "auto" },
5033 direction: "row",
5034 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
5035 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components15.FlexItem, { className: "dataviews-view-picker-grid__field-name", children: field.header }),
5036 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5037 import_components15.FlexItem,
5038 {
5039 className: "dataviews-view-picker-grid__field-value",
5040 style: { maxHeight: "none" },
5041 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5042 field.render,
5043 {
5044 item,
5045 field
5046 }
5047 )
5048 }
5049 )
5050 ] })
5051 },
5052 field.id
5053 );
5054 })
5055 }
5056 )
5057 ] })
5058 ]
5059 },
5060 id
5061 );
5062 }
5063 function GridGroup({
5064 groupName,
5065 groupField,
5066 showLabel = true,
5067 children
5068 }) {
5069 const headerId = (0, import_compose7.useInstanceId)(
5070 GridGroup,
5071 "dataviews-view-picker-grid-group__header"
5072 );
5073 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
5074 Stack,
5075 {
5076 direction: "column",
5077 gap: "sm",
5078 role: "group",
5079 "aria-labelledby": headerId,
5080 children: [
5081 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5082 "h3",
5083 {
5084 className: "dataviews-view-picker-grid-group__header",
5085 id: headerId,
5086 children: showLabel ? (0, import_i18n17.sprintf)(
5087 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
5088 (0, import_i18n17.__)("%1$s: %2$s"),
5089 groupField.label,
5090 groupName
5091 ) : groupName
5092 }
5093 ),
5094 children
5095 ]
5096 },
5097 groupName
5098 );
5099 }
5100 function ViewPickerGrid({
5101 actions,
5102 data,
5103 fields,
5104 getItemId,
5105 isLoading,
5106 onChangeSelection,
5107 selection,
5108 view,
5109 className,
5110 empty
5111 }) {
5112 const { resizeObserverRef, paginationInfo, itemListLabel } = (0, import_element20.useContext)(dataviews_context_default);
5113 const titleField = fields.find(
5114 (field) => field.id === view?.titleField
5115 );
5116 const mediaField = fields.find(
5117 (field) => field.id === view?.mediaField
5118 );
5119 const descriptionField = fields.find(
5120 (field) => field.id === view?.descriptionField
5121 );
5122 const otherFields = view.fields ?? [];
5123 const { regularFields, badgeFields } = otherFields.reduce(
5124 (accumulator, fieldId) => {
5125 const field = fields.find((f2) => f2.id === fieldId);
5126 if (!field) {
5127 return accumulator;
5128 }
5129 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields";
5130 accumulator[key].push(field);
5131 return accumulator;
5132 },
5133 { regularFields: [], badgeFields: [] }
5134 );
5135 const hasData = !!data?.length;
5136 const usedPreviewSize = view.layout?.previewSize;
5137 const isMultiselect = useIsMultiselectPicker(actions);
5138 const size = "900px";
5139 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
5140 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
5141 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
5142 const currentPage = view?.page ?? 1;
5143 const perPage = view?.perPage ?? 0;
5144 const setSize = isInfiniteScroll ? paginationInfo?.totalItems : void 0;
5145 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, {
5146 // Render multiple groups.
5147 children: [
5148 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5149 import_components15.Composite,
5150 {
5151 virtualFocus: true,
5152 orientation: "horizontal",
5153 role: "listbox",
5154 "aria-multiselectable": isMultiselect,
5155 className: clsx_default(
5156 "dataviews-view-picker-grid",
5157 className
5158 ),
5159 "aria-label": itemListLabel,
5160 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5161 Stack,
5162 {
5163 direction: "column",
5164 gap: "lg",
5165 children,
5166 ...props
5167 }
5168 ),
5169 children: Array.from(dataByGroup.entries()).map(
5170 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5171 GridGroup,
5172 {
5173 groupName,
5174 groupField,
5175 showLabel: view.groupBy?.showLabel !== false,
5176 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5177 GridItems,
5178 {
5179 previewSize: usedPreviewSize,
5180 style: {
5181 gridTemplateColumns: usedPreviewSize && `repeat(auto-fill, minmax(${usedPreviewSize}px, 1fr))`
5182 },
5183 "aria-busy": isLoading,
5184 ref: resizeObserverRef,
5185 children: groupItems.map((item) => {
5186 const posInSet = (currentPage - 1) * perPage + data.indexOf(item) + 1;
5187 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5188 GridItem3,
5189 {
5190 view,
5191 multiselect: isMultiselect,
5192 selection,
5193 onChangeSelection,
5194 getItemId,
5195 item,
5196 mediaField,
5197 titleField,
5198 descriptionField,
5199 regularFields,
5200 badgeFields,
5201 config: {
5202 sizes: size
5203 },
5204 posinset: posInSet,
5205 setsize: setSize
5206 },
5207 getItemId(item)
5208 );
5209 })
5210 }
5211 )
5212 },
5213 groupName
5214 )
5215 )
5216 }
5217 ),
5218 // Render a single grid with all data.
5219 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5220 import_components15.Composite,
5221 {
5222 render: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5223 GridItems,
5224 {
5225 className: clsx_default(
5226 "dataviews-view-picker-grid",
5227 className
5228 ),
5229 previewSize: usedPreviewSize,
5230 "aria-busy": isLoading,
5231 ref: resizeObserverRef
5232 }
5233 ),
5234 virtualFocus: true,
5235 orientation: "horizontal",
5236 role: "listbox",
5237 "aria-multiselectable": isMultiselect,
5238 "aria-label": itemListLabel,
5239 children: data.map((item, index) => {
5240 let posinset = isInfiniteScroll ? index + 1 : void 0;
5241 if (!isInfiniteScroll) {
5242 posinset = (currentPage - 1) * perPage + index + 1;
5243 }
5244 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5245 GridItem3,
5246 {
5247 view,
5248 multiselect: isMultiselect,
5249 selection,
5250 onChangeSelection,
5251 getItemId,
5252 item,
5253 mediaField,
5254 titleField,
5255 descriptionField,
5256 regularFields,
5257 badgeFields,
5258 config: {
5259 sizes: size
5260 },
5261 posinset,
5262 setsize: setSize
5263 },
5264 getItemId(item)
5265 );
5266 })
5267 }
5268 ),
5269 // Render empty state.
5270 !hasData && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
5271 "div",
5272 {
5273 className: clsx_default({
5274 "dataviews-loading": isLoading,
5275 "dataviews-no-results": !isLoading
5276 }),
5277 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components15.Spinner, {}) }) : empty
5278 }
5279 ),
5280 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components15.Spinner, {}) })
5281 ]
5282 });
5283 }
5284 var picker_grid_default = ViewPickerGrid;
5285
5286 // packages/dataviews/build-module/components/dataviews-layouts/picker-table/index.mjs
5287 var import_i18n18 = __toESM(require_i18n(), 1);
5288 var import_components16 = __toESM(require_components(), 1);
5289 var import_element21 = __toESM(require_element(), 1);
5290 var import_jsx_runtime43 = __toESM(require_jsx_runtime(), 1);
5291 function TableColumnField2({
5292 item,
5293 fields,
5294 column,
5295 align
5296 }) {
5297 const field = fields.find((f2) => f2.id === column);
5298 if (!field) {
5299 return null;
5300 }
5301 const className = clsx_default("dataviews-view-table__cell-content-wrapper", {
5302 "dataviews-view-table__cell-align-end": align === "end",
5303 "dataviews-view-table__cell-align-center": align === "center"
5304 });
5305 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(field.render, { item, field }) });
5306 }
5307 function TableRow2({
5308 item,
5309 fields,
5310 id,
5311 view,
5312 titleField,
5313 mediaField,
5314 descriptionField,
5315 selection,
5316 getItemId,
5317 onChangeSelection,
5318 multiselect,
5319 posinset
5320 }) {
5321 const { paginationInfo } = (0, import_element21.useContext)(dataviews_context_default);
5322 const isSelected2 = selection.includes(id);
5323 const [isHovered, setIsHovered] = (0, import_element21.useState)(false);
5324 const {
5325 showTitle = true,
5326 showMedia = true,
5327 showDescription = true,
5328 infiniteScrollEnabled
5329 } = view;
5330 const handleMouseEnter = () => {
5331 setIsHovered(true);
5332 };
5333 const handleMouseLeave = () => {
5334 setIsHovered(false);
5335 };
5336 const columns = view.fields ?? [];
5337 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
5338 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5339 import_components16.Composite.Item,
5340 {
5341 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5342 "tr",
5343 {
5344 className: clsx_default("dataviews-view-table__row", {
5345 "is-selected": isSelected2,
5346 "is-hovered": isHovered
5347 }),
5348 onMouseEnter: handleMouseEnter,
5349 onMouseLeave: handleMouseLeave,
5350 children,
5351 ...props
5352 }
5353 ),
5354 "aria-selected": isSelected2,
5355 "aria-setsize": paginationInfo.totalItems || void 0,
5356 "aria-posinset": posinset,
5357 role: infiniteScrollEnabled ? "article" : "option",
5358 onClick: () => {
5359 if (isSelected2) {
5360 onChangeSelection(
5361 selection.filter((itemId) => id !== itemId)
5362 );
5363 } else {
5364 const newSelection = multiselect ? [...selection, id] : [id];
5365 onChangeSelection(newSelection);
5366 }
5367 },
5368 children: [
5369 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5370 "td",
5371 {
5372 className: "dataviews-view-table__checkbox-column",
5373 role: "presentation",
5374 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5375 DataViewsSelectionCheckbox,
5376 {
5377 item,
5378 selection,
5379 onChangeSelection,
5380 getItemId,
5381 titleField,
5382 disabled: false,
5383 "aria-hidden": true,
5384 tabIndex: -1
5385 }
5386 ) })
5387 }
5388 ),
5389 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("td", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5390 column_primary_default,
5391 {
5392 item,
5393 titleField: showTitle ? titleField : void 0,
5394 mediaField: showMedia ? mediaField : void 0,
5395 descriptionField: showDescription ? descriptionField : void 0,
5396 isItemClickable: () => false
5397 }
5398 ) }),
5399 columns.map((column) => {
5400 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
5401 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5402 "td",
5403 {
5404 style: {
5405 width,
5406 maxWidth,
5407 minWidth
5408 },
5409 role: "presentation",
5410 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5411 TableColumnField2,
5412 {
5413 fields,
5414 item,
5415 column,
5416 align
5417 }
5418 )
5419 },
5420 column
5421 );
5422 })
5423 ]
5424 },
5425 id
5426 );
5427 }
5428 function ViewPickerTable({
5429 actions,
5430 data,
5431 fields,
5432 getItemId,
5433 isLoading = false,
5434 onChangeView,
5435 onChangeSelection,
5436 selection,
5437 setOpenedFilter,
5438 view,
5439 className,
5440 empty
5441 }) {
5442 const headerMenuRefs = (0, import_element21.useRef)(/* @__PURE__ */ new Map());
5443 const headerMenuToFocusRef = (0, import_element21.useRef)(void 0);
5444 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element21.useState)();
5445 const isMultiselect = useIsMultiselectPicker(actions) ?? false;
5446 (0, import_element21.useEffect)(() => {
5447 if (headerMenuToFocusRef.current) {
5448 headerMenuToFocusRef.current.focus();
5449 headerMenuToFocusRef.current = void 0;
5450 }
5451 });
5452 const tableNoticeId = (0, import_element21.useId)();
5453 if (nextHeaderMenuToFocus) {
5454 headerMenuToFocusRef.current = nextHeaderMenuToFocus;
5455 setNextHeaderMenuToFocus(void 0);
5456 return;
5457 }
5458 const onHide = (field) => {
5459 const hidden = headerMenuRefs.current.get(field.id);
5460 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0;
5461 setNextHeaderMenuToFocus(fallback?.node);
5462 };
5463 const hasData = !!data?.length;
5464 const titleField = fields.find((field) => field.id === view.titleField);
5465 const mediaField = fields.find((field) => field.id === view.mediaField);
5466 const descriptionField = fields.find(
5467 (field) => field.id === view.descriptionField
5468 );
5469 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null;
5470 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null;
5471 const { showTitle = true, showMedia = true, showDescription = true } = view;
5472 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription;
5473 const columns = view.fields ?? [];
5474 const headerMenuRef = (column, index) => (node) => {
5475 if (node) {
5476 headerMenuRefs.current.set(column, {
5477 node,
5478 fallback: columns[index > 0 ? index - 1 : 1]
5479 });
5480 } else {
5481 headerMenuRefs.current.delete(column);
5482 }
5483 };
5484 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup;
5485 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_jsx_runtime43.Fragment, { children: [
5486 /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5487 "table",
5488 {
5489 className: clsx_default(
5490 "dataviews-view-table",
5491 "dataviews-view-picker-table",
5492 className,
5493 {
5494 [`has-${view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes(
5495 view.layout.density
5496 )
5497 }
5498 ),
5499 "aria-busy": isLoading,
5500 "aria-describedby": tableNoticeId,
5501 role: isInfiniteScroll ? "feed" : "listbox",
5502 children: [
5503 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("thead", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5504 "tr",
5505 {
5506 className: "dataviews-view-table__row",
5507 role: "presentation",
5508 children: [
5509 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("th", { className: "dataviews-view-table__checkbox-column", children: isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5510 BulkSelectionCheckbox,
5511 {
5512 selection,
5513 onChangeSelection,
5514 data,
5515 actions,
5516 getItemId
5517 }
5518 ) }),
5519 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("th", { children: titleField && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5520 column_header_menu_default,
5521 {
5522 ref: headerMenuRef(
5523 titleField.id,
5524 0
5525 ),
5526 fieldId: titleField.id,
5527 view,
5528 fields,
5529 onChangeView,
5530 onHide,
5531 setOpenedFilter,
5532 canMove: false
5533 }
5534 ) }),
5535 columns.map((column, index) => {
5536 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {};
5537 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5538 "th",
5539 {
5540 style: {
5541 width,
5542 maxWidth,
5543 minWidth,
5544 textAlign: align
5545 },
5546 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0,
5547 scope: "col",
5548 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5549 column_header_menu_default,
5550 {
5551 ref: headerMenuRef(column, index),
5552 fieldId: column,
5553 view,
5554 fields,
5555 onChangeView,
5556 onHide,
5557 setOpenedFilter,
5558 canMove: view.layout?.enableMoving ?? true
5559 }
5560 )
5561 },
5562 column
5563 );
5564 })
5565 ]
5566 }
5567 ) }),
5568 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map(
5569 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5570 import_components16.Composite,
5571 {
5572 virtualFocus: true,
5573 orientation: "vertical",
5574 render: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("tbody", { role: "group" }),
5575 children: [
5576 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5577 "tr",
5578 {
5579 className: "dataviews-view-table__group-header-row",
5580 role: "presentation",
5581 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5582 "td",
5583 {
5584 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + 1,
5585 className: "dataviews-view-table__group-header-cell",
5586 role: "presentation",
5587 children: view.groupBy?.showLabel === false ? groupName : (0, import_i18n18.sprintf)(
5588 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022".
5589 (0, import_i18n18.__)("%1$s: %2$s"),
5590 groupField.label,
5591 groupName
5592 )
5593 }
5594 )
5595 }
5596 ),
5597 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5598 TableRow2,
5599 {
5600 item,
5601 fields,
5602 id: getItemId(item) || index.toString(),
5603 view,
5604 titleField,
5605 mediaField,
5606 descriptionField,
5607 selection,
5608 getItemId,
5609 onChangeSelection,
5610 multiselect: isMultiselect
5611 },
5612 getItemId(item)
5613 ))
5614 ]
5615 },
5616 `group-${groupName}`
5617 )
5618 ) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5619 import_components16.Composite,
5620 {
5621 render: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("tbody", { role: "presentation" }),
5622 virtualFocus: true,
5623 orientation: "vertical",
5624 children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
5625 TableRow2,
5626 {
5627 item,
5628 fields,
5629 id: getItemId(item) || index.toString(),
5630 view,
5631 titleField,
5632 mediaField,
5633 descriptionField,
5634 selection,
5635 getItemId,
5636 onChangeSelection,
5637 multiselect: isMultiselect,
5638 posinset: index + 1
5639 },
5640 getItemId(item)
5641 ))
5642 }
5643 )
5644 ]
5645 }
5646 ),
5647 /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
5648 "div",
5649 {
5650 className: clsx_default({
5651 "dataviews-loading": isLoading,
5652 "dataviews-no-results": !hasData && !isLoading
5653 }),
5654 id: tableNoticeId,
5655 children: [
5656 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components16.Spinner, {}) }) : empty),
5657 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components16.Spinner, {}) })
5658 ]
5659 }
5660 )
5661 ] });
5662 }
5663 var picker_table_default = ViewPickerTable;
5664
5665 // packages/dataviews/build-module/components/dataviews-layouts/utils/preview-size-picker.mjs
5666 var import_components17 = __toESM(require_components(), 1);
5667 var import_i18n19 = __toESM(require_i18n(), 1);
5668 var import_element22 = __toESM(require_element(), 1);
5669 var import_jsx_runtime44 = __toESM(require_jsx_runtime(), 1);
5670 var imageSizes2 = [
5671 {
5672 value: 120,
5673 breakpoint: 1
5674 },
5675 {
5676 value: 170,
5677 breakpoint: 1
5678 },
5679 {
5680 value: 230,
5681 breakpoint: 1
5682 },
5683 {
5684 value: 290,
5685 breakpoint: 1112
5686 // at minimum image width, 4 images display at this container size
5687 },
5688 {
5689 value: 350,
5690 breakpoint: 1636
5691 // at minimum image width, 6 images display at this container size
5692 },
5693 {
5694 value: 430,
5695 breakpoint: 588
5696 // at minimum image width, 2 images display at this container size
5697 }
5698 ];
5699 function PreviewSizePicker() {
5700 const context = (0, import_element22.useContext)(dataviews_context_default);
5701 const view = context.view;
5702 const breakValues = imageSizes2.filter((size) => {
5703 return context.containerWidth >= size.breakpoint;
5704 });
5705 const layoutPreviewSize = view.layout?.previewSize ?? 230;
5706 const previewSizeToUse = breakValues.map((size, index) => ({ ...size, index })).filter((size) => size.value <= layoutPreviewSize).sort((a2, b2) => b2.value - a2.value)[0]?.index ?? 0;
5707 const marks = breakValues.map((size, index) => {
5708 return {
5709 value: index
5710 };
5711 });
5712 return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
5713 import_components17.RangeControl,
5714 {
5715 __next40pxDefaultSize: true,
5716 showTooltip: false,
5717 label: (0, import_i18n19.__)("Preview size"),
5718 value: previewSizeToUse,
5719 min: 0,
5720 max: breakValues.length - 1,
5721 withInputField: false,
5722 onChange: (value = 0) => {
5723 context.onChangeView({
5724 ...view,
5725 layout: {
5726 ...view.layout,
5727 previewSize: breakValues[value].value
5728 }
5729 });
5730 },
5731 step: 1,
5732 marks
5733 }
5734 );
5735 }
5736
5737 // packages/dataviews/build-module/components/dataviews-layouts/utils/density-picker.mjs
5738 var import_components18 = __toESM(require_components(), 1);
5739 var import_i18n20 = __toESM(require_i18n(), 1);
5740 var import_element23 = __toESM(require_element(), 1);
5741 var import_jsx_runtime45 = __toESM(require_jsx_runtime(), 1);
5742 function DensityPicker() {
5743 const context = (0, import_element23.useContext)(dataviews_context_default);
5744 const view = context.view;
5745 return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
5746 import_components18.__experimentalToggleGroupControl,
5747 {
5748 size: "__unstable-large",
5749 label: (0, import_i18n20.__)("Density"),
5750 value: view.layout?.density || "balanced",
5751 onChange: (value) => {
5752 context.onChangeView({
5753 ...view,
5754 layout: {
5755 ...view.layout,
5756 density: value
5757 }
5758 });
5759 },
5760 isBlock: true,
5761 children: [
5762 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
5763 import_components18.__experimentalToggleGroupControlOption,
5764 {
5765 value: "comfortable",
5766 label: (0, import_i18n20._x)(
5767 "Comfortable",
5768 "Density option for DataView layout"
5769 )
5770 },
5771 "comfortable"
5772 ),
5773 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
5774 import_components18.__experimentalToggleGroupControlOption,
5775 {
5776 value: "balanced",
5777 label: (0, import_i18n20._x)("Balanced", "Density option for DataView layout")
5778 },
5779 "balanced"
5780 ),
5781 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
5782 import_components18.__experimentalToggleGroupControlOption,
5783 {
5784 value: "compact",
5785 label: (0, import_i18n20._x)("Compact", "Density option for DataView layout")
5786 },
5787 "compact"
5788 )
5789 ]
5790 }
5791 );
5792 }
5793
5794 // packages/dataviews/build-module/components/dataviews-layouts/index.mjs
5795 var VIEW_LAYOUTS = [
5796 {
5797 type: LAYOUT_TABLE,
5798 label: (0, import_i18n21.__)("Table"),
5799 component: table_default,
5800 icon: block_table_default,
5801 viewConfigOptions: DensityPicker
5802 },
5803 {
5804 type: LAYOUT_GRID,
5805 label: (0, import_i18n21.__)("Grid"),
5806 component: grid_default,
5807 icon: category_default,
5808 viewConfigOptions: PreviewSizePicker
5809 },
5810 {
5811 type: LAYOUT_LIST,
5812 label: (0, import_i18n21.__)("List"),
5813 component: ViewList,
5814 icon: (0, import_i18n21.isRTL)() ? format_list_bullets_rtl_default : format_list_bullets_default,
5815 viewConfigOptions: DensityPicker
5816 },
5817 {
5818 type: LAYOUT_ACTIVITY,
5819 label: (0, import_i18n21.__)("Activity"),
5820 component: ViewActivity,
5821 icon: scheduled_default,
5822 viewConfigOptions: DensityPicker
5823 },
5824 {
5825 type: LAYOUT_PICKER_GRID,
5826 label: (0, import_i18n21.__)("Grid"),
5827 component: picker_grid_default,
5828 icon: category_default,
5829 viewConfigOptions: PreviewSizePicker,
5830 isPicker: true
5831 },
5832 {
5833 type: LAYOUT_PICKER_TABLE,
5834 label: (0, import_i18n21.__)("Table"),
5835 component: picker_table_default,
5836 icon: block_table_default,
5837 viewConfigOptions: DensityPicker,
5838 isPicker: true
5839 }
5840 ];
5841
5842 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
5843 var import_element31 = __toESM(require_element(), 1);
5844
5845 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
5846 var import_components21 = __toESM(require_components(), 1);
5847 var import_i18n24 = __toESM(require_i18n(), 1);
5848 var import_element28 = __toESM(require_element(), 1);
5849
5850 // node_modules/@ariakit/core/esm/__chunks/XMCVU3LR.js
5851 function noop(..._) {
5852 }
5853 function applyState(argument, currentValue) {
5854 if (isUpdater(argument)) {
5855 const value = isLazyValue(currentValue) ? currentValue() : currentValue;
5856 return argument(value);
5857 }
5858 return argument;
5859 }
5860 function isUpdater(argument) {
5861 return typeof argument === "function";
5862 }
5863 function isLazyValue(value) {
5864 return typeof value === "function";
5865 }
5866 function hasOwnProperty(object, prop) {
5867 if (typeof Object.hasOwn === "function") {
5868 return Object.hasOwn(object, prop);
5869 }
5870 return Object.prototype.hasOwnProperty.call(object, prop);
5871 }
5872 function chain(...fns) {
5873 return (...args) => {
5874 for (const fn of fns) {
5875 if (typeof fn === "function") {
5876 fn(...args);
5877 }
5878 }
5879 };
5880 }
5881 function normalizeString(str) {
5882 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
5883 }
5884 function omit2(object, keys) {
5885 const result = { ...object };
5886 for (const key of keys) {
5887 if (hasOwnProperty(result, key)) {
5888 delete result[key];
5889 }
5890 }
5891 return result;
5892 }
5893 function pick(object, paths) {
5894 const result = {};
5895 for (const key of paths) {
5896 if (hasOwnProperty(object, key)) {
5897 result[key] = object[key];
5898 }
5899 }
5900 return result;
5901 }
5902 function identity(value) {
5903 return value;
5904 }
5905 function invariant(condition, message2) {
5906 if (condition) return;
5907 if (typeof message2 !== "string") throw new Error("Invariant failed");
5908 throw new Error(message2);
5909 }
5910 function getKeys(obj) {
5911 return Object.keys(obj);
5912 }
5913 function isFalsyBooleanCallback(booleanOrCallback, ...args) {
5914 const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback;
5915 if (result == null) return false;
5916 return !result;
5917 }
5918 function disabledFromProps(props) {
5919 return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true";
5920 }
5921 function removeUndefinedValues(obj) {
5922 const result = {};
5923 for (const key in obj) {
5924 if (obj[key] !== void 0) {
5925 result[key] = obj[key];
5926 }
5927 }
5928 return result;
5929 }
5930 function defaultValue(...values) {
5931 for (const value of values) {
5932 if (value !== void 0) return value;
5933 }
5934 return void 0;
5935 }
5936
5937 // node_modules/@ariakit/react-core/esm/__chunks/YXGXYGQX.js
5938 var import_react4 = __toESM(require_react(), 1);
5939 function setRef(ref, value) {
5940 if (typeof ref === "function") {
5941 ref(value);
5942 } else if (ref) {
5943 ref.current = value;
5944 }
5945 }
5946 function isValidElementWithRef(element) {
5947 if (!element) return false;
5948 if (!(0, import_react4.isValidElement)(element)) return false;
5949 if ("ref" in element.props) return true;
5950 if ("ref" in element) return true;
5951 return false;
5952 }
5953 function getRefProperty(element) {
5954 if (!isValidElementWithRef(element)) return null;
5955 const props = { ...element.props };
5956 return props.ref || element.ref;
5957 }
5958 function mergeProps2(base, overrides) {
5959 const props = { ...base };
5960 for (const key in overrides) {
5961 if (!hasOwnProperty(overrides, key)) continue;
5962 if (key === "className") {
5963 const prop = "className";
5964 props[prop] = base[prop] ? `${base[prop]} ${overrides[prop]}` : overrides[prop];
5965 continue;
5966 }
5967 if (key === "style") {
5968 const prop = "style";
5969 props[prop] = base[prop] ? { ...base[prop], ...overrides[prop] } : overrides[prop];
5970 continue;
5971 }
5972 const overrideValue = overrides[key];
5973 if (typeof overrideValue === "function" && key.startsWith("on")) {
5974 const baseValue = base[key];
5975 if (typeof baseValue === "function") {
5976 props[key] = (...args) => {
5977 overrideValue(...args);
5978 baseValue(...args);
5979 };
5980 continue;
5981 }
5982 }
5983 props[key] = overrideValue;
5984 }
5985 return props;
5986 }
5987
5988 // node_modules/@ariakit/core/esm/__chunks/3DNM6L6E.js
5989 var canUseDOM = checkIsBrowser();
5990 function checkIsBrowser() {
5991 var _a;
5992 return typeof window !== "undefined" && !!((_a = window.document) == null ? void 0 : _a.createElement);
5993 }
5994 function getDocument(node) {
5995 if (!node) return document;
5996 if ("self" in node) return node.document;
5997 return node.ownerDocument || document;
5998 }
5999 function getActiveElement(node, activeDescendant = false) {
6000 var _a;
6001 const { activeElement } = getDocument(node);
6002 if (!(activeElement == null ? void 0 : activeElement.nodeName)) {
6003 return null;
6004 }
6005 if (isFrame(activeElement) && ((_a = activeElement.contentDocument) == null ? void 0 : _a.body)) {
6006 return getActiveElement(
6007 activeElement.contentDocument.body,
6008 activeDescendant
6009 );
6010 }
6011 if (activeDescendant) {
6012 const id = activeElement.getAttribute("aria-activedescendant");
6013 if (id) {
6014 const element = getDocument(activeElement).getElementById(id);
6015 if (element) {
6016 return element;
6017 }
6018 }
6019 }
6020 return activeElement;
6021 }
6022 function contains(parent, child) {
6023 return parent === child || parent.contains(child);
6024 }
6025 function isFrame(element) {
6026 return element.tagName === "IFRAME";
6027 }
6028 function isButton(element) {
6029 const tagName = element.tagName.toLowerCase();
6030 if (tagName === "button") return true;
6031 if (tagName === "input" && element.type) {
6032 return buttonInputTypes.indexOf(element.type) !== -1;
6033 }
6034 return false;
6035 }
6036 var buttonInputTypes = [
6037 "button",
6038 "color",
6039 "file",
6040 "image",
6041 "reset",
6042 "submit"
6043 ];
6044 function isVisible(element) {
6045 if (typeof element.checkVisibility === "function") {
6046 return element.checkVisibility();
6047 }
6048 const htmlElement = element;
6049 return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0;
6050 }
6051 function isTextField(element) {
6052 try {
6053 const isTextInput = element instanceof HTMLInputElement && element.selectionStart !== null;
6054 const isTextArea = element.tagName === "TEXTAREA";
6055 return isTextInput || isTextArea || false;
6056 } catch (_error) {
6057 return false;
6058 }
6059 }
6060 function isTextbox(element) {
6061 return element.isContentEditable || isTextField(element);
6062 }
6063 function getTextboxValue(element) {
6064 if (isTextField(element)) {
6065 return element.value;
6066 }
6067 if (element.isContentEditable) {
6068 const range = getDocument(element).createRange();
6069 range.selectNodeContents(element);
6070 return range.toString();
6071 }
6072 return "";
6073 }
6074 function getTextboxSelection(element) {
6075 let start = 0;
6076 let end = 0;
6077 if (isTextField(element)) {
6078 start = element.selectionStart || 0;
6079 end = element.selectionEnd || 0;
6080 } else if (element.isContentEditable) {
6081 const selection = getDocument(element).getSelection();
6082 if ((selection == null ? void 0 : selection.rangeCount) && selection.anchorNode && contains(element, selection.anchorNode) && selection.focusNode && contains(element, selection.focusNode)) {
6083 const range = selection.getRangeAt(0);
6084 const nextRange = range.cloneRange();
6085 nextRange.selectNodeContents(element);
6086 nextRange.setEnd(range.startContainer, range.startOffset);
6087 start = nextRange.toString().length;
6088 nextRange.setEnd(range.endContainer, range.endOffset);
6089 end = nextRange.toString().length;
6090 }
6091 }
6092 return { start, end };
6093 }
6094 function getPopupRole(element, fallback) {
6095 const allowedPopupRoles = ["dialog", "menu", "listbox", "tree", "grid"];
6096 const role = element == null ? void 0 : element.getAttribute("role");
6097 if (role && allowedPopupRoles.indexOf(role) !== -1) {
6098 return role;
6099 }
6100 return fallback;
6101 }
6102 function getScrollingElement(element) {
6103 if (!element) return null;
6104 const isScrollableOverflow = (overflow) => {
6105 if (overflow === "auto") return true;
6106 if (overflow === "scroll") return true;
6107 return false;
6108 };
6109 if (element.clientHeight && element.scrollHeight > element.clientHeight) {
6110 const { overflowY } = getComputedStyle(element);
6111 if (isScrollableOverflow(overflowY)) return element;
6112 } else if (element.clientWidth && element.scrollWidth > element.clientWidth) {
6113 const { overflowX } = getComputedStyle(element);
6114 if (isScrollableOverflow(overflowX)) return element;
6115 }
6116 return getScrollingElement(element.parentElement) || document.scrollingElement || document.body;
6117 }
6118 function setSelectionRange(element, ...args) {
6119 if (/text|search|password|tel|url/i.test(element.type)) {
6120 element.setSelectionRange(...args);
6121 }
6122 }
6123 function sortBasedOnDOMPosition(items, getElement) {
6124 const pairs = items.map((item, index) => [index, item]);
6125 let isOrderDifferent = false;
6126 pairs.sort(([indexA, a2], [indexB, b2]) => {
6127 const elementA = getElement(a2);
6128 const elementB = getElement(b2);
6129 if (elementA === elementB) return 0;
6130 if (!elementA || !elementB) return 0;
6131 if (isElementPreceding(elementA, elementB)) {
6132 if (indexA > indexB) {
6133 isOrderDifferent = true;
6134 }
6135 return -1;
6136 }
6137 if (indexA < indexB) {
6138 isOrderDifferent = true;
6139 }
6140 return 1;
6141 });
6142 if (isOrderDifferent) {
6143 return pairs.map(([_, item]) => item);
6144 }
6145 return items;
6146 }
6147 function isElementPreceding(a2, b2) {
6148 return Boolean(
6149 b2.compareDocumentPosition(a2) & Node.DOCUMENT_POSITION_PRECEDING
6150 );
6151 }
6152
6153 // node_modules/@ariakit/core/esm/__chunks/SNHYQNEZ.js
6154 function isTouchDevice() {
6155 return canUseDOM && !!navigator.maxTouchPoints;
6156 }
6157 function isApple() {
6158 if (!canUseDOM) return false;
6159 return /mac|iphone|ipad|ipod/i.test(navigator.platform);
6160 }
6161 function isSafari() {
6162 return canUseDOM && isApple() && /apple/i.test(navigator.vendor);
6163 }
6164 function isFirefox() {
6165 return canUseDOM && /firefox\//i.test(navigator.userAgent);
6166 }
6167
6168 // node_modules/@ariakit/core/esm/utils/events.js
6169 function isPortalEvent(event) {
6170 return Boolean(
6171 event.currentTarget && !contains(event.currentTarget, event.target)
6172 );
6173 }
6174 function isSelfTarget(event) {
6175 return event.target === event.currentTarget;
6176 }
6177 function isOpeningInNewTab(event) {
6178 const element = event.currentTarget;
6179 if (!element) return false;
6180 const isAppleDevice = isApple();
6181 if (isAppleDevice && !event.metaKey) return false;
6182 if (!isAppleDevice && !event.ctrlKey) return false;
6183 const tagName = element.tagName.toLowerCase();
6184 if (tagName === "a") return true;
6185 if (tagName === "button" && element.type === "submit") return true;
6186 if (tagName === "input" && element.type === "submit") return true;
6187 return false;
6188 }
6189 function isDownloading(event) {
6190 const element = event.currentTarget;
6191 if (!element) return false;
6192 const tagName = element.tagName.toLowerCase();
6193 if (!event.altKey) return false;
6194 if (tagName === "a") return true;
6195 if (tagName === "button" && element.type === "submit") return true;
6196 if (tagName === "input" && element.type === "submit") return true;
6197 return false;
6198 }
6199 function fireBlurEvent(element, eventInit) {
6200 const event = new FocusEvent("blur", eventInit);
6201 const defaultAllowed = element.dispatchEvent(event);
6202 const bubbleInit = { ...eventInit, bubbles: true };
6203 element.dispatchEvent(new FocusEvent("focusout", bubbleInit));
6204 return defaultAllowed;
6205 }
6206 function fireKeyboardEvent(element, type, eventInit) {
6207 const event = new KeyboardEvent(type, eventInit);
6208 return element.dispatchEvent(event);
6209 }
6210 function fireClickEvent(element, eventInit) {
6211 const event = new MouseEvent("click", eventInit);
6212 return element.dispatchEvent(event);
6213 }
6214 function isFocusEventOutside(event, container) {
6215 const containerElement = container || event.currentTarget;
6216 const relatedTarget = event.relatedTarget;
6217 return !relatedTarget || !contains(containerElement, relatedTarget);
6218 }
6219 function queueBeforeEvent(element, type, callback, timeout) {
6220 const createTimer = (callback2) => {
6221 if (timeout) {
6222 const timerId2 = setTimeout(callback2, timeout);
6223 return () => clearTimeout(timerId2);
6224 }
6225 const timerId = requestAnimationFrame(callback2);
6226 return () => cancelAnimationFrame(timerId);
6227 };
6228 const cancelTimer = createTimer(() => {
6229 element.removeEventListener(type, callSync, true);
6230 callback();
6231 });
6232 const callSync = () => {
6233 cancelTimer();
6234 callback();
6235 };
6236 element.addEventListener(type, callSync, { once: true, capture: true });
6237 return cancelTimer;
6238 }
6239 function addGlobalEventListener(type, listener, options, scope = window) {
6240 const children = [];
6241 try {
6242 scope.document.addEventListener(type, listener, options);
6243 for (const frame of Array.from(scope.frames)) {
6244 children.push(addGlobalEventListener(type, listener, options, frame));
6245 }
6246 } catch (e2) {
6247 }
6248 const removeEventListener = () => {
6249 try {
6250 scope.document.removeEventListener(type, listener, options);
6251 } catch (e2) {
6252 }
6253 for (const remove of children) {
6254 remove();
6255 }
6256 };
6257 return removeEventListener;
6258 }
6259
6260 // node_modules/@ariakit/react-core/esm/__chunks/KPHZR4MB.js
6261 var React6 = __toESM(require_react(), 1);
6262 var import_react5 = __toESM(require_react(), 1);
6263 var _React = { ...React6 };
6264 var useReactId = _React.useId;
6265 var useReactDeferredValue = _React.useDeferredValue;
6266 var useReactInsertionEffect = _React.useInsertionEffect;
6267 var useSafeLayoutEffect = canUseDOM ? import_react5.useLayoutEffect : import_react5.useEffect;
6268 function useInitialValue(value) {
6269 const [initialValue] = (0, import_react5.useState)(value);
6270 return initialValue;
6271 }
6272 function useLiveRef(value) {
6273 const ref = (0, import_react5.useRef)(value);
6274 useSafeLayoutEffect(() => {
6275 ref.current = value;
6276 });
6277 return ref;
6278 }
6279 function useEvent(callback) {
6280 const ref = (0, import_react5.useRef)(() => {
6281 throw new Error("Cannot call an event handler while rendering.");
6282 });
6283 if (useReactInsertionEffect) {
6284 useReactInsertionEffect(() => {
6285 ref.current = callback;
6286 });
6287 } else {
6288 ref.current = callback;
6289 }
6290 return (0, import_react5.useCallback)((...args) => {
6291 var _a;
6292 return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args);
6293 }, []);
6294 }
6295 function useTransactionState(callback) {
6296 const [state, setState] = (0, import_react5.useState)(null);
6297 useSafeLayoutEffect(() => {
6298 if (state == null) return;
6299 if (!callback) return;
6300 let prevState = null;
6301 callback((prev) => {
6302 prevState = prev;
6303 return state;
6304 });
6305 return () => {
6306 callback(prevState);
6307 };
6308 }, [state, callback]);
6309 return [state, setState];
6310 }
6311 function useMergeRefs(...refs) {
6312 return (0, import_react5.useMemo)(() => {
6313 if (!refs.some(Boolean)) return;
6314 return (value) => {
6315 for (const ref of refs) {
6316 setRef(ref, value);
6317 }
6318 };
6319 }, refs);
6320 }
6321 function useId3(defaultId) {
6322 if (useReactId) {
6323 const reactId = useReactId();
6324 if (defaultId) return defaultId;
6325 return reactId;
6326 }
6327 const [id, setId] = (0, import_react5.useState)(defaultId);
6328 useSafeLayoutEffect(() => {
6329 if (defaultId || id) return;
6330 const random = Math.random().toString(36).slice(2, 8);
6331 setId(`id-${random}`);
6332 }, [defaultId, id]);
6333 return defaultId || id;
6334 }
6335 function useTagName(refOrElement, type) {
6336 const stringOrUndefined = (type2) => {
6337 if (typeof type2 !== "string") return;
6338 return type2;
6339 };
6340 const [tagName, setTagName] = (0, import_react5.useState)(() => stringOrUndefined(type));
6341 useSafeLayoutEffect(() => {
6342 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement;
6343 setTagName((element == null ? void 0 : element.tagName.toLowerCase()) || stringOrUndefined(type));
6344 }, [refOrElement, type]);
6345 return tagName;
6346 }
6347 function useAttribute(refOrElement, attributeName, defaultValue2) {
6348 const initialValue = useInitialValue(defaultValue2);
6349 const [attribute, setAttribute] = (0, import_react5.useState)(initialValue);
6350 (0, import_react5.useEffect)(() => {
6351 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement;
6352 if (!element) return;
6353 const callback = () => {
6354 const value = element.getAttribute(attributeName);
6355 setAttribute(value == null ? initialValue : value);
6356 };
6357 const observer = new MutationObserver(callback);
6358 observer.observe(element, { attributeFilter: [attributeName] });
6359 callback();
6360 return () => observer.disconnect();
6361 }, [refOrElement, attributeName, initialValue]);
6362 return attribute;
6363 }
6364 function useUpdateEffect(effect, deps) {
6365 const mounted = (0, import_react5.useRef)(false);
6366 (0, import_react5.useEffect)(() => {
6367 if (mounted.current) {
6368 return effect();
6369 }
6370 mounted.current = true;
6371 }, deps);
6372 (0, import_react5.useEffect)(
6373 () => () => {
6374 mounted.current = false;
6375 },
6376 []
6377 );
6378 }
6379 function useUpdateLayoutEffect(effect, deps) {
6380 const mounted = (0, import_react5.useRef)(false);
6381 useSafeLayoutEffect(() => {
6382 if (mounted.current) {
6383 return effect();
6384 }
6385 mounted.current = true;
6386 }, deps);
6387 useSafeLayoutEffect(
6388 () => () => {
6389 mounted.current = false;
6390 },
6391 []
6392 );
6393 }
6394 function useForceUpdate() {
6395 return (0, import_react5.useReducer)(() => [], []);
6396 }
6397 function useBooleanEvent(booleanOrCallback) {
6398 return useEvent(
6399 typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback
6400 );
6401 }
6402 function useWrapElement(props, callback, deps = []) {
6403 const wrapElement = (0, import_react5.useCallback)(
6404 (element) => {
6405 if (props.wrapElement) {
6406 element = props.wrapElement(element);
6407 }
6408 return callback(element);
6409 },
6410 [...deps, props.wrapElement]
6411 );
6412 return { ...props, wrapElement };
6413 }
6414 function useMetadataProps(props, key, value) {
6415 const parent = props.onLoadedMetadataCapture;
6416 const onLoadedMetadataCapture = (0, import_react5.useMemo)(() => {
6417 return Object.assign(() => {
6418 }, { ...parent, [key]: value });
6419 }, [parent, key, value]);
6420 return [parent == null ? void 0 : parent[key], { onLoadedMetadataCapture }];
6421 }
6422 var hasInstalledGlobalEventListeners = false;
6423 function useIsMouseMoving() {
6424 (0, import_react5.useEffect)(() => {
6425 if (hasInstalledGlobalEventListeners) return;
6426 addGlobalEventListener("mousemove", setMouseMoving, true);
6427 addGlobalEventListener("mousedown", resetMouseMoving, true);
6428 addGlobalEventListener("mouseup", resetMouseMoving, true);
6429 addGlobalEventListener("keydown", resetMouseMoving, true);
6430 addGlobalEventListener("scroll", resetMouseMoving, true);
6431 hasInstalledGlobalEventListeners = true;
6432 }, []);
6433 const isMouseMoving = useEvent(() => mouseMoving);
6434 return isMouseMoving;
6435 }
6436 var mouseMoving = false;
6437 var previousScreenX = 0;
6438 var previousScreenY = 0;
6439 function hasMouseMovement(event) {
6440 const movementX = event.movementX || event.screenX - previousScreenX;
6441 const movementY = event.movementY || event.screenY - previousScreenY;
6442 previousScreenX = event.screenX;
6443 previousScreenY = event.screenY;
6444 return movementX || movementY || false;
6445 }
6446 function setMouseMoving(event) {
6447 if (!hasMouseMovement(event)) return;
6448 mouseMoving = true;
6449 }
6450 function resetMouseMoving() {
6451 mouseMoving = false;
6452 }
6453
6454 // node_modules/@ariakit/react-core/esm/__chunks/GWSL6KNJ.js
6455 var React7 = __toESM(require_react(), 1);
6456 var import_jsx_runtime46 = __toESM(require_jsx_runtime(), 1);
6457 function forwardRef22(render4) {
6458 const Role = React7.forwardRef(
6459 // @ts-ignore Incompatible with React 19 types. Ignore for now.
6460 (props, ref) => render4({ ...props, ref })
6461 );
6462 Role.displayName = render4.displayName || render4.name;
6463 return Role;
6464 }
6465 function memo22(Component, propsAreEqual) {
6466 return React7.memo(Component, propsAreEqual);
6467 }
6468 function createElement3(Type, props) {
6469 const { wrapElement, render: render4, ...rest } = props;
6470 const mergedRef = useMergeRefs(props.ref, getRefProperty(render4));
6471 let element;
6472 if (React7.isValidElement(render4)) {
6473 const renderProps = {
6474 // @ts-ignore Incompatible with React 19 types. Ignore for now.
6475 ...render4.props,
6476 ref: mergedRef
6477 };
6478 element = React7.cloneElement(render4, mergeProps2(rest, renderProps));
6479 } else if (render4) {
6480 element = render4(rest);
6481 } else {
6482 element = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Type, { ...rest });
6483 }
6484 if (wrapElement) {
6485 return wrapElement(element);
6486 }
6487 return element;
6488 }
6489 function createHook(useProps) {
6490 const useRole = (props = {}) => {
6491 return useProps(props);
6492 };
6493 useRole.displayName = useProps.name;
6494 return useRole;
6495 }
6496 function createStoreContext(providers = [], scopedProviders = []) {
6497 const context = React7.createContext(void 0);
6498 const scopedContext = React7.createContext(void 0);
6499 const useContext28 = () => React7.useContext(context);
6500 const useScopedContext = (onlyScoped = false) => {
6501 const scoped = React7.useContext(scopedContext);
6502 const store = useContext28();
6503 if (onlyScoped) return scoped;
6504 return scoped || store;
6505 };
6506 const useProviderContext = () => {
6507 const scoped = React7.useContext(scopedContext);
6508 const store = useContext28();
6509 if (scoped && scoped === store) return;
6510 return store;
6511 };
6512 const ContextProvider = (props) => {
6513 return providers.reduceRight(
6514 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Provider, { ...props, children }),
6515 /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(context.Provider, { ...props })
6516 );
6517 };
6518 const ScopedContextProvider = (props) => {
6519 return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ContextProvider, { ...props, children: scopedProviders.reduceRight(
6520 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Provider, { ...props, children }),
6521 /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(scopedContext.Provider, { ...props })
6522 ) });
6523 };
6524 return {
6525 context,
6526 scopedContext,
6527 useContext: useContext28,
6528 useScopedContext,
6529 useProviderContext,
6530 ContextProvider,
6531 ScopedContextProvider
6532 };
6533 }
6534
6535 // node_modules/@ariakit/react-core/esm/__chunks/SMPCIMZM.js
6536 var ctx = createStoreContext();
6537 var useCollectionContext = ctx.useContext;
6538 var useCollectionScopedContext = ctx.useScopedContext;
6539 var useCollectionProviderContext = ctx.useProviderContext;
6540 var CollectionContextProvider = ctx.ContextProvider;
6541 var CollectionScopedContextProvider = ctx.ScopedContextProvider;
6542
6543 // node_modules/@ariakit/react-core/esm/__chunks/AVVXDJMZ.js
6544 var import_react6 = __toESM(require_react(), 1);
6545 var ctx2 = createStoreContext(
6546 [CollectionContextProvider],
6547 [CollectionScopedContextProvider]
6548 );
6549 var useCompositeContext = ctx2.useContext;
6550 var useCompositeScopedContext = ctx2.useScopedContext;
6551 var useCompositeProviderContext = ctx2.useProviderContext;
6552 var CompositeContextProvider = ctx2.ContextProvider;
6553 var CompositeScopedContextProvider = ctx2.ScopedContextProvider;
6554 var CompositeItemContext = (0, import_react6.createContext)(
6555 void 0
6556 );
6557 var CompositeRowContext = (0, import_react6.createContext)(
6558 void 0
6559 );
6560
6561 // node_modules/@ariakit/react-core/esm/__chunks/5VQZOHHZ.js
6562 function findFirstEnabledItem(items, excludeId) {
6563 return items.find((item) => {
6564 if (excludeId) {
6565 return !item.disabled && item.id !== excludeId;
6566 }
6567 return !item.disabled;
6568 });
6569 }
6570 function getEnabledItem(store, id) {
6571 if (!id) return null;
6572 return store.item(id) || null;
6573 }
6574 function groupItemsByRows(items) {
6575 const rows = [];
6576 for (const item of items) {
6577 const row = rows.find((currentRow) => {
6578 var _a;
6579 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId;
6580 });
6581 if (row) {
6582 row.push(item);
6583 } else {
6584 rows.push([item]);
6585 }
6586 }
6587 return rows;
6588 }
6589 function selectTextField(element, collapseToEnd = false) {
6590 if (isTextField(element)) {
6591 element.setSelectionRange(
6592 collapseToEnd ? element.value.length : 0,
6593 element.value.length
6594 );
6595 } else if (element.isContentEditable) {
6596 const selection = getDocument(element).getSelection();
6597 selection == null ? void 0 : selection.selectAllChildren(element);
6598 if (collapseToEnd) {
6599 selection == null ? void 0 : selection.collapseToEnd();
6600 }
6601 }
6602 }
6603 var FOCUS_SILENTLY = /* @__PURE__ */ Symbol("FOCUS_SILENTLY");
6604 function focusSilently(element) {
6605 element[FOCUS_SILENTLY] = true;
6606 element.focus({ preventScroll: true });
6607 }
6608 function silentlyFocused(element) {
6609 const isSilentlyFocused = element[FOCUS_SILENTLY];
6610 delete element[FOCUS_SILENTLY];
6611 return isSilentlyFocused;
6612 }
6613 function isItem(store, element, exclude) {
6614 if (!element) return false;
6615 if (element === exclude) return false;
6616 const item = store.item(element.id);
6617 if (!item) return false;
6618 if (exclude && item.element === exclude) return false;
6619 return true;
6620 }
6621
6622 // node_modules/@ariakit/react-core/esm/__chunks/Z2O3VLAQ.js
6623 var import_react7 = __toESM(require_react(), 1);
6624 var TagName = "div";
6625 var useCollectionItem = createHook(
6626 function useCollectionItem2({
6627 store,
6628 shouldRegisterItem = true,
6629 getItem = identity,
6630 // @ts-expect-error This prop may come from a collection renderer.
6631 element,
6632 ...props
6633 }) {
6634 const context = useCollectionContext();
6635 store = store || context;
6636 const id = useId3(props.id);
6637 const ref = (0, import_react7.useRef)(element);
6638 (0, import_react7.useEffect)(() => {
6639 const element2 = ref.current;
6640 if (!id) return;
6641 if (!element2) return;
6642 if (!shouldRegisterItem) return;
6643 const item = getItem({ id, element: element2 });
6644 return store == null ? void 0 : store.renderItem(item);
6645 }, [id, shouldRegisterItem, getItem, store]);
6646 props = {
6647 ...props,
6648 ref: useMergeRefs(ref, props.ref)
6649 };
6650 return removeUndefinedValues(props);
6651 }
6652 );
6653 var CollectionItem = forwardRef22(function CollectionItem2(props) {
6654 const htmlProps = useCollectionItem(props);
6655 return createElement3(TagName, htmlProps);
6656 });
6657
6658 // node_modules/@ariakit/react-core/esm/__chunks/SWN3JYXT.js
6659 var import_react8 = __toESM(require_react(), 1);
6660 var FocusableContext = (0, import_react8.createContext)(true);
6661
6662 // node_modules/@ariakit/core/esm/utils/focus.js
6663 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'])";
6664 function isFocusable(element) {
6665 if (!element.matches(selector)) return false;
6666 if (!isVisible(element)) return false;
6667 if (element.closest("[inert]")) return false;
6668 return true;
6669 }
6670 function getClosestFocusable(element) {
6671 while (element && !isFocusable(element)) {
6672 element = element.closest(selector);
6673 }
6674 return element || null;
6675 }
6676 function hasFocus(element) {
6677 const activeElement = getActiveElement(element);
6678 if (!activeElement) return false;
6679 if (activeElement === element) return true;
6680 const activeDescendant = activeElement.getAttribute("aria-activedescendant");
6681 if (!activeDescendant) return false;
6682 return activeDescendant === element.id;
6683 }
6684 function hasFocusWithin(element) {
6685 const activeElement = getActiveElement(element);
6686 if (!activeElement) return false;
6687 if (contains(element, activeElement)) return true;
6688 const activeDescendant = activeElement.getAttribute("aria-activedescendant");
6689 if (!activeDescendant) return false;
6690 if (!("id" in element)) return false;
6691 if (activeDescendant === element.id) return true;
6692 return !!element.querySelector(`#${CSS.escape(activeDescendant)}`);
6693 }
6694 function focusIfNeeded(element) {
6695 if (!hasFocusWithin(element) && isFocusable(element)) {
6696 element.focus();
6697 }
6698 }
6699 function focusIntoView(element, options) {
6700 if (!("scrollIntoView" in element)) {
6701 element.focus();
6702 } else {
6703 element.focus({ preventScroll: true });
6704 element.scrollIntoView({ block: "nearest", inline: "nearest", ...options });
6705 }
6706 }
6707
6708 // node_modules/@ariakit/react-core/esm/__chunks/U6HHPQDW.js
6709 var import_react9 = __toESM(require_react(), 1);
6710 var TagName2 = "div";
6711 var isSafariBrowser = isSafari();
6712 var alwaysFocusVisibleInputTypes = [
6713 "text",
6714 "search",
6715 "url",
6716 "tel",
6717 "email",
6718 "password",
6719 "number",
6720 "date",
6721 "month",
6722 "week",
6723 "time",
6724 "datetime",
6725 "datetime-local"
6726 ];
6727 var safariFocusAncestorSymbol = /* @__PURE__ */ Symbol("safariFocusAncestor");
6728 function markSafariFocusAncestor(element, value) {
6729 if (!element) return;
6730 element[safariFocusAncestorSymbol] = value;
6731 }
6732 function isAlwaysFocusVisible(element) {
6733 const { tagName, readOnly, type } = element;
6734 if (tagName === "TEXTAREA" && !readOnly) return true;
6735 if (tagName === "SELECT" && !readOnly) return true;
6736 if (tagName === "INPUT" && !readOnly) {
6737 return alwaysFocusVisibleInputTypes.includes(type);
6738 }
6739 if (element.isContentEditable) return true;
6740 const role = element.getAttribute("role");
6741 if (role === "combobox" && element.dataset.name) {
6742 return true;
6743 }
6744 return false;
6745 }
6746 function getLabels(element) {
6747 if ("labels" in element) {
6748 return element.labels;
6749 }
6750 return null;
6751 }
6752 function isNativeCheckboxOrRadio(element) {
6753 const tagName = element.tagName.toLowerCase();
6754 if (tagName === "input" && element.type) {
6755 return element.type === "radio" || element.type === "checkbox";
6756 }
6757 return false;
6758 }
6759 function isNativeTabbable(tagName) {
6760 if (!tagName) return true;
6761 return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a";
6762 }
6763 function supportsDisabledAttribute(tagName) {
6764 if (!tagName) return true;
6765 return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea";
6766 }
6767 function getTabIndex(focusable, trulyDisabled, nativeTabbable, supportsDisabled, tabIndexProp) {
6768 if (!focusable) {
6769 return tabIndexProp;
6770 }
6771 if (trulyDisabled) {
6772 if (nativeTabbable && !supportsDisabled) {
6773 return -1;
6774 }
6775 return;
6776 }
6777 if (nativeTabbable) {
6778 return tabIndexProp;
6779 }
6780 return tabIndexProp || 0;
6781 }
6782 function useDisableEvent(onEvent, disabled) {
6783 return useEvent((event) => {
6784 onEvent == null ? void 0 : onEvent(event);
6785 if (event.defaultPrevented) return;
6786 if (disabled) {
6787 event.stopPropagation();
6788 event.preventDefault();
6789 }
6790 });
6791 }
6792 var hasInstalledGlobalEventListeners2 = false;
6793 var isKeyboardModality = true;
6794 function onGlobalMouseDown(event) {
6795 const target = event.target;
6796 if (target && "hasAttribute" in target) {
6797 if (!target.hasAttribute("data-focus-visible")) {
6798 isKeyboardModality = false;
6799 }
6800 }
6801 }
6802 function onGlobalKeyDown(event) {
6803 if (event.metaKey) return;
6804 if (event.ctrlKey) return;
6805 if (event.altKey) return;
6806 isKeyboardModality = true;
6807 }
6808 var useFocusable = createHook(
6809 function useFocusable2({
6810 focusable = true,
6811 accessibleWhenDisabled,
6812 autoFocus,
6813 onFocusVisible,
6814 ...props
6815 }) {
6816 const ref = (0, import_react9.useRef)(null);
6817 (0, import_react9.useEffect)(() => {
6818 if (!focusable) return;
6819 if (hasInstalledGlobalEventListeners2) return;
6820 addGlobalEventListener("mousedown", onGlobalMouseDown, true);
6821 addGlobalEventListener("keydown", onGlobalKeyDown, true);
6822 hasInstalledGlobalEventListeners2 = true;
6823 }, [focusable]);
6824 if (isSafariBrowser) {
6825 (0, import_react9.useEffect)(() => {
6826 if (!focusable) return;
6827 const element = ref.current;
6828 if (!element) return;
6829 if (!isNativeCheckboxOrRadio(element)) return;
6830 const labels = getLabels(element);
6831 if (!labels) return;
6832 const onMouseUp = () => queueMicrotask(() => element.focus());
6833 for (const label of labels) {
6834 label.addEventListener("mouseup", onMouseUp);
6835 }
6836 return () => {
6837 for (const label of labels) {
6838 label.removeEventListener("mouseup", onMouseUp);
6839 }
6840 };
6841 }, [focusable]);
6842 }
6843 const disabled = focusable && disabledFromProps(props);
6844 const trulyDisabled = !!disabled && !accessibleWhenDisabled;
6845 const [focusVisible, setFocusVisible] = (0, import_react9.useState)(false);
6846 (0, import_react9.useEffect)(() => {
6847 if (!focusable) return;
6848 if (trulyDisabled && focusVisible) {
6849 setFocusVisible(false);
6850 }
6851 }, [focusable, trulyDisabled, focusVisible]);
6852 (0, import_react9.useEffect)(() => {
6853 if (!focusable) return;
6854 if (!focusVisible) return;
6855 const element = ref.current;
6856 if (!element) return;
6857 if (typeof IntersectionObserver === "undefined") return;
6858 const observer = new IntersectionObserver(() => {
6859 if (!isFocusable(element)) {
6860 setFocusVisible(false);
6861 }
6862 });
6863 observer.observe(element);
6864 return () => observer.disconnect();
6865 }, [focusable, focusVisible]);
6866 const onKeyPressCapture = useDisableEvent(
6867 props.onKeyPressCapture,
6868 disabled
6869 );
6870 const onMouseDownCapture = useDisableEvent(
6871 props.onMouseDownCapture,
6872 disabled
6873 );
6874 const onClickCapture = useDisableEvent(props.onClickCapture, disabled);
6875 const onMouseDownProp = props.onMouseDown;
6876 const onMouseDown = useEvent((event) => {
6877 onMouseDownProp == null ? void 0 : onMouseDownProp(event);
6878 if (event.defaultPrevented) return;
6879 if (!focusable) return;
6880 const element = event.currentTarget;
6881 if (!isSafariBrowser) return;
6882 if (isPortalEvent(event)) return;
6883 if (!isButton(element) && !isNativeCheckboxOrRadio(element)) return;
6884 let receivedFocus = false;
6885 const onFocus = () => {
6886 receivedFocus = true;
6887 };
6888 const options = { capture: true, once: true };
6889 element.addEventListener("focusin", onFocus, options);
6890 const focusableContainer = getClosestFocusable(element.parentElement);
6891 markSafariFocusAncestor(focusableContainer, true);
6892 queueBeforeEvent(element, "mouseup", () => {
6893 element.removeEventListener("focusin", onFocus, true);
6894 markSafariFocusAncestor(focusableContainer, false);
6895 if (receivedFocus) return;
6896 focusIfNeeded(element);
6897 });
6898 });
6899 const handleFocusVisible = (event, currentTarget) => {
6900 if (currentTarget) {
6901 event.currentTarget = currentTarget;
6902 }
6903 if (!focusable) return;
6904 const element = event.currentTarget;
6905 if (!element) return;
6906 if (!hasFocus(element)) return;
6907 onFocusVisible == null ? void 0 : onFocusVisible(event);
6908 if (event.defaultPrevented) return;
6909 element.dataset.focusVisible = "true";
6910 setFocusVisible(true);
6911 };
6912 const onKeyDownCaptureProp = props.onKeyDownCapture;
6913 const onKeyDownCapture = useEvent((event) => {
6914 onKeyDownCaptureProp == null ? void 0 : onKeyDownCaptureProp(event);
6915 if (event.defaultPrevented) return;
6916 if (!focusable) return;
6917 if (focusVisible) return;
6918 if (event.metaKey) return;
6919 if (event.altKey) return;
6920 if (event.ctrlKey) return;
6921 if (!isSelfTarget(event)) return;
6922 const element = event.currentTarget;
6923 const applyFocusVisible = () => handleFocusVisible(event, element);
6924 queueBeforeEvent(element, "focusout", applyFocusVisible);
6925 });
6926 const onFocusCaptureProp = props.onFocusCapture;
6927 const onFocusCapture = useEvent((event) => {
6928 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event);
6929 if (event.defaultPrevented) return;
6930 if (!focusable) return;
6931 if (!isSelfTarget(event)) {
6932 setFocusVisible(false);
6933 return;
6934 }
6935 const element = event.currentTarget;
6936 const applyFocusVisible = () => handleFocusVisible(event, element);
6937 if (isKeyboardModality || isAlwaysFocusVisible(event.target)) {
6938 queueBeforeEvent(event.target, "focusout", applyFocusVisible);
6939 } else {
6940 setFocusVisible(false);
6941 }
6942 });
6943 const onBlurProp = props.onBlur;
6944 const onBlur = useEvent((event) => {
6945 onBlurProp == null ? void 0 : onBlurProp(event);
6946 if (!focusable) return;
6947 if (!isFocusEventOutside(event)) return;
6948 event.currentTarget.removeAttribute("data-focus-visible");
6949 setFocusVisible(false);
6950 });
6951 const autoFocusOnShow = (0, import_react9.useContext)(FocusableContext);
6952 const autoFocusRef = useEvent((element) => {
6953 if (!focusable) return;
6954 if (!autoFocus) return;
6955 if (!element) return;
6956 if (!autoFocusOnShow) return;
6957 queueMicrotask(() => {
6958 if (hasFocus(element)) return;
6959 if (!isFocusable(element)) return;
6960 element.focus();
6961 });
6962 });
6963 const tagName = useTagName(ref);
6964 const nativeTabbable = focusable && isNativeTabbable(tagName);
6965 const supportsDisabled = focusable && supportsDisabledAttribute(tagName);
6966 const styleProp = props.style;
6967 const style = (0, import_react9.useMemo)(() => {
6968 if (trulyDisabled) {
6969 return { pointerEvents: "none", ...styleProp };
6970 }
6971 return styleProp;
6972 }, [trulyDisabled, styleProp]);
6973 props = {
6974 "data-focus-visible": focusable && focusVisible || void 0,
6975 "data-autofocus": autoFocus || void 0,
6976 "aria-disabled": disabled || void 0,
6977 ...props,
6978 ref: useMergeRefs(ref, autoFocusRef, props.ref),
6979 style,
6980 tabIndex: getTabIndex(
6981 focusable,
6982 trulyDisabled,
6983 nativeTabbable,
6984 supportsDisabled,
6985 props.tabIndex
6986 ),
6987 disabled: supportsDisabled && trulyDisabled ? true : void 0,
6988 // TODO: Test Focusable contentEditable.
6989 contentEditable: disabled ? void 0 : props.contentEditable,
6990 onKeyPressCapture,
6991 onClickCapture,
6992 onMouseDownCapture,
6993 onMouseDown,
6994 onKeyDownCapture,
6995 onFocusCapture,
6996 onBlur
6997 };
6998 return removeUndefinedValues(props);
6999 }
7000 );
7001 var Focusable = forwardRef22(function Focusable2(props) {
7002 const htmlProps = useFocusable(props);
7003 return createElement3(TagName2, htmlProps);
7004 });
7005
7006 // node_modules/@ariakit/react-core/esm/__chunks/PZ3OL7I2.js
7007 var import_react10 = __toESM(require_react(), 1);
7008 var TagName3 = "button";
7009 function isNativeClick(event) {
7010 if (!event.isTrusted) return false;
7011 const element = event.currentTarget;
7012 if (event.key === "Enter") {
7013 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A";
7014 }
7015 if (event.key === " ") {
7016 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT";
7017 }
7018 return false;
7019 }
7020 var symbol = /* @__PURE__ */ Symbol("command");
7021 var useCommand = createHook(
7022 function useCommand2({ clickOnEnter = true, clickOnSpace = true, ...props }) {
7023 const ref = (0, import_react10.useRef)(null);
7024 const [isNativeButton, setIsNativeButton] = (0, import_react10.useState)(false);
7025 (0, import_react10.useEffect)(() => {
7026 if (!ref.current) return;
7027 setIsNativeButton(isButton(ref.current));
7028 }, []);
7029 const [active, setActive] = (0, import_react10.useState)(false);
7030 const activeRef = (0, import_react10.useRef)(false);
7031 const disabled = disabledFromProps(props);
7032 const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true);
7033 const onKeyDownProp = props.onKeyDown;
7034 const onKeyDown = useEvent((event) => {
7035 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
7036 const element = event.currentTarget;
7037 if (event.defaultPrevented) return;
7038 if (isDuplicate) return;
7039 if (disabled) return;
7040 if (!isSelfTarget(event)) return;
7041 if (isTextField(element)) return;
7042 if (element.isContentEditable) return;
7043 const isEnter = clickOnEnter && event.key === "Enter";
7044 const isSpace = clickOnSpace && event.key === " ";
7045 const shouldPreventEnter = event.key === "Enter" && !clickOnEnter;
7046 const shouldPreventSpace = event.key === " " && !clickOnSpace;
7047 if (shouldPreventEnter || shouldPreventSpace) {
7048 event.preventDefault();
7049 return;
7050 }
7051 if (isEnter || isSpace) {
7052 const nativeClick = isNativeClick(event);
7053 if (isEnter) {
7054 if (!nativeClick) {
7055 event.preventDefault();
7056 const { view, ...eventInit } = event;
7057 const click = () => fireClickEvent(element, eventInit);
7058 if (isFirefox()) {
7059 queueBeforeEvent(element, "keyup", click);
7060 } else {
7061 queueMicrotask(click);
7062 }
7063 }
7064 } else if (isSpace) {
7065 activeRef.current = true;
7066 if (!nativeClick) {
7067 event.preventDefault();
7068 setActive(true);
7069 }
7070 }
7071 }
7072 });
7073 const onKeyUpProp = props.onKeyUp;
7074 const onKeyUp = useEvent((event) => {
7075 onKeyUpProp == null ? void 0 : onKeyUpProp(event);
7076 if (event.defaultPrevented) return;
7077 if (isDuplicate) return;
7078 if (disabled) return;
7079 if (event.metaKey) return;
7080 const isSpace = clickOnSpace && event.key === " ";
7081 if (activeRef.current && isSpace) {
7082 activeRef.current = false;
7083 if (!isNativeClick(event)) {
7084 event.preventDefault();
7085 setActive(false);
7086 const element = event.currentTarget;
7087 const { view, ...eventInit } = event;
7088 queueMicrotask(() => fireClickEvent(element, eventInit));
7089 }
7090 }
7091 });
7092 props = {
7093 "data-active": active || void 0,
7094 type: isNativeButton ? "button" : void 0,
7095 ...metadataProps,
7096 ...props,
7097 ref: useMergeRefs(ref, props.ref),
7098 onKeyDown,
7099 onKeyUp
7100 };
7101 props = useFocusable(props);
7102 return props;
7103 }
7104 );
7105 var Command = forwardRef22(function Command2(props) {
7106 const htmlProps = useCommand(props);
7107 return createElement3(TagName3, htmlProps);
7108 });
7109
7110 // node_modules/@ariakit/core/esm/__chunks/SXKM4CGU.js
7111 function getInternal(store, key) {
7112 const internals = store.__unstableInternals;
7113 invariant(internals, "Invalid store");
7114 return internals[key];
7115 }
7116 function createStore(initialState, ...stores) {
7117 let state = initialState;
7118 let prevStateBatch = state;
7119 let lastUpdate = /* @__PURE__ */ Symbol();
7120 let destroy = noop;
7121 const instances = /* @__PURE__ */ new Set();
7122 const updatedKeys = /* @__PURE__ */ new Set();
7123 const setups = /* @__PURE__ */ new Set();
7124 const listeners = /* @__PURE__ */ new Set();
7125 const batchListeners = /* @__PURE__ */ new Set();
7126 const disposables = /* @__PURE__ */ new WeakMap();
7127 const listenerKeys = /* @__PURE__ */ new WeakMap();
7128 const storeSetup = (callback) => {
7129 setups.add(callback);
7130 return () => setups.delete(callback);
7131 };
7132 const storeInit = () => {
7133 const initialized = instances.size;
7134 const instance = /* @__PURE__ */ Symbol();
7135 instances.add(instance);
7136 const maybeDestroy = () => {
7137 instances.delete(instance);
7138 if (instances.size) return;
7139 destroy();
7140 };
7141 if (initialized) return maybeDestroy;
7142 const desyncs = getKeys(state).map(
7143 (key) => chain(
7144 ...stores.map((store) => {
7145 var _a;
7146 const storeState = (_a = store == null ? void 0 : store.getState) == null ? void 0 : _a.call(store);
7147 if (!storeState) return;
7148 if (!hasOwnProperty(storeState, key)) return;
7149 return sync(store, [key], (state2) => {
7150 setState(
7151 key,
7152 state2[key],
7153 // @ts-expect-error - Not public API. This is just to prevent
7154 // infinite loops.
7155 true
7156 );
7157 });
7158 })
7159 )
7160 );
7161 const teardowns = [];
7162 for (const setup2 of setups) {
7163 teardowns.push(setup2());
7164 }
7165 const cleanups = stores.map(init);
7166 destroy = chain(...desyncs, ...teardowns, ...cleanups);
7167 return maybeDestroy;
7168 };
7169 const sub = (keys, listener, set = listeners) => {
7170 set.add(listener);
7171 listenerKeys.set(listener, keys);
7172 return () => {
7173 var _a;
7174 (_a = disposables.get(listener)) == null ? void 0 : _a();
7175 disposables.delete(listener);
7176 listenerKeys.delete(listener);
7177 set.delete(listener);
7178 };
7179 };
7180 const storeSubscribe = (keys, listener) => sub(keys, listener);
7181 const storeSync = (keys, listener) => {
7182 disposables.set(listener, listener(state, state));
7183 return sub(keys, listener);
7184 };
7185 const storeBatch = (keys, listener) => {
7186 disposables.set(listener, listener(state, prevStateBatch));
7187 return sub(keys, listener, batchListeners);
7188 };
7189 const storePick = (keys) => createStore(pick(state, keys), finalStore);
7190 const storeOmit = (keys) => createStore(omit2(state, keys), finalStore);
7191 const getState = () => state;
7192 const setState = (key, value, fromStores = false) => {
7193 var _a;
7194 if (!hasOwnProperty(state, key)) return;
7195 const nextValue = applyState(value, state[key]);
7196 if (nextValue === state[key]) return;
7197 if (!fromStores) {
7198 for (const store of stores) {
7199 (_a = store == null ? void 0 : store.setState) == null ? void 0 : _a.call(store, key, nextValue);
7200 }
7201 }
7202 const prevState = state;
7203 state = { ...state, [key]: nextValue };
7204 const thisUpdate = /* @__PURE__ */ Symbol();
7205 lastUpdate = thisUpdate;
7206 updatedKeys.add(key);
7207 const run = (listener, prev, uKeys) => {
7208 var _a2;
7209 const keys = listenerKeys.get(listener);
7210 const updated = (k) => uKeys ? uKeys.has(k) : k === key;
7211 if (!keys || keys.some(updated)) {
7212 (_a2 = disposables.get(listener)) == null ? void 0 : _a2();
7213 disposables.set(listener, listener(state, prev));
7214 }
7215 };
7216 for (const listener of listeners) {
7217 run(listener, prevState);
7218 }
7219 queueMicrotask(() => {
7220 if (lastUpdate !== thisUpdate) return;
7221 const snapshot = state;
7222 for (const listener of batchListeners) {
7223 run(listener, prevStateBatch, updatedKeys);
7224 }
7225 prevStateBatch = snapshot;
7226 updatedKeys.clear();
7227 });
7228 };
7229 const finalStore = {
7230 getState,
7231 setState,
7232 __unstableInternals: {
7233 setup: storeSetup,
7234 init: storeInit,
7235 subscribe: storeSubscribe,
7236 sync: storeSync,
7237 batch: storeBatch,
7238 pick: storePick,
7239 omit: storeOmit
7240 }
7241 };
7242 return finalStore;
7243 }
7244 function setup(store, ...args) {
7245 if (!store) return;
7246 return getInternal(store, "setup")(...args);
7247 }
7248 function init(store, ...args) {
7249 if (!store) return;
7250 return getInternal(store, "init")(...args);
7251 }
7252 function subscribe(store, ...args) {
7253 if (!store) return;
7254 return getInternal(store, "subscribe")(...args);
7255 }
7256 function sync(store, ...args) {
7257 if (!store) return;
7258 return getInternal(store, "sync")(...args);
7259 }
7260 function batch(store, ...args) {
7261 if (!store) return;
7262 return getInternal(store, "batch")(...args);
7263 }
7264 function omit22(store, ...args) {
7265 if (!store) return;
7266 return getInternal(store, "omit")(...args);
7267 }
7268 function pick2(store, ...args) {
7269 if (!store) return;
7270 return getInternal(store, "pick")(...args);
7271 }
7272 function mergeStore(...stores) {
7273 var _a;
7274 const initialState = {};
7275 for (const store2 of stores) {
7276 const nextState = (_a = store2 == null ? void 0 : store2.getState) == null ? void 0 : _a.call(store2);
7277 if (nextState) {
7278 Object.assign(initialState, nextState);
7279 }
7280 }
7281 const store = createStore(initialState, ...stores);
7282 return Object.assign({}, ...stores, store);
7283 }
7284 function throwOnConflictingProps(props, store) {
7285 if (false) return;
7286 if (!store) return;
7287 const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => {
7288 var _a;
7289 const stateKey = key.replace("default", "");
7290 return `${((_a = stateKey[0]) == null ? void 0 : _a.toLowerCase()) || ""}${stateKey.slice(1)}`;
7291 });
7292 if (!defaultKeys.length) return;
7293 const storeState = store.getState();
7294 const conflictingProps = defaultKeys.filter(
7295 (key) => hasOwnProperty(storeState, key)
7296 );
7297 if (!conflictingProps.length) return;
7298 throw new Error(
7299 `Passing a store prop in conjunction with a default state is not supported.
7300
7301 const store = useSelectStore();
7302 <SelectProvider store={store} defaultValue="Apple" />
7303 ^ ^
7304
7305 Instead, pass the default state to the topmost store:
7306
7307 const store = useSelectStore({ defaultValue: "Apple" });
7308 <SelectProvider store={store} />
7309
7310 See https://github.com/ariakit/ariakit/pull/2745 for more details.
7311
7312 If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit
7313 `
7314 );
7315 }
7316
7317 // node_modules/@ariakit/react-core/esm/__chunks/Q5W46E73.js
7318 var React8 = __toESM(require_react(), 1);
7319 var import_shim = __toESM(require_shim(), 1);
7320 var { useSyncExternalStore } = import_shim.default;
7321 var noopSubscribe = () => () => {
7322 };
7323 function useStoreState(store, keyOrSelector = identity) {
7324 const storeSubscribe = React8.useCallback(
7325 (callback) => {
7326 if (!store) return noopSubscribe();
7327 return subscribe(store, null, callback);
7328 },
7329 [store]
7330 );
7331 const getSnapshot = () => {
7332 const key = typeof keyOrSelector === "string" ? keyOrSelector : null;
7333 const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null;
7334 const state = store == null ? void 0 : store.getState();
7335 if (selector2) return selector2(state);
7336 if (!state) return;
7337 if (!key) return;
7338 if (!hasOwnProperty(state, key)) return;
7339 return state[key];
7340 };
7341 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot);
7342 }
7343 function useStoreStateObject(store, object) {
7344 const objRef = React8.useRef(
7345 {}
7346 );
7347 const storeSubscribe = React8.useCallback(
7348 (callback) => {
7349 if (!store) return noopSubscribe();
7350 return subscribe(store, null, callback);
7351 },
7352 [store]
7353 );
7354 const getSnapshot = () => {
7355 const state = store == null ? void 0 : store.getState();
7356 let updated = false;
7357 const obj = objRef.current;
7358 for (const prop in object) {
7359 const keyOrSelector = object[prop];
7360 if (typeof keyOrSelector === "function") {
7361 const value = keyOrSelector(state);
7362 if (value !== obj[prop]) {
7363 obj[prop] = value;
7364 updated = true;
7365 }
7366 }
7367 if (typeof keyOrSelector === "string") {
7368 if (!state) continue;
7369 if (!hasOwnProperty(state, keyOrSelector)) continue;
7370 const value = state[keyOrSelector];
7371 if (value !== obj[prop]) {
7372 obj[prop] = value;
7373 updated = true;
7374 }
7375 }
7376 }
7377 if (updated) {
7378 objRef.current = { ...obj };
7379 }
7380 return objRef.current;
7381 };
7382 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot);
7383 }
7384 function useStoreProps(store, props, key, setKey) {
7385 const value = hasOwnProperty(props, key) ? props[key] : void 0;
7386 const setValue = setKey ? props[setKey] : void 0;
7387 const propsRef = useLiveRef({ value, setValue });
7388 useSafeLayoutEffect(() => {
7389 return sync(store, [key], (state, prev) => {
7390 const { value: value2, setValue: setValue2 } = propsRef.current;
7391 if (!setValue2) return;
7392 if (state[key] === prev[key]) return;
7393 if (state[key] === value2) return;
7394 setValue2(state[key]);
7395 });
7396 }, [store, key]);
7397 useSafeLayoutEffect(() => {
7398 if (value === void 0) return;
7399 store.setState(key, value);
7400 return batch(store, [key], () => {
7401 if (value === void 0) return;
7402 store.setState(key, value);
7403 });
7404 });
7405 }
7406 function useStore(createStore2, props) {
7407 const [store, setStore] = React8.useState(() => createStore2(props));
7408 useSafeLayoutEffect(() => init(store), [store]);
7409 const useState25 = React8.useCallback(
7410 (keyOrSelector) => useStoreState(store, keyOrSelector),
7411 [store]
7412 );
7413 const memoizedStore = React8.useMemo(
7414 () => ({ ...store, useState: useState25 }),
7415 [store, useState25]
7416 );
7417 const updateStore = useEvent(() => {
7418 setStore((store2) => createStore2({ ...props, ...store2.getState() }));
7419 });
7420 return [memoizedStore, updateStore];
7421 }
7422
7423 // node_modules/@ariakit/react-core/esm/__chunks/WZWDIE3S.js
7424 var import_react11 = __toESM(require_react(), 1);
7425 var import_jsx_runtime47 = __toESM(require_jsx_runtime(), 1);
7426 var TagName4 = "button";
7427 function isEditableElement(element) {
7428 if (isTextbox(element)) return true;
7429 return element.tagName === "INPUT" && !isButton(element);
7430 }
7431 function getNextPageOffset(scrollingElement, pageUp = false) {
7432 const height = scrollingElement.clientHeight;
7433 const { top } = scrollingElement.getBoundingClientRect();
7434 const pageSize = Math.max(height * 0.875, height - 40) * 1.5;
7435 const pageOffset = pageUp ? height - pageSize + top : pageSize + top;
7436 if (scrollingElement.tagName === "HTML") {
7437 return pageOffset + scrollingElement.scrollTop;
7438 }
7439 return pageOffset;
7440 }
7441 function getItemOffset(itemElement, pageUp = false) {
7442 const { top } = itemElement.getBoundingClientRect();
7443 if (pageUp) {
7444 return top + itemElement.clientHeight;
7445 }
7446 return top;
7447 }
7448 function findNextPageItemId(element, store, next, pageUp = false) {
7449 var _a;
7450 if (!store) return;
7451 if (!next) return;
7452 const { renderedItems } = store.getState();
7453 const scrollingElement = getScrollingElement(element);
7454 if (!scrollingElement) return;
7455 const nextPageOffset = getNextPageOffset(scrollingElement, pageUp);
7456 let id;
7457 let prevDifference;
7458 for (let i2 = 0; i2 < renderedItems.length; i2 += 1) {
7459 const previousId = id;
7460 id = next(i2);
7461 if (!id) break;
7462 if (id === previousId) continue;
7463 const itemElement = (_a = getEnabledItem(store, id)) == null ? void 0 : _a.element;
7464 if (!itemElement) continue;
7465 const itemOffset = getItemOffset(itemElement, pageUp);
7466 const difference = itemOffset - nextPageOffset;
7467 const absDifference = Math.abs(difference);
7468 if (pageUp && difference <= 0 || !pageUp && difference >= 0) {
7469 if (prevDifference !== void 0 && prevDifference < absDifference) {
7470 id = previousId;
7471 }
7472 break;
7473 }
7474 prevDifference = absDifference;
7475 }
7476 return id;
7477 }
7478 function targetIsAnotherItem(event, store) {
7479 if (isSelfTarget(event)) return false;
7480 return isItem(store, event.target);
7481 }
7482 var useCompositeItem = createHook(
7483 function useCompositeItem2({
7484 store,
7485 rowId: rowIdProp,
7486 preventScrollOnKeyDown = false,
7487 moveOnKeyPress = true,
7488 tabbable = false,
7489 getItem: getItemProp,
7490 "aria-setsize": ariaSetSizeProp,
7491 "aria-posinset": ariaPosInSetProp,
7492 ...props
7493 }) {
7494 const context = useCompositeContext();
7495 store = store || context;
7496 const id = useId3(props.id);
7497 const ref = (0, import_react11.useRef)(null);
7498 const row = (0, import_react11.useContext)(CompositeRowContext);
7499 const disabled = disabledFromProps(props);
7500 const trulyDisabled = disabled && !props.accessibleWhenDisabled;
7501 const {
7502 rowId,
7503 baseElement,
7504 isActiveItem,
7505 ariaSetSize,
7506 ariaPosInSet,
7507 isTabbable
7508 } = useStoreStateObject(store, {
7509 rowId(state) {
7510 if (rowIdProp) return rowIdProp;
7511 if (!state) return;
7512 if (!(row == null ? void 0 : row.baseElement)) return;
7513 if (row.baseElement !== state.baseElement) return;
7514 return row.id;
7515 },
7516 baseElement(state) {
7517 return (state == null ? void 0 : state.baseElement) || void 0;
7518 },
7519 isActiveItem(state) {
7520 return !!state && state.activeId === id;
7521 },
7522 ariaSetSize(state) {
7523 if (ariaSetSizeProp != null) return ariaSetSizeProp;
7524 if (!state) return;
7525 if (!(row == null ? void 0 : row.ariaSetSize)) return;
7526 if (row.baseElement !== state.baseElement) return;
7527 return row.ariaSetSize;
7528 },
7529 ariaPosInSet(state) {
7530 if (ariaPosInSetProp != null) return ariaPosInSetProp;
7531 if (!state) return;
7532 if (!(row == null ? void 0 : row.ariaPosInSet)) return;
7533 if (row.baseElement !== state.baseElement) return;
7534 const itemsInRow = state.renderedItems.filter(
7535 (item) => item.rowId === rowId
7536 );
7537 return row.ariaPosInSet + itemsInRow.findIndex((item) => item.id === id);
7538 },
7539 isTabbable(state) {
7540 if (!(state == null ? void 0 : state.renderedItems.length)) return true;
7541 if (state.virtualFocus) return false;
7542 if (tabbable) return true;
7543 if (state.activeId === null) return false;
7544 const item = store == null ? void 0 : store.item(state.activeId);
7545 if (item == null ? void 0 : item.disabled) return true;
7546 if (!(item == null ? void 0 : item.element)) return true;
7547 return state.activeId === id;
7548 }
7549 });
7550 const getItem = (0, import_react11.useCallback)(
7551 (item) => {
7552 var _a;
7553 const nextItem = {
7554 ...item,
7555 id: id || item.id,
7556 rowId,
7557 disabled: !!trulyDisabled,
7558 children: (_a = item.element) == null ? void 0 : _a.textContent
7559 };
7560 if (getItemProp) {
7561 return getItemProp(nextItem);
7562 }
7563 return nextItem;
7564 },
7565 [id, rowId, trulyDisabled, getItemProp]
7566 );
7567 const onFocusProp = props.onFocus;
7568 const hasFocusedComposite = (0, import_react11.useRef)(false);
7569 const onFocus = useEvent((event) => {
7570 onFocusProp == null ? void 0 : onFocusProp(event);
7571 if (event.defaultPrevented) return;
7572 if (isPortalEvent(event)) return;
7573 if (!id) return;
7574 if (!store) return;
7575 if (targetIsAnotherItem(event, store)) return;
7576 const { virtualFocus, baseElement: baseElement2 } = store.getState();
7577 store.setActiveId(id);
7578 if (isTextbox(event.currentTarget)) {
7579 selectTextField(event.currentTarget);
7580 }
7581 if (!virtualFocus) return;
7582 if (!isSelfTarget(event)) return;
7583 if (isEditableElement(event.currentTarget)) return;
7584 if (!(baseElement2 == null ? void 0 : baseElement2.isConnected)) return;
7585 if (isSafari() && event.currentTarget.hasAttribute("data-autofocus")) {
7586 event.currentTarget.scrollIntoView({
7587 block: "nearest",
7588 inline: "nearest"
7589 });
7590 }
7591 hasFocusedComposite.current = true;
7592 const fromComposite = event.relatedTarget === baseElement2 || isItem(store, event.relatedTarget);
7593 if (fromComposite) {
7594 focusSilently(baseElement2);
7595 } else {
7596 baseElement2.focus();
7597 }
7598 });
7599 const onBlurCaptureProp = props.onBlurCapture;
7600 const onBlurCapture = useEvent((event) => {
7601 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event);
7602 if (event.defaultPrevented) return;
7603 const state = store == null ? void 0 : store.getState();
7604 if ((state == null ? void 0 : state.virtualFocus) && hasFocusedComposite.current) {
7605 hasFocusedComposite.current = false;
7606 event.preventDefault();
7607 event.stopPropagation();
7608 }
7609 });
7610 const onKeyDownProp = props.onKeyDown;
7611 const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown);
7612 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
7613 const onKeyDown = useEvent((event) => {
7614 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
7615 if (event.defaultPrevented) return;
7616 if (!isSelfTarget(event)) return;
7617 if (!store) return;
7618 const { currentTarget } = event;
7619 const state = store.getState();
7620 const item = store.item(id);
7621 const isGrid2 = !!(item == null ? void 0 : item.rowId);
7622 const isVertical = state.orientation !== "horizontal";
7623 const isHorizontal = state.orientation !== "vertical";
7624 const canHomeEnd = () => {
7625 if (isGrid2) return true;
7626 if (isHorizontal) return true;
7627 if (!state.baseElement) return true;
7628 if (!isTextField(state.baseElement)) return true;
7629 return false;
7630 };
7631 const keyMap = {
7632 ArrowUp: (isGrid2 || isVertical) && store.up,
7633 ArrowRight: (isGrid2 || isHorizontal) && store.next,
7634 ArrowDown: (isGrid2 || isVertical) && store.down,
7635 ArrowLeft: (isGrid2 || isHorizontal) && store.previous,
7636 Home: () => {
7637 if (!canHomeEnd()) return;
7638 if (!isGrid2 || event.ctrlKey) {
7639 return store == null ? void 0 : store.first();
7640 }
7641 return store == null ? void 0 : store.previous(-1);
7642 },
7643 End: () => {
7644 if (!canHomeEnd()) return;
7645 if (!isGrid2 || event.ctrlKey) {
7646 return store == null ? void 0 : store.last();
7647 }
7648 return store == null ? void 0 : store.next(-1);
7649 },
7650 PageUp: () => {
7651 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.up, true);
7652 },
7653 PageDown: () => {
7654 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.down);
7655 }
7656 };
7657 const action = keyMap[event.key];
7658 if (action) {
7659 if (isTextbox(currentTarget)) {
7660 const selection = getTextboxSelection(currentTarget);
7661 const isLeft = isHorizontal && event.key === "ArrowLeft";
7662 const isRight = isHorizontal && event.key === "ArrowRight";
7663 const isUp = isVertical && event.key === "ArrowUp";
7664 const isDown = isVertical && event.key === "ArrowDown";
7665 if (isRight || isDown) {
7666 const { length: valueLength } = getTextboxValue(currentTarget);
7667 if (selection.end !== valueLength) return;
7668 } else if ((isLeft || isUp) && selection.start !== 0) return;
7669 }
7670 const nextId = action();
7671 if (preventScrollOnKeyDownProp(event) || nextId !== void 0) {
7672 if (!moveOnKeyPressProp(event)) return;
7673 event.preventDefault();
7674 store.move(nextId);
7675 }
7676 }
7677 });
7678 const providerValue = (0, import_react11.useMemo)(
7679 () => ({ id, baseElement }),
7680 [id, baseElement]
7681 );
7682 props = useWrapElement(
7683 props,
7684 (element) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(CompositeItemContext.Provider, { value: providerValue, children: element }),
7685 [providerValue]
7686 );
7687 props = {
7688 id,
7689 "data-active-item": isActiveItem || void 0,
7690 ...props,
7691 ref: useMergeRefs(ref, props.ref),
7692 tabIndex: isTabbable ? props.tabIndex : -1,
7693 onFocus,
7694 onBlurCapture,
7695 onKeyDown
7696 };
7697 props = useCommand(props);
7698 props = useCollectionItem({
7699 store,
7700 ...props,
7701 getItem,
7702 shouldRegisterItem: id ? props.shouldRegisterItem : false
7703 });
7704 return removeUndefinedValues({
7705 ...props,
7706 "aria-setsize": ariaSetSize,
7707 "aria-posinset": ariaPosInSet
7708 });
7709 }
7710 );
7711 var CompositeItem = memo22(
7712 forwardRef22(function CompositeItem2(props) {
7713 const htmlProps = useCompositeItem(props);
7714 return createElement3(TagName4, htmlProps);
7715 })
7716 );
7717
7718 // node_modules/@ariakit/core/esm/__chunks/7PRQYBBV.js
7719 function toArray(arg) {
7720 if (Array.isArray(arg)) {
7721 return arg;
7722 }
7723 return typeof arg !== "undefined" ? [arg] : [];
7724 }
7725 function flatten2DArray(array) {
7726 const flattened = [];
7727 for (const row of array) {
7728 flattened.push(...row);
7729 }
7730 return flattened;
7731 }
7732 function reverseArray(array) {
7733 return array.slice().reverse();
7734 }
7735
7736 // node_modules/@ariakit/react-core/esm/__chunks/ZMWF7ASR.js
7737 var import_react12 = __toESM(require_react(), 1);
7738 var import_jsx_runtime48 = __toESM(require_jsx_runtime(), 1);
7739 var TagName5 = "div";
7740 function isGrid(items) {
7741 return items.some((item) => !!item.rowId);
7742 }
7743 function isPrintableKey(event) {
7744 const target = event.target;
7745 if (target && !isTextField(target)) return false;
7746 return event.key.length === 1 && !event.ctrlKey && !event.metaKey;
7747 }
7748 function isModifierKey(event) {
7749 return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta";
7750 }
7751 function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) {
7752 return useEvent((event) => {
7753 var _a;
7754 onKeyboardEvent == null ? void 0 : onKeyboardEvent(event);
7755 if (event.defaultPrevented) return;
7756 if (event.isPropagationStopped()) return;
7757 if (!isSelfTarget(event)) return;
7758 if (isModifierKey(event)) return;
7759 if (isPrintableKey(event)) return;
7760 const state = store.getState();
7761 const activeElement = (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.element;
7762 if (!activeElement) return;
7763 const { view, ...eventInit } = event;
7764 const previousElement = previousElementRef == null ? void 0 : previousElementRef.current;
7765 if (activeElement !== previousElement) {
7766 activeElement.focus();
7767 }
7768 if (!fireKeyboardEvent(activeElement, event.type, eventInit)) {
7769 event.preventDefault();
7770 }
7771 if (event.currentTarget.contains(activeElement)) {
7772 event.stopPropagation();
7773 }
7774 });
7775 }
7776 function findFirstEnabledItemInTheLastRow(items) {
7777 return findFirstEnabledItem(
7778 flatten2DArray(reverseArray(groupItemsByRows(items)))
7779 );
7780 }
7781 function useScheduleFocus(store) {
7782 const [scheduled, setScheduled] = (0, import_react12.useState)(false);
7783 const schedule = (0, import_react12.useCallback)(() => setScheduled(true), []);
7784 const activeItem = store.useState(
7785 (state) => getEnabledItem(store, state.activeId)
7786 );
7787 (0, import_react12.useEffect)(() => {
7788 const activeElement = activeItem == null ? void 0 : activeItem.element;
7789 if (!scheduled) return;
7790 if (!activeElement) return;
7791 setScheduled(false);
7792 activeElement.focus({ preventScroll: true });
7793 }, [activeItem, scheduled]);
7794 return schedule;
7795 }
7796 var useComposite = createHook(
7797 function useComposite2({
7798 store,
7799 composite = true,
7800 focusOnMove = composite,
7801 moveOnKeyPress = true,
7802 ...props
7803 }) {
7804 const context = useCompositeProviderContext();
7805 store = store || context;
7806 invariant(
7807 store,
7808 "Composite must receive a `store` prop or be wrapped in a CompositeProvider component."
7809 );
7810 const ref = (0, import_react12.useRef)(null);
7811 const previousElementRef = (0, import_react12.useRef)(null);
7812 const scheduleFocus = useScheduleFocus(store);
7813 const moves = store.useState("moves");
7814 const [, setBaseElement] = useTransactionState(
7815 composite ? store.setBaseElement : null
7816 );
7817 (0, import_react12.useEffect)(() => {
7818 var _a;
7819 if (!store) return;
7820 if (!moves) return;
7821 if (!composite) return;
7822 if (!focusOnMove) return;
7823 const { activeId: activeId2 } = store.getState();
7824 const itemElement = (_a = getEnabledItem(store, activeId2)) == null ? void 0 : _a.element;
7825 if (!itemElement) return;
7826 focusIntoView(itemElement);
7827 }, [store, moves, composite, focusOnMove]);
7828 useSafeLayoutEffect(() => {
7829 if (!store) return;
7830 if (!moves) return;
7831 if (!composite) return;
7832 const { baseElement, activeId: activeId2 } = store.getState();
7833 const isSelfAcive = activeId2 === null;
7834 if (!isSelfAcive) return;
7835 if (!baseElement) return;
7836 const previousElement = previousElementRef.current;
7837 previousElementRef.current = null;
7838 if (previousElement) {
7839 fireBlurEvent(previousElement, { relatedTarget: baseElement });
7840 }
7841 if (!hasFocus(baseElement)) {
7842 baseElement.focus();
7843 }
7844 }, [store, moves, composite]);
7845 const activeId = store.useState("activeId");
7846 const virtualFocus = store.useState("virtualFocus");
7847 useSafeLayoutEffect(() => {
7848 var _a;
7849 if (!store) return;
7850 if (!composite) return;
7851 if (!virtualFocus) return;
7852 const previousElement = previousElementRef.current;
7853 previousElementRef.current = null;
7854 if (!previousElement) return;
7855 const activeElement = (_a = getEnabledItem(store, activeId)) == null ? void 0 : _a.element;
7856 const relatedTarget = activeElement || getActiveElement(previousElement);
7857 if (relatedTarget === previousElement) return;
7858 fireBlurEvent(previousElement, { relatedTarget });
7859 }, [store, activeId, virtualFocus, composite]);
7860 const onKeyDownCapture = useKeyboardEventProxy(
7861 store,
7862 props.onKeyDownCapture,
7863 previousElementRef
7864 );
7865 const onKeyUpCapture = useKeyboardEventProxy(
7866 store,
7867 props.onKeyUpCapture,
7868 previousElementRef
7869 );
7870 const onFocusCaptureProp = props.onFocusCapture;
7871 const onFocusCapture = useEvent((event) => {
7872 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event);
7873 if (event.defaultPrevented) return;
7874 if (!store) return;
7875 const { virtualFocus: virtualFocus2 } = store.getState();
7876 if (!virtualFocus2) return;
7877 const previousActiveElement = event.relatedTarget;
7878 const isSilentlyFocused = silentlyFocused(event.currentTarget);
7879 if (isSelfTarget(event) && isSilentlyFocused) {
7880 event.stopPropagation();
7881 previousElementRef.current = previousActiveElement;
7882 }
7883 });
7884 const onFocusProp = props.onFocus;
7885 const onFocus = useEvent((event) => {
7886 onFocusProp == null ? void 0 : onFocusProp(event);
7887 if (event.defaultPrevented) return;
7888 if (!composite) return;
7889 if (!store) return;
7890 const { relatedTarget } = event;
7891 const { virtualFocus: virtualFocus2 } = store.getState();
7892 if (virtualFocus2) {
7893 if (isSelfTarget(event) && !isItem(store, relatedTarget)) {
7894 queueMicrotask(scheduleFocus);
7895 }
7896 } else if (isSelfTarget(event)) {
7897 store.setActiveId(null);
7898 }
7899 });
7900 const onBlurCaptureProp = props.onBlurCapture;
7901 const onBlurCapture = useEvent((event) => {
7902 var _a;
7903 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event);
7904 if (event.defaultPrevented) return;
7905 if (!store) return;
7906 const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState();
7907 if (!virtualFocus2) return;
7908 const activeElement = (_a = getEnabledItem(store, activeId2)) == null ? void 0 : _a.element;
7909 const nextActiveElement = event.relatedTarget;
7910 const nextActiveElementIsItem = isItem(store, nextActiveElement);
7911 const previousElement = previousElementRef.current;
7912 previousElementRef.current = null;
7913 if (isSelfTarget(event) && nextActiveElementIsItem) {
7914 if (nextActiveElement === activeElement) {
7915 if (previousElement && previousElement !== nextActiveElement) {
7916 fireBlurEvent(previousElement, event);
7917 }
7918 } else if (activeElement) {
7919 fireBlurEvent(activeElement, event);
7920 } else if (previousElement) {
7921 fireBlurEvent(previousElement, event);
7922 }
7923 event.stopPropagation();
7924 } else {
7925 const targetIsItem = isItem(store, event.target);
7926 if (!targetIsItem && activeElement) {
7927 fireBlurEvent(activeElement, event);
7928 }
7929 }
7930 });
7931 const onKeyDownProp = props.onKeyDown;
7932 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
7933 const onKeyDown = useEvent((event) => {
7934 var _a;
7935 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
7936 if (event.nativeEvent.isComposing) return;
7937 if (event.defaultPrevented) return;
7938 if (!store) return;
7939 if (!isSelfTarget(event)) return;
7940 const { orientation, renderedItems, activeId: activeId2 } = store.getState();
7941 const activeItem = getEnabledItem(store, activeId2);
7942 if ((_a = activeItem == null ? void 0 : activeItem.element) == null ? void 0 : _a.isConnected) return;
7943 const isVertical = orientation !== "horizontal";
7944 const isHorizontal = orientation !== "vertical";
7945 const grid = isGrid(renderedItems);
7946 const isHorizontalKey = event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End";
7947 if (isHorizontalKey && isTextField(event.currentTarget)) return;
7948 const up = () => {
7949 if (grid) {
7950 const item = findFirstEnabledItemInTheLastRow(renderedItems);
7951 return item == null ? void 0 : item.id;
7952 }
7953 return store == null ? void 0 : store.last();
7954 };
7955 const keyMap = {
7956 ArrowUp: (grid || isVertical) && up,
7957 ArrowRight: (grid || isHorizontal) && store.first,
7958 ArrowDown: (grid || isVertical) && store.first,
7959 ArrowLeft: (grid || isHorizontal) && store.last,
7960 Home: store.first,
7961 End: store.last,
7962 PageUp: store.first,
7963 PageDown: store.last
7964 };
7965 const action = keyMap[event.key];
7966 if (action) {
7967 const id = action();
7968 if (id !== void 0) {
7969 if (!moveOnKeyPressProp(event)) return;
7970 event.preventDefault();
7971 store.move(id);
7972 }
7973 }
7974 });
7975 props = useWrapElement(
7976 props,
7977 (element) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompositeContextProvider, { value: store, children: element }),
7978 [store]
7979 );
7980 const activeDescendant = store.useState((state) => {
7981 var _a;
7982 if (!store) return;
7983 if (!composite) return;
7984 if (!state.virtualFocus) return;
7985 return (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.id;
7986 });
7987 props = {
7988 "aria-activedescendant": activeDescendant,
7989 ...props,
7990 ref: useMergeRefs(ref, setBaseElement, props.ref),
7991 onKeyDownCapture,
7992 onKeyUpCapture,
7993 onFocusCapture,
7994 onFocus,
7995 onBlurCapture,
7996 onKeyDown
7997 };
7998 const focusable = store.useState(
7999 (state) => composite && (state.virtualFocus || state.activeId === null)
8000 );
8001 props = useFocusable({ focusable, ...props });
8002 return props;
8003 }
8004 );
8005 var Composite5 = forwardRef22(function Composite22(props) {
8006 const htmlProps = useComposite(props);
8007 return createElement3(TagName5, htmlProps);
8008 });
8009
8010 // node_modules/@ariakit/react-core/esm/__chunks/LVDQFHCH.js
8011 var ctx3 = createStoreContext();
8012 var useDisclosureContext = ctx3.useContext;
8013 var useDisclosureScopedContext = ctx3.useScopedContext;
8014 var useDisclosureProviderContext = ctx3.useProviderContext;
8015 var DisclosureContextProvider = ctx3.ContextProvider;
8016 var DisclosureScopedContextProvider = ctx3.ScopedContextProvider;
8017
8018 // node_modules/@ariakit/react-core/esm/__chunks/A62MDFCW.js
8019 var import_react13 = __toESM(require_react(), 1);
8020 var ctx4 = createStoreContext(
8021 [DisclosureContextProvider],
8022 [DisclosureScopedContextProvider]
8023 );
8024 var useDialogContext = ctx4.useContext;
8025 var useDialogScopedContext = ctx4.useScopedContext;
8026 var useDialogProviderContext = ctx4.useProviderContext;
8027 var DialogContextProvider = ctx4.ContextProvider;
8028 var DialogScopedContextProvider = ctx4.ScopedContextProvider;
8029 var DialogHeadingContext = (0, import_react13.createContext)(void 0);
8030 var DialogDescriptionContext = (0, import_react13.createContext)(void 0);
8031
8032 // node_modules/@ariakit/react-core/esm/__chunks/6B3RXHKP.js
8033 var import_react14 = __toESM(require_react(), 1);
8034 var import_react_dom = __toESM(require_react_dom(), 1);
8035 var import_jsx_runtime49 = __toESM(require_jsx_runtime(), 1);
8036 var TagName6 = "div";
8037 function afterTimeout(timeoutMs, cb) {
8038 const timeoutId = setTimeout(cb, timeoutMs);
8039 return () => clearTimeout(timeoutId);
8040 }
8041 function afterPaint2(cb) {
8042 let raf = requestAnimationFrame(() => {
8043 raf = requestAnimationFrame(cb);
8044 });
8045 return () => cancelAnimationFrame(raf);
8046 }
8047 function parseCSSTime(...times) {
8048 return times.join(", ").split(", ").reduce((longestTime, currentTimeString) => {
8049 const multiplier = currentTimeString.endsWith("ms") ? 1 : 1e3;
8050 const currentTime = Number.parseFloat(currentTimeString || "0s") * multiplier;
8051 if (currentTime > longestTime) return currentTime;
8052 return longestTime;
8053 }, 0);
8054 }
8055 function isHidden(mounted, hidden, alwaysVisible) {
8056 return !alwaysVisible && hidden !== false && (!mounted || !!hidden);
8057 }
8058 var useDisclosureContent = createHook(function useDisclosureContent2({ store, alwaysVisible, ...props }) {
8059 const context = useDisclosureProviderContext();
8060 store = store || context;
8061 invariant(
8062 store,
8063 "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component."
8064 );
8065 const ref = (0, import_react14.useRef)(null);
8066 const id = useId3(props.id);
8067 const [transition, setTransition] = (0, import_react14.useState)(null);
8068 const open = store.useState("open");
8069 const mounted = store.useState("mounted");
8070 const animated = store.useState("animated");
8071 const contentElement = store.useState("contentElement");
8072 const otherElement = useStoreState(store.disclosure, "contentElement");
8073 useSafeLayoutEffect(() => {
8074 if (!ref.current) return;
8075 store == null ? void 0 : store.setContentElement(ref.current);
8076 }, [store]);
8077 useSafeLayoutEffect(() => {
8078 let previousAnimated;
8079 store == null ? void 0 : store.setState("animated", (animated2) => {
8080 previousAnimated = animated2;
8081 return true;
8082 });
8083 return () => {
8084 if (previousAnimated === void 0) return;
8085 store == null ? void 0 : store.setState("animated", previousAnimated);
8086 };
8087 }, [store]);
8088 useSafeLayoutEffect(() => {
8089 if (!animated) return;
8090 if (!(contentElement == null ? void 0 : contentElement.isConnected)) {
8091 setTransition(null);
8092 return;
8093 }
8094 return afterPaint2(() => {
8095 setTransition(open ? "enter" : mounted ? "leave" : null);
8096 });
8097 }, [animated, contentElement, open, mounted]);
8098 useSafeLayoutEffect(() => {
8099 if (!store) return;
8100 if (!animated) return;
8101 if (!transition) return;
8102 if (!contentElement) return;
8103 const stopAnimation = () => store == null ? void 0 : store.setState("animating", false);
8104 const stopAnimationSync = () => (0, import_react_dom.flushSync)(stopAnimation);
8105 if (transition === "leave" && open) return;
8106 if (transition === "enter" && !open) return;
8107 if (typeof animated === "number") {
8108 const timeout2 = animated;
8109 return afterTimeout(timeout2, stopAnimationSync);
8110 }
8111 const {
8112 transitionDuration,
8113 animationDuration,
8114 transitionDelay,
8115 animationDelay
8116 } = getComputedStyle(contentElement);
8117 const {
8118 transitionDuration: transitionDuration2 = "0",
8119 animationDuration: animationDuration2 = "0",
8120 transitionDelay: transitionDelay2 = "0",
8121 animationDelay: animationDelay2 = "0"
8122 } = otherElement ? getComputedStyle(otherElement) : {};
8123 const delay = parseCSSTime(
8124 transitionDelay,
8125 animationDelay,
8126 transitionDelay2,
8127 animationDelay2
8128 );
8129 const duration = parseCSSTime(
8130 transitionDuration,
8131 animationDuration,
8132 transitionDuration2,
8133 animationDuration2
8134 );
8135 const timeout = delay + duration;
8136 if (!timeout) {
8137 if (transition === "enter") {
8138 store.setState("animated", false);
8139 }
8140 stopAnimation();
8141 return;
8142 }
8143 const frameRate = 1e3 / 60;
8144 const maxTimeout = Math.max(timeout - frameRate, 0);
8145 return afterTimeout(maxTimeout, stopAnimationSync);
8146 }, [store, animated, contentElement, otherElement, open, transition]);
8147 props = useWrapElement(
8148 props,
8149 (element) => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(DialogScopedContextProvider, { value: store, children: element }),
8150 [store]
8151 );
8152 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
8153 const styleProp = props.style;
8154 const style = (0, import_react14.useMemo)(() => {
8155 if (hidden) {
8156 return { ...styleProp, display: "none" };
8157 }
8158 return styleProp;
8159 }, [hidden, styleProp]);
8160 props = {
8161 id,
8162 "data-open": open || void 0,
8163 "data-enter": transition === "enter" || void 0,
8164 "data-leave": transition === "leave" || void 0,
8165 hidden,
8166 ...props,
8167 ref: useMergeRefs(id ? store.setContentElement : null, ref, props.ref),
8168 style
8169 };
8170 return removeUndefinedValues(props);
8171 });
8172 var DisclosureContentImpl = forwardRef22(function DisclosureContentImpl2(props) {
8173 const htmlProps = useDisclosureContent(props);
8174 return createElement3(TagName6, htmlProps);
8175 });
8176 var DisclosureContent = forwardRef22(function DisclosureContent2({
8177 unmountOnHide,
8178 ...props
8179 }) {
8180 const context = useDisclosureProviderContext();
8181 const store = props.store || context;
8182 const mounted = useStoreState(
8183 store,
8184 (state) => !unmountOnHide || (state == null ? void 0 : state.mounted)
8185 );
8186 if (mounted === false) return null;
8187 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(DisclosureContentImpl, { ...props });
8188 });
8189
8190 // node_modules/@ariakit/core/esm/__chunks/75BJEVSH.js
8191 function createDisclosureStore(props = {}) {
8192 const store = mergeStore(
8193 props.store,
8194 omit22(props.disclosure, ["contentElement", "disclosureElement"])
8195 );
8196 throwOnConflictingProps(props, store);
8197 const syncState = store == null ? void 0 : store.getState();
8198 const open = defaultValue(
8199 props.open,
8200 syncState == null ? void 0 : syncState.open,
8201 props.defaultOpen,
8202 false
8203 );
8204 const animated = defaultValue(props.animated, syncState == null ? void 0 : syncState.animated, false);
8205 const initialState = {
8206 open,
8207 animated,
8208 animating: !!animated && open,
8209 mounted: open,
8210 contentElement: defaultValue(syncState == null ? void 0 : syncState.contentElement, null),
8211 disclosureElement: defaultValue(syncState == null ? void 0 : syncState.disclosureElement, null)
8212 };
8213 const disclosure = createStore(initialState, store);
8214 setup(
8215 disclosure,
8216 () => sync(disclosure, ["animated", "animating"], (state) => {
8217 if (state.animated) return;
8218 disclosure.setState("animating", false);
8219 })
8220 );
8221 setup(
8222 disclosure,
8223 () => subscribe(disclosure, ["open"], () => {
8224 if (!disclosure.getState().animated) return;
8225 disclosure.setState("animating", true);
8226 })
8227 );
8228 setup(
8229 disclosure,
8230 () => sync(disclosure, ["open", "animating"], (state) => {
8231 disclosure.setState("mounted", state.open || state.animating);
8232 })
8233 );
8234 return {
8235 ...disclosure,
8236 disclosure: props.disclosure,
8237 setOpen: (value) => disclosure.setState("open", value),
8238 show: () => disclosure.setState("open", true),
8239 hide: () => disclosure.setState("open", false),
8240 toggle: () => disclosure.setState("open", (open2) => !open2),
8241 stopAnimation: () => disclosure.setState("animating", false),
8242 setContentElement: (value) => disclosure.setState("contentElement", value),
8243 setDisclosureElement: (value) => disclosure.setState("disclosureElement", value)
8244 };
8245 }
8246
8247 // node_modules/@ariakit/react-core/esm/__chunks/WLZ6H5FH.js
8248 function useDisclosureStoreProps(store, update2, props) {
8249 useUpdateEffect(update2, [props.store, props.disclosure]);
8250 useStoreProps(store, props, "open", "setOpen");
8251 useStoreProps(store, props, "mounted", "setMounted");
8252 useStoreProps(store, props, "animated");
8253 return Object.assign(store, { disclosure: props.disclosure });
8254 }
8255
8256 // node_modules/@ariakit/react-core/esm/__chunks/JMU4N4M5.js
8257 var ctx5 = createStoreContext(
8258 [DialogContextProvider],
8259 [DialogScopedContextProvider]
8260 );
8261 var usePopoverContext = ctx5.useContext;
8262 var usePopoverScopedContext = ctx5.useScopedContext;
8263 var usePopoverProviderContext = ctx5.useProviderContext;
8264 var PopoverContextProvider = ctx5.ContextProvider;
8265 var PopoverScopedContextProvider = ctx5.ScopedContextProvider;
8266
8267 // node_modules/@ariakit/core/esm/__chunks/N5XGANPW.js
8268 function getCommonParent(items) {
8269 var _a;
8270 const firstItem = items.find((item) => !!item.element);
8271 const lastItem = [...items].reverse().find((item) => !!item.element);
8272 let parentElement = (_a = firstItem == null ? void 0 : firstItem.element) == null ? void 0 : _a.parentElement;
8273 while (parentElement && (lastItem == null ? void 0 : lastItem.element)) {
8274 const parent = parentElement;
8275 if (lastItem && parent.contains(lastItem.element)) {
8276 return parentElement;
8277 }
8278 parentElement = parentElement.parentElement;
8279 }
8280 return getDocument(parentElement).body;
8281 }
8282 function getPrivateStore(store) {
8283 return store == null ? void 0 : store.__unstablePrivateStore;
8284 }
8285 function createCollectionStore(props = {}) {
8286 var _a;
8287 throwOnConflictingProps(props, props.store);
8288 const syncState = (_a = props.store) == null ? void 0 : _a.getState();
8289 const items = defaultValue(
8290 props.items,
8291 syncState == null ? void 0 : syncState.items,
8292 props.defaultItems,
8293 []
8294 );
8295 const itemsMap = new Map(items.map((item) => [item.id, item]));
8296 const initialState = {
8297 items,
8298 renderedItems: defaultValue(syncState == null ? void 0 : syncState.renderedItems, [])
8299 };
8300 const syncPrivateStore = getPrivateStore(props.store);
8301 const privateStore = createStore(
8302 { items, renderedItems: initialState.renderedItems },
8303 syncPrivateStore
8304 );
8305 const collection = createStore(initialState, props.store);
8306 const sortItems = (renderedItems) => {
8307 const sortedItems = sortBasedOnDOMPosition(renderedItems, (i2) => i2.element);
8308 privateStore.setState("renderedItems", sortedItems);
8309 collection.setState("renderedItems", sortedItems);
8310 };
8311 setup(collection, () => init(privateStore));
8312 setup(privateStore, () => {
8313 return batch(privateStore, ["items"], (state) => {
8314 collection.setState("items", state.items);
8315 });
8316 });
8317 setup(privateStore, () => {
8318 return batch(privateStore, ["renderedItems"], (state) => {
8319 let firstRun = true;
8320 let raf = requestAnimationFrame(() => {
8321 const { renderedItems } = collection.getState();
8322 if (state.renderedItems === renderedItems) return;
8323 sortItems(state.renderedItems);
8324 });
8325 if (typeof IntersectionObserver !== "function") {
8326 return () => cancelAnimationFrame(raf);
8327 }
8328 const ioCallback = () => {
8329 if (firstRun) {
8330 firstRun = false;
8331 return;
8332 }
8333 cancelAnimationFrame(raf);
8334 raf = requestAnimationFrame(() => sortItems(state.renderedItems));
8335 };
8336 const root = getCommonParent(state.renderedItems);
8337 const observer = new IntersectionObserver(ioCallback, { root });
8338 for (const item of state.renderedItems) {
8339 if (!item.element) continue;
8340 observer.observe(item.element);
8341 }
8342 return () => {
8343 cancelAnimationFrame(raf);
8344 observer.disconnect();
8345 };
8346 });
8347 });
8348 const mergeItem = (item, setItems, canDeleteFromMap = false) => {
8349 let prevItem;
8350 setItems((items2) => {
8351 const index = items2.findIndex(({ id }) => id === item.id);
8352 const nextItems = items2.slice();
8353 if (index !== -1) {
8354 prevItem = items2[index];
8355 const nextItem = { ...prevItem, ...item };
8356 nextItems[index] = nextItem;
8357 itemsMap.set(item.id, nextItem);
8358 } else {
8359 nextItems.push(item);
8360 itemsMap.set(item.id, item);
8361 }
8362 return nextItems;
8363 });
8364 const unmergeItem = () => {
8365 setItems((items2) => {
8366 if (!prevItem) {
8367 if (canDeleteFromMap) {
8368 itemsMap.delete(item.id);
8369 }
8370 return items2.filter(({ id }) => id !== item.id);
8371 }
8372 const index = items2.findIndex(({ id }) => id === item.id);
8373 if (index === -1) return items2;
8374 const nextItems = items2.slice();
8375 nextItems[index] = prevItem;
8376 itemsMap.set(item.id, prevItem);
8377 return nextItems;
8378 });
8379 };
8380 return unmergeItem;
8381 };
8382 const registerItem = (item) => mergeItem(
8383 item,
8384 (getItems) => privateStore.setState("items", getItems),
8385 true
8386 );
8387 return {
8388 ...collection,
8389 registerItem,
8390 renderItem: (item) => chain(
8391 registerItem(item),
8392 mergeItem(
8393 item,
8394 (getItems) => privateStore.setState("renderedItems", getItems)
8395 )
8396 ),
8397 item: (id) => {
8398 if (!id) return null;
8399 let item = itemsMap.get(id);
8400 if (!item) {
8401 const { items: items2 } = privateStore.getState();
8402 item = items2.find((item2) => item2.id === id);
8403 if (item) {
8404 itemsMap.set(id, item);
8405 }
8406 }
8407 return item || null;
8408 },
8409 // @ts-expect-error Internal
8410 __unstablePrivateStore: privateStore
8411 };
8412 }
8413
8414 // node_modules/@ariakit/react-core/esm/__chunks/GVAFFF2B.js
8415 function useCollectionStoreProps(store, update2, props) {
8416 useUpdateEffect(update2, [props.store]);
8417 useStoreProps(store, props, "items", "setItems");
8418 return store;
8419 }
8420
8421 // node_modules/@ariakit/core/esm/__chunks/RVTIKFRL.js
8422 var NULL_ITEM = { id: null };
8423 function findFirstEnabledItem2(items, excludeId) {
8424 return items.find((item) => {
8425 if (excludeId) {
8426 return !item.disabled && item.id !== excludeId;
8427 }
8428 return !item.disabled;
8429 });
8430 }
8431 function getEnabledItems(items, excludeId) {
8432 return items.filter((item) => {
8433 if (excludeId) {
8434 return !item.disabled && item.id !== excludeId;
8435 }
8436 return !item.disabled;
8437 });
8438 }
8439 function getItemsInRow(items, rowId) {
8440 return items.filter((item) => item.rowId === rowId);
8441 }
8442 function flipItems(items, activeId, shouldInsertNullItem = false) {
8443 const index = items.findIndex((item) => item.id === activeId);
8444 return [
8445 ...items.slice(index + 1),
8446 ...shouldInsertNullItem ? [NULL_ITEM] : [],
8447 ...items.slice(0, index)
8448 ];
8449 }
8450 function groupItemsByRows2(items) {
8451 const rows = [];
8452 for (const item of items) {
8453 const row = rows.find((currentRow) => {
8454 var _a;
8455 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId;
8456 });
8457 if (row) {
8458 row.push(item);
8459 } else {
8460 rows.push([item]);
8461 }
8462 }
8463 return rows;
8464 }
8465 function getMaxRowLength(array) {
8466 let maxLength = 0;
8467 for (const { length } of array) {
8468 if (length > maxLength) {
8469 maxLength = length;
8470 }
8471 }
8472 return maxLength;
8473 }
8474 function createEmptyItem(rowId) {
8475 return {
8476 id: "__EMPTY_ITEM__",
8477 disabled: true,
8478 rowId
8479 };
8480 }
8481 function normalizeRows(rows, activeId, focusShift) {
8482 const maxLength = getMaxRowLength(rows);
8483 for (const row of rows) {
8484 for (let i2 = 0; i2 < maxLength; i2 += 1) {
8485 const item = row[i2];
8486 if (!item || focusShift && item.disabled) {
8487 const isFirst = i2 === 0;
8488 const previousItem = isFirst && focusShift ? findFirstEnabledItem2(row) : row[i2 - 1];
8489 row[i2] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem == null ? void 0 : previousItem.rowId);
8490 }
8491 }
8492 }
8493 return rows;
8494 }
8495 function verticalizeItems(items) {
8496 const rows = groupItemsByRows2(items);
8497 const maxLength = getMaxRowLength(rows);
8498 const verticalized = [];
8499 for (let i2 = 0; i2 < maxLength; i2 += 1) {
8500 for (const row of rows) {
8501 const item = row[i2];
8502 if (item) {
8503 verticalized.push({
8504 ...item,
8505 // If there's no rowId, it means that it's not a grid composite, but
8506 // a single row instead. So, instead of verticalizing it, that is,
8507 // assigning a different rowId based on the column index, we keep it
8508 // undefined so they will be part of the same row. This is useful
8509 // when using up/down on one-dimensional composites.
8510 rowId: item.rowId ? `${i2}` : void 0
8511 });
8512 }
8513 }
8514 }
8515 return verticalized;
8516 }
8517 function createCompositeStore(props = {}) {
8518 var _a;
8519 const syncState = (_a = props.store) == null ? void 0 : _a.getState();
8520 const collection = createCollectionStore(props);
8521 const activeId = defaultValue(
8522 props.activeId,
8523 syncState == null ? void 0 : syncState.activeId,
8524 props.defaultActiveId
8525 );
8526 const initialState = {
8527 ...collection.getState(),
8528 id: defaultValue(
8529 props.id,
8530 syncState == null ? void 0 : syncState.id,
8531 `id-${Math.random().toString(36).slice(2, 8)}`
8532 ),
8533 activeId,
8534 baseElement: defaultValue(syncState == null ? void 0 : syncState.baseElement, null),
8535 includesBaseElement: defaultValue(
8536 props.includesBaseElement,
8537 syncState == null ? void 0 : syncState.includesBaseElement,
8538 activeId === null
8539 ),
8540 moves: defaultValue(syncState == null ? void 0 : syncState.moves, 0),
8541 orientation: defaultValue(
8542 props.orientation,
8543 syncState == null ? void 0 : syncState.orientation,
8544 "both"
8545 ),
8546 rtl: defaultValue(props.rtl, syncState == null ? void 0 : syncState.rtl, false),
8547 virtualFocus: defaultValue(
8548 props.virtualFocus,
8549 syncState == null ? void 0 : syncState.virtualFocus,
8550 false
8551 ),
8552 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, false),
8553 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, false),
8554 focusShift: defaultValue(props.focusShift, syncState == null ? void 0 : syncState.focusShift, false)
8555 };
8556 const composite = createStore(initialState, collection, props.store);
8557 setup(
8558 composite,
8559 () => sync(composite, ["renderedItems", "activeId"], (state) => {
8560 composite.setState("activeId", (activeId2) => {
8561 var _a2;
8562 if (activeId2 !== void 0) return activeId2;
8563 return (_a2 = findFirstEnabledItem2(state.renderedItems)) == null ? void 0 : _a2.id;
8564 });
8565 })
8566 );
8567 const getNextId = (direction = "next", options = {}) => {
8568 var _a2, _b;
8569 const defaultState = composite.getState();
8570 const {
8571 skip = 0,
8572 activeId: activeId2 = defaultState.activeId,
8573 focusShift = defaultState.focusShift,
8574 focusLoop = defaultState.focusLoop,
8575 focusWrap = defaultState.focusWrap,
8576 includesBaseElement = defaultState.includesBaseElement,
8577 renderedItems = defaultState.renderedItems,
8578 rtl = defaultState.rtl
8579 } = options;
8580 const isVerticalDirection = direction === "up" || direction === "down";
8581 const isNextDirection = direction === "next" || direction === "down";
8582 const canReverse = isNextDirection ? rtl && !isVerticalDirection : !rtl || isVerticalDirection;
8583 const canShift = focusShift && !skip;
8584 let items = !isVerticalDirection ? renderedItems : flatten2DArray(
8585 normalizeRows(groupItemsByRows2(renderedItems), activeId2, canShift)
8586 );
8587 items = canReverse ? reverseArray(items) : items;
8588 items = isVerticalDirection ? verticalizeItems(items) : items;
8589 if (activeId2 == null) {
8590 return (_a2 = findFirstEnabledItem2(items)) == null ? void 0 : _a2.id;
8591 }
8592 const activeItem = items.find((item) => item.id === activeId2);
8593 if (!activeItem) {
8594 return (_b = findFirstEnabledItem2(items)) == null ? void 0 : _b.id;
8595 }
8596 const isGrid2 = items.some((item) => item.rowId);
8597 const activeIndex = items.indexOf(activeItem);
8598 const nextItems = items.slice(activeIndex + 1);
8599 const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId);
8600 if (skip) {
8601 const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2);
8602 const nextItem2 = nextEnabledItemsInRow.slice(skip)[0] || // If we can't find an item, just return the last one.
8603 nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1];
8604 return nextItem2 == null ? void 0 : nextItem2.id;
8605 }
8606 const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical");
8607 const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical");
8608 const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false;
8609 if (canLoop) {
8610 const loopItems = canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId);
8611 const sortedItems = flipItems(loopItems, activeId2, hasNullItem);
8612 const nextItem2 = findFirstEnabledItem2(sortedItems, activeId2);
8613 return nextItem2 == null ? void 0 : nextItem2.id;
8614 }
8615 if (canWrap) {
8616 const nextItem2 = findFirstEnabledItem2(
8617 // We can use nextItems, which contains all the next items, including
8618 // items from other rows, to wrap between rows. However, if there is a
8619 // null item (the composite container), we'll only use the next items in
8620 // the row. So moving next from the last item will focus on the
8621 // composite container. On grid composites, horizontal navigation never
8622 // focuses on the composite container, only vertical.
8623 hasNullItem ? nextItemsInRow : nextItems,
8624 activeId2
8625 );
8626 const nextId = hasNullItem ? (nextItem2 == null ? void 0 : nextItem2.id) || null : nextItem2 == null ? void 0 : nextItem2.id;
8627 return nextId;
8628 }
8629 const nextItem = findFirstEnabledItem2(nextItemsInRow, activeId2);
8630 if (!nextItem && hasNullItem) {
8631 return null;
8632 }
8633 return nextItem == null ? void 0 : nextItem.id;
8634 };
8635 return {
8636 ...collection,
8637 ...composite,
8638 setBaseElement: (element) => composite.setState("baseElement", element),
8639 setActiveId: (id) => composite.setState("activeId", id),
8640 move: (id) => {
8641 if (id === void 0) return;
8642 composite.setState("activeId", id);
8643 composite.setState("moves", (moves) => moves + 1);
8644 },
8645 first: () => {
8646 var _a2;
8647 return (_a2 = findFirstEnabledItem2(composite.getState().renderedItems)) == null ? void 0 : _a2.id;
8648 },
8649 last: () => {
8650 var _a2;
8651 return (_a2 = findFirstEnabledItem2(reverseArray(composite.getState().renderedItems))) == null ? void 0 : _a2.id;
8652 },
8653 next: (options) => {
8654 if (options !== void 0 && typeof options === "number") {
8655 options = { skip: options };
8656 }
8657 return getNextId("next", options);
8658 },
8659 previous: (options) => {
8660 if (options !== void 0 && typeof options === "number") {
8661 options = { skip: options };
8662 }
8663 return getNextId("previous", options);
8664 },
8665 down: (options) => {
8666 if (options !== void 0 && typeof options === "number") {
8667 options = { skip: options };
8668 }
8669 return getNextId("down", options);
8670 },
8671 up: (options) => {
8672 if (options !== void 0 && typeof options === "number") {
8673 options = { skip: options };
8674 }
8675 return getNextId("up", options);
8676 }
8677 };
8678 }
8679
8680 // node_modules/@ariakit/react-core/esm/__chunks/IQYAUKXT.js
8681 function useCompositeStoreOptions(props) {
8682 const id = useId3(props.id);
8683 return { id, ...props };
8684 }
8685 function useCompositeStoreProps(store, update2, props) {
8686 store = useCollectionStoreProps(store, update2, props);
8687 useStoreProps(store, props, "activeId", "setActiveId");
8688 useStoreProps(store, props, "includesBaseElement");
8689 useStoreProps(store, props, "virtualFocus");
8690 useStoreProps(store, props, "orientation");
8691 useStoreProps(store, props, "rtl");
8692 useStoreProps(store, props, "focusLoop");
8693 useStoreProps(store, props, "focusWrap");
8694 useStoreProps(store, props, "focusShift");
8695 return store;
8696 }
8697
8698 // node_modules/@ariakit/react-core/esm/__chunks/CVCFNOHX.js
8699 var import_react15 = __toESM(require_react(), 1);
8700 var ComboboxListRoleContext = (0, import_react15.createContext)(
8701 void 0
8702 );
8703 var ctx6 = createStoreContext(
8704 [PopoverContextProvider, CompositeContextProvider],
8705 [PopoverScopedContextProvider, CompositeScopedContextProvider]
8706 );
8707 var useComboboxContext = ctx6.useContext;
8708 var useComboboxScopedContext = ctx6.useScopedContext;
8709 var useComboboxProviderContext = ctx6.useProviderContext;
8710 var ComboboxContextProvider = ctx6.ContextProvider;
8711 var ComboboxScopedContextProvider = ctx6.ScopedContextProvider;
8712 var ComboboxItemValueContext = (0, import_react15.createContext)(
8713 void 0
8714 );
8715 var ComboboxItemCheckedContext = (0, import_react15.createContext)(false);
8716
8717 // node_modules/@ariakit/core/esm/__chunks/KMAUV3TY.js
8718 function createDialogStore(props = {}) {
8719 return createDisclosureStore(props);
8720 }
8721
8722 // node_modules/@ariakit/react-core/esm/__chunks/4NYSH4UO.js
8723 function useDialogStoreProps(store, update2, props) {
8724 return useDisclosureStoreProps(store, update2, props);
8725 }
8726
8727 // node_modules/@ariakit/core/esm/__chunks/BFGNM53A.js
8728 function createPopoverStore({
8729 popover: otherPopover,
8730 ...props
8731 } = {}) {
8732 const store = mergeStore(
8733 props.store,
8734 omit22(otherPopover, [
8735 "arrowElement",
8736 "anchorElement",
8737 "contentElement",
8738 "popoverElement",
8739 "disclosureElement"
8740 ])
8741 );
8742 throwOnConflictingProps(props, store);
8743 const syncState = store == null ? void 0 : store.getState();
8744 const dialog = createDialogStore({ ...props, store });
8745 const placement = defaultValue(
8746 props.placement,
8747 syncState == null ? void 0 : syncState.placement,
8748 "bottom"
8749 );
8750 const initialState = {
8751 ...dialog.getState(),
8752 placement,
8753 currentPlacement: placement,
8754 anchorElement: defaultValue(syncState == null ? void 0 : syncState.anchorElement, null),
8755 popoverElement: defaultValue(syncState == null ? void 0 : syncState.popoverElement, null),
8756 arrowElement: defaultValue(syncState == null ? void 0 : syncState.arrowElement, null),
8757 rendered: /* @__PURE__ */ Symbol("rendered")
8758 };
8759 const popover = createStore(initialState, dialog, store);
8760 return {
8761 ...dialog,
8762 ...popover,
8763 setAnchorElement: (element) => popover.setState("anchorElement", element),
8764 setPopoverElement: (element) => popover.setState("popoverElement", element),
8765 setArrowElement: (element) => popover.setState("arrowElement", element),
8766 render: () => popover.setState("rendered", /* @__PURE__ */ Symbol("rendered"))
8767 };
8768 }
8769
8770 // node_modules/@ariakit/react-core/esm/__chunks/B6FLPFJM.js
8771 function usePopoverStoreProps(store, update2, props) {
8772 useUpdateEffect(update2, [props.popover]);
8773 useStoreProps(store, props, "placement");
8774 return useDialogStoreProps(store, update2, props);
8775 }
8776
8777 // node_modules/@ariakit/react-core/esm/__chunks/4POTBZ2J.js
8778 var TagName7 = "div";
8779 var usePopoverAnchor = createHook(
8780 function usePopoverAnchor2({ store, ...props }) {
8781 const context = usePopoverProviderContext();
8782 store = store || context;
8783 props = {
8784 ...props,
8785 ref: useMergeRefs(store == null ? void 0 : store.setAnchorElement, props.ref)
8786 };
8787 return props;
8788 }
8789 );
8790 var PopoverAnchor = forwardRef22(function PopoverAnchor2(props) {
8791 const htmlProps = usePopoverAnchor(props);
8792 return createElement3(TagName7, htmlProps);
8793 });
8794
8795 // node_modules/@ariakit/react-core/esm/__chunks/X6LNAU2F.js
8796 var import_react16 = __toESM(require_react(), 1);
8797 var TagName8 = "div";
8798 function getMouseDestination(event) {
8799 const relatedTarget = event.relatedTarget;
8800 if ((relatedTarget == null ? void 0 : relatedTarget.nodeType) === Node.ELEMENT_NODE) {
8801 return relatedTarget;
8802 }
8803 return null;
8804 }
8805 function hoveringInside(event) {
8806 const nextElement = getMouseDestination(event);
8807 if (!nextElement) return false;
8808 return contains(event.currentTarget, nextElement);
8809 }
8810 var symbol2 = /* @__PURE__ */ Symbol("composite-hover");
8811 function movingToAnotherItem(event) {
8812 let dest = getMouseDestination(event);
8813 if (!dest) return false;
8814 do {
8815 if (hasOwnProperty(dest, symbol2) && dest[symbol2]) return true;
8816 dest = dest.parentElement;
8817 } while (dest);
8818 return false;
8819 }
8820 var useCompositeHover = createHook(
8821 function useCompositeHover2({
8822 store,
8823 focusOnHover = true,
8824 blurOnHoverEnd = !!focusOnHover,
8825 ...props
8826 }) {
8827 const context = useCompositeContext();
8828 store = store || context;
8829 invariant(
8830 store,
8831 "CompositeHover must be wrapped in a Composite component."
8832 );
8833 const isMouseMoving = useIsMouseMoving();
8834 const onMouseMoveProp = props.onMouseMove;
8835 const focusOnHoverProp = useBooleanEvent(focusOnHover);
8836 const onMouseMove = useEvent((event) => {
8837 onMouseMoveProp == null ? void 0 : onMouseMoveProp(event);
8838 if (event.defaultPrevented) return;
8839 if (!isMouseMoving()) return;
8840 if (!focusOnHoverProp(event)) return;
8841 if (!hasFocusWithin(event.currentTarget)) {
8842 const baseElement = store == null ? void 0 : store.getState().baseElement;
8843 if (baseElement && !hasFocus(baseElement)) {
8844 baseElement.focus();
8845 }
8846 }
8847 store == null ? void 0 : store.setActiveId(event.currentTarget.id);
8848 });
8849 const onMouseLeaveProp = props.onMouseLeave;
8850 const blurOnHoverEndProp = useBooleanEvent(blurOnHoverEnd);
8851 const onMouseLeave = useEvent((event) => {
8852 var _a;
8853 onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event);
8854 if (event.defaultPrevented) return;
8855 if (!isMouseMoving()) return;
8856 if (hoveringInside(event)) return;
8857 if (movingToAnotherItem(event)) return;
8858 if (!focusOnHoverProp(event)) return;
8859 if (!blurOnHoverEndProp(event)) return;
8860 store == null ? void 0 : store.setActiveId(null);
8861 (_a = store == null ? void 0 : store.getState().baseElement) == null ? void 0 : _a.focus();
8862 });
8863 const ref = (0, import_react16.useCallback)((element) => {
8864 if (!element) return;
8865 element[symbol2] = true;
8866 }, []);
8867 props = {
8868 ...props,
8869 ref: useMergeRefs(ref, props.ref),
8870 onMouseMove,
8871 onMouseLeave
8872 };
8873 return removeUndefinedValues(props);
8874 }
8875 );
8876 var CompositeHover = memo22(
8877 forwardRef22(function CompositeHover2(props) {
8878 const htmlProps = useCompositeHover(props);
8879 return createElement3(TagName8, htmlProps);
8880 })
8881 );
8882
8883 // node_modules/@ariakit/react-core/esm/combobox/combobox.js
8884 var import_react17 = __toESM(require_react(), 1);
8885 var TagName9 = "input";
8886 function isFirstItemAutoSelected(items, activeValue, autoSelect) {
8887 if (!autoSelect) return false;
8888 const firstItem = items.find((item) => !item.disabled && item.value);
8889 return (firstItem == null ? void 0 : firstItem.value) === activeValue;
8890 }
8891 function hasCompletionString(value, activeValue) {
8892 if (!activeValue) return false;
8893 if (value == null) return false;
8894 value = normalizeString(value);
8895 return activeValue.length > value.length && activeValue.toLowerCase().indexOf(value.toLowerCase()) === 0;
8896 }
8897 function isInputEvent(event) {
8898 return event.type === "input";
8899 }
8900 function isAriaAutoCompleteValue(value) {
8901 return value === "inline" || value === "list" || value === "both" || value === "none";
8902 }
8903 function getDefaultAutoSelectId(items) {
8904 const item = items.find((item2) => {
8905 var _a;
8906 if (item2.disabled) return false;
8907 return ((_a = item2.element) == null ? void 0 : _a.getAttribute("role")) !== "tab";
8908 });
8909 return item == null ? void 0 : item.id;
8910 }
8911 var useCombobox = createHook(
8912 function useCombobox2({
8913 store,
8914 focusable = true,
8915 autoSelect: autoSelectProp = false,
8916 getAutoSelectId,
8917 setValueOnChange,
8918 showMinLength = 0,
8919 showOnChange,
8920 showOnMouseDown,
8921 showOnClick = showOnMouseDown,
8922 showOnKeyDown,
8923 showOnKeyPress = showOnKeyDown,
8924 blurActiveItemOnClick,
8925 setValueOnClick = true,
8926 moveOnKeyPress = true,
8927 autoComplete = "list",
8928 ...props
8929 }) {
8930 const context = useComboboxProviderContext();
8931 store = store || context;
8932 invariant(
8933 store,
8934 "Combobox must receive a `store` prop or be wrapped in a ComboboxProvider component."
8935 );
8936 const ref = (0, import_react17.useRef)(null);
8937 const [valueUpdated, forceValueUpdate] = useForceUpdate();
8938 const canAutoSelectRef = (0, import_react17.useRef)(false);
8939 const composingRef = (0, import_react17.useRef)(false);
8940 const autoSelect = store.useState(
8941 (state) => state.virtualFocus && autoSelectProp
8942 );
8943 const inline = autoComplete === "inline" || autoComplete === "both";
8944 const [canInline, setCanInline] = (0, import_react17.useState)(inline);
8945 useUpdateLayoutEffect(() => {
8946 if (!inline) return;
8947 setCanInline(true);
8948 }, [inline]);
8949 const storeValue = store.useState("value");
8950 const prevSelectedValueRef = (0, import_react17.useRef)(void 0);
8951 (0, import_react17.useEffect)(() => {
8952 return sync(store, ["selectedValue", "activeId"], (_, prev) => {
8953 prevSelectedValueRef.current = prev.selectedValue;
8954 });
8955 }, []);
8956 const inlineActiveValue = store.useState((state) => {
8957 var _a;
8958 if (!inline) return;
8959 if (!canInline) return;
8960 if (state.activeValue && Array.isArray(state.selectedValue)) {
8961 if (state.selectedValue.includes(state.activeValue)) return;
8962 if ((_a = prevSelectedValueRef.current) == null ? void 0 : _a.includes(state.activeValue)) return;
8963 }
8964 return state.activeValue;
8965 });
8966 const items = store.useState("renderedItems");
8967 const open = store.useState("open");
8968 const contentElement = store.useState("contentElement");
8969 const value = (0, import_react17.useMemo)(() => {
8970 if (!inline) return storeValue;
8971 if (!canInline) return storeValue;
8972 const firstItemAutoSelected = isFirstItemAutoSelected(
8973 items,
8974 inlineActiveValue,
8975 autoSelect
8976 );
8977 if (firstItemAutoSelected) {
8978 if (hasCompletionString(storeValue, inlineActiveValue)) {
8979 const slice = (inlineActiveValue == null ? void 0 : inlineActiveValue.slice(storeValue.length)) || "";
8980 return storeValue + slice;
8981 }
8982 return storeValue;
8983 }
8984 return inlineActiveValue || storeValue;
8985 }, [inline, canInline, items, inlineActiveValue, autoSelect, storeValue]);
8986 (0, import_react17.useEffect)(() => {
8987 const element = ref.current;
8988 if (!element) return;
8989 const onCompositeItemMove = () => setCanInline(true);
8990 element.addEventListener("combobox-item-move", onCompositeItemMove);
8991 return () => {
8992 element.removeEventListener("combobox-item-move", onCompositeItemMove);
8993 };
8994 }, []);
8995 (0, import_react17.useEffect)(() => {
8996 if (!inline) return;
8997 if (!canInline) return;
8998 if (!inlineActiveValue) return;
8999 const firstItemAutoSelected = isFirstItemAutoSelected(
9000 items,
9001 inlineActiveValue,
9002 autoSelect
9003 );
9004 if (!firstItemAutoSelected) return;
9005 if (!hasCompletionString(storeValue, inlineActiveValue)) return;
9006 let cleanup = noop;
9007 queueMicrotask(() => {
9008 const element = ref.current;
9009 if (!element) return;
9010 const { start: prevStart, end: prevEnd } = getTextboxSelection(element);
9011 const nextStart = storeValue.length;
9012 const nextEnd = inlineActiveValue.length;
9013 setSelectionRange(element, nextStart, nextEnd);
9014 cleanup = () => {
9015 if (!hasFocus(element)) return;
9016 const { start, end } = getTextboxSelection(element);
9017 if (start !== nextStart) return;
9018 if (end !== nextEnd) return;
9019 setSelectionRange(element, prevStart, prevEnd);
9020 };
9021 });
9022 return () => cleanup();
9023 }, [
9024 valueUpdated,
9025 inline,
9026 canInline,
9027 inlineActiveValue,
9028 items,
9029 autoSelect,
9030 storeValue
9031 ]);
9032 const scrollingElementRef = (0, import_react17.useRef)(null);
9033 const getAutoSelectIdProp = useEvent(getAutoSelectId);
9034 const autoSelectIdRef = (0, import_react17.useRef)(null);
9035 (0, import_react17.useEffect)(() => {
9036 if (!open) return;
9037 if (!contentElement) return;
9038 const scrollingElement = getScrollingElement(contentElement);
9039 if (!scrollingElement) return;
9040 scrollingElementRef.current = scrollingElement;
9041 const onUserScroll = () => {
9042 canAutoSelectRef.current = false;
9043 };
9044 const onScroll = () => {
9045 if (!store) return;
9046 if (!canAutoSelectRef.current) return;
9047 const { activeId } = store.getState();
9048 if (activeId === null) return;
9049 if (activeId === autoSelectIdRef.current) return;
9050 canAutoSelectRef.current = false;
9051 };
9052 const options = { passive: true, capture: true };
9053 scrollingElement.addEventListener("wheel", onUserScroll, options);
9054 scrollingElement.addEventListener("touchmove", onUserScroll, options);
9055 scrollingElement.addEventListener("scroll", onScroll, options);
9056 return () => {
9057 scrollingElement.removeEventListener("wheel", onUserScroll, true);
9058 scrollingElement.removeEventListener("touchmove", onUserScroll, true);
9059 scrollingElement.removeEventListener("scroll", onScroll, true);
9060 };
9061 }, [open, contentElement, store]);
9062 useSafeLayoutEffect(() => {
9063 if (!storeValue) return;
9064 if (composingRef.current) return;
9065 canAutoSelectRef.current = true;
9066 }, [storeValue]);
9067 useSafeLayoutEffect(() => {
9068 if (autoSelect !== "always" && open) return;
9069 canAutoSelectRef.current = open;
9070 }, [autoSelect, open]);
9071 const resetValueOnSelect = store.useState("resetValueOnSelect");
9072 useUpdateEffect(() => {
9073 var _a, _b;
9074 const canAutoSelect = canAutoSelectRef.current;
9075 if (!store) return;
9076 if (!open) return;
9077 if (!canAutoSelect && !resetValueOnSelect) return;
9078 const { baseElement, contentElement: contentElement2, activeId } = store.getState();
9079 if (baseElement && !hasFocus(baseElement)) return;
9080 if (contentElement2 == null ? void 0 : contentElement2.hasAttribute("data-placing")) {
9081 const observer = new MutationObserver(forceValueUpdate);
9082 observer.observe(contentElement2, { attributeFilter: ["data-placing"] });
9083 return () => observer.disconnect();
9084 }
9085 if (autoSelect && canAutoSelect) {
9086 const userAutoSelectId = getAutoSelectIdProp(items);
9087 const autoSelectId = userAutoSelectId !== void 0 ? userAutoSelectId : (_a = getDefaultAutoSelectId(items)) != null ? _a : store.first();
9088 autoSelectIdRef.current = autoSelectId;
9089 store.move(autoSelectId != null ? autoSelectId : null);
9090 } else {
9091 const element = (_b = store.item(activeId || store.first())) == null ? void 0 : _b.element;
9092 if (element && "scrollIntoView" in element) {
9093 element.scrollIntoView({ block: "nearest", inline: "nearest" });
9094 }
9095 }
9096 return;
9097 }, [
9098 store,
9099 open,
9100 valueUpdated,
9101 storeValue,
9102 autoSelect,
9103 resetValueOnSelect,
9104 getAutoSelectIdProp,
9105 items
9106 ]);
9107 (0, import_react17.useEffect)(() => {
9108 if (!inline) return;
9109 const combobox = ref.current;
9110 if (!combobox) return;
9111 const elements = [combobox, contentElement].filter(
9112 (value2) => !!value2
9113 );
9114 const onBlur2 = (event) => {
9115 if (elements.every((el) => isFocusEventOutside(event, el))) {
9116 store == null ? void 0 : store.setValue(value);
9117 }
9118 };
9119 for (const element of elements) {
9120 element.addEventListener("focusout", onBlur2);
9121 }
9122 return () => {
9123 for (const element of elements) {
9124 element.removeEventListener("focusout", onBlur2);
9125 }
9126 };
9127 }, [inline, contentElement, store, value]);
9128 const canShow = (event) => {
9129 const currentTarget = event.currentTarget;
9130 return currentTarget.value.length >= showMinLength;
9131 };
9132 const onChangeProp = props.onChange;
9133 const showOnChangeProp = useBooleanEvent(showOnChange != null ? showOnChange : canShow);
9134 const setValueOnChangeProp = useBooleanEvent(
9135 // If the combobox is combined with tags, the value will be set by the tag
9136 // input component.
9137 setValueOnChange != null ? setValueOnChange : !store.tag
9138 );
9139 const onChange = useEvent((event) => {
9140 onChangeProp == null ? void 0 : onChangeProp(event);
9141 if (event.defaultPrevented) return;
9142 if (!store) return;
9143 const currentTarget = event.currentTarget;
9144 const { value: value2, selectionStart, selectionEnd } = currentTarget;
9145 const nativeEvent = event.nativeEvent;
9146 canAutoSelectRef.current = true;
9147 if (isInputEvent(nativeEvent)) {
9148 if (nativeEvent.isComposing) {
9149 canAutoSelectRef.current = false;
9150 composingRef.current = true;
9151 }
9152 if (inline) {
9153 const textInserted = nativeEvent.inputType === "insertText" || nativeEvent.inputType === "insertCompositionText";
9154 const caretAtEnd = selectionStart === value2.length;
9155 setCanInline(textInserted && caretAtEnd);
9156 }
9157 }
9158 if (setValueOnChangeProp(event)) {
9159 const isSameValue = value2 === store.getState().value;
9160 store.setValue(value2);
9161 queueMicrotask(() => {
9162 setSelectionRange(currentTarget, selectionStart, selectionEnd);
9163 });
9164 if (inline && autoSelect && isSameValue) {
9165 forceValueUpdate();
9166 }
9167 }
9168 if (showOnChangeProp(event)) {
9169 store.show();
9170 }
9171 if (!autoSelect || !canAutoSelectRef.current) {
9172 store.setActiveId(null);
9173 }
9174 });
9175 const onCompositionEndProp = props.onCompositionEnd;
9176 const onCompositionEnd = useEvent((event) => {
9177 canAutoSelectRef.current = true;
9178 composingRef.current = false;
9179 onCompositionEndProp == null ? void 0 : onCompositionEndProp(event);
9180 if (event.defaultPrevented) return;
9181 if (!autoSelect) return;
9182 forceValueUpdate();
9183 });
9184 const onMouseDownProp = props.onMouseDown;
9185 const blurActiveItemOnClickProp = useBooleanEvent(
9186 blurActiveItemOnClick != null ? blurActiveItemOnClick : (() => !!(store == null ? void 0 : store.getState().includesBaseElement))
9187 );
9188 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
9189 const showOnClickProp = useBooleanEvent(showOnClick != null ? showOnClick : canShow);
9190 const onMouseDown = useEvent((event) => {
9191 onMouseDownProp == null ? void 0 : onMouseDownProp(event);
9192 if (event.defaultPrevented) return;
9193 if (event.button) return;
9194 if (event.ctrlKey) return;
9195 if (!store) return;
9196 if (blurActiveItemOnClickProp(event)) {
9197 store.setActiveId(null);
9198 }
9199 if (setValueOnClickProp(event)) {
9200 store.setValue(value);
9201 }
9202 if (showOnClickProp(event)) {
9203 queueBeforeEvent(event.currentTarget, "mouseup", store.show);
9204 }
9205 });
9206 const onKeyDownProp = props.onKeyDown;
9207 const showOnKeyPressProp = useBooleanEvent(showOnKeyPress != null ? showOnKeyPress : canShow);
9208 const onKeyDown = useEvent((event) => {
9209 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
9210 if (!event.repeat) {
9211 canAutoSelectRef.current = false;
9212 }
9213 if (event.defaultPrevented) return;
9214 if (event.ctrlKey) return;
9215 if (event.altKey) return;
9216 if (event.shiftKey) return;
9217 if (event.metaKey) return;
9218 if (!store) return;
9219 const { open: open2 } = store.getState();
9220 if (open2) return;
9221 if (event.key === "ArrowUp" || event.key === "ArrowDown") {
9222 if (showOnKeyPressProp(event)) {
9223 event.preventDefault();
9224 store.show();
9225 }
9226 }
9227 });
9228 const onBlurProp = props.onBlur;
9229 const onBlur = useEvent((event) => {
9230 canAutoSelectRef.current = false;
9231 onBlurProp == null ? void 0 : onBlurProp(event);
9232 if (event.defaultPrevented) return;
9233 });
9234 const id = useId3(props.id);
9235 const ariaAutoComplete = isAriaAutoCompleteValue(autoComplete) ? autoComplete : void 0;
9236 const isActiveItem = store.useState((state) => state.activeId === null);
9237 props = {
9238 id,
9239 role: "combobox",
9240 "aria-autocomplete": ariaAutoComplete,
9241 "aria-haspopup": getPopupRole(contentElement, "listbox"),
9242 "aria-expanded": open,
9243 "aria-controls": contentElement == null ? void 0 : contentElement.id,
9244 "data-active-item": isActiveItem || void 0,
9245 value,
9246 ...props,
9247 ref: useMergeRefs(ref, props.ref),
9248 onChange,
9249 onCompositionEnd,
9250 onMouseDown,
9251 onKeyDown,
9252 onBlur
9253 };
9254 props = useComposite({
9255 store,
9256 focusable,
9257 ...props,
9258 // Enable inline autocomplete when the user moves from the combobox input
9259 // to an item.
9260 moveOnKeyPress: (event) => {
9261 if (isFalsyBooleanCallback(moveOnKeyPress, event)) return false;
9262 if (inline) setCanInline(true);
9263 return true;
9264 }
9265 });
9266 props = usePopoverAnchor({ store, ...props });
9267 return { autoComplete: "off", ...props };
9268 }
9269 );
9270 var Combobox = forwardRef22(function Combobox2(props) {
9271 const htmlProps = useCombobox(props);
9272 return createElement3(TagName9, htmlProps);
9273 });
9274
9275 // node_modules/@ariakit/react-core/esm/__chunks/IBXZ2LQC.js
9276 var import_react18 = __toESM(require_react(), 1);
9277 var import_jsx_runtime50 = __toESM(require_jsx_runtime(), 1);
9278 var TagName10 = "div";
9279 function isSelected(storeValue, itemValue) {
9280 if (itemValue == null) return;
9281 if (storeValue == null) return false;
9282 if (Array.isArray(storeValue)) {
9283 return storeValue.includes(itemValue);
9284 }
9285 return storeValue === itemValue;
9286 }
9287 function getItemRole(popupRole) {
9288 var _a;
9289 const itemRoleByPopupRole = {
9290 menu: "menuitem",
9291 listbox: "option",
9292 tree: "treeitem"
9293 };
9294 const key = popupRole;
9295 return (_a = itemRoleByPopupRole[key]) != null ? _a : "option";
9296 }
9297 var useComboboxItem = createHook(
9298 function useComboboxItem2({
9299 store,
9300 value,
9301 hideOnClick,
9302 setValueOnClick,
9303 selectValueOnClick = true,
9304 resetValueOnSelect,
9305 focusOnHover = false,
9306 moveOnKeyPress = true,
9307 getItem: getItemProp,
9308 ...props
9309 }) {
9310 var _a;
9311 const context = useComboboxScopedContext();
9312 store = store || context;
9313 invariant(
9314 store,
9315 "ComboboxItem must be wrapped in a ComboboxList or ComboboxPopover component."
9316 );
9317 const { resetValueOnSelectState, multiSelectable, selected } = useStoreStateObject(store, {
9318 resetValueOnSelectState: "resetValueOnSelect",
9319 multiSelectable(state) {
9320 return Array.isArray(state.selectedValue);
9321 },
9322 selected(state) {
9323 return isSelected(state.selectedValue, value);
9324 }
9325 });
9326 const getItem = (0, import_react18.useCallback)(
9327 (item) => {
9328 const nextItem = { ...item, value };
9329 if (getItemProp) {
9330 return getItemProp(nextItem);
9331 }
9332 return nextItem;
9333 },
9334 [value, getItemProp]
9335 );
9336 setValueOnClick = setValueOnClick != null ? setValueOnClick : !multiSelectable;
9337 hideOnClick = hideOnClick != null ? hideOnClick : value != null && !multiSelectable;
9338 const onClickProp = props.onClick;
9339 const setValueOnClickProp = useBooleanEvent(setValueOnClick);
9340 const selectValueOnClickProp = useBooleanEvent(selectValueOnClick);
9341 const resetValueOnSelectProp = useBooleanEvent(
9342 (_a = resetValueOnSelect != null ? resetValueOnSelect : resetValueOnSelectState) != null ? _a : multiSelectable
9343 );
9344 const hideOnClickProp = useBooleanEvent(hideOnClick);
9345 const onClick = useEvent((event) => {
9346 onClickProp == null ? void 0 : onClickProp(event);
9347 if (event.defaultPrevented) return;
9348 if (isDownloading(event)) return;
9349 if (isOpeningInNewTab(event)) return;
9350 if (value != null) {
9351 if (selectValueOnClickProp(event)) {
9352 if (resetValueOnSelectProp(event)) {
9353 store == null ? void 0 : store.resetValue();
9354 }
9355 store == null ? void 0 : store.setSelectedValue((prevValue) => {
9356 if (!Array.isArray(prevValue)) return value;
9357 if (prevValue.includes(value)) {
9358 return prevValue.filter((v2) => v2 !== value);
9359 }
9360 return [...prevValue, value];
9361 });
9362 }
9363 if (setValueOnClickProp(event)) {
9364 store == null ? void 0 : store.setValue(value);
9365 }
9366 }
9367 if (hideOnClickProp(event)) {
9368 store == null ? void 0 : store.hide();
9369 }
9370 });
9371 const onKeyDownProp = props.onKeyDown;
9372 const onKeyDown = useEvent((event) => {
9373 onKeyDownProp == null ? void 0 : onKeyDownProp(event);
9374 if (event.defaultPrevented) return;
9375 const baseElement = store == null ? void 0 : store.getState().baseElement;
9376 if (!baseElement) return;
9377 if (hasFocus(baseElement)) return;
9378 const printable = event.key.length === 1;
9379 if (printable || event.key === "Backspace" || event.key === "Delete") {
9380 queueMicrotask(() => baseElement.focus());
9381 if (isTextField(baseElement)) {
9382 store == null ? void 0 : store.setValue(baseElement.value);
9383 }
9384 }
9385 });
9386 if (multiSelectable && selected != null) {
9387 props = {
9388 "aria-selected": selected,
9389 ...props
9390 };
9391 }
9392 props = useWrapElement(
9393 props,
9394 (element) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(ComboboxItemValueContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(ComboboxItemCheckedContext.Provider, { value: selected != null ? selected : false, children: element }) }),
9395 [value, selected]
9396 );
9397 const popupRole = (0, import_react18.useContext)(ComboboxListRoleContext);
9398 props = {
9399 role: getItemRole(popupRole),
9400 children: value,
9401 ...props,
9402 onClick,
9403 onKeyDown
9404 };
9405 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress);
9406 props = useCompositeItem({
9407 store,
9408 ...props,
9409 getItem,
9410 // Dispatch a custom event on the combobox input when moving to an item
9411 // with the keyboard so the Combobox component can enable inline
9412 // autocompletion.
9413 moveOnKeyPress: (event) => {
9414 if (!moveOnKeyPressProp(event)) return false;
9415 const moveEvent = new Event("combobox-item-move");
9416 const baseElement = store == null ? void 0 : store.getState().baseElement;
9417 baseElement == null ? void 0 : baseElement.dispatchEvent(moveEvent);
9418 return true;
9419 }
9420 });
9421 props = useCompositeHover({ store, focusOnHover, ...props });
9422 return props;
9423 }
9424 );
9425 var ComboboxItem = memo22(
9426 forwardRef22(function ComboboxItem2(props) {
9427 const htmlProps = useComboboxItem(props);
9428 return createElement3(TagName10, htmlProps);
9429 })
9430 );
9431
9432 // node_modules/@ariakit/react-core/esm/combobox/combobox-item-value.js
9433 var import_react19 = __toESM(require_react(), 1);
9434 var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1);
9435 var TagName11 = "span";
9436 function normalizeValue(value) {
9437 return normalizeString(value).toLowerCase();
9438 }
9439 function getOffsets(string, values) {
9440 const offsets = [];
9441 for (const value of values) {
9442 let pos = 0;
9443 const length = value.length;
9444 while (string.indexOf(value, pos) !== -1) {
9445 const index = string.indexOf(value, pos);
9446 if (index !== -1) {
9447 offsets.push([index, length]);
9448 }
9449 pos = index + 1;
9450 }
9451 }
9452 return offsets;
9453 }
9454 function filterOverlappingOffsets(offsets) {
9455 return offsets.filter(([offset, length], i2, arr) => {
9456 return !arr.some(
9457 ([o2, l2], j2) => j2 !== i2 && o2 <= offset && o2 + l2 >= offset + length
9458 );
9459 });
9460 }
9461 function sortOffsets(offsets) {
9462 return offsets.sort(([a2], [b2]) => a2 - b2);
9463 }
9464 function splitValue(itemValue, userValue) {
9465 if (!itemValue) return itemValue;
9466 if (!userValue) return itemValue;
9467 const userValues = toArray(userValue).filter(Boolean).map(normalizeValue);
9468 const parts = [];
9469 const span = (value, autocomplete = false) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
9470 "span",
9471 {
9472 "data-autocomplete-value": autocomplete ? "" : void 0,
9473 "data-user-value": autocomplete ? void 0 : "",
9474 children: value
9475 },
9476 parts.length
9477 );
9478 const offsets = sortOffsets(
9479 filterOverlappingOffsets(
9480 // Convert userValues into a set to avoid duplicates
9481 getOffsets(normalizeValue(itemValue), new Set(userValues))
9482 )
9483 );
9484 if (!offsets.length) {
9485 parts.push(span(itemValue, true));
9486 return parts;
9487 }
9488 const [firstOffset] = offsets[0];
9489 const values = [
9490 itemValue.slice(0, firstOffset),
9491 ...offsets.flatMap(([offset, length], i2) => {
9492 var _a;
9493 const value = itemValue.slice(offset, offset + length);
9494 const nextOffset = (_a = offsets[i2 + 1]) == null ? void 0 : _a[0];
9495 const nextValue = itemValue.slice(offset + length, nextOffset);
9496 return [value, nextValue];
9497 })
9498 ];
9499 values.forEach((value, i2) => {
9500 if (!value) return;
9501 parts.push(span(value, i2 % 2 === 0));
9502 });
9503 return parts;
9504 }
9505 var useComboboxItemValue = createHook(function useComboboxItemValue2({ store, value, userValue, ...props }) {
9506 const context = useComboboxScopedContext();
9507 store = store || context;
9508 const itemContext = (0, import_react19.useContext)(ComboboxItemValueContext);
9509 const itemValue = value != null ? value : itemContext;
9510 const inputValue = useStoreState(store, (state) => userValue != null ? userValue : state == null ? void 0 : state.value);
9511 const children = (0, import_react19.useMemo)(() => {
9512 if (!itemValue) return;
9513 if (!inputValue) return itemValue;
9514 return splitValue(itemValue, inputValue);
9515 }, [itemValue, inputValue]);
9516 props = {
9517 children,
9518 ...props
9519 };
9520 return removeUndefinedValues(props);
9521 });
9522 var ComboboxItemValue = forwardRef22(function ComboboxItemValue2(props) {
9523 const htmlProps = useComboboxItemValue(props);
9524 return createElement3(TagName11, htmlProps);
9525 });
9526
9527 // node_modules/@ariakit/react-core/esm/combobox/combobox-label.js
9528 var TagName12 = "label";
9529 var useComboboxLabel = createHook(
9530 function useComboboxLabel2({ store, ...props }) {
9531 const context = useComboboxProviderContext();
9532 store = store || context;
9533 invariant(
9534 store,
9535 "ComboboxLabel must receive a `store` prop or be wrapped in a ComboboxProvider component."
9536 );
9537 const comboboxId = store.useState((state) => {
9538 var _a;
9539 return (_a = state.baseElement) == null ? void 0 : _a.id;
9540 });
9541 props = {
9542 htmlFor: comboboxId,
9543 ...props
9544 };
9545 return removeUndefinedValues(props);
9546 }
9547 );
9548 var ComboboxLabel = memo22(
9549 forwardRef22(function ComboboxLabel2(props) {
9550 const htmlProps = useComboboxLabel(props);
9551 return createElement3(TagName12, htmlProps);
9552 })
9553 );
9554
9555 // node_modules/@ariakit/react-core/esm/__chunks/2G6YEJT4.js
9556 var import_react20 = __toESM(require_react(), 1);
9557 var import_jsx_runtime52 = __toESM(require_jsx_runtime(), 1);
9558 var TagName13 = "div";
9559 var useComboboxList = createHook(
9560 function useComboboxList2({ store, alwaysVisible, ...props }) {
9561 const scopedContext = useComboboxScopedContext(true);
9562 const context = useComboboxContext();
9563 store = store || context;
9564 const scopedContextSameStore = !!store && store === scopedContext;
9565 invariant(
9566 store,
9567 "ComboboxList must receive a `store` prop or be wrapped in a ComboboxProvider component."
9568 );
9569 const ref = (0, import_react20.useRef)(null);
9570 const id = useId3(props.id);
9571 const mounted = store.useState("mounted");
9572 const hidden = isHidden(mounted, props.hidden, alwaysVisible);
9573 const style = hidden ? { ...props.style, display: "none" } : props.style;
9574 const multiSelectable = store.useState(
9575 (state) => Array.isArray(state.selectedValue)
9576 );
9577 const role = useAttribute(ref, "role", props.role);
9578 const isCompositeRole = role === "listbox" || role === "tree" || role === "grid";
9579 const ariaMultiSelectable = isCompositeRole ? multiSelectable || void 0 : void 0;
9580 const [hasListboxInside, setHasListboxInside] = (0, import_react20.useState)(false);
9581 const contentElement = store.useState("contentElement");
9582 useSafeLayoutEffect(() => {
9583 if (!mounted) return;
9584 const element = ref.current;
9585 if (!element) return;
9586 if (contentElement !== element) return;
9587 const callback = () => {
9588 setHasListboxInside(!!element.querySelector("[role='listbox']"));
9589 };
9590 const observer = new MutationObserver(callback);
9591 observer.observe(element, {
9592 subtree: true,
9593 childList: true,
9594 attributeFilter: ["role"]
9595 });
9596 callback();
9597 return () => observer.disconnect();
9598 }, [mounted, contentElement]);
9599 if (!hasListboxInside) {
9600 props = {
9601 role: "listbox",
9602 "aria-multiselectable": ariaMultiSelectable,
9603 ...props
9604 };
9605 }
9606 props = useWrapElement(
9607 props,
9608 (element) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(ComboboxScopedContextProvider, { value: store, children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(ComboboxListRoleContext.Provider, { value: role, children: element }) }),
9609 [store, role]
9610 );
9611 const setContentElement = id && (!scopedContext || !scopedContextSameStore) ? store.setContentElement : null;
9612 props = {
9613 id,
9614 hidden,
9615 ...props,
9616 ref: useMergeRefs(setContentElement, ref, props.ref),
9617 style
9618 };
9619 return removeUndefinedValues(props);
9620 }
9621 );
9622 var ComboboxList = forwardRef22(function ComboboxList2(props) {
9623 const htmlProps = useComboboxList(props);
9624 return createElement3(TagName13, htmlProps);
9625 });
9626
9627 // node_modules/@ariakit/react-core/esm/__chunks/XSIEPKGA.js
9628 var import_react21 = __toESM(require_react(), 1);
9629 var TagValueContext = (0, import_react21.createContext)(null);
9630 var TagRemoveIdContext = (0, import_react21.createContext)(
9631 null
9632 );
9633 var ctx7 = createStoreContext(
9634 [CompositeContextProvider],
9635 [CompositeScopedContextProvider]
9636 );
9637 var useTagContext = ctx7.useContext;
9638 var useTagScopedContext = ctx7.useScopedContext;
9639 var useTagProviderContext = ctx7.useProviderContext;
9640 var TagContextProvider = ctx7.ContextProvider;
9641 var TagScopedContextProvider = ctx7.ScopedContextProvider;
9642
9643 // node_modules/@ariakit/core/esm/combobox/combobox-store.js
9644 var isTouchSafari = isSafari() && isTouchDevice();
9645 function createComboboxStore({
9646 tag,
9647 ...props
9648 } = {}) {
9649 const store = mergeStore(props.store, pick2(tag, ["value", "rtl"]));
9650 throwOnConflictingProps(props, store);
9651 const tagState = tag == null ? void 0 : tag.getState();
9652 const syncState = store == null ? void 0 : store.getState();
9653 const activeId = defaultValue(
9654 props.activeId,
9655 syncState == null ? void 0 : syncState.activeId,
9656 props.defaultActiveId,
9657 null
9658 );
9659 const composite = createCompositeStore({
9660 ...props,
9661 activeId,
9662 includesBaseElement: defaultValue(
9663 props.includesBaseElement,
9664 syncState == null ? void 0 : syncState.includesBaseElement,
9665 true
9666 ),
9667 orientation: defaultValue(
9668 props.orientation,
9669 syncState == null ? void 0 : syncState.orientation,
9670 "vertical"
9671 ),
9672 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true),
9673 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, true),
9674 virtualFocus: defaultValue(
9675 props.virtualFocus,
9676 syncState == null ? void 0 : syncState.virtualFocus,
9677 true
9678 )
9679 });
9680 const popover = createPopoverStore({
9681 ...props,
9682 placement: defaultValue(
9683 props.placement,
9684 syncState == null ? void 0 : syncState.placement,
9685 "bottom-start"
9686 )
9687 });
9688 const value = defaultValue(
9689 props.value,
9690 syncState == null ? void 0 : syncState.value,
9691 props.defaultValue,
9692 ""
9693 );
9694 const selectedValue = defaultValue(
9695 props.selectedValue,
9696 syncState == null ? void 0 : syncState.selectedValue,
9697 tagState == null ? void 0 : tagState.values,
9698 props.defaultSelectedValue,
9699 ""
9700 );
9701 const multiSelectable = Array.isArray(selectedValue);
9702 const initialState = {
9703 ...composite.getState(),
9704 ...popover.getState(),
9705 value,
9706 selectedValue,
9707 resetValueOnSelect: defaultValue(
9708 props.resetValueOnSelect,
9709 syncState == null ? void 0 : syncState.resetValueOnSelect,
9710 multiSelectable
9711 ),
9712 resetValueOnHide: defaultValue(
9713 props.resetValueOnHide,
9714 syncState == null ? void 0 : syncState.resetValueOnHide,
9715 multiSelectable && !tag
9716 ),
9717 activeValue: syncState == null ? void 0 : syncState.activeValue
9718 };
9719 const combobox = createStore(initialState, composite, popover, store);
9720 if (isTouchSafari) {
9721 setup(
9722 combobox,
9723 () => sync(combobox, ["virtualFocus"], () => {
9724 combobox.setState("virtualFocus", false);
9725 })
9726 );
9727 }
9728 setup(combobox, () => {
9729 if (!tag) return;
9730 return chain(
9731 sync(combobox, ["selectedValue"], (state) => {
9732 if (!Array.isArray(state.selectedValue)) return;
9733 tag.setValues(state.selectedValue);
9734 }),
9735 sync(tag, ["values"], (state) => {
9736 combobox.setState("selectedValue", state.values);
9737 })
9738 );
9739 });
9740 setup(
9741 combobox,
9742 () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => {
9743 if (!state.resetValueOnHide) return;
9744 if (state.mounted) return;
9745 combobox.setState("value", value);
9746 })
9747 );
9748 setup(
9749 combobox,
9750 () => sync(combobox, ["open"], (state) => {
9751 if (state.open) return;
9752 combobox.setState("activeId", activeId);
9753 combobox.setState("moves", 0);
9754 })
9755 );
9756 setup(
9757 combobox,
9758 () => sync(combobox, ["moves", "activeId"], (state, prevState) => {
9759 if (state.moves === prevState.moves) {
9760 combobox.setState("activeValue", void 0);
9761 }
9762 })
9763 );
9764 setup(
9765 combobox,
9766 () => batch(combobox, ["moves", "renderedItems"], (state, prev) => {
9767 if (state.moves === prev.moves) return;
9768 const { activeId: activeId2 } = combobox.getState();
9769 const activeItem = composite.item(activeId2);
9770 combobox.setState("activeValue", activeItem == null ? void 0 : activeItem.value);
9771 })
9772 );
9773 return {
9774 ...popover,
9775 ...composite,
9776 ...combobox,
9777 tag,
9778 setValue: (value2) => combobox.setState("value", value2),
9779 resetValue: () => combobox.setState("value", initialState.value),
9780 setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2)
9781 };
9782 }
9783
9784 // node_modules/@ariakit/react-core/esm/__chunks/SVN33SY6.js
9785 function useComboboxStoreOptions(props) {
9786 const tag = useTagContext();
9787 props = {
9788 ...props,
9789 tag: props.tag !== void 0 ? props.tag : tag
9790 };
9791 return useCompositeStoreOptions(props);
9792 }
9793 function useComboboxStoreProps(store, update2, props) {
9794 useUpdateEffect(update2, [props.tag]);
9795 useStoreProps(store, props, "value", "setValue");
9796 useStoreProps(store, props, "selectedValue", "setSelectedValue");
9797 useStoreProps(store, props, "resetValueOnHide");
9798 useStoreProps(store, props, "resetValueOnSelect");
9799 return Object.assign(
9800 useCompositeStoreProps(
9801 usePopoverStoreProps(store, update2, props),
9802 update2,
9803 props
9804 ),
9805 { tag: props.tag }
9806 );
9807 }
9808 function useComboboxStore(props = {}) {
9809 props = useComboboxStoreOptions(props);
9810 const [store, update2] = useStore(createComboboxStore, props);
9811 return useComboboxStoreProps(store, update2, props);
9812 }
9813
9814 // node_modules/@ariakit/react-core/esm/combobox/combobox-provider.js
9815 var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1);
9816 function ComboboxProvider(props = {}) {
9817 const store = useComboboxStore(props);
9818 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ComboboxContextProvider, { value: store, children: props.children });
9819 }
9820
9821 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
9822 var import_remove_accents = __toESM(require_remove_accents(), 1);
9823 var import_compose8 = __toESM(require_compose(), 1);
9824 var import_i18n22 = __toESM(require_i18n(), 1);
9825 var import_element25 = __toESM(require_element(), 1);
9826 var import_components19 = __toESM(require_components(), 1);
9827
9828 // packages/dataviews/build-module/components/dataviews-filters/utils.mjs
9829 var EMPTY_ARRAY3 = [];
9830 var getCurrentValue = (filterDefinition, currentFilter) => {
9831 if (filterDefinition.singleSelection) {
9832 return currentFilter?.value;
9833 }
9834 if (Array.isArray(currentFilter?.value)) {
9835 return currentFilter.value;
9836 }
9837 if (!Array.isArray(currentFilter?.value) && !!currentFilter?.value) {
9838 return [currentFilter.value];
9839 }
9840 return EMPTY_ARRAY3;
9841 };
9842
9843 // packages/dataviews/build-module/hooks/use-elements.mjs
9844 var import_element24 = __toESM(require_element(), 1);
9845 var EMPTY_ARRAY4 = [];
9846 function useElements({
9847 elements,
9848 getElements
9849 }) {
9850 const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY4;
9851 const [records, setRecords] = (0, import_element24.useState)(staticElements);
9852 const [isLoading, setIsLoading] = (0, import_element24.useState)(false);
9853 (0, import_element24.useEffect)(() => {
9854 if (!getElements) {
9855 setRecords(staticElements);
9856 return;
9857 }
9858 let cancelled = false;
9859 setIsLoading(true);
9860 getElements().then((fetchedElements) => {
9861 if (!cancelled) {
9862 const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements;
9863 setRecords(dynamicElements);
9864 }
9865 }).catch(() => {
9866 if (!cancelled) {
9867 setRecords(staticElements);
9868 }
9869 }).finally(() => {
9870 if (!cancelled) {
9871 setIsLoading(false);
9872 }
9873 });
9874 return () => {
9875 cancelled = true;
9876 };
9877 }, [getElements, staticElements]);
9878 return {
9879 elements: records,
9880 isLoading
9881 };
9882 }
9883
9884 // packages/dataviews/build-module/components/dataviews-filters/search-widget.mjs
9885 var import_jsx_runtime54 = __toESM(require_jsx_runtime(), 1);
9886 function normalizeSearchInput(input = "") {
9887 return (0, import_remove_accents.default)(input.trim().toLowerCase());
9888 }
9889 var getNewValue = (filterDefinition, currentFilter, value) => {
9890 if (filterDefinition.singleSelection) {
9891 return value;
9892 }
9893 if (Array.isArray(currentFilter?.value)) {
9894 return currentFilter.value.includes(value) ? currentFilter.value.filter((v2) => v2 !== value) : [...currentFilter.value, value];
9895 }
9896 return [value];
9897 };
9898 function generateFilterElementCompositeItemId(prefix, filterElementValue) {
9899 return `${prefix}-${filterElementValue}`;
9900 }
9901 var MultiSelectionOption = ({ selected }) => {
9902 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
9903 "span",
9904 {
9905 className: clsx_default(
9906 "dataviews-filters__search-widget-listitem-multi-selection",
9907 { "is-selected": selected }
9908 ),
9909 children: selected && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components19.Icon, { icon: check_default })
9910 }
9911 );
9912 };
9913 var SingleSelectionOption = ({ selected }) => {
9914 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
9915 "span",
9916 {
9917 className: clsx_default(
9918 "dataviews-filters__search-widget-listitem-single-selection",
9919 { "is-selected": selected }
9920 )
9921 }
9922 );
9923 };
9924 function ListBox({ view, filter, onChangeView }) {
9925 const baseId = (0, import_compose8.useInstanceId)(ListBox, "dataviews-filter-list-box");
9926 const [activeCompositeId, setActiveCompositeId] = (0, import_element25.useState)(
9927 // When there are one or less operators, the first item is set as active
9928 // (by setting the initial `activeId` to `undefined`).
9929 // With 2 or more operators, the focus is moved on the operators control
9930 // (by setting the initial `activeId` to `null`), meaning that there won't
9931 // be an active item initially. Focus is then managed via the
9932 // `onFocusVisible` callback.
9933 filter.operators?.length === 1 ? void 0 : null
9934 );
9935 const currentFilter = view.filters?.find(
9936 (f2) => f2.field === filter.field
9937 );
9938 const currentValue = getCurrentValue(filter, currentFilter);
9939 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
9940 import_components19.Composite,
9941 {
9942 virtualFocus: true,
9943 focusLoop: true,
9944 activeId: activeCompositeId,
9945 setActiveId: setActiveCompositeId,
9946 role: "listbox",
9947 className: "dataviews-filters__search-widget-listbox",
9948 "aria-label": (0, import_i18n22.sprintf)(
9949 /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */
9950 (0, import_i18n22.__)("List of: %1$s"),
9951 filter.name
9952 ),
9953 onFocusVisible: () => {
9954 if (!activeCompositeId && filter.elements.length) {
9955 setActiveCompositeId(
9956 generateFilterElementCompositeItemId(
9957 baseId,
9958 filter.elements[0].value
9959 )
9960 );
9961 }
9962 },
9963 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components19.Composite.Typeahead, {}),
9964 children: filter.elements.map((element) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
9965 import_components19.Composite.Hover,
9966 {
9967 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
9968 import_components19.Composite.Item,
9969 {
9970 id: generateFilterElementCompositeItemId(
9971 baseId,
9972 element.value
9973 ),
9974 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
9975 "div",
9976 {
9977 "aria-label": element.label,
9978 role: "option",
9979 className: "dataviews-filters__search-widget-listitem"
9980 }
9981 ),
9982 onClick: () => {
9983 const newFilters = currentFilter ? [
9984 ...(view.filters ?? []).map(
9985 (_filter) => {
9986 if (_filter.field === filter.field) {
9987 return {
9988 ..._filter,
9989 operator: currentFilter.operator || filter.operators[0],
9990 value: getNewValue(
9991 filter,
9992 currentFilter,
9993 element.value
9994 )
9995 };
9996 }
9997 return _filter;
9998 }
9999 )
10000 ] : [
10001 ...view.filters ?? [],
10002 {
10003 field: filter.field,
10004 operator: filter.operators[0],
10005 value: getNewValue(
10006 filter,
10007 currentFilter,
10008 element.value
10009 )
10010 }
10011 ];
10012 onChangeView({
10013 ...view,
10014 page: 1,
10015 filters: newFilters
10016 });
10017 }
10018 }
10019 ),
10020 children: [
10021 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10022 SingleSelectionOption,
10023 {
10024 selected: currentValue === element.value
10025 }
10026 ),
10027 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10028 MultiSelectionOption,
10029 {
10030 selected: currentValue.includes(element.value)
10031 }
10032 ),
10033 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10034 "span",
10035 {
10036 className: "dataviews-filters__search-widget-listitem-value",
10037 title: element.label,
10038 children: element.label
10039 }
10040 )
10041 ]
10042 },
10043 element.value
10044 ))
10045 }
10046 );
10047 }
10048 function ComboboxList22({ view, filter, onChangeView }) {
10049 const [searchValue, setSearchValue] = (0, import_element25.useState)("");
10050 const deferredSearchValue = (0, import_element25.useDeferredValue)(searchValue);
10051 const currentFilter = view.filters?.find(
10052 (_filter) => _filter.field === filter.field
10053 );
10054 const currentValue = getCurrentValue(filter, currentFilter);
10055 const matches = (0, import_element25.useMemo)(() => {
10056 const normalizedSearch = normalizeSearchInput(deferredSearchValue);
10057 return filter.elements.filter(
10058 (item) => normalizeSearchInput(item.label).includes(normalizedSearch)
10059 );
10060 }, [filter.elements, deferredSearchValue]);
10061 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
10062 ComboboxProvider,
10063 {
10064 selectedValue: currentValue,
10065 setSelectedValue: (value) => {
10066 const newFilters = currentFilter ? [
10067 ...(view.filters ?? []).map((_filter) => {
10068 if (_filter.field === filter.field) {
10069 return {
10070 ..._filter,
10071 operator: currentFilter.operator || filter.operators[0],
10072 value
10073 };
10074 }
10075 return _filter;
10076 })
10077 ] : [
10078 ...view.filters ?? [],
10079 {
10080 field: filter.field,
10081 operator: filter.operators[0],
10082 value
10083 }
10084 ];
10085 onChangeView({
10086 ...view,
10087 page: 1,
10088 filters: newFilters
10089 });
10090 },
10091 setValue: setSearchValue,
10092 children: [
10093 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "dataviews-filters__search-widget-filter-combobox__wrapper", children: [
10094 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10095 ComboboxLabel,
10096 {
10097 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components19.VisuallyHidden, { children: (0, import_i18n22.__)("Search items") }),
10098 children: (0, import_i18n22.__)("Search items")
10099 }
10100 ),
10101 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10102 Combobox,
10103 {
10104 autoSelect: "always",
10105 placeholder: (0, import_i18n22.__)("Search"),
10106 className: "dataviews-filters__search-widget-filter-combobox__input"
10107 }
10108 ),
10109 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-filters__search-widget-filter-combobox__icon", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components19.Icon, { icon: search_default }) })
10110 ] }),
10111 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
10112 ComboboxList,
10113 {
10114 className: "dataviews-filters__search-widget-filter-combobox-list",
10115 alwaysVisible: true,
10116 children: [
10117 matches.map((element) => {
10118 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
10119 ComboboxItem,
10120 {
10121 resetValueOnSelect: false,
10122 value: element.value,
10123 className: "dataviews-filters__search-widget-listitem",
10124 hideOnClick: false,
10125 setValueOnClick: false,
10126 focusOnHover: true,
10127 children: [
10128 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10129 SingleSelectionOption,
10130 {
10131 selected: currentValue === element.value
10132 }
10133 ),
10134 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10135 MultiSelectionOption,
10136 {
10137 selected: currentValue.includes(
10138 element.value
10139 )
10140 }
10141 ),
10142 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
10143 "span",
10144 {
10145 className: "dataviews-filters__search-widget-listitem-value",
10146 title: element.label,
10147 children: [
10148 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
10149 ComboboxItemValue,
10150 {
10151 className: "dataviews-filters__search-widget-filter-combobox-item-value",
10152 value: element.label
10153 }
10154 ),
10155 !!element.description && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "dataviews-filters__search-widget-listitem-description", children: element.description })
10156 ]
10157 }
10158 )
10159 ]
10160 },
10161 element.value
10162 );
10163 }),
10164 !matches.length && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { children: (0, import_i18n22.__)("No results found") })
10165 ]
10166 }
10167 )
10168 ]
10169 }
10170 );
10171 }
10172 function SearchWidget(props) {
10173 const { elements, isLoading } = useElements({
10174 elements: props.filter.elements,
10175 getElements: props.filter.getElements
10176 });
10177 if (isLoading) {
10178 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components19.Spinner, {}) });
10179 }
10180 if (elements.length === 0) {
10181 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: (0, import_i18n22.__)("No elements found") });
10182 }
10183 const Widget = elements.length > 10 ? ComboboxList22 : ListBox;
10184 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Widget, { ...props, filter: { ...props.filter, elements } });
10185 }
10186
10187 // packages/dataviews/build-module/components/dataviews-filters/input-widget.mjs
10188 var import_es6 = __toESM(require_es6(), 1);
10189 var import_compose9 = __toESM(require_compose(), 1);
10190 var import_element26 = __toESM(require_element(), 1);
10191 var import_components20 = __toESM(require_components(), 1);
10192 var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1);
10193 function InputWidget({
10194 filter,
10195 view,
10196 onChangeView,
10197 fields
10198 }) {
10199 const currentFilter = view.filters?.find(
10200 (f2) => f2.field === filter.field
10201 );
10202 const currentValue = getCurrentValue(filter, currentFilter);
10203 const field = (0, import_element26.useMemo)(() => {
10204 const currentField = fields.find((f2) => f2.id === filter.field);
10205 if (currentField) {
10206 return {
10207 ...currentField,
10208 // Deactivate validation for filters.
10209 isValid: {},
10210 // Configure getValue/setValue as if Item was a plain object.
10211 getValue: ({ item }) => item[currentField.id],
10212 setValue: ({ value }) => ({
10213 [currentField.id]: value
10214 })
10215 };
10216 }
10217 return currentField;
10218 }, [fields, filter.field]);
10219 const data = (0, import_element26.useMemo)(() => {
10220 return (view.filters ?? []).reduce(
10221 (acc, activeFilter) => {
10222 acc[activeFilter.field] = activeFilter.value;
10223 return acc;
10224 },
10225 {}
10226 );
10227 }, [view.filters]);
10228 const handleChange = (0, import_compose9.useEvent)((updatedData) => {
10229 if (!field || !currentFilter) {
10230 return;
10231 }
10232 const nextValue = field.getValue({ item: updatedData });
10233 if ((0, import_es6.default)(nextValue, currentValue)) {
10234 return;
10235 }
10236 onChangeView({
10237 ...view,
10238 filters: (view.filters ?? []).map(
10239 (_filter) => _filter.field === filter.field ? {
10240 ..._filter,
10241 operator: currentFilter.operator || filter.operators[0],
10242 // Consider empty strings as undefined:
10243 //
10244 // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records
10245 // - empty string as value means "search empty string": returns only the records that have an empty string as value
10246 //
10247 // In practice, this means the filter will not be able to find an empty string as the value.
10248 value: nextValue === "" ? void 0 : nextValue
10249 } : _filter
10250 )
10251 });
10252 });
10253 if (!field || !field.Edit || !currentFilter) {
10254 return null;
10255 }
10256 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10257 import_components20.Flex,
10258 {
10259 className: "dataviews-filters__user-input-widget",
10260 gap: 2.5,
10261 direction: "column",
10262 children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
10263 field.Edit,
10264 {
10265 hideLabelFromVision: true,
10266 data,
10267 field,
10268 operator: currentFilter.operator,
10269 onChange: handleChange
10270 }
10271 )
10272 }
10273 );
10274 }
10275
10276 // packages/dataviews/node_modules/date-fns/constants.js
10277 var daysInYear = 365.2425;
10278 var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3;
10279 var minTime = -maxTime;
10280 var millisecondsInWeek = 6048e5;
10281 var millisecondsInDay = 864e5;
10282 var secondsInHour = 3600;
10283 var secondsInDay = secondsInHour * 24;
10284 var secondsInWeek = secondsInDay * 7;
10285 var secondsInYear = secondsInDay * daysInYear;
10286 var secondsInMonth = secondsInYear / 12;
10287 var secondsInQuarter = secondsInMonth * 3;
10288 var constructFromSymbol = /* @__PURE__ */ Symbol.for("constructDateFrom");
10289
10290 // packages/dataviews/node_modules/date-fns/constructFrom.js
10291 function constructFrom(date, value) {
10292 if (typeof date === "function") return date(value);
10293 if (date && typeof date === "object" && constructFromSymbol in date)
10294 return date[constructFromSymbol](value);
10295 if (date instanceof Date) return new date.constructor(value);
10296 return new Date(value);
10297 }
10298
10299 // packages/dataviews/node_modules/date-fns/toDate.js
10300 function toDate(argument, context) {
10301 return constructFrom(context || argument, argument);
10302 }
10303
10304 // packages/dataviews/node_modules/date-fns/addDays.js
10305 function addDays(date, amount, options) {
10306 const _date = toDate(date, options?.in);
10307 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
10308 if (!amount) return _date;
10309 _date.setDate(_date.getDate() + amount);
10310 return _date;
10311 }
10312
10313 // packages/dataviews/node_modules/date-fns/addMonths.js
10314 function addMonths(date, amount, options) {
10315 const _date = toDate(date, options?.in);
10316 if (isNaN(amount)) return constructFrom(options?.in || date, NaN);
10317 if (!amount) {
10318 return _date;
10319 }
10320 const dayOfMonth = _date.getDate();
10321 const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());
10322 endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
10323 const daysInMonth = endOfDesiredMonth.getDate();
10324 if (dayOfMonth >= daysInMonth) {
10325 return endOfDesiredMonth;
10326 } else {
10327 _date.setFullYear(
10328 endOfDesiredMonth.getFullYear(),
10329 endOfDesiredMonth.getMonth(),
10330 dayOfMonth
10331 );
10332 return _date;
10333 }
10334 }
10335
10336 // packages/dataviews/node_modules/date-fns/_lib/defaultOptions.js
10337 var defaultOptions = {};
10338 function getDefaultOptions() {
10339 return defaultOptions;
10340 }
10341
10342 // packages/dataviews/node_modules/date-fns/startOfWeek.js
10343 function startOfWeek(date, options) {
10344 const defaultOptions2 = getDefaultOptions();
10345 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
10346 const _date = toDate(date, options?.in);
10347 const day = _date.getDay();
10348 const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
10349 _date.setDate(_date.getDate() - diff);
10350 _date.setHours(0, 0, 0, 0);
10351 return _date;
10352 }
10353
10354 // packages/dataviews/node_modules/date-fns/startOfISOWeek.js
10355 function startOfISOWeek(date, options) {
10356 return startOfWeek(date, { ...options, weekStartsOn: 1 });
10357 }
10358
10359 // packages/dataviews/node_modules/date-fns/getISOWeekYear.js
10360 function getISOWeekYear(date, options) {
10361 const _date = toDate(date, options?.in);
10362 const year = _date.getFullYear();
10363 const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);
10364 fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
10365 fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
10366 const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
10367 const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);
10368 fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
10369 fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
10370 const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
10371 if (_date.getTime() >= startOfNextYear.getTime()) {
10372 return year + 1;
10373 } else if (_date.getTime() >= startOfThisYear.getTime()) {
10374 return year;
10375 } else {
10376 return year - 1;
10377 }
10378 }
10379
10380 // packages/dataviews/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js
10381 function getTimezoneOffsetInMilliseconds(date) {
10382 const _date = toDate(date);
10383 const utcDate = new Date(
10384 Date.UTC(
10385 _date.getFullYear(),
10386 _date.getMonth(),
10387 _date.getDate(),
10388 _date.getHours(),
10389 _date.getMinutes(),
10390 _date.getSeconds(),
10391 _date.getMilliseconds()
10392 )
10393 );
10394 utcDate.setUTCFullYear(_date.getFullYear());
10395 return +date - +utcDate;
10396 }
10397
10398 // packages/dataviews/node_modules/date-fns/_lib/normalizeDates.js
10399 function normalizeDates(context, ...dates) {
10400 const normalize = constructFrom.bind(
10401 null,
10402 context || dates.find((date) => typeof date === "object")
10403 );
10404 return dates.map(normalize);
10405 }
10406
10407 // packages/dataviews/node_modules/date-fns/startOfDay.js
10408 function startOfDay(date, options) {
10409 const _date = toDate(date, options?.in);
10410 _date.setHours(0, 0, 0, 0);
10411 return _date;
10412 }
10413
10414 // packages/dataviews/node_modules/date-fns/differenceInCalendarDays.js
10415 function differenceInCalendarDays(laterDate, earlierDate, options) {
10416 const [laterDate_, earlierDate_] = normalizeDates(
10417 options?.in,
10418 laterDate,
10419 earlierDate
10420 );
10421 const laterStartOfDay = startOfDay(laterDate_);
10422 const earlierStartOfDay = startOfDay(earlierDate_);
10423 const laterTimestamp = +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);
10424 const earlierTimestamp = +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);
10425 return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);
10426 }
10427
10428 // packages/dataviews/node_modules/date-fns/startOfISOWeekYear.js
10429 function startOfISOWeekYear(date, options) {
10430 const year = getISOWeekYear(date, options);
10431 const fourthOfJanuary = constructFrom(options?.in || date, 0);
10432 fourthOfJanuary.setFullYear(year, 0, 4);
10433 fourthOfJanuary.setHours(0, 0, 0, 0);
10434 return startOfISOWeek(fourthOfJanuary);
10435 }
10436
10437 // packages/dataviews/node_modules/date-fns/addWeeks.js
10438 function addWeeks(date, amount, options) {
10439 return addDays(date, amount * 7, options);
10440 }
10441
10442 // packages/dataviews/node_modules/date-fns/addYears.js
10443 function addYears(date, amount, options) {
10444 return addMonths(date, amount * 12, options);
10445 }
10446
10447 // packages/dataviews/node_modules/date-fns/isDate.js
10448 function isDate(value) {
10449 return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
10450 }
10451
10452 // packages/dataviews/node_modules/date-fns/isValid.js
10453 function isValid(date) {
10454 return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date)));
10455 }
10456
10457 // packages/dataviews/node_modules/date-fns/startOfMonth.js
10458 function startOfMonth(date, options) {
10459 const _date = toDate(date, options?.in);
10460 _date.setDate(1);
10461 _date.setHours(0, 0, 0, 0);
10462 return _date;
10463 }
10464
10465 // packages/dataviews/node_modules/date-fns/startOfYear.js
10466 function startOfYear(date, options) {
10467 const date_ = toDate(date, options?.in);
10468 date_.setFullYear(date_.getFullYear(), 0, 1);
10469 date_.setHours(0, 0, 0, 0);
10470 return date_;
10471 }
10472
10473 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatDistance.js
10474 var formatDistanceLocale = {
10475 lessThanXSeconds: {
10476 one: "less than a second",
10477 other: "less than {{count}} seconds"
10478 },
10479 xSeconds: {
10480 one: "1 second",
10481 other: "{{count}} seconds"
10482 },
10483 halfAMinute: "half a minute",
10484 lessThanXMinutes: {
10485 one: "less than a minute",
10486 other: "less than {{count}} minutes"
10487 },
10488 xMinutes: {
10489 one: "1 minute",
10490 other: "{{count}} minutes"
10491 },
10492 aboutXHours: {
10493 one: "about 1 hour",
10494 other: "about {{count}} hours"
10495 },
10496 xHours: {
10497 one: "1 hour",
10498 other: "{{count}} hours"
10499 },
10500 xDays: {
10501 one: "1 day",
10502 other: "{{count}} days"
10503 },
10504 aboutXWeeks: {
10505 one: "about 1 week",
10506 other: "about {{count}} weeks"
10507 },
10508 xWeeks: {
10509 one: "1 week",
10510 other: "{{count}} weeks"
10511 },
10512 aboutXMonths: {
10513 one: "about 1 month",
10514 other: "about {{count}} months"
10515 },
10516 xMonths: {
10517 one: "1 month",
10518 other: "{{count}} months"
10519 },
10520 aboutXYears: {
10521 one: "about 1 year",
10522 other: "about {{count}} years"
10523 },
10524 xYears: {
10525 one: "1 year",
10526 other: "{{count}} years"
10527 },
10528 overXYears: {
10529 one: "over 1 year",
10530 other: "over {{count}} years"
10531 },
10532 almostXYears: {
10533 one: "almost 1 year",
10534 other: "almost {{count}} years"
10535 }
10536 };
10537 var formatDistance = (token, count, options) => {
10538 let result;
10539 const tokenValue = formatDistanceLocale[token];
10540 if (typeof tokenValue === "string") {
10541 result = tokenValue;
10542 } else if (count === 1) {
10543 result = tokenValue.one;
10544 } else {
10545 result = tokenValue.other.replace("{{count}}", count.toString());
10546 }
10547 if (options?.addSuffix) {
10548 if (options.comparison && options.comparison > 0) {
10549 return "in " + result;
10550 } else {
10551 return result + " ago";
10552 }
10553 }
10554 return result;
10555 };
10556
10557 // packages/dataviews/node_modules/date-fns/locale/_lib/buildFormatLongFn.js
10558 function buildFormatLongFn(args) {
10559 return (options = {}) => {
10560 const width = options.width ? String(options.width) : args.defaultWidth;
10561 const format6 = args.formats[width] || args.formats[args.defaultWidth];
10562 return format6;
10563 };
10564 }
10565
10566 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatLong.js
10567 var dateFormats = {
10568 full: "EEEE, MMMM do, y",
10569 long: "MMMM do, y",
10570 medium: "MMM d, y",
10571 short: "MM/dd/yyyy"
10572 };
10573 var timeFormats = {
10574 full: "h:mm:ss a zzzz",
10575 long: "h:mm:ss a z",
10576 medium: "h:mm:ss a",
10577 short: "h:mm a"
10578 };
10579 var dateTimeFormats = {
10580 full: "{{date}} 'at' {{time}}",
10581 long: "{{date}} 'at' {{time}}",
10582 medium: "{{date}}, {{time}}",
10583 short: "{{date}}, {{time}}"
10584 };
10585 var formatLong = {
10586 date: buildFormatLongFn({
10587 formats: dateFormats,
10588 defaultWidth: "full"
10589 }),
10590 time: buildFormatLongFn({
10591 formats: timeFormats,
10592 defaultWidth: "full"
10593 }),
10594 dateTime: buildFormatLongFn({
10595 formats: dateTimeFormats,
10596 defaultWidth: "full"
10597 })
10598 };
10599
10600 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatRelative.js
10601 var formatRelativeLocale = {
10602 lastWeek: "'last' eeee 'at' p",
10603 yesterday: "'yesterday at' p",
10604 today: "'today at' p",
10605 tomorrow: "'tomorrow at' p",
10606 nextWeek: "eeee 'at' p",
10607 other: "P"
10608 };
10609 var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
10610
10611 // packages/dataviews/node_modules/date-fns/locale/_lib/buildLocalizeFn.js
10612 function buildLocalizeFn(args) {
10613 return (value, options) => {
10614 const context = options?.context ? String(options.context) : "standalone";
10615 let valuesArray;
10616 if (context === "formatting" && args.formattingValues) {
10617 const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
10618 const width = options?.width ? String(options.width) : defaultWidth;
10619 valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
10620 } else {
10621 const defaultWidth = args.defaultWidth;
10622 const width = options?.width ? String(options.width) : args.defaultWidth;
10623 valuesArray = args.values[width] || args.values[defaultWidth];
10624 }
10625 const index = args.argumentCallback ? args.argumentCallback(value) : value;
10626 return valuesArray[index];
10627 };
10628 }
10629
10630 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/localize.js
10631 var eraValues = {
10632 narrow: ["B", "A"],
10633 abbreviated: ["BC", "AD"],
10634 wide: ["Before Christ", "Anno Domini"]
10635 };
10636 var quarterValues = {
10637 narrow: ["1", "2", "3", "4"],
10638 abbreviated: ["Q1", "Q2", "Q3", "Q4"],
10639 wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
10640 };
10641 var monthValues = {
10642 narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
10643 abbreviated: [
10644 "Jan",
10645 "Feb",
10646 "Mar",
10647 "Apr",
10648 "May",
10649 "Jun",
10650 "Jul",
10651 "Aug",
10652 "Sep",
10653 "Oct",
10654 "Nov",
10655 "Dec"
10656 ],
10657 wide: [
10658 "January",
10659 "February",
10660 "March",
10661 "April",
10662 "May",
10663 "June",
10664 "July",
10665 "August",
10666 "September",
10667 "October",
10668 "November",
10669 "December"
10670 ]
10671 };
10672 var dayValues = {
10673 narrow: ["S", "M", "T", "W", "T", "F", "S"],
10674 short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
10675 abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
10676 wide: [
10677 "Sunday",
10678 "Monday",
10679 "Tuesday",
10680 "Wednesday",
10681 "Thursday",
10682 "Friday",
10683 "Saturday"
10684 ]
10685 };
10686 var dayPeriodValues = {
10687 narrow: {
10688 am: "a",
10689 pm: "p",
10690 midnight: "mi",
10691 noon: "n",
10692 morning: "morning",
10693 afternoon: "afternoon",
10694 evening: "evening",
10695 night: "night"
10696 },
10697 abbreviated: {
10698 am: "AM",
10699 pm: "PM",
10700 midnight: "midnight",
10701 noon: "noon",
10702 morning: "morning",
10703 afternoon: "afternoon",
10704 evening: "evening",
10705 night: "night"
10706 },
10707 wide: {
10708 am: "a.m.",
10709 pm: "p.m.",
10710 midnight: "midnight",
10711 noon: "noon",
10712 morning: "morning",
10713 afternoon: "afternoon",
10714 evening: "evening",
10715 night: "night"
10716 }
10717 };
10718 var formattingDayPeriodValues = {
10719 narrow: {
10720 am: "a",
10721 pm: "p",
10722 midnight: "mi",
10723 noon: "n",
10724 morning: "in the morning",
10725 afternoon: "in the afternoon",
10726 evening: "in the evening",
10727 night: "at night"
10728 },
10729 abbreviated: {
10730 am: "AM",
10731 pm: "PM",
10732 midnight: "midnight",
10733 noon: "noon",
10734 morning: "in the morning",
10735 afternoon: "in the afternoon",
10736 evening: "in the evening",
10737 night: "at night"
10738 },
10739 wide: {
10740 am: "a.m.",
10741 pm: "p.m.",
10742 midnight: "midnight",
10743 noon: "noon",
10744 morning: "in the morning",
10745 afternoon: "in the afternoon",
10746 evening: "in the evening",
10747 night: "at night"
10748 }
10749 };
10750 var ordinalNumber = (dirtyNumber, _options) => {
10751 const number = Number(dirtyNumber);
10752 const rem100 = number % 100;
10753 if (rem100 > 20 || rem100 < 10) {
10754 switch (rem100 % 10) {
10755 case 1:
10756 return number + "st";
10757 case 2:
10758 return number + "nd";
10759 case 3:
10760 return number + "rd";
10761 }
10762 }
10763 return number + "th";
10764 };
10765 var localize = {
10766 ordinalNumber,
10767 era: buildLocalizeFn({
10768 values: eraValues,
10769 defaultWidth: "wide"
10770 }),
10771 quarter: buildLocalizeFn({
10772 values: quarterValues,
10773 defaultWidth: "wide",
10774 argumentCallback: (quarter) => quarter - 1
10775 }),
10776 month: buildLocalizeFn({
10777 values: monthValues,
10778 defaultWidth: "wide"
10779 }),
10780 day: buildLocalizeFn({
10781 values: dayValues,
10782 defaultWidth: "wide"
10783 }),
10784 dayPeriod: buildLocalizeFn({
10785 values: dayPeriodValues,
10786 defaultWidth: "wide",
10787 formattingValues: formattingDayPeriodValues,
10788 defaultFormattingWidth: "wide"
10789 })
10790 };
10791
10792 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchFn.js
10793 function buildMatchFn(args) {
10794 return (string, options = {}) => {
10795 const width = options.width;
10796 const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
10797 const matchResult = string.match(matchPattern);
10798 if (!matchResult) {
10799 return null;
10800 }
10801 const matchedString = matchResult[0];
10802 const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
10803 const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : (
10804 // [TODO] -- I challenge you to fix the type
10805 findKey(parsePatterns, (pattern) => pattern.test(matchedString))
10806 );
10807 let value;
10808 value = args.valueCallback ? args.valueCallback(key) : key;
10809 value = options.valueCallback ? (
10810 // [TODO] -- I challenge you to fix the type
10811 options.valueCallback(value)
10812 ) : value;
10813 const rest = string.slice(matchedString.length);
10814 return { value, rest };
10815 };
10816 }
10817 function findKey(object, predicate) {
10818 for (const key in object) {
10819 if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) {
10820 return key;
10821 }
10822 }
10823 return void 0;
10824 }
10825 function findIndex(array, predicate) {
10826 for (let key = 0; key < array.length; key++) {
10827 if (predicate(array[key])) {
10828 return key;
10829 }
10830 }
10831 return void 0;
10832 }
10833
10834 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
10835 function buildMatchPatternFn(args) {
10836 return (string, options = {}) => {
10837 const matchResult = string.match(args.matchPattern);
10838 if (!matchResult) return null;
10839 const matchedString = matchResult[0];
10840 const parseResult = string.match(args.parsePattern);
10841 if (!parseResult) return null;
10842 let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
10843 value = options.valueCallback ? options.valueCallback(value) : value;
10844 const rest = string.slice(matchedString.length);
10845 return { value, rest };
10846 };
10847 }
10848
10849 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/match.js
10850 var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
10851 var parseOrdinalNumberPattern = /\d+/i;
10852 var matchEraPatterns = {
10853 narrow: /^(b|a)/i,
10854 abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
10855 wide: /^(before christ|before common era|anno domini|common era)/i
10856 };
10857 var parseEraPatterns = {
10858 any: [/^b/i, /^(a|c)/i]
10859 };
10860 var matchQuarterPatterns = {
10861 narrow: /^[1234]/i,
10862 abbreviated: /^q[1234]/i,
10863 wide: /^[1234](th|st|nd|rd)? quarter/i
10864 };
10865 var parseQuarterPatterns = {
10866 any: [/1/i, /2/i, /3/i, /4/i]
10867 };
10868 var matchMonthPatterns = {
10869 narrow: /^[jfmasond]/i,
10870 abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
10871 wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
10872 };
10873 var parseMonthPatterns = {
10874 narrow: [
10875 /^j/i,
10876 /^f/i,
10877 /^m/i,
10878 /^a/i,
10879 /^m/i,
10880 /^j/i,
10881 /^j/i,
10882 /^a/i,
10883 /^s/i,
10884 /^o/i,
10885 /^n/i,
10886 /^d/i
10887 ],
10888 any: [
10889 /^ja/i,
10890 /^f/i,
10891 /^mar/i,
10892 /^ap/i,
10893 /^may/i,
10894 /^jun/i,
10895 /^jul/i,
10896 /^au/i,
10897 /^s/i,
10898 /^o/i,
10899 /^n/i,
10900 /^d/i
10901 ]
10902 };
10903 var matchDayPatterns = {
10904 narrow: /^[smtwf]/i,
10905 short: /^(su|mo|tu|we|th|fr|sa)/i,
10906 abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
10907 wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
10908 };
10909 var parseDayPatterns = {
10910 narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
10911 any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
10912 };
10913 var matchDayPeriodPatterns = {
10914 narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
10915 any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
10916 };
10917 var parseDayPeriodPatterns = {
10918 any: {
10919 am: /^a/i,
10920 pm: /^p/i,
10921 midnight: /^mi/i,
10922 noon: /^no/i,
10923 morning: /morning/i,
10924 afternoon: /afternoon/i,
10925 evening: /evening/i,
10926 night: /night/i
10927 }
10928 };
10929 var match = {
10930 ordinalNumber: buildMatchPatternFn({
10931 matchPattern: matchOrdinalNumberPattern,
10932 parsePattern: parseOrdinalNumberPattern,
10933 valueCallback: (value) => parseInt(value, 10)
10934 }),
10935 era: buildMatchFn({
10936 matchPatterns: matchEraPatterns,
10937 defaultMatchWidth: "wide",
10938 parsePatterns: parseEraPatterns,
10939 defaultParseWidth: "any"
10940 }),
10941 quarter: buildMatchFn({
10942 matchPatterns: matchQuarterPatterns,
10943 defaultMatchWidth: "wide",
10944 parsePatterns: parseQuarterPatterns,
10945 defaultParseWidth: "any",
10946 valueCallback: (index) => index + 1
10947 }),
10948 month: buildMatchFn({
10949 matchPatterns: matchMonthPatterns,
10950 defaultMatchWidth: "wide",
10951 parsePatterns: parseMonthPatterns,
10952 defaultParseWidth: "any"
10953 }),
10954 day: buildMatchFn({
10955 matchPatterns: matchDayPatterns,
10956 defaultMatchWidth: "wide",
10957 parsePatterns: parseDayPatterns,
10958 defaultParseWidth: "any"
10959 }),
10960 dayPeriod: buildMatchFn({
10961 matchPatterns: matchDayPeriodPatterns,
10962 defaultMatchWidth: "any",
10963 parsePatterns: parseDayPeriodPatterns,
10964 defaultParseWidth: "any"
10965 })
10966 };
10967
10968 // packages/dataviews/node_modules/date-fns/locale/en-US.js
10969 var enUS = {
10970 code: "en-US",
10971 formatDistance,
10972 formatLong,
10973 formatRelative,
10974 localize,
10975 match,
10976 options: {
10977 weekStartsOn: 0,
10978 firstWeekContainsDate: 1
10979 }
10980 };
10981
10982 // packages/dataviews/node_modules/date-fns/getDayOfYear.js
10983 function getDayOfYear(date, options) {
10984 const _date = toDate(date, options?.in);
10985 const diff = differenceInCalendarDays(_date, startOfYear(_date));
10986 const dayOfYear = diff + 1;
10987 return dayOfYear;
10988 }
10989
10990 // packages/dataviews/node_modules/date-fns/getISOWeek.js
10991 function getISOWeek(date, options) {
10992 const _date = toDate(date, options?.in);
10993 const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
10994 return Math.round(diff / millisecondsInWeek) + 1;
10995 }
10996
10997 // packages/dataviews/node_modules/date-fns/getWeekYear.js
10998 function getWeekYear(date, options) {
10999 const _date = toDate(date, options?.in);
11000 const year = _date.getFullYear();
11001 const defaultOptions2 = getDefaultOptions();
11002 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
11003 const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
11004 firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
11005 firstWeekOfNextYear.setHours(0, 0, 0, 0);
11006 const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
11007 const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
11008 firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
11009 firstWeekOfThisYear.setHours(0, 0, 0, 0);
11010 const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
11011 if (+_date >= +startOfNextYear) {
11012 return year + 1;
11013 } else if (+_date >= +startOfThisYear) {
11014 return year;
11015 } else {
11016 return year - 1;
11017 }
11018 }
11019
11020 // packages/dataviews/node_modules/date-fns/startOfWeekYear.js
11021 function startOfWeekYear(date, options) {
11022 const defaultOptions2 = getDefaultOptions();
11023 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
11024 const year = getWeekYear(date, options);
11025 const firstWeek = constructFrom(options?.in || date, 0);
11026 firstWeek.setFullYear(year, 0, firstWeekContainsDate);
11027 firstWeek.setHours(0, 0, 0, 0);
11028 const _date = startOfWeek(firstWeek, options);
11029 return _date;
11030 }
11031
11032 // packages/dataviews/node_modules/date-fns/getWeek.js
11033 function getWeek(date, options) {
11034 const _date = toDate(date, options?.in);
11035 const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
11036 return Math.round(diff / millisecondsInWeek) + 1;
11037 }
11038
11039 // packages/dataviews/node_modules/date-fns/_lib/addLeadingZeros.js
11040 function addLeadingZeros(number, targetLength) {
11041 const sign = number < 0 ? "-" : "";
11042 const output = Math.abs(number).toString().padStart(targetLength, "0");
11043 return sign + output;
11044 }
11045
11046 // packages/dataviews/node_modules/date-fns/_lib/format/lightFormatters.js
11047 var lightFormatters = {
11048 // Year
11049 y(date, token) {
11050 const signedYear = date.getFullYear();
11051 const year = signedYear > 0 ? signedYear : 1 - signedYear;
11052 return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
11053 },
11054 // Month
11055 M(date, token) {
11056 const month = date.getMonth();
11057 return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
11058 },
11059 // Day of the month
11060 d(date, token) {
11061 return addLeadingZeros(date.getDate(), token.length);
11062 },
11063 // AM or PM
11064 a(date, token) {
11065 const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
11066 switch (token) {
11067 case "a":
11068 case "aa":
11069 return dayPeriodEnumValue.toUpperCase();
11070 case "aaa":
11071 return dayPeriodEnumValue;
11072 case "aaaaa":
11073 return dayPeriodEnumValue[0];
11074 case "aaaa":
11075 default:
11076 return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
11077 }
11078 },
11079 // Hour [1-12]
11080 h(date, token) {
11081 return addLeadingZeros(date.getHours() % 12 || 12, token.length);
11082 },
11083 // Hour [0-23]
11084 H(date, token) {
11085 return addLeadingZeros(date.getHours(), token.length);
11086 },
11087 // Minute
11088 m(date, token) {
11089 return addLeadingZeros(date.getMinutes(), token.length);
11090 },
11091 // Second
11092 s(date, token) {
11093 return addLeadingZeros(date.getSeconds(), token.length);
11094 },
11095 // Fraction of second
11096 S(date, token) {
11097 const numberOfDigits = token.length;
11098 const milliseconds = date.getMilliseconds();
11099 const fractionalSeconds = Math.trunc(
11100 milliseconds * Math.pow(10, numberOfDigits - 3)
11101 );
11102 return addLeadingZeros(fractionalSeconds, token.length);
11103 }
11104 };
11105
11106 // packages/dataviews/node_modules/date-fns/_lib/format/formatters.js
11107 var dayPeriodEnum = {
11108 am: "am",
11109 pm: "pm",
11110 midnight: "midnight",
11111 noon: "noon",
11112 morning: "morning",
11113 afternoon: "afternoon",
11114 evening: "evening",
11115 night: "night"
11116 };
11117 var formatters = {
11118 // Era
11119 G: function(date, token, localize2) {
11120 const era = date.getFullYear() > 0 ? 1 : 0;
11121 switch (token) {
11122 // AD, BC
11123 case "G":
11124 case "GG":
11125 case "GGG":
11126 return localize2.era(era, { width: "abbreviated" });
11127 // A, B
11128 case "GGGGG":
11129 return localize2.era(era, { width: "narrow" });
11130 // Anno Domini, Before Christ
11131 case "GGGG":
11132 default:
11133 return localize2.era(era, { width: "wide" });
11134 }
11135 },
11136 // Year
11137 y: function(date, token, localize2) {
11138 if (token === "yo") {
11139 const signedYear = date.getFullYear();
11140 const year = signedYear > 0 ? signedYear : 1 - signedYear;
11141 return localize2.ordinalNumber(year, { unit: "year" });
11142 }
11143 return lightFormatters.y(date, token);
11144 },
11145 // Local week-numbering year
11146 Y: function(date, token, localize2, options) {
11147 const signedWeekYear = getWeekYear(date, options);
11148 const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
11149 if (token === "YY") {
11150 const twoDigitYear = weekYear % 100;
11151 return addLeadingZeros(twoDigitYear, 2);
11152 }
11153 if (token === "Yo") {
11154 return localize2.ordinalNumber(weekYear, { unit: "year" });
11155 }
11156 return addLeadingZeros(weekYear, token.length);
11157 },
11158 // ISO week-numbering year
11159 R: function(date, token) {
11160 const isoWeekYear = getISOWeekYear(date);
11161 return addLeadingZeros(isoWeekYear, token.length);
11162 },
11163 // Extended year. This is a single number designating the year of this calendar system.
11164 // The main difference between `y` and `u` localizers are B.C. years:
11165 // | Year | `y` | `u` |
11166 // |------|-----|-----|
11167 // | AC 1 | 1 | 1 |
11168 // | BC 1 | 1 | 0 |
11169 // | BC 2 | 2 | -1 |
11170 // Also `yy` always returns the last two digits of a year,
11171 // while `uu` pads single digit years to 2 characters and returns other years unchanged.
11172 u: function(date, token) {
11173 const year = date.getFullYear();
11174 return addLeadingZeros(year, token.length);
11175 },
11176 // Quarter
11177 Q: function(date, token, localize2) {
11178 const quarter = Math.ceil((date.getMonth() + 1) / 3);
11179 switch (token) {
11180 // 1, 2, 3, 4
11181 case "Q":
11182 return String(quarter);
11183 // 01, 02, 03, 04
11184 case "QQ":
11185 return addLeadingZeros(quarter, 2);
11186 // 1st, 2nd, 3rd, 4th
11187 case "Qo":
11188 return localize2.ordinalNumber(quarter, { unit: "quarter" });
11189 // Q1, Q2, Q3, Q4
11190 case "QQQ":
11191 return localize2.quarter(quarter, {
11192 width: "abbreviated",
11193 context: "formatting"
11194 });
11195 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
11196 case "QQQQQ":
11197 return localize2.quarter(quarter, {
11198 width: "narrow",
11199 context: "formatting"
11200 });
11201 // 1st quarter, 2nd quarter, ...
11202 case "QQQQ":
11203 default:
11204 return localize2.quarter(quarter, {
11205 width: "wide",
11206 context: "formatting"
11207 });
11208 }
11209 },
11210 // Stand-alone quarter
11211 q: function(date, token, localize2) {
11212 const quarter = Math.ceil((date.getMonth() + 1) / 3);
11213 switch (token) {
11214 // 1, 2, 3, 4
11215 case "q":
11216 return String(quarter);
11217 // 01, 02, 03, 04
11218 case "qq":
11219 return addLeadingZeros(quarter, 2);
11220 // 1st, 2nd, 3rd, 4th
11221 case "qo":
11222 return localize2.ordinalNumber(quarter, { unit: "quarter" });
11223 // Q1, Q2, Q3, Q4
11224 case "qqq":
11225 return localize2.quarter(quarter, {
11226 width: "abbreviated",
11227 context: "standalone"
11228 });
11229 // 1, 2, 3, 4 (narrow quarter; could be not numerical)
11230 case "qqqqq":
11231 return localize2.quarter(quarter, {
11232 width: "narrow",
11233 context: "standalone"
11234 });
11235 // 1st quarter, 2nd quarter, ...
11236 case "qqqq":
11237 default:
11238 return localize2.quarter(quarter, {
11239 width: "wide",
11240 context: "standalone"
11241 });
11242 }
11243 },
11244 // Month
11245 M: function(date, token, localize2) {
11246 const month = date.getMonth();
11247 switch (token) {
11248 case "M":
11249 case "MM":
11250 return lightFormatters.M(date, token);
11251 // 1st, 2nd, ..., 12th
11252 case "Mo":
11253 return localize2.ordinalNumber(month + 1, { unit: "month" });
11254 // Jan, Feb, ..., Dec
11255 case "MMM":
11256 return localize2.month(month, {
11257 width: "abbreviated",
11258 context: "formatting"
11259 });
11260 // J, F, ..., D
11261 case "MMMMM":
11262 return localize2.month(month, {
11263 width: "narrow",
11264 context: "formatting"
11265 });
11266 // January, February, ..., December
11267 case "MMMM":
11268 default:
11269 return localize2.month(month, { width: "wide", context: "formatting" });
11270 }
11271 },
11272 // Stand-alone month
11273 L: function(date, token, localize2) {
11274 const month = date.getMonth();
11275 switch (token) {
11276 // 1, 2, ..., 12
11277 case "L":
11278 return String(month + 1);
11279 // 01, 02, ..., 12
11280 case "LL":
11281 return addLeadingZeros(month + 1, 2);
11282 // 1st, 2nd, ..., 12th
11283 case "Lo":
11284 return localize2.ordinalNumber(month + 1, { unit: "month" });
11285 // Jan, Feb, ..., Dec
11286 case "LLL":
11287 return localize2.month(month, {
11288 width: "abbreviated",
11289 context: "standalone"
11290 });
11291 // J, F, ..., D
11292 case "LLLLL":
11293 return localize2.month(month, {
11294 width: "narrow",
11295 context: "standalone"
11296 });
11297 // January, February, ..., December
11298 case "LLLL":
11299 default:
11300 return localize2.month(month, { width: "wide", context: "standalone" });
11301 }
11302 },
11303 // Local week of year
11304 w: function(date, token, localize2, options) {
11305 const week = getWeek(date, options);
11306 if (token === "wo") {
11307 return localize2.ordinalNumber(week, { unit: "week" });
11308 }
11309 return addLeadingZeros(week, token.length);
11310 },
11311 // ISO week of year
11312 I: function(date, token, localize2) {
11313 const isoWeek = getISOWeek(date);
11314 if (token === "Io") {
11315 return localize2.ordinalNumber(isoWeek, { unit: "week" });
11316 }
11317 return addLeadingZeros(isoWeek, token.length);
11318 },
11319 // Day of the month
11320 d: function(date, token, localize2) {
11321 if (token === "do") {
11322 return localize2.ordinalNumber(date.getDate(), { unit: "date" });
11323 }
11324 return lightFormatters.d(date, token);
11325 },
11326 // Day of year
11327 D: function(date, token, localize2) {
11328 const dayOfYear = getDayOfYear(date);
11329 if (token === "Do") {
11330 return localize2.ordinalNumber(dayOfYear, { unit: "dayOfYear" });
11331 }
11332 return addLeadingZeros(dayOfYear, token.length);
11333 },
11334 // Day of week
11335 E: function(date, token, localize2) {
11336 const dayOfWeek = date.getDay();
11337 switch (token) {
11338 // Tue
11339 case "E":
11340 case "EE":
11341 case "EEE":
11342 return localize2.day(dayOfWeek, {
11343 width: "abbreviated",
11344 context: "formatting"
11345 });
11346 // T
11347 case "EEEEE":
11348 return localize2.day(dayOfWeek, {
11349 width: "narrow",
11350 context: "formatting"
11351 });
11352 // Tu
11353 case "EEEEEE":
11354 return localize2.day(dayOfWeek, {
11355 width: "short",
11356 context: "formatting"
11357 });
11358 // Tuesday
11359 case "EEEE":
11360 default:
11361 return localize2.day(dayOfWeek, {
11362 width: "wide",
11363 context: "formatting"
11364 });
11365 }
11366 },
11367 // Local day of week
11368 e: function(date, token, localize2, options) {
11369 const dayOfWeek = date.getDay();
11370 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
11371 switch (token) {
11372 // Numerical value (Nth day of week with current locale or weekStartsOn)
11373 case "e":
11374 return String(localDayOfWeek);
11375 // Padded numerical value
11376 case "ee":
11377 return addLeadingZeros(localDayOfWeek, 2);
11378 // 1st, 2nd, ..., 7th
11379 case "eo":
11380 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
11381 case "eee":
11382 return localize2.day(dayOfWeek, {
11383 width: "abbreviated",
11384 context: "formatting"
11385 });
11386 // T
11387 case "eeeee":
11388 return localize2.day(dayOfWeek, {
11389 width: "narrow",
11390 context: "formatting"
11391 });
11392 // Tu
11393 case "eeeeee":
11394 return localize2.day(dayOfWeek, {
11395 width: "short",
11396 context: "formatting"
11397 });
11398 // Tuesday
11399 case "eeee":
11400 default:
11401 return localize2.day(dayOfWeek, {
11402 width: "wide",
11403 context: "formatting"
11404 });
11405 }
11406 },
11407 // Stand-alone local day of week
11408 c: function(date, token, localize2, options) {
11409 const dayOfWeek = date.getDay();
11410 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
11411 switch (token) {
11412 // Numerical value (same as in `e`)
11413 case "c":
11414 return String(localDayOfWeek);
11415 // Padded numerical value
11416 case "cc":
11417 return addLeadingZeros(localDayOfWeek, token.length);
11418 // 1st, 2nd, ..., 7th
11419 case "co":
11420 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" });
11421 case "ccc":
11422 return localize2.day(dayOfWeek, {
11423 width: "abbreviated",
11424 context: "standalone"
11425 });
11426 // T
11427 case "ccccc":
11428 return localize2.day(dayOfWeek, {
11429 width: "narrow",
11430 context: "standalone"
11431 });
11432 // Tu
11433 case "cccccc":
11434 return localize2.day(dayOfWeek, {
11435 width: "short",
11436 context: "standalone"
11437 });
11438 // Tuesday
11439 case "cccc":
11440 default:
11441 return localize2.day(dayOfWeek, {
11442 width: "wide",
11443 context: "standalone"
11444 });
11445 }
11446 },
11447 // ISO day of week
11448 i: function(date, token, localize2) {
11449 const dayOfWeek = date.getDay();
11450 const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
11451 switch (token) {
11452 // 2
11453 case "i":
11454 return String(isoDayOfWeek);
11455 // 02
11456 case "ii":
11457 return addLeadingZeros(isoDayOfWeek, token.length);
11458 // 2nd
11459 case "io":
11460 return localize2.ordinalNumber(isoDayOfWeek, { unit: "day" });
11461 // Tue
11462 case "iii":
11463 return localize2.day(dayOfWeek, {
11464 width: "abbreviated",
11465 context: "formatting"
11466 });
11467 // T
11468 case "iiiii":
11469 return localize2.day(dayOfWeek, {
11470 width: "narrow",
11471 context: "formatting"
11472 });
11473 // Tu
11474 case "iiiiii":
11475 return localize2.day(dayOfWeek, {
11476 width: "short",
11477 context: "formatting"
11478 });
11479 // Tuesday
11480 case "iiii":
11481 default:
11482 return localize2.day(dayOfWeek, {
11483 width: "wide",
11484 context: "formatting"
11485 });
11486 }
11487 },
11488 // AM or PM
11489 a: function(date, token, localize2) {
11490 const hours = date.getHours();
11491 const dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
11492 switch (token) {
11493 case "a":
11494 case "aa":
11495 return localize2.dayPeriod(dayPeriodEnumValue, {
11496 width: "abbreviated",
11497 context: "formatting"
11498 });
11499 case "aaa":
11500 return localize2.dayPeriod(dayPeriodEnumValue, {
11501 width: "abbreviated",
11502 context: "formatting"
11503 }).toLowerCase();
11504 case "aaaaa":
11505 return localize2.dayPeriod(dayPeriodEnumValue, {
11506 width: "narrow",
11507 context: "formatting"
11508 });
11509 case "aaaa":
11510 default:
11511 return localize2.dayPeriod(dayPeriodEnumValue, {
11512 width: "wide",
11513 context: "formatting"
11514 });
11515 }
11516 },
11517 // AM, PM, midnight, noon
11518 b: function(date, token, localize2) {
11519 const hours = date.getHours();
11520 let dayPeriodEnumValue;
11521 if (hours === 12) {
11522 dayPeriodEnumValue = dayPeriodEnum.noon;
11523 } else if (hours === 0) {
11524 dayPeriodEnumValue = dayPeriodEnum.midnight;
11525 } else {
11526 dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
11527 }
11528 switch (token) {
11529 case "b":
11530 case "bb":
11531 return localize2.dayPeriod(dayPeriodEnumValue, {
11532 width: "abbreviated",
11533 context: "formatting"
11534 });
11535 case "bbb":
11536 return localize2.dayPeriod(dayPeriodEnumValue, {
11537 width: "abbreviated",
11538 context: "formatting"
11539 }).toLowerCase();
11540 case "bbbbb":
11541 return localize2.dayPeriod(dayPeriodEnumValue, {
11542 width: "narrow",
11543 context: "formatting"
11544 });
11545 case "bbbb":
11546 default:
11547 return localize2.dayPeriod(dayPeriodEnumValue, {
11548 width: "wide",
11549 context: "formatting"
11550 });
11551 }
11552 },
11553 // in the morning, in the afternoon, in the evening, at night
11554 B: function(date, token, localize2) {
11555 const hours = date.getHours();
11556 let dayPeriodEnumValue;
11557 if (hours >= 17) {
11558 dayPeriodEnumValue = dayPeriodEnum.evening;
11559 } else if (hours >= 12) {
11560 dayPeriodEnumValue = dayPeriodEnum.afternoon;
11561 } else if (hours >= 4) {
11562 dayPeriodEnumValue = dayPeriodEnum.morning;
11563 } else {
11564 dayPeriodEnumValue = dayPeriodEnum.night;
11565 }
11566 switch (token) {
11567 case "B":
11568 case "BB":
11569 case "BBB":
11570 return localize2.dayPeriod(dayPeriodEnumValue, {
11571 width: "abbreviated",
11572 context: "formatting"
11573 });
11574 case "BBBBB":
11575 return localize2.dayPeriod(dayPeriodEnumValue, {
11576 width: "narrow",
11577 context: "formatting"
11578 });
11579 case "BBBB":
11580 default:
11581 return localize2.dayPeriod(dayPeriodEnumValue, {
11582 width: "wide",
11583 context: "formatting"
11584 });
11585 }
11586 },
11587 // Hour [1-12]
11588 h: function(date, token, localize2) {
11589 if (token === "ho") {
11590 let hours = date.getHours() % 12;
11591 if (hours === 0) hours = 12;
11592 return localize2.ordinalNumber(hours, { unit: "hour" });
11593 }
11594 return lightFormatters.h(date, token);
11595 },
11596 // Hour [0-23]
11597 H: function(date, token, localize2) {
11598 if (token === "Ho") {
11599 return localize2.ordinalNumber(date.getHours(), { unit: "hour" });
11600 }
11601 return lightFormatters.H(date, token);
11602 },
11603 // Hour [0-11]
11604 K: function(date, token, localize2) {
11605 const hours = date.getHours() % 12;
11606 if (token === "Ko") {
11607 return localize2.ordinalNumber(hours, { unit: "hour" });
11608 }
11609 return addLeadingZeros(hours, token.length);
11610 },
11611 // Hour [1-24]
11612 k: function(date, token, localize2) {
11613 let hours = date.getHours();
11614 if (hours === 0) hours = 24;
11615 if (token === "ko") {
11616 return localize2.ordinalNumber(hours, { unit: "hour" });
11617 }
11618 return addLeadingZeros(hours, token.length);
11619 },
11620 // Minute
11621 m: function(date, token, localize2) {
11622 if (token === "mo") {
11623 return localize2.ordinalNumber(date.getMinutes(), { unit: "minute" });
11624 }
11625 return lightFormatters.m(date, token);
11626 },
11627 // Second
11628 s: function(date, token, localize2) {
11629 if (token === "so") {
11630 return localize2.ordinalNumber(date.getSeconds(), { unit: "second" });
11631 }
11632 return lightFormatters.s(date, token);
11633 },
11634 // Fraction of second
11635 S: function(date, token) {
11636 return lightFormatters.S(date, token);
11637 },
11638 // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)
11639 X: function(date, token, _localize) {
11640 const timezoneOffset = date.getTimezoneOffset();
11641 if (timezoneOffset === 0) {
11642 return "Z";
11643 }
11644 switch (token) {
11645 // Hours and optional minutes
11646 case "X":
11647 return formatTimezoneWithOptionalMinutes(timezoneOffset);
11648 // Hours, minutes and optional seconds without `:` delimiter
11649 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
11650 // so this token always has the same output as `XX`
11651 case "XXXX":
11652 case "XX":
11653 return formatTimezone(timezoneOffset);
11654 // Hours, minutes and optional seconds with `:` delimiter
11655 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
11656 // so this token always has the same output as `XXX`
11657 case "XXXXX":
11658 case "XXX":
11659 // Hours and minutes with `:` delimiter
11660 default:
11661 return formatTimezone(timezoneOffset, ":");
11662 }
11663 },
11664 // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)
11665 x: function(date, token, _localize) {
11666 const timezoneOffset = date.getTimezoneOffset();
11667 switch (token) {
11668 // Hours and optional minutes
11669 case "x":
11670 return formatTimezoneWithOptionalMinutes(timezoneOffset);
11671 // Hours, minutes and optional seconds without `:` delimiter
11672 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
11673 // so this token always has the same output as `xx`
11674 case "xxxx":
11675 case "xx":
11676 return formatTimezone(timezoneOffset);
11677 // Hours, minutes and optional seconds with `:` delimiter
11678 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets
11679 // so this token always has the same output as `xxx`
11680 case "xxxxx":
11681 case "xxx":
11682 // Hours and minutes with `:` delimiter
11683 default:
11684 return formatTimezone(timezoneOffset, ":");
11685 }
11686 },
11687 // Timezone (GMT)
11688 O: function(date, token, _localize) {
11689 const timezoneOffset = date.getTimezoneOffset();
11690 switch (token) {
11691 // Short
11692 case "O":
11693 case "OO":
11694 case "OOO":
11695 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
11696 // Long
11697 case "OOOO":
11698 default:
11699 return "GMT" + formatTimezone(timezoneOffset, ":");
11700 }
11701 },
11702 // Timezone (specific non-location)
11703 z: function(date, token, _localize) {
11704 const timezoneOffset = date.getTimezoneOffset();
11705 switch (token) {
11706 // Short
11707 case "z":
11708 case "zz":
11709 case "zzz":
11710 return "GMT" + formatTimezoneShort(timezoneOffset, ":");
11711 // Long
11712 case "zzzz":
11713 default:
11714 return "GMT" + formatTimezone(timezoneOffset, ":");
11715 }
11716 },
11717 // Seconds timestamp
11718 t: function(date, token, _localize) {
11719 const timestamp = Math.trunc(+date / 1e3);
11720 return addLeadingZeros(timestamp, token.length);
11721 },
11722 // Milliseconds timestamp
11723 T: function(date, token, _localize) {
11724 return addLeadingZeros(+date, token.length);
11725 }
11726 };
11727 function formatTimezoneShort(offset, delimiter = "") {
11728 const sign = offset > 0 ? "-" : "+";
11729 const absOffset = Math.abs(offset);
11730 const hours = Math.trunc(absOffset / 60);
11731 const minutes = absOffset % 60;
11732 if (minutes === 0) {
11733 return sign + String(hours);
11734 }
11735 return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
11736 }
11737 function formatTimezoneWithOptionalMinutes(offset, delimiter) {
11738 if (offset % 60 === 0) {
11739 const sign = offset > 0 ? "-" : "+";
11740 return sign + addLeadingZeros(Math.abs(offset) / 60, 2);
11741 }
11742 return formatTimezone(offset, delimiter);
11743 }
11744 function formatTimezone(offset, delimiter = "") {
11745 const sign = offset > 0 ? "-" : "+";
11746 const absOffset = Math.abs(offset);
11747 const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);
11748 const minutes = addLeadingZeros(absOffset % 60, 2);
11749 return sign + hours + delimiter + minutes;
11750 }
11751
11752 // packages/dataviews/node_modules/date-fns/_lib/format/longFormatters.js
11753 var dateLongFormatter = (pattern, formatLong2) => {
11754 switch (pattern) {
11755 case "P":
11756 return formatLong2.date({ width: "short" });
11757 case "PP":
11758 return formatLong2.date({ width: "medium" });
11759 case "PPP":
11760 return formatLong2.date({ width: "long" });
11761 case "PPPP":
11762 default:
11763 return formatLong2.date({ width: "full" });
11764 }
11765 };
11766 var timeLongFormatter = (pattern, formatLong2) => {
11767 switch (pattern) {
11768 case "p":
11769 return formatLong2.time({ width: "short" });
11770 case "pp":
11771 return formatLong2.time({ width: "medium" });
11772 case "ppp":
11773 return formatLong2.time({ width: "long" });
11774 case "pppp":
11775 default:
11776 return formatLong2.time({ width: "full" });
11777 }
11778 };
11779 var dateTimeLongFormatter = (pattern, formatLong2) => {
11780 const matchResult = pattern.match(/(P+)(p+)?/) || [];
11781 const datePattern = matchResult[1];
11782 const timePattern = matchResult[2];
11783 if (!timePattern) {
11784 return dateLongFormatter(pattern, formatLong2);
11785 }
11786 let dateTimeFormat;
11787 switch (datePattern) {
11788 case "P":
11789 dateTimeFormat = formatLong2.dateTime({ width: "short" });
11790 break;
11791 case "PP":
11792 dateTimeFormat = formatLong2.dateTime({ width: "medium" });
11793 break;
11794 case "PPP":
11795 dateTimeFormat = formatLong2.dateTime({ width: "long" });
11796 break;
11797 case "PPPP":
11798 default:
11799 dateTimeFormat = formatLong2.dateTime({ width: "full" });
11800 break;
11801 }
11802 return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
11803 };
11804 var longFormatters = {
11805 p: timeLongFormatter,
11806 P: dateTimeLongFormatter
11807 };
11808
11809 // packages/dataviews/node_modules/date-fns/_lib/protectedTokens.js
11810 var dayOfYearTokenRE = /^D+$/;
11811 var weekYearTokenRE = /^Y+$/;
11812 var throwTokens = ["D", "DD", "YY", "YYYY"];
11813 function isProtectedDayOfYearToken(token) {
11814 return dayOfYearTokenRE.test(token);
11815 }
11816 function isProtectedWeekYearToken(token) {
11817 return weekYearTokenRE.test(token);
11818 }
11819 function warnOrThrowProtectedError(token, format6, input) {
11820 const _message = message(token, format6, input);
11821 console.warn(_message);
11822 if (throwTokens.includes(token)) throw new RangeError(_message);
11823 }
11824 function message(token, format6, input) {
11825 const subject = token[0] === "Y" ? "years" : "days of the month";
11826 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`;
11827 }
11828
11829 // packages/dataviews/node_modules/date-fns/format.js
11830 var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
11831 var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
11832 var escapedStringRegExp = /^'([^]*?)'?$/;
11833 var doubleQuoteRegExp = /''/g;
11834 var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
11835 function format(date, formatStr, options) {
11836 const defaultOptions2 = getDefaultOptions();
11837 const locale = options?.locale ?? defaultOptions2.locale ?? enUS;
11838 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1;
11839 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
11840 const originalDate = toDate(date, options?.in);
11841 if (!isValid(originalDate)) {
11842 throw new RangeError("Invalid time value");
11843 }
11844 let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => {
11845 const firstCharacter = substring[0];
11846 if (firstCharacter === "p" || firstCharacter === "P") {
11847 const longFormatter = longFormatters[firstCharacter];
11848 return longFormatter(substring, locale.formatLong);
11849 }
11850 return substring;
11851 }).join("").match(formattingTokensRegExp).map((substring) => {
11852 if (substring === "''") {
11853 return { isToken: false, value: "'" };
11854 }
11855 const firstCharacter = substring[0];
11856 if (firstCharacter === "'") {
11857 return { isToken: false, value: cleanEscapedString(substring) };
11858 }
11859 if (formatters[firstCharacter]) {
11860 return { isToken: true, value: substring };
11861 }
11862 if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
11863 throw new RangeError(
11864 "Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"
11865 );
11866 }
11867 return { isToken: false, value: substring };
11868 });
11869 if (locale.localize.preprocessor) {
11870 parts = locale.localize.preprocessor(originalDate, parts);
11871 }
11872 const formatterOptions = {
11873 firstWeekContainsDate,
11874 weekStartsOn,
11875 locale
11876 };
11877 return parts.map((part) => {
11878 if (!part.isToken) return part.value;
11879 const token = part.value;
11880 if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) {
11881 warnOrThrowProtectedError(token, formatStr, String(date));
11882 }
11883 const formatter = formatters[token[0]];
11884 return formatter(originalDate, token, locale.localize, formatterOptions);
11885 }).join("");
11886 }
11887 function cleanEscapedString(input) {
11888 const matched = input.match(escapedStringRegExp);
11889 if (!matched) {
11890 return input;
11891 }
11892 return matched[1].replace(doubleQuoteRegExp, "'");
11893 }
11894
11895 // packages/dataviews/node_modules/date-fns/subDays.js
11896 function subDays(date, amount, options) {
11897 return addDays(date, -amount, options);
11898 }
11899
11900 // packages/dataviews/node_modules/date-fns/subMonths.js
11901 function subMonths(date, amount, options) {
11902 return addMonths(date, -amount, options);
11903 }
11904
11905 // packages/dataviews/node_modules/date-fns/subWeeks.js
11906 function subWeeks(date, amount, options) {
11907 return addWeeks(date, -amount, options);
11908 }
11909
11910 // packages/dataviews/node_modules/date-fns/subYears.js
11911 function subYears(date, amount, options) {
11912 return addYears(date, -amount, options);
11913 }
11914
11915 // packages/dataviews/build-module/utils/operators.mjs
11916 var import_i18n23 = __toESM(require_i18n(), 1);
11917 var import_element27 = __toESM(require_element(), 1);
11918 var import_date = __toESM(require_date(), 1);
11919 var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1);
11920 var filterTextWrappers = {
11921 Name: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "dataviews-filters__summary-filter-text-name" }),
11922 Value: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "dataviews-filters__summary-filter-text-value" })
11923 };
11924 function getRelativeDate(value, unit) {
11925 switch (unit) {
11926 case "days":
11927 return subDays(/* @__PURE__ */ new Date(), value);
11928 case "weeks":
11929 return subWeeks(/* @__PURE__ */ new Date(), value);
11930 case "months":
11931 return subMonths(/* @__PURE__ */ new Date(), value);
11932 case "years":
11933 return subYears(/* @__PURE__ */ new Date(), value);
11934 default:
11935 return /* @__PURE__ */ new Date();
11936 }
11937 }
11938 var isNoneOperatorDefinition = {
11939 /* translators: DataViews operator name */
11940 label: (0, import_i18n23.__)("Is none of"),
11941 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
11942 (0, import_i18n23.sprintf)(
11943 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */
11944 (0, import_i18n23.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"),
11945 filter.name,
11946 activeElements.map((element) => element.label).join(", ")
11947 ),
11948 filterTextWrappers
11949 ),
11950 filter: ((item, field, filterValue) => {
11951 if (!filterValue?.length) {
11952 return true;
11953 }
11954 const fieldValue = field.getValue({ item });
11955 if (Array.isArray(fieldValue)) {
11956 return !filterValue.some(
11957 (fv) => fieldValue.includes(fv)
11958 );
11959 } else if (typeof fieldValue === "string") {
11960 return !filterValue.includes(fieldValue);
11961 }
11962 return false;
11963 }),
11964 selection: "multi"
11965 };
11966 var OPERATORS = [
11967 {
11968 name: OPERATOR_IS_ANY,
11969 /* translators: DataViews operator name */
11970 label: (0, import_i18n23.__)("Includes"),
11971 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
11972 (0, import_i18n23.sprintf)(
11973 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is any: Admin, Editor". */
11974 (0, import_i18n23.__)("<Name>%1$s includes: </Name><Value>%2$s</Value>"),
11975 filter.name,
11976 activeElements.map((element) => element.label).join(", ")
11977 ),
11978 filterTextWrappers
11979 ),
11980 filter(item, field, filterValue) {
11981 if (!filterValue?.length) {
11982 return true;
11983 }
11984 const fieldValue = field.getValue({ item });
11985 if (Array.isArray(fieldValue)) {
11986 return filterValue.some(
11987 (fv) => fieldValue.includes(fv)
11988 );
11989 } else if (typeof fieldValue === "string") {
11990 return filterValue.includes(fieldValue);
11991 }
11992 return false;
11993 },
11994 selection: "multi"
11995 },
11996 {
11997 name: OPERATOR_IS_NONE,
11998 ...isNoneOperatorDefinition
11999 },
12000 {
12001 name: OPERATOR_IS_ALL,
12002 /* translators: DataViews operator name */
12003 label: (0, import_i18n23.__)("Includes all"),
12004 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12005 (0, import_i18n23.sprintf)(
12006 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author includes all: Admin, Editor". */
12007 (0, import_i18n23.__)("<Name>%1$s includes all: </Name><Value>%2$s</Value>"),
12008 filter.name,
12009 activeElements.map((element) => element.label).join(", ")
12010 ),
12011 filterTextWrappers
12012 ),
12013 filter(item, field, filterValue) {
12014 if (!filterValue?.length) {
12015 return true;
12016 }
12017 return filterValue.every((value) => {
12018 return field.getValue({ item })?.includes(value);
12019 });
12020 },
12021 selection: "multi"
12022 },
12023 {
12024 name: OPERATOR_IS_NOT_ALL,
12025 ...isNoneOperatorDefinition
12026 },
12027 {
12028 name: OPERATOR_BETWEEN,
12029 /* translators: DataViews operator name */
12030 label: (0, import_i18n23.__)("Between (inc)"),
12031 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12032 (0, import_i18n23.sprintf)(
12033 /* 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". */
12034 (0, import_i18n23.__)(
12035 "<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>"
12036 ),
12037 filter.name,
12038 activeElements[0].label[0],
12039 activeElements[0].label[1]
12040 ),
12041 filterTextWrappers
12042 ),
12043 filter(item, field, filterValue) {
12044 if (!Array.isArray(filterValue) || filterValue.length !== 2 || filterValue[0] === void 0 || filterValue[1] === void 0) {
12045 return true;
12046 }
12047 const fieldValue = field.getValue({ item });
12048 if (typeof fieldValue === "number" || fieldValue instanceof Date || typeof fieldValue === "string") {
12049 return fieldValue >= filterValue[0] && fieldValue <= filterValue[1];
12050 }
12051 return false;
12052 },
12053 selection: "custom"
12054 },
12055 {
12056 name: OPERATOR_IN_THE_PAST,
12057 /* translators: DataViews operator name */
12058 label: (0, import_i18n23.__)("In the past"),
12059 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12060 (0, import_i18n23.sprintf)(
12061 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is in the past: 7 days". */
12062 (0, import_i18n23.__)(
12063 "<Name>%1$s is in the past: </Name><Value>%2$s</Value>"
12064 ),
12065 filter.name,
12066 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
12067 ),
12068 filterTextWrappers
12069 ),
12070 filter(item, field, filterValue) {
12071 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
12072 return true;
12073 }
12074 const targetDate = getRelativeDate(
12075 filterValue.value,
12076 filterValue.unit
12077 );
12078 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
12079 return fieldValue >= targetDate && fieldValue <= /* @__PURE__ */ new Date();
12080 },
12081 selection: "custom"
12082 },
12083 {
12084 name: OPERATOR_OVER,
12085 /* translators: DataViews operator name */
12086 label: (0, import_i18n23.__)("Over"),
12087 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12088 (0, import_i18n23.sprintf)(
12089 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is over: 7 days". */
12090 (0, import_i18n23.__)("<Name>%1$s is over: </Name><Value>%2$s</Value>"),
12091 filter.name,
12092 `${activeElements[0].value.value} ${activeElements[0].value.unit}`
12093 ),
12094 filterTextWrappers
12095 ),
12096 filter(item, field, filterValue) {
12097 if (filterValue?.value === void 0 || filterValue?.unit === void 0) {
12098 return true;
12099 }
12100 const targetDate = getRelativeDate(
12101 filterValue.value,
12102 filterValue.unit
12103 );
12104 const fieldValue = (0, import_date.getDate)(field.getValue({ item }));
12105 return fieldValue < targetDate;
12106 },
12107 selection: "custom"
12108 },
12109 {
12110 name: OPERATOR_IS,
12111 /* translators: DataViews operator name */
12112 label: (0, import_i18n23.__)("Is"),
12113 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12114 (0, import_i18n23.sprintf)(
12115 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is: Admin". */
12116 (0, import_i18n23.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
12117 filter.name,
12118 activeElements[0].label
12119 ),
12120 filterTextWrappers
12121 ),
12122 filter(item, field, filterValue) {
12123 return filterValue === field.getValue({ item }) || filterValue === void 0;
12124 },
12125 selection: "single"
12126 },
12127 {
12128 name: OPERATOR_IS_NOT,
12129 /* translators: DataViews operator name */
12130 label: (0, import_i18n23.__)("Is not"),
12131 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12132 (0, import_i18n23.sprintf)(
12133 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is not: Admin". */
12134 (0, import_i18n23.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
12135 filter.name,
12136 activeElements[0].label
12137 ),
12138 filterTextWrappers
12139 ),
12140 filter(item, field, filterValue) {
12141 return filterValue !== field.getValue({ item });
12142 },
12143 selection: "single"
12144 },
12145 {
12146 name: OPERATOR_LESS_THAN,
12147 /* translators: DataViews operator name */
12148 label: (0, import_i18n23.__)("Less than"),
12149 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12150 (0, import_i18n23.sprintf)(
12151 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than: 10". */
12152 (0, import_i18n23.__)("<Name>%1$s is less than: </Name><Value>%2$s</Value>"),
12153 filter.name,
12154 activeElements[0].label
12155 ),
12156 filterTextWrappers
12157 ),
12158 filter(item, field, filterValue) {
12159 if (filterValue === void 0) {
12160 return true;
12161 }
12162 const fieldValue = field.getValue({ item });
12163 return fieldValue < filterValue;
12164 },
12165 selection: "single"
12166 },
12167 {
12168 name: OPERATOR_GREATER_THAN,
12169 /* translators: DataViews operator name */
12170 label: (0, import_i18n23.__)("Greater than"),
12171 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12172 (0, import_i18n23.sprintf)(
12173 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than: 10". */
12174 (0, import_i18n23.__)(
12175 "<Name>%1$s is greater than: </Name><Value>%2$s</Value>"
12176 ),
12177 filter.name,
12178 activeElements[0].label
12179 ),
12180 filterTextWrappers
12181 ),
12182 filter(item, field, filterValue) {
12183 if (filterValue === void 0) {
12184 return true;
12185 }
12186 const fieldValue = field.getValue({ item });
12187 return fieldValue > filterValue;
12188 },
12189 selection: "single"
12190 },
12191 {
12192 name: OPERATOR_LESS_THAN_OR_EQUAL,
12193 /* translators: DataViews operator name */
12194 label: (0, import_i18n23.__)("Less than or equal"),
12195 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12196 (0, import_i18n23.sprintf)(
12197 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than or equal to: 10". */
12198 (0, import_i18n23.__)(
12199 "<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>"
12200 ),
12201 filter.name,
12202 activeElements[0].label
12203 ),
12204 filterTextWrappers
12205 ),
12206 filter(item, field, filterValue) {
12207 if (filterValue === void 0) {
12208 return true;
12209 }
12210 const fieldValue = field.getValue({ item });
12211 return fieldValue <= filterValue;
12212 },
12213 selection: "single"
12214 },
12215 {
12216 name: OPERATOR_GREATER_THAN_OR_EQUAL,
12217 /* translators: DataViews operator name */
12218 label: (0, import_i18n23.__)("Greater than or equal"),
12219 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12220 (0, import_i18n23.sprintf)(
12221 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than or equal to: 10". */
12222 (0, import_i18n23.__)(
12223 "<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>"
12224 ),
12225 filter.name,
12226 activeElements[0].label
12227 ),
12228 filterTextWrappers
12229 ),
12230 filter(item, field, filterValue) {
12231 if (filterValue === void 0) {
12232 return true;
12233 }
12234 const fieldValue = field.getValue({ item });
12235 return fieldValue >= filterValue;
12236 },
12237 selection: "single"
12238 },
12239 {
12240 name: OPERATOR_BEFORE,
12241 /* translators: DataViews operator name */
12242 label: (0, import_i18n23.__)("Before"),
12243 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12244 (0, import_i18n23.sprintf)(
12245 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is before: 2024-01-01". */
12246 (0, import_i18n23.__)("<Name>%1$s is before: </Name><Value>%2$s</Value>"),
12247 filter.name,
12248 activeElements[0].label
12249 ),
12250 filterTextWrappers
12251 ),
12252 filter(item, field, filterValue) {
12253 if (filterValue === void 0) {
12254 return true;
12255 }
12256 const filterDate = (0, import_date.getDate)(filterValue);
12257 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12258 return fieldDate < filterDate;
12259 },
12260 selection: "single"
12261 },
12262 {
12263 name: OPERATOR_AFTER,
12264 /* translators: DataViews operator name */
12265 label: (0, import_i18n23.__)("After"),
12266 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12267 (0, import_i18n23.sprintf)(
12268 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is after: 2024-01-01". */
12269 (0, import_i18n23.__)("<Name>%1$s is after: </Name><Value>%2$s</Value>"),
12270 filter.name,
12271 activeElements[0].label
12272 ),
12273 filterTextWrappers
12274 ),
12275 filter(item, field, filterValue) {
12276 if (filterValue === void 0) {
12277 return true;
12278 }
12279 const filterDate = (0, import_date.getDate)(filterValue);
12280 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12281 return fieldDate > filterDate;
12282 },
12283 selection: "single"
12284 },
12285 {
12286 name: OPERATOR_BEFORE_INC,
12287 /* translators: DataViews operator name */
12288 label: (0, import_i18n23.__)("Before (inc)"),
12289 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12290 (0, import_i18n23.sprintf)(
12291 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or before: 2024-01-01". */
12292 (0, import_i18n23.__)(
12293 "<Name>%1$s is on or before: </Name><Value>%2$s</Value>"
12294 ),
12295 filter.name,
12296 activeElements[0].label
12297 ),
12298 filterTextWrappers
12299 ),
12300 filter(item, field, filterValue) {
12301 if (filterValue === void 0) {
12302 return true;
12303 }
12304 const filterDate = (0, import_date.getDate)(filterValue);
12305 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12306 return fieldDate <= filterDate;
12307 },
12308 selection: "single"
12309 },
12310 {
12311 name: OPERATOR_AFTER_INC,
12312 /* translators: DataViews operator name */
12313 label: (0, import_i18n23.__)("After (inc)"),
12314 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12315 (0, import_i18n23.sprintf)(
12316 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or after: 2024-01-01". */
12317 (0, import_i18n23.__)(
12318 "<Name>%1$s is on or after: </Name><Value>%2$s</Value>"
12319 ),
12320 filter.name,
12321 activeElements[0].label
12322 ),
12323 filterTextWrappers
12324 ),
12325 filter(item, field, filterValue) {
12326 if (filterValue === void 0) {
12327 return true;
12328 }
12329 const filterDate = (0, import_date.getDate)(filterValue);
12330 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12331 return fieldDate >= filterDate;
12332 },
12333 selection: "single"
12334 },
12335 {
12336 name: OPERATOR_CONTAINS,
12337 /* translators: DataViews operator name */
12338 label: (0, import_i18n23.__)("Contains"),
12339 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12340 (0, import_i18n23.sprintf)(
12341 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title contains: Hello". */
12342 (0, import_i18n23.__)("<Name>%1$s contains: </Name><Value>%2$s</Value>"),
12343 filter.name,
12344 activeElements[0].label
12345 ),
12346 filterTextWrappers
12347 ),
12348 filter(item, field, filterValue) {
12349 if (filterValue === void 0) {
12350 return true;
12351 }
12352 const fieldValue = field.getValue({ item });
12353 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
12354 },
12355 selection: "single"
12356 },
12357 {
12358 name: OPERATOR_NOT_CONTAINS,
12359 /* translators: DataViews operator name */
12360 label: (0, import_i18n23.__)("Doesn't contain"),
12361 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12362 (0, import_i18n23.sprintf)(
12363 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title doesn't contain: Hello". */
12364 (0, import_i18n23.__)(
12365 "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>"
12366 ),
12367 filter.name,
12368 activeElements[0].label
12369 ),
12370 filterTextWrappers
12371 ),
12372 filter(item, field, filterValue) {
12373 if (filterValue === void 0) {
12374 return true;
12375 }
12376 const fieldValue = field.getValue({ item });
12377 return typeof fieldValue === "string" && filterValue && !fieldValue.toLowerCase().includes(String(filterValue).toLowerCase());
12378 },
12379 selection: "single"
12380 },
12381 {
12382 name: OPERATOR_STARTS_WITH,
12383 /* translators: DataViews operator name */
12384 label: (0, import_i18n23.__)("Starts with"),
12385 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12386 (0, import_i18n23.sprintf)(
12387 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title starts with: Hello". */
12388 (0, import_i18n23.__)("<Name>%1$s starts with: </Name><Value>%2$s</Value>"),
12389 filter.name,
12390 activeElements[0].label
12391 ),
12392 filterTextWrappers
12393 ),
12394 filter(item, field, filterValue) {
12395 if (filterValue === void 0) {
12396 return true;
12397 }
12398 const fieldValue = field.getValue({ item });
12399 return typeof fieldValue === "string" && filterValue && fieldValue.toLowerCase().startsWith(String(filterValue).toLowerCase());
12400 },
12401 selection: "single"
12402 },
12403 {
12404 name: OPERATOR_ON,
12405 /* translators: DataViews operator name */
12406 label: (0, import_i18n23.__)("On"),
12407 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12408 (0, import_i18n23.sprintf)(
12409 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is: 2024-01-01". */
12410 (0, import_i18n23.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"),
12411 filter.name,
12412 activeElements[0].label
12413 ),
12414 filterTextWrappers
12415 ),
12416 filter(item, field, filterValue) {
12417 if (filterValue === void 0) {
12418 return true;
12419 }
12420 const filterDate = (0, import_date.getDate)(filterValue);
12421 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12422 return filterDate.getTime() === fieldDate.getTime();
12423 },
12424 selection: "single"
12425 },
12426 {
12427 name: OPERATOR_NOT_ON,
12428 /* translators: DataViews operator name */
12429 label: (0, import_i18n23.__)("Not on"),
12430 filterText: (filter, activeElements) => (0, import_element27.createInterpolateElement)(
12431 (0, import_i18n23.sprintf)(
12432 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is not: 2024-01-01". */
12433 (0, import_i18n23.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"),
12434 filter.name,
12435 activeElements[0].label
12436 ),
12437 filterTextWrappers
12438 ),
12439 filter(item, field, filterValue) {
12440 if (filterValue === void 0) {
12441 return true;
12442 }
12443 const filterDate = (0, import_date.getDate)(filterValue);
12444 const fieldDate = (0, import_date.getDate)(field.getValue({ item }));
12445 return filterDate.getTime() !== fieldDate.getTime();
12446 },
12447 selection: "single"
12448 }
12449 ];
12450 var getOperatorByName = (name) => OPERATORS.find((op) => op.name === name);
12451 var getAllOperatorNames = () => OPERATORS.map((op) => op.name);
12452 var isSingleSelectionOperator = (name) => OPERATORS.filter((op) => op.selection === "single").some(
12453 (op) => op.name === name
12454 );
12455 var isRegisteredOperator = (name) => OPERATORS.some((op) => op.name === name);
12456
12457 // packages/dataviews/build-module/components/dataviews-filters/filter.mjs
12458 var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1);
12459 var ENTER = "Enter";
12460 var SPACE = " ";
12461 var FilterText = ({
12462 activeElements,
12463 filterInView,
12464 filter
12465 }) => {
12466 if (activeElements === void 0 || activeElements.length === 0) {
12467 return filter.name;
12468 }
12469 const operator = getOperatorByName(filterInView?.operator);
12470 if (operator !== void 0) {
12471 return operator.filterText(filter, activeElements);
12472 }
12473 return (0, import_i18n24.sprintf)(
12474 /* translators: 1: Filter name e.g.: "Unknown status for Author". */
12475 (0, import_i18n24.__)("Unknown status for %1$s"),
12476 filter.name
12477 );
12478 };
12479 function OperatorSelector({
12480 filter,
12481 view,
12482 onChangeView
12483 }) {
12484 const operatorOptions = filter.operators?.map((operator) => ({
12485 value: operator,
12486 label: getOperatorByName(operator)?.label || operator
12487 }));
12488 const currentFilter = view.filters?.find(
12489 (_filter) => _filter.field === filter.field
12490 );
12491 const value = currentFilter?.operator || filter.operators[0];
12492 return operatorOptions.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
12493 Stack,
12494 {
12495 direction: "row",
12496 gap: "sm",
12497 justify: "flex-start",
12498 className: "dataviews-filters__summary-operators-container",
12499 align: "center",
12500 children: [
12501 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_components21.FlexItem, { className: "dataviews-filters__summary-operators-filter-name", children: filter.name }),
12502 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12503 import_components21.SelectControl,
12504 {
12505 className: "dataviews-filters__summary-operators-filter-select",
12506 label: (0, import_i18n24.__)("Conditions"),
12507 value,
12508 options: operatorOptions,
12509 onChange: (newValue) => {
12510 const newOperator = newValue;
12511 const currentOperator = currentFilter?.operator;
12512 const newFilters = currentFilter ? [
12513 ...(view.filters ?? []).map(
12514 (_filter) => {
12515 if (_filter.field === filter.field) {
12516 const currentOpSelectionModel = getOperatorByName(
12517 currentOperator
12518 )?.selection;
12519 const newOpSelectionModel = getOperatorByName(
12520 newOperator
12521 )?.selection;
12522 const shouldResetValue = currentOpSelectionModel !== newOpSelectionModel || [
12523 currentOpSelectionModel,
12524 newOpSelectionModel
12525 ].includes("custom");
12526 return {
12527 ..._filter,
12528 value: shouldResetValue ? void 0 : _filter.value,
12529 operator: newOperator
12530 };
12531 }
12532 return _filter;
12533 }
12534 )
12535 ] : [
12536 ...view.filters ?? [],
12537 {
12538 field: filter.field,
12539 operator: newOperator,
12540 value: void 0
12541 }
12542 ];
12543 onChangeView({
12544 ...view,
12545 page: 1,
12546 filters: newFilters
12547 });
12548 },
12549 size: "small",
12550 variant: "minimal",
12551 hideLabelFromVision: true
12552 }
12553 )
12554 ]
12555 }
12556 );
12557 }
12558 function Filter({
12559 addFilterRef,
12560 openedFilter,
12561 fields,
12562 ...commonProps
12563 }) {
12564 const toggleRef = (0, import_element28.useRef)(null);
12565 const { filter, view, onChangeView } = commonProps;
12566 const filterInView = view.filters?.find(
12567 (f2) => f2.field === filter.field
12568 );
12569 let activeElements = [];
12570 const field = (0, import_element28.useMemo)(() => {
12571 const currentField = fields.find((f2) => f2.id === filter.field);
12572 if (currentField) {
12573 return {
12574 ...currentField,
12575 // Configure getValue as if Item was a plain object.
12576 // See related input-widget.tsx
12577 getValue: ({ item }) => item[currentField.id]
12578 };
12579 }
12580 return currentField;
12581 }, [fields, filter.field]);
12582 const { elements } = useElements({
12583 elements: filter.elements,
12584 getElements: filter.getElements
12585 });
12586 if (elements.length > 0) {
12587 activeElements = elements.filter((element) => {
12588 if (filter.singleSelection) {
12589 return element.value === filterInView?.value;
12590 }
12591 return filterInView?.value?.includes(element.value);
12592 });
12593 } else if (Array.isArray(filterInView?.value)) {
12594 const label = filterInView.value.map((v2) => {
12595 const formattedValue = field?.getValueFormatted({
12596 item: { [field.id]: v2 },
12597 field
12598 });
12599 return formattedValue || String(v2);
12600 });
12601 activeElements = [
12602 {
12603 value: filterInView.value,
12604 // @ts-ignore
12605 label
12606 }
12607 ];
12608 } else if (typeof filterInView?.value === "object") {
12609 activeElements = [
12610 { value: filterInView.value, label: filterInView.value }
12611 ];
12612 } else if (filterInView?.value !== void 0) {
12613 const label = field !== void 0 ? field.getValueFormatted({
12614 item: { [field.id]: filterInView.value },
12615 field
12616 }) : String(filterInView.value);
12617 activeElements = [
12618 {
12619 value: filterInView.value,
12620 label
12621 }
12622 ];
12623 }
12624 const isPrimary = filter.isPrimary;
12625 const isLocked = filterInView?.isLocked;
12626 const hasValues = !isLocked && filterInView?.value !== void 0;
12627 const canResetOrRemove = !isLocked && (!isPrimary || hasValues);
12628 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12629 import_components21.Dropdown,
12630 {
12631 defaultOpen: openedFilter === filter.field,
12632 contentClassName: "dataviews-filters__summary-popover",
12633 popoverProps: { placement: "bottom-start", role: "dialog" },
12634 onClose: () => {
12635 toggleRef.current?.focus();
12636 },
12637 renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "dataviews-filters__summary-chip-container", children: [
12638 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12639 import_components21.Tooltip,
12640 {
12641 text: (0, import_i18n24.sprintf)(
12642 /* translators: 1: Filter name. */
12643 (0, import_i18n24.__)("Filter by: %1$s"),
12644 filter.name.toLowerCase()
12645 ),
12646 placement: "top",
12647 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12648 "div",
12649 {
12650 className: clsx_default(
12651 "dataviews-filters__summary-chip",
12652 {
12653 "has-reset": canResetOrRemove,
12654 "has-values": hasValues,
12655 "is-not-clickable": isLocked
12656 }
12657 ),
12658 role: "button",
12659 tabIndex: isLocked ? -1 : 0,
12660 onClick: () => {
12661 if (!isLocked) {
12662 onToggle();
12663 }
12664 },
12665 onKeyDown: (event) => {
12666 if (!isLocked && [ENTER, SPACE].includes(event.key)) {
12667 onToggle();
12668 event.preventDefault();
12669 }
12670 },
12671 "aria-disabled": isLocked,
12672 "aria-pressed": isOpen,
12673 "aria-expanded": isOpen,
12674 ref: toggleRef,
12675 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12676 FilterText,
12677 {
12678 activeElements,
12679 filterInView,
12680 filter
12681 }
12682 )
12683 }
12684 )
12685 }
12686 ),
12687 canResetOrRemove && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12688 import_components21.Tooltip,
12689 {
12690 text: isPrimary ? (0, import_i18n24.__)("Reset") : (0, import_i18n24.__)("Remove"),
12691 placement: "top",
12692 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12693 "button",
12694 {
12695 className: clsx_default(
12696 "dataviews-filters__summary-chip-remove",
12697 { "has-values": hasValues }
12698 ),
12699 onClick: () => {
12700 onChangeView({
12701 ...view,
12702 page: 1,
12703 filters: view.filters?.filter(
12704 (_filter) => _filter.field !== filter.field
12705 )
12706 });
12707 if (!isPrimary) {
12708 addFilterRef.current?.focus();
12709 } else {
12710 toggleRef.current?.focus();
12711 }
12712 },
12713 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_components21.Icon, { icon: close_small_default })
12714 }
12715 )
12716 }
12717 )
12718 ] }),
12719 renderContent: () => {
12720 return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Stack, { direction: "column", justify: "flex-start", children: [
12721 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(OperatorSelector, { ...commonProps }),
12722 commonProps.filter.hasElements ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
12723 SearchWidget,
12724 {
12725 ...commonProps,
12726 filter: {
12727 ...commonProps.filter,
12728 elements
12729 }
12730 }
12731 ) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(InputWidget, { ...commonProps, fields })
12732 ] });
12733 }
12734 }
12735 );
12736 }
12737
12738 // packages/dataviews/build-module/components/dataviews-filters/add-filter.mjs
12739 var import_components22 = __toESM(require_components(), 1);
12740 var import_i18n25 = __toESM(require_i18n(), 1);
12741 var import_element29 = __toESM(require_element(), 1);
12742 var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1);
12743 var { Menu: Menu4 } = unlock(import_components22.privateApis);
12744 function AddFilterMenu({
12745 filters,
12746 view,
12747 onChangeView,
12748 setOpenedFilter,
12749 triggerProps
12750 }) {
12751 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
12752 return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Menu4, { children: [
12753 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Menu4.TriggerButton, { ...triggerProps }),
12754 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Menu4.Popover, { children: inactiveFilters.map((filter) => {
12755 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12756 Menu4.Item,
12757 {
12758 onClick: () => {
12759 setOpenedFilter(filter.field);
12760 onChangeView({
12761 ...view,
12762 page: 1,
12763 filters: [
12764 ...view.filters || [],
12765 {
12766 field: filter.field,
12767 value: void 0,
12768 operator: filter.operators[0]
12769 }
12770 ]
12771 });
12772 },
12773 children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Menu4.ItemLabel, { children: filter.name })
12774 },
12775 filter.field
12776 );
12777 }) })
12778 ] });
12779 }
12780 function AddFilter({ filters, view, onChangeView, setOpenedFilter }, ref) {
12781 if (!filters.length || filters.every(({ isPrimary }) => isPrimary)) {
12782 return null;
12783 }
12784 const inactiveFilters = filters.filter((filter) => !filter.isVisible);
12785 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12786 AddFilterMenu,
12787 {
12788 triggerProps: {
12789 render: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
12790 import_components22.Button,
12791 {
12792 accessibleWhenDisabled: true,
12793 size: "compact",
12794 className: "dataviews-filters-button",
12795 variant: "tertiary",
12796 disabled: !inactiveFilters.length,
12797 ref
12798 }
12799 ),
12800 children: (0, import_i18n25.__)("Add filter")
12801 },
12802 ...{ filters, view, onChangeView, setOpenedFilter }
12803 }
12804 );
12805 }
12806 var add_filter_default = (0, import_element29.forwardRef)(AddFilter);
12807
12808 // packages/dataviews/build-module/components/dataviews-filters/reset-filters.mjs
12809 var import_components23 = __toESM(require_components(), 1);
12810 var import_i18n26 = __toESM(require_i18n(), 1);
12811 var import_jsx_runtime59 = __toESM(require_jsx_runtime(), 1);
12812 function ResetFilter({
12813 filters,
12814 view,
12815 onChangeView
12816 }) {
12817 const isPrimary = (field) => filters.some(
12818 (_filter) => _filter.field === field && _filter.isPrimary
12819 );
12820 const isDisabled = !view.search && !view.filters?.some(
12821 (_filter) => !_filter.isLocked && (_filter.value !== void 0 || !isPrimary(_filter.field))
12822 );
12823 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
12824 import_components23.Button,
12825 {
12826 disabled: isDisabled,
12827 accessibleWhenDisabled: true,
12828 size: "compact",
12829 variant: "tertiary",
12830 className: "dataviews-filters__reset-button",
12831 onClick: () => {
12832 onChangeView({
12833 ...view,
12834 page: 1,
12835 search: "",
12836 filters: view.filters?.filter((f2) => !!f2.isLocked) || []
12837 });
12838 },
12839 children: (0, import_i18n26.__)("Reset")
12840 }
12841 );
12842 }
12843
12844 // packages/dataviews/build-module/components/dataviews-filters/use-filters.mjs
12845 var import_element30 = __toESM(require_element(), 1);
12846 function useFilters(fields, view) {
12847 return (0, import_element30.useMemo)(() => {
12848 const filters = [];
12849 fields.forEach((field) => {
12850 if (field.filterBy === false || !field.hasElements && !field.Edit) {
12851 return;
12852 }
12853 const operators = field.filterBy.operators;
12854 const isPrimary = !!field.filterBy?.isPrimary;
12855 const isLocked = view.filters?.some(
12856 (f2) => f2.field === field.id && !!f2.isLocked
12857 ) ?? false;
12858 filters.push({
12859 field: field.id,
12860 name: field.label,
12861 elements: field.elements,
12862 getElements: field.getElements,
12863 hasElements: field.hasElements,
12864 singleSelection: operators.some(
12865 (op) => isSingleSelectionOperator(op)
12866 ),
12867 operators,
12868 isVisible: isLocked || isPrimary || !!view.filters?.some(
12869 (f2) => f2.field === field.id && isRegisteredOperator(f2.operator)
12870 ),
12871 isPrimary,
12872 isLocked
12873 });
12874 });
12875 filters.sort((a2, b2) => {
12876 if (a2.isLocked && !b2.isLocked) {
12877 return -1;
12878 }
12879 if (!a2.isLocked && b2.isLocked) {
12880 return 1;
12881 }
12882 if (a2.isPrimary && !b2.isPrimary) {
12883 return -1;
12884 }
12885 if (!a2.isPrimary && b2.isPrimary) {
12886 return 1;
12887 }
12888 return a2.name.localeCompare(b2.name);
12889 });
12890 return filters;
12891 }, [fields, view]);
12892 }
12893 var use_filters_default = useFilters;
12894
12895 // packages/dataviews/build-module/components/dataviews-filters/filters.mjs
12896 var import_jsx_runtime60 = __toESM(require_jsx_runtime(), 1);
12897 function Filters({ className }) {
12898 const { fields, view, onChangeView, openedFilter, setOpenedFilter } = (0, import_element31.useContext)(dataviews_context_default);
12899 const addFilterRef = (0, import_element31.useRef)(null);
12900 const filters = use_filters_default(fields, view);
12901 const addFilter = /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
12902 add_filter_default,
12903 {
12904 filters,
12905 view,
12906 onChangeView,
12907 ref: addFilterRef,
12908 setOpenedFilter
12909 },
12910 "add-filter"
12911 );
12912 const visibleFilters = filters.filter((filter) => filter.isVisible);
12913 if (visibleFilters.length === 0) {
12914 return null;
12915 }
12916 const filterComponents = [
12917 ...visibleFilters.map((filter) => {
12918 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
12919 Filter,
12920 {
12921 filter,
12922 view,
12923 fields,
12924 onChangeView,
12925 addFilterRef,
12926 openedFilter
12927 },
12928 filter.field
12929 );
12930 }),
12931 addFilter
12932 ];
12933 filterComponents.push(
12934 /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
12935 ResetFilter,
12936 {
12937 filters,
12938 view,
12939 onChangeView
12940 },
12941 "reset-filters"
12942 )
12943 );
12944 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
12945 Stack,
12946 {
12947 direction: "row",
12948 justify: "flex-start",
12949 gap: "sm",
12950 style: { width: "fit-content" },
12951 wrap: "wrap",
12952 className,
12953 children: filterComponents
12954 }
12955 );
12956 }
12957 var filters_default = (0, import_element31.memo)(Filters);
12958
12959 // packages/dataviews/build-module/components/dataviews-filters/toggle.mjs
12960 var import_element32 = __toESM(require_element(), 1);
12961 var import_components24 = __toESM(require_components(), 1);
12962 var import_i18n27 = __toESM(require_i18n(), 1);
12963 var import_jsx_runtime61 = __toESM(require_jsx_runtime(), 1);
12964 function FiltersToggle() {
12965 const {
12966 filters,
12967 view,
12968 onChangeView,
12969 setOpenedFilter,
12970 isShowingFilter,
12971 setIsShowingFilter
12972 } = (0, import_element32.useContext)(dataviews_context_default);
12973 const buttonRef = (0, import_element32.useRef)(null);
12974 const onChangeViewWithFilterVisibility = (0, import_element32.useCallback)(
12975 (_view) => {
12976 onChangeView(_view);
12977 setIsShowingFilter(true);
12978 },
12979 [onChangeView, setIsShowingFilter]
12980 );
12981 if (filters.length === 0) {
12982 return null;
12983 }
12984 const hasVisibleFilters = filters.some((filter) => filter.isVisible);
12985 const addFilterButtonProps = {
12986 label: (0, import_i18n27.__)("Add filter"),
12987 "aria-expanded": false,
12988 isPressed: false
12989 };
12990 const toggleFiltersButtonProps = {
12991 label: (0, import_i18n27._x)("Filter", "verb"),
12992 "aria-expanded": isShowingFilter,
12993 isPressed: isShowingFilter,
12994 onClick: () => {
12995 if (!isShowingFilter) {
12996 setOpenedFilter(null);
12997 }
12998 setIsShowingFilter(!isShowingFilter);
12999 }
13000 };
13001 const hasPrimaryOrLockedFilters = filters.some(
13002 (filter) => filter.isPrimary || filter.isLocked
13003 );
13004 const buttonComponent = /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13005 import_components24.Button,
13006 {
13007 ref: buttonRef,
13008 className: "dataviews-filters__visibility-toggle",
13009 size: "compact",
13010 icon: funnel_default,
13011 disabled: hasPrimaryOrLockedFilters,
13012 accessibleWhenDisabled: true,
13013 ...hasVisibleFilters ? toggleFiltersButtonProps : addFilterButtonProps
13014 }
13015 );
13016 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-filters__container-visibility-toggle", children: !hasVisibleFilters ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13017 AddFilterMenu,
13018 {
13019 filters,
13020 view,
13021 onChangeView: onChangeViewWithFilterVisibility,
13022 setOpenedFilter,
13023 triggerProps: { render: buttonComponent }
13024 }
13025 ) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
13026 FilterVisibilityToggle,
13027 {
13028 buttonRef,
13029 filtersCount: view.filters?.length,
13030 children: buttonComponent
13031 }
13032 ) });
13033 }
13034 function FilterVisibilityToggle({
13035 buttonRef,
13036 filtersCount,
13037 children
13038 }) {
13039 (0, import_element32.useEffect)(
13040 () => () => {
13041 buttonRef.current?.focus();
13042 },
13043 [buttonRef]
13044 );
13045 return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [
13046 children,
13047 !!filtersCount && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "dataviews-filters-toggle__count", children: filtersCount })
13048 ] });
13049 }
13050 var toggle_default = FiltersToggle;
13051
13052 // packages/dataviews/build-module/components/dataviews-filters/filters-toggled.mjs
13053 var import_element33 = __toESM(require_element(), 1);
13054 var import_jsx_runtime62 = __toESM(require_jsx_runtime(), 1);
13055 function FiltersToggled(props) {
13056 const { isShowingFilter } = (0, import_element33.useContext)(dataviews_context_default);
13057 if (!isShowingFilter) {
13058 return null;
13059 }
13060 return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(filters_default, { ...props });
13061 }
13062 var filters_toggled_default = FiltersToggled;
13063
13064 // packages/dataviews/build-module/components/dataviews-layout/index.mjs
13065 var import_element34 = __toESM(require_element(), 1);
13066 var import_i18n28 = __toESM(require_i18n(), 1);
13067 var import_jsx_runtime63 = __toESM(require_jsx_runtime(), 1);
13068 function DataViewsLayout({ className }) {
13069 const {
13070 actions = [],
13071 data,
13072 fields,
13073 getItemId,
13074 getItemLevel,
13075 hasInitiallyLoaded,
13076 isLoading,
13077 view,
13078 onChangeView,
13079 selection,
13080 onChangeSelection,
13081 setOpenedFilter,
13082 onClickItem,
13083 isItemClickable,
13084 renderItemLink,
13085 defaultLayouts,
13086 empty = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("p", { children: (0, import_i18n28.__)("No results") })
13087 } = (0, import_element34.useContext)(dataviews_context_default);
13088 if (!hasInitiallyLoaded) {
13089 return null;
13090 }
13091 const ViewComponent = VIEW_LAYOUTS.find(
13092 (v2) => v2.type === view.type && defaultLayouts[v2.type]
13093 )?.component;
13094 return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
13095 ViewComponent,
13096 {
13097 className,
13098 actions,
13099 data,
13100 fields,
13101 getItemId,
13102 getItemLevel,
13103 isLoading,
13104 onChangeView,
13105 onChangeSelection,
13106 selection,
13107 setOpenedFilter,
13108 onClickItem,
13109 renderItemLink,
13110 isItemClickable,
13111 view,
13112 empty
13113 }
13114 );
13115 }
13116
13117 // packages/dataviews/build-module/components/dataviews-footer/index.mjs
13118 var import_element35 = __toESM(require_element(), 1);
13119 var import_jsx_runtime64 = __toESM(require_jsx_runtime(), 1);
13120 var EMPTY_ARRAY5 = [];
13121 function DataViewsFooter() {
13122 const {
13123 view,
13124 paginationInfo: { totalItems = 0, totalPages },
13125 data,
13126 actions = EMPTY_ARRAY5,
13127 isLoading,
13128 hasInitiallyLoaded,
13129 hasInfiniteScrollHandler
13130 } = (0, import_element35.useContext)(dataviews_context_default);
13131 const isRefreshing = !!isLoading && hasInitiallyLoaded && !hasInfiniteScrollHandler && !!data?.length;
13132 const isDelayedRefreshing = useDelayedLoading(!!isRefreshing);
13133 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data) && [LAYOUT_TABLE, LAYOUT_GRID].includes(view.type);
13134 if (!isRefreshing && (!totalItems || !totalPages || totalPages <= 1 && !hasBulkActions)) {
13135 return null;
13136 }
13137 return (!!totalItems || isRefreshing) && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
13138 "div",
13139 {
13140 className: "dataviews-footer",
13141 inert: isRefreshing ? "true" : void 0,
13142 children: /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(
13143 Stack,
13144 {
13145 direction: "row",
13146 justify: "end",
13147 align: "center",
13148 className: clsx_default("dataviews-footer__content", {
13149 "is-refreshing": isDelayedRefreshing
13150 }),
13151 gap: "sm",
13152 children: [
13153 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(BulkActionsFooter, {}),
13154 /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(dataviews_pagination_default, {})
13155 ]
13156 }
13157 )
13158 }
13159 );
13160 }
13161
13162 // packages/dataviews/build-module/components/dataviews-search/index.mjs
13163 var import_i18n29 = __toESM(require_i18n(), 1);
13164 var import_element36 = __toESM(require_element(), 1);
13165 var import_components25 = __toESM(require_components(), 1);
13166 var import_compose10 = __toESM(require_compose(), 1);
13167 var import_jsx_runtime65 = __toESM(require_jsx_runtime(), 1);
13168 var DataViewsSearch = (0, import_element36.memo)(function Search({ label }) {
13169 const { view, onChangeView } = (0, import_element36.useContext)(dataviews_context_default);
13170 const [search, setSearch, debouncedSearch] = (0, import_compose10.useDebouncedInput)(
13171 view.search
13172 );
13173 (0, import_element36.useEffect)(() => {
13174 if (view.search !== debouncedSearch) {
13175 setSearch(view.search ?? "");
13176 }
13177 }, [view.search, setSearch]);
13178 const onChangeViewRef = (0, import_element36.useRef)(onChangeView);
13179 const viewRef = (0, import_element36.useRef)(view);
13180 (0, import_element36.useEffect)(() => {
13181 onChangeViewRef.current = onChangeView;
13182 viewRef.current = view;
13183 }, [onChangeView, view]);
13184 (0, import_element36.useEffect)(() => {
13185 if (debouncedSearch !== viewRef.current?.search) {
13186 onChangeViewRef.current({
13187 ...viewRef.current,
13188 page: 1,
13189 search: debouncedSearch
13190 });
13191 }
13192 }, [debouncedSearch]);
13193 const searchLabel = label || (0, import_i18n29.__)("Search");
13194 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
13195 import_components25.SearchControl,
13196 {
13197 className: "dataviews-search",
13198 onChange: setSearch,
13199 value: search,
13200 label: searchLabel,
13201 placeholder: searchLabel,
13202 size: "compact"
13203 }
13204 );
13205 });
13206 var dataviews_search_default = DataViewsSearch;
13207
13208 // packages/dataviews/build-module/components/dataviews-view-config/index.mjs
13209 var import_components27 = __toESM(require_components(), 1);
13210 var import_i18n31 = __toESM(require_i18n(), 1);
13211 var import_element38 = __toESM(require_element(), 1);
13212 var import_warning = __toESM(require_warning(), 1);
13213 var import_compose11 = __toESM(require_compose(), 1);
13214
13215 // packages/dataviews/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs
13216 var import_components26 = __toESM(require_components(), 1);
13217 var import_i18n30 = __toESM(require_i18n(), 1);
13218 var import_element37 = __toESM(require_element(), 1);
13219 var import_jsx_runtime66 = __toESM(require_jsx_runtime(), 1);
13220 function InfiniteScrollToggle() {
13221 const context = (0, import_element37.useContext)(dataviews_context_default);
13222 const { view, onChangeView } = context;
13223 const infiniteScrollEnabled = view.infiniteScrollEnabled ?? false;
13224 if (!context.hasInfiniteScrollHandler) {
13225 return null;
13226 }
13227 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
13228 import_components26.ToggleControl,
13229 {
13230 label: (0, import_i18n30.__)("Enable infinite scroll"),
13231 help: (0, import_i18n30.__)(
13232 "Automatically load more content as you scroll, instead of showing pagination links."
13233 ),
13234 checked: infiniteScrollEnabled,
13235 onChange: (newValue) => {
13236 onChangeView({
13237 ...view,
13238 infiniteScrollEnabled: newValue
13239 });
13240 }
13241 }
13242 );
13243 }
13244
13245 // packages/dataviews/build-module/components/dataviews-view-config/index.mjs
13246 var import_jsx_runtime67 = __toESM(require_jsx_runtime(), 1);
13247 var { Menu: Menu5 } = unlock(import_components27.privateApis);
13248 var DATAVIEWS_CONFIG_POPOVER_PROPS = {
13249 className: "dataviews-config__popover",
13250 placement: "bottom-end",
13251 offset: 9
13252 };
13253 function ViewTypeMenu() {
13254 const { view, onChangeView, defaultLayouts } = (0, import_element38.useContext)(dataviews_context_default);
13255 const availableLayouts = Object.keys(defaultLayouts);
13256 if (availableLayouts.length <= 1) {
13257 return null;
13258 }
13259 const activeView = VIEW_LAYOUTS.find((v2) => view.type === v2.type);
13260 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Menu5, { children: [
13261 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13262 Menu5.TriggerButton,
13263 {
13264 render: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13265 import_components27.Button,
13266 {
13267 size: "compact",
13268 icon: activeView?.icon,
13269 label: (0, import_i18n31.__)("Layout")
13270 }
13271 )
13272 }
13273 ),
13274 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Menu5.Popover, { children: availableLayouts.map((layout) => {
13275 const config = VIEW_LAYOUTS.find(
13276 (v2) => v2.type === layout
13277 );
13278 if (!config) {
13279 return null;
13280 }
13281 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13282 Menu5.RadioItem,
13283 {
13284 value: layout,
13285 name: "view-actions-available-view",
13286 checked: layout === view.type,
13287 hideOnClick: true,
13288 onChange: (e2) => {
13289 switch (e2.target.value) {
13290 case "list":
13291 case "grid":
13292 case "table":
13293 case "pickerGrid":
13294 case "pickerTable":
13295 case "activity":
13296 const viewWithoutLayout = { ...view };
13297 if ("layout" in viewWithoutLayout) {
13298 delete viewWithoutLayout.layout;
13299 }
13300 return onChangeView({
13301 ...viewWithoutLayout,
13302 type: e2.target.value,
13303 ...defaultLayouts[e2.target.value]
13304 });
13305 }
13306 (0, import_warning.default)("Invalid dataview");
13307 },
13308 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Menu5.ItemLabel, { children: config.label })
13309 },
13310 layout
13311 );
13312 }) })
13313 ] });
13314 }
13315 function SortFieldControl() {
13316 const { view, fields, onChangeView } = (0, import_element38.useContext)(dataviews_context_default);
13317 const orderOptions = (0, import_element38.useMemo)(() => {
13318 const sortableFields = fields.filter(
13319 (field) => field.enableSorting !== false
13320 );
13321 return sortableFields.map((field) => {
13322 return {
13323 label: field.label,
13324 value: field.id
13325 };
13326 });
13327 }, [fields]);
13328 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13329 import_components27.SelectControl,
13330 {
13331 __next40pxDefaultSize: true,
13332 label: (0, import_i18n31.__)("Sort by"),
13333 value: view.sort?.field,
13334 options: orderOptions,
13335 onChange: (value) => {
13336 onChangeView({
13337 ...view,
13338 sort: {
13339 direction: view?.sort?.direction || "desc",
13340 field: value
13341 },
13342 showLevels: false
13343 });
13344 }
13345 }
13346 );
13347 }
13348 function SortDirectionControl() {
13349 const { view, fields, onChangeView } = (0, import_element38.useContext)(dataviews_context_default);
13350 const sortableFields = fields.filter(
13351 (field) => field.enableSorting !== false
13352 );
13353 if (sortableFields.length === 0) {
13354 return null;
13355 }
13356 let value = view.sort?.direction;
13357 if (!value && view.sort?.field) {
13358 value = "desc";
13359 }
13360 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13361 import_components27.__experimentalToggleGroupControl,
13362 {
13363 className: "dataviews-view-config__sort-direction",
13364 __next40pxDefaultSize: true,
13365 isBlock: true,
13366 label: (0, import_i18n31.__)("Order"),
13367 value,
13368 onChange: (newDirection) => {
13369 if (newDirection === "asc" || newDirection === "desc") {
13370 onChangeView({
13371 ...view,
13372 sort: {
13373 direction: newDirection,
13374 field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field.
13375 fields.find(
13376 (field) => field.enableSorting !== false
13377 )?.id || ""
13378 },
13379 showLevels: false
13380 });
13381 return;
13382 }
13383 (0, import_warning.default)("Invalid direction");
13384 },
13385 children: SORTING_DIRECTIONS.map((direction) => {
13386 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13387 import_components27.__experimentalToggleGroupControlOptionIcon,
13388 {
13389 value: direction,
13390 icon: sortIcons[direction],
13391 label: sortLabels[direction]
13392 },
13393 direction
13394 );
13395 })
13396 }
13397 );
13398 }
13399 function ItemsPerPageControl() {
13400 const { view, config, onChangeView } = (0, import_element38.useContext)(dataviews_context_default);
13401 const { infiniteScrollEnabled } = view;
13402 if (!config || !config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled) {
13403 return null;
13404 }
13405 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13406 import_components27.__experimentalToggleGroupControl,
13407 {
13408 __next40pxDefaultSize: true,
13409 isBlock: true,
13410 label: (0, import_i18n31.__)("Items per page"),
13411 value: view.perPage || 10,
13412 disabled: !view?.sort?.field,
13413 onChange: (newItemsPerPage) => {
13414 const newItemsPerPageNumber = typeof newItemsPerPage === "number" || newItemsPerPage === void 0 ? newItemsPerPage : parseInt(newItemsPerPage, 10);
13415 onChangeView({
13416 ...view,
13417 perPage: newItemsPerPageNumber,
13418 page: 1
13419 });
13420 },
13421 children: config.perPageSizes.map((value) => {
13422 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13423 import_components27.__experimentalToggleGroupControlOption,
13424 {
13425 value,
13426 label: value.toString()
13427 },
13428 value
13429 );
13430 })
13431 }
13432 );
13433 }
13434 function ResetViewButton() {
13435 const { onReset } = (0, import_element38.useContext)(dataviews_context_default);
13436 if (onReset === void 0) {
13437 return null;
13438 }
13439 const isDisabled = onReset === false;
13440 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13441 import_components27.Button,
13442 {
13443 variant: "tertiary",
13444 size: "compact",
13445 disabled: isDisabled,
13446 accessibleWhenDisabled: true,
13447 className: "dataviews-view-config__reset-button",
13448 onClick: () => {
13449 if (typeof onReset === "function") {
13450 onReset();
13451 }
13452 },
13453 children: (0, import_i18n31.__)("Reset view")
13454 }
13455 );
13456 }
13457 function DataviewsViewConfigDropdown() {
13458 const { view, onReset } = (0, import_element38.useContext)(dataviews_context_default);
13459 const popoverId = (0, import_compose11.useInstanceId)(
13460 _DataViewsViewConfig,
13461 "dataviews-view-config-dropdown"
13462 );
13463 const activeLayout = VIEW_LAYOUTS.find(
13464 (layout) => layout.type === view.type
13465 );
13466 const isModified = typeof onReset === "function";
13467 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13468 import_components27.Dropdown,
13469 {
13470 expandOnMobile: true,
13471 popoverProps: {
13472 ...DATAVIEWS_CONFIG_POPOVER_PROPS,
13473 id: popoverId
13474 },
13475 renderToggle: ({ onToggle, isOpen }) => {
13476 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "dataviews-view-config__toggle-wrapper", children: [
13477 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13478 import_components27.Button,
13479 {
13480 size: "compact",
13481 icon: cog_default,
13482 label: (0, import_i18n31._x)(
13483 "View options",
13484 "View is used as a noun"
13485 ),
13486 onClick: onToggle,
13487 "aria-expanded": isOpen ? "true" : "false",
13488 "aria-controls": popoverId
13489 }
13490 ),
13491 isModified && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("span", { className: "dataviews-view-config__modified-indicator" })
13492 ] });
13493 },
13494 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13495 import_components27.__experimentalDropdownContentWrapper,
13496 {
13497 paddingSize: "medium",
13498 className: "dataviews-config__popover-content-wrapper",
13499 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
13500 Stack,
13501 {
13502 direction: "column",
13503 className: "dataviews-view-config",
13504 gap: "xl",
13505 children: [
13506 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
13507 Stack,
13508 {
13509 direction: "row",
13510 justify: "space-between",
13511 align: "center",
13512 className: "dataviews-view-config__header",
13513 children: [
13514 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
13515 import_components27.__experimentalHeading,
13516 {
13517 level: 2,
13518 className: "dataviews-settings-section__title",
13519 children: (0, import_i18n31.__)("Appearance")
13520 }
13521 ),
13522 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ResetViewButton, {})
13523 ]
13524 }
13525 ),
13526 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Stack, { direction: "column", gap: "lg", children: [
13527 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
13528 Stack,
13529 {
13530 direction: "row",
13531 gap: "sm",
13532 className: "dataviews-view-config__sort-controls",
13533 children: [
13534 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(SortFieldControl, {}),
13535 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(SortDirectionControl, {})
13536 ]
13537 }
13538 ),
13539 !!activeLayout?.viewConfigOptions && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(activeLayout.viewConfigOptions, {}),
13540 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(InfiniteScrollToggle, {}),
13541 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ItemsPerPageControl, {}),
13542 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PropertiesSection, {})
13543 ] })
13544 ]
13545 }
13546 )
13547 }
13548 )
13549 }
13550 );
13551 }
13552 function _DataViewsViewConfig() {
13553 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [
13554 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ViewTypeMenu, {}),
13555 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(DataviewsViewConfigDropdown, {})
13556 ] });
13557 }
13558 var DataViewsViewConfig = (0, import_element38.memo)(_DataViewsViewConfig);
13559 var dataviews_view_config_default = DataViewsViewConfig;
13560
13561 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
13562 var import_components28 = __toESM(require_components(), 1);
13563 var import_element39 = __toESM(require_element(), 1);
13564
13565 // packages/dataviews/build-module/components/dataform-controls/utils/get-custom-validity.mjs
13566 function getCustomValidity(isValid2, validity) {
13567 let customValidity;
13568 if (isValid2?.required && validity?.required) {
13569 customValidity = validity?.required?.message ? validity.required : void 0;
13570 } else if (isValid2?.pattern && validity?.pattern) {
13571 customValidity = validity.pattern;
13572 } else if (isValid2?.min && validity?.min) {
13573 customValidity = validity.min;
13574 } else if (isValid2?.max && validity?.max) {
13575 customValidity = validity.max;
13576 } else if (isValid2?.minLength && validity?.minLength) {
13577 customValidity = validity.minLength;
13578 } else if (isValid2?.maxLength && validity?.maxLength) {
13579 customValidity = validity.maxLength;
13580 } else if (isValid2?.elements && validity?.elements) {
13581 customValidity = validity.elements;
13582 } else if (validity?.custom) {
13583 customValidity = validity.custom;
13584 }
13585 return customValidity;
13586 }
13587
13588 // packages/dataviews/build-module/components/dataform-controls/checkbox.mjs
13589 var import_jsx_runtime68 = __toESM(require_jsx_runtime(), 1);
13590 var { ValidatedCheckboxControl } = unlock(import_components28.privateApis);
13591 function Checkbox({
13592 field,
13593 onChange,
13594 data,
13595 hideLabelFromVision,
13596 markWhenOptional,
13597 validity
13598 }) {
13599 const { getValue, setValue, label, description, isValid: isValid2 } = field;
13600 const onChangeControl = (0, import_element39.useCallback)(() => {
13601 onChange(
13602 setValue({ item: data, value: !getValue({ item: data }) })
13603 );
13604 }, [data, getValue, onChange, setValue]);
13605 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
13606 ValidatedCheckboxControl,
13607 {
13608 required: !!field.isValid?.required,
13609 markWhenOptional,
13610 customValidity: getCustomValidity(isValid2, validity),
13611 hidden: hideLabelFromVision,
13612 label,
13613 help: description,
13614 checked: getValue({ item: data }),
13615 onChange: onChangeControl
13616 }
13617 );
13618 }
13619
13620 // packages/dataviews/build-module/components/dataform-controls/combobox.mjs
13621 var import_components29 = __toESM(require_components(), 1);
13622 var import_element40 = __toESM(require_element(), 1);
13623 var import_jsx_runtime69 = __toESM(require_jsx_runtime(), 1);
13624 var { ValidatedComboboxControl } = unlock(import_components29.privateApis);
13625 function Combobox3({
13626 data,
13627 field,
13628 onChange,
13629 hideLabelFromVision,
13630 validity
13631 }) {
13632 const { label, description, placeholder, getValue, setValue, isValid: isValid2 } = field;
13633 const value = getValue({ item: data }) ?? "";
13634 const onChangeControl = (0, import_element40.useCallback)(
13635 (newValue) => onChange(setValue({ item: data, value: newValue ?? "" })),
13636 [data, onChange, setValue]
13637 );
13638 const { elements, isLoading } = useElements({
13639 elements: field.elements,
13640 getElements: field.getElements
13641 });
13642 if (isLoading) {
13643 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_components29.Spinner, {});
13644 }
13645 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
13646 ValidatedComboboxControl,
13647 {
13648 required: !!field.isValid?.required,
13649 customValidity: getCustomValidity(isValid2, validity),
13650 label,
13651 value,
13652 help: description,
13653 placeholder,
13654 options: elements,
13655 onChange: onChangeControl,
13656 hideLabelFromVision,
13657 allowReset: true,
13658 expandOnFocus: true
13659 }
13660 );
13661 }
13662
13663 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
13664 var import_components31 = __toESM(require_components(), 1);
13665 var import_element42 = __toESM(require_element(), 1);
13666 var import_i18n33 = __toESM(require_i18n(), 1);
13667 var import_date3 = __toESM(require_date(), 1);
13668
13669 // packages/dataviews/build-module/components/dataform-controls/utils/relative-date-control.mjs
13670 var import_components30 = __toESM(require_components(), 1);
13671 var import_element41 = __toESM(require_element(), 1);
13672 var import_i18n32 = __toESM(require_i18n(), 1);
13673 var import_jsx_runtime70 = __toESM(require_jsx_runtime(), 1);
13674 var TIME_UNITS_OPTIONS = {
13675 [OPERATOR_IN_THE_PAST]: [
13676 { value: "days", label: (0, import_i18n32.__)("Days") },
13677 { value: "weeks", label: (0, import_i18n32.__)("Weeks") },
13678 { value: "months", label: (0, import_i18n32.__)("Months") },
13679 { value: "years", label: (0, import_i18n32.__)("Years") }
13680 ],
13681 [OPERATOR_OVER]: [
13682 { value: "days", label: (0, import_i18n32.__)("Days ago") },
13683 { value: "weeks", label: (0, import_i18n32.__)("Weeks ago") },
13684 { value: "months", label: (0, import_i18n32.__)("Months ago") },
13685 { value: "years", label: (0, import_i18n32.__)("Years ago") }
13686 ]
13687 };
13688 function RelativeDateControl({
13689 className,
13690 data,
13691 field,
13692 onChange,
13693 hideLabelFromVision,
13694 operator
13695 }) {
13696 const options = TIME_UNITS_OPTIONS[operator === OPERATOR_IN_THE_PAST ? "inThePast" : "over"];
13697 const { id, label, getValue, setValue } = field;
13698 const fieldValue = getValue({ item: data });
13699 const { value: relValue = "", unit = options[0].value } = fieldValue && typeof fieldValue === "object" ? fieldValue : {};
13700 const onChangeValue = (0, import_element41.useCallback)(
13701 (newValue) => onChange(
13702 setValue({
13703 item: data,
13704 value: { value: Number(newValue), unit }
13705 })
13706 ),
13707 [onChange, setValue, data, unit]
13708 );
13709 const onChangeUnit = (0, import_element41.useCallback)(
13710 (newUnit) => onChange(
13711 setValue({
13712 item: data,
13713 value: { value: relValue, unit: newUnit }
13714 })
13715 ),
13716 [onChange, setValue, data, relValue]
13717 );
13718 return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
13719 import_components30.BaseControl,
13720 {
13721 id,
13722 className: clsx_default(className, "dataviews-controls__relative-date"),
13723 label,
13724 hideLabelFromVision,
13725 children: /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(Stack, { direction: "row", gap: "sm", children: [
13726 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
13727 import_components30.__experimentalNumberControl,
13728 {
13729 __next40pxDefaultSize: true,
13730 className: "dataviews-controls__relative-date-number",
13731 spinControls: "none",
13732 min: 1,
13733 step: 1,
13734 value: relValue,
13735 onChange: onChangeValue
13736 }
13737 ),
13738 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
13739 import_components30.SelectControl,
13740 {
13741 className: "dataviews-controls__relative-date-unit",
13742 __next40pxDefaultSize: true,
13743 label: (0, import_i18n32.__)("Unit"),
13744 value: unit,
13745 options,
13746 onChange: onChangeUnit,
13747 hideLabelFromVision: true
13748 }
13749 )
13750 ] })
13751 }
13752 );
13753 }
13754
13755 // packages/dataviews/build-module/field-types/utils/parse-date-time.mjs
13756 var import_date2 = __toESM(require_date(), 1);
13757 function parseDateTime(dateTimeString) {
13758 if (!dateTimeString) {
13759 return null;
13760 }
13761 const parsed = (0, import_date2.getDate)(dateTimeString);
13762 return parsed && isValid(parsed) ? parsed : null;
13763 }
13764
13765 // packages/dataviews/build-module/components/dataform-controls/datetime.mjs
13766 var import_jsx_runtime71 = __toESM(require_jsx_runtime(), 1);
13767 var { DateCalendar, ValidatedInputControl } = unlock(import_components31.privateApis);
13768 var formatDateTime = (date) => {
13769 if (!date) {
13770 return "";
13771 }
13772 if (typeof date === "string") {
13773 return date;
13774 }
13775 return format(date, "yyyy-MM-dd'T'HH:mm");
13776 };
13777 function CalendarDateTimeControl({
13778 data,
13779 field,
13780 onChange,
13781 hideLabelFromVision,
13782 markWhenOptional,
13783 validity
13784 }) {
13785 const { id, label, description, setValue, getValue, isValid: isValid2 } = field;
13786 const fieldValue = getValue({ item: data });
13787 const value = typeof fieldValue === "string" ? fieldValue : void 0;
13788 const [calendarMonth, setCalendarMonth] = (0, import_element42.useState)(() => {
13789 const parsedDate = parseDateTime(value);
13790 return parsedDate || /* @__PURE__ */ new Date();
13791 });
13792 const inputControlRef = (0, import_element42.useRef)(null);
13793 const validationTimeoutRef = (0, import_element42.useRef)(void 0);
13794 const previousFocusRef = (0, import_element42.useRef)(null);
13795 const onChangeCallback = (0, import_element42.useCallback)(
13796 (newValue) => onChange(setValue({ item: data, value: newValue })),
13797 [data, onChange, setValue]
13798 );
13799 (0, import_element42.useEffect)(() => {
13800 return () => {
13801 if (validationTimeoutRef.current) {
13802 clearTimeout(validationTimeoutRef.current);
13803 }
13804 };
13805 }, []);
13806 const onSelectDate = (0, import_element42.useCallback)(
13807 (newDate) => {
13808 let dateTimeValue;
13809 if (newDate) {
13810 let finalDateTime = newDate;
13811 if (value) {
13812 const currentDateTime = parseDateTime(value);
13813 if (currentDateTime) {
13814 finalDateTime = new Date(newDate);
13815 finalDateTime.setHours(currentDateTime.getHours());
13816 finalDateTime.setMinutes(
13817 currentDateTime.getMinutes()
13818 );
13819 }
13820 }
13821 dateTimeValue = finalDateTime.toISOString();
13822 onChangeCallback(dateTimeValue);
13823 if (validationTimeoutRef.current) {
13824 clearTimeout(validationTimeoutRef.current);
13825 }
13826 } else {
13827 onChangeCallback(void 0);
13828 }
13829 previousFocusRef.current = inputControlRef.current && inputControlRef.current.ownerDocument.activeElement;
13830 validationTimeoutRef.current = setTimeout(() => {
13831 if (inputControlRef.current) {
13832 inputControlRef.current.focus();
13833 inputControlRef.current.blur();
13834 onChangeCallback(dateTimeValue);
13835 if (previousFocusRef.current && previousFocusRef.current instanceof HTMLElement) {
13836 previousFocusRef.current.focus();
13837 }
13838 }
13839 }, 0);
13840 },
13841 [onChangeCallback, value]
13842 );
13843 const handleManualDateTimeChange = (0, import_element42.useCallback)(
13844 (newValue) => {
13845 if (newValue) {
13846 const dateTime = new Date(newValue);
13847 onChangeCallback(dateTime.toISOString());
13848 const parsedDate = parseDateTime(dateTime.toISOString());
13849 if (parsedDate) {
13850 setCalendarMonth(parsedDate);
13851 }
13852 } else {
13853 onChangeCallback(void 0);
13854 }
13855 },
13856 [onChangeCallback]
13857 );
13858 const { format: fieldFormat } = field;
13859 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek;
13860 const {
13861 timezone: { string: timezoneString }
13862 } = (0, import_date3.getSettings)();
13863 let displayLabel = label;
13864 if (isValid2?.required && !markWhenOptional && !hideLabelFromVision) {
13865 displayLabel = `${label} (${(0, import_i18n33.__)("Required")})`;
13866 } else if (!isValid2?.required && markWhenOptional && !hideLabelFromVision) {
13867 displayLabel = `${label} (${(0, import_i18n33.__)("Optional")})`;
13868 }
13869 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
13870 import_components31.BaseControl,
13871 {
13872 id,
13873 label: displayLabel,
13874 help: description,
13875 hideLabelFromVision,
13876 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(Stack, { direction: "column", gap: "lg", children: [
13877 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
13878 DateCalendar,
13879 {
13880 style: { width: "100%" },
13881 selected: value ? parseDateTime(value) || void 0 : void 0,
13882 onSelect: onSelectDate,
13883 month: calendarMonth,
13884 onMonthChange: setCalendarMonth,
13885 timeZone: timezoneString || void 0,
13886 weekStartsOn
13887 }
13888 ),
13889 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
13890 ValidatedInputControl,
13891 {
13892 ref: inputControlRef,
13893 __next40pxDefaultSize: true,
13894 required: !!isValid2?.required,
13895 customValidity: getCustomValidity(isValid2, validity),
13896 type: "datetime-local",
13897 label: (0, import_i18n33.__)("Date time"),
13898 hideLabelFromVision: true,
13899 value: value ? formatDateTime(
13900 parseDateTime(value) || void 0
13901 ) : "",
13902 onChange: handleManualDateTimeChange
13903 }
13904 )
13905 ] })
13906 }
13907 );
13908 }
13909 function DateTime({
13910 data,
13911 field,
13912 onChange,
13913 hideLabelFromVision,
13914 markWhenOptional,
13915 operator,
13916 validity
13917 }) {
13918 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
13919 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
13920 RelativeDateControl,
13921 {
13922 className: "dataviews-controls__datetime",
13923 data,
13924 field,
13925 onChange,
13926 hideLabelFromVision,
13927 operator
13928 }
13929 );
13930 }
13931 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
13932 CalendarDateTimeControl,
13933 {
13934 data,
13935 field,
13936 onChange,
13937 hideLabelFromVision,
13938 markWhenOptional,
13939 validity
13940 }
13941 );
13942 }
13943
13944 // packages/dataviews/build-module/components/dataform-controls/date.mjs
13945 var import_components32 = __toESM(require_components(), 1);
13946 var import_element43 = __toESM(require_element(), 1);
13947 var import_i18n34 = __toESM(require_i18n(), 1);
13948 var import_date4 = __toESM(require_date(), 1);
13949 var import_jsx_runtime72 = __toESM(require_jsx_runtime(), 1);
13950 var { DateCalendar: DateCalendar2, DateRangeCalendar } = unlock(import_components32.privateApis);
13951 var DATE_PRESETS = [
13952 {
13953 id: "today",
13954 label: (0, import_i18n34.__)("Today"),
13955 getValue: () => (0, import_date4.getDate)(null)
13956 },
13957 {
13958 id: "yesterday",
13959 label: (0, import_i18n34.__)("Yesterday"),
13960 getValue: () => {
13961 const today = (0, import_date4.getDate)(null);
13962 return subDays(today, 1);
13963 }
13964 },
13965 {
13966 id: "past-week",
13967 label: (0, import_i18n34.__)("Past week"),
13968 getValue: () => {
13969 const today = (0, import_date4.getDate)(null);
13970 return subDays(today, 7);
13971 }
13972 },
13973 {
13974 id: "past-month",
13975 label: (0, import_i18n34.__)("Past month"),
13976 getValue: () => {
13977 const today = (0, import_date4.getDate)(null);
13978 return subMonths(today, 1);
13979 }
13980 }
13981 ];
13982 var DATE_RANGE_PRESETS = [
13983 {
13984 id: "last-7-days",
13985 label: (0, import_i18n34.__)("Last 7 days"),
13986 getValue: () => {
13987 const today = (0, import_date4.getDate)(null);
13988 return [subDays(today, 7), today];
13989 }
13990 },
13991 {
13992 id: "last-30-days",
13993 label: (0, import_i18n34.__)("Last 30 days"),
13994 getValue: () => {
13995 const today = (0, import_date4.getDate)(null);
13996 return [subDays(today, 30), today];
13997 }
13998 },
13999 {
14000 id: "month-to-date",
14001 label: (0, import_i18n34.__)("Month to date"),
14002 getValue: () => {
14003 const today = (0, import_date4.getDate)(null);
14004 return [startOfMonth(today), today];
14005 }
14006 },
14007 {
14008 id: "last-year",
14009 label: (0, import_i18n34.__)("Last year"),
14010 getValue: () => {
14011 const today = (0, import_date4.getDate)(null);
14012 return [subYears(today, 1), today];
14013 }
14014 },
14015 {
14016 id: "year-to-date",
14017 label: (0, import_i18n34.__)("Year to date"),
14018 getValue: () => {
14019 const today = (0, import_date4.getDate)(null);
14020 return [startOfYear(today), today];
14021 }
14022 }
14023 ];
14024 var parseDate = (dateString) => {
14025 if (!dateString) {
14026 return null;
14027 }
14028 const parsed = (0, import_date4.getDate)(dateString);
14029 return parsed && isValid(parsed) ? parsed : null;
14030 };
14031 var formatDate = (date) => {
14032 if (!date) {
14033 return "";
14034 }
14035 return typeof date === "string" ? date : format(date, "yyyy-MM-dd");
14036 };
14037 function ValidatedDateControl({
14038 field,
14039 validity,
14040 inputRefs,
14041 isTouched,
14042 setIsTouched,
14043 children
14044 }) {
14045 const { isValid: isValid2 } = field;
14046 const [customValidity, setCustomValidity] = (0, import_element43.useState)(void 0);
14047 const validateRefs = (0, import_element43.useCallback)(() => {
14048 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
14049 for (const ref of refs) {
14050 const input = ref.current;
14051 if (input && !input.validity.valid) {
14052 setCustomValidity({
14053 type: "invalid",
14054 message: input.validationMessage
14055 });
14056 return;
14057 }
14058 }
14059 setCustomValidity(void 0);
14060 }, [inputRefs]);
14061 (0, import_element43.useEffect)(() => {
14062 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
14063 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
14064 for (const ref of refs) {
14065 const input = ref.current;
14066 if (input) {
14067 input.setCustomValidity(
14068 result?.type === "invalid" && result.message ? result.message : ""
14069 );
14070 }
14071 }
14072 }, [inputRefs, isValid2, validity]);
14073 (0, import_element43.useEffect)(() => {
14074 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs];
14075 const handleInvalid = (event) => {
14076 event.preventDefault();
14077 setIsTouched(true);
14078 };
14079 for (const ref of refs) {
14080 ref.current?.addEventListener("invalid", handleInvalid);
14081 }
14082 return () => {
14083 for (const ref of refs) {
14084 ref.current?.removeEventListener("invalid", handleInvalid);
14085 }
14086 };
14087 }, [inputRefs, setIsTouched]);
14088 (0, import_element43.useEffect)(() => {
14089 if (!isTouched) {
14090 return;
14091 }
14092 const result = validity ? getCustomValidity(isValid2, validity) : void 0;
14093 if (result) {
14094 setCustomValidity(result);
14095 } else {
14096 validateRefs();
14097 }
14098 }, [isTouched, isValid2, validity, validateRefs]);
14099 const onBlur = (event) => {
14100 if (isTouched) {
14101 return;
14102 }
14103 if (!event.relatedTarget || !event.currentTarget.contains(event.relatedTarget)) {
14104 setIsTouched(true);
14105 }
14106 };
14107 return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { onBlur, children: [
14108 children,
14109 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { "aria-live": "polite", children: customValidity && /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14110 "p",
14111 {
14112 className: clsx_default(
14113 "components-validated-control__indicator",
14114 customValidity.type === "invalid" ? "is-invalid" : void 0
14115 ),
14116 children: [
14117 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14118 import_components32.Icon,
14119 {
14120 className: "components-validated-control__indicator-icon",
14121 icon: error_default,
14122 size: 16,
14123 fill: "currentColor"
14124 }
14125 ),
14126 customValidity.message
14127 ]
14128 }
14129 ) })
14130 ] });
14131 }
14132 function CalendarDateControl({
14133 data,
14134 field,
14135 onChange,
14136 hideLabelFromVision,
14137 markWhenOptional,
14138 validity
14139 }) {
14140 const {
14141 id,
14142 label,
14143 setValue,
14144 getValue,
14145 isValid: isValid2,
14146 format: fieldFormat
14147 } = field;
14148 const [selectedPresetId, setSelectedPresetId] = (0, import_element43.useState)(
14149 null
14150 );
14151 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
14152 const fieldValue = getValue({ item: data });
14153 const value = typeof fieldValue === "string" ? fieldValue : void 0;
14154 const [calendarMonth, setCalendarMonth] = (0, import_element43.useState)(() => {
14155 const parsedDate = parseDate(value);
14156 return parsedDate || /* @__PURE__ */ new Date();
14157 });
14158 const [isTouched, setIsTouched] = (0, import_element43.useState)(false);
14159 const validityTargetRef = (0, import_element43.useRef)(null);
14160 const onChangeCallback = (0, import_element43.useCallback)(
14161 (newValue) => onChange(setValue({ item: data, value: newValue })),
14162 [data, onChange, setValue]
14163 );
14164 const onSelectDate = (0, import_element43.useCallback)(
14165 (newDate) => {
14166 const dateValue = newDate ? format(newDate, "yyyy-MM-dd") : void 0;
14167 onChangeCallback(dateValue);
14168 setSelectedPresetId(null);
14169 setIsTouched(true);
14170 },
14171 [onChangeCallback]
14172 );
14173 const handlePresetClick = (0, import_element43.useCallback)(
14174 (preset) => {
14175 const presetDate = preset.getValue();
14176 const dateValue = formatDate(presetDate);
14177 setCalendarMonth(presetDate);
14178 onChangeCallback(dateValue);
14179 setSelectedPresetId(preset.id);
14180 setIsTouched(true);
14181 },
14182 [onChangeCallback]
14183 );
14184 const handleManualDateChange = (0, import_element43.useCallback)(
14185 (newValue) => {
14186 onChangeCallback(newValue);
14187 if (newValue) {
14188 const parsedDate = parseDate(newValue);
14189 if (parsedDate) {
14190 setCalendarMonth(parsedDate);
14191 }
14192 }
14193 setSelectedPresetId(null);
14194 setIsTouched(true);
14195 },
14196 [onChangeCallback]
14197 );
14198 const {
14199 timezone: { string: timezoneString }
14200 } = (0, import_date4.getSettings)();
14201 let displayLabel = label;
14202 if (isValid2?.required && !markWhenOptional) {
14203 displayLabel = `${label} (${(0, import_i18n34.__)("Required")})`;
14204 } else if (!isValid2?.required && markWhenOptional) {
14205 displayLabel = `${label} (${(0, import_i18n34.__)("Optional")})`;
14206 }
14207 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14208 ValidatedDateControl,
14209 {
14210 field,
14211 validity,
14212 inputRefs: validityTargetRef,
14213 isTouched,
14214 setIsTouched,
14215 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14216 import_components32.BaseControl,
14217 {
14218 id,
14219 className: "dataviews-controls__date",
14220 label: displayLabel,
14221 hideLabelFromVision,
14222 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(Stack, { direction: "column", gap: "lg", children: [
14223 /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14224 Stack,
14225 {
14226 direction: "row",
14227 gap: "sm",
14228 wrap: "wrap",
14229 justify: "flex-start",
14230 children: [
14231 DATE_PRESETS.map((preset) => {
14232 const isSelected2 = selectedPresetId === preset.id;
14233 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14234 import_components32.Button,
14235 {
14236 className: "dataviews-controls__date-preset",
14237 variant: "tertiary",
14238 isPressed: isSelected2,
14239 size: "small",
14240 onClick: () => handlePresetClick(preset),
14241 children: preset.label
14242 },
14243 preset.id
14244 );
14245 }),
14246 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14247 import_components32.Button,
14248 {
14249 className: "dataviews-controls__date-preset",
14250 variant: "tertiary",
14251 isPressed: !selectedPresetId,
14252 size: "small",
14253 disabled: !!selectedPresetId,
14254 accessibleWhenDisabled: false,
14255 children: (0, import_i18n34.__)("Custom")
14256 }
14257 )
14258 ]
14259 }
14260 ),
14261 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14262 import_components32.__experimentalInputControl,
14263 {
14264 __next40pxDefaultSize: true,
14265 ref: validityTargetRef,
14266 type: "date",
14267 label: (0, import_i18n34.__)("Date"),
14268 hideLabelFromVision: true,
14269 value,
14270 onChange: handleManualDateChange,
14271 required: !!field.isValid?.required
14272 }
14273 ),
14274 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14275 DateCalendar2,
14276 {
14277 style: { width: "100%" },
14278 selected: value ? parseDate(value) || void 0 : void 0,
14279 onSelect: onSelectDate,
14280 month: calendarMonth,
14281 onMonthChange: setCalendarMonth,
14282 timeZone: timezoneString || void 0,
14283 weekStartsOn
14284 }
14285 )
14286 ] })
14287 }
14288 )
14289 }
14290 );
14291 }
14292 function CalendarDateRangeControl({
14293 data,
14294 field,
14295 onChange,
14296 hideLabelFromVision,
14297 markWhenOptional,
14298 validity
14299 }) {
14300 const { id, label, getValue, setValue, format: fieldFormat } = field;
14301 let value;
14302 const fieldValue = getValue({ item: data });
14303 if (Array.isArray(fieldValue) && fieldValue.length === 2 && fieldValue.every((date) => typeof date === "string")) {
14304 value = fieldValue;
14305 }
14306 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date4.getSettings)().l10n.startOfWeek;
14307 const onChangeCallback = (0, import_element43.useCallback)(
14308 (newValue) => {
14309 onChange(
14310 setValue({
14311 item: data,
14312 value: newValue
14313 })
14314 );
14315 },
14316 [data, onChange, setValue]
14317 );
14318 const [selectedPresetId, setSelectedPresetId] = (0, import_element43.useState)(
14319 null
14320 );
14321 const selectedRange = (0, import_element43.useMemo)(() => {
14322 if (!value) {
14323 return { from: void 0, to: void 0 };
14324 }
14325 const [from, to] = value;
14326 return {
14327 from: parseDate(from) || void 0,
14328 to: parseDate(to) || void 0
14329 };
14330 }, [value]);
14331 const [calendarMonth, setCalendarMonth] = (0, import_element43.useState)(() => {
14332 return selectedRange.from || /* @__PURE__ */ new Date();
14333 });
14334 const [isTouched, setIsTouched] = (0, import_element43.useState)(false);
14335 const fromInputRef = (0, import_element43.useRef)(null);
14336 const toInputRef = (0, import_element43.useRef)(null);
14337 const updateDateRange = (0, import_element43.useCallback)(
14338 (fromDate, toDate2) => {
14339 if (fromDate && toDate2) {
14340 onChangeCallback([
14341 formatDate(fromDate),
14342 formatDate(toDate2)
14343 ]);
14344 } else if (!fromDate && !toDate2) {
14345 onChangeCallback(void 0);
14346 }
14347 },
14348 [onChangeCallback]
14349 );
14350 const onSelectCalendarRange = (0, import_element43.useCallback)(
14351 (newRange) => {
14352 updateDateRange(newRange?.from, newRange?.to);
14353 setSelectedPresetId(null);
14354 setIsTouched(true);
14355 },
14356 [updateDateRange]
14357 );
14358 const handlePresetClick = (0, import_element43.useCallback)(
14359 (preset) => {
14360 const [startDate, endDate] = preset.getValue();
14361 setCalendarMonth(startDate);
14362 updateDateRange(startDate, endDate);
14363 setSelectedPresetId(preset.id);
14364 setIsTouched(true);
14365 },
14366 [updateDateRange]
14367 );
14368 const handleManualDateChange = (0, import_element43.useCallback)(
14369 (fromOrTo, newValue) => {
14370 const [currentFrom, currentTo] = value || [
14371 void 0,
14372 void 0
14373 ];
14374 const updatedFrom = fromOrTo === "from" ? newValue : currentFrom;
14375 const updatedTo = fromOrTo === "to" ? newValue : currentTo;
14376 updateDateRange(updatedFrom, updatedTo);
14377 if (newValue) {
14378 const parsedDate = parseDate(newValue);
14379 if (parsedDate) {
14380 setCalendarMonth(parsedDate);
14381 }
14382 }
14383 setSelectedPresetId(null);
14384 setIsTouched(true);
14385 },
14386 [value, updateDateRange]
14387 );
14388 const { timezone } = (0, import_date4.getSettings)();
14389 let displayLabel = label;
14390 if (field.isValid?.required && !markWhenOptional) {
14391 displayLabel = `${label} (${(0, import_i18n34.__)("Required")})`;
14392 } else if (!field.isValid?.required && markWhenOptional) {
14393 displayLabel = `${label} (${(0, import_i18n34.__)("Optional")})`;
14394 }
14395 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14396 ValidatedDateControl,
14397 {
14398 field,
14399 validity,
14400 inputRefs: [fromInputRef, toInputRef],
14401 isTouched,
14402 setIsTouched,
14403 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14404 import_components32.BaseControl,
14405 {
14406 id,
14407 className: "dataviews-controls__date",
14408 label: displayLabel,
14409 hideLabelFromVision,
14410 children: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(Stack, { direction: "column", gap: "lg", children: [
14411 /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14412 Stack,
14413 {
14414 direction: "row",
14415 gap: "sm",
14416 wrap: "wrap",
14417 justify: "flex-start",
14418 children: [
14419 DATE_RANGE_PRESETS.map((preset) => {
14420 const isSelected2 = selectedPresetId === preset.id;
14421 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14422 import_components32.Button,
14423 {
14424 className: "dataviews-controls__date-preset",
14425 variant: "tertiary",
14426 isPressed: isSelected2,
14427 size: "small",
14428 onClick: () => handlePresetClick(preset),
14429 children: preset.label
14430 },
14431 preset.id
14432 );
14433 }),
14434 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14435 import_components32.Button,
14436 {
14437 className: "dataviews-controls__date-preset",
14438 variant: "tertiary",
14439 isPressed: !selectedPresetId,
14440 size: "small",
14441 accessibleWhenDisabled: false,
14442 disabled: !!selectedPresetId,
14443 children: (0, import_i18n34.__)("Custom")
14444 }
14445 )
14446 ]
14447 }
14448 ),
14449 /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
14450 Stack,
14451 {
14452 direction: "row",
14453 gap: "sm",
14454 justify: "space-between",
14455 className: "dataviews-controls__date-range-inputs",
14456 children: [
14457 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14458 import_components32.__experimentalInputControl,
14459 {
14460 __next40pxDefaultSize: true,
14461 ref: fromInputRef,
14462 type: "date",
14463 label: (0, import_i18n34.__)("From"),
14464 hideLabelFromVision: true,
14465 value: value?.[0],
14466 onChange: (newValue) => handleManualDateChange("from", newValue),
14467 required: !!field.isValid?.required
14468 }
14469 ),
14470 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14471 import_components32.__experimentalInputControl,
14472 {
14473 __next40pxDefaultSize: true,
14474 ref: toInputRef,
14475 type: "date",
14476 label: (0, import_i18n34.__)("To"),
14477 hideLabelFromVision: true,
14478 value: value?.[1],
14479 onChange: (newValue) => handleManualDateChange("to", newValue),
14480 required: !!field.isValid?.required
14481 }
14482 )
14483 ]
14484 }
14485 ),
14486 /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14487 DateRangeCalendar,
14488 {
14489 style: { width: "100%" },
14490 selected: selectedRange,
14491 onSelect: onSelectCalendarRange,
14492 month: calendarMonth,
14493 onMonthChange: setCalendarMonth,
14494 timeZone: timezone.string || void 0,
14495 weekStartsOn
14496 }
14497 )
14498 ] })
14499 }
14500 )
14501 }
14502 );
14503 }
14504 function DateControl({
14505 data,
14506 field,
14507 onChange,
14508 hideLabelFromVision,
14509 markWhenOptional,
14510 operator,
14511 validity
14512 }) {
14513 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
14514 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14515 RelativeDateControl,
14516 {
14517 className: "dataviews-controls__date",
14518 data,
14519 field,
14520 onChange,
14521 hideLabelFromVision,
14522 operator
14523 }
14524 );
14525 }
14526 if (operator === OPERATOR_BETWEEN) {
14527 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14528 CalendarDateRangeControl,
14529 {
14530 data,
14531 field,
14532 onChange,
14533 hideLabelFromVision,
14534 markWhenOptional,
14535 validity
14536 }
14537 );
14538 }
14539 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
14540 CalendarDateControl,
14541 {
14542 data,
14543 field,
14544 onChange,
14545 hideLabelFromVision,
14546 markWhenOptional,
14547 validity
14548 }
14549 );
14550 }
14551
14552 // packages/dataviews/build-module/components/dataform-controls/select.mjs
14553 var import_components33 = __toESM(require_components(), 1);
14554 var import_element44 = __toESM(require_element(), 1);
14555 var import_jsx_runtime73 = __toESM(require_jsx_runtime(), 1);
14556 var { ValidatedSelectControl } = unlock(import_components33.privateApis);
14557 function Select({
14558 data,
14559 field,
14560 onChange,
14561 hideLabelFromVision,
14562 markWhenOptional,
14563 validity
14564 }) {
14565 const { type, label, description, getValue, setValue, isValid: isValid2 } = field;
14566 const isMultiple = type === "array";
14567 const value = getValue({ item: data }) ?? (isMultiple ? [] : "");
14568 const onChangeControl = (0, import_element44.useCallback)(
14569 (newValue) => onChange(setValue({ item: data, value: newValue })),
14570 [data, onChange, setValue]
14571 );
14572 const { elements, isLoading } = useElements({
14573 elements: field.elements,
14574 getElements: field.getElements
14575 });
14576 if (isLoading) {
14577 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_components33.Spinner, {});
14578 }
14579 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
14580 ValidatedSelectControl,
14581 {
14582 required: !!field.isValid?.required,
14583 markWhenOptional,
14584 customValidity: getCustomValidity(isValid2, validity),
14585 label,
14586 value,
14587 help: description,
14588 options: elements,
14589 onChange: onChangeControl,
14590 __next40pxDefaultSize: true,
14591 hideLabelFromVision,
14592 multiple: isMultiple
14593 }
14594 );
14595 }
14596
14597 // packages/dataviews/build-module/components/dataform-controls/adaptive-select.mjs
14598 var import_jsx_runtime74 = __toESM(require_jsx_runtime(), 1);
14599 var ELEMENTS_THRESHOLD = 10;
14600 function AdaptiveSelect(props) {
14601 const { field } = props;
14602 const { elements } = useElements({
14603 elements: field.elements,
14604 getElements: field.getElements
14605 });
14606 if (elements.length >= ELEMENTS_THRESHOLD) {
14607 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(Combobox3, { ...props });
14608 }
14609 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(Select, { ...props });
14610 }
14611
14612 // packages/dataviews/build-module/components/dataform-controls/email.mjs
14613 var import_components35 = __toESM(require_components(), 1);
14614
14615 // packages/dataviews/build-module/components/dataform-controls/utils/validated-input.mjs
14616 var import_components34 = __toESM(require_components(), 1);
14617 var import_element45 = __toESM(require_element(), 1);
14618 var import_jsx_runtime75 = __toESM(require_jsx_runtime(), 1);
14619 var { ValidatedInputControl: ValidatedInputControl2 } = unlock(import_components34.privateApis);
14620 function ValidatedText({
14621 data,
14622 field,
14623 onChange,
14624 hideLabelFromVision,
14625 markWhenOptional,
14626 type,
14627 prefix,
14628 suffix,
14629 validity
14630 }) {
14631 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field;
14632 const value = getValue({ item: data });
14633 const onChangeControl = (0, import_element45.useCallback)(
14634 (newValue) => onChange(
14635 setValue({
14636 item: data,
14637 value: newValue
14638 })
14639 ),
14640 [data, setValue, onChange]
14641 );
14642 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
14643 ValidatedInputControl2,
14644 {
14645 required: !!isValid2.required,
14646 markWhenOptional,
14647 customValidity: getCustomValidity(isValid2, validity),
14648 label,
14649 placeholder,
14650 value: value ?? "",
14651 help: description,
14652 onChange: onChangeControl,
14653 hideLabelFromVision,
14654 type,
14655 prefix,
14656 suffix,
14657 pattern: isValid2.pattern ? isValid2.pattern.constraint : void 0,
14658 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
14659 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0,
14660 __next40pxDefaultSize: true
14661 }
14662 );
14663 }
14664
14665 // packages/dataviews/build-module/components/dataform-controls/email.mjs
14666 var import_jsx_runtime76 = __toESM(require_jsx_runtime(), 1);
14667 function Email({
14668 data,
14669 field,
14670 onChange,
14671 hideLabelFromVision,
14672 markWhenOptional,
14673 validity
14674 }) {
14675 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
14676 ValidatedText,
14677 {
14678 ...{
14679 data,
14680 field,
14681 onChange,
14682 hideLabelFromVision,
14683 markWhenOptional,
14684 validity,
14685 type: "email",
14686 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 }) })
14687 }
14688 }
14689 );
14690 }
14691
14692 // packages/dataviews/build-module/components/dataform-controls/telephone.mjs
14693 var import_components36 = __toESM(require_components(), 1);
14694 var import_jsx_runtime77 = __toESM(require_jsx_runtime(), 1);
14695 function Telephone({
14696 data,
14697 field,
14698 onChange,
14699 hideLabelFromVision,
14700 markWhenOptional,
14701 validity
14702 }) {
14703 return /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
14704 ValidatedText,
14705 {
14706 ...{
14707 data,
14708 field,
14709 onChange,
14710 hideLabelFromVision,
14711 markWhenOptional,
14712 validity,
14713 type: "tel",
14714 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 }) })
14715 }
14716 }
14717 );
14718 }
14719
14720 // packages/dataviews/build-module/components/dataform-controls/url.mjs
14721 var import_components37 = __toESM(require_components(), 1);
14722 var import_jsx_runtime78 = __toESM(require_jsx_runtime(), 1);
14723 function Url({
14724 data,
14725 field,
14726 onChange,
14727 hideLabelFromVision,
14728 markWhenOptional,
14729 validity
14730 }) {
14731 return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
14732 ValidatedText,
14733 {
14734 ...{
14735 data,
14736 field,
14737 onChange,
14738 hideLabelFromVision,
14739 markWhenOptional,
14740 validity,
14741 type: "url",
14742 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 }) })
14743 }
14744 }
14745 );
14746 }
14747
14748 // packages/dataviews/build-module/components/dataform-controls/utils/validated-number.mjs
14749 var import_components38 = __toESM(require_components(), 1);
14750 var import_element46 = __toESM(require_element(), 1);
14751 var import_i18n35 = __toESM(require_i18n(), 1);
14752 var import_jsx_runtime79 = __toESM(require_jsx_runtime(), 1);
14753 var { ValidatedNumberControl } = unlock(import_components38.privateApis);
14754 function toNumberOrEmpty(value) {
14755 if (value === "" || value === void 0) {
14756 return "";
14757 }
14758 const number = Number(value);
14759 return Number.isFinite(number) ? number : "";
14760 }
14761 function BetweenControls({
14762 value,
14763 onChange,
14764 hideLabelFromVision,
14765 step
14766 }) {
14767 const [min = "", max = ""] = value;
14768 const onChangeMin = (0, import_element46.useCallback)(
14769 (newValue) => onChange([toNumberOrEmpty(newValue), max]),
14770 [onChange, max]
14771 );
14772 const onChangeMax = (0, import_element46.useCallback)(
14773 (newValue) => onChange([min, toNumberOrEmpty(newValue)]),
14774 [onChange, min]
14775 );
14776 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
14777 import_components38.BaseControl,
14778 {
14779 help: (0, import_i18n35.__)("The max. value must be greater than the min. value."),
14780 children: /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(import_components38.Flex, { direction: "row", gap: 4, children: [
14781 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
14782 import_components38.__experimentalNumberControl,
14783 {
14784 label: (0, import_i18n35.__)("Min."),
14785 value: min,
14786 max: max ? Number(max) - step : void 0,
14787 onChange: onChangeMin,
14788 __next40pxDefaultSize: true,
14789 hideLabelFromVision,
14790 step
14791 }
14792 ),
14793 /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
14794 import_components38.__experimentalNumberControl,
14795 {
14796 label: (0, import_i18n35.__)("Max."),
14797 value: max,
14798 min: min ? Number(min) + step : void 0,
14799 onChange: onChangeMax,
14800 __next40pxDefaultSize: true,
14801 hideLabelFromVision,
14802 step
14803 }
14804 )
14805 ] })
14806 }
14807 );
14808 }
14809 function ValidatedNumber({
14810 data,
14811 field,
14812 onChange,
14813 hideLabelFromVision,
14814 markWhenOptional,
14815 operator,
14816 validity
14817 }) {
14818 const decimals = field.format?.decimals ?? 0;
14819 const step = Math.pow(10, Math.abs(decimals) * -1);
14820 const { label, description, getValue, setValue, isValid: isValid2 } = field;
14821 const value = getValue({ item: data }) ?? "";
14822 const onChangeControl = (0, import_element46.useCallback)(
14823 (newValue) => {
14824 onChange(
14825 setValue({
14826 item: data,
14827 // Do not convert an empty string or undefined to a number,
14828 // otherwise there's a mismatch between the UI control (empty)
14829 // and the data relied by onChange (0).
14830 value: ["", void 0].includes(newValue) ? void 0 : Number(newValue)
14831 })
14832 );
14833 },
14834 [data, onChange, setValue]
14835 );
14836 const onChangeBetweenControls = (0, import_element46.useCallback)(
14837 (newValue) => {
14838 onChange(
14839 setValue({
14840 item: data,
14841 value: newValue
14842 })
14843 );
14844 },
14845 [data, onChange, setValue]
14846 );
14847 if (operator === OPERATOR_BETWEEN) {
14848 let valueBetween = ["", ""];
14849 if (Array.isArray(value) && value.length === 2 && value.every(
14850 (element) => typeof element === "number" || element === ""
14851 )) {
14852 valueBetween = value;
14853 }
14854 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
14855 BetweenControls,
14856 {
14857 value: valueBetween,
14858 onChange: onChangeBetweenControls,
14859 hideLabelFromVision,
14860 step
14861 }
14862 );
14863 }
14864 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
14865 ValidatedNumberControl,
14866 {
14867 required: !!isValid2.required,
14868 markWhenOptional,
14869 customValidity: getCustomValidity(isValid2, validity),
14870 label,
14871 help: description,
14872 value,
14873 onChange: onChangeControl,
14874 __next40pxDefaultSize: true,
14875 hideLabelFromVision,
14876 step,
14877 min: isValid2.min ? isValid2.min.constraint : void 0,
14878 max: isValid2.max ? isValid2.max.constraint : void 0
14879 }
14880 );
14881 }
14882
14883 // packages/dataviews/build-module/components/dataform-controls/integer.mjs
14884 var import_jsx_runtime80 = __toESM(require_jsx_runtime(), 1);
14885 function Integer(props) {
14886 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(ValidatedNumber, { ...props });
14887 }
14888
14889 // packages/dataviews/build-module/components/dataform-controls/number.mjs
14890 var import_jsx_runtime81 = __toESM(require_jsx_runtime(), 1);
14891 function Number2(props) {
14892 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ValidatedNumber, { ...props });
14893 }
14894
14895 // packages/dataviews/build-module/components/dataform-controls/radio.mjs
14896 var import_components39 = __toESM(require_components(), 1);
14897 var import_element47 = __toESM(require_element(), 1);
14898 var import_jsx_runtime82 = __toESM(require_jsx_runtime(), 1);
14899 var { ValidatedRadioControl } = unlock(import_components39.privateApis);
14900 function Radio({
14901 data,
14902 field,
14903 onChange,
14904 hideLabelFromVision,
14905 markWhenOptional,
14906 validity
14907 }) {
14908 const { label, description, getValue, setValue, isValid: isValid2 } = field;
14909 const { elements, isLoading } = useElements({
14910 elements: field.elements,
14911 getElements: field.getElements
14912 });
14913 const value = getValue({ item: data });
14914 const onChangeControl = (0, import_element47.useCallback)(
14915 (newValue) => onChange(setValue({ item: data, value: newValue })),
14916 [data, onChange, setValue]
14917 );
14918 if (isLoading) {
14919 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_components39.Spinner, {});
14920 }
14921 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
14922 ValidatedRadioControl,
14923 {
14924 required: !!field.isValid?.required,
14925 markWhenOptional,
14926 customValidity: getCustomValidity(isValid2, validity),
14927 label,
14928 help: description,
14929 onChange: onChangeControl,
14930 options: elements,
14931 selected: value,
14932 hideLabelFromVision
14933 }
14934 );
14935 }
14936
14937 // packages/dataviews/build-module/components/dataform-controls/text.mjs
14938 var import_element48 = __toESM(require_element(), 1);
14939 var import_jsx_runtime83 = __toESM(require_jsx_runtime(), 1);
14940 function Text({
14941 data,
14942 field,
14943 onChange,
14944 hideLabelFromVision,
14945 markWhenOptional,
14946 config,
14947 validity
14948 }) {
14949 const { prefix, suffix } = config || {};
14950 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(
14951 ValidatedText,
14952 {
14953 ...{
14954 data,
14955 field,
14956 onChange,
14957 hideLabelFromVision,
14958 markWhenOptional,
14959 validity,
14960 prefix: prefix ? (0, import_element48.createElement)(prefix) : void 0,
14961 suffix: suffix ? (0, import_element48.createElement)(suffix) : void 0
14962 }
14963 }
14964 );
14965 }
14966
14967 // packages/dataviews/build-module/components/dataform-controls/toggle.mjs
14968 var import_components40 = __toESM(require_components(), 1);
14969 var import_element49 = __toESM(require_element(), 1);
14970 var import_jsx_runtime84 = __toESM(require_jsx_runtime(), 1);
14971 var { ValidatedToggleControl } = unlock(import_components40.privateApis);
14972 function Toggle({
14973 field,
14974 onChange,
14975 data,
14976 hideLabelFromVision,
14977 markWhenOptional,
14978 validity
14979 }) {
14980 const { label, description, getValue, setValue, isValid: isValid2 } = field;
14981 const onChangeControl = (0, import_element49.useCallback)(() => {
14982 onChange(
14983 setValue({ item: data, value: !getValue({ item: data }) })
14984 );
14985 }, [onChange, setValue, data, getValue]);
14986 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
14987 ValidatedToggleControl,
14988 {
14989 required: !!isValid2.required,
14990 markWhenOptional,
14991 customValidity: getCustomValidity(isValid2, validity),
14992 hidden: hideLabelFromVision,
14993 label,
14994 help: description,
14995 checked: getValue({ item: data }),
14996 onChange: onChangeControl
14997 }
14998 );
14999 }
15000
15001 // packages/dataviews/build-module/components/dataform-controls/textarea.mjs
15002 var import_components41 = __toESM(require_components(), 1);
15003 var import_element50 = __toESM(require_element(), 1);
15004 var import_jsx_runtime85 = __toESM(require_jsx_runtime(), 1);
15005 var { ValidatedTextareaControl } = unlock(import_components41.privateApis);
15006 function Textarea({
15007 data,
15008 field,
15009 onChange,
15010 hideLabelFromVision,
15011 markWhenOptional,
15012 config,
15013 validity
15014 }) {
15015 const { rows = 4 } = config || {};
15016 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
15017 const value = field.getValue({ item: data });
15018 const onChangeControl = (0, import_element50.useCallback)(
15019 (newValue) => onChange(setValue({ item: data, value: newValue })),
15020 [data, onChange, setValue]
15021 );
15022 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
15023 ValidatedTextareaControl,
15024 {
15025 required: !!isValid2.required,
15026 markWhenOptional,
15027 customValidity: getCustomValidity(isValid2, validity),
15028 label,
15029 placeholder,
15030 value: value ?? "",
15031 help: description,
15032 onChange: onChangeControl,
15033 rows,
15034 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0,
15035 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0,
15036 __next40pxDefaultSize: true,
15037 hideLabelFromVision
15038 }
15039 );
15040 }
15041
15042 // packages/dataviews/build-module/components/dataform-controls/toggle-group.mjs
15043 var import_components42 = __toESM(require_components(), 1);
15044 var import_element51 = __toESM(require_element(), 1);
15045 var import_jsx_runtime86 = __toESM(require_jsx_runtime(), 1);
15046 var { ValidatedToggleGroupControl } = unlock(import_components42.privateApis);
15047 function ToggleGroup({
15048 data,
15049 field,
15050 onChange,
15051 hideLabelFromVision,
15052 markWhenOptional,
15053 validity
15054 }) {
15055 const { getValue, setValue, isValid: isValid2 } = field;
15056 const value = getValue({ item: data });
15057 const onChangeControl = (0, import_element51.useCallback)(
15058 (newValue) => onChange(setValue({ item: data, value: newValue })),
15059 [data, onChange, setValue]
15060 );
15061 const { elements, isLoading } = useElements({
15062 elements: field.elements,
15063 getElements: field.getElements
15064 });
15065 if (isLoading) {
15066 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_components42.Spinner, {});
15067 }
15068 if (elements.length === 0) {
15069 return null;
15070 }
15071 const selectedOption = elements.find((el) => el.value === value);
15072 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
15073 ValidatedToggleGroupControl,
15074 {
15075 required: !!field.isValid?.required,
15076 markWhenOptional,
15077 customValidity: getCustomValidity(isValid2, validity),
15078 __next40pxDefaultSize: true,
15079 isBlock: true,
15080 label: field.label,
15081 help: selectedOption?.description || field.description,
15082 onChange: onChangeControl,
15083 value,
15084 hideLabelFromVision,
15085 children: elements.map((el) => /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
15086 import_components42.__experimentalToggleGroupControlOption,
15087 {
15088 label: el.label,
15089 value: el.value
15090 },
15091 el.value
15092 ))
15093 }
15094 );
15095 }
15096
15097 // packages/dataviews/build-module/components/dataform-controls/array.mjs
15098 var import_components43 = __toESM(require_components(), 1);
15099 var import_element52 = __toESM(require_element(), 1);
15100 var import_jsx_runtime87 = __toESM(require_jsx_runtime(), 1);
15101 var { ValidatedFormTokenField } = unlock(import_components43.privateApis);
15102 function ArrayControl({
15103 data,
15104 field,
15105 onChange,
15106 hideLabelFromVision,
15107 markWhenOptional,
15108 validity
15109 }) {
15110 const { label, placeholder, getValue, setValue, isValid: isValid2 } = field;
15111 const value = getValue({ item: data });
15112 const { elements, isLoading } = useElements({
15113 elements: field.elements,
15114 getElements: field.getElements
15115 });
15116 const arrayValueAsElements = (0, import_element52.useMemo)(
15117 () => Array.isArray(value) ? value.map((token) => {
15118 const element = elements?.find(
15119 (suggestion) => suggestion.value === token
15120 );
15121 return element || { value: token, label: token };
15122 }) : [],
15123 [value, elements]
15124 );
15125 const onChangeControl = (0, import_element52.useCallback)(
15126 (tokens) => {
15127 const valueTokens = tokens.map((token) => {
15128 if (typeof token === "object" && "value" in token) {
15129 return token.value;
15130 }
15131 return token;
15132 });
15133 onChange(setValue({ item: data, value: valueTokens }));
15134 },
15135 [onChange, setValue, data]
15136 );
15137 if (isLoading) {
15138 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(import_components43.Spinner, {});
15139 }
15140 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
15141 ValidatedFormTokenField,
15142 {
15143 required: !!isValid2?.required,
15144 markWhenOptional,
15145 customValidity: getCustomValidity(isValid2, validity),
15146 label: hideLabelFromVision ? void 0 : label,
15147 value: arrayValueAsElements,
15148 onChange: onChangeControl,
15149 placeholder,
15150 suggestions: elements?.map((element) => element.value),
15151 __experimentalValidateInput: (token) => {
15152 if (field.isValid?.elements && elements) {
15153 return elements.some(
15154 (element) => element.value === token || element.label === token
15155 );
15156 }
15157 return true;
15158 },
15159 __experimentalExpandOnFocus: elements && elements.length > 0,
15160 __experimentalShowHowTo: !field.isValid?.elements,
15161 displayTransform: (token) => {
15162 if (typeof token === "object" && "label" in token) {
15163 return token.label;
15164 }
15165 if (typeof token === "string" && elements) {
15166 const element = elements.find(
15167 (el) => el.value === token
15168 );
15169 return element?.label || token;
15170 }
15171 return token;
15172 },
15173 __experimentalRenderItem: ({ item }) => {
15174 if (typeof item === "string" && elements) {
15175 const element = elements.find(
15176 (el) => el.value === item
15177 );
15178 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)("span", { children: element?.label || item });
15179 }
15180 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)("span", { children: item });
15181 }
15182 }
15183 );
15184 }
15185
15186 // node_modules/colord/index.mjs
15187 var r2 = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) };
15188 var t = function(r3) {
15189 return "string" == typeof r3 ? r3.length > 0 : "number" == typeof r3;
15190 };
15191 var n = function(r3, t2, n2) {
15192 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r3) / n2 + 0;
15193 };
15194 var e = function(r3, t2, n2) {
15195 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r3 > n2 ? n2 : r3 > t2 ? r3 : t2;
15196 };
15197 var u = function(r3) {
15198 return (r3 = isFinite(r3) ? r3 % 360 : 0) > 0 ? r3 : r3 + 360;
15199 };
15200 var a = function(r3) {
15201 return { r: e(r3.r, 0, 255), g: e(r3.g, 0, 255), b: e(r3.b, 0, 255), a: e(r3.a) };
15202 };
15203 var o = function(r3) {
15204 return { r: n(r3.r), g: n(r3.g), b: n(r3.b), a: n(r3.a, 3) };
15205 };
15206 var i = /^#([0-9a-f]{3,8})$/i;
15207 var s = function(r3) {
15208 var t2 = r3.toString(16);
15209 return t2.length < 2 ? "0" + t2 : t2;
15210 };
15211 var h = function(r3) {
15212 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;
15213 return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 };
15214 };
15215 var b = function(r3) {
15216 var t2 = r3.h, n2 = r3.s, e2 = r3.v, u2 = r3.a;
15217 t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100;
15218 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;
15219 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 };
15220 };
15221 var g = function(r3) {
15222 return { h: u(r3.h), s: e(r3.s, 0, 100), l: e(r3.l, 0, 100), a: e(r3.a) };
15223 };
15224 var d = function(r3) {
15225 return { h: n(r3.h), s: n(r3.s), l: n(r3.l), a: n(r3.a, 3) };
15226 };
15227 var f = function(r3) {
15228 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 }));
15229 var t2, n2, e2;
15230 };
15231 var c = function(r3) {
15232 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 };
15233 var t2, n2, e2, u2;
15234 };
15235 var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15236 var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15237 var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15238 var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i;
15239 var y = { string: [[function(r3) {
15240 var t2 = i.exec(r3);
15241 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;
15242 }, "hex"], [function(r3) {
15243 var t2 = v.exec(r3) || m.exec(r3);
15244 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;
15245 }, "rgb"], [function(t2) {
15246 var n2 = l.exec(t2) || p.exec(t2);
15247 if (!n2) return null;
15248 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) });
15249 return f(a2);
15250 }, "hsl"]], object: [[function(r3) {
15251 var n2 = r3.r, e2 = r3.g, u2 = r3.b, o2 = r3.a, i2 = void 0 === o2 ? 1 : o2;
15252 return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null;
15253 }, "rgb"], [function(r3) {
15254 var n2 = r3.h, e2 = r3.s, u2 = r3.l, a2 = r3.a, o2 = void 0 === a2 ? 1 : a2;
15255 if (!t(n2) || !t(e2) || !t(u2)) return null;
15256 var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) });
15257 return f(i2);
15258 }, "hsl"], [function(r3) {
15259 var n2 = r3.h, a2 = r3.s, o2 = r3.v, i2 = r3.a, s2 = void 0 === i2 ? 1 : i2;
15260 if (!t(n2) || !t(a2) || !t(o2)) return null;
15261 var h2 = (function(r4) {
15262 return { h: u(r4.h), s: e(r4.s, 0, 100), v: e(r4.v, 0, 100), a: e(r4.a) };
15263 })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) });
15264 return b(h2);
15265 }, "hsv"]] };
15266 var N = function(r3, t2) {
15267 for (var n2 = 0; n2 < t2.length; n2++) {
15268 var e2 = t2[n2][0](r3);
15269 if (e2) return [e2, t2[n2][1]];
15270 }
15271 return [null, void 0];
15272 };
15273 var x = function(r3) {
15274 return "string" == typeof r3 ? N(r3.trim(), y.string) : "object" == typeof r3 && null !== r3 ? N(r3, y.object) : [null, void 0];
15275 };
15276 var M = function(r3, t2) {
15277 var n2 = c(r3);
15278 return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a };
15279 };
15280 var H = function(r3) {
15281 return (299 * r3.r + 587 * r3.g + 114 * r3.b) / 1e3 / 255;
15282 };
15283 var $ = function(r3, t2) {
15284 var n2 = c(r3);
15285 return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a };
15286 };
15287 var j = (function() {
15288 function r3(r4) {
15289 this.parsed = x(r4)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 };
15290 }
15291 return r3.prototype.isValid = function() {
15292 return null !== this.parsed;
15293 }, r3.prototype.brightness = function() {
15294 return n(H(this.rgba), 2);
15295 }, r3.prototype.isDark = function() {
15296 return H(this.rgba) < 0.5;
15297 }, r3.prototype.isLight = function() {
15298 return H(this.rgba) >= 0.5;
15299 }, r3.prototype.toHex = function() {
15300 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;
15301 var r4, t2, e2, u2, a2, i2;
15302 }, r3.prototype.toRgb = function() {
15303 return o(this.rgba);
15304 }, r3.prototype.toRgbString = function() {
15305 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 + ")";
15306 var r4, t2, n2, e2, u2;
15307 }, r3.prototype.toHsl = function() {
15308 return d(c(this.rgba));
15309 }, r3.prototype.toHslString = function() {
15310 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 + "%)";
15311 var r4, t2, n2, e2, u2;
15312 }, r3.prototype.toHsv = function() {
15313 return r4 = h(this.rgba), { h: n(r4.h), s: n(r4.s), v: n(r4.v), a: n(r4.a, 3) };
15314 var r4;
15315 }, r3.prototype.invert = function() {
15316 return w({ r: 255 - (r4 = this.rgba).r, g: 255 - r4.g, b: 255 - r4.b, a: r4.a });
15317 var r4;
15318 }, r3.prototype.saturate = function(r4) {
15319 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, r4));
15320 }, r3.prototype.desaturate = function(r4) {
15321 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, -r4));
15322 }, r3.prototype.grayscale = function() {
15323 return w(M(this.rgba, -1));
15324 }, r3.prototype.lighten = function(r4) {
15325 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, r4));
15326 }, r3.prototype.darken = function(r4) {
15327 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, -r4));
15328 }, r3.prototype.rotate = function(r4) {
15329 return void 0 === r4 && (r4 = 15), this.hue(this.hue() + r4);
15330 }, r3.prototype.alpha = function(r4) {
15331 return "number" == typeof r4 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r4 }) : n(this.rgba.a, 3);
15332 var t2;
15333 }, r3.prototype.hue = function(r4) {
15334 var t2 = c(this.rgba);
15335 return "number" == typeof r4 ? w({ h: r4, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h);
15336 }, r3.prototype.isEqual = function(r4) {
15337 return this.toHex() === w(r4).toHex();
15338 }, r3;
15339 })();
15340 var w = function(r3) {
15341 return r3 instanceof j ? r3 : new j(r3);
15342 };
15343
15344 // packages/dataviews/build-module/components/dataform-controls/color.mjs
15345 var import_components44 = __toESM(require_components(), 1);
15346 var import_element53 = __toESM(require_element(), 1);
15347 var import_i18n36 = __toESM(require_i18n(), 1);
15348 var import_jsx_runtime88 = __toESM(require_jsx_runtime(), 1);
15349 var { ValidatedInputControl: ValidatedInputControl3 } = unlock(import_components44.privateApis);
15350 var ColorPickerDropdown = ({
15351 color,
15352 onColorChange
15353 }) => {
15354 const validColor = color && w(color).isValid() ? color : "#ffffff";
15355 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15356 import_components44.Dropdown,
15357 {
15358 className: "dataviews-controls__color-picker-dropdown",
15359 popoverProps: { resize: false },
15360 renderToggle: ({ onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15361 import_components44.Button,
15362 {
15363 onClick: onToggle,
15364 "aria-label": (0, import_i18n36.__)("Open color picker"),
15365 size: "small",
15366 icon: () => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.ColorIndicator, { colorValue: validColor })
15367 }
15368 ),
15369 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.__experimentalDropdownContentWrapper, { paddingSize: "none", children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15370 import_components44.ColorPicker,
15371 {
15372 color: validColor,
15373 onChange: onColorChange,
15374 enableAlpha: true
15375 }
15376 ) })
15377 }
15378 );
15379 };
15380 function Color({
15381 data,
15382 field,
15383 onChange,
15384 hideLabelFromVision,
15385 markWhenOptional,
15386 validity
15387 }) {
15388 const { label, placeholder, description, setValue, isValid: isValid2 } = field;
15389 const value = field.getValue({ item: data }) || "";
15390 const handleColorChange = (0, import_element53.useCallback)(
15391 (newColor) => {
15392 onChange(setValue({ item: data, value: newColor }));
15393 },
15394 [data, onChange, setValue]
15395 );
15396 const handleInputChange = (0, import_element53.useCallback)(
15397 (newValue) => {
15398 onChange(setValue({ item: data, value: newValue || "" }));
15399 },
15400 [data, onChange, setValue]
15401 );
15402 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15403 ValidatedInputControl3,
15404 {
15405 required: !!field.isValid?.required,
15406 markWhenOptional,
15407 customValidity: getCustomValidity(isValid2, validity),
15408 label,
15409 placeholder,
15410 value,
15411 help: description,
15412 onChange: handleInputChange,
15413 hideLabelFromVision,
15414 type: "text",
15415 prefix: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.__experimentalInputControlPrefixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(
15416 ColorPickerDropdown,
15417 {
15418 color: value,
15419 onColorChange: handleColorChange
15420 }
15421 ) })
15422 }
15423 );
15424 }
15425
15426 // packages/dataviews/build-module/components/dataform-controls/password.mjs
15427 var import_components45 = __toESM(require_components(), 1);
15428 var import_element54 = __toESM(require_element(), 1);
15429 var import_i18n37 = __toESM(require_i18n(), 1);
15430 var import_jsx_runtime89 = __toESM(require_jsx_runtime(), 1);
15431 function Password({
15432 data,
15433 field,
15434 onChange,
15435 hideLabelFromVision,
15436 markWhenOptional,
15437 validity
15438 }) {
15439 const [isVisible2, setIsVisible] = (0, import_element54.useState)(false);
15440 const toggleVisibility = (0, import_element54.useCallback)(() => {
15441 setIsVisible((prev) => !prev);
15442 }, []);
15443 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(
15444 ValidatedText,
15445 {
15446 ...{
15447 data,
15448 field,
15449 onChange,
15450 hideLabelFromVision,
15451 markWhenOptional,
15452 validity,
15453 type: isVisible2 ? "text" : "password",
15454 suffix: /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(import_components45.__experimentalInputControlSuffixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(
15455 import_components45.Button,
15456 {
15457 icon: isVisible2 ? unseen_default : seen_default,
15458 onClick: toggleVisibility,
15459 size: "small",
15460 label: isVisible2 ? (0, import_i18n37.__)("Hide password") : (0, import_i18n37.__)("Show password")
15461 }
15462 ) })
15463 }
15464 }
15465 );
15466 }
15467
15468 // packages/dataviews/build-module/field-types/utils/has-elements.mjs
15469 function hasElements(field) {
15470 return Array.isArray(field.elements) && field.elements.length > 0 || typeof field.getElements === "function";
15471 }
15472
15473 // packages/dataviews/build-module/components/dataform-controls/index.mjs
15474 var import_jsx_runtime90 = __toESM(require_jsx_runtime(), 1);
15475 var FORM_CONTROLS = {
15476 adaptiveSelect: AdaptiveSelect,
15477 array: ArrayControl,
15478 checkbox: Checkbox,
15479 color: Color,
15480 combobox: Combobox3,
15481 datetime: DateTime,
15482 date: DateControl,
15483 email: Email,
15484 telephone: Telephone,
15485 url: Url,
15486 integer: Integer,
15487 number: Number2,
15488 password: Password,
15489 radio: Radio,
15490 select: Select,
15491 text: Text,
15492 toggle: Toggle,
15493 textarea: Textarea,
15494 toggleGroup: ToggleGroup
15495 };
15496 function isEditConfig(value) {
15497 return value && typeof value === "object" && typeof value.control === "string";
15498 }
15499 function createConfiguredControl(config) {
15500 const { control, ...controlConfig } = config;
15501 const BaseControlType = getControlByType(control);
15502 if (BaseControlType === null) {
15503 return null;
15504 }
15505 return function ConfiguredControl(props) {
15506 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(BaseControlType, { ...props, config: controlConfig });
15507 };
15508 }
15509 function getControl(field, fallback) {
15510 if (typeof field.Edit === "function") {
15511 return field.Edit;
15512 }
15513 if (typeof field.Edit === "string") {
15514 return getControlByType(field.Edit);
15515 }
15516 if (isEditConfig(field.Edit)) {
15517 return createConfiguredControl(field.Edit);
15518 }
15519 if (hasElements(field) && field.type !== "array") {
15520 return getControlByType("adaptiveSelect");
15521 }
15522 if (fallback === null) {
15523 return null;
15524 }
15525 return getControlByType(fallback);
15526 }
15527 function getControlByType(type) {
15528 if (Object.keys(FORM_CONTROLS).includes(type)) {
15529 return FORM_CONTROLS[type];
15530 }
15531 return null;
15532 }
15533
15534 // packages/dataviews/build-module/field-types/utils/get-filter-by.mjs
15535 function getFilterBy(field, defaultOperators, validOperators) {
15536 if (field.filterBy === false) {
15537 return false;
15538 }
15539 const operators = field.filterBy?.operators?.filter(
15540 (op) => validOperators.includes(op)
15541 ) ?? defaultOperators;
15542 if (operators.length === 0) {
15543 return false;
15544 }
15545 return {
15546 isPrimary: !!field.filterBy?.isPrimary,
15547 operators
15548 };
15549 }
15550 var get_filter_by_default = getFilterBy;
15551
15552 // packages/dataviews/build-module/field-types/utils/get-value-from-id.mjs
15553 var getValueFromId = (id) => ({ item }) => {
15554 const path = id.split(".");
15555 let value = item;
15556 for (const segment of path) {
15557 if (value.hasOwnProperty(segment)) {
15558 value = value[segment];
15559 } else {
15560 value = void 0;
15561 }
15562 }
15563 return value;
15564 };
15565 var get_value_from_id_default = getValueFromId;
15566
15567 // packages/dataviews/build-module/field-types/utils/set-value-from-id.mjs
15568 var setValueFromId = (id) => ({ value }) => {
15569 const path = id.split(".");
15570 const result = {};
15571 let current = result;
15572 for (const segment of path.slice(0, -1)) {
15573 current[segment] = {};
15574 current = current[segment];
15575 }
15576 current[path.at(-1)] = value;
15577 return result;
15578 };
15579 var set_value_from_id_default = setValueFromId;
15580
15581 // packages/dataviews/build-module/field-types/email.mjs
15582 var import_i18n38 = __toESM(require_i18n(), 1);
15583
15584 // packages/dataviews/build-module/field-types/utils/render-from-elements.mjs
15585 function RenderFromElements({
15586 item,
15587 field
15588 }) {
15589 const { elements, isLoading } = useElements({
15590 elements: field.elements,
15591 getElements: field.getElements
15592 });
15593 const value = field.getValue({ item });
15594 if (isLoading) {
15595 return value;
15596 }
15597 if (elements.length === 0) {
15598 return value;
15599 }
15600 return elements?.find((element) => element.value === value)?.label || field.getValue({ item });
15601 }
15602
15603 // packages/dataviews/build-module/field-types/utils/render-default.mjs
15604 var import_jsx_runtime91 = __toESM(require_jsx_runtime(), 1);
15605 function render({
15606 item,
15607 field
15608 }) {
15609 if (field.hasElements) {
15610 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(RenderFromElements, { item, field });
15611 }
15612 return field.getValueFormatted({ item, field });
15613 }
15614
15615 // packages/dataviews/build-module/field-types/utils/sort-text.mjs
15616 var sort_text_default = (a2, b2, direction) => {
15617 return direction === "asc" ? a2.localeCompare(b2) : b2.localeCompare(a2);
15618 };
15619
15620 // packages/dataviews/build-module/field-types/utils/is-valid-required.mjs
15621 function isValidRequired(item, field) {
15622 const value = field.getValue({ item });
15623 return ![void 0, "", null].includes(value);
15624 }
15625
15626 // packages/dataviews/build-module/field-types/utils/is-valid-min-length.mjs
15627 function isValidMinLength(item, field) {
15628 if (typeof field.isValid.minLength?.constraint !== "number") {
15629 return false;
15630 }
15631 const value = field.getValue({ item });
15632 if ([void 0, "", null].includes(value)) {
15633 return true;
15634 }
15635 return String(value).length >= field.isValid.minLength.constraint;
15636 }
15637
15638 // packages/dataviews/build-module/field-types/utils/is-valid-max-length.mjs
15639 function isValidMaxLength(item, field) {
15640 if (typeof field.isValid.maxLength?.constraint !== "number") {
15641 return false;
15642 }
15643 const value = field.getValue({ item });
15644 if ([void 0, "", null].includes(value)) {
15645 return true;
15646 }
15647 return String(value).length <= field.isValid.maxLength.constraint;
15648 }
15649
15650 // packages/dataviews/build-module/field-types/utils/is-valid-pattern.mjs
15651 function isValidPattern(item, field) {
15652 if (field.isValid.pattern?.constraint === void 0) {
15653 return true;
15654 }
15655 try {
15656 const regexp = new RegExp(field.isValid.pattern.constraint);
15657 const value = field.getValue({ item });
15658 if ([void 0, "", null].includes(value)) {
15659 return true;
15660 }
15661 return regexp.test(String(value));
15662 } catch {
15663 return false;
15664 }
15665 }
15666
15667 // packages/dataviews/build-module/field-types/utils/is-valid-elements.mjs
15668 function isValidElements(item, field) {
15669 const elements = field.elements ?? [];
15670 const validValues = elements.map((el) => el.value);
15671 if (validValues.length === 0) {
15672 return true;
15673 }
15674 const value = field.getValue({ item });
15675 return [].concat(value).every((v2) => validValues.includes(v2));
15676 }
15677
15678 // packages/dataviews/build-module/field-types/utils/get-value-formatted-default.mjs
15679 function getValueFormatted({
15680 item,
15681 field
15682 }) {
15683 return field.getValue({ item });
15684 }
15685 var get_value_formatted_default_default = getValueFormatted;
15686
15687 // packages/dataviews/build-module/field-types/email.mjs
15688 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])?)*$/;
15689 function isValidCustom(item, field) {
15690 const value = field.getValue({ item });
15691 if (![void 0, "", null].includes(value) && !emailRegex.test(value)) {
15692 return (0, import_i18n38.__)("Value must be a valid email address.");
15693 }
15694 return null;
15695 }
15696 var email_default = {
15697 type: "email",
15698 render,
15699 Edit: "email",
15700 sort: sort_text_default,
15701 enableSorting: true,
15702 enableGlobalSearch: false,
15703 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
15704 validOperators: [
15705 OPERATOR_IS,
15706 OPERATOR_IS_NOT,
15707 OPERATOR_CONTAINS,
15708 OPERATOR_NOT_CONTAINS,
15709 OPERATOR_STARTS_WITH,
15710 // Multiple selection
15711 OPERATOR_IS_ANY,
15712 OPERATOR_IS_NONE,
15713 OPERATOR_IS_ALL,
15714 OPERATOR_IS_NOT_ALL
15715 ],
15716 format: {},
15717 getValueFormatted: get_value_formatted_default_default,
15718 validate: {
15719 required: isValidRequired,
15720 pattern: isValidPattern,
15721 minLength: isValidMinLength,
15722 maxLength: isValidMaxLength,
15723 elements: isValidElements,
15724 custom: isValidCustom
15725 }
15726 };
15727
15728 // packages/dataviews/build-module/field-types/integer.mjs
15729 var import_i18n39 = __toESM(require_i18n(), 1);
15730
15731 // packages/dataviews/build-module/field-types/utils/sort-number.mjs
15732 var sort_number_default = (a2, b2, direction) => {
15733 return direction === "asc" ? a2 - b2 : b2 - a2;
15734 };
15735
15736 // packages/dataviews/build-module/field-types/utils/is-valid-min.mjs
15737 function isValidMin(item, field) {
15738 if (typeof field.isValid.min?.constraint !== "number") {
15739 return false;
15740 }
15741 const value = field.getValue({ item });
15742 if ([void 0, "", null].includes(value)) {
15743 return true;
15744 }
15745 return Number(value) >= field.isValid.min.constraint;
15746 }
15747
15748 // packages/dataviews/build-module/field-types/utils/is-valid-max.mjs
15749 function isValidMax(item, field) {
15750 if (typeof field.isValid.max?.constraint !== "number") {
15751 return false;
15752 }
15753 const value = field.getValue({ item });
15754 if ([void 0, "", null].includes(value)) {
15755 return true;
15756 }
15757 return Number(value) <= field.isValid.max.constraint;
15758 }
15759
15760 // packages/dataviews/build-module/field-types/integer.mjs
15761 var format2 = {
15762 separatorThousand: ","
15763 };
15764 function getValueFormatted2({
15765 item,
15766 field
15767 }) {
15768 let value = field.getValue({ item });
15769 if (value === null || value === void 0) {
15770 return "";
15771 }
15772 value = Number(value);
15773 if (!Number.isFinite(value)) {
15774 return String(value);
15775 }
15776 let formatInteger;
15777 if (field.type !== "integer") {
15778 formatInteger = format2;
15779 } else {
15780 formatInteger = field.format;
15781 }
15782 const { separatorThousand } = formatInteger;
15783 const integerValue = Math.trunc(value);
15784 if (!separatorThousand) {
15785 return String(integerValue);
15786 }
15787 return String(integerValue).replace(
15788 /\B(?=(\d{3})+(?!\d))/g,
15789 separatorThousand
15790 );
15791 }
15792 function isValidCustom2(item, field) {
15793 const value = field.getValue({ item });
15794 if (![void 0, "", null].includes(value) && !Number.isInteger(value)) {
15795 return (0, import_i18n39.__)("Value must be an integer.");
15796 }
15797 return null;
15798 }
15799 var integer_default = {
15800 type: "integer",
15801 render,
15802 Edit: "integer",
15803 sort: sort_number_default,
15804 enableSorting: true,
15805 enableGlobalSearch: false,
15806 defaultOperators: [
15807 OPERATOR_IS,
15808 OPERATOR_IS_NOT,
15809 OPERATOR_LESS_THAN,
15810 OPERATOR_GREATER_THAN,
15811 OPERATOR_LESS_THAN_OR_EQUAL,
15812 OPERATOR_GREATER_THAN_OR_EQUAL,
15813 OPERATOR_BETWEEN
15814 ],
15815 validOperators: [
15816 // Single-selection
15817 OPERATOR_IS,
15818 OPERATOR_IS_NOT,
15819 OPERATOR_LESS_THAN,
15820 OPERATOR_GREATER_THAN,
15821 OPERATOR_LESS_THAN_OR_EQUAL,
15822 OPERATOR_GREATER_THAN_OR_EQUAL,
15823 OPERATOR_BETWEEN,
15824 // Multiple-selection
15825 OPERATOR_IS_ANY,
15826 OPERATOR_IS_NONE,
15827 OPERATOR_IS_ALL,
15828 OPERATOR_IS_NOT_ALL
15829 ],
15830 format: format2,
15831 getValueFormatted: getValueFormatted2,
15832 validate: {
15833 required: isValidRequired,
15834 min: isValidMin,
15835 max: isValidMax,
15836 elements: isValidElements,
15837 custom: isValidCustom2
15838 }
15839 };
15840
15841 // packages/dataviews/build-module/field-types/number.mjs
15842 var import_i18n40 = __toESM(require_i18n(), 1);
15843 var format3 = {
15844 separatorThousand: ",",
15845 separatorDecimal: ".",
15846 decimals: 2
15847 };
15848 function getValueFormatted3({
15849 item,
15850 field
15851 }) {
15852 let value = field.getValue({ item });
15853 if (value === null || value === void 0) {
15854 return "";
15855 }
15856 value = Number(value);
15857 if (!Number.isFinite(value)) {
15858 return String(value);
15859 }
15860 let formatNumber;
15861 if (field.type !== "number") {
15862 formatNumber = format3;
15863 } else {
15864 formatNumber = field.format;
15865 }
15866 const { separatorThousand, separatorDecimal, decimals } = formatNumber;
15867 const fixedValue = value.toFixed(decimals);
15868 const [integerPart, decimalPart] = fixedValue.split(".");
15869 const formattedInteger = separatorThousand ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separatorThousand) : integerPart;
15870 return decimals === 0 ? formattedInteger : formattedInteger + separatorDecimal + decimalPart;
15871 }
15872 function isEmpty2(value) {
15873 return value === "" || value === void 0 || value === null;
15874 }
15875 function isValidCustom3(item, field) {
15876 const value = field.getValue({ item });
15877 if (!isEmpty2(value) && !Number.isFinite(value)) {
15878 return (0, import_i18n40.__)("Value must be a number.");
15879 }
15880 return null;
15881 }
15882 var number_default = {
15883 type: "number",
15884 render,
15885 Edit: "number",
15886 sort: sort_number_default,
15887 enableSorting: true,
15888 enableGlobalSearch: false,
15889 defaultOperators: [
15890 OPERATOR_IS,
15891 OPERATOR_IS_NOT,
15892 OPERATOR_LESS_THAN,
15893 OPERATOR_GREATER_THAN,
15894 OPERATOR_LESS_THAN_OR_EQUAL,
15895 OPERATOR_GREATER_THAN_OR_EQUAL,
15896 OPERATOR_BETWEEN
15897 ],
15898 validOperators: [
15899 // Single-selection
15900 OPERATOR_IS,
15901 OPERATOR_IS_NOT,
15902 OPERATOR_LESS_THAN,
15903 OPERATOR_GREATER_THAN,
15904 OPERATOR_LESS_THAN_OR_EQUAL,
15905 OPERATOR_GREATER_THAN_OR_EQUAL,
15906 OPERATOR_BETWEEN,
15907 // Multiple-selection
15908 OPERATOR_IS_ANY,
15909 OPERATOR_IS_NONE,
15910 OPERATOR_IS_ALL,
15911 OPERATOR_IS_NOT_ALL
15912 ],
15913 format: format3,
15914 getValueFormatted: getValueFormatted3,
15915 validate: {
15916 required: isValidRequired,
15917 min: isValidMin,
15918 max: isValidMax,
15919 elements: isValidElements,
15920 custom: isValidCustom3
15921 }
15922 };
15923
15924 // packages/dataviews/build-module/field-types/text.mjs
15925 var text_default = {
15926 type: "text",
15927 render,
15928 Edit: "text",
15929 sort: sort_text_default,
15930 enableSorting: true,
15931 enableGlobalSearch: false,
15932 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
15933 validOperators: [
15934 // Single selection
15935 OPERATOR_IS,
15936 OPERATOR_IS_NOT,
15937 OPERATOR_CONTAINS,
15938 OPERATOR_NOT_CONTAINS,
15939 OPERATOR_STARTS_WITH,
15940 // Multiple selection
15941 OPERATOR_IS_ANY,
15942 OPERATOR_IS_NONE,
15943 OPERATOR_IS_ALL,
15944 OPERATOR_IS_NOT_ALL
15945 ],
15946 format: {},
15947 getValueFormatted: get_value_formatted_default_default,
15948 validate: {
15949 required: isValidRequired,
15950 pattern: isValidPattern,
15951 minLength: isValidMinLength,
15952 maxLength: isValidMaxLength,
15953 elements: isValidElements
15954 }
15955 };
15956
15957 // packages/dataviews/build-module/field-types/datetime.mjs
15958 var import_date6 = __toESM(require_date(), 1);
15959 var format4 = {
15960 datetime: (0, import_date6.getSettings)().formats.datetime,
15961 weekStartsOn: (0, import_date6.getSettings)().l10n.startOfWeek
15962 };
15963 function getValueFormatted4({
15964 item,
15965 field
15966 }) {
15967 const value = field.getValue({ item });
15968 if (["", void 0, null].includes(value)) {
15969 return "";
15970 }
15971 let formatDatetime;
15972 if (field.type !== "datetime") {
15973 formatDatetime = format4;
15974 } else {
15975 formatDatetime = field.format;
15976 }
15977 return (0, import_date6.dateI18n)(formatDatetime.datetime, (0, import_date6.getDate)(value));
15978 }
15979 var sort = (a2, b2, direction) => {
15980 const timeA = new Date(a2).getTime();
15981 const timeB = new Date(b2).getTime();
15982 return direction === "asc" ? timeA - timeB : timeB - timeA;
15983 };
15984 var datetime_default = {
15985 type: "datetime",
15986 render,
15987 Edit: "datetime",
15988 sort,
15989 enableSorting: true,
15990 enableGlobalSearch: false,
15991 defaultOperators: [
15992 OPERATOR_ON,
15993 OPERATOR_NOT_ON,
15994 OPERATOR_BEFORE,
15995 OPERATOR_AFTER,
15996 OPERATOR_BEFORE_INC,
15997 OPERATOR_AFTER_INC,
15998 OPERATOR_IN_THE_PAST,
15999 OPERATOR_OVER
16000 ],
16001 validOperators: [
16002 OPERATOR_ON,
16003 OPERATOR_NOT_ON,
16004 OPERATOR_BEFORE,
16005 OPERATOR_AFTER,
16006 OPERATOR_BEFORE_INC,
16007 OPERATOR_AFTER_INC,
16008 OPERATOR_IN_THE_PAST,
16009 OPERATOR_OVER
16010 ],
16011 format: format4,
16012 getValueFormatted: getValueFormatted4,
16013 validate: {
16014 required: isValidRequired,
16015 elements: isValidElements
16016 }
16017 };
16018
16019 // packages/dataviews/build-module/field-types/date.mjs
16020 var import_date7 = __toESM(require_date(), 1);
16021 var format5 = {
16022 date: (0, import_date7.getSettings)().formats.date,
16023 weekStartsOn: (0, import_date7.getSettings)().l10n.startOfWeek
16024 };
16025 function getValueFormatted5({
16026 item,
16027 field
16028 }) {
16029 const value = field.getValue({ item });
16030 if (["", void 0, null].includes(value)) {
16031 return "";
16032 }
16033 let formatDate2;
16034 if (field.type !== "date") {
16035 formatDate2 = format5;
16036 } else {
16037 formatDate2 = field.format;
16038 }
16039 return (0, import_date7.dateI18n)(formatDate2.date, (0, import_date7.getDate)(value));
16040 }
16041 var sort2 = (a2, b2, direction) => {
16042 const timeA = new Date(a2).getTime();
16043 const timeB = new Date(b2).getTime();
16044 return direction === "asc" ? timeA - timeB : timeB - timeA;
16045 };
16046 var date_default = {
16047 type: "date",
16048 render,
16049 Edit: "date",
16050 sort: sort2,
16051 enableSorting: true,
16052 enableGlobalSearch: false,
16053 defaultOperators: [
16054 OPERATOR_ON,
16055 OPERATOR_NOT_ON,
16056 OPERATOR_BEFORE,
16057 OPERATOR_AFTER,
16058 OPERATOR_BEFORE_INC,
16059 OPERATOR_AFTER_INC,
16060 OPERATOR_IN_THE_PAST,
16061 OPERATOR_OVER,
16062 OPERATOR_BETWEEN
16063 ],
16064 validOperators: [
16065 OPERATOR_ON,
16066 OPERATOR_NOT_ON,
16067 OPERATOR_BEFORE,
16068 OPERATOR_AFTER,
16069 OPERATOR_BEFORE_INC,
16070 OPERATOR_AFTER_INC,
16071 OPERATOR_IN_THE_PAST,
16072 OPERATOR_OVER,
16073 OPERATOR_BETWEEN
16074 ],
16075 format: format5,
16076 getValueFormatted: getValueFormatted5,
16077 validate: {
16078 required: isValidRequired,
16079 elements: isValidElements
16080 }
16081 };
16082
16083 // packages/dataviews/build-module/field-types/boolean.mjs
16084 var import_i18n41 = __toESM(require_i18n(), 1);
16085
16086 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-bool.mjs
16087 function isValidRequiredForBool(item, field) {
16088 const value = field.getValue({ item });
16089 return value === true;
16090 }
16091
16092 // packages/dataviews/build-module/field-types/boolean.mjs
16093 function getValueFormatted6({
16094 item,
16095 field
16096 }) {
16097 const value = field.getValue({ item });
16098 if (value === true) {
16099 return (0, import_i18n41.__)("True");
16100 }
16101 if (value === false) {
16102 return (0, import_i18n41.__)("False");
16103 }
16104 return "";
16105 }
16106 function isValidCustom4(item, field) {
16107 const value = field.getValue({ item });
16108 if (![void 0, "", null].includes(value) && ![true, false].includes(value)) {
16109 return (0, import_i18n41.__)("Value must be true, false, or undefined");
16110 }
16111 return null;
16112 }
16113 var sort3 = (a2, b2, direction) => {
16114 const boolA = Boolean(a2);
16115 const boolB = Boolean(b2);
16116 if (boolA === boolB) {
16117 return 0;
16118 }
16119 if (direction === "asc") {
16120 return boolA ? 1 : -1;
16121 }
16122 return boolA ? -1 : 1;
16123 };
16124 var boolean_default = {
16125 type: "boolean",
16126 render,
16127 Edit: "checkbox",
16128 sort: sort3,
16129 validate: {
16130 required: isValidRequiredForBool,
16131 elements: isValidElements,
16132 custom: isValidCustom4
16133 },
16134 enableSorting: true,
16135 enableGlobalSearch: false,
16136 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
16137 validOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
16138 format: {},
16139 getValueFormatted: getValueFormatted6
16140 };
16141
16142 // packages/dataviews/build-module/field-types/media.mjs
16143 var media_default = {
16144 type: "media",
16145 render: () => null,
16146 Edit: null,
16147 sort: () => 0,
16148 enableSorting: false,
16149 enableGlobalSearch: false,
16150 defaultOperators: [],
16151 validOperators: [],
16152 format: {},
16153 getValueFormatted: get_value_formatted_default_default,
16154 // cannot validate any constraint, so
16155 // the only available validation for the field author
16156 // would be providing a custom validator.
16157 validate: {}
16158 };
16159
16160 // packages/dataviews/build-module/field-types/array.mjs
16161 var import_i18n42 = __toESM(require_i18n(), 1);
16162
16163 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-array.mjs
16164 function isValidRequiredForArray(item, field) {
16165 const value = field.getValue({ item });
16166 return Array.isArray(value) && value.length > 0 && value.every(
16167 (element) => ![void 0, "", null].includes(element)
16168 );
16169 }
16170
16171 // packages/dataviews/build-module/field-types/array.mjs
16172 function getValueFormatted7({
16173 item,
16174 field
16175 }) {
16176 const value = field.getValue({ item });
16177 const arr = Array.isArray(value) ? value : [];
16178 return arr.join(", ");
16179 }
16180 function render2({ item, field }) {
16181 return getValueFormatted7({ item, field });
16182 }
16183 function isValidCustom5(item, field) {
16184 const value = field.getValue({ item });
16185 if (![void 0, "", null].includes(value) && !Array.isArray(value)) {
16186 return (0, import_i18n42.__)("Value must be an array.");
16187 }
16188 if (!value.every((v2) => typeof v2 === "string")) {
16189 return (0, import_i18n42.__)("Every value must be a string.");
16190 }
16191 return null;
16192 }
16193 var sort4 = (a2, b2, direction) => {
16194 const arrA = Array.isArray(a2) ? a2 : [];
16195 const arrB = Array.isArray(b2) ? b2 : [];
16196 if (arrA.length !== arrB.length) {
16197 return direction === "asc" ? arrA.length - arrB.length : arrB.length - arrA.length;
16198 }
16199 const joinedA = arrA.join(",");
16200 const joinedB = arrB.join(",");
16201 return direction === "asc" ? joinedA.localeCompare(joinedB) : joinedB.localeCompare(joinedA);
16202 };
16203 var array_default = {
16204 type: "array",
16205 render: render2,
16206 Edit: "array",
16207 sort: sort4,
16208 enableSorting: true,
16209 enableGlobalSearch: false,
16210 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16211 validOperators: [
16212 OPERATOR_IS_ANY,
16213 OPERATOR_IS_NONE,
16214 OPERATOR_IS_ALL,
16215 OPERATOR_IS_NOT_ALL
16216 ],
16217 format: {},
16218 getValueFormatted: getValueFormatted7,
16219 validate: {
16220 required: isValidRequiredForArray,
16221 elements: isValidElements,
16222 custom: isValidCustom5
16223 }
16224 };
16225
16226 // packages/dataviews/build-module/field-types/password.mjs
16227 function getValueFormatted8({
16228 item,
16229 field
16230 }) {
16231 return field.getValue({ item }) ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : "";
16232 }
16233 var password_default = {
16234 type: "password",
16235 render,
16236 Edit: "password",
16237 sort: () => 0,
16238 // Passwords should not be sortable for security reasons
16239 enableSorting: false,
16240 enableGlobalSearch: false,
16241 defaultOperators: [],
16242 validOperators: [],
16243 format: {},
16244 getValueFormatted: getValueFormatted8,
16245 validate: {
16246 required: isValidRequired,
16247 pattern: isValidPattern,
16248 minLength: isValidMinLength,
16249 maxLength: isValidMaxLength,
16250 elements: isValidElements
16251 }
16252 };
16253
16254 // packages/dataviews/build-module/field-types/telephone.mjs
16255 var telephone_default = {
16256 type: "telephone",
16257 render,
16258 Edit: "telephone",
16259 sort: sort_text_default,
16260 enableSorting: true,
16261 enableGlobalSearch: false,
16262 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16263 validOperators: [
16264 OPERATOR_IS,
16265 OPERATOR_IS_NOT,
16266 OPERATOR_CONTAINS,
16267 OPERATOR_NOT_CONTAINS,
16268 OPERATOR_STARTS_WITH,
16269 // Multiple selection
16270 OPERATOR_IS_ANY,
16271 OPERATOR_IS_NONE,
16272 OPERATOR_IS_ALL,
16273 OPERATOR_IS_NOT_ALL
16274 ],
16275 format: {},
16276 getValueFormatted: get_value_formatted_default_default,
16277 validate: {
16278 required: isValidRequired,
16279 pattern: isValidPattern,
16280 minLength: isValidMinLength,
16281 maxLength: isValidMaxLength,
16282 elements: isValidElements
16283 }
16284 };
16285
16286 // packages/dataviews/build-module/field-types/color.mjs
16287 var import_i18n43 = __toESM(require_i18n(), 1);
16288 var import_jsx_runtime92 = __toESM(require_jsx_runtime(), 1);
16289 function render3({ item, field }) {
16290 if (field.hasElements) {
16291 return /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(RenderFromElements, { item, field });
16292 }
16293 const value = get_value_formatted_default_default({ item, field });
16294 if (!value || !w(value).isValid()) {
16295 return value;
16296 }
16297 return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
16298 /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
16299 "div",
16300 {
16301 style: {
16302 width: "16px",
16303 height: "16px",
16304 borderRadius: "50%",
16305 backgroundColor: value,
16306 border: "1px solid #ddd",
16307 flexShrink: 0
16308 }
16309 }
16310 ),
16311 /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { children: value })
16312 ] });
16313 }
16314 function isValidCustom6(item, field) {
16315 const value = field.getValue({ item });
16316 if (![void 0, "", null].includes(value) && !w(value).isValid()) {
16317 return (0, import_i18n43.__)("Value must be a valid color.");
16318 }
16319 return null;
16320 }
16321 var sort5 = (a2, b2, direction) => {
16322 const colorA = w(a2);
16323 const colorB = w(b2);
16324 if (!colorA.isValid() && !colorB.isValid()) {
16325 return 0;
16326 }
16327 if (!colorA.isValid()) {
16328 return direction === "asc" ? 1 : -1;
16329 }
16330 if (!colorB.isValid()) {
16331 return direction === "asc" ? -1 : 1;
16332 }
16333 const hslA = colorA.toHsl();
16334 const hslB = colorB.toHsl();
16335 if (hslA.h !== hslB.h) {
16336 return direction === "asc" ? hslA.h - hslB.h : hslB.h - hslA.h;
16337 }
16338 if (hslA.s !== hslB.s) {
16339 return direction === "asc" ? hslA.s - hslB.s : hslB.s - hslA.s;
16340 }
16341 return direction === "asc" ? hslA.l - hslB.l : hslB.l - hslA.l;
16342 };
16343 var color_default = {
16344 type: "color",
16345 render: render3,
16346 Edit: "color",
16347 sort: sort5,
16348 enableSorting: true,
16349 enableGlobalSearch: false,
16350 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16351 validOperators: [
16352 OPERATOR_IS,
16353 OPERATOR_IS_NOT,
16354 OPERATOR_IS_ANY,
16355 OPERATOR_IS_NONE
16356 ],
16357 format: {},
16358 getValueFormatted: get_value_formatted_default_default,
16359 validate: {
16360 required: isValidRequired,
16361 elements: isValidElements,
16362 custom: isValidCustom6
16363 }
16364 };
16365
16366 // packages/dataviews/build-module/field-types/url.mjs
16367 var url_default = {
16368 type: "url",
16369 render,
16370 Edit: "url",
16371 sort: sort_text_default,
16372 enableSorting: true,
16373 enableGlobalSearch: false,
16374 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE],
16375 validOperators: [
16376 OPERATOR_IS,
16377 OPERATOR_IS_NOT,
16378 OPERATOR_CONTAINS,
16379 OPERATOR_NOT_CONTAINS,
16380 OPERATOR_STARTS_WITH,
16381 // Multiple selection
16382 OPERATOR_IS_ANY,
16383 OPERATOR_IS_NONE,
16384 OPERATOR_IS_ALL,
16385 OPERATOR_IS_NOT_ALL
16386 ],
16387 format: {},
16388 getValueFormatted: get_value_formatted_default_default,
16389 validate: {
16390 required: isValidRequired,
16391 pattern: isValidPattern,
16392 minLength: isValidMinLength,
16393 maxLength: isValidMaxLength,
16394 elements: isValidElements
16395 }
16396 };
16397
16398 // packages/dataviews/build-module/field-types/no-type.mjs
16399 var sort6 = (a2, b2, direction) => {
16400 if (typeof a2 === "number" && typeof b2 === "number") {
16401 return sort_number_default(a2, b2, direction);
16402 }
16403 return sort_text_default(a2, b2, direction);
16404 };
16405 var no_type_default = {
16406 // type: no type for this one
16407 render,
16408 Edit: null,
16409 sort: sort6,
16410 enableSorting: true,
16411 enableGlobalSearch: false,
16412 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT],
16413 validOperators: getAllOperatorNames(),
16414 format: {},
16415 getValueFormatted: get_value_formatted_default_default,
16416 validate: {
16417 required: isValidRequired,
16418 elements: isValidElements
16419 }
16420 };
16421
16422 // packages/dataviews/build-module/field-types/utils/get-is-valid.mjs
16423 function getIsValid(field, fieldType) {
16424 let required;
16425 if (field.isValid?.required === true && fieldType.validate.required !== void 0) {
16426 required = {
16427 constraint: true,
16428 validate: fieldType.validate.required
16429 };
16430 }
16431 let elements;
16432 if ((field.isValid?.elements === true || // elements is enabled unless the field opts-out
16433 field.isValid?.elements === void 0 && (!!field.elements || !!field.getElements)) && fieldType.validate.elements !== void 0) {
16434 elements = {
16435 constraint: true,
16436 validate: fieldType.validate.elements
16437 };
16438 }
16439 let min;
16440 if (typeof field.isValid?.min === "number" && fieldType.validate.min !== void 0) {
16441 min = {
16442 constraint: field.isValid.min,
16443 validate: fieldType.validate.min
16444 };
16445 }
16446 let max;
16447 if (typeof field.isValid?.max === "number" && fieldType.validate.max !== void 0) {
16448 max = {
16449 constraint: field.isValid.max,
16450 validate: fieldType.validate.max
16451 };
16452 }
16453 let minLength;
16454 if (typeof field.isValid?.minLength === "number" && fieldType.validate.minLength !== void 0) {
16455 minLength = {
16456 constraint: field.isValid.minLength,
16457 validate: fieldType.validate.minLength
16458 };
16459 }
16460 let maxLength;
16461 if (typeof field.isValid?.maxLength === "number" && fieldType.validate.maxLength !== void 0) {
16462 maxLength = {
16463 constraint: field.isValid.maxLength,
16464 validate: fieldType.validate.maxLength
16465 };
16466 }
16467 let pattern;
16468 if (field.isValid?.pattern !== void 0 && fieldType.validate.pattern !== void 0) {
16469 pattern = {
16470 constraint: field.isValid?.pattern,
16471 validate: fieldType.validate.pattern
16472 };
16473 }
16474 const custom = field.isValid?.custom ?? fieldType.validate.custom;
16475 return {
16476 required,
16477 elements,
16478 min,
16479 max,
16480 minLength,
16481 maxLength,
16482 pattern,
16483 custom
16484 };
16485 }
16486
16487 // packages/dataviews/build-module/field-types/utils/get-filter.mjs
16488 function getFilter(fieldType) {
16489 return fieldType.validOperators.reduce((accumulator, operator) => {
16490 const operatorObj = getOperatorByName(operator);
16491 if (operatorObj?.filter) {
16492 accumulator[operator] = operatorObj.filter;
16493 }
16494 return accumulator;
16495 }, {});
16496 }
16497
16498 // packages/dataviews/build-module/field-types/utils/get-format.mjs
16499 function getFormat(field, fieldType) {
16500 return {
16501 ...fieldType.format,
16502 ...field.format
16503 };
16504 }
16505 var get_format_default = getFormat;
16506
16507 // packages/dataviews/build-module/field-types/index.mjs
16508 function getFieldTypeByName(type) {
16509 const found = [
16510 email_default,
16511 integer_default,
16512 number_default,
16513 text_default,
16514 datetime_default,
16515 date_default,
16516 boolean_default,
16517 media_default,
16518 array_default,
16519 password_default,
16520 telephone_default,
16521 color_default,
16522 url_default
16523 ].find((fieldType) => fieldType?.type === type);
16524 if (!!found) {
16525 return found;
16526 }
16527 return no_type_default;
16528 }
16529 function normalizeFields(fields) {
16530 return fields.map((field) => {
16531 const fieldType = getFieldTypeByName(field.type);
16532 const getValue = field.getValue || get_value_from_id_default(field.id);
16533 const sort7 = function(a2, b2, direction) {
16534 const aValue = getValue({ item: a2 });
16535 const bValue = getValue({ item: b2 });
16536 return field.sort ? field.sort(aValue, bValue, direction) : fieldType.sort(aValue, bValue, direction);
16537 };
16538 return {
16539 id: field.id,
16540 label: field.label || field.id,
16541 header: field.header || field.label || field.id,
16542 description: field.description,
16543 placeholder: field.placeholder,
16544 getValue,
16545 setValue: field.setValue || set_value_from_id_default(field.id),
16546 elements: field.elements,
16547 getElements: field.getElements,
16548 hasElements: hasElements(field),
16549 isVisible: field.isVisible,
16550 enableHiding: field.enableHiding ?? true,
16551 readOnly: field.readOnly ?? false,
16552 // The type provides defaults for the following props
16553 type: fieldType.type,
16554 render: field.render ?? fieldType.render,
16555 Edit: getControl(field, fieldType.Edit),
16556 sort: sort7,
16557 enableSorting: field.enableSorting ?? fieldType.enableSorting,
16558 enableGlobalSearch: field.enableGlobalSearch ?? fieldType.enableGlobalSearch,
16559 isValid: getIsValid(field, fieldType),
16560 filterBy: get_filter_by_default(
16561 field,
16562 fieldType.defaultOperators,
16563 fieldType.validOperators
16564 ),
16565 filter: getFilter(fieldType),
16566 format: get_format_default(field, fieldType),
16567 getValueFormatted: field.getValueFormatted ?? fieldType.getValueFormatted
16568 };
16569 });
16570 }
16571
16572 // packages/dataviews/build-module/hooks/use-data.mjs
16573 var import_element55 = __toESM(require_element(), 1);
16574 function useData(data, isLoading, paginationInfo) {
16575 const previousDataRef = (0, import_element55.useRef)(data);
16576 const previousPaginationInfoRef = (0, import_element55.useRef)(paginationInfo);
16577 const [hasInitiallyLoaded, setHasInitiallyLoaded] = (0, import_element55.useState)(
16578 !isLoading
16579 );
16580 (0, import_element55.useEffect)(() => {
16581 if (!isLoading) {
16582 previousDataRef.current = data;
16583 previousPaginationInfoRef.current = paginationInfo;
16584 setHasInitiallyLoaded(true);
16585 }
16586 }, [data, isLoading, paginationInfo]);
16587 return {
16588 data: isLoading && previousDataRef.current?.length ? previousDataRef.current : data,
16589 paginationInfo: isLoading && previousDataRef.current?.length ? previousPaginationInfoRef.current : paginationInfo,
16590 hasInitiallyLoaded
16591 };
16592 }
16593
16594 // packages/dataviews/build-module/dataviews/index.mjs
16595 var import_jsx_runtime93 = __toESM(require_jsx_runtime(), 1);
16596 var defaultGetItemId = (item) => item.id;
16597 var defaultIsItemClickable = () => true;
16598 var EMPTY_ARRAY6 = [];
16599 var dataViewsLayouts = VIEW_LAYOUTS.filter(
16600 (viewLayout) => !viewLayout.isPicker
16601 );
16602 function DefaultUI({
16603 header,
16604 search = true,
16605 searchLabel = void 0
16606 }) {
16607 return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_jsx_runtime93.Fragment, { children: [
16608 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
16609 Stack,
16610 {
16611 direction: "row",
16612 align: "top",
16613 justify: "space-between",
16614 className: "dataviews__view-actions",
16615 gap: "xs",
16616 children: [
16617 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(
16618 Stack,
16619 {
16620 direction: "row",
16621 justify: "start",
16622 gap: "sm",
16623 className: "dataviews__search",
16624 children: [
16625 search && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(dataviews_search_default, { label: searchLabel }),
16626 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(toggle_default, {})
16627 ]
16628 }
16629 ),
16630 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(Stack, { direction: "row", gap: "xs", style: { flexShrink: 0 }, children: [
16631 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(dataviews_view_config_default, {}),
16632 header
16633 ] })
16634 ]
16635 }
16636 ),
16637 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(filters_toggled_default, { className: "dataviews-filters__container" }),
16638 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(DataViewsLayout, {}),
16639 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(DataViewsFooter, {})
16640 ] });
16641 }
16642 function DataViews({
16643 view,
16644 onChangeView,
16645 fields,
16646 search = true,
16647 searchLabel = void 0,
16648 actions = EMPTY_ARRAY6,
16649 data,
16650 getItemId = defaultGetItemId,
16651 getItemLevel,
16652 isLoading = false,
16653 paginationInfo,
16654 defaultLayouts: defaultLayoutsProperty,
16655 selection: selectionProperty,
16656 onChangeSelection,
16657 onClickItem,
16658 renderItemLink,
16659 isItemClickable = defaultIsItemClickable,
16660 header,
16661 children,
16662 config = { perPageSizes: [10, 20, 50, 100] },
16663 empty,
16664 onReset
16665 }) {
16666 const { infiniteScrollHandler } = paginationInfo;
16667 const containerRef = (0, import_element56.useRef)(null);
16668 const [containerWidth, setContainerWidth] = (0, import_element56.useState)(0);
16669 const resizeObserverRef = (0, import_compose12.useResizeObserver)(
16670 (resizeObserverEntries) => {
16671 setContainerWidth(
16672 resizeObserverEntries[0].borderBoxSize[0].inlineSize
16673 );
16674 },
16675 { box: "border-box" }
16676 );
16677 const [selectionState, setSelectionState] = (0, import_element56.useState)([]);
16678 const isUncontrolled = selectionProperty === void 0 || onChangeSelection === void 0;
16679 const selection = isUncontrolled ? selectionState : selectionProperty;
16680 const [openedFilter, setOpenedFilter] = (0, import_element56.useState)(null);
16681 function setSelectionWithChange(value) {
16682 const newValue = typeof value === "function" ? value(selection) : value;
16683 if (isUncontrolled) {
16684 setSelectionState(newValue);
16685 }
16686 if (onChangeSelection) {
16687 onChangeSelection(newValue);
16688 }
16689 }
16690 const _fields = (0, import_element56.useMemo)(() => normalizeFields(fields), [fields]);
16691 const _selection = (0, import_element56.useMemo)(() => {
16692 return selection.filter(
16693 (id) => data.some((item) => getItemId(item) === id)
16694 );
16695 }, [selection, data, getItemId]);
16696 const filters = use_filters_default(_fields, view);
16697 const hasPrimaryOrLockedFilters = (0, import_element56.useMemo)(
16698 () => (filters || []).some(
16699 (filter) => filter.isPrimary || filter.isLocked
16700 ),
16701 [filters]
16702 );
16703 const [isShowingFilter, setIsShowingFilter] = (0, import_element56.useState)(
16704 hasPrimaryOrLockedFilters
16705 );
16706 (0, import_element56.useEffect)(() => {
16707 if (hasPrimaryOrLockedFilters && !isShowingFilter) {
16708 setIsShowingFilter(true);
16709 }
16710 }, [hasPrimaryOrLockedFilters, isShowingFilter]);
16711 (0, import_element56.useEffect)(() => {
16712 if (!view.infiniteScrollEnabled || !containerRef.current) {
16713 return;
16714 }
16715 const handleScroll = (0, import_compose12.throttle)((event) => {
16716 const target = event.target;
16717 const scrollTop = target.scrollTop;
16718 const scrollHeight = target.scrollHeight;
16719 const clientHeight = target.clientHeight;
16720 if (scrollTop + clientHeight >= scrollHeight - 100) {
16721 infiniteScrollHandler?.();
16722 }
16723 }, 100);
16724 const container = containerRef.current;
16725 container.addEventListener("scroll", handleScroll);
16726 return () => {
16727 container.removeEventListener("scroll", handleScroll);
16728 handleScroll.cancel();
16729 };
16730 }, [infiniteScrollHandler, view.infiniteScrollEnabled]);
16731 const defaultLayouts = (0, import_element56.useMemo)(
16732 () => Object.fromEntries(
16733 Object.entries(defaultLayoutsProperty).filter(
16734 ([layoutType]) => {
16735 return dataViewsLayouts.some(
16736 (viewLayout) => viewLayout.type === layoutType
16737 );
16738 }
16739 )
16740 ),
16741 [defaultLayoutsProperty]
16742 );
16743 const {
16744 data: displayData,
16745 paginationInfo: displayPaginationInfo,
16746 hasInitiallyLoaded
16747 } = useData(data, isLoading, paginationInfo);
16748 if (!defaultLayouts[view.type]) {
16749 return null;
16750 }
16751 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
16752 dataviews_context_default.Provider,
16753 {
16754 value: {
16755 view,
16756 onChangeView,
16757 fields: _fields,
16758 actions,
16759 data: displayData,
16760 isLoading,
16761 paginationInfo: displayPaginationInfo,
16762 selection: _selection,
16763 onChangeSelection: setSelectionWithChange,
16764 openedFilter,
16765 setOpenedFilter,
16766 getItemId,
16767 getItemLevel,
16768 isItemClickable,
16769 onClickItem,
16770 renderItemLink,
16771 containerWidth,
16772 containerRef,
16773 resizeObserverRef,
16774 defaultLayouts,
16775 filters,
16776 isShowingFilter,
16777 setIsShowingFilter,
16778 config,
16779 empty,
16780 hasInitiallyLoaded,
16781 hasInfiniteScrollHandler: !!infiniteScrollHandler,
16782 onReset
16783 },
16784 children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "dataviews-wrapper", ref: containerRef, children: children ?? /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
16785 DefaultUI,
16786 {
16787 header,
16788 search,
16789 searchLabel
16790 }
16791 ) })
16792 }
16793 );
16794 }
16795 var DataViewsSubComponents = DataViews;
16796 DataViewsSubComponents.BulkActionToolbar = BulkActionsFooter;
16797 DataViewsSubComponents.Filters = filters_default;
16798 DataViewsSubComponents.FiltersToggled = filters_toggled_default;
16799 DataViewsSubComponents.FiltersToggle = toggle_default;
16800 DataViewsSubComponents.Layout = DataViewsLayout;
16801 DataViewsSubComponents.LayoutSwitcher = ViewTypeMenu;
16802 DataViewsSubComponents.Pagination = DataViewsPagination;
16803 DataViewsSubComponents.Search = dataviews_search_default;
16804 DataViewsSubComponents.ViewConfig = DataviewsViewConfigDropdown;
16805 DataViewsSubComponents.Footer = DataViewsFooter;
16806 var dataviews_default = DataViewsSubComponents;
16807
16808 // packages/dataviews/build-module/utils/filter-sort-and-paginate.mjs
16809 var import_remove_accents2 = __toESM(require_remove_accents(), 1);
16810 var import_deprecated = __toESM(require_deprecated(), 1);
16811 function normalizeSearchInput2(input = "") {
16812 return (0, import_remove_accents2.default)(input.trim().toLowerCase());
16813 }
16814 var EMPTY_ARRAY7 = [];
16815 function filterSortAndPaginate(data, view, fields) {
16816 if (!data) {
16817 return {
16818 data: EMPTY_ARRAY7,
16819 paginationInfo: { totalItems: 0, totalPages: 0 }
16820 };
16821 }
16822 const _fields = normalizeFields(fields);
16823 let filteredData = [...data];
16824 if (view.search) {
16825 const normalizedSearch = normalizeSearchInput2(view.search);
16826 filteredData = filteredData.filter((item) => {
16827 return _fields.filter((field) => field.enableGlobalSearch).some((field) => {
16828 const fieldValue = field.getValue({ item });
16829 const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue];
16830 return values.some(
16831 (value) => normalizeSearchInput2(String(value)).includes(
16832 normalizedSearch
16833 )
16834 );
16835 });
16836 });
16837 }
16838 if (view.filters && view.filters?.length > 0) {
16839 view.filters.forEach((filter) => {
16840 const field = _fields.find(
16841 (_field) => _field.id === filter.field
16842 );
16843 if (field) {
16844 if (filter.operator === OPERATOR_IS_NOT_ALL) {
16845 (0, import_deprecated.default)("The 'isNotAll' filter operator", {
16846 since: "7.0",
16847 alternative: "'isNone'"
16848 });
16849 }
16850 const handler = field.filter[filter.operator];
16851 if (handler) {
16852 filteredData = filteredData.filter(
16853 (item) => handler(item, field, filter.value)
16854 );
16855 }
16856 }
16857 });
16858 }
16859 const sortByField = view.sort?.field ? _fields.find((field) => {
16860 return field.enableSorting !== false && field.id === view.sort?.field;
16861 }) : null;
16862 const groupByField = view.groupBy?.field ? _fields.find((field) => {
16863 return field.enableSorting !== false && field.id === view.groupBy?.field;
16864 }) : null;
16865 if (sortByField || groupByField) {
16866 filteredData.sort((a2, b2) => {
16867 if (groupByField) {
16868 const groupCompare = groupByField.sort(
16869 a2,
16870 b2,
16871 view.groupBy?.direction ?? "asc"
16872 );
16873 if (groupCompare !== 0) {
16874 return groupCompare;
16875 }
16876 }
16877 if (sortByField) {
16878 return sortByField.sort(a2, b2, view.sort?.direction ?? "desc");
16879 }
16880 return 0;
16881 });
16882 }
16883 let totalItems = filteredData.length;
16884 let totalPages = 1;
16885 if (view.page !== void 0 && view.perPage !== void 0) {
16886 const start = (view.page - 1) * view.perPage;
16887 totalItems = filteredData?.length || 0;
16888 totalPages = Math.ceil(totalItems / view.perPage);
16889 filteredData = filteredData?.slice(start, start + view.perPage);
16890 }
16891 return {
16892 data: filteredData,
16893 paginationInfo: {
16894 totalItems,
16895 totalPages
16896 }
16897 };
16898 }
16899
16900 // packages/admin-ui/build-module/navigable-region/index.mjs
16901 var import_element57 = __toESM(require_element(), 1);
16902 var import_jsx_runtime94 = __toESM(require_jsx_runtime(), 1);
16903 var NavigableRegion = (0, import_element57.forwardRef)(
16904 ({ children, className, ariaLabel, as: Tag = "div", ...props }, ref) => {
16905 return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
16906 Tag,
16907 {
16908 ref,
16909 className: clsx_default("admin-ui-navigable-region", className),
16910 "aria-label": ariaLabel,
16911 role: "region",
16912 tabIndex: "-1",
16913 ...props,
16914 children
16915 }
16916 );
16917 }
16918 );
16919 NavigableRegion.displayName = "NavigableRegion";
16920 var navigable_region_default = NavigableRegion;
16921
16922 // packages/admin-ui/build-module/page/header.mjs
16923 var import_components47 = __toESM(require_components(), 1);
16924
16925 // packages/admin-ui/build-module/page/sidebar-toggle-slot.mjs
16926 var import_components46 = __toESM(require_components(), 1);
16927 var { Fill: SidebarToggleFill, Slot: SidebarToggleSlot } = (0, import_components46.createSlotFill)("SidebarToggle");
16928
16929 // packages/admin-ui/build-module/page/header.mjs
16930 var import_jsx_runtime95 = __toESM(require_jsx_runtime(), 1);
16931 function Header({
16932 breadcrumbs,
16933 badges,
16934 title,
16935 subTitle,
16936 actions,
16937 showSidebarToggle = true
16938 }) {
16939 return /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(import_components47.__experimentalVStack, { className: "admin-ui-page__header", as: "header", children: [
16940 /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(import_components47.__experimentalHStack, { justify: "space-between", spacing: 2, children: [
16941 /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(import_components47.__experimentalHStack, { spacing: 2, justify: "left", children: [
16942 showSidebarToggle && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
16943 SidebarToggleSlot,
16944 {
16945 bubblesVirtually: true,
16946 className: "admin-ui-page__sidebar-toggle-slot"
16947 }
16948 ),
16949 title && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(import_components47.__experimentalHeading, { as: "h2", level: 3, weight: 500, truncate: true, children: title }),
16950 breadcrumbs,
16951 badges
16952 ] }),
16953 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(
16954 import_components47.__experimentalHStack,
16955 {
16956 style: { width: "auto", flexShrink: 0 },
16957 spacing: 2,
16958 className: "admin-ui-page__header-actions",
16959 children: actions
16960 }
16961 )
16962 ] }),
16963 subTitle && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("p", { className: "admin-ui-page__header-subtitle", children: subTitle })
16964 ] });
16965 }
16966
16967 // packages/admin-ui/build-module/page/index.mjs
16968 var import_jsx_runtime96 = __toESM(require_jsx_runtime(), 1);
16969 function Page({
16970 breadcrumbs,
16971 badges,
16972 title,
16973 subTitle,
16974 children,
16975 className,
16976 actions,
16977 ariaLabel,
16978 hasPadding = false,
16979 showSidebarToggle = true
16980 }) {
16981 const classes = clsx_default("admin-ui-page", className);
16982 const effectiveAriaLabel = ariaLabel ?? (typeof title === "string" ? title : "");
16983 return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(navigable_region_default, { className: classes, ariaLabel: effectiveAriaLabel, children: [
16984 (title || breadcrumbs || badges) && /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
16985 Header,
16986 {
16987 breadcrumbs,
16988 badges,
16989 title,
16990 subTitle,
16991 actions,
16992 showSidebarToggle
16993 }
16994 ),
16995 hasPadding ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "admin-ui-page__content has-padding", children }) : children
16996 ] });
16997 }
16998 Page.SidebarToggleFill = SidebarToggleFill;
16999 var page_default = Page;
17000
17001 // routes/pattern-list/stage.tsx
17002 var import_core_data3 = __toESM(require_core_data());
17003 var import_components48 = __toESM(require_components());
17004 var import_data10 = __toESM(require_data());
17005 var import_element60 = __toESM(require_element());
17006 var import_editor = __toESM(require_editor());
17007 var import_patterns3 = __toESM(require_patterns());
17008 var import_i18n48 = __toESM(require_i18n());
17009
17010 // routes/lock-unlock.ts
17011 var import_private_apis2 = __toESM(require_private_apis());
17012 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
17013 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
17014 "@wordpress/routes"
17015 );
17016
17017 // routes/pattern-list/view-utils.ts
17018 var import_i18n44 = __toESM(require_i18n());
17019 var LAYOUT_GRID2 = "grid";
17020 var LAYOUT_TABLE2 = "table";
17021 var DEFAULT_VIEW = {
17022 type: LAYOUT_GRID2,
17023 perPage: 20,
17024 sort: {
17025 field: "title",
17026 direction: "asc"
17027 },
17028 filters: [],
17029 fields: ["sync-status"],
17030 layout: {
17031 badgeFields: ["sync-status"]
17032 },
17033 titleField: "title",
17034 mediaField: "preview"
17035 };
17036 var DEFAULT_VIEWS = [
17037 {
17038 slug: "all",
17039 label: (0, import_i18n44.__)("All patterns")
17040 },
17041 {
17042 slug: "my-patterns",
17043 label: (0, import_i18n44.__)("My patterns")
17044 },
17045 {
17046 slug: "registered",
17047 label: (0, import_i18n44.__)("Registered")
17048 }
17049 ];
17050 var DEFAULT_LAYOUTS = {
17051 [LAYOUT_TABLE2]: {},
17052 [LAYOUT_GRID2]: {
17053 layout: {
17054 badgeFields: ["sync-status"]
17055 }
17056 }
17057 };
17058
17059 // routes/pattern-list/fields/preview.tsx
17060 var import_i18n45 = __toESM(require_i18n());
17061 import { Preview } from "@wordpress/lazy-editor";
17062 function PreviewField({ item }) {
17063 return /* @__PURE__ */ React.createElement(
17064 Preview,
17065 {
17066 blocks: item.blocks,
17067 content: item.content,
17068 description: item.description
17069 }
17070 );
17071 }
17072 var previewField = {
17073 label: (0, import_i18n45.__)("Preview"),
17074 id: "preview",
17075 render: PreviewField,
17076 enableSorting: false
17077 };
17078
17079 // routes/pattern-list/fields/sync-status.tsx
17080 var import_i18n46 = __toESM(require_i18n());
17081 var import_patterns = __toESM(require_patterns());
17082 var { PATTERN_SYNC_TYPES } = unlock2(import_patterns.privateApis);
17083 var OPERATOR_IS2 = "is";
17084 var SYNC_FILTERS = [
17085 {
17086 value: PATTERN_SYNC_TYPES.full,
17087 label: (0, import_i18n46._x)("Synced", "pattern (singular)"),
17088 description: (0, import_i18n46.__)("Patterns that are kept in sync across the site.")
17089 },
17090 {
17091 value: PATTERN_SYNC_TYPES.unsynced,
17092 label: (0, import_i18n46._x)("Not synced", "pattern (singular)"),
17093 description: (0, import_i18n46.__)(
17094 "Patterns that can be changed freely without affecting the site."
17095 )
17096 }
17097 ];
17098 var patternStatusField = {
17099 label: (0, import_i18n46.__)("Sync status"),
17100 id: "sync-status",
17101 render: ({ item }) => {
17102 const syncStatus = item.syncStatus;
17103 return /* @__PURE__ */ React.createElement(
17104 "span",
17105 {
17106 className: `routes-pattern-list__field-sync-status-${syncStatus}`
17107 },
17108 SYNC_FILTERS.find(({ value }) => value === syncStatus)?.label
17109 );
17110 },
17111 elements: SYNC_FILTERS,
17112 filterBy: {
17113 operators: [OPERATOR_IS2],
17114 isPrimary: true
17115 },
17116 enableSorting: false
17117 };
17118
17119 // routes/pattern-list/fields/category.tsx
17120 var import_i18n47 = __toESM(require_i18n());
17121 var import_data8 = __toESM(require_data());
17122 var import_core_data = __toESM(require_core_data());
17123 var import_element58 = __toESM(require_element());
17124 var OPERATOR_IS3 = "is";
17125 function CategoryField({ item }) {
17126 const blockPatternCategories = (0, import_data8.useSelect)(
17127 (select2) => select2(import_core_data.store).getBlockPatternCategories(),
17128 []
17129 );
17130 const categoryLabels = (0, import_element58.useMemo)(() => {
17131 if (!item.categories || !Array.isArray(item.categories)) {
17132 return [];
17133 }
17134 return item.categories.map((catSlug) => {
17135 const category = blockPatternCategories?.find(
17136 (cat) => cat.name === catSlug
17137 );
17138 return category ? category.label || category.name : null;
17139 }).filter(Boolean);
17140 }, [item.categories, blockPatternCategories]);
17141 if (categoryLabels.length === 0) {
17142 return /* @__PURE__ */ React.createElement("span", { className: "pattern-category-field__empty" }, "\u2014");
17143 }
17144 return /* @__PURE__ */ React.createElement("span", { className: "pattern-category-field" }, categoryLabels.join(", "));
17145 }
17146 function usePatternCategories() {
17147 const userPatternCategories = (0, import_data8.useSelect)(
17148 (select2) => select2(import_core_data.store).getUserPatternCategories(),
17149 []
17150 );
17151 const blockPatternCategories = (0, import_data8.useSelect)(
17152 (select2) => select2(import_core_data.store).getBlockPatternCategories(),
17153 []
17154 );
17155 return (0, import_element58.useMemo)(() => {
17156 const categoryMap = /* @__PURE__ */ new Map();
17157 userPatternCategories?.forEach((cat) => {
17158 if (!categoryMap.has(cat.name)) {
17159 categoryMap.set(cat.name, {
17160 value: cat.name,
17161 label: cat.label || cat.name
17162 });
17163 }
17164 });
17165 blockPatternCategories?.forEach((cat) => {
17166 if (!categoryMap.has(cat.name)) {
17167 categoryMap.set(cat.name, {
17168 value: cat.name,
17169 label: cat.label || cat.name
17170 });
17171 }
17172 });
17173 return Array.from(categoryMap.values()).sort(
17174 (a2, b2) => a2.label.localeCompare(b2.label)
17175 );
17176 }, [userPatternCategories, blockPatternCategories]);
17177 }
17178 function usePatternCategoryField() {
17179 const categories = usePatternCategories();
17180 return {
17181 label: (0, import_i18n47.__)("Category"),
17182 id: "category",
17183 render: CategoryField,
17184 elements: categories,
17185 getValue: ({ item }) => {
17186 return item.categories;
17187 },
17188 filterBy: {
17189 operators: [OPERATOR_IS3],
17190 isPrimary: true
17191 },
17192 enableSorting: false
17193 };
17194 }
17195
17196 // routes/pattern-list/use-patterns.ts
17197 var import_data9 = __toESM(require_data());
17198 var import_core_data2 = __toESM(require_core_data());
17199 var import_element59 = __toESM(require_element());
17200 var import_patterns2 = __toESM(require_patterns());
17201 var import_block_editor = __toESM(require_block_editor());
17202
17203 // routes/pattern-list/utils.ts
17204 var filterOutDuplicatesByName = (currentItem, index, items) => index === items.findIndex((item) => currentItem.name === item.name);
17205
17206 // routes/pattern-list/use-patterns.ts
17207 var {
17208 PATTERN_TYPES,
17209 PATTERN_SYNC_TYPES: PATTERN_SYNC_TYPES2,
17210 EXCLUDED_PATTERN_SOURCES,
17211 PATTERN_DEFAULT_CATEGORY
17212 } = unlock2(import_patterns2.privateApis);
17213 var { extractWords, getNormalizedSearchTerms, normalizeString: normalizeString2 } = unlock2(
17214 import_block_editor.privateApis
17215 );
17216 function normalizeThemePattern(pattern) {
17217 return {
17218 id: pattern.name,
17219 title: pattern.title,
17220 content: pattern.content,
17221 keywords: pattern.keywords || [],
17222 type: PATTERN_TYPES.theme,
17223 // Normalize categories to always be an array of slugs
17224 categories: pattern.categories || [],
17225 // Theme patterns are always unsynced
17226 syncStatus: PATTERN_SYNC_TYPES2.unsynced,
17227 description: pattern.description || ""
17228 };
17229 }
17230 function normalizeUserPattern(pattern, userPatternCategories) {
17231 const categories = [];
17232 if (pattern.wp_pattern_category && Array.isArray(pattern.wp_pattern_category)) {
17233 pattern.wp_pattern_category.forEach((catId) => {
17234 const category = userPatternCategories?.find(
17235 (cat) => cat.id === catId
17236 );
17237 if (category) {
17238 categories.push(category.name);
17239 }
17240 });
17241 }
17242 const numericId = pattern.id;
17243 return {
17244 id: pattern.name || pattern.id.toString(),
17245 _recordId: numericId,
17246 // Keep numeric ID for permissions lookup
17247 keywords: [],
17248 type: PATTERN_TYPES.user,
17249 // Normalize categories to always be an array of slugs
17250 categories,
17251 // Normalize sync status
17252 syncStatus: pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES2.full,
17253 title: typeof pattern.title === "string" ? pattern.title : pattern.title.raw,
17254 content: typeof pattern.content === "string" ? pattern.content : pattern.content.raw,
17255 description: pattern.excerpt?.raw || "",
17256 blocks: pattern.blocks
17257 };
17258 }
17259 var removeMatchingTerms = (unmatchedTerms, unprocessedTerms) => {
17260 return unmatchedTerms.filter(
17261 (term) => !getNormalizedSearchTerms(unprocessedTerms).some(
17262 (unprocessedTerm) => unprocessedTerm.includes(term)
17263 )
17264 );
17265 };
17266 function getItemSearchRank(item, searchTerm, config) {
17267 const { categoryId, hasCategory, onlyFilterByCategory } = config;
17268 let rank = categoryId === PATTERN_DEFAULT_CATEGORY || categoryId === "my-patterns" && item.type === PATTERN_TYPES.user || hasCategory && hasCategory(item, categoryId || "") ? 1 : 0;
17269 if (!rank || onlyFilterByCategory) {
17270 return rank;
17271 }
17272 const normalizedSearchInput = normalizeString2(searchTerm);
17273 const normalizedTitle = normalizeString2(item.title);
17274 if (normalizedSearchInput === normalizedTitle) {
17275 rank += 30;
17276 } else if (normalizedTitle.startsWith(normalizedSearchInput)) {
17277 rank += 20;
17278 } else {
17279 const terms = [
17280 item.id,
17281 item.title,
17282 item.description,
17283 ...item.keywords
17284 ].join(" ");
17285 const normalizedSearchTerms = extractWords(normalizedSearchInput);
17286 const unmatchedTerms = removeMatchingTerms(
17287 normalizedSearchTerms,
17288 terms
17289 );
17290 if (unmatchedTerms.length === 0) {
17291 rank += 10;
17292 }
17293 }
17294 return rank;
17295 }
17296 function searchItems(items = [], searchInput = "", config = {}) {
17297 const normalizedSearchTerms = getNormalizedSearchTerms(searchInput);
17298 const onlyFilterByCategory = config.categoryId !== PATTERN_DEFAULT_CATEGORY && !normalizedSearchTerms.length;
17299 const searchRankConfig = { ...config, onlyFilterByCategory };
17300 const threshold = onlyFilterByCategory ? 0 : 1;
17301 const rankedItems = items.map((item) => {
17302 return [
17303 item,
17304 getItemSearchRank(item, searchInput, searchRankConfig)
17305 ];
17306 }).filter(([, rank]) => rank > threshold);
17307 if (normalizedSearchTerms.length === 0) {
17308 return rankedItems.map(([item]) => item);
17309 }
17310 rankedItems.sort(([, rank1], [, rank2]) => rank2 - rank1);
17311 return rankedItems.map(([item]) => item);
17312 }
17313 var selectThemePatterns = (0, import_data9.createSelector)(
17314 (select2) => {
17315 const { getBlockPatterns } = select2(import_core_data2.store);
17316 const { isResolving: isResolvingSelector } = select2(import_core_data2.store);
17317 const restBlockPatterns = getBlockPatterns();
17318 const patterns = (restBlockPatterns || []).filter(
17319 (pattern) => !EXCLUDED_PATTERN_SOURCES.includes(pattern.source)
17320 ).filter(filterOutDuplicatesByName).filter((pattern) => pattern.inserter !== false).map(normalizeThemePattern);
17321 return {
17322 patterns,
17323 isResolving: isResolvingSelector("getBlockPatterns")
17324 };
17325 },
17326 (select2) => [
17327 select2(import_core_data2.store).getBlockPatterns(),
17328 select2(import_core_data2.store).isResolving("getBlockPatterns")
17329 ]
17330 );
17331 var selectUserPatterns = (0, import_data9.createSelector)(
17332 (select2, syncStatus = void 0, search = "") => {
17333 const {
17334 getEntityRecords,
17335 isResolving: isResolvingSelector,
17336 getUserPatternCategories
17337 } = select2(import_core_data2.store);
17338 const query = { per_page: -1 };
17339 const patternPosts = getEntityRecords(
17340 "postType",
17341 PATTERN_TYPES.user,
17342 query
17343 );
17344 const userPatternCategories = getUserPatternCategories();
17345 let patterns = (patternPosts ?? []).map(
17346 (pattern) => normalizeUserPattern(pattern, userPatternCategories)
17347 );
17348 const isResolving = isResolvingSelector("getEntityRecords", [
17349 "postType",
17350 PATTERN_TYPES.user,
17351 query
17352 ]);
17353 if (syncStatus) {
17354 patterns = patterns.filter(
17355 (pattern) => pattern.syncStatus === syncStatus
17356 );
17357 }
17358 patterns = searchItems(patterns, search, {
17359 // We exit user pattern retrieval early if we aren't in the
17360 // catch-all category for user created patterns, so it has
17361 // to be in the category.
17362 categoryId: PATTERN_DEFAULT_CATEGORY,
17363 hasCategory: () => true
17364 });
17365 return {
17366 patterns,
17367 isResolving,
17368 categories: userPatternCategories
17369 };
17370 },
17371 (select2) => [
17372 select2(import_core_data2.store).getEntityRecords("postType", PATTERN_TYPES.user, {
17373 per_page: -1
17374 }),
17375 select2(import_core_data2.store).isResolving("getEntityRecords", [
17376 "postType",
17377 PATTERN_TYPES.user,
17378 { per_page: -1 }
17379 ]),
17380 select2(import_core_data2.store).getUserPatternCategories()
17381 ]
17382 );
17383 var selectPatterns = (0, import_data9.createSelector)(
17384 (select2, categoryId, syncStatus, search = "") => {
17385 const {
17386 patterns: themePatterns,
17387 isResolving: isResolvingThemePatterns
17388 } = selectThemePatterns(select2);
17389 const { patterns: userPatterns, isResolving: isResolvingUserPatterns } = selectUserPatterns(select2);
17390 let patterns = [
17391 ...themePatterns || [],
17392 ...userPatterns || []
17393 ];
17394 if (syncStatus) {
17395 patterns = patterns.filter(
17396 (pattern) => pattern.syncStatus === syncStatus
17397 );
17398 }
17399 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) {
17400 patterns = searchItems(patterns, search, {
17401 categoryId,
17402 hasCategory: (item, currentCategory) => {
17403 return item.categories?.includes(currentCategory);
17404 }
17405 });
17406 } else {
17407 patterns = searchItems(patterns, search, {
17408 categoryId: PATTERN_DEFAULT_CATEGORY,
17409 hasCategory: () => true
17410 });
17411 }
17412 return {
17413 patterns,
17414 isResolving: isResolvingThemePatterns || isResolvingUserPatterns
17415 };
17416 },
17417 (select2) => [
17418 selectThemePatterns(select2),
17419 selectUserPatterns(select2)
17420 ]
17421 );
17422 function useAugmentPatternsWithPermissions(patterns) {
17423 const idsAndTypes = (0, import_element59.useMemo)(
17424 () => patterns?.filter((record) => record.type !== PATTERN_TYPES.theme).map((record) => [
17425 record.type,
17426 record._recordId,
17427 record.id
17428 ]) ?? [],
17429 [patterns]
17430 );
17431 const permissions = (0, import_data9.useSelect)(
17432 (select2) => {
17433 const { getEntityRecordPermissions } = unlock2(
17434 select2(import_core_data2.store)
17435 );
17436 return idsAndTypes.reduce(
17437 (acc, [type, numericId, stringId]) => {
17438 acc[stringId] = getEntityRecordPermissions(
17439 "postType",
17440 type,
17441 numericId
17442 );
17443 return acc;
17444 },
17445 {}
17446 );
17447 },
17448 [idsAndTypes]
17449 );
17450 return (0, import_element59.useMemo)(
17451 () => patterns?.map((record) => ({
17452 ...record,
17453 permissions: permissions?.[record.id] ?? {}
17454 })) ?? [],
17455 [patterns, permissions]
17456 );
17457 }
17458 var usePatterns = (postType, categoryId, { search = "", syncStatus } = {}) => {
17459 return (0, import_data9.useSelect)(
17460 (select2) => {
17461 if (postType === PATTERN_TYPES.user) {
17462 const result = selectUserPatterns(select2, syncStatus, search);
17463 let { patterns } = result;
17464 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) {
17465 patterns = patterns.filter(
17466 (pattern) => pattern.categories.includes(categoryId)
17467 );
17468 }
17469 return {
17470 patterns,
17471 isResolving: result.isResolving
17472 };
17473 } else if (postType === PATTERN_TYPES.theme) {
17474 const result = selectThemePatterns(select2);
17475 let { patterns } = result;
17476 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) {
17477 patterns = patterns.filter(
17478 (pattern) => pattern.categories.includes(categoryId)
17479 );
17480 }
17481 patterns = searchItems(patterns, search, {
17482 categoryId: categoryId || PATTERN_DEFAULT_CATEGORY,
17483 hasCategory: () => true
17484 });
17485 return {
17486 patterns,
17487 isResolving: result.isResolving
17488 };
17489 }
17490 return selectPatterns(select2, categoryId, syncStatus, search);
17491 },
17492 [categoryId, postType, search, syncStatus]
17493 );
17494 };
17495 var use_patterns_default = usePatterns;
17496
17497 // routes/pattern-list/style.scss
17498 if (typeof document !== "undefined" && true && !document.head.querySelector("style[data-wp-hash='2d52a92b3c']")) {
17499 const style = document.createElement("style");
17500 style.setAttribute("data-wp-hash", "2d52a92b3c");
17501 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)}"));
17502 document.head.appendChild(style);
17503 }
17504
17505 // routes/pattern-list/stage.tsx
17506 var { usePostActions, patternTitleField } = unlock2(import_editor.privateApis);
17507 var { Tabs } = unlock2(import_components48.privateApis);
17508 var { PATTERN_TYPES: PATTERN_TYPES2, CreatePatternModal } = unlock2(import_patterns3.privateApis);
17509 function PatternList() {
17510 const invalidate = useInvalidate();
17511 const { type = "all" } = useParams({
17512 from: "/patterns/list/$type"
17513 });
17514 const navigate = useNavigate();
17515 const searchParams = useSearch({ from: "/patterns/list/$type" });
17516 const postTypeObject = (0, import_data10.useSelect)(
17517 (select2) => select2(import_core_data3.store).getPostType("wp_block"),
17518 []
17519 );
17520 const labels = postTypeObject?.labels;
17521 const canCreateRecord = (0, import_data10.useSelect)(
17522 (select2) => select2(import_core_data3.store).canUser("create", {
17523 kind: "postType",
17524 name: "wp_block"
17525 }),
17526 []
17527 );
17528 const [showPatternModal, setShowPatternModal] = (0, import_element60.useState)(false);
17529 const handleQueryParamsChange = (0, import_element60.useCallback)(
17530 (params) => {
17531 navigate({
17532 search: {
17533 ...searchParams,
17534 ...params
17535 }
17536 });
17537 },
17538 [searchParams, navigate]
17539 );
17540 const { view, isModified, updateView, resetToDefault } = useView({
17541 kind: "postType",
17542 name: "wp_block",
17543 slug: "default-new",
17544 defaultView: DEFAULT_VIEW,
17545 queryParams: searchParams,
17546 onChangeQueryParams: handleQueryParamsChange
17547 });
17548 const onReset = () => {
17549 resetToDefault();
17550 invalidate();
17551 };
17552 const onChangeView = (newView) => {
17553 updateView(newView);
17554 if (newView.type !== view.type) {
17555 invalidate();
17556 }
17557 };
17558 const categoryFilter = (0, import_element60.useMemo)(() => {
17559 const filter = view.filters?.find((f2) => f2.field === "category");
17560 return filter?.value || "all-patterns";
17561 }, [view.filters]);
17562 const syncStatusFilter = (0, import_element60.useMemo)(() => {
17563 const filter = view.filters?.find((f2) => f2.field === "sync-status");
17564 return filter?.value;
17565 }, [view.filters]);
17566 const patternType = (0, import_element60.useMemo)(() => {
17567 if (type === "my-patterns") {
17568 return PATTERN_TYPES2.user;
17569 } else if (type === "registered") {
17570 return PATTERN_TYPES2.theme;
17571 }
17572 return null;
17573 }, [type]);
17574 const { patterns, isResolving } = use_patterns_default(
17575 patternType,
17576 categoryFilter,
17577 {
17578 search: view.search,
17579 syncStatus: syncStatusFilter
17580 }
17581 );
17582 const patternsWithPermissions = useAugmentPatternsWithPermissions(patterns);
17583 const patternCategoryField = usePatternCategoryField();
17584 const fields = (0, import_element60.useMemo)(() => {
17585 const patternFields = [
17586 previewField,
17587 patternTitleField,
17588 patternCategoryField
17589 ];
17590 if (type === "my-patterns" || type === "all") {
17591 patternFields.push(patternStatusField);
17592 }
17593 return patternFields;
17594 }, [type, patternCategoryField]);
17595 const { data: posts, paginationInfo } = (0, import_element60.useMemo)(() => {
17596 const viewWithoutFilters = { ...view };
17597 delete viewWithoutFilters.search;
17598 viewWithoutFilters.filters = [];
17599 return filterSortAndPaginate(
17600 patternsWithPermissions,
17601 viewWithoutFilters,
17602 fields
17603 );
17604 }, [patternsWithPermissions, view, fields]);
17605 const { totalItems, totalPages } = paginationInfo;
17606 const cleanupDeletedPostIdsFromUrl = (0, import_element60.useCallback)(
17607 (deletedItems) => {
17608 const deletedIds = deletedItems.map((item) => item.id);
17609 const currentPostIds = searchParams.postIds || [];
17610 const remainingPostIds = currentPostIds.filter(
17611 (id) => !deletedIds.includes(id)
17612 );
17613 if (remainingPostIds.length !== currentPostIds.length) {
17614 navigate({
17615 search: {
17616 ...searchParams,
17617 postIds: remainingPostIds.length > 0 ? remainingPostIds : void 0
17618 }
17619 });
17620 } else {
17621 invalidate();
17622 }
17623 },
17624 [invalidate, searchParams, navigate]
17625 );
17626 const postTypeActions = usePostActions({
17627 postType: "wp_block",
17628 context: "list",
17629 onActionPerformed: (actionId, items) => {
17630 if (actionId === "move-to-trash" || actionId === "permanently-delete") {
17631 cleanupDeletedPostIdsFromUrl(items);
17632 }
17633 }
17634 });
17635 const actions = (0, import_element60.useMemo)(() => {
17636 return [
17637 ...postTypeActions?.flatMap((action) => {
17638 if (action.id === "view-post-revisions") {
17639 return [];
17640 }
17641 return [action];
17642 })
17643 ];
17644 }, [postTypeActions]);
17645 const handleTabChange = (0, import_element60.useCallback)(
17646 (typeSlug) => {
17647 navigate({
17648 to: `/patterns/list/${typeSlug}`
17649 });
17650 },
17651 [navigate]
17652 );
17653 if (!postTypeObject) {
17654 return null;
17655 }
17656 const selection = searchParams.postIds ?? [];
17657 if (view.type === "list" && selection.length === 0 && posts?.length > 0) {
17658 selection.push(posts[0].id);
17659 }
17660 if (view.type === "list") {
17661 selection.splice(1);
17662 }
17663 return /* @__PURE__ */ React.createElement(
17664 page_default,
17665 {
17666 title: (0, import_i18n48.__)("Patterns"),
17667 subTitle: (0, import_i18n48.__)(
17668 "Reusable design elements for your site. Create once, use everywhere."
17669 ),
17670 className: "pattern-page",
17671 actions: labels?.add_new_item && canCreateRecord && /* @__PURE__ */ React.createElement(
17672 import_components48.Button,
17673 {
17674 variant: "primary",
17675 onClick: () => setShowPatternModal(true),
17676 size: "compact"
17677 },
17678 labels.add_new_item
17679 ),
17680 hasPadding: false
17681 },
17682 DEFAULT_VIEWS.length > 1 && /* @__PURE__ */ React.createElement("div", { className: "routes-pattern-list__tabs-wrapper" }, /* @__PURE__ */ React.createElement(
17683 Tabs,
17684 {
17685 onSelect: handleTabChange,
17686 selectedTabId: type ?? "all"
17687 },
17688 /* @__PURE__ */ React.createElement(Tabs.TabList, null, DEFAULT_VIEWS.map(
17689 (filter) => /* @__PURE__ */ React.createElement(
17690 Tabs.Tab,
17691 {
17692 tabId: filter.slug,
17693 key: filter.slug
17694 },
17695 filter.label
17696 )
17697 ))
17698 )),
17699 /* @__PURE__ */ React.createElement(
17700 dataviews_default,
17701 {
17702 data: posts,
17703 fields,
17704 view,
17705 onChangeView,
17706 actions,
17707 isLoading: isResolving,
17708 paginationInfo: {
17709 totalItems,
17710 totalPages
17711 },
17712 defaultLayouts: DEFAULT_LAYOUTS,
17713 selection,
17714 onReset: isModified ? onReset : false,
17715 onChangeSelection: (items) => {
17716 navigate({
17717 search: {
17718 ...searchParams,
17719 postIds: items.length > 0 ? items : void 0,
17720 edit: items.length === 0 ? void 0 : searchParams.edit
17721 }
17722 });
17723 },
17724 isItemClickable: (item) => item.type !== PATTERN_TYPES2.theme,
17725 renderItemLink: ({
17726 item,
17727 ...props
17728 }) => /* @__PURE__ */ React.createElement(
17729 Link,
17730 {
17731 to: `/types/wp_block/edit/${encodeURIComponent(
17732 item.id
17733 )}`,
17734 ...props,
17735 onClick: (event) => {
17736 event.stopPropagation();
17737 }
17738 }
17739 )
17740 }
17741 ),
17742 showPatternModal && /* @__PURE__ */ React.createElement(
17743 CreatePatternModal,
17744 {
17745 onClose: () => setShowPatternModal(false),
17746 onSuccess: ({
17747 pattern
17748 }) => {
17749 setShowPatternModal(false);
17750 navigate({
17751 to: `/types/wp_block/edit/${encodeURIComponent(
17752 pattern.id
17753 )}`
17754 });
17755 },
17756 content: []
17757 }
17758 )
17759 );
17760 }
17761 var stage = PatternList;
17762 export {
17763 stage
17764 };
17765 /*! Bundled license information:
17766
17767 use-sync-external-store/cjs/use-sync-external-store-shim.development.js:
17768 (**
17769 * @license React
17770 * use-sync-external-store-shim.development.js
17771 *
17772 * Copyright (c) Meta Platforms, Inc. and affiliates.
17773 *
17774 * This source code is licensed under the MIT license found in the
17775 * LICENSE file in the root directory of this source tree.
17776 *)
17777 */
17778