@micacms/editor-ui 0.5.0-rc.2 → 0.6.0-rc.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.
Files changed (62) hide show
  1. package/README.md +3 -1
  2. package/dist/THIRD_PARTY_NOTICES.txt +3837 -0
  3. package/dist/assets/ChangesView-B37VddpZ.js +7 -0
  4. package/dist/assets/ChangesView-B37VddpZ.js.map +1 -0
  5. package/dist/assets/CollectionView-DMmV03BG.js +2 -0
  6. package/dist/assets/CollectionView-DMmV03BG.js.map +1 -0
  7. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js +2 -0
  8. package/dist/assets/{ConfirmDialog.vue_vue_type_script_setup_true_lang-C073kW3p.js.map → ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js.map} +1 -1
  9. package/dist/assets/{DashboardView-BpelkVGe.js → DashboardView-CslqN0A1.js} +2 -2
  10. package/dist/assets/{DashboardView-BpelkVGe.js.map → DashboardView-CslqN0A1.js.map} +1 -1
  11. package/dist/assets/EntryView-CpappvZe.js +2 -0
  12. package/dist/assets/EntryView-CpappvZe.js.map +1 -0
  13. package/dist/assets/{LoginView-BmnX2zOD.js → LoginView-BMcE8J5l.js} +2 -2
  14. package/dist/assets/{LoginView-BmnX2zOD.js.map → LoginView-BMcE8J5l.js.map} +1 -1
  15. package/dist/assets/{MediaView-Dp2botAQ.js → MediaView-CN7asOkJ.js} +2 -2
  16. package/dist/assets/{MediaView-Dp2botAQ.js.map → MediaView-CN7asOkJ.js.map} +1 -1
  17. package/dist/assets/{NotFoundView-ByEOgkxm.js → NotFoundView-BT-zH9Ky.js} +2 -2
  18. package/dist/assets/{NotFoundView-ByEOgkxm.js.map → NotFoundView-BT-zH9Ky.js.map} +1 -1
  19. package/dist/assets/ObjectField-BHoHeIbi.js +2 -0
  20. package/dist/assets/{ObjectField-BSITpnGH.js.map → ObjectField-BHoHeIbi.js.map} +1 -1
  21. package/dist/assets/{PageHeader.vue_vue_type_script_setup_true_lang-DJWhe1Ye.js → PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js} +2 -2
  22. package/dist/assets/{PageHeader.vue_vue_type_script_setup_true_lang-DJWhe1Ye.js.map → PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js.map} +1 -1
  23. package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js +7 -0
  24. package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js.map +1 -0
  25. package/dist/assets/{RepeaterField-BnXDf3wL.js → RepeaterField-CgFHog9l.js} +2 -2
  26. package/dist/assets/{RepeaterField-BnXDf3wL.js.map → RepeaterField-CgFHog9l.js.map} +1 -1
  27. package/dist/assets/SingletonView-BHtlstaz.js +2 -0
  28. package/dist/assets/SingletonView-BHtlstaz.js.map +1 -0
  29. package/dist/assets/{SystemView-C6RAZvd2.js → SystemView-S-i2v0ly.js} +2 -2
  30. package/dist/assets/{SystemView-C6RAZvd2.js.map → SystemView-S-i2v0ly.js.map} +1 -1
  31. package/dist/assets/{arrow-right-DD5BWXHV.js → arrow-right-DMhFU3-4.js} +2 -2
  32. package/dist/assets/{arrow-right-DD5BWXHV.js.map → arrow-right-DMhFU3-4.js.map} +1 -1
  33. package/dist/assets/{arrow-up-Bdxg9_RJ.js → arrow-up-DeNDcETx.js} +2 -2
  34. package/dist/assets/{arrow-up-Bdxg9_RJ.js.map → arrow-up-DeNDcETx.js.map} +1 -1
  35. package/dist/assets/{chevron-down-CcJtiSTR.js → chevron-down-D4nmRhPt.js} +2 -2
  36. package/dist/assets/{chevron-down-CcJtiSTR.js.map → chevron-down-D4nmRhPt.js.map} +1 -1
  37. package/dist/assets/format-CW--BYT5.js +2 -0
  38. package/dist/assets/{format-Cpnr2As6.js.map → format-CW--BYT5.js.map} +1 -1
  39. package/dist/assets/{index-BsOOwFCf.js → index-BBFDilFH.js} +3 -3
  40. package/dist/assets/{index-BsOOwFCf.js.map → index-BBFDilFH.js.map} +1 -1
  41. package/dist/assets/index-BSYHt4Oa.css +1 -0
  42. package/dist/assets/{useField-BxptRsz_.js → useField-DcIPoU4r.js} +2 -2
  43. package/dist/assets/{useField-BxptRsz_.js.map → useField-DcIPoU4r.js.map} +1 -1
  44. package/dist/assets/{useUnsavedChanges-FB5XcFfI.js → useUnsavedChanges-C4vyxObi.js} +48 -48
  45. package/dist/assets/useUnsavedChanges-C4vyxObi.js.map +1 -0
  46. package/dist/index.html +2 -2
  47. package/package.json +10 -3
  48. package/dist/assets/ChangesView-CSjnT0fh.js +0 -7
  49. package/dist/assets/ChangesView-CSjnT0fh.js.map +0 -1
  50. package/dist/assets/CollectionView-BlLAhVVi.js +0 -2
  51. package/dist/assets/CollectionView-BlLAhVVi.js.map +0 -1
  52. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-C073kW3p.js +0 -2
  53. package/dist/assets/EntryView-DZuhqJnd.js +0 -2
  54. package/dist/assets/EntryView-DZuhqJnd.js.map +0 -1
  55. package/dist/assets/ObjectField-BSITpnGH.js +0 -2
  56. package/dist/assets/SingletonView-Cb8Qq_gr.js +0 -2
  57. package/dist/assets/SingletonView-Cb8Qq_gr.js.map +0 -1
  58. package/dist/assets/format-Cpnr2As6.js +0 -2
  59. package/dist/assets/index-bRiiEobC.css +0 -1
  60. package/dist/assets/plus-CgaTSYYb.js +0 -7
  61. package/dist/assets/plus-CgaTSYYb.js.map +0 -1
  62. package/dist/assets/useUnsavedChanges-FB5XcFfI.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SystemView-C6RAZvd2.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 content model 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 <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 schema this server was handed at startup. 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 content model 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","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_openBlock","_hoisted_24","_hoisted_25","_normalizeStyle","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_component_RouterLink","_createTextVNode","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","edge","_hoisted_43","_hoisted_44","ArrowRight","_hoisted_45","_hoisted_46","_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"],"mappings":"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"}
