@thebes/cadmea 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@ import { VISUAL_EDIT_MESSAGE, validateDocument } from "@thebes/cadmus/cms";
6
6
  import { Link, useBlocker } from "@tanstack/solid-router";
7
7
  import { createSolidTable, flexRender, getCoreRowModel } from "@tanstack/solid-table";
8
8
  //#region src/CollectionEdit.tsx
9
- var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmpl$2$3 = "<span class=\"loading loading-spinner loading-sm\"></span>", _tmpl$3$2 = [
9
+ var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmpl$2$3 = "<span class=\"loading loading-spinner loading-sm\"></span>", _tmpl$3$3 = [
10
10
  "<button type=\"button\" class=\"btn flex-1\"",
11
11
  ">",
12
12
  "</button>"
@@ -22,16 +22,17 @@ var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmp
22
22
  "<span class=\"text-base-content/60 self-center px-1 text-xs\" aria-live=\"polite\">",
23
23
  "",
24
24
  "</span>"
25
- ], _tmpl$7$1 = [
25
+ ], _tmpl$7$1 = "<div class=\"modal modal-open\" role=\"dialog\" aria-modal=\"true\"><div class=\"modal-box\"><h3 class=\"text-lg font-semibold\">Publish changes?</h3><p class=\"text-base-content/70 py-2 text-sm\">Your latest saved draft will go live on the site.</p><div class=\"modal-action\"><button type=\"button\" class=\"btn btn-ghost\">Cancel</button><button type=\"button\" class=\"btn btn-primary\">Publish</button></div></div><button type=\"button\" class=\"modal-backdrop\" aria-label=\"Cancel\"></button></div>", _tmpl$8$1 = [
26
26
  "<form class=\"flex flex-col gap-4\">",
27
27
  "",
28
28
  "<div class=\"bg-base-100 sticky bottom-0 flex gap-2 border-t py-3\">",
29
- "</div></form>"
30
- ], _tmpl$8$1 = [
29
+ "</div>",
30
+ "</form>"
31
+ ], _tmpl$9$1 = [
31
32
  "<fieldset class=\"border-base-300 rounded-box border p-4\"><legend class=\"px-2 text-sm font-semibold\">",
32
33
  "</legend>",
33
34
  "</fieldset>"
34
- ], _tmpl$9$1 = ["<div class=\"grid grid-cols-1 gap-4 md:grid-cols-2\">", "</div>"], _tmpl$0$1 = "<span class=\"text-error\"> *</span>", _tmpl$1$1 = ["<p class=\"text-base-content/60 mb-1 text-xs\">", "</p>"], _tmpl$10$1 = ["<p class=\"text-error mt-1 text-sm\" role=\"alert\">", "</p>"], _tmpl$11$1 = [
35
+ ], _tmpl$0$1 = ["<div class=\"grid grid-cols-1 gap-4 md:grid-cols-2\">", "</div>"], _tmpl$1$1 = "<span class=\"text-error\"> *</span>", _tmpl$10$1 = ["<p class=\"text-base-content/60 mb-1 text-xs\">", "</p>"], _tmpl$11$1 = ["<p class=\"text-error mt-1 text-sm\" role=\"alert\">", "</p>"], _tmpl$12$1 = [
35
36
  "<div class=\"",
36
37
  "\"><label class=\"label\"",
37
38
  ">",
@@ -40,37 +41,37 @@ var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmp
40
41
  "",
41
42
  "",
42
43
  "</div>"
43
- ], _tmpl$12$1 = [
44
+ ], _tmpl$13$1 = [
44
45
  "<input",
45
46
  " class=\"input\" type=\"text\"",
46
47
  "",
47
48
  ">"
48
- ], _tmpl$13$1 = [
49
+ ], _tmpl$14$1 = [
49
50
  "<select",
50
51
  " class=\"select\"",
51
52
  "",
52
53
  "",
53
54
  ">",
54
55
  "</select>"
55
- ], _tmpl$14$1 = [
56
+ ], _tmpl$15$1 = [
56
57
  "<option",
57
58
  ">",
58
59
  "</option>"
59
- ], _tmpl$15$1 = [
60
+ ], _tmpl$16 = [
60
61
  "<input",
61
62
  " class=\"input\" type=\"number\"",
62
63
  "",
63
64
  ">"
64
- ], _tmpl$16 = [
65
+ ], _tmpl$17 = [
65
66
  "<input",
66
67
  " class=\"input\" type=\"text\" readonly",
67
68
  ">"
68
- ], _tmpl$17 = [
69
+ ], _tmpl$18 = [
69
70
  "<input",
70
71
  " class=\"checkbox\" type=\"checkbox\"",
71
72
  "",
72
73
  ">"
73
- ], _tmpl$18 = ["<p class=\"text-sm opacity-70 break-all\">", "</p>"], _tmpl$19 = ["<p class=\"text-sm text-error\">", "</p>"], _tmpl$20 = [
74
+ ], _tmpl$19 = ["<p class=\"text-sm opacity-70 break-all\">", "</p>"], _tmpl$20 = ["<p class=\"text-sm text-error\">", "</p>"], _tmpl$21 = [
74
75
  "<div class=\"flex flex-col gap-2\">",
75
76
  "<input",
76
77
  " class=\"file-input\" type=\"file\"",
@@ -78,11 +79,11 @@ var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmp
78
79
  ">",
79
80
  "",
80
81
  "</div>"
81
- ], _tmpl$21 = ["<div class=\"mb-1 flex flex-wrap gap-1\">", "</div>"], _tmpl$22 = "<button type=\"button\" aria-label=\"Clear\" class=\"absolute top-2 right-2 cursor-pointer opacity-60\">×</button>", _tmpl$23 = [
82
+ ], _tmpl$22 = ["<div class=\"mb-1 flex flex-wrap gap-1\">", "</div>"], _tmpl$23 = "<button type=\"button\" aria-label=\"Clear\" class=\"absolute top-2 right-2 cursor-pointer opacity-60\">×</button>", _tmpl$24 = [
82
83
  "<div",
83
84
  " role=\"listbox\" class=\"bg-base-100 border-base-300 rounded-box absolute z-10 mt-1 flex max-h-56 w-full flex-col overflow-auto border p-1 shadow\">",
84
85
  "</div>"
85
- ], _tmpl$24 = [
86
+ ], _tmpl$25 = [
86
87
  "<div class=\"relative\">",
87
88
  "<input",
88
89
  " type=\"text\" role=\"combobox\"",
@@ -91,27 +92,27 @@ var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmp
91
92
  ">",
92
93
  "",
93
94
  "</div>"
94
- ], _tmpl$25 = [
95
+ ], _tmpl$26 = [
95
96
  "<span class=\"badge badge-primary gap-1\">",
96
97
  "<button type=\"button\" aria-label=\"",
97
98
  "\" class=\"cursor-pointer\">×</button></span>"
98
- ], _tmpl$26 = [
99
+ ], _tmpl$27 = [
99
100
  "<button type=\"button\" role=\"option\"",
100
101
  " class=\"",
101
102
  "\">",
102
103
  "</button>"
103
- ], _tmpl$27 = ["<div role=\"menu\" class=\"bg-base-100 border-base-300 rounded-box absolute z-10 mt-1 flex flex-col border p-1 shadow\">", "</div>"], _tmpl$28 = [
104
+ ], _tmpl$28 = ["<div role=\"menu\" class=\"bg-base-100 border-base-300 rounded-box absolute z-10 mt-1 flex flex-col border p-1 shadow\">", "</div>"], _tmpl$29 = [
104
105
  "<div class=\"relative self-start\"><button type=\"button\" class=\"btn btn-outline btn-sm\" aria-haspopup=\"menu\"",
105
106
  ">Add block</button>",
106
107
  "</div>"
107
- ], _tmpl$29 = [
108
+ ], _tmpl$30 = [
108
109
  "<div class=\"form-control md:col-span-2\"><div class=\"label font-medium\">",
109
110
  "",
110
111
  "</div>",
111
112
  "<div class=\"flex flex-col gap-3\">",
112
113
  "",
113
114
  "</div></div>"
114
- ], _tmpl$30 = ["<span class=\"text-base-content/60 truncate text-sm\">", "</span>"], _tmpl$31 = ["<div class=\"flex flex-col gap-2\">", "</div>"], _tmpl$32 = [
115
+ ], _tmpl$31 = ["<span class=\"text-base-content/60 truncate text-sm\">", "</span>"], _tmpl$32 = ["<div class=\"flex flex-col gap-2\">", "</div>"], _tmpl$33 = [
115
116
  "<div class=\"card bg-base-200 flex flex-col gap-2 p-3\"><div class=\"flex items-center gap-2\"><button type=\"button\" class=\"btn btn-ghost btn-sm gap-2\"",
116
117
  "><span aria-hidden=\"true\">",
117
118
  "</span><span class=\"font-semibold\">",
@@ -120,7 +121,7 @@ var _tmpl$$5 = ["<p class=\"text-sm text-error\" role=\"alert\">", "</p>"], _tmp
120
121
  ">↑</button><button type=\"button\" class=\"btn btn-ghost btn-xs\" aria-label=\"Move down\"",
121
122
  ">↓</button><button type=\"button\" class=\"btn btn-ghost btn-xs\" aria-label=\"Duplicate\">⧉</button><button type=\"button\" class=\"btn btn-ghost btn-xs text-error\" aria-label=\"Remove\">Remove</button></div></div>",
122
123
  "</div>"
123
- ], _tmpl$33 = ["<button type=\"button\" class=\"btn btn-outline btn-sm self-start\">Add ", "</button>"], _tmpl$34 = ["<i", " aria-hidden=\"true\"></i>"], _tmpl$35 = [
124
+ ], _tmpl$34 = ["<button type=\"button\" class=\"btn btn-outline btn-sm self-start\">Add ", "</button>"], _tmpl$35 = ["<i", " aria-hidden=\"true\"></i>"], _tmpl$36 = [
124
125
  "<button type=\"button\" role=\"menuitem\" class=\"flex items-center gap-2 rounded px-3 py-2 text-left\">",
125
126
  "",
126
127
  "</button>"
@@ -190,6 +191,7 @@ function CollectionEdit(props) {
190
191
  const fieldGroups = groupFields(editableFields(props.config));
191
192
  const versioned = () => props.config.versions?.drafts && props.draftActions;
192
193
  const [autosaveStatus, setAutosaveStatus] = createSignal("idle");
194
+ const [confirmingPublish, setConfirmingPublish] = createSignal(false);
193
195
  let autosaveTimer;
194
196
  createEffect(() => {
195
197
  const dirty = !isDefaultValue();
@@ -211,7 +213,7 @@ function CollectionEdit(props) {
211
213
  }, props.draftActions?.autosaveMs ?? 1500);
212
214
  });
213
215
  onCleanup(() => clearTimeout(autosaveTimer));
214
- return ssr(_tmpl$7$1, escape(createComponent(Show, {
216
+ return ssr(_tmpl$8$1, escape(createComponent(Show, {
215
217
  get when() {
216
218
  return props.error;
217
219
  },
@@ -235,7 +237,7 @@ function CollectionEdit(props) {
235
237
  });
236
238
  },
237
239
  get children() {
238
- return ssr(_tmpl$8$1, escape(group.name), escape(createComponent(FieldsGrid, {
240
+ return ssr(_tmpl$9$1, escape(group.name), escape(createComponent(FieldsGrid, {
239
241
  form,
240
242
  ctx,
241
243
  get fields() {
@@ -271,7 +273,7 @@ function CollectionEdit(props) {
271
273
  },
272
274
  get children() {
273
275
  return [
274
- ssr(_tmpl$3$2, ssrAttribute("disabled", props.draftActions?.saving, true), escape(createComponent(Show, {
276
+ ssr(_tmpl$3$3, ssrAttribute("disabled", props.draftActions?.saving, true), escape(createComponent(Show, {
275
277
  get when() {
276
278
  return props.draftActions?.saving;
277
279
  },
@@ -331,10 +333,17 @@ function CollectionEdit(props) {
331
333
  })
332
334
  ];
333
335
  }
336
+ })), escape(createComponent(Show, {
337
+ get when() {
338
+ return confirmingPublish();
339
+ },
340
+ get children() {
341
+ return ssr(_tmpl$7$1);
342
+ }
334
343
  })));
335
344
  }
336
345
  function FieldsGrid(props) {
337
- return ssr(_tmpl$9$1, escape(createComponent(For, {
346
+ return ssr(_tmpl$0$1, escape(createComponent(For, {
338
347
  get each() {
339
348
  return props.fields;
340
349
  },
@@ -353,26 +362,26 @@ function renderField(form, ctx, name, field, label) {
353
362
  const spanClass = field.admin?.width === "half" ? "md:col-span-1" : "md:col-span-2";
354
363
  return createComponent(form.Field, {
355
364
  name,
356
- children: (fieldApi) => ssr(_tmpl$11$1, `form-control ${escape(spanClass, true)}`, ssrAttribute("for", escape(name, true), false), escape(label), escape(createComponent(Show, {
365
+ children: (fieldApi) => ssr(_tmpl$12$1, `form-control ${escape(spanClass, true)}`, ssrAttribute("for", escape(name, true), false), escape(label), escape(createComponent(Show, {
357
366
  get when() {
358
367
  return field.required;
359
368
  },
360
369
  get children() {
361
- return ssr(_tmpl$0$1);
370
+ return ssr(_tmpl$1$1);
362
371
  }
363
372
  })), escape(createComponent(Show, {
364
373
  get when() {
365
374
  return field.admin?.description;
366
375
  },
367
376
  get children() {
368
- return ssr(_tmpl$1$1, escape(field.admin?.description));
377
+ return ssr(_tmpl$10$1, escape(field.admin?.description));
369
378
  }
370
379
  })), escape(renderControl(ctx, name, field, fieldApi)), escape(createComponent(Show, {
371
380
  get when() {
372
381
  return (fieldApi().state.meta.errors?.length ?? 0) > 0;
373
382
  },
374
383
  get children() {
375
- return ssr(_tmpl$10$1, escape(fieldApi().state.meta.errors.filter(Boolean).join(", ")));
384
+ return ssr(_tmpl$11$1, escape(fieldApi().state.meta.errors.filter(Boolean).join(", ")));
376
385
  }
377
386
  })))
378
387
  });
@@ -392,16 +401,16 @@ function renderControl(ctx, name, field, fieldApi) {
392
401
  const readOnly = field.admin?.readOnly;
393
402
  const change = (v) => fieldApi().handleChange(v);
394
403
  switch (field.type) {
395
- case "text": return ssr(_tmpl$12$1, ssrAttribute("id", escape(name, true), false), ssrAttribute("placeholder", escape(field.admin?.placeholder, true), false) + ssrAttribute("readonly", escape(readOnly, true), false) + ssrAttribute("value", escape(fieldApi().state.value ?? "", true), false), ssrAttribute("required", field.required, true));
396
- case "select": return ssr(_tmpl$13$1, ssrAttribute("id", escape(name, true), false), ssrAttribute("value", escape(fieldApi().state.value ?? "", true), false), ssrAttribute("required", field.required, true), ssrAttribute("disabled", readOnly, true), escape(createComponent(For, {
404
+ case "text": return ssr(_tmpl$13$1, ssrAttribute("id", escape(name, true), false), ssrAttribute("placeholder", escape(field.admin?.placeholder, true), false) + ssrAttribute("readonly", escape(readOnly, true), false) + ssrAttribute("value", escape(fieldApi().state.value ?? "", true), false), ssrAttribute("required", field.required, true));
405
+ case "select": return ssr(_tmpl$14$1, ssrAttribute("id", escape(name, true), false), ssrAttribute("value", escape(fieldApi().state.value ?? "", true), false), ssrAttribute("required", field.required, true), ssrAttribute("disabled", readOnly, true), escape(createComponent(For, {
397
406
  get each() {
398
407
  return field.options;
399
408
  },
400
- children: (option) => ssr(_tmpl$14$1, ssrAttribute("value", escape(option, true), false), escape(option))
409
+ children: (option) => ssr(_tmpl$15$1, ssrAttribute("value", escape(option, true), false), escape(option))
401
410
  })));
402
- case "number": return ssr(_tmpl$15$1, ssrAttribute("id", escape(name, true), false), ssrAttribute("placeholder", escape(field.admin?.placeholder, true), false) + ssrAttribute("readonly", escape(readOnly, true), false) + ssrAttribute("value", escape(fieldApi().state.value ?? "", true), false), ssrAttribute("required", field.required, true));
403
- case "date": return ssr(_tmpl$16, ssrAttribute("id", escape(name, true), false), ssrAttribute("value", escape(formatDateValue(fieldApi().state.value), true), false));
404
- case "checkbox": return ssr(_tmpl$17, ssrAttribute("id", escape(name, true), false), ssrAttribute("disabled", readOnly, true), ssrAttribute("checked", fieldApi().state.value ?? false, true));
411
+ case "number": return ssr(_tmpl$16, ssrAttribute("id", escape(name, true), false), ssrAttribute("placeholder", escape(field.admin?.placeholder, true), false) + ssrAttribute("readonly", escape(readOnly, true), false) + ssrAttribute("value", escape(fieldApi().state.value ?? "", true), false), ssrAttribute("required", field.required, true));
412
+ case "date": return ssr(_tmpl$17, ssrAttribute("id", escape(name, true), false), ssrAttribute("value", escape(formatDateValue(fieldApi().state.value), true), false));
413
+ case "checkbox": return ssr(_tmpl$18, ssrAttribute("id", escape(name, true), false), ssrAttribute("disabled", readOnly, true), ssrAttribute("checked", fieldApi().state.value ?? false, true));
405
414
  case "upload": return createComponent(UploadControl, {
406
415
  name,
407
416
  field,
@@ -440,12 +449,12 @@ function UploadControl(props) {
440
449
  const [uploading, setUploading] = createSignal(false);
441
450
  const [uploadError, setUploadError] = createSignal();
442
451
  const value = () => props.fieldApi().state.value;
443
- return ssr(_tmpl$20, escape(createComponent(Show, {
452
+ return ssr(_tmpl$21, escape(createComponent(Show, {
444
453
  get when() {
445
454
  return value();
446
455
  },
447
456
  get children() {
448
- return ssr(_tmpl$18, escape(value()));
457
+ return ssr(_tmpl$19, escape(value()));
449
458
  }
450
459
  })), ssrAttribute("id", escape(props.name, true), false), ssrAttribute("required", props.field.required && !value(), true), ssrAttribute("disabled", uploading() || props.field.admin?.readOnly, true), escape(createComponent(Show, {
451
460
  get when() {
@@ -459,7 +468,7 @@ function UploadControl(props) {
459
468
  return uploadError();
460
469
  },
461
470
  get children() {
462
- return ssr(_tmpl$19, escape(uploadError()));
471
+ return ssr(_tmpl$20, escape(uploadError()));
463
472
  }
464
473
  })));
465
474
  }
@@ -481,16 +490,16 @@ function RelationshipField(props) {
481
490
  return props.options.filter((o) => o.label.toLowerCase().includes(q) && (!isMulti() || !selectedIds().includes(o.id)));
482
491
  };
483
492
  const singleLabel = () => selectedOptions()[0]?.label ?? "";
484
- return ssr(_tmpl$24, escape(createComponent(Show, {
493
+ return ssr(_tmpl$25, escape(createComponent(Show, {
485
494
  get when() {
486
495
  return isMulti() && selectedOptions().length > 0;
487
496
  },
488
497
  get children() {
489
- return ssr(_tmpl$21, escape(createComponent(For, {
498
+ return ssr(_tmpl$22, escape(createComponent(For, {
490
499
  get each() {
491
500
  return selectedOptions();
492
501
  },
493
- children: (option) => ssr(_tmpl$25, escape(option.label), `Remove ${escape(option.label, true)}`)
502
+ children: (option) => ssr(_tmpl$26, escape(option.label), `Remove ${escape(option.label, true)}`)
494
503
  })));
495
504
  }
496
505
  })), ssrAttribute("id", escape(props.name, true), false), ssrAttribute("aria-expanded", escape(open(), true), false) + ssrAttribute("aria-controls", escape(listId, true), false), ssrAttribute("required", props.field.required && selectedIds().length === 0, true), ssrAttribute("disabled", props.field.admin?.readOnly, true) + ssrAttribute("placeholder", escape(props.field.admin?.placeholder ?? "Search…", true), false) + ssrAttribute("value", open() || isMulti() ? escape(query(), true) : escape(singleLabel(), true), false), escape(createComponent(Show, {
@@ -498,18 +507,18 @@ function RelationshipField(props) {
498
507
  return !isMulti() && value() != null && !props.field.required;
499
508
  },
500
509
  get children() {
501
- return ssr(_tmpl$22);
510
+ return ssr(_tmpl$23);
502
511
  }
503
512
  })), escape(createComponent(Show, {
504
513
  get when() {
505
514
  return open() && filtered().length > 0;
506
515
  },
507
516
  get children() {
508
- return ssr(_tmpl$23, ssrAttribute("id", escape(listId, true), false), escape(createComponent(For, {
517
+ return ssr(_tmpl$24, ssrAttribute("id", escape(listId, true), false), escape(createComponent(For, {
509
518
  get each() {
510
519
  return filtered();
511
520
  },
512
- children: (option, i) => ssr(_tmpl$26, ssrAttribute("aria-selected", escape(selectedIds().includes(option.id), true), false), `rounded px-3 py-2 text-left ${i() === active() ? "bg-base-200" : ""}`, escape(option.label))
521
+ children: (option, i) => ssr(_tmpl$27, ssrAttribute("aria-selected", escape(selectedIds().includes(option.id), true), false), `rounded px-3 py-2 text-left ${i() === active() ? "bg-base-200" : ""}`, escape(option.label))
513
522
  })));
514
523
  }
515
524
  })));
@@ -551,19 +560,19 @@ function BlockEditor(props) {
551
560
  }
552
561
  return "";
553
562
  }
554
- return ssr(_tmpl$29, escape(props.label), escape(createComponent(Show, {
563
+ return ssr(_tmpl$30, escape(props.label), escape(createComponent(Show, {
555
564
  get when() {
556
565
  return props.field.required;
557
566
  },
558
567
  get children() {
559
- return ssr(_tmpl$0$1);
568
+ return ssr(_tmpl$1$1);
560
569
  }
561
570
  })), escape(createComponent(Show, {
562
571
  get when() {
563
572
  return props.field.admin?.description;
564
573
  },
565
574
  get children() {
566
- return ssr(_tmpl$1$1, escape(props.field.admin?.description));
575
+ return ssr(_tmpl$10$1, escape(props.field.admin?.description));
567
576
  }
568
577
  })), escape(createComponent(Index, {
569
578
  get each() {
@@ -571,19 +580,19 @@ function BlockEditor(props) {
571
580
  },
572
581
  children: (item, index) => {
573
582
  const isCollapsed = () => collapsed().has(index);
574
- return ssr(_tmpl$32, ssrAttribute("aria-expanded", !isCollapsed(), false), isCollapsed() ? "▸" : "▾", escape(blockTitle(item())), escape(createComponent(Show, {
583
+ return ssr(_tmpl$33, ssrAttribute("aria-expanded", !isCollapsed(), false), isCollapsed() ? "▸" : "▾", escape(blockTitle(item())), escape(createComponent(Show, {
575
584
  get when() {
576
585
  return isCollapsed() && blockSummary(item());
577
586
  },
578
587
  get children() {
579
- return ssr(_tmpl$30, escape(blockSummary(item())));
588
+ return ssr(_tmpl$31, escape(blockSummary(item())));
580
589
  }
581
590
  })), ssrAttribute("disabled", index === 0, true), ssrAttribute("disabled", index === items().length - 1, true), escape(createComponent(Show, {
582
591
  get when() {
583
592
  return !isCollapsed();
584
593
  },
585
594
  get children() {
586
- return ssr(_tmpl$31, escape(createComponent(For, {
595
+ return ssr(_tmpl$32, escape(createComponent(For, {
587
596
  get each() {
588
597
  return fieldsForItem(props.field, item());
589
598
  },
@@ -597,22 +606,22 @@ function BlockEditor(props) {
597
606
  return disc && variants.length > 0;
598
607
  },
599
608
  get fallback() {
600
- return ssr(_tmpl$33, escape(props.label));
609
+ return ssr(_tmpl$34, escape(props.label));
601
610
  },
602
611
  get children() {
603
- return ssr(_tmpl$28, ssrAttribute("aria-expanded", escape(menuOpen(), true), false), escape(createComponent(Show, {
612
+ return ssr(_tmpl$29, ssrAttribute("aria-expanded", escape(menuOpen(), true), false), escape(createComponent(Show, {
604
613
  get when() {
605
614
  return menuOpen();
606
615
  },
607
616
  get children() {
608
- return ssr(_tmpl$27, escape(createComponent(For, {
617
+ return ssr(_tmpl$28, escape(createComponent(For, {
609
618
  each: variants,
610
- children: (variant) => ssr(_tmpl$35, escape(createComponent(Show, {
619
+ children: (variant) => ssr(_tmpl$36, escape(createComponent(Show, {
611
620
  get when() {
612
621
  return disc?.variantsAdmin?.[variant]?.icon;
613
622
  },
614
623
  get children() {
615
- return ssr(_tmpl$34, ssrAttribute("class", escape(disc?.variantsAdmin?.[variant]?.icon, true), false));
624
+ return ssr(_tmpl$35, ssrAttribute("class", escape(disc?.variantsAdmin?.[variant]?.icon, true), false));
616
625
  }
617
626
  })), escape(variantLabel(disc, variant)))
618
627
  })));
@@ -712,11 +721,11 @@ var _tmpl$$2 = ["<button type=\"button\" class=\"btn btn-error btn-outline btn-s
712
721
  "</h1>",
713
722
  "",
714
723
  "</div>"
715
- ], _tmpl$3$1 = [
724
+ ], _tmpl$3$2 = [
716
725
  "<div class=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">",
717
726
  "",
718
727
  "</div>"
719
- ], _tmpl$4$1 = ["<div class=\"lg:sticky lg:top-4 lg:h-[calc(100vh-2rem)]\">", "</div>"];
728
+ ], _tmpl$4$1 = ["<div class=\"hidden lg:sticky lg:top-4 lg:block lg:h-[calc(100vh-2rem)]\">", "</div>"];
720
729
  /**
721
730
  * Builds an edit-page component for a collection — fetch, update, and
722
731
  * delete, all wired together, plus a router-level unsaved-changes guard
@@ -854,7 +863,7 @@ function createCollectionEditPage(options) {
854
863
  return createComponent(EditorPane, {});
855
864
  },
856
865
  get children() {
857
- return ssr(_tmpl$3$1, escape(createComponent(EditorPane, {})), escape(createComponent(Show, {
866
+ return ssr(_tmpl$3$2, escape(createComponent(EditorPane, {})), escape(createComponent(Show, {
858
867
  get when() {
859
868
  return options.preview?.url();
860
869
  },
@@ -889,7 +898,7 @@ var _tmpl$$1 = ["<button type=\"button\" class=\"btn btn-outline btn-sm\">", "</
889
898
  ">",
890
899
  "</select><select aria-label=\"Sort direction\" class=\"select select-sm join-item\"",
891
900
  "><option value=\"asc\">Ascending</option><option value=\"desc\">Descending</option></select></div>"
892
- ], _tmpl$3 = [
901
+ ], _tmpl$3$1 = [
893
902
  "<table class=\"table hidden md:table\"><thead>",
894
903
  "</thead><tbody>",
895
904
  "</tbody></table>"
@@ -908,7 +917,7 @@ var _tmpl$$1 = ["<button type=\"button\" class=\"btn btn-outline btn-sm\">", "</
908
917
  "<option",
909
918
  ">",
910
919
  "</option>"
911
- ], _tmpl$8 = ["<p class=\"text-sm opacity-70\">No ", " yet.</p>"], _tmpl$9 = "<th></th>", _tmpl$0 = [
920
+ ], _tmpl$8 = ["<div class=\"border-base-300 rounded-box flex flex-col items-center gap-1 border border-dashed py-12 text-center\"><p class=\"text-base-content/70 m-0\">No ", " yet.</p></div>"], _tmpl$9 = "<th></th>", _tmpl$0 = [
912
921
  "<tr>",
913
922
  "",
914
923
  "</tr>"
@@ -983,10 +992,10 @@ function CollectionList(props) {
983
992
  return props.rows.length > 0;
984
993
  },
985
994
  get fallback() {
986
- return ssr(_tmpl$8, escape(props.config.slug));
995
+ return props.emptyState ?? ssr(_tmpl$8, escape(props.config.slug));
987
996
  },
988
997
  get children() {
989
- return [ssr(_tmpl$3, escape(createComponent(For, {
998
+ return [ssr(_tmpl$3$1, escape(createComponent(For, {
990
999
  get each() {
991
1000
  return table.getHeaderGroups();
992
1001
  },
@@ -1055,7 +1064,11 @@ var _tmpl$ = [
1055
1064
  "</h1>",
1056
1065
  "</div>",
1057
1066
  "</div>"
1058
- ], _tmpl$2 = "<div class=\"loading loading-spinner\"></div>";
1067
+ ], _tmpl$2 = "<div class=\"loading loading-spinner\"></div>", _tmpl$3 = [
1068
+ "<div class=\"border-base-300 rounded-box flex flex-col items-center gap-3 border border-dashed py-12 text-center\"><p class=\"text-base-content/70 m-0\">No ",
1069
+ " yet.</p>",
1070
+ "</div>"
1071
+ ];
1059
1072
  /**
1060
1073
  * Builds a list-view page component for a collection — paginated/sortable
1061
1074
  * query, loading state, and the generic table/card list, wired together.
@@ -1137,6 +1150,24 @@ function createCollectionListPage(options) {
1137
1150
  get rows() {
1138
1151
  return result.data?.rows ?? [];
1139
1152
  },
1153
+ get emptyState() {
1154
+ return ssr(_tmpl$3, escape(options.label ?? options.collection.slug), escape(createComponent(Show, {
1155
+ get when() {
1156
+ return options.newHref && options.capabilities?.()?.canCreate !== false;
1157
+ },
1158
+ get children() {
1159
+ return createComponent(Link, {
1160
+ get to() {
1161
+ return options.newHref;
1162
+ },
1163
+ "class": "btn btn-primary btn-sm",
1164
+ get children() {
1165
+ return options.newLabel ?? `New ${options.collection.slug}`;
1166
+ }
1167
+ });
1168
+ }
1169
+ })));
1170
+ },
1140
1171
  get onRowClick() {
1141
1172
  return options.onRowClick;
1142
1173
  },