@micacms/editor-ui 0.6.0 → 0.7.0

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.
Files changed (87) hide show
  1. package/dist/THIRD_PARTY_NOTICES.txt +39 -39
  2. package/dist/assets/ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js +2 -0
  3. package/dist/assets/ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js.map +1 -0
  4. package/dist/assets/ChangesView-Dp79M2fs.js +7 -0
  5. package/dist/assets/ChangesView-Dp79M2fs.js.map +1 -0
  6. package/dist/assets/CollectionView-D9VSxjMl.js +2 -0
  7. package/dist/assets/CollectionView-D9VSxjMl.js.map +1 -0
  8. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js +2 -0
  9. package/dist/assets/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js.map → ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js.map} +1 -1
  10. package/dist/assets/DashboardView-BPyKR5J3.js +2 -0
  11. package/dist/assets/DashboardView-BPyKR5J3.js.map +1 -0
  12. package/dist/assets/DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js +2 -0
  13. package/dist/assets/DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js.map +1 -0
  14. package/dist/assets/EntryView-qKGxmd49.js +2 -0
  15. package/dist/assets/EntryView-qKGxmd49.js.map +1 -0
  16. package/dist/assets/{LoginView-BMcE8J5l.js → LoginView-C4FlLD5n.js} +2 -2
  17. package/dist/assets/{LoginView-BMcE8J5l.js.map → LoginView-C4FlLD5n.js.map} +1 -1
  18. package/dist/assets/MediaView-C0FP8j4J.js +2 -0
  19. package/dist/assets/MediaView-C0FP8j4J.js.map +1 -0
  20. package/dist/assets/NotFoundView-BXXcZp2U.js +2 -0
  21. package/dist/assets/{NotFoundView-BT-zH9Ky.js.map → NotFoundView-BXXcZp2U.js.map} +1 -1
  22. package/dist/assets/ObjectField-BFAmw-Bf.js +2 -0
  23. package/dist/assets/{ObjectField-BHoHeIbi.js.map → ObjectField-BFAmw-Bf.js.map} +1 -1
  24. package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js +7 -0
  25. package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js.map +1 -0
  26. package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js +7 -0
  27. package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js.map +1 -0
  28. package/dist/assets/RepeaterField-BA5zPM54.js +12 -0
  29. package/dist/assets/RepeaterField-BA5zPM54.js.map +1 -0
  30. package/dist/assets/SingletonView-rtsXuJ8F.js +2 -0
  31. package/dist/assets/SingletonView-rtsXuJ8F.js.map +1 -0
  32. package/dist/assets/{SystemView-AMhNiUgh.css → SystemView-BBJFvsrr.css} +1 -1
  33. package/dist/assets/SystemView-CBTTQvCI.js +3 -0
  34. package/dist/assets/SystemView-CBTTQvCI.js.map +1 -0
  35. package/dist/assets/arrow-right-CVMfMI8t.js +7 -0
  36. package/dist/assets/arrow-right-CVMfMI8t.js.map +1 -0
  37. package/dist/assets/arrow-up-D5CzEqmi.js +12 -0
  38. package/dist/assets/arrow-up-D5CzEqmi.js.map +1 -0
  39. package/dist/assets/chevron-down-Cn8dXqbz.js +7 -0
  40. package/dist/assets/chevron-down-Cn8dXqbz.js.map +1 -0
  41. package/dist/assets/format-CAimH9FV.js +2 -0
  42. package/dist/assets/format-CAimH9FV.js.map +1 -0
  43. package/dist/assets/index-C-WfCDd6.js +118 -0
  44. package/dist/assets/index-C-WfCDd6.js.map +1 -0
  45. package/dist/assets/index-CBGzi5Bh.css +1 -0
  46. package/dist/assets/useUnsavedChanges-CErjJu5S.js +201 -0
  47. package/dist/assets/useUnsavedChanges-CErjJu5S.js.map +1 -0
  48. package/dist/index.html +2 -2
  49. package/package.json +2 -2
  50. package/dist/assets/ChangesView-B37VddpZ.js +0 -7
  51. package/dist/assets/ChangesView-B37VddpZ.js.map +0 -1
  52. package/dist/assets/CollectionView-DMmV03BG.js +0 -2
  53. package/dist/assets/CollectionView-DMmV03BG.js.map +0 -1
  54. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js +0 -2
  55. package/dist/assets/DashboardView-CslqN0A1.js +0 -2
  56. package/dist/assets/DashboardView-CslqN0A1.js.map +0 -1
  57. package/dist/assets/EntryView-CpappvZe.js +0 -2
  58. package/dist/assets/EntryView-CpappvZe.js.map +0 -1
  59. package/dist/assets/MediaView-CN7asOkJ.js +0 -2
  60. package/dist/assets/MediaView-CN7asOkJ.js.map +0 -1
  61. package/dist/assets/NotFoundView-BT-zH9Ky.js +0 -2
  62. package/dist/assets/ObjectField-BHoHeIbi.js +0 -2
  63. package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js +0 -7
  64. package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js.map +0 -1
  65. package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js +0 -7
  66. package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js.map +0 -1
  67. package/dist/assets/RepeaterField-CgFHog9l.js +0 -12
  68. package/dist/assets/RepeaterField-CgFHog9l.js.map +0 -1
  69. package/dist/assets/SingletonView-BHtlstaz.js +0 -2
  70. package/dist/assets/SingletonView-BHtlstaz.js.map +0 -1
  71. package/dist/assets/SystemView-S-i2v0ly.js +0 -3
  72. package/dist/assets/SystemView-S-i2v0ly.js.map +0 -1
  73. package/dist/assets/arrow-right-DMhFU3-4.js +0 -7
  74. package/dist/assets/arrow-right-DMhFU3-4.js.map +0 -1
  75. package/dist/assets/arrow-up-DeNDcETx.js +0 -12
  76. package/dist/assets/arrow-up-DeNDcETx.js.map +0 -1
  77. package/dist/assets/chevron-down-D4nmRhPt.js +0 -7
  78. package/dist/assets/chevron-down-D4nmRhPt.js.map +0 -1
  79. package/dist/assets/format-CW--BYT5.js +0 -2
  80. package/dist/assets/format-CW--BYT5.js.map +0 -1
  81. package/dist/assets/index-BBFDilFH.js +0 -118
  82. package/dist/assets/index-BBFDilFH.js.map +0 -1
  83. package/dist/assets/index-BSYHt4Oa.css +0 -1
  84. package/dist/assets/useField-DcIPoU4r.js +0 -2
  85. package/dist/assets/useField-DcIPoU4r.js.map +0 -1
  86. package/dist/assets/useUnsavedChanges-C4vyxObi.js +0 -145
  87. package/dist/assets/useUnsavedChanges-C4vyxObi.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepeaterField-BA5zPM54.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/copy.mjs","../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/trash.mjs","../../src/components/fields/RepeaterField.vue"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"copy\",\n size: 24,\n node: [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n ]\n};\nconst Copy = createLucideIcon(__iconData);\n\nexport { __iconData, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"trash\",\n size: 24,\n node: [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n ],\n aliases: [\"trash-2\"]\n};\nconst Trash = createLucideIcon(__iconData);\n\nexport { __iconData, Trash as default };\n//# sourceMappingURL=trash.mjs.map\n","<script setup lang=\"ts\">\n/**\n * Repeating group of fields.\n *\n * Reordering is done with buttons rather than drag-and-drop: it works with a\n * keyboard, on a tablet, and with a screen reader, none of which are true of a\n * drag handle without a great deal more code.\n */\n\nimport { computed, ref } from \"vue\";\nimport { ArrowDown, ArrowUp, ChevronDown, Copy, Plus, Trash2 } from \"@lucide/vue\";\n\nimport { defaultValues, type RepeaterField } from \"@micacms/core\";\n\nimport FieldList from \"./FieldList.vue\";\nimport { humanise, useField, type FieldProps } from \"@/composables/useField\";\n\nconst props = defineProps<\n FieldProps & { modelValue: unknown; collection?: string; entrySlug?: string }\n>();\nconst emit = defineEmits<{ \"update:modelValue\": [Record<string, unknown>[]] }>();\n\nconst field = computed(() => props.field as RepeaterField);\nconst { label, error } = useField(props);\n\nconst collapsed = ref(new Set<number>());\n\nconst rows = computed<Record<string, unknown>[]>(() =>\n Array.isArray(props.modelValue) ? (props.modelValue as Record<string, unknown>[]) : [],\n);\n\nconst atMax = computed(() => field.value.max !== undefined && rows.value.length >= field.value.max);\nconst atMin = computed(() => field.value.min !== undefined && rows.value.length <= field.value.min);\n\n/** Row summary: the declared `itemLabel` child, else a positional fallback. */\nfunction summaryFor(row: Record<string, unknown>, index: number): string {\n const key = field.value.itemLabel;\n const value = key ? row[key] : undefined;\n if (typeof value === \"string\" && value.trim()) return value.trim();\n return `${humanise(field.value.addLabel?.replace(/^Add\\s+/i, \"\") ?? \"Item\")} ${index + 1}`;\n}\n\nfunction rowHasIssue(index: number): boolean {\n return props.issues?.some((issue) => issue.path.startsWith(`${props.path}.${index}.`)) ?? false;\n}\n\nfunction emitRows(next: Record<string, unknown>[]): void {\n emit(\"update:modelValue\", next);\n}\n\nfunction add(): void {\n // A new row starts as a complete skeleton so every input is bound.\n emitRows([...rows.value, defaultValues(field.value.fields)]);\n}\n\nfunction duplicate(index: number): void {\n const source = rows.value[index];\n if (!source) return;\n const next = [...rows.value];\n next.splice(index + 1, 0, structuredClone(source));\n emitRows(next);\n}\n\nfunction remove(index: number): void {\n emitRows(rows.value.filter((_, position) => position !== index));\n collapsed.value = new Set(\n [...collapsed.value].filter((item) => item !== index).map((item) => (item > index ? item - 1 : item)),\n );\n}\n\nfunction move(index: number, direction: -1 | 1): void {\n const target = index + direction;\n if (target < 0 || target >= rows.value.length) return;\n\n const next = [...rows.value];\n [next[index], next[target]] = [next[target]!, next[index]!];\n emitRows(next);\n}\n\nfunction updateRow(index: number, value: Record<string, unknown>): void {\n emitRows(rows.value.map((row, position) => (position === index ? value : row)));\n}\n\nfunction toggle(index: number): void {\n const next = new Set(collapsed.value);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n collapsed.value = next;\n}\n</script>\n\n<template>\n <fieldset>\n <legend class=\"field-label mb-1.5\">\n {{ label }}\n <span v-if=\"field.required\" class=\"text-danger\" aria-hidden=\"true\">*</span>\n </legend>\n\n <p v-if=\"field.description\" class=\"field-hint -mt-1 mb-2\">{{ field.description }}</p>\n\n <ol v-if=\"rows.length\" class=\"space-y-2\">\n <li v-for=\"(row, index) in rows\" :key=\"index\" class=\"card overflow-hidden\">\n <div class=\"flex items-center gap-1 bg-canvas/60 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex min-w-0 flex-1 items-center gap-2 text-left\"\n :aria-expanded=\"!collapsed.has(index)\"\n @click=\"toggle(index)\"\n >\n <ChevronDown\n :size=\"16\"\n :class=\"[\n 'h-4 w-4 shrink-0 text-muted transition',\n !collapsed.has(index) && 'rotate-180',\n ]\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate text-sm font-medium\">{{ summaryFor(row, index) }}</span>\n <span\n v-if=\"rowHasIssue(index)\"\n class=\"badge shrink-0 bg-danger-soft text-danger\"\n >\n Needs attention\n </span>\n </button>\n\n <div class=\"flex shrink-0 items-center gap-0.5\">\n <button\n type=\"button\"\n class=\"btn-ghost px-1.5 py-1\"\n :disabled=\"disabled || index === 0\"\n @click=\"move(index, -1)\"\n >\n <ArrowUp :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Move \"{{ summaryFor(row, index) }}\" up</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-ghost px-1.5 py-1\"\n :disabled=\"disabled || index === rows.length - 1\"\n @click=\"move(index, 1)\"\n >\n <ArrowDown :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Move \"{{ summaryFor(row, index) }}\" down</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-ghost px-1.5 py-1\"\n :disabled=\"disabled || atMax\"\n @click=\"duplicate(index)\"\n >\n <Copy :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Duplicate \"{{ summaryFor(row, index) }}\"</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-ghost px-1.5 py-1 hover:text-danger\"\n :disabled=\"disabled || atMin\"\n @click=\"remove(index)\"\n >\n <Trash2 :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Remove \"{{ summaryFor(row, index) }}\"</span>\n </button>\n </div>\n </div>\n\n <div v-show=\"!collapsed.has(index)\" class=\"border-t border-line p-4\">\n <FieldList\n :fields=\"field.fields\"\n :model-value=\"row\"\n :path=\"`${path}.${index}`\"\n :issues=\"issues\"\n :disabled=\"disabled || field.readonly\"\n :collection=\"collection\"\n :entry-slug=\"entrySlug\"\n @update:model-value=\"updateRow(index, $event)\"\n />\n </div>\n </li>\n </ol>\n\n <p v-else class=\"rounded-lg border border-dashed border-line px-4 py-5 text-center text-sm text-muted\">\n Nothing added yet.\n </p>\n\n <button\n type=\"button\"\n class=\"btn-secondary mt-2\"\n :disabled=\"disabled || field.readonly || atMax\"\n @click=\"add\"\n >\n <Plus :size=\"16\" aria-hidden=\"true\" />\n {{ field.addLabel ?? \"Add item\" }}\n </button>\n\n <span v-if=\"atMax\" class=\"ml-2 text-xs text-muted\">\n Maximum of {{ field.max }} reached.\n </span>\n\n <p v-if=\"error\" class=\"field-error\">{{ error }}</p>\n </fieldset>\n</template>\n"],"names":["__iconData","Copy","createLucideIcon","Trash","props","__props","emit","__emit","field","computed","label","error","useField","collapsed","ref","rows","atMax","atMin","summaryFor","row","index","key","value","humanise","_a","rowHasIssue","issue","emitRows","next","add","defaultValues","duplicate","source","remove","_","position","item","move","direction","target","updateRow","toggle","_createElementBlock","_createElementVNode","_hoisted_1","_createTextVNode","_toDisplayString","_unref","_hoisted_2","_openBlock","_hoisted_3","_hoisted_4","_Fragment","_renderList","_hoisted_5","$event","_createVNode","ChevronDown","_normalizeClass","_hoisted_7","_hoisted_8","_hoisted_9","ArrowUp","_hoisted_11","ArrowDown","_hoisted_13","_hoisted_15","Trash2","_hoisted_17","_withDirectives","_hoisted_18","FieldList","_hoisted_19","Plus","_hoisted_21","_hoisted_22"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,2 @@
1
+ import{d as J,o as Q,q as W,c as u,i as T,w as U,a as l,t as x,F as B,b as g,s as V,k as o,B as X,f as w,r as m,n as L,A as F,m as Z,l as ee,p as te,D as K,g as n,e as z,E as se,h as ae,y as ne,G as le}from"./index-C-WfCDd6.js";import{u as oe,a as ie,b as ue,_ as re,c as de,d as ve,e as me,f as ce,w as fe,g as ge,h as G,M as pe}from"./useUnsavedChanges-CErjJu5S.js";import{_ as ye}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";import{_ as be}from"./ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js";import"./ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js";import"./format-CAimH9FV.js";import"./arrow-right-CVMfMI8t.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js";const he=["disabled"],ke={class:"mx-auto max-w-3xl px-4 py-6 sm:px-6"},xe={key:0,class:"text-sm text-muted"},we={key:1,role:"alert",class:"rounded-md border border-danger/15 bg-danger-soft p-4"},_e={class:"mt-1 text-xs text-muted"},$e={key:0,class:"mb-5 text-sm text-muted"},Ce={key:3,role:"alert",class:"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4"},Se={key:0,type:"submit",class:"sr-only"},Oe={key:1,class:"p-8 text-center text-sm text-muted"},Ne=J({__name:"SingletonView",props:{name:{}},setup(N){const i=N,R=ae();le(pe,w(()=>({path:`${i.name}/media`,isNew:!1})));const Y=ne(),_=ee(),$=te(),a=w(()=>Y.singleton(i.name)),r=m({}),C=m(null),M=m(!0),p=m(!1),c=m("none"),y=m(null),j=w(()=>{var t,e;return(((e=(t=_.status.value)==null?void 0:t.sync)==null?void 0:e.conflicts)??[]).some(s=>{var f;return((f=s.target)==null?void 0:f.kind)==="singleton"&&s.target.name===i.name})}),A=m(""),b=oe(()=>{var t;return(t=a.value)==null?void 0:t.fields},r),S=b.issues,{dirty:O,markClean:P}=ie(r),d=ue(()=>`singleton:${i.name}`,r,C,O),D=w(()=>_.edits.value.find(t=>t.key===`singleton:${i.name}`)??null),q=w(()=>O.value?{label:"Unsaved changes",tone:"border-accent bg-accent-soft text-accent"}:D.value?{label:"Saved · not published",tone:"text-warning"}:_.knowsPublished.value?{label:"Published",tone:"text-success"}:{label:"Saved",tone:"text-muted"}),h=m(null);async function k(){var t;M.value=!0,h.value=null;try{const e=await L.singletons.get(i.name);r.value=structuredClone(fe(((t=a.value)==null?void 0:t.fields)??{},e.data)),C.value=e.revision,A.value=e.path,b.reset(),c.value="none",y.value=null,P()}catch(e){h.value=e instanceof F?e.message:"Could not load these settings."}finally{M.value=!1}}Q(async()=>{if(await k(),d.check(),typeof R.query.field=="string"){const t=R.query.field;await K(),G(t)}}),W(()=>i.name,k);function H(t){const e=ge(t.target);e&&b.leave(e)}async function I(){await K(),S.value[0]&&G(S.value[0].path)}async function E(t={}){var e;if(!((e=a.value)!=null&&e.readOnly)){if(!b.checkAll()){$.error("Some fields need attention before you can save."),await I();return}p.value=!0;try{const s=t.keepMine===!0&&y.value!==null,f=await L.singletons.save(i.name,r.value,s?y.value.revision:C.value,s);C.value=f.revision,c.value="none",y.value=null,P(),d.forget(),$.success("Settings saved."),_.refresh()}catch(s){if(s instanceof F&&s.status===409){c.value="loading";try{y.value=await L.singletons.get(i.name),c.value="loaded"}catch{c.value="missing"}}else s instanceof F&&s.issues.length>0?(b.set(s.issues),$.error(s.message,`${s.issues.length} field(s) need attention.`),await I()):$.error(s instanceof F?s.message:"Could not save these settings.")}finally{p.value=!1}}}return(t,e)=>{var f;const s=Z("RouterLink");return a.value?(n(),u(B,{key:0},[T(ye,{title:a.value.label,subtitle:A.value},{default:U(()=>[!a.value.readOnly&&!h.value?(n(),u(B,{key:0},[l("span",{class:se(["badge",q.value.tone])},[e[8]||(e[8]=l("span",{class:"h-1.5 w-1.5 rounded-full bg-current","aria-hidden":"true"},null,-1)),z(" "+x(q.value.label),1)],2),l("button",{type:"button",class:"btn-primary",disabled:p.value||!o(O),onClick:e[0]||(e[0]=v=>E())},x(p.value?"Saving…":"Save changes"),9,he)],64)):g("",!0)]),_:1},8,["title","subtitle"]),l("div",ke,[M.value?(n(),u("p",xe,"Loading…")):h.value?(n(),u("div",we,[e[9]||(e[9]=l("p",{class:"text-sm font-medium text-danger"},"These settings could not be loaded",-1)),l("p",_e,x(h.value),1),l("button",{type:"button",class:"btn-secondary mt-2.5",onClick:k},"Try again")])):(n(),u(B,{key:2},[a.value.description?(n(),u("p",$e,x(a.value.description),1)):g("",!0),a.value.readOnly?(n(),V(be,{key:1,reason:a.value.readOnly},null,8,["reason"])):D.value&&!o(O)?(n(),V(re,{key:2,edit:D.value,onDiscarded:e[1]||(e[1]=v=>{o(d).forget(),k()})},null,8,["edit"])):g("",!0),j.value?(n(),u("div",Ce,[e[11]||(e[11]=l("p",{class:"text-sm font-medium text-warning"},"These settings were changed on the website while you edited",-1)),e[12]||(e[12]=l("p",{class:"mt-1 text-xs text-muted"}," Your saved version is kept. Choose which version to publish on the Publish page. ",-1)),T(s,{to:{name:"changes"},class:"btn-secondary mt-2.5 inline-flex"},{default:U(()=>[...e[10]||(e[10]=[z("Choose a version",-1)])]),_:1})])):g("",!0),c.value!=="none"?(n(),V(de,{key:4,state:c.value,theirs:((f=y.value)==null?void 0:f.data)??null,mine:r.value,fields:a.value.fields,busy:p.value,onKeep:e[2]||(e[2]=v=>E({keepMine:!0})),onTake:e[3]||(e[3]=v=>{o(d).forget(),k()})},null,8,["state","theirs","mine","fields","busy"])):g("",!0),o(d).offered.value?(n(),V(ve,{key:5,at:o(d).offered.value.at,onRestore:e[4]||(e[4]=v=>o(d).restore()),onForget:e[5]||(e[5]=v=>o(d).forget())},null,8,["at"])):g("",!0),T(me,{issues:o(S)},null,8,["issues"]),l("form",{novalidate:"",onSubmit:e[7]||(e[7]=X(v=>E(),["prevent"])),onFocusout:H},[T(ce,{modelValue:r.value,"onUpdate:modelValue":e[6]||(e[6]=v=>r.value=v),fields:a.value.fields,issues:o(S),disabled:p.value||!!a.value.readOnly},null,8,["modelValue","fields","issues","disabled"]),a.value.readOnly?g("",!0):(n(),u("button",Se,"Save"))],32)],64))])],64)):(n(),u("div",Oe,' There are no settings called "'+x(N.name)+'". ',1))}}});export{Ne as default};
2
+ //# sourceMappingURL=SingletonView-rtsXuJ8F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SingletonView-rtsXuJ8F.js","sources":["../../src/views/SingletonView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Singleton editor: the entry editor without the parts that need a slug (no\n * rename, no delete, no list). `revision` goes back with the save, so a second\n * editor cannot be overwritten in silence.\n */\n\nimport { computed, nextTick, onMounted, provide, ref, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { withDefaults as fillDefaults } from \"@micacms/core\";\n\nimport { api, ApiError, type SingletonDetail } from \"@/api\";\nimport FieldList from \"@/components/fields/FieldList.vue\";\nimport IssueSummary from \"@/components/IssueSummary.vue\";\nimport KeptChangesNotice from \"@/components/KeptChangesNotice.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport PendingNotice from \"@/components/PendingNotice.vue\";\nimport ReadOnlyNotice from \"@/components/ReadOnlyNotice.vue\";\nimport SaveConflict from \"@/components/SaveConflict.vue\";\nimport { fieldPathOf, useFormIssues } from \"@/composables/useFormIssues\";\nimport { useKeptChanges } from \"@/composables/useKeptChanges\";\nimport { useUnsavedChanges } from \"@/composables/useUnsavedChanges\";\nimport { focusField } from \"@/lib/focus\";\nimport { MEDIA_FOLDER } from \"@/lib/media-folder\";\nimport { useSchema } from \"@/stores/schema\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst props = defineProps<{ name: string }>();\nconst route = useRoute();\n\n// Settings with media keep them in their own folder, as an entry does.\nprovide(\n MEDIA_FOLDER,\n computed(() => ({ path: `${props.name}/media`, isNew: false })),\n);\n\nconst schema = useSchema();\nconst staging = useStaging();\nconst toast = useToast();\n\nconst definition = computed(() => schema.singleton(props.name));\n\nconst values = ref<Record<string, unknown>>({});\nconst revision = ref<string | null>(null);\nconst loading = ref(true);\nconst saving = ref(false);\n/** A colleague saved since this form opened: their version, for the comparison. */\nconst conflict = ref<\"none\" | \"loading\" | \"loaded\" | \"missing\">(\"none\");\nconst theirs = ref<SingletonDetail | null>(null);\n\n/**\n * These settings were changed on the website while they have a draft here:\n * Mica's own clone only.\n */\nconst websiteConflict = computed(() =>\n (staging.status.value?.sync?.conflicts ?? []).some(\n (item) => item.target?.kind === \"singleton\" && item.target.name === props.name,\n ),\n);\n\n/** Where these settings live, as the server reports it. */\nconst location = ref(\"\");\n\nconst form = useFormIssues(() => definition.value?.fields, values);\nconst issues = form.issues;\n\nconst { dirty, markClean } = useUnsavedChanges(values);\n// Kept in this tab, so that signing in again after the session ended loses nothing.\nconst kept = useKeptChanges(() => `singleton:${props.name}`, values, revision, dirty);\n\n/** These settings' saved changes that are not on the website yet. */\nconst pending = computed(() => staging.edits.value.find((edit) => edit.key === `singleton:${props.name}`) ?? null);\n\nconst state = computed(() =>\n dirty.value\n ? { label: \"Unsaved changes\", tone: \"border-accent bg-accent-soft text-accent\" }\n : pending.value\n ? { label: \"Saved · not published\", tone: \"text-warning\" }\n : staging.knowsPublished.value\n ? { label: \"Published\", tone: \"text-success\" }\n : { label: \"Saved\", tone: \"text-muted\" },\n);\n\n/** Why the settings could not be loaded. The form then stays hidden: an empty form would save over them. */\nconst loadError = ref<string | null>(null);\n\nasync function load(): Promise<void> {\n loading.value = true;\n loadError.value = null;\n try {\n const detail = await api.singletons.get(props.name);\n // Defaults fill in fields added to the model since the file was written.\n values.value = structuredClone(fillDefaults(definition.value?.fields ?? {}, detail.data));\n revision.value = detail.revision;\n location.value = detail.path;\n form.reset();\n conflict.value = \"none\";\n theirs.value = null;\n markClean();\n } catch (error) {\n loadError.value = error instanceof ApiError ? error.message : \"Could not load these settings.\";\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(async () => {\n await load();\n kept.check();\n // From a problem on the Publish page: go to its field.\n if (typeof route.query.field === \"string\") {\n const field = route.query.field;\n await nextTick();\n focusField(field);\n }\n});\nwatch(() => props.name, load);\n\n/** Checks a field when the editor leaves it. */\nfunction onLeave(event: FocusEvent): void {\n const path = fieldPathOf(event.target);\n if (path) form.leave(path);\n}\n\n/** Shows the problems and moves to the first one. */\nasync function showIssues(): Promise<void> {\n await nextTick();\n if (issues.value[0]) focusField(issues.value[0].path);\n}\n\n/** `keepMine`: save over the colleague's version that the conflict showed. */\nasync function save(options: { keepMine?: boolean } = {}): Promise<void> {\n if (definition.value?.readOnly) return;\n if (!form.checkAll()) {\n toast.error(\"Some fields need attention before you can save.\");\n await showIssues();\n return;\n }\n saving.value = true;\n\n try {\n const keepMine = options.keepMine === true && theirs.value !== null;\n const saved = await api.singletons.save(\n props.name,\n values.value,\n keepMine ? theirs.value!.revision : revision.value,\n keepMine,\n );\n revision.value = saved.revision;\n conflict.value = \"none\";\n theirs.value = null;\n markClean();\n kept.forget();\n toast.success(\"Settings saved.\");\n void staging.refresh();\n } catch (error) {\n if (error instanceof ApiError && error.status === 409) {\n conflict.value = \"loading\";\n try {\n theirs.value = await api.singletons.get(props.name);\n conflict.value = \"loaded\";\n } catch {\n conflict.value = \"missing\";\n }\n } else if (error instanceof ApiError && error.issues.length > 0) {\n form.set(error.issues);\n toast.error(error.message, `${error.issues.length} field(s) need attention.`);\n await showIssues();\n } else {\n toast.error(error instanceof ApiError ? error.message : \"Could not save these settings.\");\n }\n } finally {\n saving.value = false;\n }\n}\n</script>\n\n<template>\n <template v-if=\"definition\">\n <PageHeader :title=\"definition.label\" :subtitle=\"location\">\n <template v-if=\"!definition.readOnly && !loadError\">\n <span :class=\"['badge', state.tone]\">\n <span class=\"h-1.5 w-1.5 rounded-full bg-current\" aria-hidden=\"true\" />\n {{ state.label }}\n </span>\n <button type=\"button\" class=\"btn-primary\" :disabled=\"saving || !dirty\" @click=\"save()\">\n {{ saving ? \"Saving…\" : \"Save changes\" }}\n </button>\n </template>\n </PageHeader>\n\n <div class=\"mx-auto max-w-3xl px-4 py-6 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <div v-else-if=\"loadError\" role=\"alert\" class=\"rounded-md border border-danger/15 bg-danger-soft p-4\">\n <p class=\"text-sm font-medium text-danger\">These settings could not be loaded</p>\n <p class=\"mt-1 text-xs text-muted\">{{ loadError }}</p>\n <button type=\"button\" class=\"btn-secondary mt-2.5\" @click=\"load\">Try again</button>\n </div>\n\n <template v-else>\n <p v-if=\"definition.description\" class=\"mb-5 text-sm text-muted\">\n {{ definition.description }}\n </p>\n\n <ReadOnlyNotice v-if=\"definition.readOnly\" :reason=\"definition.readOnly\" />\n <PendingNotice v-else-if=\"pending && !dirty\" :edit=\"pending\" @discarded=\"kept.forget(); load()\" />\n\n <div\n v-if=\"websiteConflict\"\n role=\"alert\"\n class=\"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4\"\n >\n <p class=\"text-sm font-medium text-warning\">These settings were changed on the website while you edited</p>\n <p class=\"mt-1 text-xs text-muted\">\n Your saved version is kept. Choose which version to publish on the Publish page.\n </p>\n <RouterLink :to=\"{ name: 'changes' }\" class=\"btn-secondary mt-2.5 inline-flex\">Choose a version</RouterLink>\n </div>\n\n <SaveConflict\n v-if=\"conflict !== 'none'\"\n :state=\"conflict\"\n :theirs=\"theirs?.data ?? null\"\n :mine=\"values\"\n :fields=\"definition.fields\"\n :busy=\"saving\"\n @keep=\"save({ keepMine: true })\"\n @take=\"kept.forget(); load()\"\n />\n\n <KeptChangesNotice v-if=\"kept.offered.value\" :at=\"kept.offered.value.at\" @restore=\"kept.restore()\" @forget=\"kept.forget()\" />\n <IssueSummary :issues=\"issues\" />\n\n <form novalidate @submit.prevent=\"save()\" @focusout=\"onLeave\">\n <FieldList\n v-model=\"values\"\n :fields=\"definition.fields\"\n :issues=\"issues\"\n :disabled=\"saving || !!definition.readOnly\"\n />\n <button v-if=\"!definition.readOnly\" type=\"submit\" class=\"sr-only\">Save</button>\n </form>\n </template>\n </div>\n </template>\n\n <div v-else class=\"p-8 text-center text-sm text-muted\">\n There are no settings called \"{{ name }}\".\n </div>\n</template>\n"],"names":["props","__props","route","useRoute","provide","MEDIA_FOLDER","computed","schema","useSchema","staging","useStaging","toast","useToast","definition","values","ref","revision","loading","saving","conflict","theirs","websiteConflict","_b","_a","item","location","form","useFormIssues","issues","dirty","markClean","useUnsavedChanges","kept","useKeptChanges","pending","edit","state","loadError","load","detail","api","fillDefaults","error","ApiError","onMounted","field","nextTick","focusField","watch","onLeave","event","path","fieldPathOf","showIssues","save","options","keepMine","saved","_createElementBlock","_Fragment","_createVNode","PageHeader","_createElementVNode","_normalizeClass","_toDisplayString","_unref","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_hoisted_4","_cache","_hoisted_5","_hoisted_6","_createBlock","ReadOnlyNotice","PendingNotice","$event","_hoisted_7","_component_RouterLink","SaveConflict","KeptChangesNotice","IssueSummary","FieldList","_hoisted_8","_hoisted_9"],"mappings":"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"}
@@ -1 +1 @@
1
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-a209d5e3],[data-v-a209d5e3]:before,[data-v-a209d5e3]:after,[data-v-a209d5e3]::backdrop{--tw-divide-y-reverse:0;--tw-border-style:solid}}}:where(.spec[data-v-a209d5e3]>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--mica-border)}.spec[data-v-a209d5e3]{font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,calc(1.25 / .875)))}.spec>div[data-v-a209d5e3]{justify-content:space-between;align-items:baseline;gap:calc(var(--spacing,.25rem) * 6);padding-block:calc(var(--spacing,.25rem) * 1.5);display:flex}.spec dt[data-v-a209d5e3]{color:var(--mica-text-muted);flex-shrink:0}.spec dd[data-v-a209d5e3]{text-align:right;min-width:0}.mono[data-v-a209d5e3]{font-family:var(--mica-font-mono);font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)));word-break:break-all}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-9ea3ebb0],[data-v-9ea3ebb0]:before,[data-v-9ea3ebb0]:after,[data-v-9ea3ebb0]::backdrop{--tw-divide-y-reverse:0;--tw-border-style:solid}}}:where(.spec[data-v-9ea3ebb0]>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--mica-border)}.spec[data-v-9ea3ebb0]{font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,calc(1.25 / .875)))}.spec>div[data-v-9ea3ebb0]{justify-content:space-between;align-items:baseline;gap:calc(var(--spacing,.25rem) * 6);padding-block:calc(var(--spacing,.25rem) * 1.5);display:flex}.spec dt[data-v-9ea3ebb0]{color:var(--mica-text-muted);flex-shrink:0}.spec dd[data-v-9ea3ebb0]{text-align:right;min-width:0}.mono[data-v-9ea3ebb0]{font-family:var(--mica-font-mono);font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)));word-break:break-all}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
@@ -0,0 +1,3 @@
1
+ import{d as B,o as U,c as i,i as h,w as b,a as e,F as u,t as o,k as p,b as d,j as v,e as m,r as $,g as a,J as E,n as I,A as N,f as R,m as V,p as D,a7 as F}from"./index-C-WfCDd6.js";import{_ as j}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";import{a as C,b as O,f}from"./format-CAimH9FV.js";import{A as q}from"./arrow-right-CVMfMI8t.js";const H=["disabled"],z=["disabled"],W={class:"mx-auto max-w-5xl space-y-6 px-4 py-5 pb-12 sm:px-6"},G={key:0,class:"text-sm text-muted"},J={"aria-labelledby":"glance-heading"},K={class:"grid grid-cols-2 gap-3 lg:grid-cols-4"},P={class:"card p-4"},Y={class:"mt-1 text-2xl font-semibold tabular-nums"},Z={class:"mt-1 text-xs text-muted"},Q={class:"card p-4"},X={class:"mt-1 text-2xl font-semibold tabular-nums"},ee={class:"mt-1 text-xs text-muted"},te=["datetime"],se={class:"card p-4"},oe={class:"mt-1 text-2xl font-semibold tabular-nums"},ne={class:"mt-1 text-xs text-muted"},le={class:"card p-4"},ie={class:"mt-1 text-2xl font-semibold tabular-nums"},ae={class:"mt-1 text-xs text-muted"},de={key:0,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},re={class:"mt-1 text-xs text-muted"},ue={class:"card p-4","aria-labelledby":"model-heading"},me={class:"spec mt-3"},ce={class:"tabular-nums"},pe={class:"mt-2 space-y-1.5"},ye={class:"w-28 shrink-0 truncate"},he={class:"h-1.5 min-w-0 flex-1 rounded-full bg-canvas","aria-hidden":"true"},ve={class:"w-8 shrink-0 text-right text-xs tabular-nums text-muted"},xe={class:"card overflow-hidden","aria-labelledby":"collections-heading"},be={class:"overflow-x-auto"},fe={class:"w-full text-sm"},ge={class:"divide-y divide-line"},_e={class:"px-4 py-2.5"},we={class:"mono block text-muted"},ke={class:"px-4 py-2.5 text-right tabular-nums"},$e={class:"px-4 py-2.5 text-right tabular-nums"},Re={key:0,class:"block text-xs text-muted"},Ce={class:"mono hidden px-4 py-2.5 text-muted sm:table-cell"},Se={class:"hidden px-4 py-2.5 text-xs text-muted sm:table-cell"},Ae={key:1,class:"card p-4","aria-labelledby":"singletons-heading"},Le={class:"spec mt-3"},Te={class:"tabular-nums"},Me={key:2,class:"card p-4","aria-labelledby":"relations-heading"},Be={class:"mt-3 space-y-1.5 text-sm"},Ue={class:"font-medium"},Ee={class:"mono text-muted"},Ie={key:0,class:"badge bg-accent-soft text-accent"},Ne={class:"card p-4","aria-labelledby":"repository-heading"},Ve={key:0,class:"mt-3 rounded-md border border-warning/15 bg-warning-soft px-4 py-3 text-xs text-warning"},De={key:1,class:"mt-3 rounded-md border border-danger/15 bg-danger-soft px-4 py-3 text-xs text-danger"},Fe={class:"spec mt-3"},je={key:0},Oe={class:"mono"},qe={key:1},He={class:"mono"},ze={class:"mono"},We={key:2},Ge={key:0,class:"text-danger"},Je={key:3},Ke={class:"tabular-nums"},Pe={class:"tabular-nums"},Ye={class:"tabular-nums"},Ze={class:"card p-4","aria-labelledby":"deployment-heading"},Qe={key:0,class:"mt-3 rounded-md border border-warning/15 bg-warning-soft px-4 py-3 text-xs text-warning"},Xe={class:"spec mt-3"},et={class:"mono"},tt={class:"mono"},st={class:"mono"},ot={key:0},nt={class:"mono"},lt={class:"tabular-nums"},it={class:"tabular-nums"},at={class:"mono"},dt={key:1},rt={class:"mono"},ut={key:2},mt={class:"tabular-nums"},ct={key:3},pt={class:"mono"},yt=B({__name:"SystemView",setup(ht){const x=D(),s=$(null),y=$(!0);async function g(){y.value=!0;try{s.value=await I.system()}catch(n){x.error(n instanceof N?n.message:"Could not load the system information.")}finally{y.value=!1}}U(g);const _={url:"URL"};function S(n){if(_[n])return _[n];const t=n.replace(/([A-Z])/g," $1").toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)}const A=R(()=>{var n;return Math.max(1,...(((n=s.value)==null?void 0:n.schema.kinds)??[]).map(t=>t.count))}),w=R(()=>{var t,c;const n=new Map;for(const r of((t=s.value)==null?void 0:t.schema.collections)??[])n.set(`collection:${r.name}`,r.label);for(const r of((c=s.value)==null?void 0:c.schema.singletons)??[])n.set(`singleton:${r.name}`,r.label);return n});function L(n){return w.value.get(`collection:${n}`)??n}function T(){const n=s.value;return n?[`Mica ${n.cms.version} (${n.cms.environment})`,`Node ${n.cms.node} on ${n.cms.platform}, up ${C(n.cms.uptimeSeconds)}`,`Schema — ${n.schema.totals.collections} collections, ${n.schema.totals.singletons} singletons, ${n.schema.totals.total} fields`,`Repository ${n.repository.url??n.repository.origin}`+(n.repository.branch?` (branch ${n.repository.branch})`:""),`Working tree ${n.repository.owner==="managed"?"Mica's own clone":"the developer's checkout"}`+(n.repository.head?`, at ${n.repository.head.slice(0,7)}`:""),`Repository holds ${n.repository.entries} entries and ${n.repository.media.files} media files (${n.repository.media.readable})`,...n.repository.cloneBytes!==null?[`Clone ${f(n.repository.cloneBytes)} on the data volume`]:[],...n.repository.sync?[`Last sync ${n.repository.sync.lastSyncAt??"never"}`+(n.repository.sync.error?`, failing since ${n.repository.sync.error.since}: ${n.repository.sync.error.message}`:""),...n.repository.sync.restartRequired?["Restart needed: the Git attributes changed"]:[],...n.repository.sync.refused?[`Last publication refused: ${n.repository.sync.refused.reason}`]:[]]:[],`Site ${n.deployment.site}`,`Base URL ${n.deployment.baseUrl}`,`Content model ${n.deployment.schemaOrigin}`,`Content root ${n.deployment.contentRoot}`,`Authentication ${n.deployment.auth}`,`Admission ${n.deployment.admission??"none"}`].join(`
2
+ `):""}async function M(){try{await navigator.clipboard.writeText(T()),x.success("Report copied to the clipboard.")}catch{x.error("Could not copy. Select the values you need instead.")}}return(n,t)=>{var r,k;const c=V("RouterLink");return a(),i(u,null,[h(j,{title:"System",subtitle:s.value?`Mica ${s.value.cms.version} · ${s.value.cms.environment}`:null},{default:b(()=>[e("button",{type:"button",class:"btn-ghost",disabled:y.value,onClick:g},"Refresh",8,H),e("button",{type:"button",class:"btn-secondary",disabled:!s.value,onClick:M}," Copy report ",8,z)]),_:1},8,["subtitle"]),e("div",W,[y.value?(a(),i("p",G,"Loading…")):s.value?(a(),i(u,{key:1},[e("section",J,[t[4]||(t[4]=e("h2",{id:"glance-heading",class:"sr-only"},"At a glance",-1)),e("dl",K,[e("div",P,[t[0]||(t[0]=e("dt",{class:"text-sm text-muted"},"Version",-1)),e("dd",Y,o(s.value.cms.version),1),e("dd",Z,o(s.value.cms.environment),1)]),e("div",Q,[t[1]||(t[1]=e("dt",{class:"text-sm text-muted"},"Uptime",-1)),e("dd",X,o(p(C)(s.value.cms.uptimeSeconds)),1),e("dd",ee,[e("time",{datetime:s.value.cms.startedAt},o(p(O)(s.value.cms.startedAt)),9,te)])]),e("div",se,[t[2]||(t[2]=e("dt",{class:"text-sm text-muted"},"Content model",-1)),e("dd",oe,o(s.value.schema.totals.total),1),e("dd",ne," fields in "+o(s.value.schema.totals.collections)+" collections, "+o(s.value.schema.totals.singletons)+" singletons ",1)]),e("div",le,[t[3]||(t[3]=e("dt",{class:"text-sm text-muted"},"In the repository",-1)),e("dd",ie,o(s.value.repository.entries),1),e("dd",ae," entries · "+o(s.value.repository.media.files)+" media files ",1)])])]),s.value.schema.warning?(a(),i("div",de,[t[5]||(t[5]=e("p",{class:"text-sm font-medium text-warning"},"A newer content model cannot be read",-1)),e("p",re," Mica keeps using the model below until the new one is fixed. "+o(s.value.schema.warning),1)])):d("",!0),e("section",ue,[t[7]||(t[7]=e("h2",{id:"model-heading",class:"text-sm font-semibold"},"Content model",-1)),t[8]||(t[8]=e("p",{class:"mt-1 text-xs text-muted"}," The model in use, from .mica/schema.json. Mica loads a new one when that file changes. The same file describes the model to the Astro build, so the editor and the website cannot disagree about it. ",-1)),e("dl",me,[e("div",null,[t[6]||(t[6]=e("dt",null,"Required fields",-1)),e("dd",ce,o(s.value.schema.totals.required)+" of "+o(s.value.schema.totals.total),1)])]),t[9]||(t[9]=e("h3",{class:"mt-5 text-xs font-semibold uppercase tracking-wider text-muted"},"Field types",-1)),e("ul",pe,[(a(!0),i(u,null,v(s.value.schema.kinds,l=>(a(),i("li",{key:l.kind,class:"flex items-center gap-3 text-sm"},[e("span",ye,o(S(l.kind)),1),e("span",he,[e("span",{class:"block h-full rounded-full bg-accent/60",style:E({width:`${l.count/A.value*100}%`})},null,4)]),e("span",ve,o(l.count),1)]))),128))])]),e("section",xe,[t[12]||(t[12]=e("h2",{id:"collections-heading",class:"border-b border-line px-4 py-3 text-sm font-semibold"}," Collections ",-1)),e("div",be,[e("table",fe,[t[10]||(t[10]=e("caption",{class:"sr-only"},"Collections in the content model, with their entry counts",-1)),t[11]||(t[11]=e("thead",null,[e("tr",{class:"border-b border-line text-left text-xs text-muted"},[e("th",{scope:"col",class:"px-4 py-2 font-medium"},"Collection"),e("th",{scope:"col",class:"px-4 py-2 text-right font-medium"},"Entries"),e("th",{scope:"col",class:"px-4 py-2 text-right font-medium"},"Fields"),e("th",{scope:"col",class:"hidden px-4 py-2 font-medium sm:table-cell"},"Title / slug"),e("th",{scope:"col",class:"hidden px-4 py-2 font-medium sm:table-cell"},"Ordering")])],-1)),e("tbody",ge,[(a(!0),i(u,null,v(s.value.schema.collections,l=>(a(),i("tr",{key:l.name},[e("td",_e,[h(c,{to:{name:"collection",params:{collection:l.name}},class:"font-medium hover:text-accent"},{default:b(()=>[m(o(l.label),1)]),_:2},1032,["to"]),e("span",we,o(l.name),1)]),e("td",ke,o(l.entries),1),e("td",$e,[m(o(l.fields.top)+" ",1),l.fields.total>l.fields.top?(a(),i("span",Re,o(l.fields.total)+" with nested ",1)):d("",!0)]),e("td",Ce,o(l.titleField??"—")+" / "+o(l.slugField??"—"),1),e("td",Se,o(l.sortable?"Manual":"Automatic"),1)]))),128))])])])]),s.value.schema.singletons.length?(a(),i("section",Ae,[t[13]||(t[13]=e("h2",{id:"singletons-heading",class:"text-sm font-semibold"},"Singletons",-1)),e("dl",Le,[(a(!0),i(u,null,v(s.value.schema.singletons,l=>(a(),i("div",{key:l.name},[e("dt",null,[h(c,{to:{name:"singleton",params:{name:l.name}},class:"hover:text-accent"},{default:b(()=>[m(o(l.label),1)]),_:2},1032,["to"])]),e("dd",Te,o(l.fields.top)+" field"+o(l.fields.top===1?"":"s"),1)]))),128))])])):d("",!0),s.value.schema.relations.length?(a(),i("section",Me,[t[14]||(t[14]=e("h2",{id:"relations-heading",class:"text-sm font-semibold"},"Relations",-1)),t[15]||(t[15]=e("p",{class:"mt-1 text-xs text-muted"}," Deleting an entry that is referenced here is warned about before it happens. ",-1)),e("ul",Be,[(a(!0),i(u,null,v(s.value.schema.relations,l=>(a(),i("li",{key:`${l.fromType}:${l.from}.${l.path}`,class:"flex flex-wrap items-baseline gap-x-2"},[e("span",Ue,o(w.value.get(`${l.fromType}:${l.from}`)??l.from),1),e("span",Ee,o(l.path),1),h(p(q),{size:14,class:"text-muted","aria-hidden":"true"}),e("span",null,o(L(l.to)),1),l.multiple?(a(),i("span",Ie,"many")):d("",!0)]))),128))])])):d("",!0),e("section",Ne,[t[23]||(t[23]=e("h2",{id:"repository-heading",class:"text-sm font-semibold"},"Content repository",-1)),t[24]||(t[24]=e("p",{class:"mt-1 text-xs text-muted"}," The source of truth for the website. Everything here is a file under version control, so the site can be rebuilt from it without this server. ",-1)),(r=s.value.repository.sync)!=null&&r.restartRequired?(a(),i("p",Ve," Restart needed: the Git attributes changed in the repository. Editing goes on; publishing waits for the restart. ")):d("",!0),(k=s.value.repository.sync)!=null&&k.refused?(a(),i("p",De," The repository refused the last publication: "+o(s.value.repository.sync.refused.reason),1)):d("",!0),e("dl",Fe,[s.value.repository.url?(a(),i("div",je,[t[16]||(t[16]=e("dt",null,"Remote",-1)),e("dd",Oe,o(s.value.repository.url),1)])):d("",!0),s.value.repository.branch?(a(),i("div",qe,[t[17]||(t[17]=e("dt",null,"Branch",-1)),e("dd",He,[m(o(s.value.repository.branch),1),s.value.repository.head?(a(),i(u,{key:0},[m(" at "+o(s.value.repository.head.slice(0,7)),1)],64)):d("",!0)])])):d("",!0),e("div",null,[t[18]||(t[18]=e("dt",null,"Working tree",-1)),e("dd",ze,o(s.value.repository.origin),1)]),s.value.repository.sync?(a(),i("div",We,[t[19]||(t[19]=e("dt",null,"Last sync",-1)),e("dd",null,[m(o(s.value.repository.sync.lastSyncAt?new Date(s.value.repository.sync.lastSyncAt).toLocaleString():"not yet")+" ",1),s.value.repository.sync.error?(a(),i("span",Ge," — failing since "+o(new Date(s.value.repository.sync.error.since).toLocaleString())+": "+o(s.value.repository.sync.error.message),1)):d("",!0)])])):d("",!0),s.value.repository.cloneBytes!==null?(a(),i("div",Je,[t[20]||(t[20]=e("dt",null,"Clone size",-1)),e("dd",Ke,o(p(f)(s.value.repository.cloneBytes)),1)])):d("",!0),e("div",null,[t[21]||(t[21]=e("dt",null,"Entries",-1)),e("dd",Pe,o(s.value.repository.entries),1)]),e("div",null,[t[22]||(t[22]=e("dt",null,"Media",-1)),e("dd",Ye,o(s.value.repository.media.files)+" files · "+o(s.value.repository.media.readable),1)])])]),e("section",Ze,[t[38]||(t[38]=e("h2",{id:"deployment-heading",class:"text-sm font-semibold"},"Deployment",-1)),t[39]||(t[39]=e("p",{class:"mt-1 text-xs text-muted"}," How this Mica is configured. Secrets are never shown — only whether they are set. ",-1)),s.value.deployment.generatedSecrets.length?(a(),i("p",Qe," Running with generated development secrets ("+o(s.value.deployment.generatedSecrets.join(", "))+"). Everyone is signed out on restart — set these before this deployment is used for real. ",1)):d("",!0),e("dl",Xe,[e("div",null,[t[25]||(t[25]=e("dt",null,"Site",-1)),e("dd",et,o(s.value.deployment.site),1)]),e("div",null,[t[26]||(t[26]=e("dt",null,"Base URL",-1)),e("dd",tt,o(s.value.deployment.baseUrl),1)]),e("div",null,[t[27]||(t[27]=e("dt",null,"Content model",-1)),e("dd",st,o(s.value.deployment.schemaOrigin),1)]),s.value.deployment.contentRoot?(a(),i("div",ot,[t[28]||(t[28]=e("dt",null,"Content root",-1)),e("dd",nt,o(s.value.deployment.contentRoot),1)])):d("",!0),e("div",null,[t[29]||(t[29]=e("dt",null,"Runtime",-1)),e("dd",null,o(s.value.cms.node)+" on "+o(s.value.cms.platform),1)]),e("div",null,[t[30]||(t[30]=e("dt",null,"Memory in use",-1)),e("dd",lt,o(p(f)(s.value.deployment.memoryBytes)),1)]),e("div",null,[t[31]||(t[31]=e("dt",null,"Upload limit",-1)),e("dd",it,o(s.value.deployment.maxUploadReadable),1)]),e("div",null,[t[32]||(t[32]=e("dt",null,"Authentication",-1)),e("dd",at,o(s.value.deployment.auth),1)]),s.value.deployment.admission?(a(),i("div",dt,[t[33]||(t[33]=e("dt",null,"Who may edit",-1)),e("dd",rt,o(s.value.deployment.admission),1)])):d("",!0),s.value.deployment.sessionTtlHours!==null?(a(),i("div",ut,[t[34]||(t[34]=e("dt",null,"Session lifetime",-1)),e("dd",mt,o(s.value.deployment.sessionTtlHours)+" h, idle out after "+o(s.value.deployment.sessionIdleHours)+" h ",1)])):d("",!0),e("div",null,[t[35]||(t[35]=e("dt",null,"Trust proxy headers",-1)),e("dd",null,o(s.value.deployment.trustProxy?"Yes":"No"),1)]),s.value.deployment.adminOrigins.length?(a(),i("div",ct,[t[36]||(t[36]=e("dt",null,"Extra admin origins",-1)),e("dd",pt,o(s.value.deployment.adminOrigins.join(", ")),1)])):d("",!0),e("div",null,[t[37]||(t[37]=e("dt",null,"Log level",-1)),e("dd",null,o(s.value.deployment.logLevel),1)])])])],64)):d("",!0)])],64)}}}),gt=F(yt,[["__scopeId","data-v-9ea3ebb0"]]);export{gt as default};
3
+ //# sourceMappingURL=SystemView-CBTTQvCI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemView-CBTTQvCI.js","sources":["../../src/views/SystemView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * System information: what runs, its content model and how much content there\n * is, without shell access. Read-only except \"Copy report\", which copies the\n * page as text for a bug report.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\nimport { ArrowRight } from \"@lucide/vue\";\n\nimport { api, ApiError, type SystemInfo } from \"@/api\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { absoluteTime, formatBytes, formatDuration } from \"@/lib/format\";\nimport { useToast } from \"@/stores/toast\";\n\nconst toast = useToast();\n\nconst info = ref<SystemInfo | null>(null);\nconst loading = ref(true);\n\nasync function load(): Promise<void> {\n loading.value = true;\n try {\n info.value = await api.system();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load the system information.\");\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(load);\n\n/**\n * `richText` → \"Rich text\". Derived, so a new field kind needs no edit here;\n * only initialisms need a table.\n */\nconst INITIALISMS: Record<string, string> = { url: \"URL\" };\n\nfunction kindLabel(kind: string): string {\n if (INITIALISMS[kind]) return INITIALISMS[kind];\n const words = kind.replace(/([A-Z])/g, \" $1\").toLowerCase();\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nconst busiestKind = computed(() =>\n Math.max(1, ...(info.value?.schema.kinds ?? []).map((item) => item.count)),\n);\n\nconst labels = computed(() => {\n const map = new Map<string, string>();\n for (const item of info.value?.schema.collections ?? []) map.set(`collection:${item.name}`, item.label);\n for (const item of info.value?.schema.singletons ?? []) {\n map.set(`singleton:${item.name}`, item.label);\n }\n return map;\n});\n\nfunction collectionLabel(name: string): string {\n return labels.value.get(`collection:${name}`) ?? name;\n}\n\n/** The report a support request should carry, as plain text. */\nfunction report(): string {\n const data = info.value;\n if (!data) return \"\";\n\n const lines = [\n `Mica ${data.cms.version} (${data.cms.environment})`,\n `Node ${data.cms.node} on ${data.cms.platform}, up ${formatDuration(data.cms.uptimeSeconds)}`,\n `Schema — ${data.schema.totals.collections} collections, ` +\n `${data.schema.totals.singletons} singletons, ${data.schema.totals.total} fields`,\n `Repository ${data.repository.url ?? data.repository.origin}` +\n (data.repository.branch ? ` (branch ${data.repository.branch})` : \"\"),\n `Working tree ${data.repository.owner === \"managed\" ? \"Mica's own clone\" : \"the developer's checkout\"}` +\n (data.repository.head ? `, at ${data.repository.head.slice(0, 7)}` : \"\"),\n `Repository holds ${data.repository.entries} entries and ` +\n `${data.repository.media.files} media files (${data.repository.media.readable})`,\n ...(data.repository.cloneBytes !== null ? [`Clone ${formatBytes(data.repository.cloneBytes)} on the data volume`] : []),\n ...(data.repository.sync\n ? [\n `Last sync ${data.repository.sync.lastSyncAt ?? \"never\"}` +\n (data.repository.sync.error ? `, failing since ${data.repository.sync.error.since}: ${data.repository.sync.error.message}` : \"\"),\n ...(data.repository.sync.restartRequired ? [\"Restart needed: the Git attributes changed\"] : []),\n ...(data.repository.sync.refused ? [`Last publication refused: ${data.repository.sync.refused.reason}`] : []),\n ]\n : []),\n `Site ${data.deployment.site}`,\n `Base URL ${data.deployment.baseUrl}`,\n `Content model ${data.deployment.schemaOrigin}`,\n `Content root ${data.deployment.contentRoot}`,\n `Authentication ${data.deployment.auth}`,\n `Admission ${data.deployment.admission ?? \"none\"}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\nasync function copyReport(): Promise<void> {\n try {\n // Absent on an insecure origin, which a self-hosted CMS may well be.\n await navigator.clipboard.writeText(report());\n toast.success(\"Report copied to the clipboard.\");\n } catch {\n toast.error(\"Could not copy. Select the values you need instead.\");\n }\n}\n</script>\n\n<template>\n <PageHeader\n title=\"System\"\n :subtitle=\"info ? `Mica ${info.cms.version} · ${info.cms.environment}` : null\"\n >\n <button type=\"button\" class=\"btn-ghost\" :disabled=\"loading\" @click=\"load\">Refresh</button>\n <button type=\"button\" class=\"btn-secondary\" :disabled=\"!info\" @click=\"copyReport\">\n Copy report\n </button>\n </PageHeader>\n\n <div class=\"mx-auto max-w-5xl space-y-6 px-4 py-5 pb-12 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <template v-else-if=\"info\">\n <!-- ------------------------------------------------------ at a glance -->\n\n <section aria-labelledby=\"glance-heading\">\n <h2 id=\"glance-heading\" class=\"sr-only\">At a glance</h2>\n\n <dl class=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <div class=\"card p-4\">\n <dt class=\"text-sm text-muted\">Version</dt>\n <dd class=\"mt-1 text-2xl font-semibold tabular-nums\">{{ info.cms.version }}</dd>\n <dd class=\"mt-1 text-xs text-muted\">{{ info.cms.environment }}</dd>\n </div>\n\n <div class=\"card p-4\">\n <dt class=\"text-sm text-muted\">Uptime</dt>\n <dd class=\"mt-1 text-2xl font-semibold tabular-nums\">\n {{ formatDuration(info.cms.uptimeSeconds) }}\n </dd>\n <dd class=\"mt-1 text-xs text-muted\">\n <!-- Absolute, not relative: \"up 1 min, since 1 minute ago\" says\n the same thing twice, and the start time is the useful half. -->\n <time :datetime=\"info.cms.startedAt\">{{ absoluteTime(info.cms.startedAt) }}</time>\n </dd>\n </div>\n\n <div class=\"card p-4\">\n <dt class=\"text-sm text-muted\">Content model</dt>\n <dd class=\"mt-1 text-2xl font-semibold tabular-nums\">\n {{ info.schema.totals.total }}\n </dd>\n <dd class=\"mt-1 text-xs text-muted\">\n fields in {{ info.schema.totals.collections }} collections,\n {{ info.schema.totals.singletons }} singletons\n </dd>\n </div>\n\n <div class=\"card p-4\">\n <dt class=\"text-sm text-muted\">In the repository</dt>\n <dd class=\"mt-1 text-2xl font-semibold tabular-nums\">\n {{ info.repository.entries }}\n </dd>\n <dd class=\"mt-1 text-xs text-muted\">\n entries · {{ info.repository.media.files }} media files\n </dd>\n </div>\n </dl>\n </section>\n\n <!-- --------------------------------------------------- content model -->\n\n <div v-if=\"info.schema.warning\" role=\"alert\" class=\"rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">A newer content model cannot be read</p>\n <p class=\"mt-1 text-xs text-muted\">\n Mica keeps using the model below until the new one is fixed. {{ info.schema.warning }}\n </p>\n </div>\n\n <section class=\"card p-4\" aria-labelledby=\"model-heading\">\n <h2 id=\"model-heading\" class=\"text-sm font-semibold\">Content model</h2>\n <p class=\"mt-1 text-xs text-muted\">\n The model in use, from .mica/schema.json. Mica loads a new one when that file changes. The same file describes the model to the\n Astro build, so the editor and the website cannot disagree about it.\n </p>\n\n <dl class=\"spec mt-3\">\n <div>\n <dt>Required fields</dt>\n <dd class=\"tabular-nums\">\n {{ info.schema.totals.required }} of {{ info.schema.totals.total }}\n </dd>\n </div>\n </dl>\n\n <h3 class=\"mt-5 text-xs font-semibold uppercase tracking-wider text-muted\">Field types</h3>\n <ul class=\"mt-2 space-y-1.5\">\n <li v-for=\"item in info.schema.kinds\" :key=\"item.kind\" class=\"flex items-center gap-3 text-sm\">\n <span class=\"w-28 shrink-0 truncate\">{{ kindLabel(item.kind) }}</span>\n <span class=\"h-1.5 min-w-0 flex-1 rounded-full bg-canvas\" aria-hidden=\"true\">\n <span\n class=\"block h-full rounded-full bg-accent/60\"\n :style=\"{ width: `${(item.count / busiestKind) * 100}%` }\"\n />\n </span>\n <span class=\"w-8 shrink-0 text-right text-xs tabular-nums text-muted\">\n {{ item.count }}\n </span>\n </li>\n </ul>\n </section>\n\n <!-- ---------------------------------------------------- collections -->\n\n <section class=\"card overflow-hidden\" aria-labelledby=\"collections-heading\">\n <h2 id=\"collections-heading\" class=\"border-b border-line px-4 py-3 text-sm font-semibold\">\n Collections\n </h2>\n\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-sm\">\n <caption class=\"sr-only\">Collections in the content model, with their entry counts</caption>\n <thead>\n <tr class=\"border-b border-line text-left text-xs text-muted\">\n <th scope=\"col\" class=\"px-4 py-2 font-medium\">Collection</th>\n <th scope=\"col\" class=\"px-4 py-2 text-right font-medium\">Entries</th>\n <th scope=\"col\" class=\"px-4 py-2 text-right font-medium\">Fields</th>\n <th scope=\"col\" class=\"hidden px-4 py-2 font-medium sm:table-cell\">Title / slug</th>\n <th scope=\"col\" class=\"hidden px-4 py-2 font-medium sm:table-cell\">Ordering</th>\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-line\">\n <tr v-for=\"item in info.schema.collections\" :key=\"item.name\">\n <td class=\"px-4 py-2.5\">\n <RouterLink\n :to=\"{ name: 'collection', params: { collection: item.name } }\"\n class=\"font-medium hover:text-accent\"\n >\n {{ item.label }}\n </RouterLink>\n <span class=\"mono block text-muted\">{{ item.name }}</span>\n </td>\n\n <td class=\"px-4 py-2.5 text-right tabular-nums\">{{ item.entries }}</td>\n\n <td class=\"px-4 py-2.5 text-right tabular-nums\">\n {{ item.fields.top }}\n <span v-if=\"item.fields.total > item.fields.top\" class=\"block text-xs text-muted\">\n {{ item.fields.total }} with nested\n </span>\n </td>\n\n <td class=\"mono hidden px-4 py-2.5 text-muted sm:table-cell\">\n {{ item.titleField ?? \"—\" }} / {{ item.slugField ?? \"—\" }}\n </td>\n\n <td class=\"hidden px-4 py-2.5 text-xs text-muted sm:table-cell\">\n {{ item.sortable ? \"Manual\" : \"Automatic\" }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </section>\n\n <!-- ----------------------------------------------------- singletons -->\n\n <section\n v-if=\"info.schema.singletons.length\"\n class=\"card p-4\"\n aria-labelledby=\"singletons-heading\"\n >\n <h2 id=\"singletons-heading\" class=\"text-sm font-semibold\">Singletons</h2>\n\n <dl class=\"spec mt-3\">\n <div v-for=\"item in info.schema.singletons\" :key=\"item.name\">\n <dt>\n <RouterLink\n :to=\"{ name: 'singleton', params: { name: item.name } }\"\n class=\"hover:text-accent\"\n >\n {{ item.label }}\n </RouterLink>\n </dt>\n <dd class=\"tabular-nums\">\n {{ item.fields.top }} field{{ item.fields.top === 1 ? \"\" : \"s\" }}\n </dd>\n </div>\n </dl>\n </section>\n\n <!-- ------------------------------------------------------ relations -->\n\n <section v-if=\"info.schema.relations.length\" class=\"card p-4\" aria-labelledby=\"relations-heading\">\n <h2 id=\"relations-heading\" class=\"text-sm font-semibold\">Relations</h2>\n <p class=\"mt-1 text-xs text-muted\">\n Deleting an entry that is referenced here is warned about before it happens.\n </p>\n\n <ul class=\"mt-3 space-y-1.5 text-sm\">\n <li\n v-for=\"edge in info.schema.relations\"\n :key=\"`${edge.fromType}:${edge.from}.${edge.path}`\"\n class=\"flex flex-wrap items-baseline gap-x-2\"\n >\n <span class=\"font-medium\">\n {{ labels.get(`${edge.fromType}:${edge.from}`) ?? edge.from }}\n </span>\n <span class=\"mono text-muted\">{{ edge.path }}</span>\n <ArrowRight :size=\"14\" class=\"text-muted\" aria-hidden=\"true\" />\n <span>{{ collectionLabel(edge.to) }}</span>\n <span v-if=\"edge.multiple\" class=\"badge bg-accent-soft text-accent\">many</span>\n </li>\n </ul>\n </section>\n\n <!-- ----------------------------------------------------- repository -->\n\n <section class=\"card p-4\" aria-labelledby=\"repository-heading\">\n <h2 id=\"repository-heading\" class=\"text-sm font-semibold\">Content repository</h2>\n <p class=\"mt-1 text-xs text-muted\">\n The source of truth for the website. Everything here is a file under version control, so\n the site can be rebuilt from it without this server.\n </p>\n\n <p\n v-if=\"info.repository.sync?.restartRequired\"\n class=\"mt-3 rounded-md border border-warning/15 bg-warning-soft px-4 py-3 text-xs text-warning\"\n >\n Restart needed: the Git attributes changed in the repository. Editing goes on; publishing\n waits for the restart.\n </p>\n <p\n v-if=\"info.repository.sync?.refused\"\n class=\"mt-3 rounded-md border border-danger/15 bg-danger-soft px-4 py-3 text-xs text-danger\"\n >\n The repository refused the last publication: {{ info.repository.sync.refused.reason }}\n </p>\n\n <dl class=\"spec mt-3\">\n <div v-if=\"info.repository.url\">\n <dt>Remote</dt>\n <dd class=\"mono\">{{ info.repository.url }}</dd>\n </div>\n <div v-if=\"info.repository.branch\">\n <dt>Branch</dt>\n <dd class=\"mono\">\n {{ info.repository.branch }}<template v-if=\"info.repository.head\"> at {{ info.repository.head.slice(0, 7) }}</template>\n </dd>\n </div>\n <div>\n <dt>Working tree</dt>\n <dd class=\"mono\">{{ info.repository.origin }}</dd>\n </div>\n <div v-if=\"info.repository.sync\">\n <dt>Last sync</dt>\n <dd>\n {{ info.repository.sync.lastSyncAt ? new Date(info.repository.sync.lastSyncAt).toLocaleString() : \"not yet\" }}\n <span v-if=\"info.repository.sync.error\" class=\"text-danger\">\n — failing since {{ new Date(info.repository.sync.error.since).toLocaleString() }}:\n {{ info.repository.sync.error.message }}\n </span>\n </dd>\n </div>\n <div v-if=\"info.repository.cloneBytes !== null\">\n <dt>Clone size</dt>\n <dd class=\"tabular-nums\">{{ formatBytes(info.repository.cloneBytes) }}</dd>\n </div>\n <div>\n <dt>Entries</dt>\n <dd class=\"tabular-nums\">{{ info.repository.entries }}</dd>\n </div>\n <div>\n <dt>Media</dt>\n <dd class=\"tabular-nums\">\n {{ info.repository.media.files }} files · {{ info.repository.media.readable }}\n </dd>\n </div>\n </dl>\n </section>\n\n <!-- ----------------------------------------------------- deployment -->\n\n <section class=\"card p-4\" aria-labelledby=\"deployment-heading\">\n <h2 id=\"deployment-heading\" class=\"text-sm font-semibold\">Deployment</h2>\n <p class=\"mt-1 text-xs text-muted\">\n How this Mica is configured. Secrets are never shown — only whether they are set.\n </p>\n\n <p\n v-if=\"info.deployment.generatedSecrets.length\"\n class=\"mt-3 rounded-md border border-warning/15 bg-warning-soft px-4 py-3 text-xs text-warning\"\n >\n Running with generated development secrets\n ({{ info.deployment.generatedSecrets.join(\", \") }}). Everyone is signed out on restart —\n set these before this deployment is used for real.\n </p>\n\n <dl class=\"spec mt-3\">\n <div>\n <dt>Site</dt>\n <dd class=\"mono\">{{ info.deployment.site }}</dd>\n </div>\n <div>\n <dt>Base URL</dt>\n <dd class=\"mono\">{{ info.deployment.baseUrl }}</dd>\n </div>\n <div>\n <dt>Content model</dt>\n <dd class=\"mono\">{{ info.deployment.schemaOrigin }}</dd>\n </div>\n <div v-if=\"info.deployment.contentRoot\">\n <dt>Content root</dt>\n <dd class=\"mono\">{{ info.deployment.contentRoot }}</dd>\n </div>\n <div>\n <dt>Runtime</dt>\n <dd>{{ info.cms.node }} on {{ info.cms.platform }}</dd>\n </div>\n <div>\n <dt>Memory in use</dt>\n <dd class=\"tabular-nums\">{{ formatBytes(info.deployment.memoryBytes) }}</dd>\n </div>\n <div>\n <dt>Upload limit</dt>\n <dd class=\"tabular-nums\">{{ info.deployment.maxUploadReadable }}</dd>\n </div>\n <div>\n <dt>Authentication</dt>\n <dd class=\"mono\">{{ info.deployment.auth }}</dd>\n </div>\n <div v-if=\"info.deployment.admission\">\n <dt>Who may edit</dt>\n <dd class=\"mono\">{{ info.deployment.admission }}</dd>\n </div>\n <div v-if=\"info.deployment.sessionTtlHours !== null\">\n <dt>Session lifetime</dt>\n <dd class=\"tabular-nums\">\n {{ info.deployment.sessionTtlHours }} h, idle out after\n {{ info.deployment.sessionIdleHours }} h\n </dd>\n </div>\n <div>\n <dt>Trust proxy headers</dt>\n <dd>{{ info.deployment.trustProxy ? \"Yes\" : \"No\" }}</dd>\n </div>\n <div v-if=\"info.deployment.adminOrigins.length\">\n <dt>Extra admin origins</dt>\n <dd class=\"mono\">{{ info.deployment.adminOrigins.join(\", \") }}</dd>\n </div>\n <div>\n <dt>Log level</dt>\n <dd>{{ info.deployment.logLevel }}</dd>\n </div>\n </dl>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\n@reference \"../style.css\";\n\n/* Term/value rows: the page is mostly these, so they are worth a class. */\n.spec {\n @apply divide-y divide-line text-sm;\n}\n\n.spec > div {\n @apply flex items-baseline justify-between gap-6 py-1.5;\n}\n\n.spec dt {\n @apply shrink-0 text-muted;\n}\n\n.spec dd {\n @apply min-w-0 text-right;\n}\n\n.mono {\n @apply font-mono text-xs break-all;\n}\n</style>\n"],"names":["toast","useToast","info","ref","loading","load","api","error","ApiError","onMounted","INITIALISMS","kindLabel","kind","words","busiestKind","computed","_a","item","labels","map","_b","collectionLabel","name","report","data","formatDuration","formatBytes","copyReport","_createVNode","PageHeader","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_createElementBlock","_hoisted_4","_Fragment","_hoisted_5","_hoisted_6","_hoisted_7","_cache","_hoisted_8","_toDisplayString","_hoisted_9","_hoisted_10","_hoisted_11","_unref","_hoisted_12","absoluteTime","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_openBlock","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_normalizeStyle","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_component_RouterLink","_createTextVNode","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","edge","_hoisted_45","_hoisted_46","ArrowRight","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import{H as a}from"./index-C-WfCDd6.js";/**
2
+ * @license @lucide/vue v1.55.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const o={name:"arrow-right",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]},e=a(o);export{e as A};
7
+ //# sourceMappingURL=arrow-right-CVMfMI8t.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-right-CVMfMI8t.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-right.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"arrow-right\",\n size: 24,\n node: [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n ]\n};\nconst ArrowRight = createLucideIcon(__iconData);\n\nexport { __iconData, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n"],"names":["__iconData","ArrowRight","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,KAAM,cACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAClD,CACA,EACMC,EAAaC,EAAiBF,CAAU","x_google_ignoreList":[0]}
@@ -0,0 +1,12 @@
1
+ import{H as a}from"./index-C-WfCDd6.js";/**
2
+ * @license @lucide/vue v1.55.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const o={name:"arrow-down",size:24,node:[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]},r=a(o);/**
7
+ * @license @lucide/vue v1.55.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const e={name:"arrow-up",size:24,node:[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]},t=a(e);export{t as A,r as a};
12
+ //# sourceMappingURL=arrow-up-D5CzEqmi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-up-D5CzEqmi.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-down.mjs","../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-up.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"arrow-down\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }],\n [\"path\", { d: \"m19 12-7 7-7-7\", key: \"1idqje\" }]\n ]\n};\nconst ArrowDown = createLucideIcon(__iconData);\n\nexport { __iconData, ArrowDown as default };\n//# sourceMappingURL=arrow-down.mjs.map\n","/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"arrow-up\",\n size: 24,\n node: [\n [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n ]\n};\nconst ArrowUp = createLucideIcon(__iconData);\n\nexport { __iconData, ArrowUp as default };\n//# sourceMappingURL=arrow-up.mjs.map\n"],"names":["__iconData","ArrowDown","createLucideIcon","ArrowUp"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,KAAM,aACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACnD,CACA,EACMC,EAAYC,EAAiBF,CAAU,ECjB7C;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,KAAM,WACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC7C,CACA,EACMG,EAAUD,EAAiBF,CAAU","x_google_ignoreList":[0,1]}
@@ -0,0 +1,7 @@
1
+ import{H as o}from"./index-C-WfCDd6.js";/**
2
+ * @license @lucide/vue v1.55.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const n={name:"chevron-down",size:24,node:[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]},a=o(n);export{a as C};
7
+ //# sourceMappingURL=chevron-down-Cn8dXqbz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chevron-down-Cn8dXqbz.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/chevron-down.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-down\",\n size: 24,\n node: [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]]\n};\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n"],"names":["__iconData","ChevronDown","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,KAAM,eACN,KAAM,GACN,KAAM,CAAC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,SAAU,CAAC,CACvD,EACMC,EAAcC,EAAiBF,CAAU","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ const u=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"}),c=[["year",365*24*36e5],["month",720*36e5],["week",168*36e5],["day",24*36e5],["hour",36e5],["minute",6e4]];function f(t){const r=Date.parse(t);if(Number.isNaN(r))return"";const n=r-Date.now(),o=Math.abs(n);if(o<45e3)return"just now";for(const[i,e]of c)if(o>=e)return u.format(Math.round(n/e),i);return u.format(Math.round(n/6e4),"minute")}function h(t){const r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}`}function y(t,r){const n=t.trim(),o=r.trim();if(n===""&&o==="")return null;const i=m=>m===""?null:Number(m),e={lat:i(n),lng:i(o)};if(!(Number.isNaN(e.lat)||Number.isNaN(e.lng)))return e}function N(t){const r=Date.parse(t);return Number.isNaN(r)?"":new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(r)}function $(t){if(t<1024)return`${t} B`;const r=["KB","MB","GB"];let n=t/1024,o=0;for(;n>=1024&&o<r.length-1;)n/=1024,o++;return`${n.toFixed(n<10?1:0)} ${r[o]}`}function b(t){if(t<60)return`${Math.max(0,Math.floor(t))} s`;const r=Math.floor(t/60);if(r<60)return`${r} min`;const n=Math.floor(r/60);return n<24?`${n} h ${r%60} min`:`${Math.floor(n/24)} d ${n%24} h`}function p(t,r){if(t==null||t==="")return"—";if((r==null?void 0:r.kind)==="date"&&typeof t=="string"){const n=r.includeTime?new Date(t):new Date(`${t}T00:00:00`);return Number.isNaN(n.getTime())?t:new Intl.DateTimeFormat(void 0,r.includeTime?{dateStyle:"medium",timeStyle:"short"}:{dateStyle:"medium"}).format(n)}if((r==null?void 0:r.kind)==="select"){const n=o=>{var i;return((i=r.options.find(e=>e.value===o))==null?void 0:i.label)??String(o)};return a(Array.isArray(t)?t.map(n).join(", "):n(t))}if((r==null?void 0:r.kind)==="richText"&&typeof t=="string")return a(g(t));if((r==null?void 0:r.kind)==="coordinates"&&typeof t=="object"){const{lat:n,lng:o}=t;return typeof n=="number"&&typeof o=="number"?`${n.toFixed(4)}, ${o.toFixed(4)}`:"—"}if(typeof t=="boolean")return t?"Yes":"No";if(typeof t=="number")return String(t);if(typeof t=="object"&&!Array.isArray(t)&&typeof t.path=="string")return s(t.path);if(Array.isArray(t)){if(t.length===0)return"—";if(t.some(o=>o!==null&&typeof o=="object"&&typeof o.path!="string"))return String(t.length);const n=t.map(o=>typeof o=="string"?(r==null?void 0:r.kind)==="media"?s(o):o:p(o,(r==null?void 0:r.kind)==="media"?r:void 0));return a(n.join(", "))}return typeof t=="string"?a((r==null?void 0:r.kind)==="media"?s(t):t):"—"}function s(t){return t.split("/").pop()??t}function g(t){return t.replace(/\{%[^%]*%\}/g," ").replace(/!?\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/^\s{0,3}(?:#{1,6}|[-*+]|\d+\.|>)\s+/gm,"").replace(/[*_~`]+/g,"").replace(/\s+/g," ").trim()}function a(t){const r=t.replace(/\s+/g," ").trim();return r.length>60?`${r.slice(0,60)}…`:r||"—"}export{b as a,N as b,y as c,$ as f,h as l,p,f as r};
2
+ //# sourceMappingURL=format-CAimH9FV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-CAimH9FV.js","sources":["../../src/lib/format.ts"],"sourcesContent":["/** Display formatting shared by the views. */\n\nimport type { AnyField } from \"@micacms/core\";\n\nconst rtf = new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" });\n\nconst UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n [\"year\", 365 * 24 * 3600_000],\n [\"month\", 30 * 24 * 3600_000],\n [\"week\", 7 * 24 * 3600_000],\n [\"day\", 24 * 3600_000],\n [\"hour\", 3600_000],\n [\"minute\", 60_000],\n];\n\n/** \"3 days ago\". Falls back to an absolute date beyond a year. */\nexport function relativeTime(iso: string): string {\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) return \"\";\n\n const diff = timestamp - Date.now();\n const magnitude = Math.abs(diff);\n\n if (magnitude < 45_000) return \"just now\";\n\n for (const [unit, size] of UNITS) {\n if (magnitude >= size) return rtf.format(Math.round(diff / size), unit);\n }\n\n return rtf.format(Math.round(diff / 60_000), \"minute\");\n}\n\n/** The calendar date where the editor is, not in UTC: just after midnight in Zürich is still yesterday in UTC. */\nexport function localDate(date: Date): string {\n const pad = (value: number) => String(value).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/**\n * The value of two coordinate boxes. Both empty is null. A missing half stays\n * null, not 0, so that the form check says that it is missing. Undefined while\n * a box holds something that is not a number yet, such as \"-\".\n */\nexport function coordinatesFrom(\n latText: string,\n lngText: string,\n): { lat: number | null; lng: number | null } | null | undefined {\n const lat = latText.trim();\n const lng = lngText.trim();\n if (lat === \"\" && lng === \"\") return null;\n const part = (text: string) => (text === \"\" ? null : Number(text));\n const value = { lat: part(lat), lng: part(lng) };\n if (Number.isNaN(value.lat) || Number.isNaN(value.lng)) return undefined;\n return value;\n}\n\nexport function absoluteTime(iso: string): string {\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) return \"\";\n return new Intl.DateTimeFormat(undefined, { dateStyle: \"medium\", timeStyle: \"short\" }).format(\n timestamp,\n );\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit++;\n }\n return `${value.toFixed(value < 10 ? 1 : 0)} ${units[unit]}`;\n}\n\n/** \"3 d 4 h\", \"12 min\". Coarse on purpose: this reads as an uptime, not a timer. */\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${Math.max(0, Math.floor(seconds))} s`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes} min`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours} h ${minutes % 60} min`;\n\n return `${Math.floor(hours / 24)} d ${hours % 24} h`;\n}\n\n/** Renders a stored field value as a short string for table cells, in the field's own terms. */\nexport function previewValue(value: unknown, field?: AnyField): string {\n if (value === null || value === undefined || value === \"\") return \"—\";\n\n if (field?.kind === \"date\" && typeof value === \"string\") {\n const date = field.includeTime ? new Date(value) : new Date(`${value}T00:00:00`);\n if (Number.isNaN(date.getTime())) return value;\n return new Intl.DateTimeFormat(undefined, field.includeTime ? { dateStyle: \"medium\", timeStyle: \"short\" } : { dateStyle: \"medium\" }).format(date);\n }\n if (field?.kind === \"select\") {\n const labelOf = (option: unknown) => field.options.find((candidate) => candidate.value === option)?.label ?? String(option);\n return short(Array.isArray(value) ? value.map(labelOf).join(\", \") : labelOf(value));\n }\n if (field?.kind === \"richText\" && typeof value === \"string\") return short(markdocText(value));\n if (field?.kind === \"coordinates\" && typeof value === \"object\") {\n const { lat, lng } = value as { lat?: unknown; lng?: unknown };\n return typeof lat === \"number\" && typeof lng === \"number\" ? `${lat.toFixed(4)}, ${lng.toFixed(4)}` : \"—\";\n }\n\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"number\") return String(value);\n // `media({ alt })`: the file name says more than the alt text in a list.\n if (typeof value === \"object\" && !Array.isArray(value) && typeof (value as { path?: unknown }).path === \"string\") {\n return fileName((value as { path: string }).path);\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return \"—\";\n // Repeater rows: how many there are says more than a list of their first values.\n if (value.some((item) => item !== null && typeof item === \"object\" && typeof (item as { path?: unknown }).path !== \"string\")) {\n return String(value.length);\n }\n const parts = value.map((item) =>\n typeof item === \"string\" ? (field?.kind === \"media\" ? fileName(item) : item) : previewValue(item, field?.kind === \"media\" ? field : undefined),\n );\n return short(parts.join(\", \"));\n }\n if (typeof value === \"string\") return short(field?.kind === \"media\" ? fileName(value) : value);\n\n return \"—\";\n}\n\nfunction fileName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n}\n\n/** The words of a Markdoc text, without its marks, links and tags. */\nexport function markdocText(source: string): string {\n return source\n .replace(/\\{%[^%]*%\\}/g, \" \")\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\")\n .replace(/^\\s{0,3}(?:#{1,6}|[-*+]|\\d+\\.|>)\\s+/gm, \"\")\n .replace(/[*_~`]+/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction short(text: string): string {\n const trimmed = text.replace(/\\s+/g, \" \").trim();\n return trimmed.length > 60 ? `${trimmed.slice(0, 60)}…` : trimmed || \"—\";\n}\n"],"names":["rtf","UNITS","relativeTime","iso","timestamp","diff","magnitude","unit","size","localDate","date","pad","value","coordinatesFrom","latText","lngText","lat","lng","part","text","absoluteTime","formatBytes","bytes","units","formatDuration","seconds","minutes","hours","previewValue","field","labelOf","option","_a","candidate","short","markdocText","fileName","item","parts","path","source","trimmed"],"mappings":"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"}