1
+ {"version":3,"file":"SystemView-S-i2v0ly.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 content model 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 <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 schema this server was handed at startup. 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 content model 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","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_openBlock","_hoisted_24","_hoisted_25","_normalizeStyle","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_component_RouterLink","_createTextVNode","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","edge","_hoisted_43","_hoisted_44","ArrowRight","_hoisted_45","_hoisted_46","_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"],"mappings":"ylGAeA,MAAMA,EAAQC,EAAA,EAERC,EAAOC,EAAuB,IAAI,EAClCC,EAAUD,EAAI,EAAI,EAExB,eAAeE,GAAsB,CACnCD,EAAQ,MAAQ,GAChB,GAAI,CACFF,EAAK,MAAQ,MAAMI,EAAI,OAAA,CACzB,OAASC,EAAO,CACdP,EAAM,MAAMO,aAAiBC,EAAWD,EAAM,QAAU,wCAAwC,CAClG,QAAA,CACEH,EAAQ,MAAQ,EAClB,CACF,CAEAK,EAAUJ,CAAI,EAMd,MAAMK,EAAsC,CAAE,IAAK,KAAA,EAEnD,SAASC,EAAUC,EAAsB,CACvC,GAAIF,EAAYE,CAAI,EAAG,OAAOF,EAAYE,CAAI,EAC9C,MAAMC,EAAQD,EAAK,QAAQ,WAAY,KAAK,EAAE,YAAA,EAC9C,OAAOC,EAAM,OAAO,CAAC,EAAE,cAAgBA,EAAM,MAAM,CAAC,CACtD,CAEA,MAAMC,EAAcC,EAAS,IAAA,OAC3B,YAAK,IAAI,EAAG,MAAIC,EAAAd,EAAK,QAAL,YAAAc,EAAY,OAAO,QAAS,CAAA,GAAI,IAAKC,GAASA,EAAK,KAAK,CAAC,EAAA,EAGrEC,EAASH,EAAS,IAAM,SAC5B,MAAMI,MAAU,IAChB,UAAWF,MAAQD,EAAAd,EAAK,QAAL,YAAAc,EAAY,OAAO,cAAe,GAAIG,EAAI,IAAI,cAAcF,EAAK,IAAI,GAAIA,EAAK,KAAK,EACtG,UAAWA,MAAQG,EAAAlB,EAAK,QAAL,YAAAkB,EAAY,OAAO,aAAc,GAClDD,EAAI,IAAI,aAAaF,EAAK,IAAI,GAAIA,EAAK,KAAK,EAE9C,OAAOE,CACT,CAAC,EAED,SAASE,EAAgBC,EAAsB,CAC7C,OAAOJ,EAAO,MAAM,IAAI,cAAcI,CAAI,EAAE,GAAKA,CACnD,CAGA,SAASC,GAAiB,CACxB,MAAMC,EAAOtB,EAAK,MAClB,OAAKsB,EAES,CACZ,QAAQA,EAAK,IAAI,OAAO,KAAKA,EAAK,IAAI,WAAW,IACjD,QAAQA,EAAK,IAAI,IAAI,OAAOA,EAAK,IAAI,QAAQ,QAAQC,EAAeD,EAAK,IAAI,aAAa,CAAC,GAC3F,YAAYA,EAAK,OAAO,OAAO,WAAW,iBACrCA,EAAK,OAAO,OAAO,UAAU,gBAAgBA,EAAK,OAAO,OAAO,KAAK,UAC1E,cAAcA,EAAK,WAAW,KAAOA,EAAK,WAAW,MAAM,IACxDA,EAAK,WAAW,OAAS,YAAYA,EAAK,WAAW,MAAM,IAAM,IACpE,gBAAgBA,EAAK,WAAW,QAAU,UAAY,mBAAqB,0BAA0B,IAClGA,EAAK,WAAW,KAAO,QAAQA,EAAK,WAAW,KAAK,MAAM,EAAG,CAAC,CAAC,GAAK,IACvE,oBAAoBA,EAAK,WAAW,OAAO,gBACtCA,EAAK,WAAW,MAAM,KAAK,iBAAiBA,EAAK,WAAW,MAAM,QAAQ,IAC/E,GAAIA,EAAK,WAAW,aAAe,KAAO,CAAC,SAASE,EAAYF,EAAK,WAAW,UAAU,CAAC,qBAAqB,EAAI,CAAA,EACpH,GAAIA,EAAK,WAAW,KAChB,CACE,aAAaA,EAAK,WAAW,KAAK,YAAc,OAAO,IACpDA,EAAK,WAAW,KAAK,MAAQ,mBAAmBA,EAAK,WAAW,KAAK,MAAM,KAAK,KAAKA,EAAK,WAAW,KAAK,MAAM,OAAO,GAAK,IAC/H,GAAIA,EAAK,WAAW,KAAK,gBAAkB,CAAC,2CAA2C,EAAI,CAAA,EAC3F,GAAIA,EAAK,WAAW,KAAK,QAAU,CAAC,6BAA6BA,EAAK,WAAW,KAAK,QAAQ,MAAM,EAAE,EAAI,CAAA,CAAC,EAE7G,CAAA,EACJ,QAAQA,EAAK,WAAW,IAAI,GAC5B,YAAYA,EAAK,WAAW,OAAO,GACnC,iBAAiBA,EAAK,WAAW,YAAY,GAC7C,gBAAgBA,EAAK,WAAW,WAAW,GAC3C,kBAAkBA,EAAK,WAAW,IAAI,GACtC,aAAaA,EAAK,WAAW,WAAa,MAAM,EAAA,EAGrC,KAAK;AAAA,CAAI,EA9BJ,EA+BpB,CAEA,eAAeG,GAA4B,CACzC,GAAI,CAEF,MAAM,UAAU,UAAU,UAAUJ,EAAA,CAAQ,EAC5CvB,EAAM,QAAQ,iCAAiC,CACjD,MAAQ,CACNA,EAAM,MAAM,qDAAqD,CACnE,CACF,oEAIE4B,EAQaC,EAAA,CAPX,MAAM,SACL,SAAU3B,EAAA,MAAI,QAAWA,EAAA,MAAK,IAAI,OAAO,MAAMA,EAAA,MAAK,IAAI,WAAW,GAAA,IAAA,aAEpE,IAA0F,CAA1F4B,EAA0F,SAAA,CAAlF,KAAK,SAAS,MAAM,YAAa,SAAU1B,EAAA,MAAU,QAAOC,CAAA,EAAM,UAAO,EAAA0B,CAAA,EACjFD,EAES,SAAA,CAFD,KAAK,SAAS,MAAM,gBAAiB,UAAW5B,EAAA,MAAO,QAAOyB,CAAA,EAAY,gBAElF,EAAAK,CAAA,CAAA,wBAGFF,EA4UM,MA5UNG,EA4UM,CA3UK7B,EAAA,WAAT8B,EAAyD,IAAzDC,EAA6C,UAAQ,GAEhCjC,EAAA,WAArBgC,EAwUWE,EAAA,CAAA,IAAA,GAAA,CArUTN,EA2CU,UA3CVO,EA2CU,aA1CRP,EAAwD,KAAA,CAApD,GAAG,iBAAiB,MAAM,SAAA,EAAU,cAAW,EAAA,GAEnDA,EAuCK,KAvCLQ,EAuCK,CAtCHR,EAIM,MAJNS,EAIM,CAHJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAA2C,KAAA,CAAvC,MAAM,oBAAA,EAAqB,UAAO,EAAA,GACtCA,EAAgF,KAAhFW,EAAgFC,EAAxBxC,QAAK,IAAI,OAAO,EAAA,CAAA,EACxE4B,EAAmE,KAAnEa,EAAmED,EAA5BxC,QAAK,IAAI,WAAW,EAAA,CAAA,CAAA,GAG7D4B,EAUM,MAVNc,EAUM,CATJJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAA0C,KAAA,CAAtC,MAAM,oBAAA,EAAqB,SAAM,EAAA,GACrCA,EAEK,KAFLe,EAEKH,EADAI,EAAArB,CAAA,EAAevB,EAAA,MAAK,IAAI,aAAa,CAAA,EAAA,CAAA,EAE1C4B,EAIK,KAJLiB,GAIK,CADHjB,EAAkF,OAAA,CAA3E,SAAU5B,EAAA,MAAK,IAAI,SAAA,EAAcwC,EAAAI,EAAAE,CAAA,EAAa9C,EAAA,MAAK,IAAI,SAAS,CAAA,EAAA,EAAA+C,EAAA,CAAA,KAI3EnB,EASM,MATNoB,GASM,CARJV,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAAiD,KAAA,CAA7C,MAAM,oBAAA,EAAqB,gBAAa,EAAA,GAC5CA,EAEK,KAFLqB,GAEKT,EADAxC,EAAA,MAAK,OAAO,OAAO,KAAK,EAAA,CAAA,EAE7B4B,EAGK,KAHLsB,GAAoC,gBACrBlD,EAAA,MAAK,OAAO,OAAO,WAAW,EAAG,iBAC9CwC,EAAGxC,EAAA,MAAK,OAAO,OAAO,UAAU,EAAG,eACrC,CAAA,CAAA,GAGF4B,EAQM,MARNuB,GAQM,CAPJb,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAAqD,KAAA,CAAjD,MAAM,oBAAA,EAAqB,oBAAiB,EAAA,GAChDA,EAEK,KAFLwB,GAEKZ,EADAxC,QAAK,WAAW,OAAO,EAAA,CAAA,EAE5B4B,EAEK,KAFLyB,GAAoC,cACxBb,EAAGxC,EAAA,MAAK,WAAW,MAAM,KAAK,EAAG,gBAC7C,CAAA,CAAA,OAON4B,EA+BU,UA/BV0B,GA+BU,aA9BR1B,EAAuE,KAAA,CAAnE,GAAG,gBAAgB,MAAM,uBAAA,EAAwB,gBAAa,EAAA,GAClEU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAGI,IAAA,CAHD,MAAM,yBAAA,EAA0B,gKAGnC,EAAA,GAEAA,EAOK,KAPL2B,GAOK,CANH3B,EAKM,MAAA,KAAA,CAJJU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAAwB,UAApB,kBAAe,EAAA,GACnBA,EAEK,KAFL4B,GAEKhB,EADAxC,QAAK,OAAO,OAAO,QAAQ,EAAG,SAAOA,EAAA,MAAK,OAAO,OAAO,KAAK,EAAA,CAAA,CAAA,KAKtEsC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAA2F,KAAA,CAAvF,MAAM,gEAAA,EAAiE,cAAW,EAAA,GACtFA,EAaK,KAbL6B,GAaK,EAZHC,EAAA,EAAA,EAAA1B,EAWKE,SAXclC,EAAA,MAAK,OAAO,MAApBe,QAAXiB,EAWK,KAAA,CAXkC,IAAKjB,EAAK,KAAM,MAAM,iCAAA,GAC3Da,EAAsE,OAAtE+B,GAAsEnB,EAA9B/B,EAAUM,EAAK,IAAI,CAAA,EAAA,CAAA,EAC3Da,EAKO,OALPgC,GAKO,CAJLhC,EAGE,OAAA,CAFA,MAAM,yCACL,MAAKiC,EAAA,CAAA,MAAA,GAAe9C,EAAK,MAAQH,EAAA,MAAW,GAAA,GAAA,CAAA,CAAA,YAGjDgB,EAEO,OAFPkC,GAEOtB,EADFzB,EAAK,KAAK,EAAA,CAAA,CAAA,eAQrBa,EAkDU,UAlDVmC,GAkDU,eAjDRnC,EAEK,KAAA,CAFD,GAAG,sBAAsB,MAAM,sDAAA,EAAuD,gBAE1F,EAAA,GAEAA,EA4CM,MA5CNoC,GA4CM,CA3CJpC,EA0CQ,QA1CRqC,GA0CQ,CAzCN3B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAA4F,UAAA,CAAnF,MAAM,SAAA,EAAU,4DAAyD,EAAA,iBAClFA,EAQQ,QAAA,KAAA,CAPNA,EAMK,KAAA,CAND,MAAM,qDAAmD,CAC3DA,EAA6D,KAAA,CAAzD,MAAM,MAAM,MAAM,uBAAA,EAAwB,YAAU,EACxDA,EAAqE,KAAA,CAAjE,MAAM,MAAM,MAAM,kCAAA,EAAmC,SAAO,EAChEA,EAAoE,KAAA,CAAhE,MAAM,MAAM,MAAM,kCAAA,EAAmC,QAAM,EAC/DA,EAAoF,KAAA,CAAhF,MAAM,MAAM,MAAM,4CAAA,EAA6C,cAAY,EAC/EA,EAAgF,KAAA,CAA5E,MAAM,MAAM,MAAM,4CAAA,EAA6C,UAAQ,CAAA,SAI/EA,EA6BQ,QA7BRsC,GA6BQ,EA5BNR,EAAA,EAAA,EAAA1B,EA2BKE,SA3BclC,EAAA,MAAK,OAAO,YAApBe,QAAXiB,EA2BK,KAAA,CA3BwC,IAAKjB,EAAK,IAAA,GACrDa,EAQK,KARLuC,GAQK,CAPHzC,EAKa0C,EAAA,CAJV,GAAE,CAAA,KAAA,aAAA,OAAA,CAAA,WAA8CrD,EAAK,KAAI,EAC1D,MAAM,+BAAA,aAEN,IAAgB,CAAbsD,EAAA7B,EAAAzB,EAAK,KAAK,EAAA,CAAA,CAAA,qBAEfa,EAA0D,OAA1D0C,GAA0D9B,EAAnBzB,EAAK,IAAI,EAAA,CAAA,CAAA,GAGlDa,EAAuE,KAAvE2C,GAAuE/B,EAApBzB,EAAK,OAAO,EAAA,CAAA,EAE/Da,EAKK,KALL4C,GAKK,CAJAH,EAAA7B,EAAAzB,EAAK,OAAO,GAAG,EAAG,IACrB,CAAA,EAAYA,EAAK,OAAO,MAAQA,EAAK,OAAO,SAA5CiB,EAEO,OAFPyC,GAEOjC,EADFzB,EAAK,OAAO,KAAK,EAAG,gBACzB,CAAA,cAGFa,EAEK,KAFL8C,GAEKlC,EADAzB,EAAK,YAAU,GAAA,EAAU,MAAGyB,EAAGzB,EAAK,WAAS,GAAA,EAAA,CAAA,EAGlDa,EAEK,KAFL+C,GAEKnC,EADAzB,EAAK,SAAQ,SAAA,WAAA,EAAA,CAAA,CAAA,mBAWpBf,EAAA,MAAK,OAAO,WAAW,QAD/B0D,IAAA1B,EAsBU,UAtBV4C,GAsBU,eAjBRhD,EAAyE,KAAA,CAArE,GAAG,qBAAqB,MAAM,uBAAA,EAAwB,aAAU,EAAA,GAEpEA,EAcK,KAdLiD,GAcK,EAbHnB,EAAA,EAAA,EAAA1B,EAYME,SAZclC,EAAA,MAAK,OAAO,WAApBe,QAAZiB,EAYM,MAAA,CAZuC,IAAKjB,EAAK,IAAA,GACrDa,EAOK,KAAA,KAAA,CANHF,EAKa0C,EAAA,CAJV,GAAE,CAAA,KAAA,YAAA,OAAA,CAAA,KAAuCrD,EAAK,KAAI,EACnD,MAAM,mBAAA,aAEN,IAAgB,CAAbsD,EAAA7B,EAAAzB,EAAK,KAAK,EAAA,CAAA,CAAA,uBAGjBa,EAEK,KAFLkD,GAEKtC,EADAzB,EAAK,OAAO,GAAG,EAAG,SAAMyB,EAAGzB,EAAK,OAAO,MAAG,EAAA,GAAA,GAAA,EAAA,CAAA,CAAA,yBAQtCf,EAAA,MAAK,OAAO,UAAU,QAArC0D,IAAA1B,EAqBU,UArBV+C,GAqBU,eApBRnD,EAAuE,KAAA,CAAnE,GAAG,oBAAoB,MAAM,uBAAA,EAAwB,YAAS,EAAA,GAClEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAEI,IAAA,CAFD,MAAM,yBAAA,EAA0B,iFAEnC,EAAA,GAEAA,EAcK,KAdLoD,GAcK,EAbHtB,EAAA,EAAA,EAAA1B,EAYKE,SAXYlC,EAAA,MAAK,OAAO,UAApBiF,QADTjD,EAYK,KAAA,CAVF,IAAG,GAAKiD,EAAK,QAAQ,IAAIA,EAAK,IAAI,IAAIA,EAAK,IAAI,GAChD,MAAM,uCAAA,GAENrD,EAEO,OAFPsD,GAEO1C,EADFxB,EAAA,MAAO,IAAG,GAAIiE,EAAK,QAAQ,IAAIA,EAAK,IAAI,EAAA,GAAOA,EAAK,IAAI,EAAA,CAAA,EAE7DrD,EAAoD,OAApDuD,GAAoD3C,EAAnByC,EAAK,IAAI,EAAA,CAAA,EAC1CvD,EAA+DkB,EAAAwC,CAAA,EAAA,CAAlD,KAAM,GAAI,MAAM,aAAa,cAAY,MAAA,GACtDxD,EAA2C,OAAA,KAAAY,EAAlCrB,EAAgB8D,EAAK,EAAE,CAAA,EAAA,CAAA,EACpBA,EAAK,cAAjBjD,EAA+E,OAA/EqD,GAAoE,MAAI,oCAO9EzD,EA6DU,UA7DV0D,GA6DU,eA5DR1D,EAAiF,KAAA,CAA7E,GAAG,qBAAqB,MAAM,uBAAA,EAAwB,qBAAkB,EAAA,GAC5EU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAGI,IAAA,CAHD,MAAM,yBAAA,EAA0B,kJAGnC,EAAA,IAGQd,EAAAd,EAAA,MAAK,WAAW,OAAhB,MAAAc,EAAsB,qBAD9BkB,EAMI,IANJuD,GAGC,mHAGD,aAEQrE,EAAAlB,EAAA,MAAK,WAAW,OAAhB,MAAAkB,EAAsB,SAD9BwC,EAAA,EAAA1B,EAKI,IALJwD,GAGC,iDAC8ChD,EAAGxC,EAAA,MAAK,WAAW,KAAK,QAAQ,MAAM,EAAA,CAAA,YAGrF4B,EAuCK,KAvCL6D,GAuCK,CAtCQzF,EAAA,MAAK,WAAW,SAA3BgC,EAGM,MAAA0D,GAAA,CAFJpD,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAe,UAAX,SAAM,EAAA,GACVA,EAA+C,KAA/C+D,GAA+CnD,EAA3BxC,QAAK,WAAW,GAAG,EAAA,CAAA,CAAA,aAE9BA,EAAA,MAAK,WAAW,YAA3BgC,EAKM,MAAA4D,GAAA,CAJJtD,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAe,UAAX,SAAM,EAAA,GACVA,EAEK,KAFLiE,GAEK,KADA7F,EAAA,MAAK,WAAW,MAAM,EAAA,CAAA,EAAmBA,EAAA,MAAK,WAAW,UAAhCgC,EAA2FE,EAAA,CAAA,IAAA,GAAA,CAArDmC,EAAA,SAAOrE,EAAA,MAAK,WAAW,KAAK,MAAK,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,8BAGvG4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAqB,UAAjB,eAAY,EAAA,GAChBA,EAAkD,KAAlDkE,GAAkDtD,EAA9BxC,QAAK,WAAW,MAAM,EAAA,CAAA,CAAA,GAEjCA,EAAA,MAAK,WAAW,UAA3BgC,EASM,MAAA+D,GAAA,CARJzD,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAkB,UAAd,YAAS,EAAA,GACbA,EAMK,KAAA,KAAA,CALAyC,EAAA7B,EAAAxC,EAAA,MAAK,WAAW,KAAK,eAAiB,KAAKA,QAAK,WAAW,KAAK,UAAU,EAAE,eAAA,aAA+B,IAC9G,CAAA,EAAYA,EAAA,MAAK,WAAW,KAAK,OAAjC0D,IAAA1B,EAGO,OAHPgE,GAA4D,oBAC1CxD,EAAA,IAAO,KAAKxC,EAAA,MAAK,WAAW,KAAK,MAAM,KAAK,EAAE,eAAA,CAAc,EAAK,KACjFwC,EAAGxC,EAAA,MAAK,WAAW,KAAK,MAAM,OAAO,EAAA,CAAA,0BAIhCA,EAAA,MAAK,WAAW,aAAU,UAArCgC,EAGM,MAAAiE,GAAA,CAFJ3D,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAmB,UAAf,aAAU,EAAA,GACdA,EAA2E,KAA3EsE,GAA2E1D,EAA/CI,EAAApB,CAAA,EAAYxB,EAAA,MAAK,WAAW,UAAU,CAAA,EAAA,CAAA,CAAA,aAEpE4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAgB,UAAZ,UAAO,EAAA,GACXA,EAA2D,KAA3DuE,GAA2D3D,EAA/BxC,QAAK,WAAW,OAAO,EAAA,CAAA,CAAA,GAErD4B,EAKM,MAAA,KAAA,CAJJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAc,UAAV,QAAK,EAAA,GACTA,EAEK,KAFLwE,GAEK5D,EADAxC,QAAK,WAAW,MAAM,KAAK,EAAG,cAAYA,EAAA,MAAK,WAAW,MAAM,QAAQ,EAAA,CAAA,CAAA,OAQnF4B,EAwEU,UAxEVyE,GAwEU,eAvERzE,EAAyE,KAAA,CAArE,GAAG,qBAAqB,MAAM,uBAAA,EAAwB,aAAU,EAAA,GACpEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAEI,IAAA,CAFD,MAAM,yBAAA,EAA0B,sFAEnC,EAAA,GAGQ5B,EAAA,MAAK,WAAW,iBAAiB,QADzC0D,IAAA1B,EAOI,IAPJsE,GAGC,gDAEE9D,EAAGxC,EAAA,MAAK,WAAW,iBAAiB,YAAa,6FAEpD,CAAA,YAEA4B,EAwDK,KAxDL2E,GAwDK,CAvDH3E,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAa,UAAT,OAAI,EAAA,GACRA,EAAgD,KAAhD4E,GAAgDhE,EAA5BxC,QAAK,WAAW,IAAI,EAAA,CAAA,CAAA,GAE1C4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAiB,UAAb,WAAQ,EAAA,GACZA,EAAmD,KAAnD6E,GAAmDjE,EAA/BxC,QAAK,WAAW,OAAO,EAAA,CAAA,CAAA,GAE7C4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAsB,UAAlB,gBAAa,EAAA,GACjBA,EAAwD,KAAxD8E,GAAwDlE,EAApCxC,QAAK,WAAW,YAAY,EAAA,CAAA,CAAA,GAEvCA,EAAA,MAAK,WAAW,iBAA3BgC,EAGM,MAAA2E,GAAA,CAFJrE,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAqB,UAAjB,eAAY,EAAA,GAChBA,EAAuD,KAAvDgF,GAAuDpE,EAAnCxC,QAAK,WAAW,WAAW,EAAA,CAAA,CAAA,aAEjD4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAgB,UAAZ,UAAO,EAAA,GACXA,EAAuD,KAAA,KAAAY,EAAhDxC,EAAA,MAAK,IAAI,IAAI,EAAG,OAAIwC,EAAGxC,EAAA,MAAK,IAAI,QAAQ,EAAA,CAAA,CAAA,GAEjD4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAsB,UAAlB,gBAAa,EAAA,GACjBA,EAA4E,KAA5EiF,GAA4ErE,EAAhDI,EAAApB,CAAA,EAAYxB,EAAA,MAAK,WAAW,WAAW,CAAA,EAAA,CAAA,CAAA,GAErE4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAqB,UAAjB,eAAY,EAAA,GAChBA,EAAqE,KAArEkF,GAAqEtE,EAAzCxC,QAAK,WAAW,iBAAiB,EAAA,CAAA,CAAA,GAE/D4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAuB,UAAnB,iBAAc,EAAA,GAClBA,EAAgD,KAAhDmF,GAAgDvE,EAA5BxC,QAAK,WAAW,IAAI,EAAA,CAAA,CAAA,GAE/BA,EAAA,MAAK,WAAW,eAA3BgC,EAGM,MAAAgF,GAAA,CAFJ1E,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAqB,UAAjB,eAAY,EAAA,GAChBA,EAAqD,KAArDqF,GAAqDzE,EAAjCxC,QAAK,WAAW,SAAS,EAAA,CAAA,CAAA,aAEpCA,EAAA,MAAK,WAAW,kBAAe,UAA1CgC,EAMM,MAAAkF,GAAA,CALJ5E,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAyB,UAArB,mBAAgB,EAAA,GACpBA,EAGK,KAHLuF,GAGK3E,EAFAxC,EAAA,MAAK,WAAW,eAAe,EAAG,wBAClCA,EAAA,MAAK,WAAW,gBAAgB,EAAG,MACxC,CAAA,CAAA,aAEF4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAA4B,UAAxB,sBAAmB,EAAA,GACvBA,EAAwD,KAAA,KAAAY,EAAjDxC,EAAA,MAAK,WAAW,WAAU,MAAA,IAAA,EAAA,CAAA,CAAA,GAExBA,EAAA,MAAK,WAAW,aAAa,YAAxCgC,EAGM,MAAAoF,GAAA,CAFJ9E,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAA4B,UAAxB,sBAAmB,EAAA,GACvBA,EAAmE,KAAnEyF,GAAmE7E,EAA/CxC,EAAA,MAAK,WAAW,aAAa,KAAI,IAAA,CAAA,EAAA,CAAA,CAAA,aAEvD4B,EAGM,MAAA,KAAA,CAFJU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAV,EAAkB,UAAd,YAAS,EAAA,GACbA,EAAuC,KAAA,KAAAY,EAAhCxC,EAAA,MAAK,WAAW,QAAQ,EAAA,CAAA,CAAA"}
@@ -1,7 +1,7 @@
1
- import{D as o}from"./index-BsOOwFCf.js";/**
1
+ import{D as o}from"./index-BBFDilFH.js";/**
2
2
  * @license @lucide/vue v1.37.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const r=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],a=o("arrow-right",r);export{a as A};
7
- //# sourceMappingURL=arrow-right-DD5BWXHV.js.map
7
+ //# sourceMappingURL=arrow-right-DMhFU3-4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-right-DD5BWXHV.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-right.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n"],"names":["__iconNode","ArrowRight","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,EACMC,EAAaC,EAAiB,cAAeF,CAAU","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"arrow-right-DMhFU3-4.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-right.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n"],"names":["__iconNode","ArrowRight","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,EACMC,EAAaC,EAAiB,cAAeF,CAAU","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{D as o}from"./index-BsOOwFCf.js";/**
1
+ import{D as o}from"./index-BBFDilFH.js";/**
2
2
  * @license @lucide/vue v1.37.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -9,4 +9,4 @@ import{D as o}from"./index-BsOOwFCf.js";/**
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
11
  */const a=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],c=o("arrow-up",a);export{c as A,t as a};
