@fonderie/vue-admin-screens 1.0.1 → 1.0.2

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.
package/dist/index.cjs CHANGED
@@ -1420,7 +1420,10 @@ var AdminShell = (0, import_vue14.defineComponent)({
1420
1420
  client: cc,
1421
1421
  ...props.environment !== void 0 ? { environment: props.environment } : {},
1422
1422
  "onSelect-config": (key) => editing.value = { kind: "config", key },
1423
- "onSelect-secret": (key) => editing.value = { kind: "secret", key }
1423
+ "onSelect-secret": (key) => editing.value = { kind: "secret", key },
1424
+ allowCreate: true,
1425
+ "onCreate-config": () => editing.value = { kind: "config", key: "" },
1426
+ "onCreate-secret": () => editing.value = { kind: "secret", key: "" }
1424
1427
  });
1425
1428
  }
1426
1429
  case "templates": {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.ts","../src/styles.ts","../src/screens/AdminLogScreen.ts","../src/screens/common.ts","../src/screens/AttentionScreen.ts","../src/screens/EnvironmentScreen.ts","../src/screens/DoctorScreen.ts","../src/screens/ModulesScreen.ts","../src/screens/RoutesScreen.ts","../src/screens/MigrationsScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts","../src/screens/CatalogScreen.ts","../src/screens/SubscriberScreen.ts","../src/screens/AuditScreen.ts"],"sourcesContent":["export type { AdminPage } from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tEnvironmentScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tMigrationsScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tAuditScreen,\n} from './screens';\n","import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { EnvironmentScreen } from './EnvironmentScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { MigrationsScreen } from './MigrationsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'environment', label: 'Environment' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string }\n\t| { kind: 'template'; type: string }\n\t| null;\n\nexport const AdminShell = defineComponent({\n\tname: 'FonderieAdminShell',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// Given ⇒ the Settings and Messaging pages appear. Construct them with\n\t\t// `prefix: '/_admin'` to go through the one token.\n\t\tconfigClient: { type: Object as PropType<ConfigAdminClient>, default: undefined },\n\t\tcourierClient: { type: Object as PropType<CourierAdminClient>, default: undefined },\n\t\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\t\tauthClient: { type: Object as PropType<AuthAdminClient>, default: undefined },\n\t\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\t\tbillingClient: { type: Object as PropType<BillingAdminClient>, default: undefined },\n\t\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\t\tauditClient: { type: Object as PropType<AuditAdminClient>, default: undefined },\n\t\tenvironment: { type: String, default: undefined },\n\t\t// Controlled navigation: pass `page` and listen to `navigate` to own the\n\t\t// URL. Omit `page` and the shell keeps it itself.\n\t\tpage: { type: String as PropType<AdminPage>, default: undefined },\n\t},\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit }) {\n\t\tconst own = ref<AdminPage>('attention');\n\t\tconst current = computed(() => props.page ?? own.value);\n\t\tconst editing = ref<Editing>(null);\n\t\tconst go = (p: AdminPage) => {\n\t\t\tediting.value = null;\n\t\t\temit('navigate', p);\n\t\t\tif (props.page === undefined) own.value = p;\n\t\t};\n\t\tconst back = () =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ type: 'button', style: styles.button, onClick: () => (editing.value = null) },\n\t\t\t\t'← Back',\n\t\t\t);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c });\n\t\t\t\tcase 'environment':\n\t\t\t\t\treturn h(EnvironmentScreen, { client: c });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c });\n\t\t\t\tcase 'migrations':\n\t\t\t\t\treturn h(MigrationsScreen, { client: c });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c });\n\t\t\t\tcase 'catalog':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(CatalogScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to see the catalog here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'subscriber':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(SubscriberScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to look up subscribers here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'audit':\n\t\t\t\t\treturn props.auditClient\n\t\t\t\t\t\t? h(AuditScreen, { client: props.auditClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass an AuditAdminClient to see the audit trail here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, { client: props.authClient })\n\t\t\t\t\t\t: h('p', { style: styles.status }, 'Pass an AuthAdminClient to look up users here.');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a ConfigAdminClient to manage config and secrets here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && e.kind !== 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\tkind: e.kind,\n\t\t\t\t\t\t\t\tconfigKey: e.key,\n\t\t\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(ConfigListScreen, {\n\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string) => (editing.value = { kind: 'config', key }),\n\t\t\t\t\t\t'onSelect-secret': (key: string) => (editing.value = { kind: 'secret', key }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tconst kc = props.courierClient;\n\t\t\t\t\tif (!kc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a CourierAdminClient to manage templates here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template', type: t.type }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn () =>\n\t\t\th('div', { style: styles.shell }, [\n\t\t\t\th(\n\t\t\t\t\t'nav',\n\t\t\t\t\t{ style: styles.nav, 'aria-label': 'Admin' },\n\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\tconst items = g.items.filter(\n\t\t\t\t\t\t\t(i) =>\n\t\t\t\t\t\t\t\t!i.needs ||\n\t\t\t\t\t\t\t\t(i.needs === 'config'\n\t\t\t\t\t\t\t\t\t? props.configClient\n\t\t\t\t\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t\t\t\t\t: i.needs === 'auth'\n\t\t\t\t\t\t\t\t\t\t\t? props.authClient\n\t\t\t\t\t\t\t\t\t\t\t: i.needs === 'billing'\n\t\t\t\t\t\t\t\t\t\t\t\t? props.billingClient\n\t\t\t\t\t\t\t\t\t\t\t\t: props.auditClient),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\th('div', { style: styles.navGroup }, g.group),\n\t\t\t\t\t\t\t...items.map((i) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.navItem,\n\t\t\t\t\t\t\t\t\t\t\t...(current.value === i.page ? styles.navItemActive : {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-current': current.value === i.page ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\tonClick: () => go(i.page),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ti.label,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\th('main', { style: styles.main }, body()),\n\t\t\t]);\n\t},\n});\n","import type { CSSProperties } from 'vue';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\n//\n// Colours, type and radii come from `var(--fonderie-*)`, the organisation's\n// design tokens, declared once in the served shell (@fonderie/admin's\n// ui/html.ts). Inline styles take CSS variables, so this needs no stylesheet,\n// no build step and no class plumbing — and light/dark follow the tokens\n// without a single conditional here.\n//\n// Every var carries a FALLBACK. These screens are published packages: a\n// consumer importing them into their own app has no Fonderie shell and\n// therefore none of these variables, and `color: var(--fonderie-text)` with\n// nothing behind it resolves to nothing — black text on black, or invisible\n// borders. The fallbacks are the light palette, so an embedded screen still\n// renders correctly and simply is not themed.\nconst t = {\n\ttext: 'var(--fonderie-text,#171717)',\n\tmuted: 'var(--fonderie-text-muted,#5c5c5c)',\n\tbg: 'var(--fonderie-bg,#fafafa)',\n\tsurface: 'var(--fonderie-surface,#fff)',\n\tsurfaceAlt: 'var(--fonderie-surface-alt,#fafafa)',\n\tborder: 'var(--fonderie-border,#e0e0e0)',\n\tborderLight: 'var(--fonderie-border-light,#f5f5f5)',\n\taccent: 'var(--fonderie-accent,#00d294)',\n\taccentStrong: 'var(--fonderie-accent-strong,#009767)',\n\twarning: 'var(--fonderie-warning,#f5a623)',\n\tdanger: 'var(--fonderie-danger,#e00)',\n\tfont: 'var(--fonderie-font,Inter,\"Inter Fallback\",-apple-system,BlinkMacSystemFont,\"Helvetica Neue\",system-ui,sans-serif)',\n\tmono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace)',\n\tradius: 'var(--fonderie-radius,4px)',\n\tradiusLg: 'var(--fonderie-radius-lg,8px)',\n\ttrackingDisplay: 'var(--fonderie-tracking-display,-0.05em)',\n\tshadowCard: 'var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))',\n} as const;\n\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// The sidebar sits on the raised surface against the page canvas, which is\n\t// what separates the two without a heavy rule between them.\n\tnav: {\n\t\twidth: 220,\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tpadding: 16,\n\t\tflexShrink: 0,\n\t\tbackground: t.surface,\n\t},\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 0 6px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: t.radius,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t},\n\tnavItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: {\n\t\tfontSize: 20,\n\t\tfontWeight: 600,\n\t\tmarginTop: 0,\n\t\tmarginBottom: 12,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 24,\n\t\tmarginBottom: 8,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tstatus: { padding: 12, color: t.muted },\n\terror: { color: t.danger, marginBottom: 12, fontSize: 14 },\n\tok: { color: t.accentStrong, fontWeight: 600 },\n\tbad: { color: t.danger, fontWeight: 600 },\n\tadvice: { color: t.warning },\n\tmuted: { color: t.muted, fontSize: 13 },\n\tmono: { fontFamily: t.mono, fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: t.muted,\n\t},\n\ttd: { borderBottom: `1px solid ${t.borderLight}`, padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t},\n\tbutton: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radius,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tboxShadow: t.shadowCard,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n\t// Surfaces the screens compose themselves, kept here so a card looks the\n\t// same on every page rather than being re-invented per screen.\n\tcard: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: 16,\n\t\tboxShadow: t.shadowCard,\n\t},\n\taccent: { color: t.accent },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\nexport const AdminLogScreen = defineComponent({\n\tname: 'FonderieAdminLogScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(props.client, {\n\t\t\tlimit: props.pageSize,\n\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Admin log'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404\n\t\t\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t['When', 'Actor', 'Request', 'Status', 'Module'],\n\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\ttd(new Date(e.at).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\ttd(`${e.method} ${e.path}`, styles.mono),\n\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.status >= 400 ? styles.bad : styles.ok },\n\t\t\t\t\t\t\t\t\t\t\t\tString(e.status),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${e.durationMs} ms`),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '12px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t],\n\t\t\t]);\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { Ref, VNode } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\n\n// Shared frame: title (+ toolbar), then loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: Ref<boolean>; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: VNode[] = [],\n\toptions: { loadingText?: string; errorText?: (e: FonderieApiError) => string } = {},\n): VNode {\n\tconst body = state.isLoading.value\n\t\t? h('p', { style: styles.status }, options.loadingText ?? 'Loading…')\n\t\t: state.error.value\n\t\t\t? h(\n\t\t\t\t\t'p',\n\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t(options.errorText ?? ((e) => e.explanation))(state.error.value),\n\t\t\t\t)\n\t\t\t: content();\n\treturn h('div', { style: styles.container }, [\n\t\th('div', { style: styles.toolbar }, [\n\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, title),\n\t\t\t...toolbar,\n\t\t]),\n\t\tbody,\n\t]);\n}\n\nexport function table(headers: string[], rows: VNode[]): VNode {\n\treturn h('table', { style: styles.table }, [\n\t\th('thead', [\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\theaders.map((t) => h('th', { style: styles.th }, t)),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNode | string | (VNode | string)[], extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children);\n\nexport const refreshButton = (label: string, disabled: boolean, onClick: () => void) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, label);\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Attention',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst a = attention.value;\n\t\t\t\t\tif (!a) return null;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.ok },\n\t\t\t\t\t\t\t`Nothing needs you. Checked ${new Date(a.generatedAt).toLocaleString()}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\ta.items.map((item) =>\n\t\t\t\t\t\t\th('li', { key: `${item.source}:${item.message}`, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: item.severity === 'error' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\t\titem.severity,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, item.source),\n\t\t\t\t\t\t\t\t` — ${item.message}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const EnvironmentScreen = defineComponent({\n\tname: 'FonderieEnvironmentScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminEnvironment(props.client);\n\t\treturn () =>\n\t\t\tpage('Configuration', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Readiness'),\n\t\t\t\t\th(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.modules.map((m) =>\n\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t...(m.problems.length === 0\n\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.ok }, 'ok')]\n\t\t\t\t\t\t\t\t\t: m.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Environment'),\n\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No variables declared — pass `env` to AdminModule.')\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.env.map((e) =>\n\t\t\t\t\t\t\t\t\th('li', { key: e.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.name),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: e.set ? styles.ok : styles.bad }, e.set ? 'set' : 'missing'),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Doctor',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('li', { key: c.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\tc.skipped ? 'skipped' : c.ok ? 'ok' : 'failed',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, c.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${c.module} · ${c.durationMs} ms`),\n\t\t\t\t\t\t\t\tc.skipped ? h('div', { style: styles.muted }, c.skipped) : null,\n\t\t\t\t\t\t\t\t...c.findings.map((f) =>\n\t\t\t\t\t\t\t\t\th('div', { key: f, style: c.ok ? styles.advice : styles.bad }, f),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton('Run again', isLoading.value, () => void refresh()),\n\t\t\t\t\treport.value && !isLoading.value\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: report.value.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\treport.value.ok ? 'all checks pass' : 'a check failed',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('span'),\n\t\t\t\t],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () =>\n\t\t\tpage('Modules', { isLoading, error }, () => {\n\t\t\t\tconst m = manifest.value;\n\t\t\t\tif (!m) return null;\n\t\t\t\treturn [\n\t\t\t\t\th(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t`${m.env} · admin ${m.admin.version} · admin log ${m.admin.log ? 'on' : 'off'} · ${m.routes.length} routes`,\n\t\t\t\t\t),\n\t\t\t\t\ttable(\n\t\t\t\t\t\t['Module', 'Version', 'Readiness', 'Describes admin'],\n\t\t\t\t\t\tm.modules.map((mod) =>\n\t\t\t\t\t\t\th('tr', { key: mod.name }, [\n\t\t\t\t\t\t\t\ttd(mod.name, styles.mono),\n\t\t\t\t\t\t\t\ttd(mod.version ?? h('span', { style: styles.muted }, 'not reported')),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: mod.readiness.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'error',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...mod.readiness.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\ttd(mod.describesAdmin ? 'yes' : h('span', { style: styles.muted }, 'no')),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\treturn () =>\n\t\t\tpage('Routes', { isLoading, error }, () =>\n\t\t\t\ttable(\n\t\t\t\t\t['Method', 'Path', 'Guard', 'Module'],\n\t\t\t\t\t(report.value?.routes ?? []).map((r) =>\n\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\ttd(r.method, styles.mono),\n\t\t\t\t\t\t\ttd(r.path, styles.mono),\n\t\t\t\t\t\t\ttd(h('span', { style: styles.badge }, r.guard)),\n\t\t\t\t\t\t\ttd(r.module ?? 'application', styles.muted),\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t},\n});\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/vue-admin';\nimport type { PropType, VNode } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport const MigrationsScreen = defineComponent({\n\tname: 'FonderieMigrationsScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(props.client);\n\n\t\tconst section = (m: IAdminMigrationModule, everApplied: boolean): VNode => {\n\t\t\tconst blocked = why(m, everApplied);\n\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\treturn h('section', { style: { marginBottom: '24px' } }, [\n\t\t\t\th('h2', { style: styles.subtitle }, `${m.name} — ${m.pending.length} pending`),\n\t\t\t\th(\n\t\t\t\t\t'ul',\n\t\t\t\t\tm.pending.map((p) =>\n\t\t\t\t\t\th('li', [\n\t\t\t\t\t\t\th('code', p.file),\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: p.impact === 'destructive' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\tp.impact,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tp.destructive.length > 0\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\tp.destructive.map((s) => h('li', [h('code', s.slice(0, 120))])),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tblocked\n\t\t\t\t\t? h('p', { style: styles.advice }, blocked)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\tdisabled: isLoading.value || !m.appliable,\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The composable already put any failure in `error` and\n\t\t\t\t\t\t\t\t\t\t// re-read the real state; nothing useful is left to do.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`Apply ${m.pending.length} migration${m.pending.length === 1 ? '' : 's'}`,\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Migrations',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\tconst behind = r.modules.filter((m) => m.pending.length > 0);\n\t\t\t\t\tif (behind.length === 0) return h('p', { style: styles.ok }, 'Every module is up to date.');\n\t\t\t\t\treturn [\n\t\t\t\t\t\tr.everApplied\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t{ style: styles.advice },\n\t\t\t\t\t\t\t\t\t'This database has never been migrated — treating it as a first install, so nothing is held back.',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t...behind.map((m) => section(m, r.everApplied)),\n\t\t\t\t\t].filter(Boolean) as VNode[];\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{\n\t\t\t\t\terrorText: (e) =>\n\t\t\t\t\t\te.status === 403\n\t\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t\t: e.explanation,\n\t\t\t\t},\n\t\t\t);\n\t},\n});\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport const TokensScreen = defineComponent({\n\tname: 'FonderieTokensScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(props.client);\n\t\tconst name = ref('');\n\t\tconst scopes = ref<AdminScope[]>(['read']);\n\t\tconst days = ref('');\n\t\tconst minted = ref<{ name: string; token: string } | null>(null);\n\t\tconst toggle = (s: AdminScope) =>\n\t\t\t(scopes.value = scopes.value.includes(s)\n\t\t\t\t? scopes.value.filter((x) => x !== s)\n\t\t\t\t: [...scopes.value, s]);\n\n\t\treturn () => {\n\t\t\tconst r = report.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Access'),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 401\n\t\t\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Root token'),\n\t\t\t\tr\n\t\t\t\t\t? h('p', [\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: r.admin.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\tr.admin.ok ? 'strong' : 'weak',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t...r.admin.problems.map((p) =>\n\t\t\t\t\t\t\t\th('div', { key: p.message, style: styles.bad }, p.message),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Issued tokens'),\n\t\t\t\tr?.issued === null\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t'Issuing is off — give AdminModule a store and run its migrations.',\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tminted.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.ok }, [\n\t\t\t\t\t\t\t\t\t\t'Copy this now — it is never shown again. ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, minted.value.token),\n\t\t\t\t\t\t\t\t\t\t` (${minted.value.name})`,\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tconst d = Number(days.value);\n\t\t\t\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\t\t\t\tname: name.value.trim(),\n\t\t\t\t\t\t\t\t\t\t\tscopes: scopes.value,\n\t\t\t\t\t\t\t\t\t\t\t...(days.value && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\t\t\t\tminted.value = { name: t.name, token: t.token };\n\t\t\t\t\t\t\t\t\t\t\t\tname.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\tdays.value = '';\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: name.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (name.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'name',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Name',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t...ALL.map((s) =>\n\t\t\t\t\t\t\t\t\t\th('label', { key: s, style: { ...styles.badge, cursor: 'pointer' } }, [\n\t\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t\t\t\t\t\t\t\tchecked: scopes.value.includes(s),\n\t\t\t\t\t\t\t\t\t\t\t\tonChange: () => toggle(s),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t` ${s}`,\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: days.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (days.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'days (optional)',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', width: '140px' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Days',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\tdisabled: !name.value.trim() || scopes.value.length === 0 || isLoading.value,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Issue',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tr?.issued && r.issued.length > 0\n\t\t\t\t\t\t\t\t? table(\n\t\t\t\t\t\t\t\t\t\t['Name', 'Scopes', 'Created', 'Expires', 'Last used', ''],\n\t\t\t\t\t\t\t\t\t\tr.issued.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt ? h('span', { style: styles.badge }, ' revoked') : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(t.scopes.join(', '), styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${new Date(t.createdAt).toLocaleDateString()} · ${t.createdBy}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Revoke',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'None issued.'),\n\t\t\t\t\t\t],\n\t\t\t\th('h2', { style: styles.subtitle }, 'Legacy per-brick tokens'),\n\t\t\t\tr && r.legacy.length === 0\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\"None — every brick's admin surface goes through this token.\",\n\t\t\t\t\t\t)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t(r?.legacy ?? []).map((l) =>\n\t\t\t\t\t\t\t\th('li', { key: l.module, style: styles.row }, [\n\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, l.module),\n\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'still registers its standalone routes with its own token (deprecated)',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\t},\n});\n","import { type AuthAdminClient, describeLocation } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// Who is signed up, and why can't this one log in. Lists on arrival — an\n// operator who must know an address before they can see anything cannot find\n// the account they are being asked about. Picking a row, or an exact email,\n// opens the account: live sessions, recent sign-ins, suspend and sign-out.\nexport const UsersScreen = defineComponent({\n\tname: 'FonderieUsersScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuthAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst selectedId = ref('');\n\t\tconst list = useAdminUsers(props.client, { limit: props.pageSize });\n\t\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\t\tprops.client,\n\t\t\t{ email, id: selectedId },\n\t\t);\n\t\tconst userId = computed(() => user.value?.id ?? null);\n\t\tconst sessions = useAdminUserSessions(props.client, userId);\n\t\tconst history = useAdminLoginHistory(props.client, userId, { limit: 20 });\n\t\tconst showList = computed(() => !email.value && !selectedId.value);\n\t\tconst yesNo = (v: boolean) =>\n\t\t\th('span', { style: v ? styles.ok : styles.muted }, v ? 'yes' : 'no');\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\t\tconst clear = () => {\n\t\t\temail.value = '';\n\t\t\tselectedId.value = '';\n\t\t\tinput.value = '';\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst u = user.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Users'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tselectedId.value = '';\n\t\t\t\t\t\t\temail.value = input.value.trim();\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\ttype: 'email',\n\t\t\t\t\t\t\tvalue: input.value,\n\t\t\t\t\t\t\tonInput: (e: Event) => (input.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: 'email address',\n\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': 'Email',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? refreshButton('Refresh', list.isLoading.value, () => void list.refresh())\n\t\t\t\t\t\t\t: refreshButton('← All users', false, clear),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tshowList.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.users.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No users yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Email', 'Name', 'Created', 'Status'],\n\t\t\t\t\t\t\t\t\t\tlist.users.value.map((u) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: u.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0 },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (selectedId.value = u.id),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tu.email,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${u.firstName ?? ''} ${u.lastName ?? ''}`.trim() ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(u.createdAt).toLocaleDateString()),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'suspended')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: u.deletedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'deleted')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'active'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404 ? 'No user with that email.' : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tu\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, [\n\t\t\t\t\t\t\t\tu.firstName || u.lastName ? `${u.firstName} ${u.lastName}`.trim() : u.email,\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\tu.suspended ? h('span', { style: styles.badge }, 'suspended') : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? h('span', { style: styles.badge }, 'deleted') : null,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\trow('id', h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow('email', [u.email, ' · verified ', yesNo(u.isEmailVerified)]),\n\t\t\t\t\t\t\t\t\trow('MFA', yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'provider',\n\t\t\t\t\t\t\t\t\t\t`${u.provider || 'password'}${u.hasPassword ? '' : ' · no password set'}`,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'last login',\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? new Date(u.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'never'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow('created', new Date(u.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t? refreshButton('Unsuspend', isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t: refreshButton('Suspend', isLoading.value, () => void suspend()),\n\t\t\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\t\t\t'Sign out everywhere',\n\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Live sessions'),\n\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.map((s) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, s.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(s.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, s.userAgent ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t\t`since ${new Date(s.createdAt).toLocaleString()}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Recent sign-ins'),\n\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None recorded.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\thistory.events.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.outcome === 'success' ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, e.method),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(e.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\te.location?.proxy || e.location?.hosting\n\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.bad }, e.location.proxy ? ' proxy/VPN' : ' hosting')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, new Date(e.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void history.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport const CatalogScreen = defineComponent({\n\tname: 'FonderieCatalogScreen',\n\tprops: { client: { type: Object as PropType<BillingAdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(props.client);\n\t\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\t\treturn () => {\n\t\t\tconst c = catalog.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Catalog'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tisLoading.value && !c ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\tc\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Configured (code)'),\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'pre',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--fonderie-surface-alt,#fafafa)',\n\t\t\t\t\t\t\t\t\t\tpadding: '12px',\n\t\t\t\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tJSON.stringify(c.configured, null, 2),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Stored (database)'),\n\t\t\t\t\t\t\tc.stored.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No stored plans.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Plan', 'Tier', 'Seats', 'Monthly', 'Yearly', 'Trial', ''],\n\t\t\t\t\t\t\t\t\t\tc.stored.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: p.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\th('strong', p.name),\n\t\t\t\t\t\t\t\t\t\t\t\t\tp.description ? h('div', { style: styles.muted }, p.description) : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(String(p.tier)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.seats == null ? '∞' : String(p.seats)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${money(p.pricing?.monthly)} ${p.pricing?.currency ?? ''}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(money(p.pricing?.yearly)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.trialDays ? `${p.trialDays} d` : '—'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Delete',\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport const SubscriberScreen = defineComponent({\n\tname: 'FonderieSubscriberScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst type = ref<SubscriberType>('user');\n\t\tconst idInput = ref('');\n\t\tconst subscriber = ref<{ type: SubscriberType; id: string } | null>(null);\n\t\tconst list = useAdminSubscribers(props.client, { limit: props.pageSize });\n\t\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\t\tuseAdminSubscriber(props.client, subscriber, { limit: 20 });\n\t\tconst open = (t: SubscriberType, id: string) => {\n\t\t\tgranted.value = null;\n\t\t\ttype.value = t;\n\t\t\tidInput.value = id;\n\t\t\tsubscriber.value = { type: t, id };\n\t\t};\n\t\tconst amount = ref('');\n\t\tconst note = ref('');\n\t\tconst granted = ref<string | null>(null);\n\t\tconst input = (model: { value: string }, placeholder: string, extra: object = {}) =>\n\t\t\th('input', {\n\t\t\t\tvalue: model.value,\n\t\t\t\tonInput: (e: Event) => (model.value = (e.target as HTMLInputElement).value),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text', ...extra },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tconst s = subscription.value;\n\t\t\tconst w = wallet.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Subscriber'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\tsubscriber.value = idInput.value.trim()\n\t\t\t\t\t\t\t\t? { type: type.value, id: idInput.value.trim() }\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'select',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: type.value,\n\t\t\t\t\t\t\t\tonChange: (e: Event) =>\n\t\t\t\t\t\t\t\t\t(type.value = (e.target as HTMLSelectElement).value as SubscriberType),\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t'aria-label': 'Type',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th('option', { value: 'user' }, 'user'),\n\t\t\t\t\t\t\t\th('option', { value: 'workspace' }, 'workspace'),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tinput(idInput, 'subscriber id', { minWidth: '280px' }),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tsubscriber.value\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\tsubscriber.value = null;\n\t\t\t\t\t\t\t\t\t\t\tidInput.value = '';\n\t\t\t\t\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'← All subscribers',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tdisabled: list.isLoading.value,\n\t\t\t\t\t\t\t\t\t\tonClick: () => void list.refresh(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'Refresh',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\t!subscriber.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.subscriptions.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No subscribers yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Subscriber', 'Plan', 'Status', 'Renews'],\n\t\t\t\t\t\t\t\t\t\tlist.subscriptions.value.map((sub) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: sub.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0, ...styles.mono },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => open(sub.subscriberType, sub.subscriberId),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`${sub.subscriberType}/${sub.subscriberId}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${sub.plan} · ${sub.interval}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.cancelAtPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [sub.status, ' ', h('span', { style: styles.badge }, 'cancels')]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: sub.status,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? new Date(sub.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tsubscriber.value && !isLoading.value\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Subscription'),\n\t\t\t\t\t\t\ts\n\t\t\t\t\t\t\t\t? h('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('plan'), td([h('strong', s.plan), ` · ${s.interval}`])]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('status'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${s.status}${s.cancelAtPeriodEnd ? ' · cancels at period end' : ''}`),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('period'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${s.currentPeriodStart ? new Date(s.currentPeriodStart).toLocaleDateString() : '—'} → ${s.currentPeriodEnd ? new Date(s.currentPeriodEnd).toLocaleDateString() : '—'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('provider'), td(s.providerSubscriptionId ?? '—', styles.mono)]),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'No subscription.'),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Wallet'),\n\t\t\t\t\t\t\tw\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\th('p', [\n\t\t\t\t\t\t\t\t\t\t\th('strong', w.balance),\n\t\t\t\t\t\t\t\t\t\t\t` ${w.currency} `,\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t`(granted ${w.granted ?? '0'} · purchased ${w.purchased ?? '0'}) · minor units, precision ${w.precision}`,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst sub = subscriber.value;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!sub) return;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${sub.type}-${sub.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst amt = amount.value.trim();\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount: amt,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(note.value ? { description: note.value } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgranted.value = `Granted ${amt} ${w.currency}.`;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnote.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\tinput(amount, 'amount (minor units)'),\n\t\t\t\t\t\t\t\t\t\t\t\tinput(note, 'reason (optional)', { minWidth: '220px' }),\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: !/^\\d+$/.test(amount.value.trim()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Grant',\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tgranted.value ? h('span', { style: styles.ok }, granted.value) : null,\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Ledger'),\n\t\t\t\t\t\t\t\t\t\tledger.value.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing moved yet.')\n\t\t\t\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t\t\t\t['When', 'Kind', 'Amount', 'Note'],\n\t\t\t\t\t\t\t\t\t\t\t\t\tledger.value.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(t.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.type),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.amount, styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.description ?? '', styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\thasMoreLedger.value\n\t\t\t\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMoreLedger(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'No wallet — billing has no wallet configuration.',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { AuditAdminClient, IAdminAuditQuery } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport const AuditScreen = defineComponent({\n\tname: 'FonderieAuditScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuditAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst draft = ref({ workspaceId: '', type: '', actorId: '' });\n\t\tconst query = ref<Omit<IAdminAuditQuery, 'cursor'>>({ limit: props.pageSize });\n\t\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(\n\t\t\tprops.client,\n\t\t\tquery,\n\t\t);\n\t\tconst field = (key: 'workspaceId' | 'type' | 'actorId', placeholder: string) =>\n\t\t\th('input', {\n\t\t\t\tvalue: draft.value[key],\n\t\t\t\tonInput: (e: Event) =>\n\t\t\t\t\t(draft.value = { ...draft.value, [key]: (e.target as HTMLInputElement).value }),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Audit'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = draft.value;\n\t\t\t\t\t\t\tquery.value = {\n\t\t\t\t\t\t\t\tlimit: props.pageSize,\n\t\t\t\t\t\t\t\t...(d.workspaceId.trim() ? { workspaceId: d.workspaceId.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.type.trim() ? { type: d.type.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.actorId.trim() ? { actorId: d.actorId.trim() } : {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\tfield('workspaceId', 'workspace id (all if empty)'),\n\t\t\t\t\t\tfield('type', 'event type'),\n\t\t\t\t\t\tfield('actorId', 'actor id'),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Filter',\n\t\t\t\t\t\t),\n\t\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tevents.value.length === 0 && !isLoading.value\n\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing recorded for this filter.')\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t['When', 'Type', 'Workspace', 'Actor', 'Request'],\n\t\t\t\t\t\t\tevents.value.map((e) =>\n\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\ttd(new Date(e.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\ttd(e.type, styles.mono),\n\t\t\t\t\t\t\t\t\ttd(String(e.payload['workspaceId'] ?? '—'), styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.actorId ?? '—', styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.requestId ?? '', styles.muted),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t]);\n\t},\n});\n"],"mappings":"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","names":["import_vue","import_vue","t","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","t","import_vue_admin","import_vue","u","import_vue_admin","import_vue","import_vue_admin","import_vue","t","import_vue_admin","import_vue","t"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.ts","../src/styles.ts","../src/screens/AdminLogScreen.ts","../src/screens/common.ts","../src/screens/AttentionScreen.ts","../src/screens/EnvironmentScreen.ts","../src/screens/DoctorScreen.ts","../src/screens/ModulesScreen.ts","../src/screens/RoutesScreen.ts","../src/screens/MigrationsScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts","../src/screens/CatalogScreen.ts","../src/screens/SubscriberScreen.ts","../src/screens/AuditScreen.ts"],"sourcesContent":["export type { AdminPage } from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tEnvironmentScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tMigrationsScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tAuditScreen,\n} from './screens';\n","import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { EnvironmentScreen } from './EnvironmentScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { MigrationsScreen } from './MigrationsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'environment', label: 'Environment' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string }\n\t| { kind: 'template'; type: string }\n\t| null;\n\nexport const AdminShell = defineComponent({\n\tname: 'FonderieAdminShell',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// Given ⇒ the Settings and Messaging pages appear. Construct them with\n\t\t// `prefix: '/_admin'` to go through the one token.\n\t\tconfigClient: { type: Object as PropType<ConfigAdminClient>, default: undefined },\n\t\tcourierClient: { type: Object as PropType<CourierAdminClient>, default: undefined },\n\t\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\t\tauthClient: { type: Object as PropType<AuthAdminClient>, default: undefined },\n\t\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\t\tbillingClient: { type: Object as PropType<BillingAdminClient>, default: undefined },\n\t\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\t\tauditClient: { type: Object as PropType<AuditAdminClient>, default: undefined },\n\t\tenvironment: { type: String, default: undefined },\n\t\t// Controlled navigation: pass `page` and listen to `navigate` to own the\n\t\t// URL. Omit `page` and the shell keeps it itself.\n\t\tpage: { type: String as PropType<AdminPage>, default: undefined },\n\t},\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit }) {\n\t\tconst own = ref<AdminPage>('attention');\n\t\tconst current = computed(() => props.page ?? own.value);\n\t\tconst editing = ref<Editing>(null);\n\t\tconst go = (p: AdminPage) => {\n\t\t\tediting.value = null;\n\t\t\temit('navigate', p);\n\t\t\tif (props.page === undefined) own.value = p;\n\t\t};\n\t\tconst back = () =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ type: 'button', style: styles.button, onClick: () => (editing.value = null) },\n\t\t\t\t'← Back',\n\t\t\t);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c });\n\t\t\t\tcase 'environment':\n\t\t\t\t\treturn h(EnvironmentScreen, { client: c });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c });\n\t\t\t\tcase 'migrations':\n\t\t\t\t\treturn h(MigrationsScreen, { client: c });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c });\n\t\t\t\tcase 'catalog':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(CatalogScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to see the catalog here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'subscriber':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(SubscriberScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to look up subscribers here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'audit':\n\t\t\t\t\treturn props.auditClient\n\t\t\t\t\t\t? h(AuditScreen, { client: props.auditClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass an AuditAdminClient to see the audit trail here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, { client: props.authClient })\n\t\t\t\t\t\t: h('p', { style: styles.status }, 'Pass an AuthAdminClient to look up users here.');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a ConfigAdminClient to manage config and secrets here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && e.kind !== 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\tkind: e.kind,\n\t\t\t\t\t\t\t\tconfigKey: e.key,\n\t\t\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(ConfigListScreen, {\n\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string) => (editing.value = { kind: 'config', key }),\n\t\t\t\t\t\t'onSelect-secret': (key: string) => (editing.value = { kind: 'secret', key }),\n\t\t\t\t\t\tallowCreate: true,\n\t\t\t\t\t\t'onCreate-config': () => (editing.value = { kind: 'config', key: '' }),\n\t\t\t\t\t\t'onCreate-secret': () => (editing.value = { kind: 'secret', key: '' }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tconst kc = props.courierClient;\n\t\t\t\t\tif (!kc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a CourierAdminClient to manage templates here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template', type: t.type }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn () =>\n\t\t\th('div', { style: styles.shell }, [\n\t\t\t\th(\n\t\t\t\t\t'nav',\n\t\t\t\t\t{ style: styles.nav, 'aria-label': 'Admin' },\n\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\tconst items = g.items.filter(\n\t\t\t\t\t\t\t(i) =>\n\t\t\t\t\t\t\t\t!i.needs ||\n\t\t\t\t\t\t\t\t(i.needs === 'config'\n\t\t\t\t\t\t\t\t\t? props.configClient\n\t\t\t\t\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t\t\t\t\t: i.needs === 'auth'\n\t\t\t\t\t\t\t\t\t\t\t? props.authClient\n\t\t\t\t\t\t\t\t\t\t\t: i.needs === 'billing'\n\t\t\t\t\t\t\t\t\t\t\t\t? props.billingClient\n\t\t\t\t\t\t\t\t\t\t\t\t: props.auditClient),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\th('div', { style: styles.navGroup }, g.group),\n\t\t\t\t\t\t\t...items.map((i) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.navItem,\n\t\t\t\t\t\t\t\t\t\t\t...(current.value === i.page ? styles.navItemActive : {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-current': current.value === i.page ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\tonClick: () => go(i.page),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ti.label,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\th('main', { style: styles.main }, body()),\n\t\t\t]);\n\t},\n});\n","import type { CSSProperties } from 'vue';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\n//\n// Colours, type and radii come from `var(--fonderie-*)`, the organisation's\n// design tokens, declared once in the served shell (@fonderie/admin's\n// ui/html.ts). Inline styles take CSS variables, so this needs no stylesheet,\n// no build step and no class plumbing — and light/dark follow the tokens\n// without a single conditional here.\n//\n// Every var carries a FALLBACK. These screens are published packages: a\n// consumer importing them into their own app has no Fonderie shell and\n// therefore none of these variables, and `color: var(--fonderie-text)` with\n// nothing behind it resolves to nothing — black text on black, or invisible\n// borders. The fallbacks are the light palette, so an embedded screen still\n// renders correctly and simply is not themed.\nconst t = {\n\ttext: 'var(--fonderie-text,#171717)',\n\tmuted: 'var(--fonderie-text-muted,#5c5c5c)',\n\tbg: 'var(--fonderie-bg,#fafafa)',\n\tsurface: 'var(--fonderie-surface,#fff)',\n\tsurfaceAlt: 'var(--fonderie-surface-alt,#fafafa)',\n\tborder: 'var(--fonderie-border,#e0e0e0)',\n\tborderLight: 'var(--fonderie-border-light,#f5f5f5)',\n\taccent: 'var(--fonderie-accent,#00d294)',\n\taccentStrong: 'var(--fonderie-accent-strong,#009767)',\n\twarning: 'var(--fonderie-warning,#f5a623)',\n\tdanger: 'var(--fonderie-danger,#e00)',\n\tfont: 'var(--fonderie-font,Inter,\"Inter Fallback\",-apple-system,BlinkMacSystemFont,\"Helvetica Neue\",system-ui,sans-serif)',\n\tmono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace)',\n\tradius: 'var(--fonderie-radius,4px)',\n\tradiusLg: 'var(--fonderie-radius-lg,8px)',\n\ttrackingDisplay: 'var(--fonderie-tracking-display,-0.05em)',\n\tshadowCard: 'var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))',\n} as const;\n\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// The sidebar sits on the raised surface against the page canvas, which is\n\t// what separates the two without a heavy rule between them.\n\tnav: {\n\t\twidth: 220,\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tpadding: 16,\n\t\tflexShrink: 0,\n\t\tbackground: t.surface,\n\t},\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 0 6px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: t.radius,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t},\n\tnavItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: {\n\t\tfontSize: 20,\n\t\tfontWeight: 600,\n\t\tmarginTop: 0,\n\t\tmarginBottom: 12,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 24,\n\t\tmarginBottom: 8,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tstatus: { padding: 12, color: t.muted },\n\terror: { color: t.danger, marginBottom: 12, fontSize: 14 },\n\tok: { color: t.accentStrong, fontWeight: 600 },\n\tbad: { color: t.danger, fontWeight: 600 },\n\tadvice: { color: t.warning },\n\tmuted: { color: t.muted, fontSize: 13 },\n\tmono: { fontFamily: t.mono, fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: t.muted,\n\t},\n\ttd: { borderBottom: `1px solid ${t.borderLight}`, padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t},\n\tbutton: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radius,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tboxShadow: t.shadowCard,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n\t// Surfaces the screens compose themselves, kept here so a card looks the\n\t// same on every page rather than being re-invented per screen.\n\tcard: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: 16,\n\t\tboxShadow: t.shadowCard,\n\t},\n\taccent: { color: t.accent },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\nexport const AdminLogScreen = defineComponent({\n\tname: 'FonderieAdminLogScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(props.client, {\n\t\t\tlimit: props.pageSize,\n\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Admin log'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404\n\t\t\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t['When', 'Actor', 'Request', 'Status', 'Module'],\n\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\ttd(new Date(e.at).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\ttd(`${e.method} ${e.path}`, styles.mono),\n\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.status >= 400 ? styles.bad : styles.ok },\n\t\t\t\t\t\t\t\t\t\t\t\tString(e.status),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${e.durationMs} ms`),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '12px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t],\n\t\t\t]);\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { Ref, VNode } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\n\n// Shared frame: title (+ toolbar), then loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: Ref<boolean>; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: VNode[] = [],\n\toptions: { loadingText?: string; errorText?: (e: FonderieApiError) => string } = {},\n): VNode {\n\tconst body = state.isLoading.value\n\t\t? h('p', { style: styles.status }, options.loadingText ?? 'Loading…')\n\t\t: state.error.value\n\t\t\t? h(\n\t\t\t\t\t'p',\n\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t(options.errorText ?? ((e) => e.explanation))(state.error.value),\n\t\t\t\t)\n\t\t\t: content();\n\treturn h('div', { style: styles.container }, [\n\t\th('div', { style: styles.toolbar }, [\n\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, title),\n\t\t\t...toolbar,\n\t\t]),\n\t\tbody,\n\t]);\n}\n\nexport function table(headers: string[], rows: VNode[]): VNode {\n\treturn h('table', { style: styles.table }, [\n\t\th('thead', [\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\theaders.map((t) => h('th', { style: styles.th }, t)),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNode | string | (VNode | string)[], extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children);\n\nexport const refreshButton = (label: string, disabled: boolean, onClick: () => void) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, label);\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Attention',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst a = attention.value;\n\t\t\t\t\tif (!a) return null;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.ok },\n\t\t\t\t\t\t\t`Nothing needs you. Checked ${new Date(a.generatedAt).toLocaleString()}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\ta.items.map((item) =>\n\t\t\t\t\t\t\th('li', { key: `${item.source}:${item.message}`, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: item.severity === 'error' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\t\titem.severity,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, item.source),\n\t\t\t\t\t\t\t\t` — ${item.message}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const EnvironmentScreen = defineComponent({\n\tname: 'FonderieEnvironmentScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminEnvironment(props.client);\n\t\treturn () =>\n\t\t\tpage('Configuration', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Readiness'),\n\t\t\t\t\th(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.modules.map((m) =>\n\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t...(m.problems.length === 0\n\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.ok }, 'ok')]\n\t\t\t\t\t\t\t\t\t: m.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Environment'),\n\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No variables declared — pass `env` to AdminModule.')\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.env.map((e) =>\n\t\t\t\t\t\t\t\t\th('li', { key: e.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.name),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: e.set ? styles.ok : styles.bad }, e.set ? 'set' : 'missing'),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Doctor',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('li', { key: c.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\tc.skipped ? 'skipped' : c.ok ? 'ok' : 'failed',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, c.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${c.module} · ${c.durationMs} ms`),\n\t\t\t\t\t\t\t\tc.skipped ? h('div', { style: styles.muted }, c.skipped) : null,\n\t\t\t\t\t\t\t\t...c.findings.map((f) =>\n\t\t\t\t\t\t\t\t\th('div', { key: f, style: c.ok ? styles.advice : styles.bad }, f),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton('Run again', isLoading.value, () => void refresh()),\n\t\t\t\t\treport.value && !isLoading.value\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: report.value.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\treport.value.ok ? 'all checks pass' : 'a check failed',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('span'),\n\t\t\t\t],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () =>\n\t\t\tpage('Modules', { isLoading, error }, () => {\n\t\t\t\tconst m = manifest.value;\n\t\t\t\tif (!m) return null;\n\t\t\t\treturn [\n\t\t\t\t\th(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t`${m.env} · admin ${m.admin.version} · admin log ${m.admin.log ? 'on' : 'off'} · ${m.routes.length} routes`,\n\t\t\t\t\t),\n\t\t\t\t\ttable(\n\t\t\t\t\t\t['Module', 'Version', 'Readiness', 'Describes admin'],\n\t\t\t\t\t\tm.modules.map((mod) =>\n\t\t\t\t\t\t\th('tr', { key: mod.name }, [\n\t\t\t\t\t\t\t\ttd(mod.name, styles.mono),\n\t\t\t\t\t\t\t\ttd(mod.version ?? h('span', { style: styles.muted }, 'not reported')),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: mod.readiness.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'error',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...mod.readiness.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\ttd(mod.describesAdmin ? 'yes' : h('span', { style: styles.muted }, 'no')),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\treturn () =>\n\t\t\tpage('Routes', { isLoading, error }, () =>\n\t\t\t\ttable(\n\t\t\t\t\t['Method', 'Path', 'Guard', 'Module'],\n\t\t\t\t\t(report.value?.routes ?? []).map((r) =>\n\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\ttd(r.method, styles.mono),\n\t\t\t\t\t\t\ttd(r.path, styles.mono),\n\t\t\t\t\t\t\ttd(h('span', { style: styles.badge }, r.guard)),\n\t\t\t\t\t\t\ttd(r.module ?? 'application', styles.muted),\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t},\n});\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/vue-admin';\nimport type { PropType, VNode } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport const MigrationsScreen = defineComponent({\n\tname: 'FonderieMigrationsScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(props.client);\n\n\t\tconst section = (m: IAdminMigrationModule, everApplied: boolean): VNode => {\n\t\t\tconst blocked = why(m, everApplied);\n\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\treturn h('section', { style: { marginBottom: '24px' } }, [\n\t\t\t\th('h2', { style: styles.subtitle }, `${m.name} — ${m.pending.length} pending`),\n\t\t\t\th(\n\t\t\t\t\t'ul',\n\t\t\t\t\tm.pending.map((p) =>\n\t\t\t\t\t\th('li', [\n\t\t\t\t\t\t\th('code', p.file),\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: p.impact === 'destructive' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\tp.impact,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tp.destructive.length > 0\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\tp.destructive.map((s) => h('li', [h('code', s.slice(0, 120))])),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tblocked\n\t\t\t\t\t? h('p', { style: styles.advice }, blocked)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\tdisabled: isLoading.value || !m.appliable,\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The composable already put any failure in `error` and\n\t\t\t\t\t\t\t\t\t\t// re-read the real state; nothing useful is left to do.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`Apply ${m.pending.length} migration${m.pending.length === 1 ? '' : 's'}`,\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Migrations',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\tconst behind = r.modules.filter((m) => m.pending.length > 0);\n\t\t\t\t\tif (behind.length === 0) return h('p', { style: styles.ok }, 'Every module is up to date.');\n\t\t\t\t\treturn [\n\t\t\t\t\t\tr.everApplied\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t{ style: styles.advice },\n\t\t\t\t\t\t\t\t\t'This database has never been migrated — treating it as a first install, so nothing is held back.',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t...behind.map((m) => section(m, r.everApplied)),\n\t\t\t\t\t].filter(Boolean) as VNode[];\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{\n\t\t\t\t\terrorText: (e) =>\n\t\t\t\t\t\te.status === 403\n\t\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t\t: e.explanation,\n\t\t\t\t},\n\t\t\t);\n\t},\n});\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport const TokensScreen = defineComponent({\n\tname: 'FonderieTokensScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(props.client);\n\t\tconst name = ref('');\n\t\tconst scopes = ref<AdminScope[]>(['read']);\n\t\tconst days = ref('');\n\t\tconst minted = ref<{ name: string; token: string } | null>(null);\n\t\tconst toggle = (s: AdminScope) =>\n\t\t\t(scopes.value = scopes.value.includes(s)\n\t\t\t\t? scopes.value.filter((x) => x !== s)\n\t\t\t\t: [...scopes.value, s]);\n\n\t\treturn () => {\n\t\t\tconst r = report.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Access'),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 401\n\t\t\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Root token'),\n\t\t\t\tr\n\t\t\t\t\t? h('p', [\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: r.admin.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\tr.admin.ok ? 'strong' : 'weak',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t...r.admin.problems.map((p) =>\n\t\t\t\t\t\t\t\th('div', { key: p.message, style: styles.bad }, p.message),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Issued tokens'),\n\t\t\t\tr?.issued === null\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t'Issuing is off — give AdminModule a store and run its migrations.',\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tminted.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.ok }, [\n\t\t\t\t\t\t\t\t\t\t'Copy this now — it is never shown again. ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, minted.value.token),\n\t\t\t\t\t\t\t\t\t\t` (${minted.value.name})`,\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tconst d = Number(days.value);\n\t\t\t\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\t\t\t\tname: name.value.trim(),\n\t\t\t\t\t\t\t\t\t\t\tscopes: scopes.value,\n\t\t\t\t\t\t\t\t\t\t\t...(days.value && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\t\t\t\tminted.value = { name: t.name, token: t.token };\n\t\t\t\t\t\t\t\t\t\t\t\tname.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\tdays.value = '';\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: name.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (name.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'name',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Name',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t...ALL.map((s) =>\n\t\t\t\t\t\t\t\t\t\th('label', { key: s, style: { ...styles.badge, cursor: 'pointer' } }, [\n\t\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t\t\t\t\t\t\t\tchecked: scopes.value.includes(s),\n\t\t\t\t\t\t\t\t\t\t\t\tonChange: () => toggle(s),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t` ${s}`,\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: days.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (days.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'days (optional)',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', width: '140px' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Days',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\tdisabled: !name.value.trim() || scopes.value.length === 0 || isLoading.value,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Issue',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tr?.issued && r.issued.length > 0\n\t\t\t\t\t\t\t\t? table(\n\t\t\t\t\t\t\t\t\t\t['Name', 'Scopes', 'Created', 'Expires', 'Last used', ''],\n\t\t\t\t\t\t\t\t\t\tr.issued.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt ? h('span', { style: styles.badge }, ' revoked') : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(t.scopes.join(', '), styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${new Date(t.createdAt).toLocaleDateString()} · ${t.createdBy}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Revoke',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'None issued.'),\n\t\t\t\t\t\t],\n\t\t\t\th('h2', { style: styles.subtitle }, 'Legacy per-brick tokens'),\n\t\t\t\tr && r.legacy.length === 0\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\"None — every brick's admin surface goes through this token.\",\n\t\t\t\t\t\t)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t(r?.legacy ?? []).map((l) =>\n\t\t\t\t\t\t\t\th('li', { key: l.module, style: styles.row }, [\n\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, l.module),\n\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'still registers its standalone routes with its own token (deprecated)',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\t},\n});\n","import { type AuthAdminClient, describeLocation } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// Who is signed up, and why can't this one log in. Lists on arrival — an\n// operator who must know an address before they can see anything cannot find\n// the account they are being asked about. Picking a row, or an exact email,\n// opens the account: live sessions, recent sign-ins, suspend and sign-out.\nexport const UsersScreen = defineComponent({\n\tname: 'FonderieUsersScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuthAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst selectedId = ref('');\n\t\tconst list = useAdminUsers(props.client, { limit: props.pageSize });\n\t\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\t\tprops.client,\n\t\t\t{ email, id: selectedId },\n\t\t);\n\t\tconst userId = computed(() => user.value?.id ?? null);\n\t\tconst sessions = useAdminUserSessions(props.client, userId);\n\t\tconst history = useAdminLoginHistory(props.client, userId, { limit: 20 });\n\t\tconst showList = computed(() => !email.value && !selectedId.value);\n\t\tconst yesNo = (v: boolean) =>\n\t\t\th('span', { style: v ? styles.ok : styles.muted }, v ? 'yes' : 'no');\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\t\tconst clear = () => {\n\t\t\temail.value = '';\n\t\t\tselectedId.value = '';\n\t\t\tinput.value = '';\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst u = user.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Users'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tselectedId.value = '';\n\t\t\t\t\t\t\temail.value = input.value.trim();\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\ttype: 'email',\n\t\t\t\t\t\t\tvalue: input.value,\n\t\t\t\t\t\t\tonInput: (e: Event) => (input.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: 'email address',\n\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': 'Email',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? refreshButton('Refresh', list.isLoading.value, () => void list.refresh())\n\t\t\t\t\t\t\t: refreshButton('← All users', false, clear),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tshowList.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.users.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No users yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Email', 'Name', 'Created', 'Status'],\n\t\t\t\t\t\t\t\t\t\tlist.users.value.map((u) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: u.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0 },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (selectedId.value = u.id),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tu.email,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${u.firstName ?? ''} ${u.lastName ?? ''}`.trim() ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(u.createdAt).toLocaleDateString()),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'suspended')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: u.deletedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'deleted')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'active'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404 ? 'No user with that email.' : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tu\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, [\n\t\t\t\t\t\t\t\tu.firstName || u.lastName ? `${u.firstName} ${u.lastName}`.trim() : u.email,\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\tu.suspended ? h('span', { style: styles.badge }, 'suspended') : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? h('span', { style: styles.badge }, 'deleted') : null,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\trow('id', h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow('email', [u.email, ' · verified ', yesNo(u.isEmailVerified)]),\n\t\t\t\t\t\t\t\t\trow('MFA', yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'provider',\n\t\t\t\t\t\t\t\t\t\t`${u.provider || 'password'}${u.hasPassword ? '' : ' · no password set'}`,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'last login',\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? new Date(u.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'never'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow('created', new Date(u.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t? refreshButton('Unsuspend', isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t: refreshButton('Suspend', isLoading.value, () => void suspend()),\n\t\t\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\t\t\t'Sign out everywhere',\n\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Live sessions'),\n\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.map((s) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, s.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(s.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, s.userAgent ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t\t`since ${new Date(s.createdAt).toLocaleString()}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Recent sign-ins'),\n\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None recorded.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\thistory.events.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.outcome === 'success' ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, e.method),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(e.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\te.location?.proxy || e.location?.hosting\n\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.bad }, e.location.proxy ? ' proxy/VPN' : ' hosting')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, new Date(e.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void history.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport const CatalogScreen = defineComponent({\n\tname: 'FonderieCatalogScreen',\n\tprops: { client: { type: Object as PropType<BillingAdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(props.client);\n\t\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\t\treturn () => {\n\t\t\tconst c = catalog.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Catalog'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tisLoading.value && !c ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\tc\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Configured (code)'),\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'pre',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--fonderie-surface-alt,#fafafa)',\n\t\t\t\t\t\t\t\t\t\tpadding: '12px',\n\t\t\t\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tJSON.stringify(c.configured, null, 2),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Stored (database)'),\n\t\t\t\t\t\t\tc.stored.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No stored plans.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Plan', 'Tier', 'Seats', 'Monthly', 'Yearly', 'Trial', ''],\n\t\t\t\t\t\t\t\t\t\tc.stored.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: p.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\th('strong', p.name),\n\t\t\t\t\t\t\t\t\t\t\t\t\tp.description ? h('div', { style: styles.muted }, p.description) : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(String(p.tier)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.seats == null ? '∞' : String(p.seats)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${money(p.pricing?.monthly)} ${p.pricing?.currency ?? ''}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(money(p.pricing?.yearly)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.trialDays ? `${p.trialDays} d` : '—'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Delete',\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport const SubscriberScreen = defineComponent({\n\tname: 'FonderieSubscriberScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst type = ref<SubscriberType>('user');\n\t\tconst idInput = ref('');\n\t\tconst subscriber = ref<{ type: SubscriberType; id: string } | null>(null);\n\t\tconst list = useAdminSubscribers(props.client, { limit: props.pageSize });\n\t\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\t\tuseAdminSubscriber(props.client, subscriber, { limit: 20 });\n\t\tconst open = (t: SubscriberType, id: string) => {\n\t\t\tgranted.value = null;\n\t\t\ttype.value = t;\n\t\t\tidInput.value = id;\n\t\t\tsubscriber.value = { type: t, id };\n\t\t};\n\t\tconst amount = ref('');\n\t\tconst note = ref('');\n\t\tconst granted = ref<string | null>(null);\n\t\tconst input = (model: { value: string }, placeholder: string, extra: object = {}) =>\n\t\t\th('input', {\n\t\t\t\tvalue: model.value,\n\t\t\t\tonInput: (e: Event) => (model.value = (e.target as HTMLInputElement).value),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text', ...extra },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tconst s = subscription.value;\n\t\t\tconst w = wallet.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Subscriber'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\tsubscriber.value = idInput.value.trim()\n\t\t\t\t\t\t\t\t? { type: type.value, id: idInput.value.trim() }\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'select',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: type.value,\n\t\t\t\t\t\t\t\tonChange: (e: Event) =>\n\t\t\t\t\t\t\t\t\t(type.value = (e.target as HTMLSelectElement).value as SubscriberType),\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t'aria-label': 'Type',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th('option', { value: 'user' }, 'user'),\n\t\t\t\t\t\t\t\th('option', { value: 'workspace' }, 'workspace'),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tinput(idInput, 'subscriber id', { minWidth: '280px' }),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tsubscriber.value\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\tsubscriber.value = null;\n\t\t\t\t\t\t\t\t\t\t\tidInput.value = '';\n\t\t\t\t\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'← All subscribers',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tdisabled: list.isLoading.value,\n\t\t\t\t\t\t\t\t\t\tonClick: () => void list.refresh(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'Refresh',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\t!subscriber.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.subscriptions.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No subscribers yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Subscriber', 'Plan', 'Status', 'Renews'],\n\t\t\t\t\t\t\t\t\t\tlist.subscriptions.value.map((sub) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: sub.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0, ...styles.mono },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => open(sub.subscriberType, sub.subscriberId),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`${sub.subscriberType}/${sub.subscriberId}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${sub.plan} · ${sub.interval}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.cancelAtPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [sub.status, ' ', h('span', { style: styles.badge }, 'cancels')]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: sub.status,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? new Date(sub.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tsubscriber.value && !isLoading.value\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Subscription'),\n\t\t\t\t\t\t\ts\n\t\t\t\t\t\t\t\t? h('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('plan'), td([h('strong', s.plan), ` · ${s.interval}`])]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('status'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${s.status}${s.cancelAtPeriodEnd ? ' · cancels at period end' : ''}`),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('period'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${s.currentPeriodStart ? new Date(s.currentPeriodStart).toLocaleDateString() : '—'} → ${s.currentPeriodEnd ? new Date(s.currentPeriodEnd).toLocaleDateString() : '—'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('provider'), td(s.providerSubscriptionId ?? '—', styles.mono)]),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'No subscription.'),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Wallet'),\n\t\t\t\t\t\t\tw\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\th('p', [\n\t\t\t\t\t\t\t\t\t\t\th('strong', w.balance),\n\t\t\t\t\t\t\t\t\t\t\t` ${w.currency} `,\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t`(granted ${w.granted ?? '0'} · purchased ${w.purchased ?? '0'}) · minor units, precision ${w.precision}`,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst sub = subscriber.value;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!sub) return;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${sub.type}-${sub.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst amt = amount.value.trim();\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount: amt,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(note.value ? { description: note.value } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgranted.value = `Granted ${amt} ${w.currency}.`;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnote.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\tinput(amount, 'amount (minor units)'),\n\t\t\t\t\t\t\t\t\t\t\t\tinput(note, 'reason (optional)', { minWidth: '220px' }),\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: !/^\\d+$/.test(amount.value.trim()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Grant',\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tgranted.value ? h('span', { style: styles.ok }, granted.value) : null,\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Ledger'),\n\t\t\t\t\t\t\t\t\t\tledger.value.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing moved yet.')\n\t\t\t\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t\t\t\t['When', 'Kind', 'Amount', 'Note'],\n\t\t\t\t\t\t\t\t\t\t\t\t\tledger.value.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(t.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.type),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.amount, styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.description ?? '', styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\thasMoreLedger.value\n\t\t\t\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMoreLedger(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'No wallet — billing has no wallet configuration.',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { AuditAdminClient, IAdminAuditQuery } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport const AuditScreen = defineComponent({\n\tname: 'FonderieAuditScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuditAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst draft = ref({ workspaceId: '', type: '', actorId: '' });\n\t\tconst query = ref<Omit<IAdminAuditQuery, 'cursor'>>({ limit: props.pageSize });\n\t\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(\n\t\t\tprops.client,\n\t\t\tquery,\n\t\t);\n\t\tconst field = (key: 'workspaceId' | 'type' | 'actorId', placeholder: string) =>\n\t\t\th('input', {\n\t\t\t\tvalue: draft.value[key],\n\t\t\t\tonInput: (e: Event) =>\n\t\t\t\t\t(draft.value = { ...draft.value, [key]: (e.target as HTMLInputElement).value }),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Audit'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = draft.value;\n\t\t\t\t\t\t\tquery.value = {\n\t\t\t\t\t\t\t\tlimit: props.pageSize,\n\t\t\t\t\t\t\t\t...(d.workspaceId.trim() ? { workspaceId: d.workspaceId.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.type.trim() ? { type: d.type.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.actorId.trim() ? { actorId: d.actorId.trim() } : {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\tfield('workspaceId', 'workspace id (all if empty)'),\n\t\t\t\t\t\tfield('type', 'event type'),\n\t\t\t\t\t\tfield('actorId', 'actor id'),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Filter',\n\t\t\t\t\t\t),\n\t\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tevents.value.length === 0 && !isLoading.value\n\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing recorded for this filter.')\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t['When', 'Type', 'Workspace', 'Actor', 'Request'],\n\t\t\t\t\t\t\tevents.value.map((e) =>\n\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\ttd(new Date(e.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\ttd(e.type, styles.mono),\n\t\t\t\t\t\t\t\t\ttd(String(e.payload['workspaceId'] ?? '—'), styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.actorId ?? '—', styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.requestId ?? '', styles.muted),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t]);\n\t},\n});\n"],"mappings":"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","names":["import_vue","import_vue","t","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","import_vue_admin","import_vue","t","import_vue_admin","import_vue","u","import_vue_admin","import_vue","import_vue_admin","import_vue","t","import_vue_admin","import_vue","t"]}
package/dist/index.js CHANGED
@@ -1387,7 +1387,10 @@ var AdminShell = defineComponent13({
1387
1387
  client: cc,
1388
1388
  ...props.environment !== void 0 ? { environment: props.environment } : {},
1389
1389
  "onSelect-config": (key) => editing.value = { kind: "config", key },
1390
- "onSelect-secret": (key) => editing.value = { kind: "secret", key }
1390
+ "onSelect-secret": (key) => editing.value = { kind: "secret", key },
1391
+ allowCreate: true,
1392
+ "onCreate-config": () => editing.value = { kind: "config", key: "" },
1393
+ "onCreate-secret": () => editing.value = { kind: "secret", key: "" }
1391
1394
  });
1392
1395
  }
1393
1396
  case "templates": {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/screens/AdminShell.ts","../src/styles.ts","../src/screens/AdminLogScreen.ts","../src/screens/common.ts","../src/screens/AttentionScreen.ts","../src/screens/EnvironmentScreen.ts","../src/screens/DoctorScreen.ts","../src/screens/ModulesScreen.ts","../src/screens/RoutesScreen.ts","../src/screens/MigrationsScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts","../src/screens/CatalogScreen.ts","../src/screens/SubscriberScreen.ts","../src/screens/AuditScreen.ts"],"sourcesContent":["import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { EnvironmentScreen } from './EnvironmentScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { MigrationsScreen } from './MigrationsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'environment', label: 'Environment' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string }\n\t| { kind: 'template'; type: string }\n\t| null;\n\nexport const AdminShell = defineComponent({\n\tname: 'FonderieAdminShell',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// Given ⇒ the Settings and Messaging pages appear. Construct them with\n\t\t// `prefix: '/_admin'` to go through the one token.\n\t\tconfigClient: { type: Object as PropType<ConfigAdminClient>, default: undefined },\n\t\tcourierClient: { type: Object as PropType<CourierAdminClient>, default: undefined },\n\t\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\t\tauthClient: { type: Object as PropType<AuthAdminClient>, default: undefined },\n\t\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\t\tbillingClient: { type: Object as PropType<BillingAdminClient>, default: undefined },\n\t\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\t\tauditClient: { type: Object as PropType<AuditAdminClient>, default: undefined },\n\t\tenvironment: { type: String, default: undefined },\n\t\t// Controlled navigation: pass `page` and listen to `navigate` to own the\n\t\t// URL. Omit `page` and the shell keeps it itself.\n\t\tpage: { type: String as PropType<AdminPage>, default: undefined },\n\t},\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit }) {\n\t\tconst own = ref<AdminPage>('attention');\n\t\tconst current = computed(() => props.page ?? own.value);\n\t\tconst editing = ref<Editing>(null);\n\t\tconst go = (p: AdminPage) => {\n\t\t\tediting.value = null;\n\t\t\temit('navigate', p);\n\t\t\tif (props.page === undefined) own.value = p;\n\t\t};\n\t\tconst back = () =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ type: 'button', style: styles.button, onClick: () => (editing.value = null) },\n\t\t\t\t'← Back',\n\t\t\t);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c });\n\t\t\t\tcase 'environment':\n\t\t\t\t\treturn h(EnvironmentScreen, { client: c });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c });\n\t\t\t\tcase 'migrations':\n\t\t\t\t\treturn h(MigrationsScreen, { client: c });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c });\n\t\t\t\tcase 'catalog':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(CatalogScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to see the catalog here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'subscriber':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(SubscriberScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to look up subscribers here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'audit':\n\t\t\t\t\treturn props.auditClient\n\t\t\t\t\t\t? h(AuditScreen, { client: props.auditClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass an AuditAdminClient to see the audit trail here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, { client: props.authClient })\n\t\t\t\t\t\t: h('p', { style: styles.status }, 'Pass an AuthAdminClient to look up users here.');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a ConfigAdminClient to manage config and secrets here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && e.kind !== 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\tkind: e.kind,\n\t\t\t\t\t\t\t\tconfigKey: e.key,\n\t\t\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(ConfigListScreen, {\n\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string) => (editing.value = { kind: 'config', key }),\n\t\t\t\t\t\t'onSelect-secret': (key: string) => (editing.value = { kind: 'secret', key }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tconst kc = props.courierClient;\n\t\t\t\t\tif (!kc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a CourierAdminClient to manage templates here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template', type: t.type }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn () =>\n\t\t\th('div', { style: styles.shell }, [\n\t\t\t\th(\n\t\t\t\t\t'nav',\n\t\t\t\t\t{ style: styles.nav, 'aria-label': 'Admin' },\n\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\tconst items = g.items.filter(\n\t\t\t\t\t\t\t(i) =>\n\t\t\t\t\t\t\t\t!i.needs ||\n\t\t\t\t\t\t\t\t(i.needs === 'config'\n\t\t\t\t\t\t\t\t\t? props.configClient\n\t\t\t\t\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t\t\t\t\t: i.needs === 'auth'\n\t\t\t\t\t\t\t\t\t\t\t? props.authClient\n\t\t\t\t\t\t\t\t\t\t\t: i.needs === 'billing'\n\t\t\t\t\t\t\t\t\t\t\t\t? props.billingClient\n\t\t\t\t\t\t\t\t\t\t\t\t: props.auditClient),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\th('div', { style: styles.navGroup }, g.group),\n\t\t\t\t\t\t\t...items.map((i) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.navItem,\n\t\t\t\t\t\t\t\t\t\t\t...(current.value === i.page ? styles.navItemActive : {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-current': current.value === i.page ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\tonClick: () => go(i.page),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ti.label,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\th('main', { style: styles.main }, body()),\n\t\t\t]);\n\t},\n});\n","import type { CSSProperties } from 'vue';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\n//\n// Colours, type and radii come from `var(--fonderie-*)`, the organisation's\n// design tokens, declared once in the served shell (@fonderie/admin's\n// ui/html.ts). Inline styles take CSS variables, so this needs no stylesheet,\n// no build step and no class plumbing — and light/dark follow the tokens\n// without a single conditional here.\n//\n// Every var carries a FALLBACK. These screens are published packages: a\n// consumer importing them into their own app has no Fonderie shell and\n// therefore none of these variables, and `color: var(--fonderie-text)` with\n// nothing behind it resolves to nothing — black text on black, or invisible\n// borders. The fallbacks are the light palette, so an embedded screen still\n// renders correctly and simply is not themed.\nconst t = {\n\ttext: 'var(--fonderie-text,#171717)',\n\tmuted: 'var(--fonderie-text-muted,#5c5c5c)',\n\tbg: 'var(--fonderie-bg,#fafafa)',\n\tsurface: 'var(--fonderie-surface,#fff)',\n\tsurfaceAlt: 'var(--fonderie-surface-alt,#fafafa)',\n\tborder: 'var(--fonderie-border,#e0e0e0)',\n\tborderLight: 'var(--fonderie-border-light,#f5f5f5)',\n\taccent: 'var(--fonderie-accent,#00d294)',\n\taccentStrong: 'var(--fonderie-accent-strong,#009767)',\n\twarning: 'var(--fonderie-warning,#f5a623)',\n\tdanger: 'var(--fonderie-danger,#e00)',\n\tfont: 'var(--fonderie-font,Inter,\"Inter Fallback\",-apple-system,BlinkMacSystemFont,\"Helvetica Neue\",system-ui,sans-serif)',\n\tmono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace)',\n\tradius: 'var(--fonderie-radius,4px)',\n\tradiusLg: 'var(--fonderie-radius-lg,8px)',\n\ttrackingDisplay: 'var(--fonderie-tracking-display,-0.05em)',\n\tshadowCard: 'var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))',\n} as const;\n\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// The sidebar sits on the raised surface against the page canvas, which is\n\t// what separates the two without a heavy rule between them.\n\tnav: {\n\t\twidth: 220,\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tpadding: 16,\n\t\tflexShrink: 0,\n\t\tbackground: t.surface,\n\t},\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 0 6px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: t.radius,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t},\n\tnavItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: {\n\t\tfontSize: 20,\n\t\tfontWeight: 600,\n\t\tmarginTop: 0,\n\t\tmarginBottom: 12,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 24,\n\t\tmarginBottom: 8,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tstatus: { padding: 12, color: t.muted },\n\terror: { color: t.danger, marginBottom: 12, fontSize: 14 },\n\tok: { color: t.accentStrong, fontWeight: 600 },\n\tbad: { color: t.danger, fontWeight: 600 },\n\tadvice: { color: t.warning },\n\tmuted: { color: t.muted, fontSize: 13 },\n\tmono: { fontFamily: t.mono, fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: t.muted,\n\t},\n\ttd: { borderBottom: `1px solid ${t.borderLight}`, padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t},\n\tbutton: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radius,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tboxShadow: t.shadowCard,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n\t// Surfaces the screens compose themselves, kept here so a card looks the\n\t// same on every page rather than being re-invented per screen.\n\tcard: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: 16,\n\t\tboxShadow: t.shadowCard,\n\t},\n\taccent: { color: t.accent },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\nexport const AdminLogScreen = defineComponent({\n\tname: 'FonderieAdminLogScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(props.client, {\n\t\t\tlimit: props.pageSize,\n\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Admin log'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404\n\t\t\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t['When', 'Actor', 'Request', 'Status', 'Module'],\n\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\ttd(new Date(e.at).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\ttd(`${e.method} ${e.path}`, styles.mono),\n\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.status >= 400 ? styles.bad : styles.ok },\n\t\t\t\t\t\t\t\t\t\t\t\tString(e.status),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${e.durationMs} ms`),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '12px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t],\n\t\t\t]);\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { Ref, VNode } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\n\n// Shared frame: title (+ toolbar), then loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: Ref<boolean>; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: VNode[] = [],\n\toptions: { loadingText?: string; errorText?: (e: FonderieApiError) => string } = {},\n): VNode {\n\tconst body = state.isLoading.value\n\t\t? h('p', { style: styles.status }, options.loadingText ?? 'Loading…')\n\t\t: state.error.value\n\t\t\t? h(\n\t\t\t\t\t'p',\n\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t(options.errorText ?? ((e) => e.explanation))(state.error.value),\n\t\t\t\t)\n\t\t\t: content();\n\treturn h('div', { style: styles.container }, [\n\t\th('div', { style: styles.toolbar }, [\n\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, title),\n\t\t\t...toolbar,\n\t\t]),\n\t\tbody,\n\t]);\n}\n\nexport function table(headers: string[], rows: VNode[]): VNode {\n\treturn h('table', { style: styles.table }, [\n\t\th('thead', [\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\theaders.map((t) => h('th', { style: styles.th }, t)),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNode | string | (VNode | string)[], extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children);\n\nexport const refreshButton = (label: string, disabled: boolean, onClick: () => void) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, label);\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Attention',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst a = attention.value;\n\t\t\t\t\tif (!a) return null;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.ok },\n\t\t\t\t\t\t\t`Nothing needs you. Checked ${new Date(a.generatedAt).toLocaleString()}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\ta.items.map((item) =>\n\t\t\t\t\t\t\th('li', { key: `${item.source}:${item.message}`, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: item.severity === 'error' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\t\titem.severity,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, item.source),\n\t\t\t\t\t\t\t\t` — ${item.message}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const EnvironmentScreen = defineComponent({\n\tname: 'FonderieEnvironmentScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminEnvironment(props.client);\n\t\treturn () =>\n\t\t\tpage('Configuration', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Readiness'),\n\t\t\t\t\th(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.modules.map((m) =>\n\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t...(m.problems.length === 0\n\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.ok }, 'ok')]\n\t\t\t\t\t\t\t\t\t: m.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Environment'),\n\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No variables declared — pass `env` to AdminModule.')\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.env.map((e) =>\n\t\t\t\t\t\t\t\t\th('li', { key: e.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.name),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: e.set ? styles.ok : styles.bad }, e.set ? 'set' : 'missing'),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Doctor',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('li', { key: c.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\tc.skipped ? 'skipped' : c.ok ? 'ok' : 'failed',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, c.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${c.module} · ${c.durationMs} ms`),\n\t\t\t\t\t\t\t\tc.skipped ? h('div', { style: styles.muted }, c.skipped) : null,\n\t\t\t\t\t\t\t\t...c.findings.map((f) =>\n\t\t\t\t\t\t\t\t\th('div', { key: f, style: c.ok ? styles.advice : styles.bad }, f),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton('Run again', isLoading.value, () => void refresh()),\n\t\t\t\t\treport.value && !isLoading.value\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: report.value.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\treport.value.ok ? 'all checks pass' : 'a check failed',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('span'),\n\t\t\t\t],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () =>\n\t\t\tpage('Modules', { isLoading, error }, () => {\n\t\t\t\tconst m = manifest.value;\n\t\t\t\tif (!m) return null;\n\t\t\t\treturn [\n\t\t\t\t\th(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t`${m.env} · admin ${m.admin.version} · admin log ${m.admin.log ? 'on' : 'off'} · ${m.routes.length} routes`,\n\t\t\t\t\t),\n\t\t\t\t\ttable(\n\t\t\t\t\t\t['Module', 'Version', 'Readiness', 'Describes admin'],\n\t\t\t\t\t\tm.modules.map((mod) =>\n\t\t\t\t\t\t\th('tr', { key: mod.name }, [\n\t\t\t\t\t\t\t\ttd(mod.name, styles.mono),\n\t\t\t\t\t\t\t\ttd(mod.version ?? h('span', { style: styles.muted }, 'not reported')),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: mod.readiness.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'error',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...mod.readiness.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\ttd(mod.describesAdmin ? 'yes' : h('span', { style: styles.muted }, 'no')),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\treturn () =>\n\t\t\tpage('Routes', { isLoading, error }, () =>\n\t\t\t\ttable(\n\t\t\t\t\t['Method', 'Path', 'Guard', 'Module'],\n\t\t\t\t\t(report.value?.routes ?? []).map((r) =>\n\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\ttd(r.method, styles.mono),\n\t\t\t\t\t\t\ttd(r.path, styles.mono),\n\t\t\t\t\t\t\ttd(h('span', { style: styles.badge }, r.guard)),\n\t\t\t\t\t\t\ttd(r.module ?? 'application', styles.muted),\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t},\n});\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/vue-admin';\nimport type { PropType, VNode } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport const MigrationsScreen = defineComponent({\n\tname: 'FonderieMigrationsScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(props.client);\n\n\t\tconst section = (m: IAdminMigrationModule, everApplied: boolean): VNode => {\n\t\t\tconst blocked = why(m, everApplied);\n\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\treturn h('section', { style: { marginBottom: '24px' } }, [\n\t\t\t\th('h2', { style: styles.subtitle }, `${m.name} — ${m.pending.length} pending`),\n\t\t\t\th(\n\t\t\t\t\t'ul',\n\t\t\t\t\tm.pending.map((p) =>\n\t\t\t\t\t\th('li', [\n\t\t\t\t\t\t\th('code', p.file),\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: p.impact === 'destructive' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\tp.impact,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tp.destructive.length > 0\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\tp.destructive.map((s) => h('li', [h('code', s.slice(0, 120))])),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tblocked\n\t\t\t\t\t? h('p', { style: styles.advice }, blocked)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\tdisabled: isLoading.value || !m.appliable,\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The composable already put any failure in `error` and\n\t\t\t\t\t\t\t\t\t\t// re-read the real state; nothing useful is left to do.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`Apply ${m.pending.length} migration${m.pending.length === 1 ? '' : 's'}`,\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Migrations',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\tconst behind = r.modules.filter((m) => m.pending.length > 0);\n\t\t\t\t\tif (behind.length === 0) return h('p', { style: styles.ok }, 'Every module is up to date.');\n\t\t\t\t\treturn [\n\t\t\t\t\t\tr.everApplied\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t{ style: styles.advice },\n\t\t\t\t\t\t\t\t\t'This database has never been migrated — treating it as a first install, so nothing is held back.',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t...behind.map((m) => section(m, r.everApplied)),\n\t\t\t\t\t].filter(Boolean) as VNode[];\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{\n\t\t\t\t\terrorText: (e) =>\n\t\t\t\t\t\te.status === 403\n\t\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t\t: e.explanation,\n\t\t\t\t},\n\t\t\t);\n\t},\n});\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport const TokensScreen = defineComponent({\n\tname: 'FonderieTokensScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(props.client);\n\t\tconst name = ref('');\n\t\tconst scopes = ref<AdminScope[]>(['read']);\n\t\tconst days = ref('');\n\t\tconst minted = ref<{ name: string; token: string } | null>(null);\n\t\tconst toggle = (s: AdminScope) =>\n\t\t\t(scopes.value = scopes.value.includes(s)\n\t\t\t\t? scopes.value.filter((x) => x !== s)\n\t\t\t\t: [...scopes.value, s]);\n\n\t\treturn () => {\n\t\t\tconst r = report.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Access'),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 401\n\t\t\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Root token'),\n\t\t\t\tr\n\t\t\t\t\t? h('p', [\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: r.admin.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\tr.admin.ok ? 'strong' : 'weak',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t...r.admin.problems.map((p) =>\n\t\t\t\t\t\t\t\th('div', { key: p.message, style: styles.bad }, p.message),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Issued tokens'),\n\t\t\t\tr?.issued === null\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t'Issuing is off — give AdminModule a store and run its migrations.',\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tminted.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.ok }, [\n\t\t\t\t\t\t\t\t\t\t'Copy this now — it is never shown again. ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, minted.value.token),\n\t\t\t\t\t\t\t\t\t\t` (${minted.value.name})`,\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tconst d = Number(days.value);\n\t\t\t\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\t\t\t\tname: name.value.trim(),\n\t\t\t\t\t\t\t\t\t\t\tscopes: scopes.value,\n\t\t\t\t\t\t\t\t\t\t\t...(days.value && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\t\t\t\tminted.value = { name: t.name, token: t.token };\n\t\t\t\t\t\t\t\t\t\t\t\tname.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\tdays.value = '';\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: name.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (name.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'name',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Name',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t...ALL.map((s) =>\n\t\t\t\t\t\t\t\t\t\th('label', { key: s, style: { ...styles.badge, cursor: 'pointer' } }, [\n\t\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t\t\t\t\t\t\t\tchecked: scopes.value.includes(s),\n\t\t\t\t\t\t\t\t\t\t\t\tonChange: () => toggle(s),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t` ${s}`,\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: days.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (days.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'days (optional)',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', width: '140px' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Days',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\tdisabled: !name.value.trim() || scopes.value.length === 0 || isLoading.value,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Issue',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tr?.issued && r.issued.length > 0\n\t\t\t\t\t\t\t\t? table(\n\t\t\t\t\t\t\t\t\t\t['Name', 'Scopes', 'Created', 'Expires', 'Last used', ''],\n\t\t\t\t\t\t\t\t\t\tr.issued.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt ? h('span', { style: styles.badge }, ' revoked') : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(t.scopes.join(', '), styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${new Date(t.createdAt).toLocaleDateString()} · ${t.createdBy}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Revoke',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'None issued.'),\n\t\t\t\t\t\t],\n\t\t\t\th('h2', { style: styles.subtitle }, 'Legacy per-brick tokens'),\n\t\t\t\tr && r.legacy.length === 0\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\"None — every brick's admin surface goes through this token.\",\n\t\t\t\t\t\t)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t(r?.legacy ?? []).map((l) =>\n\t\t\t\t\t\t\t\th('li', { key: l.module, style: styles.row }, [\n\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, l.module),\n\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'still registers its standalone routes with its own token (deprecated)',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\t},\n});\n","import { type AuthAdminClient, describeLocation } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// Who is signed up, and why can't this one log in. Lists on arrival — an\n// operator who must know an address before they can see anything cannot find\n// the account they are being asked about. Picking a row, or an exact email,\n// opens the account: live sessions, recent sign-ins, suspend and sign-out.\nexport const UsersScreen = defineComponent({\n\tname: 'FonderieUsersScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuthAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst selectedId = ref('');\n\t\tconst list = useAdminUsers(props.client, { limit: props.pageSize });\n\t\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\t\tprops.client,\n\t\t\t{ email, id: selectedId },\n\t\t);\n\t\tconst userId = computed(() => user.value?.id ?? null);\n\t\tconst sessions = useAdminUserSessions(props.client, userId);\n\t\tconst history = useAdminLoginHistory(props.client, userId, { limit: 20 });\n\t\tconst showList = computed(() => !email.value && !selectedId.value);\n\t\tconst yesNo = (v: boolean) =>\n\t\t\th('span', { style: v ? styles.ok : styles.muted }, v ? 'yes' : 'no');\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\t\tconst clear = () => {\n\t\t\temail.value = '';\n\t\t\tselectedId.value = '';\n\t\t\tinput.value = '';\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst u = user.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Users'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tselectedId.value = '';\n\t\t\t\t\t\t\temail.value = input.value.trim();\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\ttype: 'email',\n\t\t\t\t\t\t\tvalue: input.value,\n\t\t\t\t\t\t\tonInput: (e: Event) => (input.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: 'email address',\n\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': 'Email',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? refreshButton('Refresh', list.isLoading.value, () => void list.refresh())\n\t\t\t\t\t\t\t: refreshButton('← All users', false, clear),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tshowList.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.users.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No users yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Email', 'Name', 'Created', 'Status'],\n\t\t\t\t\t\t\t\t\t\tlist.users.value.map((u) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: u.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0 },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (selectedId.value = u.id),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tu.email,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${u.firstName ?? ''} ${u.lastName ?? ''}`.trim() ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(u.createdAt).toLocaleDateString()),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'suspended')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: u.deletedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'deleted')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'active'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404 ? 'No user with that email.' : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tu\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, [\n\t\t\t\t\t\t\t\tu.firstName || u.lastName ? `${u.firstName} ${u.lastName}`.trim() : u.email,\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\tu.suspended ? h('span', { style: styles.badge }, 'suspended') : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? h('span', { style: styles.badge }, 'deleted') : null,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\trow('id', h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow('email', [u.email, ' · verified ', yesNo(u.isEmailVerified)]),\n\t\t\t\t\t\t\t\t\trow('MFA', yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'provider',\n\t\t\t\t\t\t\t\t\t\t`${u.provider || 'password'}${u.hasPassword ? '' : ' · no password set'}`,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'last login',\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? new Date(u.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'never'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow('created', new Date(u.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t? refreshButton('Unsuspend', isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t: refreshButton('Suspend', isLoading.value, () => void suspend()),\n\t\t\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\t\t\t'Sign out everywhere',\n\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Live sessions'),\n\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.map((s) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, s.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(s.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, s.userAgent ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t\t`since ${new Date(s.createdAt).toLocaleString()}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Recent sign-ins'),\n\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None recorded.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\thistory.events.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.outcome === 'success' ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, e.method),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(e.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\te.location?.proxy || e.location?.hosting\n\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.bad }, e.location.proxy ? ' proxy/VPN' : ' hosting')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, new Date(e.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void history.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport const CatalogScreen = defineComponent({\n\tname: 'FonderieCatalogScreen',\n\tprops: { client: { type: Object as PropType<BillingAdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(props.client);\n\t\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\t\treturn () => {\n\t\t\tconst c = catalog.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Catalog'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tisLoading.value && !c ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\tc\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Configured (code)'),\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'pre',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--fonderie-surface-alt,#fafafa)',\n\t\t\t\t\t\t\t\t\t\tpadding: '12px',\n\t\t\t\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tJSON.stringify(c.configured, null, 2),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Stored (database)'),\n\t\t\t\t\t\t\tc.stored.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No stored plans.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Plan', 'Tier', 'Seats', 'Monthly', 'Yearly', 'Trial', ''],\n\t\t\t\t\t\t\t\t\t\tc.stored.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: p.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\th('strong', p.name),\n\t\t\t\t\t\t\t\t\t\t\t\t\tp.description ? h('div', { style: styles.muted }, p.description) : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(String(p.tier)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.seats == null ? '∞' : String(p.seats)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${money(p.pricing?.monthly)} ${p.pricing?.currency ?? ''}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(money(p.pricing?.yearly)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.trialDays ? `${p.trialDays} d` : '—'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Delete',\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport const SubscriberScreen = defineComponent({\n\tname: 'FonderieSubscriberScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst type = ref<SubscriberType>('user');\n\t\tconst idInput = ref('');\n\t\tconst subscriber = ref<{ type: SubscriberType; id: string } | null>(null);\n\t\tconst list = useAdminSubscribers(props.client, { limit: props.pageSize });\n\t\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\t\tuseAdminSubscriber(props.client, subscriber, { limit: 20 });\n\t\tconst open = (t: SubscriberType, id: string) => {\n\t\t\tgranted.value = null;\n\t\t\ttype.value = t;\n\t\t\tidInput.value = id;\n\t\t\tsubscriber.value = { type: t, id };\n\t\t};\n\t\tconst amount = ref('');\n\t\tconst note = ref('');\n\t\tconst granted = ref<string | null>(null);\n\t\tconst input = (model: { value: string }, placeholder: string, extra: object = {}) =>\n\t\t\th('input', {\n\t\t\t\tvalue: model.value,\n\t\t\t\tonInput: (e: Event) => (model.value = (e.target as HTMLInputElement).value),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text', ...extra },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tconst s = subscription.value;\n\t\t\tconst w = wallet.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Subscriber'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\tsubscriber.value = idInput.value.trim()\n\t\t\t\t\t\t\t\t? { type: type.value, id: idInput.value.trim() }\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'select',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: type.value,\n\t\t\t\t\t\t\t\tonChange: (e: Event) =>\n\t\t\t\t\t\t\t\t\t(type.value = (e.target as HTMLSelectElement).value as SubscriberType),\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t'aria-label': 'Type',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th('option', { value: 'user' }, 'user'),\n\t\t\t\t\t\t\t\th('option', { value: 'workspace' }, 'workspace'),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tinput(idInput, 'subscriber id', { minWidth: '280px' }),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tsubscriber.value\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\tsubscriber.value = null;\n\t\t\t\t\t\t\t\t\t\t\tidInput.value = '';\n\t\t\t\t\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'← All subscribers',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tdisabled: list.isLoading.value,\n\t\t\t\t\t\t\t\t\t\tonClick: () => void list.refresh(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'Refresh',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\t!subscriber.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.subscriptions.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No subscribers yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Subscriber', 'Plan', 'Status', 'Renews'],\n\t\t\t\t\t\t\t\t\t\tlist.subscriptions.value.map((sub) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: sub.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0, ...styles.mono },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => open(sub.subscriberType, sub.subscriberId),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`${sub.subscriberType}/${sub.subscriberId}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${sub.plan} · ${sub.interval}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.cancelAtPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [sub.status, ' ', h('span', { style: styles.badge }, 'cancels')]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: sub.status,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? new Date(sub.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tsubscriber.value && !isLoading.value\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Subscription'),\n\t\t\t\t\t\t\ts\n\t\t\t\t\t\t\t\t? h('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('plan'), td([h('strong', s.plan), ` · ${s.interval}`])]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('status'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${s.status}${s.cancelAtPeriodEnd ? ' · cancels at period end' : ''}`),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('period'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${s.currentPeriodStart ? new Date(s.currentPeriodStart).toLocaleDateString() : '—'} → ${s.currentPeriodEnd ? new Date(s.currentPeriodEnd).toLocaleDateString() : '—'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('provider'), td(s.providerSubscriptionId ?? '—', styles.mono)]),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'No subscription.'),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Wallet'),\n\t\t\t\t\t\t\tw\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\th('p', [\n\t\t\t\t\t\t\t\t\t\t\th('strong', w.balance),\n\t\t\t\t\t\t\t\t\t\t\t` ${w.currency} `,\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t`(granted ${w.granted ?? '0'} · purchased ${w.purchased ?? '0'}) · minor units, precision ${w.precision}`,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst sub = subscriber.value;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!sub) return;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${sub.type}-${sub.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst amt = amount.value.trim();\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount: amt,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(note.value ? { description: note.value } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgranted.value = `Granted ${amt} ${w.currency}.`;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnote.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\tinput(amount, 'amount (minor units)'),\n\t\t\t\t\t\t\t\t\t\t\t\tinput(note, 'reason (optional)', { minWidth: '220px' }),\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: !/^\\d+$/.test(amount.value.trim()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Grant',\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tgranted.value ? h('span', { style: styles.ok }, granted.value) : null,\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Ledger'),\n\t\t\t\t\t\t\t\t\t\tledger.value.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing moved yet.')\n\t\t\t\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t\t\t\t['When', 'Kind', 'Amount', 'Note'],\n\t\t\t\t\t\t\t\t\t\t\t\t\tledger.value.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(t.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.type),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.amount, styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.description ?? '', styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\thasMoreLedger.value\n\t\t\t\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMoreLedger(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'No wallet — billing has no wallet configuration.',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { AuditAdminClient, IAdminAuditQuery } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport const AuditScreen = defineComponent({\n\tname: 'FonderieAuditScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuditAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst draft = ref({ workspaceId: '', type: '', actorId: '' });\n\t\tconst query = ref<Omit<IAdminAuditQuery, 'cursor'>>({ limit: props.pageSize });\n\t\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(\n\t\t\tprops.client,\n\t\t\tquery,\n\t\t);\n\t\tconst field = (key: 'workspaceId' | 'type' | 'actorId', placeholder: string) =>\n\t\t\th('input', {\n\t\t\t\tvalue: draft.value[key],\n\t\t\t\tonInput: (e: Event) =>\n\t\t\t\t\t(draft.value = { ...draft.value, [key]: (e.target as HTMLInputElement).value }),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Audit'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = draft.value;\n\t\t\t\t\t\t\tquery.value = {\n\t\t\t\t\t\t\t\tlimit: props.pageSize,\n\t\t\t\t\t\t\t\t...(d.workspaceId.trim() ? { workspaceId: d.workspaceId.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.type.trim() ? { type: d.type.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.actorId.trim() ? { actorId: d.actorId.trim() } : {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\tfield('workspaceId', 'workspace id (all if empty)'),\n\t\t\t\t\t\tfield('type', 'event type'),\n\t\t\t\t\t\tfield('actorId', 'actor id'),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Filter',\n\t\t\t\t\t\t),\n\t\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tevents.value.length === 0 && !isLoading.value\n\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing recorded for this filter.')\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t['When', 'Type', 'Workspace', 'Actor', 'Request'],\n\t\t\t\t\t\t\tevents.value.map((e) =>\n\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\ttd(new Date(e.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\ttd(e.type, styles.mono),\n\t\t\t\t\t\t\t\t\ttd(String(e.payload['workspaceId'] ?? '—'), styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.actorId ?? '—', styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.requestId ?? '', styles.muted),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t]);\n\t},\n});\n"],"mappings":"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","names":["computed","defineComponent","h","ref","h","t","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","t","defineComponent","h","ref","defineComponent","ref","h","u","defineComponent","h","defineComponent","h","defineComponent","h","ref","defineComponent","ref","t","h","defineComponent","h","ref","defineComponent","ref","h","defineComponent","ref","computed","h","t"]}
1
+ {"version":3,"sources":["../src/screens/AdminShell.ts","../src/styles.ts","../src/screens/AdminLogScreen.ts","../src/screens/common.ts","../src/screens/AttentionScreen.ts","../src/screens/EnvironmentScreen.ts","../src/screens/DoctorScreen.ts","../src/screens/ModulesScreen.ts","../src/screens/RoutesScreen.ts","../src/screens/MigrationsScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts","../src/screens/CatalogScreen.ts","../src/screens/SubscriberScreen.ts","../src/screens/AuditScreen.ts"],"sourcesContent":["import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { EnvironmentScreen } from './EnvironmentScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { MigrationsScreen } from './MigrationsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'environment', label: 'Environment' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string }\n\t| { kind: 'template'; type: string }\n\t| null;\n\nexport const AdminShell = defineComponent({\n\tname: 'FonderieAdminShell',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// Given ⇒ the Settings and Messaging pages appear. Construct them with\n\t\t// `prefix: '/_admin'` to go through the one token.\n\t\tconfigClient: { type: Object as PropType<ConfigAdminClient>, default: undefined },\n\t\tcourierClient: { type: Object as PropType<CourierAdminClient>, default: undefined },\n\t\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\t\tauthClient: { type: Object as PropType<AuthAdminClient>, default: undefined },\n\t\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\t\tbillingClient: { type: Object as PropType<BillingAdminClient>, default: undefined },\n\t\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\t\tauditClient: { type: Object as PropType<AuditAdminClient>, default: undefined },\n\t\tenvironment: { type: String, default: undefined },\n\t\t// Controlled navigation: pass `page` and listen to `navigate` to own the\n\t\t// URL. Omit `page` and the shell keeps it itself.\n\t\tpage: { type: String as PropType<AdminPage>, default: undefined },\n\t},\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit }) {\n\t\tconst own = ref<AdminPage>('attention');\n\t\tconst current = computed(() => props.page ?? own.value);\n\t\tconst editing = ref<Editing>(null);\n\t\tconst go = (p: AdminPage) => {\n\t\t\tediting.value = null;\n\t\t\temit('navigate', p);\n\t\t\tif (props.page === undefined) own.value = p;\n\t\t};\n\t\tconst back = () =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ type: 'button', style: styles.button, onClick: () => (editing.value = null) },\n\t\t\t\t'← Back',\n\t\t\t);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c });\n\t\t\t\tcase 'environment':\n\t\t\t\t\treturn h(EnvironmentScreen, { client: c });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c });\n\t\t\t\tcase 'migrations':\n\t\t\t\t\treturn h(MigrationsScreen, { client: c });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c });\n\t\t\t\tcase 'catalog':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(CatalogScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to see the catalog here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'subscriber':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(SubscriberScreen, { client: props.billingClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass a BillingAdminClient to look up subscribers here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'audit':\n\t\t\t\t\treturn props.auditClient\n\t\t\t\t\t\t? h(AuditScreen, { client: props.auditClient })\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t\t'Pass an AuditAdminClient to see the audit trail here.',\n\t\t\t\t\t\t\t);\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, { client: props.authClient })\n\t\t\t\t\t\t: h('p', { style: styles.status }, 'Pass an AuthAdminClient to look up users here.');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a ConfigAdminClient to manage config and secrets here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && e.kind !== 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\tkind: e.kind,\n\t\t\t\t\t\t\t\tconfigKey: e.key,\n\t\t\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(ConfigListScreen, {\n\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string) => (editing.value = { kind: 'config', key }),\n\t\t\t\t\t\t'onSelect-secret': (key: string) => (editing.value = { kind: 'secret', key }),\n\t\t\t\t\t\tallowCreate: true,\n\t\t\t\t\t\t'onCreate-config': () => (editing.value = { kind: 'config', key: '' }),\n\t\t\t\t\t\t'onCreate-secret': () => (editing.value = { kind: 'secret', key: '' }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcase 'templates': {\n\t\t\t\t\tconst kc = props.courierClient;\n\t\t\t\t\tif (!kc)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.status },\n\t\t\t\t\t\t\t'Pass a CourierAdminClient to manage templates here.',\n\t\t\t\t\t\t);\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template', type: t.type }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn () =>\n\t\t\th('div', { style: styles.shell }, [\n\t\t\t\th(\n\t\t\t\t\t'nav',\n\t\t\t\t\t{ style: styles.nav, 'aria-label': 'Admin' },\n\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\tconst items = g.items.filter(\n\t\t\t\t\t\t\t(i) =>\n\t\t\t\t\t\t\t\t!i.needs ||\n\t\t\t\t\t\t\t\t(i.needs === 'config'\n\t\t\t\t\t\t\t\t\t? props.configClient\n\t\t\t\t\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t\t\t\t\t: i.needs === 'auth'\n\t\t\t\t\t\t\t\t\t\t\t? props.authClient\n\t\t\t\t\t\t\t\t\t\t\t: i.needs === 'billing'\n\t\t\t\t\t\t\t\t\t\t\t\t? props.billingClient\n\t\t\t\t\t\t\t\t\t\t\t\t: props.auditClient),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\th('div', { style: styles.navGroup }, g.group),\n\t\t\t\t\t\t\t...items.map((i) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.navItem,\n\t\t\t\t\t\t\t\t\t\t\t...(current.value === i.page ? styles.navItemActive : {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-current': current.value === i.page ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\tonClick: () => go(i.page),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ti.label,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\th('main', { style: styles.main }, body()),\n\t\t\t]);\n\t},\n});\n","import type { CSSProperties } from 'vue';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\n//\n// Colours, type and radii come from `var(--fonderie-*)`, the organisation's\n// design tokens, declared once in the served shell (@fonderie/admin's\n// ui/html.ts). Inline styles take CSS variables, so this needs no stylesheet,\n// no build step and no class plumbing — and light/dark follow the tokens\n// without a single conditional here.\n//\n// Every var carries a FALLBACK. These screens are published packages: a\n// consumer importing them into their own app has no Fonderie shell and\n// therefore none of these variables, and `color: var(--fonderie-text)` with\n// nothing behind it resolves to nothing — black text on black, or invisible\n// borders. The fallbacks are the light palette, so an embedded screen still\n// renders correctly and simply is not themed.\nconst t = {\n\ttext: 'var(--fonderie-text,#171717)',\n\tmuted: 'var(--fonderie-text-muted,#5c5c5c)',\n\tbg: 'var(--fonderie-bg,#fafafa)',\n\tsurface: 'var(--fonderie-surface,#fff)',\n\tsurfaceAlt: 'var(--fonderie-surface-alt,#fafafa)',\n\tborder: 'var(--fonderie-border,#e0e0e0)',\n\tborderLight: 'var(--fonderie-border-light,#f5f5f5)',\n\taccent: 'var(--fonderie-accent,#00d294)',\n\taccentStrong: 'var(--fonderie-accent-strong,#009767)',\n\twarning: 'var(--fonderie-warning,#f5a623)',\n\tdanger: 'var(--fonderie-danger,#e00)',\n\tfont: 'var(--fonderie-font,Inter,\"Inter Fallback\",-apple-system,BlinkMacSystemFont,\"Helvetica Neue\",system-ui,sans-serif)',\n\tmono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace)',\n\tradius: 'var(--fonderie-radius,4px)',\n\tradiusLg: 'var(--fonderie-radius-lg,8px)',\n\ttrackingDisplay: 'var(--fonderie-tracking-display,-0.05em)',\n\tshadowCard: 'var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))',\n} as const;\n\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// The sidebar sits on the raised surface against the page canvas, which is\n\t// what separates the two without a heavy rule between them.\n\tnav: {\n\t\twidth: 220,\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tpadding: 16,\n\t\tflexShrink: 0,\n\t\tbackground: t.surface,\n\t},\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 0 6px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: t.radius,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t},\n\tnavItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: {\n\t\tfontSize: 20,\n\t\tfontWeight: 600,\n\t\tmarginTop: 0,\n\t\tmarginBottom: 12,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 24,\n\t\tmarginBottom: 8,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tstatus: { padding: 12, color: t.muted },\n\terror: { color: t.danger, marginBottom: 12, fontSize: 14 },\n\tok: { color: t.accentStrong, fontWeight: 600 },\n\tbad: { color: t.danger, fontWeight: 600 },\n\tadvice: { color: t.warning },\n\tmuted: { color: t.muted, fontSize: 13 },\n\tmono: { fontFamily: t.mono, fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: t.muted,\n\t},\n\ttd: { borderBottom: `1px solid ${t.borderLight}`, padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t},\n\tbutton: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radius,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tboxShadow: t.shadowCard,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n\t// Surfaces the screens compose themselves, kept here so a card looks the\n\t// same on every page rather than being re-invented per screen.\n\tcard: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: 16,\n\t\tboxShadow: t.shadowCard,\n\t},\n\taccent: { color: t.accent },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\nexport const AdminLogScreen = defineComponent({\n\tname: 'FonderieAdminLogScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(props.client, {\n\t\t\tlimit: props.pageSize,\n\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Admin log'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404\n\t\t\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t['When', 'Actor', 'Request', 'Status', 'Module'],\n\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\ttd(new Date(e.at).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\ttd(`${e.method} ${e.path}`, styles.mono),\n\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.status >= 400 ? styles.bad : styles.ok },\n\t\t\t\t\t\t\t\t\t\t\t\tString(e.status),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${e.durationMs} ms`),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '12px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t],\n\t\t\t]);\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { Ref, VNode } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\n\n// Shared frame: title (+ toolbar), then loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: Ref<boolean>; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: VNode[] = [],\n\toptions: { loadingText?: string; errorText?: (e: FonderieApiError) => string } = {},\n): VNode {\n\tconst body = state.isLoading.value\n\t\t? h('p', { style: styles.status }, options.loadingText ?? 'Loading…')\n\t\t: state.error.value\n\t\t\t? h(\n\t\t\t\t\t'p',\n\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t(options.errorText ?? ((e) => e.explanation))(state.error.value),\n\t\t\t\t)\n\t\t\t: content();\n\treturn h('div', { style: styles.container }, [\n\t\th('div', { style: styles.toolbar }, [\n\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, title),\n\t\t\t...toolbar,\n\t\t]),\n\t\tbody,\n\t]);\n}\n\nexport function table(headers: string[], rows: VNode[]): VNode {\n\treturn h('table', { style: styles.table }, [\n\t\th('thead', [\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\theaders.map((t) => h('th', { style: styles.th }, t)),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNode | string | (VNode | string)[], extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children);\n\nexport const refreshButton = (label: string, disabled: boolean, onClick: () => void) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, label);\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Attention',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst a = attention.value;\n\t\t\t\t\tif (!a) return null;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.ok },\n\t\t\t\t\t\t\t`Nothing needs you. Checked ${new Date(a.generatedAt).toLocaleString()}.`,\n\t\t\t\t\t\t);\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\ta.items.map((item) =>\n\t\t\t\t\t\t\th('li', { key: `${item.source}:${item.message}`, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: item.severity === 'error' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\t\titem.severity,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, item.source),\n\t\t\t\t\t\t\t\t` — ${item.message}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page } from './common';\n\nexport const EnvironmentScreen = defineComponent({\n\tname: 'FonderieEnvironmentScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminEnvironment(props.client);\n\t\treturn () =>\n\t\t\tpage('Configuration', { isLoading, error }, () => {\n\t\t\t\tconst r = report.value;\n\t\t\t\tif (!r) return null;\n\t\t\t\treturn [\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Readiness'),\n\t\t\t\t\th(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.modules.map((m) =>\n\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t...(m.problems.length === 0\n\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.ok }, 'ok')]\n\t\t\t\t\t\t\t\t\t: m.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('h2', { style: styles.subtitle }, 'Environment'),\n\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No variables declared — pass `env` to AdminModule.')\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\tr.env.map((e) =>\n\t\t\t\t\t\t\t\t\th('li', { key: e.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.name),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: e.set ? styles.ok : styles.bad }, e.set ? 'set' : 'missing'),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Doctor',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('li', { key: c.name, style: styles.row }, [\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t{ style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\tc.skipped ? 'skipped' : c.ok ? 'ok' : 'failed',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.mono }, c.name),\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `${c.module} · ${c.durationMs} ms`),\n\t\t\t\t\t\t\t\tc.skipped ? h('div', { style: styles.muted }, c.skipped) : null,\n\t\t\t\t\t\t\t\t...c.findings.map((f) =>\n\t\t\t\t\t\t\t\t\th('div', { key: f, style: c.ok ? styles.advice : styles.bad }, f),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton('Run again', isLoading.value, () => void refresh()),\n\t\t\t\t\treport.value && !isLoading.value\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: report.value.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\treport.value.ok ? 'all checks pass' : 'a check failed',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('span'),\n\t\t\t\t],\n\t\t\t\t{ loadingText: 'Running the checks…' },\n\t\t\t);\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () =>\n\t\t\tpage('Modules', { isLoading, error }, () => {\n\t\t\t\tconst m = manifest.value;\n\t\t\t\tif (!m) return null;\n\t\t\t\treturn [\n\t\t\t\t\th(\n\t\t\t\t\t\t'p',\n\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t`${m.env} · admin ${m.admin.version} · admin log ${m.admin.log ? 'on' : 'off'} · ${m.routes.length} routes`,\n\t\t\t\t\t),\n\t\t\t\t\ttable(\n\t\t\t\t\t\t['Module', 'Version', 'Readiness', 'Describes admin'],\n\t\t\t\t\t\tm.modules.map((mod) =>\n\t\t\t\t\t\t\th('tr', { key: mod.name }, [\n\t\t\t\t\t\t\t\ttd(mod.name, styles.mono),\n\t\t\t\t\t\t\t\ttd(mod.version ?? h('span', { style: styles.muted }, 'not reported')),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: mod.readiness.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'error',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...mod.readiness.problems.map((p) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tkey: p.message,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: p.severity === 'error' ? styles.bad : styles.advice,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tp.message,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\ttd(mod.describesAdmin ? 'yes' : h('span', { style: styles.muted }, 'no')),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t},\n});\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, table, td } from './common';\n\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\treturn () =>\n\t\t\tpage('Routes', { isLoading, error }, () =>\n\t\t\t\ttable(\n\t\t\t\t\t['Method', 'Path', 'Guard', 'Module'],\n\t\t\t\t\t(report.value?.routes ?? []).map((r) =>\n\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\ttd(r.method, styles.mono),\n\t\t\t\t\t\t\ttd(r.path, styles.mono),\n\t\t\t\t\t\t\ttd(h('span', { style: styles.badge }, r.guard)),\n\t\t\t\t\t\t\ttd(r.module ?? 'application', styles.muted),\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t},\n});\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/vue-admin';\nimport type { PropType, VNode } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { page, refreshButton } from './common';\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport const MigrationsScreen = defineComponent({\n\tname: 'FonderieMigrationsScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(props.client);\n\n\t\tconst section = (m: IAdminMigrationModule, everApplied: boolean): VNode => {\n\t\t\tconst blocked = why(m, everApplied);\n\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\treturn h('section', { style: { marginBottom: '24px' } }, [\n\t\t\t\th('h2', { style: styles.subtitle }, `${m.name} — ${m.pending.length} pending`),\n\t\t\t\th(\n\t\t\t\t\t'ul',\n\t\t\t\t\tm.pending.map((p) =>\n\t\t\t\t\t\th('li', [\n\t\t\t\t\t\t\th('code', p.file),\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: p.impact === 'destructive' ? styles.bad : styles.advice },\n\t\t\t\t\t\t\t\tp.impact,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tp.destructive.length > 0\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\tp.destructive.map((s) => h('li', [h('code', s.slice(0, 120))])),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tblocked\n\t\t\t\t\t? h('p', { style: styles.advice }, blocked)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\tdisabled: isLoading.value || !m.appliable,\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The composable already put any failure in `error` and\n\t\t\t\t\t\t\t\t\t\t// re-read the real state; nothing useful is left to do.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`Apply ${m.pending.length} migration${m.pending.length === 1 ? '' : 's'}`,\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\n\t\treturn () =>\n\t\t\tpage(\n\t\t\t\t'Migrations',\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tconst r = report.value;\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\tconst behind = r.modules.filter((m) => m.pending.length > 0);\n\t\t\t\t\tif (behind.length === 0) return h('p', { style: styles.ok }, 'Every module is up to date.');\n\t\t\t\t\treturn [\n\t\t\t\t\t\tr.everApplied\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t{ style: styles.advice },\n\t\t\t\t\t\t\t\t\t'This database has never been migrated — treating it as a first install, so nothing is held back.',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t...behind.map((m) => section(m, r.everApplied)),\n\t\t\t\t\t].filter(Boolean) as VNode[];\n\t\t\t\t},\n\t\t\t\t[refreshButton('Refresh', isLoading.value, () => void refresh())],\n\t\t\t\t{\n\t\t\t\t\terrorText: (e) =>\n\t\t\t\t\t\te.status === 403\n\t\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t\t: e.explanation,\n\t\t\t\t},\n\t\t\t);\n\t},\n});\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport const TokensScreen = defineComponent({\n\tname: 'FonderieTokensScreen',\n\tprops: { client: { type: Object as PropType<AdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(props.client);\n\t\tconst name = ref('');\n\t\tconst scopes = ref<AdminScope[]>(['read']);\n\t\tconst days = ref('');\n\t\tconst minted = ref<{ name: string; token: string } | null>(null);\n\t\tconst toggle = (s: AdminScope) =>\n\t\t\t(scopes.value = scopes.value.includes(s)\n\t\t\t\t? scopes.value.filter((x) => x !== s)\n\t\t\t\t: [...scopes.value, s]);\n\n\t\treturn () => {\n\t\t\tconst r = report.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Access'),\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 401\n\t\t\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t\t\t: error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Root token'),\n\t\t\t\tr\n\t\t\t\t\t? h('p', [\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ style: r.admin.ok ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\tr.admin.ok ? 'strong' : 'weak',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t...r.admin.problems.map((p) =>\n\t\t\t\t\t\t\t\th('div', { key: p.message, style: styles.bad }, p.message),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, 'Issued tokens'),\n\t\t\t\tr?.issued === null\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t'Issuing is off — give AdminModule a store and run its migrations.',\n\t\t\t\t\t\t)\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tminted.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.ok }, [\n\t\t\t\t\t\t\t\t\t\t'Copy this now — it is never shown again. ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, minted.value.token),\n\t\t\t\t\t\t\t\t\t\t` (${minted.value.name})`,\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tconst d = Number(days.value);\n\t\t\t\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\t\t\t\tname: name.value.trim(),\n\t\t\t\t\t\t\t\t\t\t\tscopes: scopes.value,\n\t\t\t\t\t\t\t\t\t\t\t...(days.value && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\t\t\t\tminted.value = { name: t.name, token: t.token };\n\t\t\t\t\t\t\t\t\t\t\t\tname.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\tdays.value = '';\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: name.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (name.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'name',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Name',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t...ALL.map((s) =>\n\t\t\t\t\t\t\t\t\t\th('label', { key: s, style: { ...styles.badge, cursor: 'pointer' } }, [\n\t\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t\t\t\t\t\t\t\tchecked: scopes.value.includes(s),\n\t\t\t\t\t\t\t\t\t\t\t\tonChange: () => toggle(s),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t` ${s}`,\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\tvalue: days.value,\n\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (days.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\t\tplaceholder: 'days (optional)',\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', width: '140px' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': 'Days',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\tdisabled: !name.value.trim() || scopes.value.length === 0 || isLoading.value,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Issue',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tr?.issued && r.issued.length > 0\n\t\t\t\t\t\t\t\t? table(\n\t\t\t\t\t\t\t\t\t\t['Name', 'Scopes', 'Created', 'Expires', 'Last used', ''],\n\t\t\t\t\t\t\t\t\t\tr.issued.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt ? h('span', { style: styles.badge }, ' revoked') : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(t.scopes.join(', '), styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${new Date(t.createdAt).toLocaleDateString()} · ${t.createdBy}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never',\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.revokedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Revoke',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'None issued.'),\n\t\t\t\t\t\t],\n\t\t\t\th('h2', { style: styles.subtitle }, 'Legacy per-brick tokens'),\n\t\t\t\tr && r.legacy.length === 0\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\"None — every brick's admin surface goes through this token.\",\n\t\t\t\t\t\t)\n\t\t\t\t\t: h(\n\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t(r?.legacy ?? []).map((l) =>\n\t\t\t\t\t\t\t\th('li', { key: l.module, style: styles.row }, [\n\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, l.module),\n\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'still registers its standalone routes with its own token (deprecated)',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\t},\n});\n","import { type AuthAdminClient, describeLocation } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// Who is signed up, and why can't this one log in. Lists on arrival — an\n// operator who must know an address before they can see anything cannot find\n// the account they are being asked about. Picking a row, or an exact email,\n// opens the account: live sessions, recent sign-ins, suspend and sign-out.\nexport const UsersScreen = defineComponent({\n\tname: 'FonderieUsersScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuthAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst selectedId = ref('');\n\t\tconst list = useAdminUsers(props.client, { limit: props.pageSize });\n\t\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\t\tprops.client,\n\t\t\t{ email, id: selectedId },\n\t\t);\n\t\tconst userId = computed(() => user.value?.id ?? null);\n\t\tconst sessions = useAdminUserSessions(props.client, userId);\n\t\tconst history = useAdminLoginHistory(props.client, userId, { limit: 20 });\n\t\tconst showList = computed(() => !email.value && !selectedId.value);\n\t\tconst yesNo = (v: boolean) =>\n\t\t\th('span', { style: v ? styles.ok : styles.muted }, v ? 'yes' : 'no');\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\t\tconst clear = () => {\n\t\t\temail.value = '';\n\t\t\tselectedId.value = '';\n\t\t\tinput.value = '';\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst u = user.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Users'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tselectedId.value = '';\n\t\t\t\t\t\t\temail.value = input.value.trim();\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\ttype: 'email',\n\t\t\t\t\t\t\tvalue: input.value,\n\t\t\t\t\t\t\tonInput: (e: Event) => (input.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: 'email address',\n\t\t\t\t\t\t\tstyle: { ...styles.button, cursor: 'text', minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': 'Email',\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? refreshButton('Refresh', list.isLoading.value, () => void list.refresh())\n\t\t\t\t\t\t\t: refreshButton('← All users', false, clear),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tshowList.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.users.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No users yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Email', 'Name', 'Created', 'Status'],\n\t\t\t\t\t\t\t\t\t\tlist.users.value.map((u) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: u.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0 },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (selectedId.value = u.id),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tu.email,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${u.firstName ?? ''} ${u.lastName ?? ''}`.trim() ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(u.createdAt).toLocaleDateString()),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'suspended')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: u.deletedAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, 'deleted')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'active'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t{ style: styles.error, role: 'alert' },\n\t\t\t\t\t\t\terror.value.status === 404 ? 'No user with that email.' : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tu\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, [\n\t\t\t\t\t\t\t\tu.firstName || u.lastName ? `${u.firstName} ${u.lastName}`.trim() : u.email,\n\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\tu.suspended ? h('span', { style: styles.badge }, 'suspended') : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? h('span', { style: styles.badge }, 'deleted') : null,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\trow('id', h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow('email', [u.email, ' · verified ', yesNo(u.isEmailVerified)]),\n\t\t\t\t\t\t\t\t\trow('MFA', yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'provider',\n\t\t\t\t\t\t\t\t\t\t`${u.provider || 'password'}${u.hasPassword ? '' : ' · no password set'}`,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\t'last login',\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? new Date(u.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, 'never'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow('created', new Date(u.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t? refreshButton('Unsuspend', isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t: refreshButton('Suspend', isLoading.value, () => void suspend()),\n\t\t\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\t\t\t'Sign out everywhere',\n\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Live sessions'),\n\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.map((s) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, s.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(s.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, s.userAgent ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t\t`since ${new Date(s.createdAt).toLocaleString()}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Recent sign-ins'),\n\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'None recorded.')\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\t\t\t\t\t\t\thistory.events.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: e.outcome === 'success' ? styles.ok : styles.bad },\n\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, e.method),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.mono }, e.ipAddress ?? '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, describeLocation(e.location) ?? ''),\n\t\t\t\t\t\t\t\t\t\t\t\te.location?.proxy || e.location?.hosting\n\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.bad }, e.location.proxy ? ' proxy/VPN' : ' hosting')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, new Date(e.createdAt).toLocaleString()),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void history.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport const CatalogScreen = defineComponent({\n\tname: 'FonderieCatalogScreen',\n\tprops: { client: { type: Object as PropType<BillingAdminClient>, required: true } },\n\tsetup(props) {\n\t\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(props.client);\n\t\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\t\treturn () => {\n\t\t\tconst c = catalog.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('div', { style: styles.toolbar }, [\n\t\t\t\t\th('h1', { style: { ...styles.title, marginBottom: 0 } }, 'Catalog'),\n\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t]),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tisLoading.value && !c ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\tc\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Configured (code)'),\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'pre',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--fonderie-surface-alt,#fafafa)',\n\t\t\t\t\t\t\t\t\t\tpadding: '12px',\n\t\t\t\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tJSON.stringify(c.configured, null, 2),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Stored (database)'),\n\t\t\t\t\t\t\tc.stored.length === 0\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No stored plans.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Plan', 'Tier', 'Seats', 'Monthly', 'Yearly', 'Trial', ''],\n\t\t\t\t\t\t\t\t\t\tc.stored.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: p.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\t\th('strong', p.name),\n\t\t\t\t\t\t\t\t\t\t\t\t\tp.description ? h('div', { style: styles.muted }, p.description) : '',\n\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(String(p.tier)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.seats == null ? '∞' : String(p.seats)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${money(p.pricing?.monthly)} ${p.pricing?.currency ?? ''}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(money(p.pricing?.yearly)),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(p.trialDays ? `${p.trialDays} d` : '—'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Delete',\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { table, td } from './common';\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport const SubscriberScreen = defineComponent({\n\tname: 'FonderieSubscriberScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst type = ref<SubscriberType>('user');\n\t\tconst idInput = ref('');\n\t\tconst subscriber = ref<{ type: SubscriberType; id: string } | null>(null);\n\t\tconst list = useAdminSubscribers(props.client, { limit: props.pageSize });\n\t\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\t\tuseAdminSubscriber(props.client, subscriber, { limit: 20 });\n\t\tconst open = (t: SubscriberType, id: string) => {\n\t\t\tgranted.value = null;\n\t\t\ttype.value = t;\n\t\t\tidInput.value = id;\n\t\t\tsubscriber.value = { type: t, id };\n\t\t};\n\t\tconst amount = ref('');\n\t\tconst note = ref('');\n\t\tconst granted = ref<string | null>(null);\n\t\tconst input = (model: { value: string }, placeholder: string, extra: object = {}) =>\n\t\t\th('input', {\n\t\t\t\tvalue: model.value,\n\t\t\t\tonInput: (e: Event) => (model.value = (e.target as HTMLInputElement).value),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text', ...extra },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tconst s = subscription.value;\n\t\t\tconst w = wallet.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Subscriber'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\tsubscriber.value = idInput.value.trim()\n\t\t\t\t\t\t\t\t? { type: type.value, id: idInput.value.trim() }\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'select',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: type.value,\n\t\t\t\t\t\t\t\tonChange: (e: Event) =>\n\t\t\t\t\t\t\t\t\t(type.value = (e.target as HTMLSelectElement).value as SubscriberType),\n\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t'aria-label': 'Type',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th('option', { value: 'user' }, 'user'),\n\t\t\t\t\t\t\t\th('option', { value: 'workspace' }, 'workspace'),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tinput(idInput, 'subscriber id', { minWidth: '280px' }),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Look up',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tsubscriber.value\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\tsubscriber.value = null;\n\t\t\t\t\t\t\t\t\t\t\tidInput.value = '';\n\t\t\t\t\t\t\t\t\t\t\tgranted.value = null;\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'← All subscribers',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\tdisabled: list.isLoading.value,\n\t\t\t\t\t\t\t\t\t\tonClick: () => void list.refresh(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'Refresh',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\t!subscriber.value\n\t\t\t\t\t? h('div', [\n\t\t\t\t\t\t\tlist.error.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tlist.subscriptions.value.length === 0 && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'No subscribers yet.')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t['Subscriber', 'Plan', 'Status', 'Renews'],\n\t\t\t\t\t\t\t\t\t\tlist.subscriptions.value.map((sub) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: sub.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, padding: 0, ...styles.mono },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => open(sub.subscriberType, sub.subscriberId),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`${sub.subscriberType}/${sub.subscriberId}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${sub.plan} · ${sub.interval}`),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.cancelAtPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [sub.status, ' ', h('span', { style: styles.badge }, 'cancels')]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: sub.status,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsub.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? new Date(sub.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, '—'),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tlist.isLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => void list.loadMore(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tsubscriber.value && !isLoading.value\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Subscription'),\n\t\t\t\t\t\t\ts\n\t\t\t\t\t\t\t\t? h('table', { style: styles.table }, [\n\t\t\t\t\t\t\t\t\t\th('tbody', [\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('plan'), td([h('strong', s.plan), ` · ${s.interval}`])]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('status'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(`${s.status}${s.cancelAtPeriodEnd ? ' · cancels at period end' : ''}`),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [\n\t\t\t\t\t\t\t\t\t\t\t\ttd('period'),\n\t\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${s.currentPeriodStart ? new Date(s.currentPeriodStart).toLocaleDateString() : '—'} → ${s.currentPeriodEnd ? new Date(s.currentPeriodEnd).toLocaleDateString() : '—'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\th('tr', [td('provider'), td(s.providerSubscriptionId ?? '—', styles.mono)]),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: h('p', { style: styles.muted }, 'No subscription.'),\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Wallet'),\n\t\t\t\t\t\t\tw\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\th('p', [\n\t\t\t\t\t\t\t\t\t\t\th('strong', w.balance),\n\t\t\t\t\t\t\t\t\t\t\t` ${w.currency} `,\n\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t\t\t`(granted ${w.granted ?? '0'} · purchased ${w.purchased ?? '0'}) · minor units, precision ${w.precision}`,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst sub = subscriber.value;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!sub) return;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${sub.type}-${sub.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst amt = amount.value.trim();\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount: amt,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(note.value ? { description: note.value } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgranted.value = `Granted ${amt} ${w.currency}.`;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tamount.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnote.value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\tinput(amount, 'amount (minor units)'),\n\t\t\t\t\t\t\t\t\t\t\t\tinput(note, 'reason (optional)', { minWidth: '220px' }),\n\t\t\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: !/^\\d+$/.test(amount.value.trim()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Grant',\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tgranted.value ? h('span', { style: styles.ok }, granted.value) : null,\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, 'Ledger'),\n\t\t\t\t\t\t\t\t\t\tledger.value.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing moved yet.')\n\t\t\t\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t\t\t\t['When', 'Kind', 'Amount', 'Note'],\n\t\t\t\t\t\t\t\t\t\t\t\t\tledger.value.map((t) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('tr', { key: t.id }, [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(new Date(t.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.type),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.amount, styles.mono),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttd(t.description ?? '', styles.muted),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\thasMoreLedger.value\n\t\t\t\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => void loadMoreLedger(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t\t'p',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.muted },\n\t\t\t\t\t\t\t\t\t\t'No wallet — billing has no wallet configuration.',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { AuditAdminClient, IAdminAuditQuery } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { refreshButton, table, td } from './common';\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport const AuditScreen = defineComponent({\n\tname: 'FonderieAuditScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AuditAdminClient>, required: true },\n\t\tpageSize: { type: Number, default: 50 },\n\t},\n\tsetup(props) {\n\t\tconst draft = ref({ workspaceId: '', type: '', actorId: '' });\n\t\tconst query = ref<Omit<IAdminAuditQuery, 'cursor'>>({ limit: props.pageSize });\n\t\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(\n\t\t\tprops.client,\n\t\t\tquery,\n\t\t);\n\t\tconst field = (key: 'workspaceId' | 'type' | 'actorId', placeholder: string) =>\n\t\t\th('input', {\n\t\t\t\tvalue: draft.value[key],\n\t\t\t\tonInput: (e: Event) =>\n\t\t\t\t\t(draft.value = { ...draft.value, [key]: (e.target as HTMLInputElement).value }),\n\t\t\t\tplaceholder,\n\t\t\t\tstyle: { ...styles.button, cursor: 'text' },\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\t\treturn () =>\n\t\t\th('div', { style: styles.container }, [\n\t\t\t\th('h1', { style: styles.title }, 'Audit'),\n\t\t\t\th(\n\t\t\t\t\t'form',\n\t\t\t\t\t{\n\t\t\t\t\t\tstyle: styles.toolbar,\n\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = draft.value;\n\t\t\t\t\t\t\tquery.value = {\n\t\t\t\t\t\t\t\tlimit: props.pageSize,\n\t\t\t\t\t\t\t\t...(d.workspaceId.trim() ? { workspaceId: d.workspaceId.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.type.trim() ? { type: d.type.trim() } : {}),\n\t\t\t\t\t\t\t\t...(d.actorId.trim() ? { actorId: d.actorId.trim() } : {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\tfield('workspaceId', 'workspace id (all if empty)'),\n\t\t\t\t\t\tfield('type', 'event type'),\n\t\t\t\t\t\tfield('actorId', 'actor id'),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: isLoading.value },\n\t\t\t\t\t\t\t'Filter',\n\t\t\t\t\t\t),\n\t\t\t\t\t\trefreshButton('Refresh', isLoading.value, () => void refresh()),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\terror.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\tevents.value.length === 0 && !isLoading.value\n\t\t\t\t\t? h('p', { style: styles.muted }, 'Nothing recorded for this filter.')\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t['When', 'Type', 'Workspace', 'Actor', 'Request'],\n\t\t\t\t\t\t\tevents.value.map((e) =>\n\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\ttd(new Date(e.createdAt).toLocaleString(), styles.muted),\n\t\t\t\t\t\t\t\t\ttd(e.type, styles.mono),\n\t\t\t\t\t\t\t\t\ttd(String(e.payload['workspaceId'] ?? '—'), styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.actorId ?? '—', styles.mono),\n\t\t\t\t\t\t\t\t\ttd(e.requestId ?? '', styles.muted),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\tisLoading.value ? h('p', { style: styles.status }, 'Loading…') : null,\n\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: { ...styles.button, marginTop: '8px' },\n\t\t\t\t\t\t\t\tonClick: () => void loadMore(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'Load more',\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t]);\n\t},\n});\n"],"mappings":";AAQA,SAAS,oBAAoB,wBAAwB;AACrD,SAAS,sBAAsB,0BAA0B;AAEzD,SAAS,YAAAA,WAAU,mBAAAC,mBAAiB,KAAAC,KAAG,OAAAC,YAAW;;;ACMlD,IAAM,IAAI;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,YAAY;AACb;AAEO,IAAM,SAAwC;AAAA,EACpD,OAAO;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY,EAAE;AAAA,IACd,OAAO,EAAE;AAAA,IACT,YAAY,EAAE;AAAA,EACf;AAAA;AAAA;AAAA,EAGA,KAAK;AAAA,IACJ,OAAO;AAAA,IACP,aAAa,aAAa,EAAE,MAAM;AAAA,IAClC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY,EAAE;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACT,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,OAAO,EAAE;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc,EAAE;AAAA,IAChB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO,EAAE;AAAA,IACT,YAAY;AAAA,EACb;AAAA,EACA,eAAe,EAAE,YAAY,EAAE,YAAY,YAAY,KAAK,OAAO,EAAE,aAAa;AAAA,EAClF,MAAM,EAAE,MAAM,GAAG,SAAS,IAAI,UAAU,IAAI;AAAA,EAC5C,WAAW,EAAE,SAAS,IAAI,UAAU,IAAI;AAAA,EACxC,OAAO;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe,EAAE;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe,EAAE;AAAA,EAClB;AAAA,EACA,QAAQ,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM;AAAA,EACtC,OAAO,EAAE,OAAO,EAAE,QAAQ,cAAc,IAAI,UAAU,GAAG;AAAA,EACzD,IAAI,EAAE,OAAO,EAAE,cAAc,YAAY,IAAI;AAAA,EAC7C,KAAK,EAAE,OAAO,EAAE,QAAQ,YAAY,IAAI;AAAA,EACxC,QAAQ,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,UAAU,GAAG;AAAA,EACtC,MAAM,EAAE,YAAY,EAAE,MAAM,UAAU,GAAG;AAAA,EACzC,OAAO,EAAE,OAAO,QAAQ,gBAAgB,YAAY,UAAU,GAAG;AAAA,EACjE,IAAI;AAAA,IACH,WAAW;AAAA,IACX,cAAc,aAAa,EAAE,MAAM;AAAA,IACnC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO,EAAE;AAAA,EACV;AAAA,EACA,IAAI,EAAE,cAAc,aAAa,EAAE,WAAW,IAAI,SAAS,WAAW,eAAe,MAAM;AAAA,EAC3F,MAAM,EAAE,WAAW,QAAQ,SAAS,GAAG,QAAQ,EAAE;AAAA,EACjD,KAAK,EAAE,cAAc,aAAa,EAAE,WAAW,IAAI,SAAS,QAAQ;AAAA,EACpE,OAAO;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY,EAAE;AAAA,IACd,QAAQ,aAAa,EAAE,MAAM;AAAA,IAC7B,OAAO,EAAE;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACP,YAAY,EAAE;AAAA,IACd,QAAQ,aAAa,EAAE,MAAM;AAAA,IAC7B,cAAc,EAAE;AAAA,IAChB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO,EAAE;AAAA,IACT,YAAY;AAAA,IACZ,WAAW,EAAE;AAAA,EACd;AAAA,EACA,SAAS,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,UAAU,cAAc,GAAG;AAAA;AAAA;AAAA,EAG3E,MAAM;AAAA,IACL,YAAY,EAAE;AAAA,IACd,QAAQ,aAAa,EAAE,MAAM;AAAA,IAC7B,cAAc,EAAE;AAAA,IAChB,SAAS;AAAA,IACT,WAAW,EAAE;AAAA,EACd;AAAA,EACA,QAAQ,EAAE,OAAO,EAAE,OAAO;AAC3B;;;AC5IA,SAAS,mBAAmB;AAE5B,SAAS,iBAAiB,KAAAC,UAAS;;;ACDnC,SAAS,SAAS;AAIX,SAAS,KACf,OACA,OACA,SACA,UAAmB,CAAC,GACpB,UAAiF,CAAC,GAC1E;AACR,QAAM,OAAO,MAAM,UAAU,QAC1B,EAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,QAAQ,eAAe,eAAU,IAClE,MAAM,MAAM,QACX;AAAA,IACA;AAAA,IACA,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ;AAAA,KACpC,QAAQ,cAAc,CAAC,MAAM,EAAE,cAAc,MAAM,MAAM,KAAK;AAAA,EAChE,IACC,QAAQ;AACZ,SAAO,EAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,IAC5C,EAAE,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAG;AAAA,MACnC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,EAAE,GAAG,KAAK;AAAA,MAC9D,GAAG;AAAA,IACJ,CAAC;AAAA,IACD;AAAA,EACD,CAAC;AACF;AAEO,SAAS,MAAM,SAAmB,MAAsB;AAC9D,SAAO,EAAE,SAAS,EAAE,OAAO,OAAO,MAAM,GAAG;AAAA,IAC1C,EAAE,SAAS;AAAA,MACV;AAAA,QACC;AAAA,QACA,QAAQ,IAAI,CAACC,OAAM,EAAE,MAAM,EAAE,OAAO,OAAO,GAAG,GAAGA,EAAC,CAAC;AAAA,MACpD;AAAA,IACD,CAAC;AAAA,IACD,EAAE,SAAS,IAAI;AAAA,EAChB,CAAC;AACF;AAEO,IAAM,KAAK,CAAC,UAA+C,QAAgB,CAAC,MAClF,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,MAAM,EAAE,GAAG,QAAQ;AAEjD,IAAM,gBAAgB,CAAC,OAAe,UAAmB,YAC/D,EAAE,UAAU,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ,UAAU,QAAQ,GAAG,KAAK;;;ADxCxE,IAAM,iBAAiB,gBAAgB;AAAA,EAC7C,MAAM;AAAA,EACN,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK;AAAA,IAChE,UAAU,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,EACvC;AAAA,EACA,MAAM,OAAO;AACZ,UAAM,EAAE,SAAS,SAAS,WAAW,OAAO,SAAS,SAAS,IAAI,YAAY,MAAM,QAAQ;AAAA,MAC3F,OAAO,MAAM;AAAA,IACd,CAAC;AACD,WAAO,MACNC,GAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,MACrCA,GAAE,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAG;AAAA,QACnCA,GAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,EAAE,GAAG,WAAW;AAAA,QACpE,cAAc,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC/D,CAAC;AAAA,MACD,MAAM,QACHA;AAAA,QACA;AAAA,QACA,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ;AAAA,QACrC,MAAM,MAAM,WAAW,MACpB,0DACA,MAAM,MAAM;AAAA,MAChB,IACC;AAAA,QACA;AAAA,UACC,CAAC,QAAQ,SAAS,WAAW,UAAU,QAAQ;AAAA,UAC/C,QAAQ,MAAM;AAAA,YAAI,CAAC,MAClBA,GAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG;AAAA,cACtB,GAAG,IAAI,KAAK,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,KAAK;AAAA,cAChD,GAAG,EAAE,KAAK;AAAA,cACV,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,IAAI,IAAI,OAAO,IAAI;AAAA,cACvC,GAAG;AAAA,gBACFA;AAAA,kBACC;AAAA,kBACA,EAAE,OAAO,EAAE,UAAU,MAAM,OAAO,MAAM,OAAO,GAAG;AAAA,kBAClD,OAAO,EAAE,MAAM;AAAA,gBAChB;AAAA,gBACA;AAAA,gBACAA,GAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,GAAG,EAAE,UAAU,KAAK;AAAA,cACxD,CAAC;AAAA,cACD,GAAG,EAAE,QAAQ,OAAO,KAAK;AAAA,YAC1B,CAAC;AAAA,UACF;AAAA,QACD;AAAA,QACA,UAAU,QAAQA,GAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,eAAU,IAAI;AAAA,QACjE,QAAQ,SAAS,CAAC,UAAU,QACzBA;AAAA,UACA;AAAA,UACA;AAAA,YACC,MAAM;AAAA,YACN,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,OAAO;AAAA,YAC7C,SAAS,MAAM,KAAK,SAAS;AAAA,UAC9B;AAAA,UACA;AAAA,QACD,IACC;AAAA,MACJ;AAAA,IACH,CAAC;AAAA,EACH;AACD,CAAC;;;AElED,SAAS,oBAAoB;AAE7B,SAAS,mBAAAC,kBAAiB,KAAAC,UAAS;AAI5B,IAAM,kBAAkBC,iBAAgB;AAAA,EAC9C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,WAAW,WAAW,OAAO,QAAQ,IAAI,aAAa,MAAM,MAAM;AAC1E,WAAO,MACN;AAAA,MACC;AAAA,MACA,EAAE,WAAW,MAAM;AAAA,MACnB,MAAM;AACL,cAAM,IAAI,UAAU;AACpB,YAAI,CAAC,EAAG,QAAO;AACf,YAAI,EAAE,MAAM,WAAW;AACtB,iBAAOC;AAAA,YACN;AAAA,YACA,EAAE,OAAO,OAAO,GAAG;AAAA,YACnB,8BAA8B,IAAI,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC;AAAA,UACvE;AACD,eAAOA;AAAA,UACN;AAAA,UACA,EAAE,OAAO,OAAO,KAAK;AAAA,UACrB,EAAE,MAAM;AAAA,YAAI,CAAC,SACZA,GAAE,MAAM,EAAE,KAAK,GAAG,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,IAAI,GAAG;AAAA,cACrEA;AAAA,gBACC;AAAA,gBACA,EAAE,OAAO,KAAK,aAAa,UAAU,OAAO,MAAM,OAAO,OAAO;AAAA,gBAChE,KAAK;AAAA,cACN;AAAA,cACA;AAAA,cACAA,GAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,KAAK,MAAM;AAAA,cAC7C,WAAM,KAAK,OAAO;AAAA,YACnB,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAAA,MACA,CAAC,cAAc,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;AAAA,MAChE,EAAE,aAAa,2BAAsB;AAAA,IACtC;AAAA,EACF;AACD,CAAC;;;AC7CD,SAAS,2BAA2B;AAEpC,SAAS,mBAAAC,kBAAiB,KAAAC,UAAS;AAI5B,IAAM,oBAAoBC,iBAAgB;AAAA,EAChD,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,QAAQ,WAAW,MAAM,IAAI,oBAAoB,MAAM,MAAM;AACrE,WAAO,MACN,KAAK,iBAAiB,EAAE,WAAW,MAAM,GAAG,MAAM;AACjD,YAAM,IAAI,OAAO;AACjB,UAAI,CAAC,EAAG,QAAO;AACf,aAAO;AAAA,QACNC,GAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,WAAW;AAAA,QAC/CA;AAAA,UACC;AAAA,UACA,EAAE,OAAO,OAAO,KAAK;AAAA,UACrB,EAAE,QAAQ;AAAA,YAAI,CAAC,MACdA,GAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,OAAO,IAAI,GAAG;AAAA,cAC3CA,GAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,IAAI;AAAA,cACxC;AAAA,cACA,GAAI,EAAE,SAAS,WAAW,IACvB,CAACA,GAAE,QAAQ,EAAE,OAAO,OAAO,GAAG,GAAG,IAAI,CAAC,IACtC,EAAE,SAAS;AAAA,gBAAI,CAAC,MAChBA;AAAA,kBACC;AAAA,kBACA;AAAA,oBACC,KAAK,EAAE;AAAA,oBACP,OAAO,EAAE,aAAa,UAAU,OAAO,MAAM,OAAO;AAAA,kBACrD;AAAA,kBACA,EAAE;AAAA,gBACH;AAAA,cACD;AAAA,YACH,CAAC;AAAA,UACF;AAAA,QACD;AAAA,QACAA,GAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,aAAa;AAAA,QACjD,EAAE,IAAI,WAAW,IACdA,GAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,yDAAoD,IACpFA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,KAAK;AAAA,UACrB,EAAE,IAAI;AAAA,YAAI,CAAC,MACVA,GAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,OAAO,IAAI,GAAG;AAAA,cAC3CA,GAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,IAAI;AAAA,cACxC;AAAA,cACAA,GAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,KAAK,OAAO,IAAI,GAAG,EAAE,MAAM,QAAQ,SAAS;AAAA,YAC/E,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACH;AAAA,IACD,CAAC;AAAA,EACH;AACD,CAAC;;;ACxDD,SAAS,iBAAiB;AAE1B,SAAS,mBAAAC,kBAAiB,KAAAC,UAAS;AAI5B,IAAM,eAAeC,iBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,QAAQ,WAAW,OAAO,QAAQ,IAAI,UAAU,MAAM,MAAM;AACpE,WAAO,MACN;AAAA,MACC;AAAA,MACA,EAAE,WAAW,MAAM;AAAA,MACnB,MAAM;AACL,cAAM,IAAI,OAAO;AACjB,YAAI,CAAC,EAAG,QAAO;AACf,eAAOC;AAAA,UACN;AAAA,UACA,EAAE,OAAO,OAAO,KAAK;AAAA,UACrB,EAAE,OAAO;AAAA,YAAI,CAAC,MACbA,GAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,OAAO,IAAI,GAAG;AAAA,cAC3CA;AAAA,gBACC;AAAA,gBACA,EAAE,OAAO,EAAE,UAAU,OAAO,QAAQ,EAAE,KAAK,OAAO,KAAK,OAAO,IAAI;AAAA,gBAClE,EAAE,UAAU,YAAY,EAAE,KAAK,OAAO;AAAA,cACvC;AAAA,cACA;AAAA,cACAA,GAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,IAAI;AAAA,cACxC;AAAA,cACAA,GAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,GAAG,EAAE,MAAM,SAAM,EAAE,UAAU,KAAK;AAAA,cACrE,EAAE,UAAUA,GAAE,OAAO,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,OAAO,IAAI;AAAA,cAC3D,GAAG,EAAE,SAAS;AAAA,gBAAI,CAAC,MAClBA,GAAE,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,OAAO,SAAS,OAAO,IAAI,GAAG,CAAC;AAAA,cACjE;AAAA,YACD,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAAA,MACA;AAAA,QACC,cAAc,aAAa,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC;AAAA,QAChE,OAAO,SAAS,CAAC,UAAU,QACxBA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,MAAM,KAAK,OAAO,KAAK,OAAO,IAAI;AAAA,UAClD,OAAO,MAAM,KAAK,oBAAoB;AAAA,QACvC,IACCA,GAAE,MAAM;AAAA,MACZ;AAAA,MACA,EAAE,aAAa,2BAAsB;AAAA,IACtC;AAAA,EACF;AACD,CAAC;;;ACrDD,SAAS,mBAAmB;AAE5B,SAAS,mBAAAC,kBAAiB,KAAAC,UAAS;AAI5B,IAAM,gBAAgBC,iBAAgB;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,UAAU,WAAW,MAAM,IAAI,YAAY,MAAM,MAAM;AAC/D,WAAO,MACN,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,MAAM;AAC3C,YAAM,IAAI,SAAS;AACnB,UAAI,CAAC,EAAG,QAAO;AACf,aAAO;AAAA,QACNC;AAAA,UACC;AAAA,UACA,EAAE,OAAO,OAAO,MAAM;AAAA,UACtB,GAAG,EAAE,GAAG,eAAY,EAAE,MAAM,OAAO,mBAAgB,EAAE,MAAM,MAAM,OAAO,KAAK,SAAM,EAAE,OAAO,MAAM;AAAA,QACnG;AAAA,QACA;AAAA,UACC,CAAC,UAAU,WAAW,aAAa,iBAAiB;AAAA,UACpD,EAAE,QAAQ;AAAA,YAAI,CAAC,QACdA,GAAE,MAAM,EAAE,KAAK,IAAI,KAAK,GAAG;AAAA,cAC1B,GAAG,IAAI,MAAM,OAAO,IAAI;AAAA,cACxB,GAAG,IAAI,WAAWA,GAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,cAAc,CAAC;AAAA,cACpE,GAAG;AAAA,gBACFA;AAAA,kBACC;AAAA,kBACA,EAAE,OAAO,IAAI,UAAU,KAAK,OAAO,KAAK,OAAO,IAAI;AAAA,kBACnD,IAAI,UAAU,KAAK,OAAO;AAAA,gBAC3B;AAAA,gBACA,GAAG,IAAI,UAAU,SAAS;AAAA,kBAAI,CAAC,MAC9BA;AAAA,oBACC;AAAA,oBACA;AAAA,sBACC,KAAK,EAAE;AAAA,sBACP,OAAO,EAAE,aAAa,UAAU,OAAO,MAAM,OAAO;AAAA,oBACrD;AAAA,oBACA,EAAE;AAAA,kBACH;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,cACD,GAAG,IAAI,iBAAiB,QAAQA,GAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,YACzE,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACH;AACD,CAAC;;;ACnDD,SAAS,sBAAsB;AAE/B,SAAS,mBAAAC,kBAAiB,KAAAC,UAAS;AAI5B,IAAM,eAAeC,iBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,QAAQ,WAAW,MAAM,IAAI,eAAe,MAAM,MAAM;AAChE,WAAO,MACN;AAAA,MAAK;AAAA,MAAU,EAAE,WAAW,MAAM;AAAA,MAAG,MACpC;AAAA,QACC,CAAC,UAAU,QAAQ,SAAS,QAAQ;AAAA,SACnC,OAAO,OAAO,UAAU,CAAC,GAAG;AAAA,UAAI,CAAC,MACjCC,GAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,IAAI,EAAE,IAAI,GAAG,GAAG;AAAA,YACzC,GAAG,EAAE,QAAQ,OAAO,IAAI;AAAA,YACxB,GAAG,EAAE,MAAM,OAAO,IAAI;AAAA,YACtB,GAAGA,GAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,KAAK,CAAC;AAAA,YAC9C,GAAG,EAAE,UAAU,eAAe,OAAO,KAAK;AAAA,UAC3C,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACF;AACD,CAAC;;;AC1BD,SAAS,0BAA0B;AAEnC,SAAS,mBAAAC,kBAAiB,KAAAC,UAAS;AAOnC,SAAS,IAAI,GAA0B,aAAqC;AAC3E,MAAI,EAAE,QAAQ,WAAW,EAAG,QAAO;AACnC,MAAI,EAAE,UAAW,QAAO,UAAU,EAAE,SAAS;AAC7C,MAAI,eAAe,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,aAAa;AAClE,WAAO;AACR,SAAO;AACR;AAEO,IAAM,mBAAmBC,iBAAgB;AAAA,EAC/C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,QAAQ,WAAW,OAAO,SAAS,MAAM,IAAI,mBAAmB,MAAM,MAAM;AAEpF,UAAM,UAAU,CAAC,GAA0B,gBAAgC;AAC1E,YAAM,UAAU,IAAI,GAAG,WAAW;AAClC,YAAM,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AACzC,aAAOC,GAAE,WAAW,EAAE,OAAO,EAAE,cAAc,OAAO,EAAE,GAAG;AAAA,QACxDA,GAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,GAAG,EAAE,IAAI,WAAM,EAAE,QAAQ,MAAM,UAAU;AAAA,QAC7EA;AAAA,UACC;AAAA,UACA,EAAE,QAAQ;AAAA,YAAI,CAAC,MACdA,GAAE,MAAM;AAAA,cACPA,GAAE,QAAQ,EAAE,IAAI;AAAA,cAChB;AAAA,cACAA;AAAA,gBACC;AAAA,gBACA,EAAE,OAAO,EAAE,WAAW,gBAAgB,OAAO,MAAM,OAAO,OAAO;AAAA,gBACjE,EAAE;AAAA,cACH;AAAA,cACA,EAAE,YAAY,SAAS,IACpBA;AAAA,gBACA;AAAA,gBACA,EAAE,YAAY,IAAI,CAAC,MAAMA,GAAE,MAAM,CAACA,GAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,cAC/D,IACC;AAAA,YACJ,CAAC;AAAA,UACF;AAAA,QACD;AAAA,QACA,UACGA,GAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,OAAO,IACxCA;AAAA,UACA;AAAA,UACA;AAAA,YACC,MAAM;AAAA,YACN,OAAO,OAAO;AAAA,YACd,UAAU,UAAU,SAAS,CAAC,EAAE;AAAA,YAChC,SAAS,MAAM;AACd,kBACC,OAAO;AAAA,gBACN,SAAS,EAAE,QAAQ,MAAM,qBAAqB,EAAE,IAAI;AAAA,cACrD;AAIA,qBAAK,MAAM,EAAE,MAAM,KAAK,EAAE,MAAM,MAAM;AAAA,gBAAC,CAAC;AAAA,YAC1C;AAAA,UACD;AAAA,UACA,SAAS,EAAE,QAAQ,MAAM,aAAa,EAAE,QAAQ,WAAW,IAAI,KAAK,GAAG;AAAA,QACxE;AAAA,MACH,CAAC;AAAA,IACF;AAEA,WAAO,MACN;AAAA,MACC;AAAA,MACA,EAAE,WAAW,MAAM;AAAA,MACnB,MAAM;AACL,cAAM,IAAI,OAAO;AACjB,YAAI,CAAC,EAAG,QAAO;AACf,cAAM,SAAS,EAAE,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,CAAC;AAC3D,YAAI,OAAO,WAAW,EAAG,QAAOA,GAAE,KAAK,EAAE,OAAO,OAAO,GAAG,GAAG,6BAA6B;AAC1F,eAAO;AAAA,UACN,EAAE,cACC,OACAA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,OAAO;AAAA,YACvB;AAAA,UACD;AAAA,UACF,GAAG,OAAO,IAAI,CAAC,MAAM,QAAQ,GAAG,EAAE,WAAW,CAAC;AAAA,QAC/C,EAAE,OAAO,OAAO;AAAA,MACjB;AAAA,MACA,CAAC,cAAc,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;AAAA,MAChE;AAAA,QACC,WAAW,CAAC,MACX,EAAE,WAAW,MACV,4DACA,EAAE;AAAA,MACP;AAAA,IACD;AAAA,EACF;AACD,CAAC;;;ACrGD,SAAS,sBAAsB;AAE/B,SAAS,mBAAAC,kBAAiB,KAAAC,IAAG,WAAW;AAIxC,IAAM,MAAoB,CAAC,QAAQ,SAAS,SAAS;AAI9C,IAAM,eAAeC,iBAAgB;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK,EAAE;AAAA,EAC3E,MAAM,OAAO;AACZ,UAAM,EAAE,QAAQ,WAAW,OAAO,OAAO,OAAO,IAAI,eAAe,MAAM,MAAM;AAC/E,UAAM,OAAO,IAAI,EAAE;AACnB,UAAM,SAAS,IAAkB,CAAC,MAAM,CAAC;AACzC,UAAM,OAAO,IAAI,EAAE;AACnB,UAAM,SAAS,IAA4C,IAAI;AAC/D,UAAM,SAAS,CAAC,MACd,OAAO,QAAQ,OAAO,MAAM,SAAS,CAAC,IACpC,OAAO,MAAM,OAAO,CAAC,MAAM,MAAM,CAAC,IAClC,CAAC,GAAG,OAAO,OAAO,CAAC;AAEvB,WAAO,MAAM;AACZ,YAAM,IAAI,OAAO;AACjB,aAAOC,GAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,QAC5CA,GAAE,MAAM,EAAE,OAAO,OAAO,MAAM,GAAG,QAAQ;AAAA,QACzC,MAAM,QACHA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ;AAAA,UACrC,MAAM,MAAM,WAAW,MACpB,kFACA,MAAM,MAAM;AAAA,QAChB,IACC;AAAA,QACHA,GAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,YAAY;AAAA,QAChD,IACGA,GAAE,KAAK;AAAA,UACPA;AAAA,YACC;AAAA,YACA,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,KAAK,OAAO,IAAI;AAAA,YAC7C,EAAE,MAAM,KAAK,WAAW;AAAA,UACzB;AAAA,UACA,GAAG,EAAE,MAAM,SAAS;AAAA,YAAI,CAAC,MACxBA,GAAE,OAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,IAAI,GAAG,EAAE,OAAO;AAAA,UAC1D;AAAA,QACD,CAAC,IACA;AAAA,QACHA,GAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,eAAe;AAAA,QACnD,GAAG,WAAW,OACXA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,MAAM;AAAA,UACtB;AAAA,QACD,IACC;AAAA,UACA,OAAO,QACJA,GAAE,KAAK,EAAE,OAAO,OAAO,GAAG,GAAG;AAAA,YAC7B;AAAA,YACAA,GAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,OAAO,MAAM,KAAK;AAAA,YACpD,KAAK,OAAO,MAAM,IAAI;AAAA,UACvB,CAAC,IACA;AAAA,UACHA;AAAA,YACC;AAAA,YACA;AAAA,cACC,OAAO,OAAO;AAAA,cACd,UAAU,CAAC,MAAa;AACvB,kBAAE,eAAe;AACjB,sBAAM,IAAI,OAAO,KAAK,KAAK;AAC3B,qBAAK,MAAM;AAAA,kBACV,MAAM,KAAK,MAAM,KAAK;AAAA,kBACtB,QAAQ,OAAO;AAAA,kBACf,GAAI,KAAK,SAAS,OAAO,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC;AAAA,gBAC1E,CAAC,EACC,KAAK,CAACC,OAAM;AACZ,yBAAO,QAAQ,EAAE,MAAMA,GAAE,MAAM,OAAOA,GAAE,MAAM;AAC9C,uBAAK,QAAQ;AACb,uBAAK,QAAQ;AAAA,gBACd,CAAC,EACA,MAAM,MAAM;AAAA,gBAAC,CAAC;AAAA,cACjB;AAAA,YACD;AAAA,YACA;AAAA,cACCD,GAAE,SAAS;AAAA,gBACV,OAAO,KAAK;AAAA,gBACZ,SAAS,CAAC,MAAc,KAAK,QAAS,EAAE,OAA4B;AAAA,gBACpE,aAAa;AAAA,gBACb,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,gBAC1C,cAAc;AAAA,cACf,CAAC;AAAA,cACD,GAAG,IAAI;AAAA,gBAAI,CAAC,MACXA,GAAE,SAAS,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,OAAO,OAAO,QAAQ,UAAU,EAAE,GAAG;AAAA,kBACrEA,GAAE,SAAS;AAAA,oBACV,MAAM;AAAA,oBACN,SAAS,OAAO,MAAM,SAAS,CAAC;AAAA,oBAChC,UAAU,MAAM,OAAO,CAAC;AAAA,kBACzB,CAAC;AAAA,kBACD,IAAI,CAAC;AAAA,gBACN,CAAC;AAAA,cACF;AAAA,cACAA,GAAE,SAAS;AAAA,gBACV,OAAO,KAAK;AAAA,gBACZ,SAAS,CAAC,MAAc,KAAK,QAAS,EAAE,OAA4B;AAAA,gBACpE,aAAa;AAAA,gBACb,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AAAA,gBAC1D,cAAc;AAAA,cACf,CAAC;AAAA,cACDA;AAAA,gBACC;AAAA,gBACA;AAAA,kBACC,MAAM;AAAA,kBACN,OAAO,OAAO;AAAA,kBACd,UAAU,CAAC,KAAK,MAAM,KAAK,KAAK,OAAO,MAAM,WAAW,KAAK,UAAU;AAAA,gBACxE;AAAA,gBACA;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,UACA,GAAG,UAAU,EAAE,OAAO,SAAS,IAC5B;AAAA,YACA,CAAC,QAAQ,UAAU,WAAW,WAAW,aAAa,EAAE;AAAA,YACxD,EAAE,OAAO;AAAA,cAAI,CAACC,OACbD,GAAE,MAAM,EAAE,KAAKC,GAAE,GAAG,GAAG;AAAA,gBACtB,GAAG;AAAA,kBACFA,GAAE;AAAA,kBACFA,GAAE,YAAYD,GAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,UAAU,IAAI;AAAA,gBAChE,CAAC;AAAA,gBACD,GAAGC,GAAE,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI;AAAA,gBACnC;AAAA,kBACC,GAAG,IAAI,KAAKA,GAAE,SAAS,EAAE,mBAAmB,CAAC,SAAMA,GAAE,SAAS;AAAA,kBAC9D,OAAO;AAAA,gBACR;AAAA,gBACA;AAAA,kBACCA,GAAE,YAAY,IAAI,KAAKA,GAAE,SAAS,EAAE,mBAAmB,IAAI;AAAA,kBAC3D,OAAO;AAAA,gBACR;AAAA,gBACA;AAAA,kBACCA,GAAE,aAAa,IAAI,KAAKA,GAAE,UAAU,EAAE,eAAe,IAAI;AAAA,kBACzD,OAAO;AAAA,gBACR;AAAA,gBACA;AAAA,kBACCA,GAAE,YACC,KACAD;AAAA,oBACA;AAAA,oBACA;AAAA,sBACC,MAAM;AAAA,sBACN,OAAO,OAAO;AAAA,sBACd,SAAS,MAAM;AACd,4BACC,OAAO;AAAA,0BACN,WAAWC,GAAE,IAAI;AAAA,wBAClB;AAEA,+BAAK,OAAOA,GAAE,EAAE,EAAE,MAAM,MAAM;AAAA,0BAAC,CAAC;AAAA,sBAClC;AAAA,oBACD;AAAA,oBACA;AAAA,kBACD;AAAA,gBACH;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD,IACCD,GAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,cAAc;AAAA,QAClD;AAAA,QACFA,GAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,yBAAyB;AAAA,QAC7D,KAAK,EAAE,OAAO,WAAW,IACtBA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,MAAM;AAAA,UACtB;AAAA,QACD,IACCA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,KAAK;AAAA,WACpB,GAAG,UAAU,CAAC,GAAG;AAAA,YAAI,CAAC,MACtBA,GAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,OAAO,OAAO,IAAI,GAAG;AAAA,cAC7CA,GAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,MAAM;AAAA,cAC1C;AAAA,cACAA;AAAA,gBACC;AAAA,gBACA,EAAE,OAAO,OAAO,MAAM;AAAA,gBACtB;AAAA,cACD;AAAA,YACD,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACH,CAAC;AAAA,IACF;AAAA,EACD;AACD,CAAC;;;AClMD,SAA+B,wBAAwB;AACvD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,UAAU,mBAAAE,kBAAiB,KAAAC,KAAG,OAAAC,YAAW;AAQ3C,IAAM,cAAcC,iBAAgB;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,QAAqC,UAAU,KAAK;AAAA,IACpE,UAAU,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,EACvC;AAAA,EACA,MAAM,OAAO;AACZ,UAAM,QAAQC,KAAI,EAAE;AACpB,UAAM,QAAQA,KAAI,EAAE;AACpB,UAAM,aAAaA,KAAI,EAAE;AACzB,UAAM,OAAO,cAAc,MAAM,QAAQ,EAAE,OAAO,MAAM,SAAS,CAAC;AAClE,UAAM,EAAE,MAAM,WAAW,OAAO,SAAS,WAAW,eAAe,IAAI;AAAA,MACtE,MAAM;AAAA,MACN,EAAE,OAAO,IAAI,WAAW;AAAA,IACzB;AACA,UAAM,SAAS,SAAS,MAAM,KAAK,OAAO,MAAM,IAAI;AACpD,UAAM,WAAW,qBAAqB,MAAM,QAAQ,MAAM;AAC1D,UAAM,UAAU,qBAAqB,MAAM,QAAQ,QAAQ,EAAE,OAAO,GAAG,CAAC;AACxE,UAAM,WAAW,SAAS,MAAM,CAAC,MAAM,SAAS,CAAC,WAAW,KAAK;AACjE,UAAM,QAAQ,CAAC,MACdC,IAAE,QAAQ,EAAE,OAAO,IAAI,OAAO,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,IAAI;AACpE,UAAM,MAAM,CAAC,GAAW,MAAeA,IAAE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAU,CAAC,CAAC;AACtE,UAAM,QAAQ,MAAM;AACnB,YAAM,QAAQ;AACd,iBAAW,QAAQ;AACnB,YAAM,QAAQ;AAAA,IACf;AAEA,WAAO,MAAM;AACZ,YAAM,IAAI,KAAK;AACf,aAAOA,IAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,QAC5CA,IAAE,MAAM,EAAE,OAAO,OAAO,MAAM,GAAG,OAAO;AAAA,QACxCA;AAAA,UACC;AAAA,UACA;AAAA,YACC,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,MAAa;AACvB,gBAAE,eAAe;AACjB,yBAAW,QAAQ;AACnB,oBAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,YAChC;AAAA,UACD;AAAA,UACA;AAAA,YACCA,IAAE,SAAS;AAAA,cACV,MAAM;AAAA,cACN,OAAO,MAAM;AAAA,cACb,SAAS,CAAC,MAAc,MAAM,QAAS,EAAE,OAA4B;AAAA,cACrE,aAAa;AAAA,cACb,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,QAAQ,UAAU,QAAQ;AAAA,cAC7D,cAAc;AAAA,YACf,CAAC;AAAA,YACDA;AAAA,cACC;AAAA,cACA,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ,UAAU,UAAU,MAAM;AAAA,cAClE;AAAA,YACD;AAAA,YACA,SAAS,QACN,cAAc,WAAW,KAAK,UAAU,OAAO,MAAM,KAAK,KAAK,QAAQ,CAAC,IACxE,cAAc,oBAAe,OAAO,KAAK;AAAA,UAC7C;AAAA,QACD;AAAA,QACA,SAAS,QACNA,IAAE,OAAO;AAAA,UACT,KAAK,MAAM,QACRA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ,GAAG,KAAK,MAAM,MAAM,WAAW,IAC3E;AAAA,UACH,KAAK,MAAM,MAAM,WAAW,KAAK,CAAC,KAAK,UAAU,QAC9CA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,eAAe,IAC/C;AAAA,YACA,CAAC,SAAS,QAAQ,WAAW,QAAQ;AAAA,YACrC,KAAK,MAAM,MAAM;AAAA,cAAI,CAACC,OACrBD,IAAE,MAAM,EAAE,KAAKC,GAAE,GAAG,GAAG;AAAA,gBACtB;AAAA,kBACCD;AAAA,oBACC;AAAA,oBACA;AAAA,sBACC,MAAM;AAAA,sBACN,OAAO,EAAE,GAAG,OAAO,SAAS,SAAS,EAAE;AAAA,sBACvC,SAAS,MAAO,WAAW,QAAQC,GAAE;AAAA,oBACtC;AAAA,oBACAA,GAAE;AAAA,kBACH;AAAA,gBACD;AAAA,gBACA;AAAA,kBACC,GAAGA,GAAE,aAAa,EAAE,IAAIA,GAAE,YAAY,EAAE,GAAG,KAAK,KAC/CD,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,QAAG;AAAA,gBACxC;AAAA,gBACA,GAAG,IAAI,KAAKC,GAAE,SAAS,EAAE,mBAAmB,CAAC;AAAA,gBAC7C;AAAA,kBACCA,GAAE,YACCD,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,WAAW,IAC9CC,GAAE,YACDD,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,SAAS,IAC5CA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,QAAQ;AAAA,gBAChD;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD;AAAA,UACF,KAAK,UAAU,QAAQA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,eAAU,IAAI;AAAA,UACtE,KAAK,QAAQ,SAAS,CAAC,KAAK,UAAU,QACnCA;AAAA,YACA;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,cAC5C,SAAS,MAAM,KAAK,KAAK,SAAS;AAAA,YACnC;AAAA,YACA;AAAA,UACD,IACC;AAAA,QACJ,CAAC,IACA;AAAA,QACH,MAAM,QACHA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ;AAAA,UACrC,MAAM,MAAM,WAAW,MAAM,6BAA6B,MAAM,MAAM;AAAA,QACvE,IACC;AAAA,QACH,IACG;AAAA,UACAA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG;AAAA,YACnC,EAAE,aAAa,EAAE,WAAW,GAAG,EAAE,SAAS,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,EAAE;AAAA,YACtE;AAAA,YACA,EAAE,YAAYA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,WAAW,IAAI;AAAA,YAChE,EAAE,YAAYA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,SAAS,IAAI;AAAA,UAC/D,CAAC;AAAA,UACDA,IAAE,SAAS,EAAE,OAAO,OAAO,MAAM,GAAG;AAAA,YACnCA,IAAE,SAAS;AAAA,cACV,IAAI,MAAMA,IAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,EAAE,CAAC;AAAA,cACjD,IAAI,SAAS,CAAC,EAAE,OAAO,mBAAgB,MAAM,EAAE,eAAe,CAAC,CAAC;AAAA,cAChE,IAAI,OAAO,MAAM,EAAE,UAAU,CAAC;AAAA,cAC9B;AAAA,gBACC;AAAA,gBACA,GAAG,EAAE,YAAY,UAAU,GAAG,EAAE,cAAc,KAAK,uBAAoB;AAAA,cACxE;AAAA,cACA;AAAA,gBACC;AAAA,gBACA,EAAE,YACC,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,IACrCA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,OAAO;AAAA,cAC9C;AAAA,cACA,IAAI,WAAW,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC;AAAA,YACtD,CAAC;AAAA,UACF,CAAC;AAAA,UACDA,IAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,SAAS,WAAW,OAAO,EAAE,GAAG;AAAA,YAC7D,EAAE,YACC,cAAc,aAAa,UAAU,OAAO,MAAM,KAAK,UAAU,CAAC,IAClE,cAAc,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC;AAAA,YACjE;AAAA,cACC;AAAA,cACA,UAAU;AAAA,cACV,MAAM,KAAK,eAAe,EAAE,KAAK,MAAM,SAAS,QAAQ,CAAC;AAAA,YAC1D;AAAA,UACD,CAAC;AAAA,UACDA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,eAAe;AAAA,UACnD,SAAS,SAAS,MAAM,WAAW,IAChCA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,OAAO,IACvCA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,KAAK;AAAA,YACrB,SAAS,SAAS,MAAM;AAAA,cAAI,CAAC,MAC5BA,IAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,IAAI,GAAG;AAAA,gBACzCA,IAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,aAAa,QAAG;AAAA,gBACpD;AAAA,gBACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,iBAAiB,EAAE,QAAQ,KAAK,EAAE;AAAA,gBACrE;AAAA,gBACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,aAAa,EAAE;AAAA,gBACpD;AAAA,gBACAA;AAAA,kBACC;AAAA,kBACA,EAAE,OAAO,OAAO,MAAM;AAAA,kBACtB,SAAS,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC;AAAA,gBAChD;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD;AAAA,UACFA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,iBAAiB;AAAA,UACrD,QAAQ,OAAO,MAAM,WAAW,KAAK,CAAC,QAAQ,UAAU,QACrDA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,gBAAgB,IAChDA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,KAAK;AAAA,YACrB,QAAQ,OAAO,MAAM;AAAA,cAAI,CAAC,MACzBA,IAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,IAAI,GAAG;AAAA,gBACzCA;AAAA,kBACC;AAAA,kBACA,EAAE,OAAO,EAAE,YAAY,YAAY,OAAO,KAAK,OAAO,IAAI;AAAA,kBAC1D,EAAE;AAAA,gBACH;AAAA,gBACA;AAAA,gBACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,MAAM;AAAA,gBAC3C;AAAA,gBACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,aAAa,QAAG;AAAA,gBACpD;AAAA,gBACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,iBAAiB,EAAE,QAAQ,KAAK,EAAE;AAAA,gBACrE,EAAE,UAAU,SAAS,EAAE,UAAU,UAC9BA,IAAE,QAAQ,EAAE,OAAO,OAAO,IAAI,GAAG,EAAE,SAAS,QAAQ,eAAe,UAAU,IAC7E;AAAA,gBACH;AAAA,gBACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC;AAAA,cAC1E,CAAC;AAAA,YACF;AAAA,UACD;AAAA,UACF,QAAQ,QAAQ,SAAS,CAAC,QAAQ,UAAU,QACzCA;AAAA,YACA;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,cAC5C,SAAS,MAAM,KAAK,QAAQ,SAAS;AAAA,YACtC;AAAA,YACA;AAAA,UACD,IACC;AAAA,QACJ,IACC;AAAA,MACJ,CAAC;AAAA,IACF;AAAA,EACD;AACD,CAAC;;;AC3OD,SAAS,uBAAuB;AAEhC,SAAS,mBAAAE,mBAAiB,KAAAC,WAAS;AAM5B,IAAM,gBAAgBC,kBAAgB;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAwC,UAAU,KAAK,EAAE;AAAA,EAClF,MAAM,OAAO;AACZ,UAAM,EAAE,SAAS,WAAW,OAAO,SAAS,WAAW,IAAI,gBAAgB,MAAM,MAAM;AACvF,UAAM,QAAQ,CAAC,MAAkC,KAAK,OAAO,YAAO,IAAI,KAAK,QAAQ,CAAC;AACtF,WAAO,MAAM;AACZ,YAAM,IAAI,QAAQ;AAClB,aAAOC,IAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,QAC5CA,IAAE,OAAO,EAAE,OAAO,OAAO,QAAQ,GAAG;AAAA,UACnCA,IAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,EAAE,GAAG,SAAS;AAAA,UAClE,cAAc,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC;AAAA,QAC/D,CAAC;AAAA,QACD,MAAM,QACHA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,WAAW,IACtE;AAAA,QACH,UAAU,SAAS,CAAC,IAAIA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,eAAU,IAAI;AAAA,QACvE,IACG;AAAA,UACAA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,mBAAmB;AAAA,UACvDA;AAAA,YACC;AAAA,YACA;AAAA,cACC,OAAO;AAAA,gBACN,GAAG,OAAO;AAAA,gBACV,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,WAAW;AAAA,cACZ;AAAA,YACD;AAAA,YACA,KAAK,UAAU,EAAE,YAAY,MAAM,CAAC;AAAA,UACrC;AAAA,UACAA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,mBAAmB;AAAA,UACvD,EAAE,OAAO,WAAW,IACjBA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,kBAAkB,IAClD;AAAA,YACA,CAAC,QAAQ,QAAQ,SAAS,WAAW,UAAU,SAAS,EAAE;AAAA,YAC1D,EAAE,OAAO;AAAA,cAAI,CAAC,MACbA,IAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG;AAAA,gBACtB,GAAG;AAAA,kBACFA,IAAE,UAAU,EAAE,IAAI;AAAA,kBAClB,EAAE,cAAcA,IAAE,OAAO,EAAE,OAAO,OAAO,MAAM,GAAG,EAAE,WAAW,IAAI;AAAA,gBACpE,CAAC;AAAA,gBACD,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,gBACjB,GAAG,EAAE,SAAS,OAAO,WAAM,OAAO,EAAE,KAAK,CAAC;AAAA,gBAC1C,GAAG,GAAG,MAAM,EAAE,SAAS,OAAO,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,EAAE;AAAA,gBAC9D,GAAG,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,gBAC3B,GAAG,EAAE,YAAY,GAAG,EAAE,SAAS,OAAO,QAAG;AAAA,gBACzC;AAAA,kBACCA;AAAA,oBACC;AAAA,oBACA;AAAA,sBACC,MAAM;AAAA,sBACN,OAAO,OAAO;AAAA,sBACd,SAAS,MAAM;AACd,4BAAI,OAAO,QAAQ,uBAAuB,EAAE,IAAI,IAAI;AACnD,+BAAK,WAAW,EAAE,EAAE,EAAE,MAAM,MAAM;AAAA,0BAAC,CAAC;AAAA,sBACtC;AAAA,oBACD;AAAA,oBACA;AAAA,kBACD;AAAA,gBACD;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD;AAAA,QACH,IACC;AAAA,MACJ,CAAC;AAAA,IACF;AAAA,EACD;AACD,CAAC;;;AC9ED,SAAS,oBAAoB,2BAA2B;AAExD,SAAS,mBAAAC,mBAAiB,KAAAC,KAAG,OAAAC,YAAW;AAQjC,IAAM,mBAAmBC,kBAAgB;AAAA,EAC/C,MAAM;AAAA,EACN,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,QAAwC,UAAU,KAAK;AAAA,IACvE,UAAU,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,EACvC;AAAA,EACA,MAAM,OAAO;AACZ,UAAM,OAAOC,KAAoB,MAAM;AACvC,UAAM,UAAUA,KAAI,EAAE;AACtB,UAAM,aAAaA,KAAiD,IAAI;AACxE,UAAM,OAAO,oBAAoB,MAAM,QAAQ,EAAE,OAAO,MAAM,SAAS,CAAC;AACxE,UAAM,EAAE,cAAc,QAAQ,QAAQ,eAAe,WAAW,OAAO,gBAAgB,MAAM,IAC5F,mBAAmB,MAAM,QAAQ,YAAY,EAAE,OAAO,GAAG,CAAC;AAC3D,UAAM,OAAO,CAACC,IAAmB,OAAe;AAC/C,cAAQ,QAAQ;AAChB,WAAK,QAAQA;AACb,cAAQ,QAAQ;AAChB,iBAAW,QAAQ,EAAE,MAAMA,IAAG,GAAG;AAAA,IAClC;AACA,UAAM,SAASD,KAAI,EAAE;AACrB,UAAM,OAAOA,KAAI,EAAE;AACnB,UAAM,UAAUA,KAAmB,IAAI;AACvC,UAAM,QAAQ,CAAC,OAA0B,aAAqB,QAAgB,CAAC,MAC9EE,IAAE,SAAS;AAAA,MACV,OAAO,MAAM;AAAA,MACb,SAAS,CAAC,MAAc,MAAM,QAAS,EAAE,OAA4B;AAAA,MACrE;AAAA,MACA,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,QAAQ,GAAG,MAAM;AAAA,MACpD,cAAc;AAAA,IACf,CAAC;AAEF,WAAO,MAAM;AACZ,YAAM,IAAI,aAAa;AACvB,YAAM,IAAI,OAAO;AACjB,aAAOA,IAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,QAC5CA,IAAE,MAAM,EAAE,OAAO,OAAO,MAAM,GAAG,YAAY;AAAA,QAC7CA;AAAA,UACC;AAAA,UACA;AAAA,YACC,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,MAAa;AACvB,gBAAE,eAAe;AACjB,sBAAQ,QAAQ;AAChB,yBAAW,QAAQ,QAAQ,MAAM,KAAK,IACnC,EAAE,MAAM,KAAK,OAAO,IAAI,QAAQ,MAAM,KAAK,EAAE,IAC7C;AAAA,YACJ;AAAA,UACD;AAAA,UACA;AAAA,YACCA;AAAA,cACC;AAAA,cACA;AAAA,gBACC,OAAO,KAAK;AAAA,gBACZ,UAAU,CAAC,MACT,KAAK,QAAS,EAAE,OAA6B;AAAA,gBAC/C,OAAO,OAAO;AAAA,gBACd,cAAc;AAAA,cACf;AAAA,cACA;AAAA,gBACCA,IAAE,UAAU,EAAE,OAAO,OAAO,GAAG,MAAM;AAAA,gBACrCA,IAAE,UAAU,EAAE,OAAO,YAAY,GAAG,WAAW;AAAA,cAChD;AAAA,YACD;AAAA,YACA,MAAM,SAAS,iBAAiB,EAAE,UAAU,QAAQ,CAAC;AAAA,YACrDA;AAAA,cACC;AAAA,cACA,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ,UAAU,UAAU,MAAM;AAAA,cAClE;AAAA,YACD;AAAA,YACA,WAAW,QACRA;AAAA,cACA;AAAA,cACA;AAAA,gBACC,MAAM;AAAA,gBACN,OAAO,OAAO;AAAA,gBACd,SAAS,MAAM;AACd,6BAAW,QAAQ;AACnB,0BAAQ,QAAQ;AAChB,0BAAQ,QAAQ;AAAA,gBACjB;AAAA,cACD;AAAA,cACA;AAAA,YACD,IACCA;AAAA,cACA;AAAA,cACA;AAAA,gBACC,MAAM;AAAA,gBACN,OAAO,OAAO;AAAA,gBACd,UAAU,KAAK,UAAU;AAAA,gBACzB,SAAS,MAAM,KAAK,KAAK,QAAQ;AAAA,cAClC;AAAA,cACA;AAAA,YACD;AAAA,UACH;AAAA,QACD;AAAA,QACA,CAAC,WAAW,QACTA,IAAE,OAAO;AAAA,UACT,KAAK,MAAM,QACRA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ,GAAG,KAAK,MAAM,MAAM,WAAW,IAC3E;AAAA,UACH,KAAK,cAAc,MAAM,WAAW,KAAK,CAAC,KAAK,UAAU,QACtDA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,qBAAqB,IACrD;AAAA,YACA,CAAC,cAAc,QAAQ,UAAU,QAAQ;AAAA,YACzC,KAAK,cAAc,MAAM;AAAA,cAAI,CAAC,QAC7BA,IAAE,MAAM,EAAE,KAAK,IAAI,GAAG,GAAG;AAAA,gBACxB;AAAA,kBACCA;AAAA,oBACC;AAAA,oBACA;AAAA,sBACC,MAAM;AAAA,sBACN,OAAO,EAAE,GAAG,OAAO,SAAS,SAAS,GAAG,GAAG,OAAO,KAAK;AAAA,sBACvD,SAAS,MAAM,KAAK,IAAI,gBAAgB,IAAI,YAAY;AAAA,oBACzD;AAAA,oBACA,GAAG,IAAI,cAAc,IAAI,IAAI,YAAY;AAAA,kBAC1C;AAAA,gBACD;AAAA,gBACA,GAAG,GAAG,IAAI,IAAI,SAAM,IAAI,QAAQ,EAAE;AAAA,gBAClC;AAAA,kBACC,IAAI,oBACD,CAAC,IAAI,QAAQ,KAAKA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,SAAS,CAAC,IAC/D,IAAI;AAAA,gBACR;AAAA,gBACA;AAAA,kBACC,IAAI,mBACD,IAAI,KAAK,IAAI,gBAAgB,EAAE,mBAAmB,IAClDA,IAAE,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,QAAG;AAAA,gBAC1C;AAAA,cACD,CAAC;AAAA,YACF;AAAA,UACD;AAAA,UACF,KAAK,UAAU,QAAQA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,eAAU,IAAI;AAAA,UACtE,KAAK,QAAQ,SAAS,CAAC,KAAK,UAAU,QACnCA;AAAA,YACA;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,cAC5C,SAAS,MAAM,KAAK,KAAK,SAAS;AAAA,YACnC;AAAA,YACA;AAAA,UACD,IACC;AAAA,QACJ,CAAC,IACA;AAAA,QACH,MAAM,QACHA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,WAAW,IACtE;AAAA,QACH,WAAW,SAAS,CAAC,UAAU,QAC5B;AAAA,UACAA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,cAAc;AAAA,UAClD,IACGA,IAAE,SAAS,EAAE,OAAO,OAAO,MAAM,GAAG;AAAA,YACpCA,IAAE,SAAS;AAAA,cACVA,IAAE,MAAM,CAAC,GAAG,MAAM,GAAG,GAAG,CAACA,IAAE,UAAU,EAAE,IAAI,GAAG,SAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AAAA,cACnEA,IAAE,MAAM;AAAA,gBACP,GAAG,QAAQ;AAAA,gBACX,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE,oBAAoB,gCAA6B,EAAE,EAAE;AAAA,cACzE,CAAC;AAAA,cACDA,IAAE,MAAM;AAAA,gBACP,GAAG,QAAQ;AAAA,gBACX;AAAA,kBACC,GAAG,EAAE,qBAAqB,IAAI,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,IAAI,QAAG,WAAM,EAAE,mBAAmB,IAAI,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,IAAI,QAAG;AAAA,gBACtK;AAAA,cACD,CAAC;AAAA,cACDA,IAAE,MAAM,CAAC,GAAG,UAAU,GAAG,GAAG,EAAE,0BAA0B,UAAK,OAAO,IAAI,CAAC,CAAC;AAAA,YAC3E,CAAC;AAAA,UACF,CAAC,IACAA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,kBAAkB;AAAA,UACrDA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,QAAQ;AAAA,UAC5C,IACG;AAAA,YACAA,IAAE,KAAK;AAAA,cACNA,IAAE,UAAU,EAAE,OAAO;AAAA,cACrB,IAAI,EAAE,QAAQ;AAAA,cACdA;AAAA,gBACC;AAAA,gBACA,EAAE,OAAO,OAAO,MAAM;AAAA,gBACtB,YAAY,EAAE,WAAW,GAAG,mBAAgB,EAAE,aAAa,GAAG,iCAA8B,EAAE,SAAS;AAAA,cACxG;AAAA,YACD,CAAC;AAAA,YACDA;AAAA,cACC;AAAA,cACA;AAAA,gBACC,OAAO,OAAO;AAAA,gBACd,UAAU,CAAC,MAAa;AACvB,oBAAE,eAAe;AACjB,wBAAM,MAAM,WAAW;AACvB,sBAAI,CAAC,IAAK;AACV,wBAAM,MAAM,eAAe,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAC3D,wBAAM,MAAM,OAAO,MAAM,KAAK;AAC9B,uBAAK,MAAM;AAAA,oBACV,QAAQ;AAAA,oBACR,GAAI,KAAK,QAAQ,EAAE,aAAa,KAAK,MAAM,IAAI,CAAC;AAAA,oBAChD,gBAAgB;AAAA,kBACjB,CAAC,EACC,KAAK,MAAM;AACX,4BAAQ,QAAQ,WAAW,GAAG,IAAI,EAAE,QAAQ;AAC5C,2BAAO,QAAQ;AACf,yBAAK,QAAQ;AAAA,kBACd,CAAC,EACA,MAAM,MAAM;AAAA,kBAAC,CAAC;AAAA,gBACjB;AAAA,cACD;AAAA,cACA;AAAA,gBACC,MAAM,QAAQ,sBAAsB;AAAA,gBACpC,MAAM,MAAM,qBAAqB,EAAE,UAAU,QAAQ,CAAC;AAAA,gBACtDA;AAAA,kBACC;AAAA,kBACA;AAAA,oBACC,MAAM;AAAA,oBACN,OAAO,OAAO;AAAA,oBACd,UAAU,CAAC,QAAQ,KAAK,OAAO,MAAM,KAAK,CAAC;AAAA,kBAC5C;AAAA,kBACA;AAAA,gBACD;AAAA,gBACA,QAAQ,QAAQA,IAAE,QAAQ,EAAE,OAAO,OAAO,GAAG,GAAG,QAAQ,KAAK,IAAI;AAAA,cAClE;AAAA,YACD;AAAA,YACAA,IAAE,MAAM,EAAE,OAAO,OAAO,SAAS,GAAG,QAAQ;AAAA,YAC5C,OAAO,MAAM,WAAW,IACrBA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,oBAAoB,IACpD;AAAA,cACA,CAAC,QAAQ,QAAQ,UAAU,MAAM;AAAA,cACjC,OAAO,MAAM;AAAA,gBAAI,CAACD,OACjBC,IAAE,MAAM,EAAE,KAAKD,GAAE,GAAG,GAAG;AAAA,kBACtB,GAAG,IAAI,KAAKA,GAAE,SAAS,EAAE,eAAe,GAAG,OAAO,KAAK;AAAA,kBACvD,GAAGA,GAAE,IAAI;AAAA,kBACT,GAAGA,GAAE,QAAQ,OAAO,IAAI;AAAA,kBACxB,GAAGA,GAAE,eAAe,IAAI,OAAO,KAAK;AAAA,gBACrC,CAAC;AAAA,cACF;AAAA,YACD;AAAA,YACF,cAAc,QACXC;AAAA,cACA;AAAA,cACA;AAAA,gBACC,MAAM;AAAA,gBACN,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,gBAC5C,SAAS,MAAM,KAAK,eAAe;AAAA,cACpC;AAAA,cACA;AAAA,YACD,IACC;AAAA,UACJ,IACCA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,MAAM;AAAA,YACtB;AAAA,UACD;AAAA,QACH,IACC;AAAA,MACJ,CAAC;AAAA,IACF;AAAA,EACD;AACD,CAAC;;;ACzQD,SAAS,qBAAqB;AAE9B,SAAS,mBAAAC,mBAAiB,KAAAC,KAAG,OAAAC,YAAW;AAMjC,IAAM,cAAcC,kBAAgB;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,QAAsC,UAAU,KAAK;AAAA,IACrE,UAAU,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,EACvC;AAAA,EACA,MAAM,OAAO;AACZ,UAAM,QAAQC,KAAI,EAAE,aAAa,IAAI,MAAM,IAAI,SAAS,GAAG,CAAC;AAC5D,UAAM,QAAQA,KAAsC,EAAE,OAAO,MAAM,SAAS,CAAC;AAC7E,UAAM,EAAE,QAAQ,SAAS,WAAW,OAAO,SAAS,SAAS,IAAI;AAAA,MAChE,MAAM;AAAA,MACN;AAAA,IACD;AACA,UAAM,QAAQ,CAAC,KAAyC,gBACvDC,IAAE,SAAS;AAAA,MACV,OAAO,MAAM,MAAM,GAAG;AAAA,MACtB,SAAS,CAAC,MACR,MAAM,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,GAAI,EAAE,OAA4B,MAAM;AAAA,MAC9E;AAAA,MACA,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MAC1C,cAAc;AAAA,IACf,CAAC;AACF,WAAO,MACNA,IAAE,OAAO,EAAE,OAAO,OAAO,UAAU,GAAG;AAAA,MACrCA,IAAE,MAAM,EAAE,OAAO,OAAO,MAAM,GAAG,OAAO;AAAA,MACxCA;AAAA,QACC;AAAA,QACA;AAAA,UACC,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAa;AACvB,cAAE,eAAe;AACjB,kBAAM,IAAI,MAAM;AAChB,kBAAM,QAAQ;AAAA,cACb,OAAO,MAAM;AAAA,cACb,GAAI,EAAE,YAAY,KAAK,IAAI,EAAE,aAAa,EAAE,YAAY,KAAK,EAAE,IAAI,CAAC;AAAA,cACpE,GAAI,EAAE,KAAK,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,cAC/C,GAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,YACzD;AAAA,UACD;AAAA,QACD;AAAA,QACA;AAAA,UACC,MAAM,eAAe,6BAA6B;AAAA,UAClD,MAAM,QAAQ,YAAY;AAAA,UAC1B,MAAM,WAAW,UAAU;AAAA,UAC3BA;AAAA,YACC;AAAA,YACA,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ,UAAU,UAAU,MAAM;AAAA,YAClE;AAAA,UACD;AAAA,UACA,cAAc,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC;AAAA,QAC/D;AAAA,MACD;AAAA,MACA,MAAM,QACHA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,WAAW,IACtE;AAAA,MACH,OAAO,MAAM,WAAW,KAAK,CAAC,UAAU,QACrCA,IAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,mCAAmC,IACnE;AAAA,QACA,CAAC,QAAQ,QAAQ,aAAa,SAAS,SAAS;AAAA,QAChD,OAAO,MAAM;AAAA,UAAI,CAAC,MACjBA,IAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG;AAAA,YACtB,GAAG,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,KAAK;AAAA,YACvD,GAAG,EAAE,MAAM,OAAO,IAAI;AAAA,YACtB,GAAG,OAAO,EAAE,QAAQ,aAAa,KAAK,QAAG,GAAG,OAAO,IAAI;AAAA,YACvD,GAAG,EAAE,WAAW,UAAK,OAAO,IAAI;AAAA,YAChC,GAAG,EAAE,aAAa,IAAI,OAAO,KAAK;AAAA,UACnC,CAAC;AAAA,QACF;AAAA,MACD;AAAA,MACF,UAAU,QAAQA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,eAAU,IAAI;AAAA,MACjE,QAAQ,SAAS,CAAC,UAAU,QACzBA;AAAA,QACA;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,UAC5C,SAAS,MAAM,KAAK,SAAS;AAAA,QAC9B;AAAA,QACA;AAAA,MACD,IACC;AAAA,IACJ,CAAC;AAAA,EACH;AACD,CAAC;;;AdlDD,IAAM,MAOD;AAAA,EACJ,EAAE,OAAO,SAAS,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,YAAY,CAAC,EAAE;AAAA,EACrE;AAAA,IACC,OAAO;AAAA,IACP,OAAO;AAAA,MACN,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,MACpC,EAAE,MAAM,eAAe,OAAO,cAAc;AAAA,MAC5C,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,MAClC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,IACnC;AAAA,EACD;AAAA,EACA,EAAE,OAAO,UAAU,OAAO,CAAC,EAAE,MAAM,SAAS,OAAO,SAAS,OAAO,OAAO,CAAC,EAAE;AAAA,EAC7E;AAAA,IACC,OAAO;AAAA,IACP,OAAO;AAAA,MACN,EAAE,MAAM,WAAW,OAAO,WAAW,OAAO,UAAU;AAAA,MACtD,EAAE,MAAM,cAAc,OAAO,cAAc,OAAO,UAAU;AAAA,IAC7D;AAAA,EACD;AAAA,EACA,EAAE,OAAO,YAAY,OAAO,CAAC,EAAE,MAAM,YAAY,OAAO,oBAAoB,OAAO,SAAS,CAAC,EAAE;AAAA,EAC/F,EAAE,OAAO,aAAa,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,aAAa,OAAO,UAAU,CAAC,EAAE;AAAA,EAC3F;AAAA,IACC,OAAO;AAAA,IACP,OAAO;AAAA,MACN,EAAE,MAAM,SAAS,OAAO,SAAS,OAAO,QAAQ;AAAA,MAChD,EAAE,MAAM,OAAO,OAAO,YAAY;AAAA,MAClC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,MAClC,EAAE,MAAM,cAAc,OAAO,aAAa;AAAA,IAC3C;AAAA,EACD;AACD;AAOO,IAAM,aAAaC,kBAAgB;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,QAAiC,UAAU,KAAK;AAAA;AAAA;AAAA,IAGhE,cAAc,EAAE,MAAM,QAAuC,SAAS,OAAU;AAAA,IAChF,eAAe,EAAE,MAAM,QAAwC,SAAS,OAAU;AAAA;AAAA,IAElF,YAAY,EAAE,MAAM,QAAqC,SAAS,OAAU;AAAA;AAAA,IAE5E,eAAe,EAAE,MAAM,QAAwC,SAAS,OAAU;AAAA;AAAA,IAElF,aAAa,EAAE,MAAM,QAAsC,SAAS,OAAU;AAAA,IAC9E,aAAa,EAAE,MAAM,QAAQ,SAAS,OAAU;AAAA;AAAA;AAAA,IAGhD,MAAM,EAAE,MAAM,QAA+B,SAAS,OAAU;AAAA,EACjE;AAAA,EACA,OAAO,EAAE,UAAU,CAAC,UAAqB,KAAK;AAAA,EAC9C,MAAM,OAAO,EAAE,KAAK,GAAG;AACtB,UAAM,MAAMC,KAAe,WAAW;AACtC,UAAM,UAAUC,UAAS,MAAM,MAAM,QAAQ,IAAI,KAAK;AACtD,UAAM,UAAUD,KAAa,IAAI;AACjC,UAAM,KAAK,CAAC,MAAiB;AAC5B,cAAQ,QAAQ;AAChB,WAAK,YAAY,CAAC;AAClB,UAAI,MAAM,SAAS,OAAW,KAAI,QAAQ;AAAA,IAC3C;AACA,UAAM,OAAO,MACZE;AAAA,MACC;AAAA,MACA,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ,SAAS,MAAO,QAAQ,QAAQ,KAAM;AAAA,MAC9E;AAAA,IACD;AAED,UAAM,OAAO,MAAuB;AACnC,YAAM,IAAI,MAAM;AAChB,cAAQ,QAAQ,OAAO;AAAA,QACtB,KAAK;AACJ,iBAAOA,IAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;AAAA,QACxC,KAAK;AACJ,iBAAOA,IAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;AAAA,QACtC,KAAK;AACJ,iBAAOA,IAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAAA,QACrC,KAAK;AACJ,iBAAOA,IAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC;AAAA,QAC1C,KAAK;AACJ,iBAAOA,IAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAAA,QACrC,KAAK;AACJ,iBAAOA,IAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAAA,QACrC,KAAK;AACJ,iBAAOA,IAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;AAAA,QACzC,KAAK;AACJ,iBAAOA,IAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AAAA,QACvC,KAAK;AACJ,iBAAO,MAAM,gBACVA,IAAE,eAAe,EAAE,QAAQ,MAAM,cAAc,CAAC,IAChDA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,OAAO;AAAA,YACvB;AAAA,UACD;AAAA,QACH,KAAK;AACJ,iBAAO,MAAM,gBACVA,IAAE,kBAAkB,EAAE,QAAQ,MAAM,cAAc,CAAC,IACnDA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,OAAO;AAAA,YACvB;AAAA,UACD;AAAA,QACH,KAAK;AACJ,iBAAO,MAAM,cACVA,IAAE,aAAa,EAAE,QAAQ,MAAM,YAAY,CAAC,IAC5CA;AAAA,YACA;AAAA,YACA,EAAE,OAAO,OAAO,OAAO;AAAA,YACvB;AAAA,UACD;AAAA,QACH,KAAK;AACJ,iBAAO,MAAM,aACVA,IAAE,aAAa,EAAE,QAAQ,MAAM,WAAW,CAAC,IAC3CA,IAAE,KAAK,EAAE,OAAO,OAAO,OAAO,GAAG,gDAAgD;AAAA,QACrF,KAAK,YAAY;AAChB,gBAAM,KAAK,MAAM;AACjB,cAAI,CAAC;AACJ,mBAAOA;AAAA,cACN;AAAA,cACA,EAAE,OAAO,OAAO,OAAO;AAAA,cACvB;AAAA,YACD;AACD,gBAAM,IAAI,QAAQ;AAClB,cAAI,KAAK,EAAE,SAAS;AACnB,mBAAO;AAAA,cACN,KAAK;AAAA,cACLA,IAAE,oBAAoB;AAAA,gBACrB,QAAQ;AAAA,gBACR,MAAM,EAAE;AAAA,gBACR,WAAW,EAAE;AAAA,gBACb,GAAI,MAAM,gBAAgB,SAAY,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,gBAC5E,SAAS,MAAO,QAAQ,QAAQ;AAAA,cACjC,CAAC;AAAA,YACF;AACD,iBAAOA,IAAE,kBAAkB;AAAA,YAC1B,QAAQ;AAAA,YACR,GAAI,MAAM,gBAAgB,SAAY,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,YAC5E,mBAAmB,CAAC,QAAiB,QAAQ,QAAQ,EAAE,MAAM,UAAU,IAAI;AAAA,YAC3E,mBAAmB,CAAC,QAAiB,QAAQ,QAAQ,EAAE,MAAM,UAAU,IAAI;AAAA,YAC3E,aAAa;AAAA,YACb,mBAAmB,MAAO,QAAQ,QAAQ,EAAE,MAAM,UAAU,KAAK,GAAG;AAAA,YACpE,mBAAmB,MAAO,QAAQ,QAAQ,EAAE,MAAM,UAAU,KAAK,GAAG;AAAA,UACrE,CAAC;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AACjB,gBAAM,KAAK,MAAM;AACjB,cAAI,CAAC;AACJ,mBAAOA;AAAA,cACN;AAAA,cACA,EAAE,OAAO,OAAO,OAAO;AAAA,cACvB;AAAA,YACD;AACD,gBAAM,IAAI,QAAQ;AAClB,cAAI,GAAG,SAAS;AACf,mBAAO;AAAA,cACN,KAAK;AAAA,cACLA,IAAE,sBAAsB;AAAA,gBACvB,QAAQ;AAAA,gBACR,MAAM,EAAE;AAAA,gBACR,SAAS,MAAO,QAAQ,QAAQ;AAAA,cACjC,CAAC;AAAA,YACF;AACD,iBAAOA,IAAE,oBAAoB;AAAA,YAC5B,QAAQ;AAAA,YACR,qBAAqB,CAACC,OACpB,QAAQ,QAAQ,EAAE,MAAM,YAAY,MAAMA,GAAE,KAAK;AAAA,UACpD,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAEA,WAAO,MACND,IAAE,OAAO,EAAE,OAAO,OAAO,MAAM,GAAG;AAAA,MACjCA;AAAA,QACC;AAAA,QACA,EAAE,OAAO,OAAO,KAAK,cAAc,QAAQ;AAAA,QAC3C,IAAI,IAAI,CAAC,MAAM;AACd,gBAAM,QAAQ,EAAE,MAAM;AAAA,YACrB,CAAC,MACA,CAAC,EAAE,UACF,EAAE,UAAU,WACV,MAAM,eACN,EAAE,UAAU,YACX,MAAM,gBACN,EAAE,UAAU,SACX,MAAM,aACN,EAAE,UAAU,YACX,MAAM,gBACN,MAAM;AAAA,UACd;AACA,cAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,iBAAOA,IAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG;AAAA,YACjCA,IAAE,OAAO,EAAE,OAAO,OAAO,SAAS,GAAG,EAAE,KAAK;AAAA,YAC5C,GAAG,MAAM;AAAA,cAAI,CAAC,MACbA;AAAA,gBACC;AAAA,gBACA;AAAA,kBACC,KAAK,EAAE;AAAA,kBACP,MAAM;AAAA,kBACN,OAAO;AAAA,oBACN,GAAG,OAAO;AAAA,oBACV,GAAI,QAAQ,UAAU,EAAE,OAAO,OAAO,gBAAgB,CAAC;AAAA,kBACxD;AAAA,kBACA,gBAAgB,QAAQ,UAAU,EAAE,OAAO,SAAS;AAAA,kBACpD,SAAS,MAAM,GAAG,EAAE,IAAI;AAAA,gBACzB;AAAA,gBACA,EAAE;AAAA,cACH;AAAA,YACD;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAAA,MACF;AAAA,MACAA,IAAE,QAAQ,EAAE,OAAO,OAAO,KAAK,GAAG,KAAK,CAAC;AAAA,IACzC,CAAC;AAAA,EACH;AACD,CAAC;","names":["computed","defineComponent","h","ref","h","t","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","defineComponent","h","t","defineComponent","h","ref","defineComponent","ref","h","u","defineComponent","h","defineComponent","h","defineComponent","h","ref","defineComponent","ref","t","h","defineComponent","h","ref","defineComponent","ref","h","defineComponent","ref","computed","h","t"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fonderie/vue-admin-screens",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "fonderie": {
5
5
  "stability": "experimental"
6
6
  },