12
- //# sourceMappingURL=arrow-up-Bdxg9_RJ.js.map
12
+ //# sourceMappingURL=arrow-up-DeNDcETx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-up-Bdxg9_RJ.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-down.mjs","../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-up.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }],\n [\"path\", { d: \"m19 12-7 7-7-7\", key: \"1idqje\" }]\n];\nconst ArrowDown = createLucideIcon(\"arrow-down\", __iconNode);\n\nexport { __iconNode, ArrowDown as default };\n//# sourceMappingURL=arrow-down.mjs.map\n","/**\n * @license @lucide/vue v1.37.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 __iconNode = [\n [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n];\nconst ArrowUp = createLucideIcon(\"arrow-up\", __iconNode);\n\nexport { __iconNode, ArrowUp as default };\n//# sourceMappingURL=arrow-up.mjs.map\n"],"names":["__iconNode","ArrowDown","createLucideIcon","ArrowUp"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,EACMC,EAAYC,EAAiB,aAAcF,CAAU,ECb3D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,EACMG,EAAUD,EAAiB,WAAYF,CAAU","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"arrow-up-DeNDcETx.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-down.mjs","../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/arrow-up.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }],\n [\"path\", { d: \"m19 12-7 7-7-7\", key: \"1idqje\" }]\n];\nconst ArrowDown = createLucideIcon(\"arrow-down\", __iconNode);\n\nexport { __iconNode, ArrowDown as default };\n//# sourceMappingURL=arrow-down.mjs.map\n","/**\n * @license @lucide/vue v1.37.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 __iconNode = [\n [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n];\nconst ArrowUp = createLucideIcon(\"arrow-up\", __iconNode);\n\nexport { __iconNode, ArrowUp as default };\n//# sourceMappingURL=arrow-up.mjs.map\n"],"names":["__iconNode","ArrowDown","createLucideIcon","ArrowUp"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,EACMC,EAAYC,EAAiB,aAAcF,CAAU,ECb3D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,EACMG,EAAUD,EAAiB,WAAYF,CAAU","x_google_ignoreList":[0,1]}
@@ -1,7 +1,7 @@
1
- import{D as o}from"./index-BsOOwFCf.js";/**
1
+ import{D as o}from"./index-BBFDilFH.js";/**
2
2
  * @license @lucide/vue v1.37.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const n=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],c=o("chevron-down",n);export{c as C};
7
- //# sourceMappingURL=chevron-down-CcJtiSTR.js.map
7
+ //# sourceMappingURL=chevron-down-D4nmRhPt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chevron-down-CcJtiSTR.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/chevron-down.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n"],"names":["__iconNode","ChevronDown","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CAAC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAQ,CAAE,CAAC,EAC5DC,EAAcC,EAAiB,eAAgBF,CAAU","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"chevron-down-D4nmRhPt.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/chevron-down.mjs"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n"],"names":["__iconNode","ChevronDown","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CAAC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAQ,CAAE,CAAC,EAC5DC,EAAcC,EAAiB,eAAgBF,CAAU","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ function o(t){const n=Date.parse(t);return Number.isNaN(n)?"":new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(n)}function f(t){if(t<1024)return`${t} B`;const n=["KB","MB","GB"];let r=t/1024,e=0;for(;r>=1024&&e<n.length-1;)r/=1024,e++;return`${r.toFixed(r<10?1:0)} ${n[e]}`}function s(t){if(t<60)return`${Math.max(0,Math.floor(t))} s`;const n=Math.floor(t/60);if(n<60)return`${n} min`;const r=Math.floor(n/60);return r<24?`${r} h ${n%60} min`:`${Math.floor(r/24)} d ${r%24} h`}function i(t){if(t==null)return"—";if(typeof t=="boolean")return t?"Yes":"No";if(typeof t=="number")return String(t);if(Array.isArray(t))return t.length===0?"—":`${t.length}`;if(typeof t=="object"&&typeof t.path=="string")return i(t.path.split("/").pop());if(typeof t=="string"){const r=(t.includes("<")?t.replace(/<[^>]*>/g," "):t).replace(/\s+/g," ").trim();return r.length>60?`${r.slice(0,60)}…`:r||"—"}return"—"}export{s as a,o as b,f,i as p};
2
+ //# sourceMappingURL=format-CW--BYT5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-Cpnr2As6.js","sources":["../../src/lib/format.ts"],"sourcesContent":["/** Display formatting shared by the views. */\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\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. */\nexport function previewValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"number\") return String(value);\n if (Array.isArray(value)) return value.length === 0 ? \"—\" : `${value.length}`;\n\n if (typeof value === \"string\") {\n // Rich text arrives as HTML; show the text it contains.\n const text = value.includes(\"<\") ? value.replace(/<[^>]*>/g, \" \") : value;\n const trimmed = text.replace(/\\s+/g, \" \").trim();\n return trimmed.length > 60 ? `${trimmed.slice(0, 60)}…` : trimmed || \"—\";\n }\n\n return \"—\";\n}\n"],"names":["absoluteTime","iso","timestamp","formatBytes","bytes","units","value","unit","formatDuration","seconds","minutes","hours","previewValue","trimmed"],"mappings":"AA8BO,SAASA,EAAaC,EAAqB,CAChD,MAAMC,EAAY,KAAK,MAAMD,CAAG,EAChC,OAAI,OAAO,MAAMC,CAAS,EAAU,GAC7B,IAAI,KAAK,eAAe,OAAW,CAAE,UAAW,SAAU,UAAW,OAAA,CAAS,EAAE,OACrFA,CAAA,CAEJ,CAEO,SAASC,EAAYC,EAAuB,CACjD,GAAIA,EAAQ,KAAM,MAAO,GAAGA,CAAK,KACjC,MAAMC,EAAQ,CAAC,KAAM,KAAM,IAAI,EAC/B,IAAIC,EAAQF,EAAQ,KAChBG,EAAO,EACX,KAAOD,GAAS,MAAQC,EAAOF,EAAM,OAAS,GAC5CC,GAAS,KACTC,IAEF,MAAO,GAAGD,EAAM,QAAQA,EAAQ,GAAK,EAAI,CAAC,CAAC,IAAID,EAAME,CAAI,CAAC,EAC5D,CAGO,SAASC,EAAeC,EAAyB,CACtD,GAAIA,EAAU,GAAI,MAAO,GAAG,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,KAE5D,MAAMC,EAAU,KAAK,MAAMD,EAAU,EAAE,EACvC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,OAEnC,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EACrC,OAAIC,EAAQ,GAAW,GAAGA,CAAK,MAAMD,EAAU,EAAE,OAE1C,GAAG,KAAK,MAAMC,EAAQ,EAAE,CAAC,MAAMA,EAAQ,EAAE,IAClD,CAGO,SAASC,EAAaN,EAAwB,CACnD,GAAIA,GAAU,KAA6B,MAAO,IAClD,GAAI,OAAOA,GAAU,UAAW,OAAOA,EAAQ,MAAQ,KACvD,GAAI,OAAOA,GAAU,SAAU,OAAO,OAAOA,CAAK,EAClD,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,SAAW,EAAI,IAAM,GAAGA,EAAM,MAAM,GAE3E,GAAI,OAAOA,GAAU,SAAU,CAG7B,MAAMO,GADOP,EAAM,SAAS,GAAG,EAAIA,EAAM,QAAQ,WAAY,GAAG,EAAIA,GAC/C,QAAQ,OAAQ,GAAG,EAAE,KAAA,EAC1C,OAAOO,EAAQ,OAAS,GAAK,GAAGA,EAAQ,MAAM,EAAG,EAAE,CAAC,IAAMA,GAAW,GACvE,CAEA,MAAO,GACT"}
1
+ {"version":3,"file":"format-CW--BYT5.js","sources":["../../src/lib/format.ts"],"sourcesContent":["/** Display formatting shared by the views. */\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\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. */\nexport function previewValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"number\") return String(value);\n if (Array.isArray(value)) return value.length === 0 ? \"—\" : `${value.length}`;\n // `media({ alt })`: the file name says more than the alt text in a list.\n if (typeof value === \"object\" && typeof (value as { path?: unknown }).path === \"string\") {\n return previewValue((value as { path: string }).path.split(\"/\").pop());\n }\n\n if (typeof value === \"string\") {\n // Rich text arrives as HTML; show the text it contains.\n const text = value.includes(\"<\") ? value.replace(/<[^>]*>/g, \" \") : value;\n const trimmed = text.replace(/\\s+/g, \" \").trim();\n return trimmed.length > 60 ? `${trimmed.slice(0, 60)}…` : trimmed || \"—\";\n }\n\n return \"—\";\n}\n"],"names":["absoluteTime","iso","timestamp","formatBytes","bytes","units","value","unit","formatDuration","seconds","minutes","hours","previewValue","trimmed"],"mappings":"AA8BO,SAASA,EAAaC,EAAqB,CAChD,MAAMC,EAAY,KAAK,MAAMD,CAAG,EAChC,OAAI,OAAO,MAAMC,CAAS,EAAU,GAC7B,IAAI,KAAK,eAAe,OAAW,CAAE,UAAW,SAAU,UAAW,OAAA,CAAS,EAAE,OACrFA,CAAA,CAEJ,CAEO,SAASC,EAAYC,EAAuB,CACjD,GAAIA,EAAQ,KAAM,MAAO,GAAGA,CAAK,KACjC,MAAMC,EAAQ,CAAC,KAAM,KAAM,IAAI,EAC/B,IAAIC,EAAQF,EAAQ,KAChBG,EAAO,EACX,KAAOD,GAAS,MAAQC,EAAOF,EAAM,OAAS,GAC5CC,GAAS,KACTC,IAEF,MAAO,GAAGD,EAAM,QAAQA,EAAQ,GAAK,EAAI,CAAC,CAAC,IAAID,EAAME,CAAI,CAAC,EAC5D,CAGO,SAASC,EAAeC,EAAyB,CACtD,GAAIA,EAAU,GAAI,MAAO,GAAG,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,KAE5D,MAAMC,EAAU,KAAK,MAAMD,EAAU,EAAE,EACvC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,OAEnC,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EACrC,OAAIC,EAAQ,GAAW,GAAGA,CAAK,MAAMD,EAAU,EAAE,OAE1C,GAAG,KAAK,MAAMC,EAAQ,EAAE,CAAC,MAAMA,EAAQ,EAAE,IAClD,CAGO,SAASC,EAAaN,EAAwB,CACnD,GAAIA,GAAU,KAA6B,MAAO,IAClD,GAAI,OAAOA,GAAU,UAAW,OAAOA,EAAQ,MAAQ,KACvD,GAAI,OAAOA,GAAU,SAAU,OAAO,OAAOA,CAAK,EAClD,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,SAAW,EAAI,IAAM,GAAGA,EAAM,MAAM,GAE3E,GAAI,OAAOA,GAAU,UAAY,OAAQA,EAA6B,MAAS,SAC7E,OAAOM,EAAcN,EAA2B,KAAK,MAAM,GAAG,EAAE,KAAK,EAGvE,GAAI,OAAOA,GAAU,SAAU,CAG7B,MAAMO,GADOP,EAAM,SAAS,GAAG,EAAIA,EAAM,QAAQ,WAAY,GAAG,EAAIA,GAC/C,QAAQ,OAAQ,GAAG,EAAE,KAAA,EAC1C,OAAOO,EAAQ,OAAS,GAAK,GAAGA,EAAQ,MAAM,EAAG,EAAE,CAAC,IAAMA,GAAW,GACvE,CAEA,MAAO,GACT"}
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardView-BpelkVGe.js","assets/PageHeader.vue_vue_type_script_setup_true_lang-DJWhe1Ye.js","assets/CollectionView-BlLAhVVi.js","assets/format-Cpnr2As6.js","assets/plus-CgaTSYYb.js","assets/arrow-up-Bdxg9_RJ.js","assets/EntryView-DZuhqJnd.js","assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-C073kW3p.js","assets/useUnsavedChanges-FB5XcFfI.js","assets/useField-BxptRsz_.js","assets/arrow-right-DD5BWXHV.js","assets/SingletonView-Cb8Qq_gr.js","assets/MediaView-Dp2botAQ.js","assets/ChangesView-CSjnT0fh.js","assets/SystemView-C6RAZvd2.js","assets/SystemView-AMhNiUgh.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardView-CslqN0A1.js","assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js","assets/CollectionView-DMmV03BG.js","assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js","assets/format-CW--BYT5.js","assets/arrow-up-DeNDcETx.js","assets/EntryView-CpappvZe.js","assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js","assets/useUnsavedChanges-C4vyxObi.js","assets/useField-DcIPoU4r.js","assets/arrow-right-DMhFU3-4.js","assets/SingletonView-BHtlstaz.js","assets/MediaView-CN7asOkJ.js","assets/ChangesView-B37VddpZ.js","assets/SystemView-S-i2v0ly.js","assets/SystemView-AMhNiUgh.css"])))=>i.map(i=>d[i]);
2
2
  var fl=Object.defineProperty;var dl=(e,t,n)=>t in e?fl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Ln=(e,t,n)=>dl(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/**
3
3
  * @vue/shared v3.5.42
4
4
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
@@ -114,5 +114,5 @@ var fl=Object.defineProperty;var dl=(e,t,n)=>t in e?fl(e,t,{enumerable:!0,config
114
114
  *
115
115
  * This source code is licensed under the ISC license.
116
116
  * See the LICENSE file in the root directory of this source tree.
117
- */const df=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],hf=yt("x",df),ar="/api";class Zt extends Error{constructor(n,s,r,i=[]){super(r);Ln(this,"status");Ln(this,"code");Ln(this,"issues");this.name="ApiError",this.status=n,this.code=s,this.issues=i}get isUnauthenticated(){return this.status===401}}const Mi=10;function pf(){const e=/(?:^|;\s*)(?:__Host-)?mica_csrf=([^;]*)/.exec(document.cookie);return e!=null&&e[1]?decodeURIComponent(e[1]):""}async function ie(e,t={}){var u,a,f;const n=new URL(`${ar}${e}`,window.location.origin);for(const[p,m]of Object.entries(t.query??{}))m!==void 0&&m!==""&&n.searchParams.set(p,String(m));const s={},r=t.method??"GET";r!=="GET"&&(s["x-csrf-token"]=pf());const i=t.body instanceof FormData;t.body!==void 0&&!i&&(s["content-type"]="application/json");let o;try{o=await fetch(n,{method:r,headers:s,credentials:"same-origin",signal:t.signal,body:i?t.body:t.body!==void 0?JSON.stringify(t.body):void 0})}catch(p){throw p.name==="AbortError"?p:new Zt(0,"network_error","Could not reach the server. Check your connection.")}if(o.status===204)return;const l=await o.text(),c=l?JSON.parse(l):null;if(!o.ok){const p=c;throw new Zt(o.status,((u=p==null?void 0:p.error)==null?void 0:u.code)??"error",((a=p==null?void 0:p.error)==null?void 0:a.message)??`Request failed (${o.status}).`,((f=p==null?void 0:p.error)==null?void 0:f.issues)??[])}return c}const zt={auth:{me:()=>ie("/auth/me"),config:()=>ie("/auth/config"),signInUrl:e=>`${ar}/auth/login?returnTo=${encodeURIComponent(e)}`,logout:()=>ie("/auth/logout",{method:"POST"})},schema:()=>ie("/admin/schema"),overview:()=>ie("/admin/overview"),system:()=>ie("/admin/system"),entries:{list:(e,t={})=>ie(`/admin/collections/${e}/entries`,{query:t}),get:(e,t)=>ie(`/admin/collections/${e}/entries/${t}`),create:(e,t)=>ie(`/admin/collections/${e}/entries`,{method:"POST",body:t}),update:(e,t,n)=>ie(`/admin/collections/${e}/entries/${t}`,{method:"PUT",body:n}),remove:(e,t)=>ie(`/admin/collections/${e}/entries/${t}`,{method:"DELETE"}),reorder:(e,t)=>ie(`/admin/collections/${e}/reorder`,{method:"POST",body:{slugs:t}}),suggestSlug:(e,t,n)=>ie(`/admin/collections/${e}/slug`,{query:{source:t,except:n}}),references:(e,t)=>ie(`/admin/collections/${e}/entries/${t}/references`)},singletons:{get:e=>ie(`/admin/singletons/${e}`),save:(e,t,n)=>ie(`/admin/singletons/${e}`,{method:"PUT",body:{data:t,revision:n}})},staging:{changes:()=>ie("/admin/changes"),publish:(e,t)=>ie("/admin/publish",{method:"POST",body:{message:e,paths:t}}),sync:()=>ie("/admin/sync",{method:"POST"}),resolve:(e,t)=>ie("/admin/changes/resolve",{method:"POST",body:{group:e,choice:t}}),push:()=>ie("/admin/publish/push",{method:"POST"}),discard:e=>ie("/admin/changes/discard",{method:"POST",body:{paths:e}}),compare:(e,t="head")=>ie(`/admin/changes/compare?${new URLSearchParams({...e,...t==="origin"?{against:t}:{}})}`)},media:{list:()=>ie("/admin/media"),upload:async(e,t={})=>{const n=[];for(let s=0;s<e.length;s+=Mi){const r=new FormData;for(const o of e.slice(s,s+Mi))r.append("file",o);t.accept&&r.append("accept",t.accept),t.directory&&r.append("directory",t.directory);const i=await ie("/admin/media",{method:"POST",body:r});n.push(...i.items)}return{items:n}},url:e=>`${ar}/admin/media/file/${e.split("/").map(encodeURIComponent).join("/")}`}},Ye=Ve(null);let Kn=null;function cl(){return{schema:re(()=>Ye.value),collections:re(()=>{var e;return((e=Ye.value)==null?void 0:e.collections)??[]}),singletons:re(()=>{var e;return((e=Ye.value)==null?void 0:e.singletons)??[]}),loaded:re(()=>Ye.value!==null),async load(e=!1){return Ye.value&&!e?Ye.value:(Kn??(Kn=zt.schema().then(t=>(Ye.value=t,Kn=null,t))),Kn)},collection(e){var t;return(t=Ye.value)==null?void 0:t.collections.find(n=>n.name===e)},singleton(e){var t;return(t=Ye.value)==null?void 0:t.singletons.find(n=>n.name===e)},reset(){Ye.value=null,Kn=null}}}const Bt=Ve(null),$t=Ve(!1),Gs=Ve(!1),Ks=Ve(null);function Rs(){return{identity:re(()=>Bt.value),isActive:re(()=>$t.value),checked:re(()=>Gs.value),config:re(()=>Ks.value),showsIdentity:re(()=>{var e;return((e=Ks.value)==null?void 0:e.authRequired)===!0}),async restore(){try{const e=await zt.auth.config();if(Ks.value=e,!e.authRequired){Bt.value=null,$t.value=!0;return}const t=await zt.auth.me();Bt.value=t.identity,$t.value=!0}catch(e){(!(e instanceof Zt)||!e.isUnauthenticated)&&console.error("Failed to restore session",e),Bt.value=null,$t.value=!1}finally{Gs.value=!0}},signIn(e="/admin/"){window.location.href=zt.auth.signInUrl(e)},async signOut(){let e=null;try{({endSession:e}=await zt.auth.logout())}finally{Bt.value=null,$t.value=!1}e&&(window.location.href=e)},clear(){Bt.value=null,$t.value=!1,Gs.value=!0}}}function gf(e){const t=new Map;for(const n of e){const s=n.owner,r=s.kind==="entry"?`entry:${s.collection}/${s.slug}`:s.kind==="singleton"?`singleton:${s.name}`:s.kind==="order"?`order:${s.collection}`:s.kind==="media"?"media":`other:${n.path}`;let i=t.get(r);i||(i={key:r,label:s.label,link:s.kind==="entry"&&(n.kind!=="delete"||s.renamedFrom)?{name:"entry",params:{collection:s.collection,slug:s.slug}}:s.kind==="singleton"?{name:"singleton",params:{name:s.name}}:s.kind==="media"?{name:"media"}:null,fileChanges:[],target:s.kind==="entry"?{kind:"entry",collection:s.collection,slug:s.slug,...s.renamedFrom?{from:s.renamedFrom}:{}}:s.kind==="singleton"?{kind:"singleton",name:s.name}:s.kind==="order"?{kind:"order",collection:s.collection}:null},t.set(r,i)),i.fileChanges.push(n)}return[...t.values()]}const Yn=Ve(null),Di=re(()=>{var e;return gf(((e=Yn.value)==null?void 0:e.changes)??[])});let Wn=null;function mf(){return{status:re(()=>Yn.value),edits:Di,editCount:re(()=>Di.value.length),async refresh(){return Wn??(Wn=zt.staging.changes().then(e=>{Yn.value=e}).catch(()=>{}).finally(()=>{Wn=null})),Wn},reset(){Yn.value=null,Wn=null}}}const _f={class:"flex min-h-full"},yf={class:"flex-1 space-y-5 overflow-y-auto px-2 py-3","aria-label":"Main"},vf=["aria-label"],bf={key:0},Ef={key:1},xf={key:0,class:"border-t border-creme/10 p-2"},wf={class:"flex items-center gap-2.5 rounded-md px-2 py-2"},Af={class:"grid h-6 w-6 shrink-0 place-items-center rounded-full bg-creme text-[10px] font-semibold text-aubergine","aria-hidden":"true"},Sf={class:"min-w-0 flex-1"},Rf={class:"block truncate text-xs font-medium text-creme/80"},Cf={class:"flex min-w-0 flex-1 flex-col"},Tf={class:"sticky top-0 z-10 flex h-14 items-center gap-3 border-b border-line bg-surface/90 px-4 backdrop-blur lg:hidden"},Of=["aria-expanded"],Pf={class:"min-w-0 flex-1 bg-surface"},If=ln({__name:"AppShell",setup(e){const t=ll(),n=Uu(),s=Rs(),r=mf(),{collections:i,singletons:o}=cl(),l=Ve(!1);vn(()=>t.fullPath,()=>{l.value=!1,r.refresh()}),bo(()=>void r.refresh());const c=re(()=>{var f,p;return(((f=s.identity.value)==null?void 0:f.name)||((p=s.identity.value)==null?void 0:p.email)||"").split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(m=>{var E;return((E=m[0])==null?void 0:E.toUpperCase())??""}).join("")||"?"});async function u(){await s.signOut(),await n.push({name:"login"})}return(a,f)=>{var m,E;const p=xo("RouterLink");return fe(),Me("div",_f,[l.value?(fe(),Me("div",{key:0,class:"fixed inset-0 z-20 bg-ink/25 lg:hidden","aria-hidden":"true",onClick:f[0]||(f[0]=_=>l.value=!1)})):Kt("",!0),Z("aside",{id:"main-navigation",class:en(["fixed inset-y-0 left-0 z-30 flex w-[220px] shrink-0 flex-col border-r border-creme/10 bg-aubergine text-creme transition-transform lg:static lg:translate-x-0",l.value?"translate-x-0":"-translate-x-full"])},[f[10]||(f[10]=Z("div",{class:"flex h-14 items-center border-b border-creme/10 px-3"},[Z("img",{src:ju,alt:"micacms",class:"h-5 w-auto"})],-1)),Z("nav",yf,[Z("div",null,[K(p,{to:{name:"dashboard"},class:"nav-link"},{default:at(()=>[K(ee(ef),{size:14,"aria-hidden":"true"}),f[2]||(f[2]=It(" Overview ",-1))]),_:1}),K(p,{to:{name:"changes"},class:"nav-link"},{default:at(()=>[K(ee(lf),{size:14,"aria-hidden":"true"}),f[3]||(f[3]=Z("span",{class:"flex-1"},"Publish",-1)),ee(r).editCount.value>0?(fe(),Me("span",{key:0,class:"rounded-full bg-creme px-1.5 py-0.5 font-mono text-[10px] font-semibold leading-none text-aubergine","aria-label":`${ee(r).editCount.value} pending edit${ee(r).editCount.value===1?"":"s"}`},At(ee(r).editCount.value),9,vf)):Kt("",!0)]),_:1})]),ee(i).length?(fe(),Me("div",bf,[f[5]||(f[5]=Z("p",{class:"nav-heading"},"Content",-1)),(fe(!0),Me(Ee,null,Zs(ee(i),_=>(fe(),Rt(p,{key:_.name,to:{name:"collection",params:{collection:_.name}},class:"nav-link"},{default:at(()=>[K(ee(Yu),{size:14,"aria-hidden":"true"}),It(" "+At(_.label),1)]),_:2},1032,["to"]))),128)),K(p,{to:{name:"media"},class:"nav-link"},{default:at(()=>[K(ee(Xu),{size:14,"aria-hidden":"true"}),f[4]||(f[4]=It(" Media ",-1))]),_:1})])):Kt("",!0),ee(o).length?(fe(),Me("div",Ef,[f[6]||(f[6]=Z("p",{class:"nav-heading"},"Settings",-1)),(fe(!0),Me(Ee,null,Zs(ee(o),_=>(fe(),Rt(p,{key:_.name,to:{name:"singleton",params:{name:_.name}},class:"nav-link"},{default:at(()=>[K(ee(ff),{size:14,"aria-hidden":"true"}),It(" "+At(_.label),1)]),_:2},1032,["to"]))),128))])):Kt("",!0),Z("div",null,[f[8]||(f[8]=Z("p",{class:"nav-heading"},"Deployment",-1)),K(p,{to:{name:"system"},class:"nav-link"},{default:at(()=>[K(ee(af),{size:14,"aria-hidden":"true"}),f[7]||(f[7]=It(" System ",-1))]),_:1})])]),ee(s).showsIdentity.value?(fe(),Me("div",xf,[Z("div",wf,[Z("span",Af,At(c.value),1),Z("span",Sf,[Z("span",Rf,At(((m=ee(s).identity.value)==null?void 0:m.name)||((E=ee(s).identity.value)==null?void 0:E.email)),1)])]),Z("button",{type:"button",class:"sidebar-signout mt-1 w-full",onClick:u},[K(ee(nf),{size:14,"aria-hidden":"true"}),f[9]||(f[9]=It(" Sign out ",-1))])])):Kt("",!0)],2),Z("div",Cf,[Z("header",Tf,[Z("button",{type:"button",class:"btn-ghost -ml-1 px-2","aria-expanded":l.value,"aria-controls":"main-navigation",onClick:f[1]||(f[1]=_=>l.value=!l.value)},[K(ee(rf),{size:20,"aria-hidden":"true"}),f[11]||(f[11]=Z("span",{class:"sr-only"},"Toggle navigation",-1))],8,Of),f[12]||(f[12]=Z("img",{src:Bu,alt:"micacms",class:"h-5 w-auto"},null,-1))]),Z("main",Pf,[vc(a.$slots,"default",{},void 0,!0)])])])}}}),Nf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Mf=Nf(If,[["__scopeId","data-v-73dfb86b"]]),In=Ve([]);let Df=1;function Ws(e,t,n){const s=Df++;return In.value=[...In.value,{id:s,kind:e,message:t,detail:n}],e!=="error"&&setTimeout(()=>al(s),4e3),s}function al(e){In.value=In.value.filter(t=>t.id!==e)}function ul(){return{toasts:Xn(In),success:(e,t)=>Ws("success",e,t),error:(e,t)=>Ws("error",e,t),info:(e,t)=>Ws("info",e,t),dismiss:al}}const kf={class:"pointer-events-none fixed inset-x-0 bottom-0 z-50 flex flex-col items-center gap-2 p-4 sm:items-end",role:"status","aria-live":"assertive"},Lf={class:"min-w-0 flex-1"},Ff={class:"text-sm font-medium"},Vf={key:0,class:"mt-0.5 text-sm opacity-80"},Hf=["onClick"],Uf=ln({__name:"ToastStack",setup(e){const{toasts:t,dismiss:n}=ul(),s={success:"border-success/15 bg-success-soft text-success",error:"border-danger/15 bg-danger-soft text-danger",info:"border-info/15 bg-info-soft text-info"},r={success:"bg-success",error:"bg-danger",info:"bg-info"};return(i,o)=>(fe(),Me("div",kf,[(fe(!0),Me(Ee,null,Zs(ee(t),l=>(fe(),Me("div",{key:l.id,class:en(["pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-md border p-4 shadow-lg",s[l.kind]])},[Z("span",{class:en(["mt-1.5 h-2 w-2 shrink-0 rounded-full",r[l.kind]]),"aria-hidden":"true"},null,2),Z("div",Lf,[Z("p",Ff,At(l.message),1),l.detail?(fe(),Me("p",Vf,At(l.detail),1)):Kt("",!0)]),Z("button",{type:"button",class:"-m-1 shrink-0 rounded p-1 opacity-60 hover:opacity-100",onClick:c=>ee(n)(l.id)},[K(ee(hf),{size:16,"aria-hidden":"true"}),o[0]||(o[0]=Z("span",{class:"sr-only"},"Dismiss",-1))],8,Hf)],2))),128))]))}}),jf=ln({__name:"App",setup(e){const t=ll(),n=Rs(),s=re(()=>n.isActive.value&&!t.meta.public);return(r,i)=>{const o=xo("RouterView");return fe(),Me(Ee,null,[K(Uf),s.value?(fe(),Rt(Mf,{key:0},{default:at(()=>[K(o,null,{default:at(({Component:l,route:c})=>[(fe(),Rt(yc(l),{key:c.fullPath}))]),_:1})]),_:1})):(fe(),Rt(o,{key:1}))],64)}}}),Bf="modulepreload",$f=function(e){return"/admin/"+e},ki={},Qe=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let o=function(u){return Promise.all(u.map(a=>Promise.resolve(a).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),c=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));r=o(n.map(u=>{if(u=$f(u),u in ki)return;ki[u]=!0;const a=u.endsWith(".css"),f=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${f}`))return;const p=document.createElement("link");if(p.rel=a?"stylesheet":Bf,a||(p.as="script"),p.crossOrigin="",p.href=u,c&&p.setAttribute("nonce",c),document.head.appendChild(p),a)return new Promise((m,E)=>{p.addEventListener("load",m),p.addEventListener("error",()=>E(new Error(`Unable to preload CSS for ${u}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},Gf=[{path:"/login",name:"login",component:()=>Qe(()=>import("./LoginView-BmnX2zOD.js"),[]),meta:{public:!0,title:"Sign in"}},{path:"/",name:"dashboard",component:()=>Qe(()=>import("./DashboardView-BpelkVGe.js"),__vite__mapDeps([0,1])),meta:{title:"Overview"}},{path:"/collections/:collection",name:"collection",component:()=>Qe(()=>import("./CollectionView-BlLAhVVi.js"),__vite__mapDeps([2,1,3,4,5])),props:!0},{path:"/collections/:collection/new",name:"entry-new",component:()=>Qe(()=>import("./EntryView-DZuhqJnd.js"),__vite__mapDeps([6,7,8,9,10,4,1])),props:!0},{path:"/collections/:collection/:slug",name:"entry",component:()=>Qe(()=>import("./EntryView-DZuhqJnd.js"),__vite__mapDeps([6,7,8,9,10,4,1])),props:!0},{path:"/singletons/:name",name:"singleton",component:()=>Qe(()=>import("./SingletonView-Cb8Qq_gr.js"),__vite__mapDeps([11,8,9,10,4,1])),props:!0},{path:"/media",name:"media",component:()=>Qe(()=>import("./MediaView-Dp2botAQ.js"),__vite__mapDeps([12,1,3])),meta:{title:"Media"}},{path:"/changes",name:"changes",component:()=>Qe(()=>import("./ChangesView-CSjnT0fh.js"),__vite__mapDeps([13,9,7,1])),meta:{title:"Publish"}},{path:"/system",name:"system",component:()=>Qe(()=>import("./SystemView-C6RAZvd2.js"),__vite__mapDeps([14,1,3,10,15])),meta:{title:"System"}},{path:"/:pathMatch(.*)*",name:"not-found",component:()=>Qe(()=>import("./NotFoundView-ByEOgkxm.js"),[]),meta:{title:"Not found"}}],Cs=Hu({history:_u("/admin/"),routes:Gf,scrollBehavior:(e,t,n)=>n??{top:0}});Cs.beforeEach(async e=>{const t=Rs();return t.checked.value||await t.restore(),e.meta.public?t.isActive.value?{name:"dashboard"}:!0:t.isActive.value?(await cl().load(),!0):{name:"login",query:e.fullPath==="/"?{}:{redirect:e.fullPath}}});Cs.afterEach(e=>{const t=typeof e.meta.title=="string"?e.meta.title:null;document.title=t?`${t} · Mica`:"Mica"});const Nr=Na(jf);Nr.config.errorHandler=e=>{if(e instanceof Zt&&e.isUnauthenticated){Rs().clear(),Cs.push({name:"login"});return}console.error(e),ul().error(e instanceof Zt?e.message:"Something went wrong.",e instanceof Error&&!(e instanceof Zt)?e.message:void 0)};Nr.use(Cs);Nr.mount("#app");export{Zt as A,Uu as B,en as C,yt as D,vc as E,Ee as F,pr as G,co as H,hc as I,On as J,zf as K,$l as L,Gl as M,Wf as N,Xc as O,Yf as P,Qe as Q,zc as R,yc as S,Jf as T,bs as U,ed as V,td as W,hf as X,Nf as Y,Qf as Z,Bu as _,Z as a,Kt as b,Me as c,ln as d,It as e,ll as f,re as g,fe as h,zt as i,K as j,Zs as k,ee as l,mf as m,ul as n,bo as o,xo as p,vn as q,Ve as r,qf as s,At as t,Rs as u,Xf as v,at as w,Rt as x,cl as y,Zf as z};
118
- //# sourceMappingURL=index-BsOOwFCf.js.map
117
+ */const df=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],hf=yt("x",df),ar="/api";class Zt extends Error{constructor(n,s,r,i=[]){super(r);Ln(this,"status");Ln(this,"code");Ln(this,"issues");this.name="ApiError",this.status=n,this.code=s,this.issues=i}get isUnauthenticated(){return this.status===401}}const Mi=10;function pf(){const e=/(?:^|;\s*)(?:__Host-)?mica_csrf=([^;]*)/.exec(document.cookie);return e!=null&&e[1]?decodeURIComponent(e[1]):""}async function ie(e,t={}){var u,a,f;const n=new URL(`${ar}${e}`,window.location.origin);for(const[p,m]of Object.entries(t.query??{}))m!==void 0&&m!==""&&n.searchParams.set(p,String(m));const s={},r=t.method??"GET";r!=="GET"&&(s["x-csrf-token"]=pf());const i=t.body instanceof FormData;t.body!==void 0&&!i&&(s["content-type"]="application/json");let o;try{o=await fetch(n,{method:r,headers:s,credentials:"same-origin",signal:t.signal,body:i?t.body:t.body!==void 0?JSON.stringify(t.body):void 0})}catch(p){throw p.name==="AbortError"?p:new Zt(0,"network_error","Could not reach the server. Check your connection.")}if(o.status===204)return;const l=await o.text(),c=l?JSON.parse(l):null;if(!o.ok){const p=c;throw new Zt(o.status,((u=p==null?void 0:p.error)==null?void 0:u.code)??"error",((a=p==null?void 0:p.error)==null?void 0:a.message)??`Request failed (${o.status}).`,((f=p==null?void 0:p.error)==null?void 0:f.issues)??[])}return c}const zt={auth:{me:()=>ie("/auth/me"),config:()=>ie("/auth/config"),signInUrl:e=>`${ar}/auth/login?returnTo=${encodeURIComponent(e)}`,logout:()=>ie("/auth/logout",{method:"POST"})},schema:()=>ie("/admin/schema"),overview:()=>ie("/admin/overview"),system:()=>ie("/admin/system"),entries:{list:(e,t={})=>ie(`/admin/collections/${e}/entries`,{query:t}),get:(e,t)=>ie(`/admin/collections/${e}/entries/${t}`),create:(e,t)=>ie(`/admin/collections/${e}/entries`,{method:"POST",body:t}),update:(e,t,n)=>ie(`/admin/collections/${e}/entries/${t}`,{method:"PUT",body:n}),remove:(e,t)=>ie(`/admin/collections/${e}/entries/${t}`,{method:"DELETE"}),reorder:(e,t)=>ie(`/admin/collections/${e}/reorder`,{method:"POST",body:{slugs:t}}),suggestSlug:(e,t,n)=>ie(`/admin/collections/${e}/slug`,{query:{source:t,except:n}}),references:(e,t)=>ie(`/admin/collections/${e}/entries/${t}/references`)},singletons:{get:e=>ie(`/admin/singletons/${e}`),save:(e,t,n)=>ie(`/admin/singletons/${e}`,{method:"PUT",body:{data:t,revision:n}})},staging:{changes:()=>ie("/admin/changes"),publish:(e,t)=>ie("/admin/publish",{method:"POST",body:{message:e,paths:t}}),sync:()=>ie("/admin/sync",{method:"POST"}),resolve:(e,t)=>ie("/admin/changes/resolve",{method:"POST",body:{group:e,choice:t}}),push:()=>ie("/admin/publish/push",{method:"POST"}),discard:e=>ie("/admin/changes/discard",{method:"POST",body:{paths:e}}),compare:(e,t="head")=>ie(`/admin/changes/compare?${new URLSearchParams({...e,...t==="origin"?{against:t}:{}})}`)},media:{list:()=>ie("/admin/media"),upload:async(e,t={})=>{const n=[];for(let s=0;s<e.length;s+=Mi){const r=new FormData;for(const o of e.slice(s,s+Mi))r.append("file",o);t.accept&&r.append("accept",t.accept),t.directory&&r.append("directory",t.directory);const i=await ie("/admin/media",{method:"POST",body:r});n.push(...i.items)}return{items:n}},url:e=>`${ar}/admin/media/file/${e.split("/").map(encodeURIComponent).join("/")}`}},Ye=Ve(null);let Kn=null;function cl(){return{schema:re(()=>Ye.value),collections:re(()=>{var e;return((e=Ye.value)==null?void 0:e.collections)??[]}),singletons:re(()=>{var e;return((e=Ye.value)==null?void 0:e.singletons)??[]}),loaded:re(()=>Ye.value!==null),async load(e=!1){return Ye.value&&!e?Ye.value:(Kn??(Kn=zt.schema().then(t=>(Ye.value=t,Kn=null,t))),Kn)},collection(e){var t;return(t=Ye.value)==null?void 0:t.collections.find(n=>n.name===e)},singleton(e){var t;return(t=Ye.value)==null?void 0:t.singletons.find(n=>n.name===e)},reset(){Ye.value=null,Kn=null}}}const Bt=Ve(null),$t=Ve(!1),Gs=Ve(!1),Ks=Ve(null);function Rs(){return{identity:re(()=>Bt.value),isActive:re(()=>$t.value),checked:re(()=>Gs.value),config:re(()=>Ks.value),showsIdentity:re(()=>{var e;return((e=Ks.value)==null?void 0:e.authRequired)===!0}),async restore(){try{const e=await zt.auth.config();if(Ks.value=e,!e.authRequired){Bt.value=null,$t.value=!0;return}const t=await zt.auth.me();Bt.value=t.identity,$t.value=!0}catch(e){(!(e instanceof Zt)||!e.isUnauthenticated)&&console.error("Failed to restore session",e),Bt.value=null,$t.value=!1}finally{Gs.value=!0}},signIn(e="/admin/"){window.location.href=zt.auth.signInUrl(e)},async signOut(){let e=null;try{({endSession:e}=await zt.auth.logout())}finally{Bt.value=null,$t.value=!1}e&&(window.location.href=e)},clear(){Bt.value=null,$t.value=!1,Gs.value=!0}}}function gf(e){const t=new Map;for(const n of e){const s=n.owner,r=s.kind==="entry"?`entry:${s.collection}/${s.slug}`:s.kind==="singleton"?`singleton:${s.name}`:s.kind==="order"?`order:${s.collection}`:s.kind==="media"?"media":`other:${n.path}`;let i=t.get(r);i||(i={key:r,label:s.label,link:s.kind==="entry"&&(n.kind!=="delete"||s.renamedFrom)?{name:"entry",params:{collection:s.collection,slug:s.slug}}:s.kind==="singleton"?{name:"singleton",params:{name:s.name}}:s.kind==="media"?{name:"media"}:null,fileChanges:[],target:s.kind==="entry"?{kind:"entry",collection:s.collection,slug:s.slug,...s.renamedFrom?{from:s.renamedFrom}:{}}:s.kind==="singleton"?{kind:"singleton",name:s.name}:s.kind==="order"?{kind:"order",collection:s.collection}:null},t.set(r,i)),i.fileChanges.push(n)}return[...t.values()]}const Yn=Ve(null),Di=re(()=>{var e;return gf(((e=Yn.value)==null?void 0:e.changes)??[])});let Wn=null;function mf(){return{status:re(()=>Yn.value),edits:Di,editCount:re(()=>Di.value.length),async refresh(){return Wn??(Wn=zt.staging.changes().then(e=>{Yn.value=e}).catch(()=>{}).finally(()=>{Wn=null})),Wn},reset(){Yn.value=null,Wn=null}}}const _f={class:"flex min-h-full"},yf={class:"flex-1 space-y-5 overflow-y-auto px-2 py-3","aria-label":"Main"},vf=["aria-label"],bf={key:0},Ef={key:1},xf={key:0,class:"border-t border-creme/10 p-2"},wf={class:"flex items-center gap-2.5 rounded-md px-2 py-2"},Af={class:"grid h-6 w-6 shrink-0 place-items-center rounded-full bg-creme text-[10px] font-semibold text-aubergine","aria-hidden":"true"},Sf={class:"min-w-0 flex-1"},Rf={class:"block truncate text-xs font-medium text-creme/80"},Cf={class:"flex min-w-0 flex-1 flex-col"},Tf={class:"sticky top-0 z-10 flex h-14 items-center gap-3 border-b border-line bg-surface/90 px-4 backdrop-blur lg:hidden"},Of=["aria-expanded"],Pf={class:"min-w-0 flex-1 bg-surface"},If=ln({__name:"AppShell",setup(e){const t=ll(),n=Uu(),s=Rs(),r=mf(),{collections:i,singletons:o}=cl(),l=Ve(!1);vn(()=>t.fullPath,()=>{l.value=!1,r.refresh()}),bo(()=>void r.refresh());const c=re(()=>{var f,p;return(((f=s.identity.value)==null?void 0:f.name)||((p=s.identity.value)==null?void 0:p.email)||"").split(/[\s@._-]+/).filter(Boolean).slice(0,2).map(m=>{var E;return((E=m[0])==null?void 0:E.toUpperCase())??""}).join("")||"?"});async function u(){await s.signOut(),await n.push({name:"login"})}return(a,f)=>{var m,E;const p=xo("RouterLink");return fe(),Me("div",_f,[l.value?(fe(),Me("div",{key:0,class:"fixed inset-0 z-20 bg-ink/25 lg:hidden","aria-hidden":"true",onClick:f[0]||(f[0]=_=>l.value=!1)})):Kt("",!0),Z("aside",{id:"main-navigation",class:en(["fixed inset-y-0 left-0 z-30 flex w-[220px] shrink-0 flex-col border-r border-creme/10 bg-aubergine text-creme transition-transform lg:static lg:translate-x-0",l.value?"translate-x-0":"-translate-x-full"])},[f[10]||(f[10]=Z("div",{class:"flex h-14 items-center border-b border-creme/10 px-3"},[Z("img",{src:ju,alt:"micacms",class:"h-5 w-auto"})],-1)),Z("nav",yf,[Z("div",null,[K(p,{to:{name:"dashboard"},class:"nav-link"},{default:at(()=>[K(ee(ef),{size:14,"aria-hidden":"true"}),f[2]||(f[2]=It(" Overview ",-1))]),_:1}),K(p,{to:{name:"changes"},class:"nav-link"},{default:at(()=>[K(ee(lf),{size:14,"aria-hidden":"true"}),f[3]||(f[3]=Z("span",{class:"flex-1"},"Publish",-1)),ee(r).editCount.value>0?(fe(),Me("span",{key:0,class:"rounded-full bg-creme px-1.5 py-0.5 font-mono text-[10px] font-semibold leading-none text-aubergine","aria-label":`${ee(r).editCount.value} pending edit${ee(r).editCount.value===1?"":"s"}`},At(ee(r).editCount.value),9,vf)):Kt("",!0)]),_:1})]),ee(i).length?(fe(),Me("div",bf,[f[5]||(f[5]=Z("p",{class:"nav-heading"},"Content",-1)),(fe(!0),Me(Ee,null,Zs(ee(i),_=>(fe(),Rt(p,{key:_.name,to:{name:"collection",params:{collection:_.name}},class:"nav-link"},{default:at(()=>[K(ee(Yu),{size:14,"aria-hidden":"true"}),It(" "+At(_.label),1)]),_:2},1032,["to"]))),128)),K(p,{to:{name:"media"},class:"nav-link"},{default:at(()=>[K(ee(Xu),{size:14,"aria-hidden":"true"}),f[4]||(f[4]=It(" Media ",-1))]),_:1})])):Kt("",!0),ee(o).length?(fe(),Me("div",Ef,[f[6]||(f[6]=Z("p",{class:"nav-heading"},"Settings",-1)),(fe(!0),Me(Ee,null,Zs(ee(o),_=>(fe(),Rt(p,{key:_.name,to:{name:"singleton",params:{name:_.name}},class:"nav-link"},{default:at(()=>[K(ee(ff),{size:14,"aria-hidden":"true"}),It(" "+At(_.label),1)]),_:2},1032,["to"]))),128))])):Kt("",!0),Z("div",null,[f[8]||(f[8]=Z("p",{class:"nav-heading"},"Deployment",-1)),K(p,{to:{name:"system"},class:"nav-link"},{default:at(()=>[K(ee(af),{size:14,"aria-hidden":"true"}),f[7]||(f[7]=It(" System ",-1))]),_:1})])]),ee(s).showsIdentity.value?(fe(),Me("div",xf,[Z("div",wf,[Z("span",Af,At(c.value),1),Z("span",Sf,[Z("span",Rf,At(((m=ee(s).identity.value)==null?void 0:m.name)||((E=ee(s).identity.value)==null?void 0:E.email)),1)])]),Z("button",{type:"button",class:"sidebar-signout mt-1 w-full",onClick:u},[K(ee(nf),{size:14,"aria-hidden":"true"}),f[9]||(f[9]=It(" Sign out ",-1))])])):Kt("",!0)],2),Z("div",Cf,[Z("header",Tf,[Z("button",{type:"button",class:"btn-ghost -ml-1 px-2","aria-expanded":l.value,"aria-controls":"main-navigation",onClick:f[1]||(f[1]=_=>l.value=!l.value)},[K(ee(rf),{size:20,"aria-hidden":"true"}),f[11]||(f[11]=Z("span",{class:"sr-only"},"Toggle navigation",-1))],8,Of),f[12]||(f[12]=Z("img",{src:Bu,alt:"micacms",class:"h-5 w-auto"},null,-1))]),Z("main",Pf,[vc(a.$slots,"default",{},void 0,!0)])])])}}}),Nf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Mf=Nf(If,[["__scopeId","data-v-73dfb86b"]]),In=Ve([]);let Df=1;function Ws(e,t,n){const s=Df++;return In.value=[...In.value,{id:s,kind:e,message:t,detail:n}],e!=="error"&&setTimeout(()=>al(s),4e3),s}function al(e){In.value=In.value.filter(t=>t.id!==e)}function ul(){return{toasts:Xn(In),success:(e,t)=>Ws("success",e,t),error:(e,t)=>Ws("error",e,t),info:(e,t)=>Ws("info",e,t),dismiss:al}}const kf={class:"pointer-events-none fixed inset-x-0 bottom-0 z-50 flex flex-col items-center gap-2 p-4 sm:items-end",role:"status","aria-live":"assertive"},Lf={class:"min-w-0 flex-1"},Ff={class:"text-sm font-medium"},Vf={key:0,class:"mt-0.5 text-sm opacity-80"},Hf=["onClick"],Uf=ln({__name:"ToastStack",setup(e){const{toasts:t,dismiss:n}=ul(),s={success:"border-success/15 bg-success-soft text-success",error:"border-danger/15 bg-danger-soft text-danger",info:"border-info/15 bg-info-soft text-info"},r={success:"bg-success",error:"bg-danger",info:"bg-info"};return(i,o)=>(fe(),Me("div",kf,[(fe(!0),Me(Ee,null,Zs(ee(t),l=>(fe(),Me("div",{key:l.id,class:en(["pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-md border p-4 shadow-lg",s[l.kind]])},[Z("span",{class:en(["mt-1.5 h-2 w-2 shrink-0 rounded-full",r[l.kind]]),"aria-hidden":"true"},null,2),Z("div",Lf,[Z("p",Ff,At(l.message),1),l.detail?(fe(),Me("p",Vf,At(l.detail),1)):Kt("",!0)]),Z("button",{type:"button",class:"-m-1 shrink-0 rounded p-1 opacity-60 hover:opacity-100",onClick:c=>ee(n)(l.id)},[K(ee(hf),{size:16,"aria-hidden":"true"}),o[0]||(o[0]=Z("span",{class:"sr-only"},"Dismiss",-1))],8,Hf)],2))),128))]))}}),jf=ln({__name:"App",setup(e){const t=ll(),n=Rs(),s=re(()=>n.isActive.value&&!t.meta.public);return(r,i)=>{const o=xo("RouterView");return fe(),Me(Ee,null,[K(Uf),s.value?(fe(),Rt(Mf,{key:0},{default:at(()=>[K(o,null,{default:at(({Component:l,route:c})=>[(fe(),Rt(yc(l),{key:c.fullPath}))]),_:1})]),_:1})):(fe(),Rt(o,{key:1}))],64)}}}),Bf="modulepreload",$f=function(e){return"/admin/"+e},ki={},Qe=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let o=function(u){return Promise.all(u.map(a=>Promise.resolve(a).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),c=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));r=o(n.map(u=>{if(u=$f(u),u in ki)return;ki[u]=!0;const a=u.endsWith(".css"),f=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${f}`))return;const p=document.createElement("link");if(p.rel=a?"stylesheet":Bf,a||(p.as="script"),p.crossOrigin="",p.href=u,c&&p.setAttribute("nonce",c),document.head.appendChild(p),a)return new Promise((m,E)=>{p.addEventListener("load",m),p.addEventListener("error",()=>E(new Error(`Unable to preload CSS for ${u}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},Gf=[{path:"/login",name:"login",component:()=>Qe(()=>import("./LoginView-BMcE8J5l.js"),[]),meta:{public:!0,title:"Sign in"}},{path:"/",name:"dashboard",component:()=>Qe(()=>import("./DashboardView-CslqN0A1.js"),__vite__mapDeps([0,1])),meta:{title:"Overview"}},{path:"/collections/:collection",name:"collection",component:()=>Qe(()=>import("./CollectionView-DMmV03BG.js"),__vite__mapDeps([2,1,3,4,5])),props:!0},{path:"/collections/:collection/new",name:"entry-new",component:()=>Qe(()=>import("./EntryView-CpappvZe.js"),__vite__mapDeps([6,7,8,9,10,3,1])),props:!0},{path:"/collections/:collection/:slug",name:"entry",component:()=>Qe(()=>import("./EntryView-CpappvZe.js"),__vite__mapDeps([6,7,8,9,10,3,1])),props:!0},{path:"/singletons/:name",name:"singleton",component:()=>Qe(()=>import("./SingletonView-BHtlstaz.js"),__vite__mapDeps([11,8,9,10,3,1])),props:!0},{path:"/media",name:"media",component:()=>Qe(()=>import("./MediaView-CN7asOkJ.js"),__vite__mapDeps([12,1,4])),meta:{title:"Media"}},{path:"/changes",name:"changes",component:()=>Qe(()=>import("./ChangesView-B37VddpZ.js"),__vite__mapDeps([13,9,7,1])),meta:{title:"Publish"}},{path:"/system",name:"system",component:()=>Qe(()=>import("./SystemView-S-i2v0ly.js"),__vite__mapDeps([14,1,4,10,15])),meta:{title:"System"}},{path:"/:pathMatch(.*)*",name:"not-found",component:()=>Qe(()=>import("./NotFoundView-BT-zH9Ky.js"),[]),meta:{title:"Not found"}}],Cs=Hu({history:_u("/admin/"),routes:Gf,scrollBehavior:(e,t,n)=>n??{top:0}});Cs.beforeEach(async e=>{const t=Rs();return t.checked.value||await t.restore(),e.meta.public?t.isActive.value?{name:"dashboard"}:!0:t.isActive.value?(await cl().load(),!0):{name:"login",query:e.fullPath==="/"?{}:{redirect:e.fullPath}}});Cs.afterEach(e=>{const t=typeof e.meta.title=="string"?e.meta.title:null;document.title=t?`${t} · Mica`:"Mica"});const Nr=Na(jf);Nr.config.errorHandler=e=>{if(e instanceof Zt&&e.isUnauthenticated){Rs().clear(),Cs.push({name:"login"});return}console.error(e),ul().error(e instanceof Zt?e.message:"Something went wrong.",e instanceof Error&&!(e instanceof Zt)?e.message:void 0)};Nr.use(Cs);Nr.mount("#app");export{Zt as A,Uu as B,en as C,yt as D,vc as E,Ee as F,pr as G,co as H,hc as I,On as J,zf as K,$l as L,Gl as M,Wf as N,Xc as O,Yf as P,Qe as Q,zc as R,yc as S,Jf as T,bs as U,ed as V,td as W,hf as X,Nf as Y,Qf as Z,Bu as _,Z as a,Kt as b,Me as c,ln as d,It as e,ll as f,re as g,fe as h,zt as i,K as j,Zs as k,ee as l,mf as m,ul as n,bo as o,xo as p,vn as q,Ve as r,Rt as s,At as t,Rs as u,qf as v,at as w,Xf as x,cl as y,Zf as z};
118
+ //# sourceMappingURL=index-BBFDilFH.js.map