@fonderie/vue-admin-screens 1.6.0 → 1.6.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.ts","../src/styles.ts","../src/ui.ts","../src/icons.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/OperatorsScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts","../src/billing.ts","../src/screens/SubscriberBilling.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\tOperatorsScreen,\n\tMigrationsScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tSubscriberBilling,\n\tAuditScreen,\n} from './screens';\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminMessageKey,\n\ttype AuditAdminClient,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\ttype ConfigAdminClient,\n\ttype CourierAdminClient,\n\tcreateAdminT,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport {\n\tTemplateCreateScreen,\n\tTemplateEditorScreen,\n\tTemplateListScreen,\n} from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, onBeforeUnmount, onMounted, ref } from 'vue';\nimport type { IconName } from '../icons';\nimport { styles } from '../styles';\nimport { icon } from '../ui';\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 { OperatorsScreen } from './OperatorsScreen';\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| 'operators'\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: AdminMessageKey;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: AdminMessageKey;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit' | 'operators';\n\t}>;\n}> = [\n\t{ group: 'nav.groups.today', items: [{ page: 'attention', label: 'nav.items.attention' }] },\n\t{\n\t\tgroup: 'nav.groups.system',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'nav.items.modules' },\n\t\t\t{ page: 'environment', label: 'nav.items.environment' },\n\t\t\t{ page: 'doctor', label: 'nav.items.doctor' },\n\t\t\t{ page: 'routes', label: 'nav.items.routes' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.people',\n\t\titems: [{ page: 'users', label: 'nav.items.users', needs: 'auth' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'nav.items.catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'nav.items.subscriptions', needs: 'billing' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.settings',\n\t\titems: [{ page: 'settings', label: 'nav.items.settings', needs: 'config' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.messaging',\n\t\titems: [{ page: 'templates', label: 'nav.items.templates', needs: 'courier' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'nav.items.audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'nav.items.log' },\n\t\t\t{ page: 'operators', label: 'nav.items.operators', needs: 'operators' },\n\t\t\t{ page: 'tokens', label: 'nav.items.tokens' },\n\t\t\t{ page: 'migrations', label: 'nav.items.migrations' },\n\t\t],\n\t},\n];\n\nconst ICON: Record<AdminPage, IconName> = {\n\tattention: 'attention',\n\tmodules: 'modules',\n\tenvironment: 'environment',\n\tdoctor: 'doctor',\n\troutes: 'routes',\n\tusers: 'users',\n\tcatalog: 'catalog',\n\tsubscriber: 'subscriber',\n\tsettings: 'settings',\n\ttemplates: 'templates',\n\taudit: 'audit',\n\tlog: 'log',\n\ttokens: 'tokens',\n\toperators: 'users',\n\tmigrations: 'migrations',\n};\n\n// Below this width the sidebar becomes a drawer behind a top bar. Measured in\n// JS rather than a media query so it also works embedded, with no stylesheet.\nconst NARROW = '(max-width: 820px)';\n\n// What is open, and exactly which row: the same key exists per environment\n// and the same template per locale — dropping either opened the wrong row.\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string; environment?: string; environments?: string[] }\n\t| { kind: 'template'; type: string; locale: string | null; system: boolean }\n\t| { kind: 'template-new'; type?: string; locales?: 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\t// Shown at the top of the sidebar. Defaults to \"Admin\".\n\t\tappName: { type: String, default: 'Admin' },\n\t\t// A badge beside the name — the deployment's environment (\"production\").\n\t\t// Production is tinted so an operator always knows where their clicks land.\n\t\tenvLabel: { type: String, default: undefined },\n\t\t// The deployment has operator accounts (@fonderie/admin with a store):\n\t\t// shows the Operators page.\n\t\toperators: { type: Boolean, default: false },\n\t\t// The signed-in operator's email, when a person (not a token) is signed in.\n\t\tcurrentOperator: { type: String, default: undefined },\n\t\t// Where the app serves GET /config/public — marks public keys on the\n\t\t// Config page and previews exactly what frontends receive.\n\t\tpublicConfigUrl: { type: String, default: undefined },\n\t\t// The console's own language (the operator's choice, independent of the\n\t\t// locales the app serves). Default English.\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\t// `footer` slot: pinned to the bottom of the sidebar — session controls\n\t// (theme, sign out). The React shell takes the same thing as a `footer` prop.\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit, slots }) {\n\t\tconst tr = computed(() => createAdminT(props.locale));\n\t\tconst query =\n\t\t\ttypeof window !== 'undefined' && window.matchMedia ? window.matchMedia(NARROW) : null;\n\t\tconst narrow = ref(query?.matches ?? false);\n\t\tconst drawer = ref(false);\n\t\tconst onMedia = (e: MediaQueryListEvent) => (narrow.value = e.matches);\n\t\tonMounted(() => query?.addEventListener('change', onMedia));\n\t\tonBeforeUnmount(() => query?.removeEventListener('change', onMedia));\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\t// A user opened from Subscriptions: their billing lives on the Users page.\n\t\tconst openUser = ref<string | undefined>(undefined);\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\tdrawer.value = false;\n\t\t};\n\t\tconst back = (label: string) =>\n\t\t\th('div', { style: { padding: '24px 40px 0' } }, [\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ type: 'button', style: styles.buttonGhost, onClick: () => (editing.value = null) },\n\t\t\t\t\t[icon('back', 14), label],\n\t\t\t\t),\n\t\t\t]);\n\t\tconst missing = (text: string) =>\n\t\t\th('p', { style: { ...styles.status, padding: '32px 40px' } }, text);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tconst t = tr.value;\n\t\t\tconst loc = props.locale ? { locale: props.locale } : {};\n\t\t\tconst missingClient = (client: string) => missing(t('shell.missingClient', { client }));\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c, ...loc });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c, ...loc });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c, ...loc });\n\t\t\t\tcase 'environment':\n\t\t\t\t\treturn h(EnvironmentScreen, { client: c, ...loc });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c, ...loc });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c, ...loc });\n\t\t\t\tcase 'operators':\n\t\t\t\t\treturn h(OperatorsScreen, {\n\t\t\t\t\t\tclient: c,\n\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t...(props.currentOperator ? { me: props.currentOperator } : {}),\n\t\t\t\t\t});\n\t\t\t\tcase 'migrations':\n\t\t\t\t\treturn h(MigrationsScreen, { client: c, ...loc });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c, ...loc });\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, ...loc })\n\t\t\t\t\t\t: missingClient('BillingAdminClient');\n\t\t\t\tcase 'subscriber':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(SubscriberScreen, {\n\t\t\t\t\t\t\t\tclient: props.billingClient,\n\t\t\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t\t\t...(props.authClient\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tonOpenUser: (id: string) => {\n\t\t\t\t\t\t\t\t\t\t\t\topenUser.value = id;\n\t\t\t\t\t\t\t\t\t\t\t\tgo('users');\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})\n\t\t\t\t\t\t: missingClient('BillingAdminClient');\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, ...loc })\n\t\t\t\t\t\t: missingClient('AuditAdminClient');\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, {\n\t\t\t\t\t\t\t\tkey: openUser.value ?? 'list',\n\t\t\t\t\t\t\t\tclient: props.authClient,\n\t\t\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t\t\t...(props.billingClient ? { billingClient: props.billingClient } : {}),\n\t\t\t\t\t\t\t\t...(openUser.value ? { openUserId: openUser.value } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: missingClient('AuthAdminClient');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc) return missingClient('ConfigAdminClient');\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && (e.kind === 'config' || e.kind === 'secret')) {\n\t\t\t\t\t\tconst env = e.environment ?? props.environment;\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(t('nav.items.settings')),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tkey: `${e.kind}:${e.key}:${e.environment ?? ''}`,\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\t...loc,\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...(env !== undefined ? { environment: env } : {}),\n\t\t\t\t\t\t\t\t...(e.environments ? { environments: e.environments } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t\tonDeleted: () => (editing.value = null),\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\ttype Ctx = { environments: string[]; environment: string | null };\n\t\t\t\t\tconst create = (kind: 'config' | 'secret') => (c: Ctx) =>\n\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\tenvironments: c.environments,\n\t\t\t\t\t\t\t...(c.environment ? { environment: c.environment } : {}),\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...loc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t...(props.publicConfigUrl ? { publicConfigUrl: props.publicConfigUrl } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string, environment: string) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'config', key, environment }),\n\t\t\t\t\t\t'onSelect-secret': (key: string, environment: string) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'secret', key, environment }),\n\t\t\t\t\t\tallowCreate: true,\n\t\t\t\t\t\t'onCreate-config': create('config'),\n\t\t\t\t\t\t'onCreate-secret': create('secret'),\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) return missingClient('CourierAdminClient');\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template-new')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(t('nav.items.templates')),\n\t\t\t\t\t\t\th(TemplateCreateScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t\t\t...(e.type ? { type: e.type } : {}),\n\t\t\t\t\t\t\t\t...(e.locales ? { locales: e.locales } : {}),\n\t\t\t\t\t\t\t\tonCreated: (c: { type: string; locale: string | null }) =>\n\t\t\t\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\t\t\t\ttype: c.type,\n\t\t\t\t\t\t\t\t\t\tlocale: c.locale,\n\t\t\t\t\t\t\t\t\t\tsystem: false,\n\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\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(t('nav.items.templates')),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tkey: `${e.type}:${e.locale ?? ''}`,\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\t...(props.locale ? { uiLocale: props.locale } : {}),\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tlocale: e.locale,\n\t\t\t\t\t\t\t\tsystem: e.system,\n\t\t\t\t\t\t\t\tallowAddLocale: true,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t\tonDeleted: () => (editing.value = null),\n\t\t\t\t\t\t\t\t'onAdd-locale': (type: string) => (editing.value = { kind: 'template-new', type }),\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...loc,\n\t\t\t\t\t\tallowCreate: true,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string; locale: string | null; system?: boolean }) =>\n\t\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\t\ttype: t.type,\n\t\t\t\t\t\t\t\tlocale: t.locale ?? null,\n\t\t\t\t\t\t\t\tsystem: t.system === true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t'onCreate-template': (c: { locales: string[] }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template-new', locales: c.locales }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst visible = (i: {\n\t\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit' | 'operators';\n\t\t}) =>\n\t\t\t!i.needs ||\n\t\t\t(i.needs === 'operators'\n\t\t\t\t? props.operators\n\t\t\t\t: i.needs === 'config'\n\t\t\t\t\t? props.configClient\n\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t: i.needs === 'auth'\n\t\t\t\t\t\t\t? props.authClient\n\t\t\t\t\t\t\t: i.needs === 'billing'\n\t\t\t\t\t\t\t\t? props.billingClient\n\t\t\t\t\t\t\t\t: props.auditClient);\n\n\t\tconst brand = () => {\n\t\t\tconst production = props.envLabel ? /^prod/i.test(props.envLabel) : false;\n\t\t\treturn h('div', { style: styles.navBrand }, [\n\t\t\t\th('div', { style: styles.navMark }, [icon('mark', 15)]),\n\t\t\t\th('div', { style: { minWidth: 0, flex: 1 } }, [\n\t\t\t\t\th('div', { style: styles.navBrandTitle }, props.appName),\n\t\t\t\t\tprops.envLabel\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{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.badge,\n\t\t\t\t\t\t\t\t\t\tmarginTop: '3px',\n\t\t\t\t\t\t\t\t\t\tpadding: '0 7px',\n\t\t\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\t\t\t...(production\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: 'var(--fonderie-danger,#e00)',\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderColor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'color-mix(in srgb, var(--fonderie-danger,#e00) 35%, transparent)',\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},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tprops.envLabel,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\t]),\n\t\t\t\tnarrow.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.buttonGhost,\n\t\t\t\t\t\t\t\t'aria-label': tr.value('shell.closeMenu'),\n\t\t\t\t\t\t\t\tonClick: () => (drawer.value = false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[icon('close')],\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\n\t\tconst nav = () =>\n\t\t\th(\n\t\t\t\t'nav',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\t...styles.nav,\n\t\t\t\t\t\t...(narrow.value\n\t\t\t\t\t\t\t? { width: '280px', maxWidth: '85vw', boxShadow: '0 10px 40px rgba(0,0,0,.25)' }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t\t'aria-label': tr.value('shell.navLabel'),\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\tbrand(),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: styles.navScroll },\n\t\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\t\tconst items = g.items.filter(visible);\n\t\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\t\th('div', { style: styles.navGroup }, tr.value(g.group)),\n\t\t\t\t\t\t\t\t...items.map((i) => {\n\t\t\t\t\t\t\t\t\tconst active = current.value === i.page;\n\t\t\t\t\t\t\t\t\treturn 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\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tclass: 'fonderie-admin-nav-item',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, ...(active ? styles.navItemActive : {}) },\n\t\t\t\t\t\t\t\t\t\t\t'aria-current': active ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\topenUser.value = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\tgo(i.page);\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\t[\n\t\t\t\t\t\t\t\t\t\t\ticon(ICON[i.page], 16, active ? styles.navIconActive : undefined),\n\t\t\t\t\t\t\t\t\t\t\ttr.value(i.label),\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]);\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tslots['footer'] ? h('div', { style: styles.navFooter }, slots['footer']()) : null,\n\t\t\t\t],\n\t\t\t);\n\n\t\treturn () => {\n\t\t\tconst titleKey = NAV.flatMap((g) => g.items).find((i) => i.page === current.value)?.label;\n\t\t\tconst title = titleKey ? tr.value(titleKey) : '';\n\t\t\treturn h(\n\t\t\t\t'div',\n\t\t\t\t{ style: { ...styles.shell, ...(narrow.value ? { flexDirection: 'column' } : {}) } },\n\t\t\t\t[\n\t\t\t\t\t...(narrow.value\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\th('div', { style: styles.topbar }, [\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: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: styles.buttonGhost,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': tr.value('shell.openMenu'),\n\t\t\t\t\t\t\t\t\t\t\t'aria-expanded': drawer.value,\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => (drawer.value = true),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t[icon('menu')],\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\th('span', { style: { fontWeight: 600, fontSize: '14px' } }, title),\n\t\t\t\t\t\t\t\t\tprops.envLabel\n\t\t\t\t\t\t\t\t\t\t? h('span', { style: { ...styles.badge, marginLeft: 'auto' } }, props.envLabel)\n\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\tdrawer.value\n\t\t\t\t\t\t\t\t\t? h('div', { style: styles.drawer }, [\n\t\t\t\t\t\t\t\t\t\t\tnav(),\n\t\t\t\t\t\t\t\t\t\t\th('div', {\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.scrim,\n\t\t\t\t\t\t\t\t\t\t\t\t'aria-hidden': 'true',\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (drawer.value = false),\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: null,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [nav()]),\n\t\t\t\t\th('main', { class: 'fonderie-admin-main', style: styles.main }, body()),\n\t\t\t\t],\n\t\t\t);\n\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.\n//\n// Tints (pill backgrounds) use color-mix() over the same tokens, so a status\n// colour and its background can never drift apart and dark mode needs no\n// second palette. Where color-mix is unsupported the background is simply\n// dropped and the coloured text still carries the meaning.\nexport const 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\n/** A token mixed into transparency — for tinted backgrounds that follow the theme. */\nexport const tint = (token: string, pct: number): string =>\n\t`color-mix(in srgb, ${token} ${pct}%, transparent)`;\n\nexport type Tone = 'ok' | 'bad' | 'warn' | 'neutral' | 'info';\nexport const toneColor: Record<Tone, string> = {\n\tok: t.accentStrong,\n\tbad: t.danger,\n\t// Amber on white fails contrast; mixing in the text colour darkens it in\n\t// light mode and lightens it in dark, from the same two tokens.\n\twarn: `color-mix(in srgb, ${t.warning} 70%, ${t.text})`,\n\tneutral: t.muted,\n\tinfo: t.text,\n};\n\nconst control: CSSProperties = {\n\tdisplay: 'inline-flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tgap: 6,\n\theight: 32,\n\tboxSizing: 'border-box',\n\tborderRadius: 6,\n\tpadding: '0 12px',\n\tfontSize: 13,\n\tfontWeight: 500,\n\tfontFamily: 'inherit',\n\tlineHeight: 1,\n\twhiteSpace: 'nowrap',\n};\n\nconst raw: 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// Sticky, full height, scrolls on its own: the nav never scrolls away with\n\t// a long table, and the footer (session controls) stays in reach.\n\tnav: {\n\t\twidth: 248,\n\t\tflexShrink: 0,\n\t\tboxSizing: 'border-box',\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tbackground: t.surface,\n\t\tposition: 'sticky',\n\t\ttop: 0,\n\t\theight: '100vh',\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t},\n\tnavBrand: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 10,\n\t\tpadding: '18px 16px 14px',\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t},\n\tnavMark: {\n\t\twidth: 28,\n\t\theight: 28,\n\t\tborderRadius: 7,\n\t\tbackground: t.text,\n\t\tcolor: t.surface,\n\t\tdisplay: 'grid',\n\t\tplaceItems: 'center',\n\t\tflexShrink: 0,\n\t},\n\tnavBrandTitle: {\n\t\tfontSize: 14,\n\t\tfontWeight: 600,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tlineHeight: 1.2,\n\t\toverflow: 'hidden',\n\t\ttextOverflow: 'ellipsis',\n\t\twhiteSpace: 'nowrap',\n\t},\n\tnavScroll: { flex: 1, overflowY: 'auto', padding: '8px 10px 16px' },\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 8px 4px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 10,\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: 6,\n\t\tpadding: '7px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13.5,\n\t\tfontWeight: 500,\n\t\tcolor: t.muted,\n\t\tfontFamily: 'inherit',\n\t\tposition: 'relative',\n\t},\n\tnavItemActive: { background: tint(t.accent, 12), color: t.text, fontWeight: 600 },\n\tnavIconActive: { color: t.accentStrong },\n\tnavFooter: {\n\t\tborderTop: `1px solid ${t.borderLight}`,\n\t\tpadding: 12,\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t\tgap: 10,\n\t},\n\t// Phone layout: a top bar with the menu button replaces the sidebar, which\n\t// opens as a drawer over the content.\n\ttopbar: {\n\t\tposition: 'sticky',\n\t\ttop: 0,\n\t\tzIndex: 20,\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 10,\n\t\tpadding: '10px 16px',\n\t\tbackground: t.surface,\n\t\tborderBottom: `1px solid ${t.border}`,\n\t},\n\tdrawer: {\n\t\tposition: 'fixed',\n\t\tinset: 0,\n\t\tzIndex: 30,\n\t\tdisplay: 'flex',\n\t},\n\tscrim: { flex: 1, background: 'rgba(0,0,0,.35)' },\n\tmain: { flex: 1, minWidth: 0 },\n\tcontainer: { padding: '32px 40px 64px', maxWidth: 1160, boxSizing: 'border-box' },\n\n\t// ── page header ──\n\theader: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'flex-start',\n\t\tjustifyContent: 'space-between',\n\t\tgap: 16,\n\t\tmarginBottom: 24,\n\t\tflexWrap: 'wrap',\n\t},\n\ttitle: {\n\t\tfontSize: 22,\n\t\tfontWeight: 600,\n\t\tmargin: 0,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tlineHeight: 1.25,\n\t},\n\tlead: { color: t.muted, fontSize: 13.5, margin: '4px 0 0', lineHeight: 1.5 },\n\tactions: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' },\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 32,\n\t\tmarginBottom: 10,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 8,\n\t},\n\n\t// ── feedback ──\n\tstatus: { padding: '24px 0', color: t.muted, fontSize: 13.5 },\n\terror: {\n\t\tcolor: t.danger,\n\t\tbackground: tint(t.danger, 8),\n\t\tborder: `1px solid ${tint(t.danger, 25)}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: 16,\n\t\tfontSize: 13.5,\n\t},\n\tnotice: {\n\t\tcolor: t.text,\n\t\tbackground: tint(t.warning, 10),\n\t\tborder: `1px solid ${tint(t.warning, 35)}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: 16,\n\t\tfontSize: 13.5,\n\t},\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: 12.5 },\n\tcode: {\n\t\tfontFamily: t.mono,\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.borderLight}`,\n\t\tborderRadius: 4,\n\t\tpadding: '1px 5px',\n\t},\n\n\t// ── surfaces ──\n\t// Tables and lists are cards themselves, so every screen gets the framed,\n\t// rounded look without wrapping each one. The last row's rule is removed in\n\t// the shell stylesheet (a pseudo-selector); embedded without the shell it\n\t// simply doubles against the frame.\n\ttable: {\n\t\twidth: '100%',\n\t\tborderCollapse: 'separate',\n\t\tborderSpacing: 0,\n\t\tfontSize: 13.5,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\toverflow: 'hidden',\n\t\tboxShadow: t.shadowCard,\n\t},\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '9px 14px',\n\t\tfontWeight: 600,\n\t\tfontSize: 11.5,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.4,\n\t\tcolor: t.muted,\n\t\tbackground: t.surfaceAlt,\n\t\twhiteSpace: 'nowrap',\n\t},\n\ttd: {\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t\tpadding: '11px 14px',\n\t\tverticalAlign: 'top',\n\t},\n\tlist: {\n\t\tlistStyle: 'none',\n\t\tpadding: 0,\n\t\tmargin: 0,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\toverflow: 'hidden',\n\t\tboxShadow: t.shadowCard,\n\t},\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '12px 16px' },\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\tgrid: {\n\t\tdisplay: 'grid',\n\t\tgridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',\n\t\tgap: 12,\n\t\tmarginBottom: 24,\n\t},\n\tstatLabel: { fontSize: 12, color: t.muted, fontWeight: 500 },\n\tstatValue: {\n\t\tfontSize: 26,\n\t\tfontWeight: 600,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tlineHeight: 1.2,\n\t\tmarginTop: 6,\n\t},\n\tstatHint: { fontSize: 12, color: t.muted, marginTop: 2 },\n\tempty: {\n\t\tbackground: t.surface,\n\t\tborder: `1px dashed ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: '40px 24px',\n\t\ttextAlign: 'center',\n\t\tcolor: t.muted,\n\t\tfontSize: 13.5,\n\t},\n\temptyTitle: { color: t.text, fontWeight: 600, fontSize: 14.5, margin: '10px 0 4px' },\n\tdl: { display: 'grid', gridTemplateColumns: '160px 1fr', margin: 0 },\n\tdt: {\n\t\tcolor: t.muted,\n\t\tfontSize: 13,\n\t\tpadding: '10px 16px',\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t},\n\tdd: {\n\t\tmargin: 0,\n\t\tpadding: '10px 16px',\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t\tfontSize: 13.5,\n\t\tminWidth: 0,\n\t},\n\n\tbadge: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: 5,\n\t\tborderRadius: 999,\n\t\tpadding: '2px 8px',\n\t\tfontSize: 11.5,\n\t\tfontWeight: 500,\n\t\tlineHeight: 1.5,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t\twhiteSpace: 'nowrap',\n\t},\n\tpill: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: 6,\n\t\tborderRadius: 999,\n\t\tpadding: '2px 9px 2px 8px',\n\t\tfontSize: 12,\n\t\tfontWeight: 600,\n\t\tlineHeight: 1.5,\n\t\twhiteSpace: 'nowrap',\n\t\tverticalAlign: 'baseline',\n\t},\n\tdot: { width: 6, height: 6, borderRadius: 999, flexShrink: 0, background: 'currentColor' },\n\n\t// ── controls ──\n\tbutton: {\n\t\t...control,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.text,\n\t\tcursor: 'pointer',\n\t\tboxShadow: t.shadowCard,\n\t},\n\tbuttonPrimary: {\n\t\t...control,\n\t\tbackground: t.text,\n\t\tborder: `1px solid ${t.text}`,\n\t\tcolor: t.surface,\n\t\tcursor: 'pointer',\n\t},\n\tbuttonDanger: {\n\t\t...control,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${tint(t.danger, 40)}`,\n\t\tcolor: t.danger,\n\t\tcursor: 'pointer',\n\t},\n\tbuttonGhost: {\n\t\t...control,\n\t\tbackground: 'none',\n\t\tborder: '1px solid transparent',\n\t\tcolor: t.muted,\n\t\tcursor: 'pointer',\n\t\tpadding: '0 8px',\n\t},\n\tlink: {\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tpadding: 0,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tfontSize: 'inherit',\n\t\tfontWeight: 500,\n\t\tcursor: 'pointer',\n\t\ttextAlign: 'left',\n\t},\n\tinput: {\n\t\theight: 32,\n\t\tboxSizing: 'border-box',\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: 6,\n\t\tpadding: '0 10px',\n\t\tfontSize: 13.5,\n\t\tfontFamily: 'inherit',\n\t\tbackground: t.surface,\n\t\tcolor: t.text,\n\t\tminWidth: 0,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 16, flexWrap: 'wrap' },\n\taccent: { color: t.accent },\n};\n\n// Same values as the React screens' styles.ts, which writes lengths as bare\n// numbers (React appends px). Vue assigns style values verbatim and the\n// browser drops a unitless length, so numbers become px here — except for\n// the properties that are genuinely unitless.\nconst UNITLESS = new Set([\n\t'fontWeight',\n\t'lineHeight',\n\t'opacity',\n\t'zIndex',\n\t'flex',\n\t'flexGrow',\n\t'flexShrink',\n\t'order',\n]);\nfunction withUnits(sheet: Record<string, CSSProperties>): Record<string, CSSProperties> {\n\tconst out: Record<string, CSSProperties> = {};\n\tfor (const [name, rule] of Object.entries(sheet)) {\n\t\tconst fixed: Record<string, unknown> = {};\n\t\tfor (const [prop, value] of Object.entries(rule)) {\n\t\t\tfixed[prop] = typeof value === 'number' && !UNITLESS.has(prop) ? `${value}px` : value;\n\t\t}\n\t\tout[name] = fixed as CSSProperties;\n\t}\n\treturn out;\n}\n\nexport const styles: Record<string, CSSProperties> = withUnits(raw);\n","import type { CSSProperties, VNode, VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { ICONS, type IconName } from './icons';\nimport { styles, type Tone, tint, toneColor } from './styles';\n\n// Small building blocks every screen composes, so a header, a status or an\n// empty page looks the same everywhere instead of being re-invented per\n// screen. Render helpers (not components), matching ./screens/common.ts;\n// the React screens ship the same blocks as components in ui.tsx.\n\nexport function icon(name: IconName, size = 16, style?: CSSProperties): VNode {\n\treturn h(\n\t\t'svg',\n\t\t{\n\t\t\twidth: size,\n\t\t\theight: size,\n\t\t\tviewBox: '0 0 24 24',\n\t\t\tfill: 'none',\n\t\t\tstroke: 'currentColor',\n\t\t\t'stroke-width': 2,\n\t\t\t'stroke-linecap': 'round',\n\t\t\t'stroke-linejoin': 'round',\n\t\t\t'aria-hidden': 'true',\n\t\t\tstyle: { flexShrink: 0, ...style },\n\t\t},\n\t\tICONS[name].map((d) => h('path', { key: d, d })),\n\t);\n}\n\n/** Title, one line saying what the page answers, and its actions on the right. */\nexport function pageHeader(title: VNodeChild, lead?: VNodeChild, actions?: VNodeChild[]): VNode {\n\treturn h('div', { style: styles.header }, [\n\t\th('div', { style: { minWidth: 0 } }, [\n\t\t\th('h1', { style: styles.title }, title as never),\n\t\t\tlead ? h('p', { style: styles.lead }, lead as never) : null,\n\t\t]),\n\t\tactions?.filter(Boolean).length ? h('div', { style: styles.actions }, actions as never) : null,\n\t]);\n}\n\n/** A status: coloured text on a tint of the same colour, with a dot. */\nexport function pill(tone: Tone, text: VNodeChild, dot = true): VNode {\n\tconst color = toneColor[tone];\n\treturn h(\n\t\t'span',\n\t\t{ style: { ...styles.pill, color, background: tint(color, tone === 'neutral' ? 10 : 13) } },\n\t\t[dot ? h('span', { style: styles.dot }) : null, text as never],\n\t);\n}\n\nexport function stat(label: VNodeChild, value: VNodeChild, hint?: VNodeChild, tone?: Tone): VNode {\n\treturn h('div', { style: styles.card }, [\n\t\th('div', { style: styles.statLabel }, label as never),\n\t\th(\n\t\t\t'div',\n\t\t\t{ style: { ...styles.statValue, ...(tone ? { color: toneColor[tone] } : {}) } },\n\t\t\tvalue as never,\n\t\t),\n\t\thint ? h('div', { style: styles.statHint }, hint as never) : null,\n\t]);\n}\n\nexport function empty(title: VNodeChild, body?: VNodeChild, iconName: IconName = 'check'): VNode {\n\treturn h('div', { style: styles.empty }, [\n\t\ticon(iconName, 22),\n\t\th('div', { style: styles.emptyTitle }, title as never),\n\t\tbody ? h('div', body as never) : null,\n\t]);\n}\n\nexport function refreshButton(\n\tonClick: () => void,\n\tbusy: boolean,\n\tlabel = 'Refresh',\n\tbusyLabel = 'Working…',\n): VNode {\n\treturn h('button', { type: 'button', style: styles.button, onClick, disabled: busy }, [\n\t\ticon('refresh', 14),\n\t\tbusy ? busyLabel : label,\n\t]);\n}\n\n/** Colour for an HTTP method chip. */\nexport function methodChip(method: string): VNode {\n\tconst tone: Tone =\n\t\tmethod === 'GET' ? 'ok' : method === 'DELETE' ? 'bad' : method === 'POST' ? 'info' : 'warn';\n\tconst color = toneColor[tone];\n\treturn h(\n\t\t'span',\n\t\t{\n\t\t\tstyle: {\n\t\t\t\t...styles.mono,\n\t\t\t\tfontSize: '11px',\n\t\t\t\tfontWeight: 700,\n\t\t\t\tcolor,\n\t\t\t\tbackground: tint(color, 12),\n\t\t\t\tborderRadius: '4px',\n\t\t\t\tpadding: '2px 6px',\n\t\t\t\tdisplay: 'inline-block',\n\t\t\t\tminWidth: '44px',\n\t\t\t\ttextAlign: 'center',\n\t\t\t},\n\t\t},\n\t\tmethod,\n\t);\n}\n","// Stroke icons (24×24, 2px, round caps — the Lucide geometry), as path data so\n// both the React and Vue screens draw the same glyphs with no icon font and no\n// fetch. Keep this file identical in react-admin-screens and vue-admin-screens.\nexport const ICONS = {\n\tattention: ['M22 12h-4l-3 9L9 3l-3 9H2'],\n\tmodules: [\n\t\t'M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z',\n\t\t'M3.3 7 12 12l8.7-5',\n\t\t'M12 22V12',\n\t],\n\tenvironment: [\n\t\t'M4 21v-7',\n\t\t'M4 10V3',\n\t\t'M12 21v-9',\n\t\t'M12 8V3',\n\t\t'M20 21v-5',\n\t\t'M20 12V3',\n\t\t'M1 14h6',\n\t\t'M9 8h6',\n\t\t'M17 16h6',\n\t],\n\tdoctor: [\n\t\t'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n\t],\n\troutes: [\n\t\t'M6 3v12',\n\t\t'M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n\t\t'M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n\t\t'M18 9a9 9 0 0 1-9 9',\n\t],\n\tusers: [\n\t\t'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2',\n\t\t'M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z',\n\t\t'M22 21v-2a4 4 0 0 0-3-3.87',\n\t\t'M16 3.13a4 4 0 0 1 0 7.75',\n\t],\n\tcatalog: [\n\t\t'M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z',\n\t\t'M7.5 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1z',\n\t],\n\tsubscriber: ['M2 7h20v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z', 'M2 11h20', 'M6 15h4'],\n\tsettings: [\n\t\t'M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z',\n\t\t'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n\t],\n\ttemplates: [\n\t\t'M22 7l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7',\n\t\t'M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z',\n\t],\n\taudit: ['M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z', 'M9 12l2 2 4-4'],\n\tlog: ['M12 8v4l3 3', 'M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5'],\n\ttokens: [\n\t\t'M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z',\n\t\t'M16.5 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1z',\n\t],\n\tmigrations: [\n\t\t'M12 22c4.97 0 9-1.79 9-4V6',\n\t\t'M3 6v12c0 2.21 4.03 4 9 4',\n\t\t'M12 10c4.97 0 9-1.79 9-4s-4.03-4-9-4-9 1.79-9 4 4.03 4 9 4z',\n\t\t'M3 12c0 2.21 4.03 4 9 4s9-1.79 9-4',\n\t],\n\tmenu: ['M4 6h16', 'M4 12h16', 'M4 18h16'],\n\tclose: ['M18 6 6 18', 'm6 6 12 12'],\n\trefresh: [\n\t\t'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8',\n\t\t'M21 3v5h-5',\n\t\t'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16',\n\t\t'M8 16H3v5',\n\t],\n\tcheck: ['M20 6 9 17l-5-5'],\n\talert: [\n\t\t'M12 9v4',\n\t\t'M12 17h.01',\n\t\t'M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z',\n\t],\n\tsearch: ['M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z', 'm21 21-4.3-4.3'],\n\tback: ['m12 19-7-7 7-7', 'M19 12H5'],\n\tlogout: ['M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4', 'm16 17 5-5-5-5', 'M21 12H9'],\n\tlock: [\n\t\t'M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2z',\n\t\t'M7 11V7a5 5 0 0 1 10 0v4',\n\t],\n\tplus: ['M12 5v14', 'M5 12h14'],\n\tmark: [\n\t\t'M4 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z',\n\t\t'M15 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z',\n\t\t'M15 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1z',\n\t\t'M4 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1z',\n\t],\n} as const;\n\nexport type IconName = keyof typeof ICONS;\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { empty, methodChip, pageHeader, pill } from '../ui';\nimport { loadMoreButton, refreshButton, table, td } from './common';\n\n// Who did what through the surface, newest first — refused requests included.\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\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\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\tconst t = createAdminT(props.locale);\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('log.title'), t('log.lead'), [\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\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 ? t('log.off') : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: entries.value.length === 0 && !isLoading.value\n\t\t\t\t\t\t? empty(t('log.empty'), undefined, 'log')\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt('log.colWhen'),\n\t\t\t\t\t\t\t\t\t\tt('log.colActor'),\n\t\t\t\t\t\t\t\t\t\tt('log.colRequest'),\n\t\t\t\t\t\t\t\t\t\tt('log.colStatus'),\n\t\t\t\t\t\t\t\t\t\tt('log.colModule'),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\t\ttd(formatAdminDate(e.at, props.locale), {\n\t\t\t\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\tmethodChip(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, wordBreak: 'break-all' } }, e.path),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\ttd(\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\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.status >= 500 ? 'bad' : e.status >= 400 ? 'warn' : 'ok',\n\t\t\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\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\th('span', { style: styles.muted }, `${e.durationMs} ms`),\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{ whiteSpace: 'nowrap' },\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\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\tisLoading.value ? h('p', { style: styles.status }, t('common.loading')) : null,\n\t\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t\t? loadMoreButton(() => void loadMore(), t('common.loadMore'))\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t],\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { CSSProperties, Ref, VNode, VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\nimport { icon, pageHeader } from '../ui';\n\n// Shared frame: header (title, lead, actions on the right), then\n// loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: { readonly value: boolean }; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: (VNode | null)[] = [],\n\toptions: {\n\t\tloadingText?: string;\n\t\terrorText?: (e: FonderieApiError) => string;\n\t\tlead?: VNodeChild;\n\t} = {},\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 }, [pageHeader(title, options.lead, toolbar), body]);\n}\n\nexport function table(\n\theaders: (string | { label: string; style: CSSProperties })[],\n\trows: VNode[],\n): 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) =>\n\t\t\t\t\ttypeof t === 'string'\n\t\t\t\t\t\t? h('th', { style: styles.th }, t)\n\t\t\t\t\t\t: h('th', { style: { ...styles.th, ...t.style } }, t.label),\n\t\t\t\t),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNodeChild, extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children as never);\n\nexport const refreshButton = (\n\tlabel: string,\n\tdisabled: boolean,\n\tonClick: () => void,\n\tbusyLabel = 'Working…',\n) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, [\n\t\ticon('refresh', 14),\n\t\tdisabled ? busyLabel : label,\n\t]);\n\nexport const loadMoreButton = (onClick: () => void, label = 'Load more') =>\n\th('button', { type: 'button', style: { ...styles.button, marginTop: '12px' }, onClick }, label);\n\n// A plain action button (no refresh glyph); `style` picks the variant.\nexport const actionButton = (\n\tlabel: VNodeChild,\n\tdisabled: boolean,\n\tonClick: () => void,\n\tstyle: CSSProperties | undefined = styles.button,\n) => h('button', { type: 'button', style, disabled, onClick }, label as never);\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAttention, useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { empty, icon, pill, stat } from '../ui';\nimport { page, refreshButton } from './common';\n\n// What needs the operator today. Empty is green. The tiles above the list are\n// the at-a-glance answer; the list is what to do about it.\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\tconst { manifest } = useManifest(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst a = attention.value;\n\t\t\tconst m = manifest.value;\n\t\t\tconst errors = a?.items.filter((i) => i.severity === 'error') ?? [];\n\t\t\tconst advice = a?.items.filter((i) => i.severity !== 'error') ?? [];\n\t\t\tconst ready = m?.modules.filter((x) => x.readiness.ok).length ?? 0;\n\t\t\tconst total = m?.modules.length ?? 0;\n\t\t\tconst tiles = h('div', { style: styles.grid }, [\n\t\t\t\tstat(\n\t\t\t\t\tt('attention.needsAction'),\n\t\t\t\t\ta ? errors.length : '—',\n\t\t\t\t\tt('attention.needsActionHint'),\n\t\t\t\t\terrors.length ? 'bad' : a ? 'ok' : undefined,\n\t\t\t\t),\n\t\t\t\tstat(\n\t\t\t\t\tt('attention.advice'),\n\t\t\t\t\ta ? advice.length : '—',\n\t\t\t\t\tt('attention.adviceHint'),\n\t\t\t\t\tadvice.length ? 'warn' : undefined,\n\t\t\t\t),\n\t\t\t\tstat(\n\t\t\t\t\tt('attention.modulesReady'),\n\t\t\t\t\tm ? `${ready}/${total}` : '—',\n\t\t\t\t\tm ? t('attention.modulesReadyHint', { version: m.admin.version }) : undefined,\n\t\t\t\t\tm && ready < total ? 'warn' : m ? 'ok' : undefined,\n\t\t\t\t),\n\t\t\t\tstat(t('attention.routes'), m ? m.routes.length : '—', m ? m.env : undefined),\n\t\t\t]);\n\t\t\treturn page(\n\t\t\t\tt('attention.title'),\n\t\t\t\t// Tiles show while the checks run; only the list waits.\n\t\t\t\t{ isLoading: { value: false }, error },\n\t\t\t\t() => {\n\t\t\t\t\tif (isLoading.value && !a)\n\t\t\t\t\t\treturn [tiles, h('p', { style: styles.status }, t('attention.running'))];\n\t\t\t\t\tif (!a) return tiles;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\ttiles,\n\t\t\t\t\t\t\tempty(\n\t\t\t\t\t\t\t\tt('attention.emptyTitle'),\n\t\t\t\t\t\t\t\tt('attention.emptyBody', { time: formatAdminDate(a.generatedAt, props.locale) }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn [\n\t\t\t\t\t\ttiles,\n\t\t\t\t\t\th(\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[...errors, ...advice].map((item) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: `${item.source}:${item.message}`,\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.row,\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\tgap: '12px',\n\t\t\t\t\t\t\t\t\t\t\talignItems: 'flex-start',\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[\n\t\t\t\t\t\t\t\t\t\ticon('alert', 16, {\n\t\t\t\t\t\t\t\t\t\t\tmarginTop: '3px',\n\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\titem.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-danger,#e00)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-warning,#f5a623)',\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\th('div', { style: { minWidth: 0, flex: 1 } }, [\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\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmarginBottom: '2px',\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\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.severity === 'error' ? 'bad' : 'warn',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.error')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.advice'),\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\th('span', { style: styles.mono }, item.source),\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('div', { style: { lineHeight: 1.55 } }, item.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),\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(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tlead: a\n\t\t\t\t\t\t? t('attention.leadChecked', {\n\t\t\t\t\t\t\t\ttime: formatAdminDate(a.generatedAt, props.locale, 'time'),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('attention.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { pill } from '../ui';\nimport { page } from './common';\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport const EnvironmentScreen = defineComponent({\n\tname: 'FonderieEnvironmentScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminEnvironment(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst r = report.value;\n\t\t\tconst missing = r?.env.filter((e) => !e.set).length ?? 0;\n\t\t\treturn page(\n\t\t\t\tt('environment.title'),\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn [\n\t\t\t\t\t\th('h2', { style: { ...styles.subtitle, marginTop: 0 } }, t('environment.variables')),\n\t\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t\t? h('p', { style: styles.muted }, t('environment.noVariables'))\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.grid,\n\t\t\t\t\t\t\t\t\t\t\tgridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))',\n\t\t\t\t\t\t\t\t\t\t\tgap: '8px',\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\tr.env.map((e) =>\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: e.name,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: '10px 12px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: '8px',\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\th('span', { style: { ...styles.mono, wordBreak: 'break-all' } }, e.name),\n\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\te.set ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\t\t\t\te.set ? t('common.status.set') : t('common.status.missing'),\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),\n\t\t\t\t\t\th('h2', { style: styles.subtitle }, t('environment.moduleReadiness')),\n\t\t\t\t\t\th(\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\tr.modules.map((m) =>\n\t\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\t\t\tgap: '12px',\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\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\t[\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: { ...styles.mono, fontWeight: 600 } }, m.name),\n\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\tm.problems.length === 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'ok'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: m.problems.some((p) => p.severity === 'error')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bad'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'warn',\n\t\t\t\t\t\t\t\t\t\t\t\tm.problems.length === 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.ready')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: m.problems.length === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('environment.problemOne')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t('environment.problemMany', { n: m.problems.length }),\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\t...m.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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-danger,#e00)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-text-muted,#5c5c5c)',\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\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),\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\tr && r.env.length > 0\n\t\t\t\t\t\t? pill(\n\t\t\t\t\t\t\t\tmissing ? 'bad' : 'ok',\n\t\t\t\t\t\t\t\tmissing ? t('environment.missingCount', { n: missing }) : t('environment.allSet'),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: t('environment.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { pill } from '../ui';\nimport { page, refreshButton, table, td } from './common';\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\treturn page(\n\t\t\t\tt('doctor.title'),\n\t\t\t\t{ isLoading: { value: isLoading.value && !report.value }, 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 table(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ label: t('doctor.colResult'), style: { width: '110px' } },\n\t\t\t\t\t\t\tt('doctor.colCheck'),\n\t\t\t\t\t\t\t{ label: t('doctor.colTime'), style: { textAlign: 'right', width: '90px' } },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('tr', { key: c.name }, [\n\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\tc.skipped ? 'neutral' : c.ok ? (c.findings.length ? 'warn' : 'ok') : 'bad',\n\t\t\t\t\t\t\t\t\t\tc.skipped\n\t\t\t\t\t\t\t\t\t\t\t? t('common.status.skipped')\n\t\t\t\t\t\t\t\t\t\t\t: c.ok\n\t\t\t\t\t\t\t\t\t\t\t\t? c.findings.length\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.advice')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.ok')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.failed'),\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([\n\t\t\t\t\t\t\t\t\th('div', [\n\t\t\t\t\t\t\t\t\t\th('span', { style: { ...styles.mono, fontWeight: 600 } }, c.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: styles.muted }, c.module),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\tc.skipped\n\t\t\t\t\t\t\t\t\t\t? h('div', { style: { ...styles.muted, marginTop: '4px' } }, c.skipped)\n\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t...c.findings.map((f) =>\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: f,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '4px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1.55,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: c.ok\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-text,#171717)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-danger,#e00)',\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\tf,\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(`${c.durationMs} ms`, {\n\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\ttextAlign: 'right',\n\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\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\treport.value && !isLoading.value\n\t\t\t\t\t\t? pill(\n\t\t\t\t\t\t\t\treport.value.ok ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\treport.value.ok ? t('doctor.allPass') : t('doctor.oneFailed'),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('doctor.runAgain'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('doctor.running'),\n\t\t\t\t\tlead: t('doctor.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { pill } from '../ui';\nimport { page, table, td } from './common';\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst m = manifest.value;\n\t\t\treturn page(\n\t\t\t\tt('modules.title'),\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tif (!m) return null;\n\t\t\t\t\treturn table(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tt('modules.colModule'),\n\t\t\t\t\t\t\tt('modules.colVersion'),\n\t\t\t\t\t\t\tt('modules.colReadiness'),\n\t\t\t\t\t\t\tt('modules.colAdmin'),\n\t\t\t\t\t\t],\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, fontWeight: 600 }),\n\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\tmod.version ?? h('span', { style: styles.muted }, t('modules.notReported')),\n\t\t\t\t\t\t\t\t\tstyles.mono,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? t('common.status.ready') : t('common.status.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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-danger,#e00)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-text-muted,#5c5c5c)',\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\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(\n\t\t\t\t\t\t\t\t\tmod.describesAdmin\n\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, t('modules.describesAdmin'))\n\t\t\t\t\t\t\t\t\t\t: h('span', { style: 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\t\t);\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: m\n\t\t\t\t\t\t? t('modules.leadSummary', {\n\t\t\t\t\t\t\t\tenv: m.env,\n\t\t\t\t\t\t\t\tversion: m.admin.version,\n\t\t\t\t\t\t\t\tlog: m.admin.log ? t('modules.logOn') : t('modules.logOff'),\n\t\t\t\t\t\t\t\troutes: m.routes.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('modules.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { methodChip, pill } from '../ui';\nimport { page, table, td } from './common';\n\n// Every exposed route and what guards it. A hundred rows is normal, so the\n// page filters as you type.\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\tconst q = ref('');\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst needle = q.value.trim().toLowerCase();\n\t\t\tconst routes = (report.value?.routes ?? []).filter(\n\t\t\t\t(r) =>\n\t\t\t\t\t!needle ||\n\t\t\t\t\t`${r.method} ${r.path} ${r.module ?? 'application'} ${r.guard}`\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes(needle),\n\t\t\t);\n\t\t\treturn page(\n\t\t\t\tt('routes.title'),\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() =>\n\t\t\t\t\ttable(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ label: t('routes.colMethod'), style: { width: '80px' } },\n\t\t\t\t\t\t\tt('routes.colPath'),\n\t\t\t\t\t\t\tt('routes.colGuard'),\n\t\t\t\t\t\t\tt('routes.colModule'),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...routes.map((r) =>\n\t\t\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\t\t\ttd(methodChip(r.method)),\n\t\t\t\t\t\t\t\t\ttd(r.path, { ...styles.mono, wordBreak: 'break-all' }),\n\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\tr.guard === 'admin' ? 'ok' : r.guard === 'probe' ? 'neutral' : 'info',\n\t\t\t\t\t\t\t\t\t\t\tr.guard,\n\t\t\t\t\t\t\t\t\t\t\tfalse,\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\ttd(r.module ?? t('routes.application'), 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\t...(routes.length === 0\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\th('tr', [\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'td',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: { ...styles.td, ...styles.muted }, colspan: 4 },\n\t\t\t\t\t\t\t\t\t\t\t\tt('routes.noMatch', { q: q.value }),\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: []),\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t[\n\t\t\t\t\th('input', {\n\t\t\t\t\t\ttype: 'search',\n\t\t\t\t\t\tvalue: q.value,\n\t\t\t\t\t\tplaceholder: t('routes.filterPlaceholder'),\n\t\t\t\t\t\tstyle: { ...styles.input, width: '280px' },\n\t\t\t\t\t\t'aria-label': t('routes.filterLabel'),\n\t\t\t\t\t\tonInput: (e: Event) => {\n\t\t\t\t\t\t\tq.value = (e.target as HTMLInputElement).value;\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\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: report.value\n\t\t\t\t\t\t? t('routes.leadCount', { n: report.value.routes.length })\n\t\t\t\t\t\t: t('routes.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminT,\n\tcreateAdminT,\n\ttype IAdminMigrationModule,\n} 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 { empty, pill } from '../ui';\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(t: AdminT, m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return t('migrations.blockedBy', { module: m.blockedBy });\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn t('migrations.destructiveBlocked');\n\treturn null;\n}\n\nexport const MigrationsScreen = defineComponent({\n\tname: 'FonderieMigrationsScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(props.client);\n\n\t\tconst section = (t: AdminT, m: IAdminMigrationModule, everApplied: boolean): VNode => {\n\t\t\tconst blocked = why(t, m, everApplied);\n\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\treturn h('section', { style: { ...styles.card, marginBottom: '16px' } }, [\n\t\t\t\th('h2', { style: { ...styles.subtitle, marginTop: 0 } }, [\n\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\tpill('warn', t('migrations.pendingCount', { n: m.pending.length })),\n\t\t\t\t]),\n\t\t\t\th(\n\t\t\t\t\t'ul',\n\t\t\t\t\t{ style: { margin: '0 0 12px', paddingLeft: '18px', lineHeight: 1.9 } },\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', { style: styles.code }, p.file),\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\tp.impact === 'destructive'\n\t\t\t\t\t\t\t\t? pill('bad', t('migrations.destructive'))\n\t\t\t\t\t\t\t\t: pill('neutral', t('migrations.additive')),\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.notice, marginBottom: 0 } }, 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.buttonPrimary,\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\tt('migrations.confirmApply', { n: m.pending.length, module: m.name }),\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\tm.pending.length === 1\n\t\t\t\t\t\t\t\t? t('migrations.applyOne')\n\t\t\t\t\t\t\t\t: t('migrations.applyMany', { n: m.pending.length }),\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\treturn page(\n\t\t\t\tt('migrations.title'),\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)\n\t\t\t\t\t\treturn empty(t('migrations.upToDate'), t('migrations.noPending'), 'migrations');\n\t\t\t\t\treturn [\n\t\t\t\t\t\tr.everApplied ? null : h('p', { style: styles.notice }, t('migrations.firstInstall')),\n\t\t\t\t\t\t...behind.map((m) => section(t, m, r.everApplied)),\n\t\t\t\t\t].filter(Boolean) as VNode[];\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: t('migrations.lead'),\n\t\t\t\t\terrorText: (e) => (e.status === 403 ? t('migrations.needsWrite') : e.explanation),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\ttype AdminT,\n\tcreateAdminT,\n\tformatAdminDate,\n\ttype IAdminCreatedLink,\n\ttype IAdminOperator,\n} from '@fonderie/client';\nimport { useAdminOperators } from '@fonderie/vue-admin';\nimport type { PropType, VNode } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { empty, icon, pageHeader, pill } from '../ui';\nimport { table, td } from './common';\n\n// Access levels as people think of them; scopes underneath.\ntype LevelId = 'read' | 'editor' | 'owner';\nconst LEVELS: Array<{ id: LevelId; scopes: AdminScope[] }> = [\n\t{ id: 'read', scopes: ['read'] },\n\t{ id: 'editor', scopes: ['read', 'write'] },\n\t{ id: 'owner', scopes: ['read', 'write', 'secrets'] },\n];\nconst levelOf = (scopes: readonly AdminScope[]): LevelId =>\n\tscopes.includes('secrets') ? 'owner' : scopes.includes('write') ? 'editor' : 'read';\nconst scopesFor = (id: string): AdminScope[] => LEVELS.find((l) => l.id === id)?.scopes ?? ['read'];\n\nconst small = { height: '28px' };\n\n// The people who can sign in here. No registration: an owner invites, the\n// invitee sets a password and an authenticator. Lost device or password → a\n// recovery link from another owner.\nexport const OperatorsScreen = defineComponent({\n\tname: 'FonderieOperatorsScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// The signed-in operator's email: their own row offers no disable or\n\t\t// recovery (the server refuses both for yourself anyway).\n\t\tme: { type: String, default: undefined },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error, invite, recover, update, revokeLink } = useAdminOperators(\n\t\t\tprops.client,\n\t\t);\n\t\tconst email = ref('');\n\t\tconst level = ref<string>('editor');\n\t\tconst minted = ref<IAdminCreatedLink | null>(null);\n\t\tconst copied = ref(false);\n\n\t\tconst status = (t: AdminT, o: IAdminOperator): VNode =>\n\t\t\to.disabledAt\n\t\t\t\t? pill('neutral', t('common.status.disabled'))\n\t\t\t\t: o.locked\n\t\t\t\t\t? pill('warn', t('common.status.locked'))\n\t\t\t\t\t: !o.enrolled\n\t\t\t\t\t\t? pill('warn', t('operators.settingUp'))\n\t\t\t\t\t\t: pill('ok', t('common.status.active'));\n\n\t\tconst mintedNotice = (t: AdminT, link: IAdminCreatedLink): VNode => {\n\t\t\tconst url = `${window.location.origin}${link.url}`;\n\t\t\treturn h(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\t...styles.notice,\n\t\t\t\t\t\tbackground: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\t\t\tborderColor: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\th('strong', t('operators.mintedTitle', { email: link.email })),\n\t\t\t\t\t` ${t('operators.mintedBody', { date: formatAdminDate(link.expiresAt, props.locale) })}`,\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: { display: 'flex', gap: '8px', marginTop: '8px', alignItems: 'center' } },\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'code',\n\t\t\t\t\t\t\t\t{ style: { ...styles.code, flex: 1, padding: '7px 10px', wordBreak: 'break-all' } },\n\t\t\t\t\t\t\t\turl,\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'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard?.writeText(url);\n\t\t\t\t\t\t\t\t\t\tcopied.value = true;\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\tcopied.value ? t('common.copied') : t('common.copy'),\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'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tstyle: styles.buttonGhost,\n\t\t\t\t\t\t\t\t\t'aria-label': t('common.dismiss'),\n\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\tminted.value = null;\n\t\t\t\t\t\t\t\t\t\tcopied.value = false;\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[icon('close', 14)],\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\t};\n\n\t\tconst setMinted = (l: IAdminCreatedLink) => {\n\t\t\tcopied.value = false;\n\t\t\tminted.value = l;\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst r = report.value;\n\t\t\tconst e = error.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('operators.title'), t('operators.lead')),\n\t\t\t\te\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\te.status === 403 && e.reason === 'FORBIDDEN'\n\t\t\t\t\t\t\t\t? t('operators.needsOwner')\n\t\t\t\t\t\t\t\t: e.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tminted.value ? mintedNotice(t, minted.value) : null,\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: {\n\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\tmarginBottom: '20px',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSubmit: (ev: Event) => {\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t\tvoid invite({ email: email.value.trim(), scopes: scopesFor(level.value) })\n\t\t\t\t\t\t\t\t.then((l) => {\n\t\t\t\t\t\t\t\t\tsetMinted(l);\n\t\t\t\t\t\t\t\t\temail.value = '';\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {});\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\ticon('users', 16),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t\t{ style: { fontSize: '13.5px', marginRight: '4px' } },\n\t\t\t\t\t\t\tt('operators.invite'),\n\t\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\trequired: true,\n\t\t\t\t\t\t\tvalue: email.value,\n\t\t\t\t\t\t\tonInput: (ev: Event) => (email.value = (ev.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: t('operators.invitePlaceholder'),\n\t\t\t\t\t\t\tstyle: { ...styles.input, flex: 1, minWidth: '220px' },\n\t\t\t\t\t\t\t'aria-label': t('operators.inviteLabel'),\n\t\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: level.value,\n\t\t\t\t\t\t\t\tonChange: (ev: Event) => (level.value = (ev.target as HTMLSelectElement).value),\n\t\t\t\t\t\t\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t'aria-label': t('operators.accessLevelLabel'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tLEVELS.map((l) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'option',\n\t\t\t\t\t\t\t\t\t{ key: l.id, value: l.id },\n\t\t\t\t\t\t\t\t\t`${t(`operators.level.${l.id}`)} — ${t(`operators.levelHint.${l.id}`)}`,\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\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.buttonPrimary, disabled: !email.value.trim() },\n\t\t\t\t\t\t\t[icon('plus', 14), t('operators.createInvite')],\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tisLoading.value && !r\n\t\t\t\t\t? h('p', { style: styles.status }, t('common.loading'))\n\t\t\t\t\t: r && r.operators.length === 0\n\t\t\t\t\t\t? empty(t('operators.emptyTitle'), undefined, 'users')\n\t\t\t\t\t\t: r\n\t\t\t\t\t\t\t? table(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt('operators.col.operator'),\n\t\t\t\t\t\t\t\t\t\tt('operators.col.access'),\n\t\t\t\t\t\t\t\t\t\tt('operators.col.status'),\n\t\t\t\t\t\t\t\t\t\tt('operators.col.lastSignIn'),\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\tr.operators.map((o) => {\n\t\t\t\t\t\t\t\t\t\tconst mine = o.email === props.me;\n\t\t\t\t\t\t\t\t\t\treturn h('tr', { key: o.id }, [\n\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\th('div', { style: { fontWeight: 600 } }, o.name || o.email),\n\t\t\t\t\t\t\t\t\t\t\t\to.name ? h('div', { style: styles.muted }, o.email) : null,\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\ttd(\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'select',\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\tvalue: levelOf(o.scopes),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: mine,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange: (ev: Event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid update(o.id, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tscopes: scopesFor((ev.target as HTMLSelectElement).value),\n\t\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\t\tstyle: { ...styles.input, ...small, fontSize: '12.5px' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'aria-label': t('operators.accessLevelFor', { email: o.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\tLEVELS.map((l) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('option', { key: l.id, value: l.id }, t(`operators.level.${l.id}`)),\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\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\tstatus(t, o),\n\t\t\t\t\t\t\t\t\t\t\t\to.enrolled && o.backupCodesLeft <= 2 && !o.disabledAt\n\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'div',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: { ...styles.muted, marginTop: '4px' } },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\to.backupCodesLeft === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'operators.backupCodesLeftOne'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'operators.backupCodesLeftMany',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ n: o.backupCodesLeft },\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: null,\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\to.lastLoginAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(o.lastLoginAt, props.locale)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.never'),\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\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\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\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\tmine\n\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.muted }, t('common.you'))\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\th(\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, ...small, marginRight: '6px' },\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\tt('operators.recoveryConfirm', { email: o.email }),\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 recover(o.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(setMinted)\n\t\t\t\t\t\t\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\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\tt('operators.recoveryLink'),\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\th(\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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(o.disabledAt ? styles.button : styles.buttonDanger),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...small,\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\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\to.disabledAt ||\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\tt('operators.disableConfirm', { email: o.email }),\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 update(o.id, { disabled: !o.disabledAt }).catch(\n\t\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\t);\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\to.disabledAt ? t('operators.enable') : t('operators.disable'),\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{ textAlign: 'right', whiteSpace: 'nowrap' },\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)\n\t\t\t\t\t\t\t: null,\n\t\t\t\tr && r.links.length > 0\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, t('operators.pendingLinks')),\n\t\t\t\t\t\t\th(\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.links.map((l) =>\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tkey: l.id,\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.row, display: 'flex', gap: '12px', alignItems: 'center' },\n\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\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\tl.kind === 'invite' ? 'info' : 'warn',\n\t\t\t\t\t\t\t\t\t\t\t\tl.kind === 'invite'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('operators.linkKind.invite')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('operators.linkKind.recovery'),\n\t\t\t\t\t\t\t\t\t\t\t\tfalse,\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: { flex: 1 } }, [\n\t\t\t\t\t\t\t\t\t\t\t\tl.email,\n\t\t\t\t\t\t\t\t\t\t\t\tl.kind === 'invite'\n\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'span',\n\t\t\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\t\t` · ${t(`operators.level.${levelOf(l.scopes)}`)}`,\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: null,\n\t\t\t\t\t\t\t\t\t\t\t]),\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\tt('operators.expiresOn', {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdate: formatAdminDate(l.expiresAt, props.locale),\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(\n\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{\n\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\tstyle: { ...styles.buttonDanger, ...small },\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => void revokeLink(l.id).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\tt('operators.revoke'),\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),\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]);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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 { empty, icon, pageHeader, pill } from '../ui';\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: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\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 t = createAdminT(props.locale);\n\t\t\tconst loc = props.locale;\n\t\t\tconst r = report.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('tokens.title'), t('tokens.lead')),\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 ? t('tokens.needsRoot') : 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, marginTop: 0 } }, t('tokens.rootToken')),\n\t\t\t\tr\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ style: { ...styles.card, display: 'flex', gap: '12px', alignItems: 'flex-start' } },\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\ticon('lock', 18, { marginTop: '2px' }),\n\t\t\t\t\t\t\t\th('div', [\n\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\tr.admin.ok ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\tr.admin.ok ? t('tokens.strong') : t('tokens.weak'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...r.admin.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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: 'var(--fonderie-danger,#e00)',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\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\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],\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, t('tokens.issuedTokens')),\n\t\t\t\tr?.issued === null\n\t\t\t\t\t? h('p', { style: styles.muted }, t('tokens.issuingOff'))\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(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t...styles.notice,\n\t\t\t\t\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\t\t\t\t\t'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\t\t\t\t\t\t\t\t\tborderColor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\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\t[\n\t\t\t\t\t\t\t\t\t\t\th('strong', t('tokens.copyNow')),\n\t\t\t\t\t\t\t\t\t\t\t` (${minted.value.name})`,\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\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...styles.code,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: '8px 10px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twordBreak: 'break-all',\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\tminted.value.token,\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: 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((tk) => {\n\t\t\t\t\t\t\t\t\t\t\t\tminted.value = { name: tk.name, token: tk.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: t('tokens.namePlaceholder'),\n\t\t\t\t\t\t\t\t\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t\t\t'aria-label': t('tokens.nameLabel'),\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(\n\t\t\t\t\t\t\t\t\t\t\t'label',\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: s,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...styles.badge,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: '32px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxSizing: 'border-box',\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: '0 10px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\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\th('input', {\n\t\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\t\tchecked: scopes.value.includes(s),\n\t\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\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t` ${t(`tokens.scope.${s}`)}`,\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\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: t('tokens.daysPlaceholder'),\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, width: '140px' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': t('tokens.daysLabel'),\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.buttonPrimary,\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[icon('plus', 14), t('tokens.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[\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.name'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.scopes'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.created'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.expires'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.lastUsed'),\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\tr.issued.map((tk) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: tk.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\ttk.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttk.revokedAt ? [' ', pill('neutral', t('tokens.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(tk.scopes.map((sc) => t(`tokens.scope.${sc}`)).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`${formatAdminDate(tk.createdAt, loc, 'date')} · ${tk.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\ttk.expiresAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(tk.expiresAt, loc, 'date')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.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\ttk.lastUsedAt ? formatAdminDate(tk.lastUsedAt, loc) : t('common.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\ttk.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.buttonDanger,\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(t('tokens.revokeConfirm', { name: tk.name }))\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(tk.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\tt('tokens.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: empty(t('tokens.emptyTitle'), t('tokens.emptyBody'), 'tokens'),\n\t\t\t\t\t\t],\n\t\t\t\th('h2', { style: styles.subtitle }, t('tokens.legacyTitle')),\n\t\t\t\tr && r.legacy.length === 0\n\t\t\t\t\t? h('p', { style: styles.muted }, t('tokens.legacyNone'))\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('span', { style: styles.muted }, t('tokens.legacyRow')),\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 {\n\ttype AdminLocale,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\tdescribeLocation,\n\tformatAdminDate,\n} 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 { statusLabel, statusTone, useSubscriptionIndex } from '../billing';\nimport { styles } from '../styles';\nimport { empty, icon, pageHeader, pill } from '../ui';\nimport { actionButton, loadMoreButton, refreshButton, table, td } from './common';\nimport { SubscriberBilling } from './SubscriberBilling';\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\t// Given ⇒ a Plan column, and each user's plan, credits and grant form on\n\t\t// their page. Everyone has a wallet; no subscription means the free tier.\n\t\tbillingClient: { type: Object as PropType<BillingAdminClient>, default: undefined },\n\t\t// Open this user on arrival (e.g. from the Subscriptions list).\n\t\topenUserId: { type: String, default: undefined },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst selectedId = ref(props.openUserId ?? '');\n\t\tconst plans = useSubscriptionIndex(props.billingClient);\n\t\t// Soft-deleted accounts are their own view: they cannot sign in and are\n\t\t// erased by the retention purge, but until then an operator can see them.\n\t\t// One list per mode — the composable reads its query once, at setup.\n\t\tconst showDeleted = ref(false);\n\t\tconst activeList = useAdminUsers(props.client, { limit: props.pageSize });\n\t\tconst deletedList = useAdminUsers(props.client, { limit: props.pageSize, deleted: true });\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 tr = computed(() => createAdminT(props.locale));\n\t\tconst yesNo = (v: boolean) =>\n\t\t\tv ? pill('ok', tr.value('common.yes')) : pill('neutral', tr.value('common.no'));\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\t\tconst planCell = (id: string) => {\n\t\t\tif (!plans.value) return h('span', { style: styles.muted }, '…');\n\t\t\tconst sub = plans.value.get(`user/${id}`);\n\t\t\tif (!sub || sub.status === 'canceled')\n\t\t\t\treturn h('span', { style: styles.muted }, tr.value('common.status.free'));\n\t\t\treturn [\n\t\t\t\th('strong', sub.plan),\n\t\t\t\t' ',\n\t\t\t\tsub.status !== 'active'\n\t\t\t\t\t? pill(statusTone(sub.status), statusLabel(tr.value, sub.status))\n\t\t\t\t\t: null,\n\t\t\t];\n\t\t};\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 t = tr.value;\n\t\t\tconst loc = props.locale;\n\t\t\tconst u = user.value;\n\t\t\tconst list = showDeleted.value ? deletedList : activeList;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('users.title'), t('users.lead')),\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: t('users.emailPlaceholder'),\n\t\t\t\t\t\t\tstyle: { ...styles.input, minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': t('users.emailLabel'),\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.buttonPrimary, disabled: isLoading.value },\n\t\t\t\t\t\t\t[icon('search', 14), t('common.lookUp')],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? refreshButton(\n\t\t\t\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\t\t\t\tlist.isLoading.value,\n\t\t\t\t\t\t\t\t\t() => void list.refresh(),\n\t\t\t\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: actionButton(\n\t\t\t\t\t\t\t\t\t[icon('back', 14), t('users.allUsers')],\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tclear,\n\t\t\t\t\t\t\t\t\tstyles.buttonGhost,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'fieldset',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\tgap: '6px',\n\t\t\t\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\t\t\t\tmargin: '0 0 0 auto',\n\t\t\t\t\t\t\t\t\t\t\tpadding: '0',\n\t\t\t\t\t\t\t\t\t\t\tminWidth: '0',\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-label': t('users.whichAccounts'),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t[false, true].map((d) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'button',\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: String(d),\n\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'aria-pressed': showDeleted.value === d,\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (showDeleted.value = d),\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(showDeleted.value === d ? styles.buttonPrimary : styles.button),\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: '28px',\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\td ? t('users.deletedAccounts') : t('users.activeAccounts'),\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: null,\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? empty(t('users.emptyTitle'), t('users.emptyBody'), 'users')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.email'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.name'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.plan'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.created'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.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: [\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.email'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.name'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.created'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.status'),\n\t\t\t\t\t\t\t\t\t\t\t\t],\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.link,\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\tprops.billingClient ? td(planCell(u.id)) : null,\n\t\t\t\t\t\t\t\t\t\t\t\ttd(formatAdminDate(u.createdAt, loc, 'date')),\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? pill('warn', t('common.status.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? pill('neutral', t('common.status.deleted'))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: pill('ok', t('common.status.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 }, t('common.loading')) : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? loadMoreButton(() => void list.loadMore(), t('common.loadMore'))\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 && !(error.value.status === 404 && selectedId.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 ? t('users.noUserWithEmail') : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\t// Opened by id (e.g. from Subscriptions) and the account is gone —\n\t\t\t\t// deleted or purged — while its billing rows remain. Say so, and\n\t\t\t\t// still show the money.\n\t\t\t\terror.value?.status === 404 && selectedId.value\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('div', { style: styles.notice, role: 'status' }, [\n\t\t\t\t\t\t\t\th('strong', `${t('users.missingIdPrefix')} `),\n\t\t\t\t\t\t\t\th('code', { style: styles.code }, selectedId.value),\n\t\t\t\t\t\t\t\th('strong', '.'),\n\t\t\t\t\t\t\t\t` ${t('users.missingIdBody')}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t? h('h2', { style: styles.subtitle }, t('users.planCredits'))\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t? h(SubscriberBilling, {\n\t\t\t\t\t\t\t\t\t\tkey: `missing-${selectedId.value}`,\n\t\t\t\t\t\t\t\t\t\tclient: props.billingClient,\n\t\t\t\t\t\t\t\t\t\tsubscriberType: 'user',\n\t\t\t\t\t\t\t\t\t\tsubscriberId: selectedId.value,\n\t\t\t\t\t\t\t\t\t\t...(loc ? { locale: loc } : {}),\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\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 ? pill('warn', t('common.status.suspended')) : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? pill('neutral', t('common.status.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(t('users.field.id'), h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow(t('users.field.email'), [\n\t\t\t\t\t\t\t\t\t\tu.email,\n\t\t\t\t\t\t\t\t\t\t` · ${t('users.field.verified')} `,\n\t\t\t\t\t\t\t\t\t\tyesNo(u.isEmailVerified),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\trow(t('users.field.mfa'), yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\tt('users.field.provider'),\n\t\t\t\t\t\t\t\t\t\t`${u.provider || t('users.passwordProvider')}${u.hasPassword ? '' : ` · ${t('users.noPasswordSet')}`}`,\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\tt('users.field.lastLogin'),\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(u.lastLogin, loc)\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, t('common.never')),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(t('users.field.created'), formatAdminDate(u.createdAt, loc)),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tu.deletedAt\n\t\t\t\t\t\t\t\t? h('div', { style: { ...styles.notice, marginTop: '12px' }, role: 'status' }, [\n\t\t\t\t\t\t\t\t\t\th('strong', t('users.deletedOn', { date: formatAdminDate(u.deletedAt, loc) })),\n\t\t\t\t\t\t\t\t\t\t` ${t('users.deletedBody')}`,\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: h('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t\t\t? actionButton(t('users.unsuspend'), isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t\t\t: actionButton(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.suspend'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => void suspend(),\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.buttonDanger,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tactionButton(\n\t\t\t\t\t\t\t\t\t\t\tt('users.signOutEverywhere'),\n\t\t\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\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\tprops.billingClient\n\t\t\t\t\t\t\t\t? h('h2', { style: styles.subtitle }, t('users.planCredits'))\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t? h(SubscriberBilling, {\n\t\t\t\t\t\t\t\t\t\tkey: u.id,\n\t\t\t\t\t\t\t\t\t\tclient: props.billingClient,\n\t\t\t\t\t\t\t\t\t\tsubscriberType: 'user',\n\t\t\t\t\t\t\t\t\t\tsubscriberId: u.id,\n\t\t\t\t\t\t\t\t\t\t...(loc ? { locale: loc } : {}),\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\tu.deletedAt\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, t('users.liveSessions')),\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, t('common.none'))\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'ul',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\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\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\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\t\t\t' ',\n\t\t\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\t\t'span',\n\t\t\t\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\t\t\tdescribeLocation(s.location) ?? '',\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\t' ',\n\t\t\t\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\t\t\t' ',\n\t\t\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\t\t'span',\n\t\t\t\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\t\t\tt('users.since', { date: formatAdminDate(s.createdAt, loc) }),\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),\n\t\t\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 }, t('users.recentSignIns')),\n\t\t\t\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, t('users.noneRecorded'))\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'ul',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\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\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome === 'success' ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome === 'success'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.success')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome === 'failure'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.failure')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome,\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\t' ',\n\t\t\t\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\t\t\t' ',\n\t\t\t\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\t\t\t' ',\n\t\t\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\t\t'span',\n\t\t\t\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\t\t\tdescribeLocation(e.location) ?? '',\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\te.location?.proxy || e.location?.hosting\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\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'warn',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.location.proxy ? t('users.proxyVpn') : t('users.hosting'),\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]\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' ',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, formatAdminDate(e.createdAt, loc)),\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\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t\t\t\t? loadMoreButton(() => void history.loadMore(), t('common.loadMore'))\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]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminLocale,\n\ttype AdminT,\n\ttype BillingAdminClient,\n\ttype IAdminSubscriptionDTO,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { type Ref, ref } from 'vue';\nimport type { Tone } from './styles';\n\n/** What the period end means for this subscription. A canceled one does not renew. */\nexport function periodEnd(\n\ts: IAdminSubscriptionDTO,\n\tlocale?: AdminLocale,\n): { label: string; date: string } | null {\n\tif (!s.currentPeriodEnd) return null;\n\tconst t = createAdminT(locale);\n\tconst date = formatAdminDate(s.currentPeriodEnd, locale, 'date');\n\tif (s.status === 'canceled')\n\t\treturn {\n\t\t\tlabel: new Date(s.currentPeriodEnd) < new Date() ? t('billing.ended') : t('billing.ends'),\n\t\t\tdate,\n\t\t};\n\tif (s.cancelAtPeriodEnd) return { label: t('billing.ends'), date };\n\treturn { label: t('billing.renews'), date };\n}\n\nconst STATUS_KEYS = [\n\t'active',\n\t'trialing',\n\t'past_due',\n\t'unpaid',\n\t'canceled',\n\t'incomplete',\n\t'incomplete_expired',\n\t'paused',\n] as const;\n\n/** A subscription status in the console's language; an unknown one is shown as sent. */\nexport function statusLabel(t: AdminT, status: string): string {\n\treturn (STATUS_KEYS as readonly string[]).includes(status)\n\t\t? t(`billing.statusLabel.${status as (typeof STATUS_KEYS)[number]}`)\n\t\t: status;\n}\n\n/** A billing interval in the console's language; an unknown one is shown as sent. */\nexport function intervalLabel(t: AdminT, interval: string): string {\n\treturn interval === 'month' || interval === 'year'\n\t\t? t(`billing.intervalLabel.${interval}`)\n\t\t: interval;\n}\n\nexport const statusTone = (status: string): Tone =>\n\tstatus === 'active'\n\t\t? 'ok'\n\t\t: status === 'trialing'\n\t\t\t? 'info'\n\t\t\t: status === 'past_due' || status === 'unpaid'\n\t\t\t\t? 'warn'\n\t\t\t\t: 'neutral';\n\n/**\n * Every subscription, keyed by `type/id`, for showing a plan next to each user.\n * Reads the admin list page by page (100 at a time, at most 2,000) — a\n * console-sized index, not a query engine. Anyone absent from it is free.\n */\nexport function useSubscriptionIndex(\n\tclient: BillingAdminClient | undefined,\n): Ref<Map<string, IAdminSubscriptionDTO> | null> {\n\tconst index = ref<Map<string, IAdminSubscriptionDTO> | null>(null) as Ref<Map<\n\t\tstring,\n\t\tIAdminSubscriptionDTO\n\t> | null>;\n\tif (!client) return index;\n\tvoid (async () => {\n\t\tconst map = new Map<string, IAdminSubscriptionDTO>();\n\t\tlet cursor: string | undefined;\n\t\tfor (let page = 0; page < 20; page++) {\n\t\t\tconst { result } = await client.listSubscriptions({\n\t\t\t\tlimit: 100,\n\t\t\t\t...(cursor ? { cursor } : {}),\n\t\t\t});\n\t\t\tfor (const s of result.subscriptions) {\n\t\t\t\tconst key = `${s.subscriberType}/${s.subscriberId}`;\n\t\t\t\t// Newest first: keep the first (current) one per subscriber.\n\t\t\t\tif (!map.has(key)) map.set(key, s);\n\t\t\t}\n\t\t\tif (!result.nextCursor) break;\n\t\t\tcursor = result.nextCursor;\n\t\t}\n\t\tindex.value = map;\n\t})().catch(() => {\n\t\tindex.value = new Map();\n\t});\n\treturn index;\n}\n","import {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\tformatAdminDate,\n\ttype SubscriberType,\n} from '@fonderie/client';\nimport { useAdminSubscriber } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { empty, icon, pill } from '../ui';\nimport { loadMoreButton, table, td } from './common';\n\nconst LEDGER_KINDS = ['purchase', 'grant', 'usage', 'refund', 'adjustment', 'expiry'] as const;\n\n// One subscriber's money: plan, wallet, the one write (a grant,\n// idempotency-keyed) and what moved. Used on a user's page and for workspace\n// subscribers. A subscription is NOT required: everyone has a wallet, and a\n// user with no subscription is on the free tier.\nconst SubscriberBillingInner = defineComponent({\n\tname: 'FonderieSubscriberBillingInner',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tsubscriberType: { type: String as PropType<SubscriberType>, required: true },\n\t\tsubscriberId: { type: String, required: true },\n\t\tcurrency: { type: String, default: '' },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\temits: { 'change-currency': (_currency: string) => true },\n\tsetup(props, { emit }) {\n\t\tconst subscriber = computed(() => ({ type: props.subscriberType, id: props.subscriberId }));\n\t\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\t\tuseAdminSubscriber(props.client, subscriber, {\n\t\t\t\tlimit: 20,\n\t\t\t\t...(props.currency ? { currency: props.currency } : {}),\n\t\t\t});\n\t\tconst currencyDraft = ref(props.currency);\n\t\tconst amount = ref('');\n\t\tconst note = ref('');\n\t\tconst granted = ref<string | null>(null);\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst ledgerKind = (kind: string) =>\n\t\t\t\t(LEDGER_KINDS as readonly string[]).includes(kind)\n\t\t\t\t\t? t(`billing.ledgerKind.${kind as (typeof LEDGER_KINDS)[number]}`)\n\t\t\t\t\t: kind;\n\t\t\tconst s = subscription.value;\n\t\t\tconst w = wallet.value;\n\t\t\tif (isLoading.value && !w && !s)\n\t\t\t\treturn h('p', { style: styles.status }, t('billing.loading'));\n\t\t\tconst end = s ? periodEnd(s, props.locale) : null;\n\t\t\treturn h('div', [\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\th('div', { style: { ...styles.grid, marginBottom: '16px' } }, [\n\t\t\t\t\th('div', { style: styles.card }, [\n\t\t\t\t\t\th('div', { style: styles.statLabel }, t('billing.plan')),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\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[\n\t\t\t\t\t\t\t\th('strong', { style: { fontSize: '18px' } }, s ? s.plan : t('billing.free')),\n\t\t\t\t\t\t\t\t...(s\n\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 }, `· ${intervalLabel(t, s.interval)}`),\n\t\t\t\t\t\t\t\t\t\t\tpill(statusTone(s.status), statusLabel(t, s.status)),\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: [h('span', { style: styles.muted }, t('billing.noSubscription'))]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tend ? h('div', { style: styles.statHint }, `${end.label} ${end.date}`) : null,\n\t\t\t\t\t\ts?.providerSubscriptionId\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ style: { ...styles.statHint, fontFamily: 'var(--fonderie-mono,monospace)' } },\n\t\t\t\t\t\t\t\t\ts.providerSubscriptionId,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t]),\n\t\t\t\t\th('div', { style: styles.card }, [\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\tgap: '8px',\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[\n\t\t\t\t\t\t\t\th('div', { style: styles.statLabel }, t('billing.credits')),\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstyle: { display: 'flex', gap: '4px' },\n\t\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\temit('change-currency', currencyDraft.value.trim().toUpperCase());\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[\n\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\tvalue: currencyDraft.value,\n\t\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tcurrencyDraft.value = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tplaceholder: w?.currency ?? t('billing.currencyPlaceholder'),\n\t\t\t\t\t\t\t\t\t\t\tmaxlength: 8,\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, height: '26px', width: '84px', fontSize: '12px' },\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': t('billing.currencyLabel'),\n\t\t\t\t\t\t\t\t\t\t\ttitle: t('billing.currencyTitle'),\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],\n\t\t\t\t\t\t),\n\t\t\t\t\t\t...(w\n\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\th('div', { style: styles.statValue }, [\n\t\t\t\t\t\t\t\t\t\t`${w.balance} `,\n\t\t\t\t\t\t\t\t\t\th('span', { style: { fontSize: '14px', fontWeight: 500 } }, w.currency),\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'div',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.statHint },\n\t\t\t\t\t\t\t\t\t\t`${t('billing.breakdown', { permanent: w.purchased ?? '0', allowance: w.granted ?? '0' })}${\n\t\t\t\t\t\t\t\t\t\t\tw.grantedExpiresAt\n\t\t\t\t\t\t\t\t\t\t\t\t? t('billing.expires', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdate: formatAdminDate(w.grantedExpiresAt, props.locale, 'date'),\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}`,\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: [h('div', { style: styles.statHint }, t('billing.noWallet'))]),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t\tw\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\t\tmarginBottom: '16px',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${props.subscriberType}-${props.subscriberId}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tconst a = amount.value.trim();\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: a,\n\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\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\tgranted.value = t('billing.granted', { amount: a, currency: w.currency });\n\t\t\t\t\t\t\t\t\t\t\tamount.value = '';\n\t\t\t\t\t\t\t\t\t\t\tnote.value = '';\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.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[\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t\t\t\t{ style: { fontSize: '13.5px', marginRight: '4px' } },\n\t\t\t\t\t\t\t\t\tt('billing.grantCredits'),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tvalue: amount.value,\n\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (amount.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\tplaceholder: t('billing.amountPlaceholder', { currency: w.currency }),\n\t\t\t\t\t\t\t\t\tinputmode: 'numeric',\n\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, width: '150px' },\n\t\t\t\t\t\t\t\t\t'aria-label': t('billing.amountLabel'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tvalue: note.value,\n\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (note.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\tplaceholder: t('billing.reasonPlaceholder'),\n\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, flex: 1, minWidth: '180px' },\n\t\t\t\t\t\t\t\t\t'aria-label': t('billing.reasonLabel'),\n\t\t\t\t\t\t\t\t}),\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\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.buttonPrimary,\n\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},\n\t\t\t\t\t\t\t\t\t[icon('plus', 14), t('billing.grant')],\n\t\t\t\t\t\t\t\t),\n\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],\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tw\n\t\t\t\t\t? ledger.value.length === 0\n\t\t\t\t\t\t? empty(t('billing.noMovements'), undefined, 'subscriber')\n\t\t\t\t\t\t: h('div', [\n\t\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt('billing.col.when'),\n\t\t\t\t\t\t\t\t\t\tt('billing.col.kind'),\n\t\t\t\t\t\t\t\t\t\tt('billing.col.amount'),\n\t\t\t\t\t\t\t\t\t\tt('billing.col.note'),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tledger.value.map((tx) =>\n\t\t\t\t\t\t\t\t\t\th('tr', { key: tx.id }, [\n\t\t\t\t\t\t\t\t\t\t\ttd(formatAdminDate(tx.createdAt, props.locale), {\n\t\t\t\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\ttd(ledgerKind(tx.type)),\n\t\t\t\t\t\t\t\t\t\t\ttd(tx.amount, styles.mono),\n\t\t\t\t\t\t\t\t\t\t\ttd(tx.description ?? '', styles.muted),\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\thasMoreLedger.value\n\t\t\t\t\t\t\t\t\t? loadMoreButton(() => void loadMoreLedger(), t('common.loadMore'))\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n\n// A wallet exists per currency. Empty ⇒ the billing default; submitting another\n// (e.g. EUR) reads that wallet instead — same as the CLI's --currency. The\n// composable reads its options once, so a currency change remounts the inner view.\nexport const SubscriberBilling = defineComponent({\n\tname: 'FonderieSubscriberBilling',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tsubscriberType: { type: String as PropType<SubscriberType>, required: true },\n\t\tsubscriberId: { type: String, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst currency = ref('');\n\t\treturn () =>\n\t\t\th(SubscriberBillingInner, {\n\t\t\t\tkey: `${props.subscriberType}:${props.subscriberId}:${currency.value}`,\n\t\t\t\tclient: props.client,\n\t\t\t\tsubscriberType: props.subscriberType,\n\t\t\t\tsubscriberId: props.subscriberId,\n\t\t\t\tcurrency: currency.value,\n\t\t\t\t...(props.locale ? { locale: props.locale } : {}),\n\t\t\t\t'onChange-currency': (c: string) => {\n\t\t\t\t\tcurrency.value = c;\n\t\t\t\t},\n\t\t\t});\n\t},\n});\n","import { type AdminLocale, type BillingAdminClient, createAdminT } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { empty, pageHeader } from '../ui';\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: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\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 t = createAdminT(props.locale);\n\t\t\tconst c = catalog.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('catalog.title'), t('catalog.lead'), [\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\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\tisLoading.value && !c ? h('p', { style: styles.status }, t('common.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, marginTop: 0 } }, t('catalog.configured')),\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.card,\n\t\t\t\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\t\t\t\tmaxHeight: '360px',\n\t\t\t\t\t\t\t\t\t\tlineHeight: 1.6,\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 }, t('catalog.stored')),\n\t\t\t\t\t\t\tc.stored.length === 0\n\t\t\t\t\t\t\t\t? empty(t('catalog.emptyTitle'), t('catalog.emptyBody'), 'catalog')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.plan'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.tier'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.seats'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.monthly'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.yearly'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.trial'),\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\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 ? t('catalog.trialDays', { n: p.trialDays }) : '—'),\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.buttonDanger,\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(t('catalog.deleteConfirm', { name: 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\tt('common.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 {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\ttype SubscriberType,\n} from '@fonderie/client';\nimport { useAdminSubscribers } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { empty, icon, pageHeader, pill, refreshButton } from '../ui';\nimport { loadMoreButton, table, td } from './common';\nimport { SubscriberBilling } from './SubscriberBilling';\n\ntype FilterId = 'all' | 'active' | 'trialing' | 'pastDue' | 'canceled';\nconst FILTERS: Array<{ id: FilterId; match: (status: string) => boolean }> = [\n\t{ id: 'all', match: () => true },\n\t{ id: 'active', match: (s) => s === 'active' },\n\t{ id: 'trialing', match: (s) => s === 'trialing' },\n\t{ id: 'pastDue', match: (s) => s === 'past_due' || s === 'unpaid' },\n\t{ id: 'canceled', match: (s) => s === 'canceled' },\n];\n\n// Who pays, and who is behind. A money list: plans and statuses across users\n// and workspaces. A user's own billing (plan, credits, grants) is on their\n// page under Users; free users have no subscription and appear only there.\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\t/**\n\t\t * A user subscriber opens on the Users page, where their plan and credits\n\t\t * live beside their account. Omit to open everything here.\n\t\t */\n\t\tonOpenUser: { type: Function as PropType<(userId: string) => void>, default: undefined },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst list = useAdminSubscribers(props.client, { limit: props.pageSize });\n\t\tconst filter = ref<FilterId>('all');\n\t\tconst open = ref<{ type: SubscriberType; id: string } | null>(null);\n\t\tconst type = ref<SubscriberType>('workspace');\n\t\tconst idInput = ref('');\n\t\tconst openRow = (t: SubscriberType, id: string) => {\n\t\t\tif (t === 'user' && props.onOpenUser) props.onOpenUser(id);\n\t\t\telse open.value = { type: t, id };\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst loc = props.locale ? { locale: props.locale } : {};\n\t\t\tconst o = open.value;\n\t\t\tif (o) {\n\t\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\t\tpageHeader(`${o.type}/${o.id}`, t('billing.subscriptions.detailLead'), [\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: 'button', style: styles.buttonGhost, onClick: () => (open.value = null) },\n\t\t\t\t\t\t\t[icon('back', 14), t('billing.subscriptions.back')],\n\t\t\t\t\t\t),\n\t\t\t\t\t]),\n\t\t\t\t\th(SubscriberBilling, {\n\t\t\t\t\t\tkey: `${o.type}/${o.id}`,\n\t\t\t\t\t\tclient: props.client,\n\t\t\t\t\t\tsubscriberType: o.type,\n\t\t\t\t\t\tsubscriberId: o.id,\n\t\t\t\t\t\t...loc,\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t}\n\t\t\tconst match = FILTERS.find((f) => f.id === filter.value)?.match ?? (() => true);\n\t\t\tconst rows = list.subscriptions.value.filter((s) => match(s.status));\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('billing.subscriptions.title'), t('billing.subscriptions.lead'), [\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t() => void list.refresh(),\n\t\t\t\t\t\tlist.isLoading.value,\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t]),\n\t\t\t\th('div', { style: { ...styles.toolbar, justifyContent: 'space-between' } }, [\n\t\t\t\t\th(\n\t\t\t\t\t\t'fieldset',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tgap: '6px',\n\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'aria-label': t('billing.subscriptions.filterLabel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tFILTERS.map((f) => {\n\t\t\t\t\t\t\tconst n = list.subscriptions.value.filter((s) => f.match(s.status)).length;\n\t\t\t\t\t\t\tconst on = filter.value === f.id;\n\t\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: f.id,\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t'aria-pressed': on,\n\t\t\t\t\t\t\t\t\tonClick: () => (filter.value = f.id),\n\t\t\t\t\t\t\t\t\tstyle: { ...(on ? styles.buttonPrimary : styles.button), height: '28px' },\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\tt(`billing.subscriptions.filter.${f.id}`),\n\t\t\t\t\t\t\t\t\th('span', { style: { opacity: 0.7 } }, String(n)),\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\th(\n\t\t\t\t\t\t'form',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstyle: { display: 'flex', gap: '6px' },\n\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tif (idInput.value.trim()) openRow(type.value, idInput.value.trim());\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'select',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tvalue: type.value,\n\t\t\t\t\t\t\t\t\tonChange: (e: Event) =>\n\t\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\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t\t'aria-label': t('billing.subscriptions.typeLabel'),\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('option', { value: 'workspace' }, t('billing.subscriptions.typeWorkspace')),\n\t\t\t\t\t\t\t\t\th('option', { value: 'user' }, t('billing.subscriptions.typeUser')),\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('input', {\n\t\t\t\t\t\t\t\tvalue: idInput.value,\n\t\t\t\t\t\t\t\tonInput: (e: Event) => (idInput.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\tplaceholder: t('billing.subscriptions.idPlaceholder'),\n\t\t\t\t\t\t\t\tstyle: { ...styles.input, width: '220px' },\n\t\t\t\t\t\t\t\t'aria-label': t('billing.subscriptions.idLabel'),\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'button',\n\t\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: !idInput.value.trim() },\n\t\t\t\t\t\t\t\t[icon('search', 14), t('common.open')],\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\tlist.error.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\trows.length === 0 && !list.isLoading.value\n\t\t\t\t\t? empty(\n\t\t\t\t\t\t\tt(`billing.subscriptions.empty.${filter.value}`),\n\t\t\t\t\t\t\tt('billing.subscriptions.emptyHint'),\n\t\t\t\t\t\t\t'subscriber',\n\t\t\t\t\t\t)\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.subscriber'),\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.plan'),\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.status'),\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.renewsEnds'),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\trows.map((s) => {\n\t\t\t\t\t\t\t\tconst end = periodEnd(s, props.locale);\n\t\t\t\t\t\t\t\treturn h('tr', { key: s.id }, [\n\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t{\n\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\tstyle: { ...styles.link, ...styles.mono },\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => openRow(s.subscriberType, s.subscriberId),\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.subscriberType}/${s.subscriberId}`,\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\ttd([\n\t\t\t\t\t\t\t\t\t\th('strong', s.plan),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `· ${intervalLabel(t, s.interval)}`),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\tpill(statusTone(s.status), statusLabel(t, s.status)),\n\t\t\t\t\t\t\t\t\t\ts.cancelAtPeriodEnd && s.status !== 'canceled'\n\t\t\t\t\t\t\t\t\t\t\t? h('span', [' ', pill('warn', t('billing.subscriptions.cancels'), false)])\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\ttd(\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.muted }, end.label), ` ${end.date}`]\n\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{ whiteSpace: 'nowrap' },\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\tlist.isLoading.value ? h('p', { style: styles.status }, t('common.loading')) : null,\n\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t? loadMoreButton(() => void list.loadMore(), t('common.loadMore'))\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminLocale,\n\ttype AuditAdminClient,\n\tcreateAdminT,\n\tformatAdminDate,\n\ttype IAdminAuditQuery,\n} 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 { empty, icon, pageHeader } from '../ui';\nimport { loadMoreButton, 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\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst draft = ref({ workspaceId: '', type: '', actorId: '', from: '', to: '' });\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.input,\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('audit.title'), t('audit.lead')),\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\t// Dates are whole days in the operator's time zone: \"to\" includes that day.\n\t\t\t\t\t\t\t\t...(d.from ? { from: new Date(`${d.from}T00:00:00`) } : {}),\n\t\t\t\t\t\t\t\t...(d.to ? { to: new Date(`${d.to}T23:59:59.999`) } : {}),\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', t('audit.workspacePlaceholder')),\n\t\t\t\t\t\tfield('type', t('audit.typePlaceholder')),\n\t\t\t\t\t\tfield('actorId', t('audit.actorPlaceholder')),\n\t\t\t\t\t\t...(['from', 'to'] as const).map((k) =>\n\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\ttype: 'date',\n\t\t\t\t\t\t\t\tvalue: draft.value[k],\n\t\t\t\t\t\t\t\tonInput: (e: Event) =>\n\t\t\t\t\t\t\t\t\t(draft.value = { ...draft.value, [k]: (e.target as HTMLInputElement).value }),\n\t\t\t\t\t\t\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t'aria-label': k === 'from' ? t('audit.fromLabel') : t('audit.toLabel'),\n\t\t\t\t\t\t\t\ttitle: k === 'from' ? t('audit.fromTitle') : t('audit.toTitle'),\n\t\t\t\t\t\t\t}),\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.buttonPrimary, disabled: isLoading.value },\n\t\t\t\t\t\t\t[icon('search', 14), t('common.filter')],\n\t\t\t\t\t\t),\n\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t\t),\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? empty(t('audit.empty'), undefined, 'audit')\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tt('audit.col.when'),\n\t\t\t\t\t\t\t\tt('audit.col.type'),\n\t\t\t\t\t\t\t\tt('audit.col.workspace'),\n\t\t\t\t\t\t\t\tt('audit.col.actor'),\n\t\t\t\t\t\t\t\tt('audit.col.request'),\n\t\t\t\t\t\t\t],\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(formatAdminDate(e.createdAt, props.locale), 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 }, t('common.loading')) : null,\n\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t? loadMoreButton(() => void loadMore(), t('common.loadMore'))\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n"],"mappings":"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","names":["import_client","import_vue","import_vue","import_vue","t","refreshButton","t","refreshButton","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","import_client","import_vue","t","page","import_client","import_vue_admin","import_vue","t","t","refreshButton","u","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","refreshButton","t","c"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.ts","../src/styles.ts","../src/ui.ts","../src/icons.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/OperatorsScreen.ts","../src/screens/TokensScreen.ts","../src/screens/UsersScreen.ts","../src/billing.ts","../src/screens/SubscriberBilling.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\tOperatorsScreen,\n\tMigrationsScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tSubscriberBilling,\n\tAuditScreen,\n} from './screens';\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminMessageKey,\n\ttype AuditAdminClient,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\ttype ConfigAdminClient,\n\ttype CourierAdminClient,\n\tcreateAdminT,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/vue-config-admin-screens';\nimport {\n\tTemplateCreateScreen,\n\tTemplateEditorScreen,\n\tTemplateListScreen,\n} from '@fonderie/vue-courier-admin-screens';\nimport type { PropType, VNode } from 'vue';\nimport { computed, defineComponent, h, onBeforeUnmount, onMounted, ref } from 'vue';\nimport type { IconName } from '../icons';\nimport { styles } from '../styles';\nimport { icon } from '../ui';\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 { OperatorsScreen } from './OperatorsScreen';\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| 'operators'\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: AdminMessageKey;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: AdminMessageKey;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit' | 'operators';\n\t}>;\n}> = [\n\t{ group: 'nav.groups.today', items: [{ page: 'attention', label: 'nav.items.attention' }] },\n\t{\n\t\tgroup: 'nav.groups.system',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'nav.items.modules' },\n\t\t\t{ page: 'environment', label: 'nav.items.environment' },\n\t\t\t{ page: 'doctor', label: 'nav.items.doctor' },\n\t\t\t{ page: 'routes', label: 'nav.items.routes' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.people',\n\t\titems: [{ page: 'users', label: 'nav.items.users', needs: 'auth' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'nav.items.catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'nav.items.subscriptions', needs: 'billing' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.settings',\n\t\titems: [{ page: 'settings', label: 'nav.items.settings', needs: 'config' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.messaging',\n\t\titems: [{ page: 'templates', label: 'nav.items.templates', needs: 'courier' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'nav.items.audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'nav.items.log' },\n\t\t\t{ page: 'operators', label: 'nav.items.operators', needs: 'operators' },\n\t\t\t{ page: 'tokens', label: 'nav.items.tokens' },\n\t\t\t{ page: 'migrations', label: 'nav.items.migrations' },\n\t\t],\n\t},\n];\n\nconst ICON: Record<AdminPage, IconName> = {\n\tattention: 'attention',\n\tmodules: 'modules',\n\tenvironment: 'environment',\n\tdoctor: 'doctor',\n\troutes: 'routes',\n\tusers: 'users',\n\tcatalog: 'catalog',\n\tsubscriber: 'subscriber',\n\tsettings: 'settings',\n\ttemplates: 'templates',\n\taudit: 'audit',\n\tlog: 'log',\n\ttokens: 'tokens',\n\toperators: 'users',\n\tmigrations: 'migrations',\n};\n\n// Below this width the sidebar becomes a drawer behind a top bar. Measured in\n// JS rather than a media query so it also works embedded, with no stylesheet.\nconst NARROW = '(max-width: 820px)';\n\n// What is open, and exactly which row: the same key exists per environment\n// and the same template per locale — dropping either opened the wrong row.\ntype Editing =\n\t| { kind: 'config' | 'secret'; key: string; environment?: string; environments?: string[] }\n\t| { kind: 'template'; type: string; locale: string | null; system: boolean }\n\t| { kind: 'template-new'; type?: string; locales?: string[]; defaultLocale?: 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\t// Shown at the top of the sidebar. Defaults to \"Admin\".\n\t\tappName: { type: String, default: 'Admin' },\n\t\t// A badge beside the name — the deployment's environment (\"production\").\n\t\t// Production is tinted so an operator always knows where their clicks land.\n\t\tenvLabel: { type: String, default: undefined },\n\t\t// The deployment has operator accounts (@fonderie/admin with a store):\n\t\t// shows the Operators page.\n\t\toperators: { type: Boolean, default: false },\n\t\t// The signed-in operator's email, when a person (not a token) is signed in.\n\t\tcurrentOperator: { type: String, default: undefined },\n\t\t// Where the app serves GET /config/public — marks public keys on the\n\t\t// Config page and previews exactly what frontends receive.\n\t\tpublicConfigUrl: { type: String, default: undefined },\n\t\t// The console's own language (the operator's choice, independent of the\n\t\t// locales the app serves). Default English.\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\t// `footer` slot: pinned to the bottom of the sidebar — session controls\n\t// (theme, sign out). The React shell takes the same thing as a `footer` prop.\n\temits: { navigate: (_page: AdminPage) => true },\n\tsetup(props, { emit, slots }) {\n\t\tconst tr = computed(() => createAdminT(props.locale));\n\t\tconst query =\n\t\t\ttypeof window !== 'undefined' && window.matchMedia ? window.matchMedia(NARROW) : null;\n\t\tconst narrow = ref(query?.matches ?? false);\n\t\tconst drawer = ref(false);\n\t\tconst onMedia = (e: MediaQueryListEvent) => (narrow.value = e.matches);\n\t\tonMounted(() => query?.addEventListener('change', onMedia));\n\t\tonBeforeUnmount(() => query?.removeEventListener('change', onMedia));\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\t// A user opened from Subscriptions: their billing lives on the Users page.\n\t\tconst openUser = ref<string | undefined>(undefined);\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\tdrawer.value = false;\n\t\t};\n\t\tconst back = (label: string) =>\n\t\t\th('div', { style: { padding: '24px 40px 0' } }, [\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ type: 'button', style: styles.buttonGhost, onClick: () => (editing.value = null) },\n\t\t\t\t\t[icon('back', 14), label],\n\t\t\t\t),\n\t\t\t]);\n\t\tconst missing = (text: string) =>\n\t\t\th('p', { style: { ...styles.status, padding: '32px 40px' } }, text);\n\n\t\tconst body = (): VNode | VNode[] => {\n\t\t\tconst c = props.client;\n\t\t\tconst t = tr.value;\n\t\t\tconst loc = props.locale ? { locale: props.locale } : {};\n\t\t\tconst missingClient = (client: string) => missing(t('shell.missingClient', { client }));\n\t\t\tswitch (current.value) {\n\t\t\t\tcase 'attention':\n\t\t\t\t\treturn h(AttentionScreen, { client: c, ...loc });\n\t\t\t\tcase 'modules':\n\t\t\t\t\treturn h(ModulesScreen, { client: c, ...loc });\n\t\t\t\tcase 'doctor':\n\t\t\t\t\treturn h(DoctorScreen, { client: c, ...loc });\n\t\t\t\tcase 'environment':\n\t\t\t\t\treturn h(EnvironmentScreen, { client: c, ...loc });\n\t\t\t\tcase 'routes':\n\t\t\t\t\treturn h(RoutesScreen, { client: c, ...loc });\n\t\t\t\tcase 'tokens':\n\t\t\t\t\treturn h(TokensScreen, { client: c, ...loc });\n\t\t\t\tcase 'operators':\n\t\t\t\t\treturn h(OperatorsScreen, {\n\t\t\t\t\t\tclient: c,\n\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t...(props.currentOperator ? { me: props.currentOperator } : {}),\n\t\t\t\t\t});\n\t\t\t\tcase 'migrations':\n\t\t\t\t\treturn h(MigrationsScreen, { client: c, ...loc });\n\t\t\t\tcase 'log':\n\t\t\t\t\treturn h(AdminLogScreen, { client: c, ...loc });\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, ...loc })\n\t\t\t\t\t\t: missingClient('BillingAdminClient');\n\t\t\t\tcase 'subscriber':\n\t\t\t\t\treturn props.billingClient\n\t\t\t\t\t\t? h(SubscriberScreen, {\n\t\t\t\t\t\t\t\tclient: props.billingClient,\n\t\t\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t\t\t...(props.authClient\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tonOpenUser: (id: string) => {\n\t\t\t\t\t\t\t\t\t\t\t\topenUser.value = id;\n\t\t\t\t\t\t\t\t\t\t\t\tgo('users');\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})\n\t\t\t\t\t\t: missingClient('BillingAdminClient');\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, ...loc })\n\t\t\t\t\t\t: missingClient('AuditAdminClient');\n\t\t\t\tcase 'users':\n\t\t\t\t\treturn props.authClient\n\t\t\t\t\t\t? h(UsersScreen, {\n\t\t\t\t\t\t\t\tkey: openUser.value ?? 'list',\n\t\t\t\t\t\t\t\tclient: props.authClient,\n\t\t\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t\t\t...(props.billingClient ? { billingClient: props.billingClient } : {}),\n\t\t\t\t\t\t\t\t...(openUser.value ? { openUserId: openUser.value } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: missingClient('AuthAdminClient');\n\t\t\t\tcase 'settings': {\n\t\t\t\t\tconst cc = props.configClient;\n\t\t\t\t\tif (!cc) return missingClient('ConfigAdminClient');\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e && (e.kind === 'config' || e.kind === 'secret')) {\n\t\t\t\t\t\tconst env = e.environment ?? props.environment;\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(t('nav.items.settings')),\n\t\t\t\t\t\t\th(ConfigEditorScreen, {\n\t\t\t\t\t\t\t\tkey: `${e.kind}:${e.key}:${e.environment ?? ''}`,\n\t\t\t\t\t\t\t\tclient: cc,\n\t\t\t\t\t\t\t\t...loc,\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...(env !== undefined ? { environment: env } : {}),\n\t\t\t\t\t\t\t\t...(e.environments ? { environments: e.environments } : {}),\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t\tonDeleted: () => (editing.value = null),\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\ttype Ctx = { environments: string[]; environment: string | null };\n\t\t\t\t\tconst create = (kind: 'config' | 'secret') => (c: Ctx) =>\n\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\tenvironments: c.environments,\n\t\t\t\t\t\t\t...(c.environment ? { environment: c.environment } : {}),\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...loc,\n\t\t\t\t\t\t...(props.environment !== undefined ? { environment: props.environment } : {}),\n\t\t\t\t\t\t...(props.publicConfigUrl ? { publicConfigUrl: props.publicConfigUrl } : {}),\n\t\t\t\t\t\t'onSelect-config': (key: string, environment: string) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'config', key, environment }),\n\t\t\t\t\t\t'onSelect-secret': (key: string, environment: string) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'secret', key, environment }),\n\t\t\t\t\t\tallowCreate: true,\n\t\t\t\t\t\t'onCreate-config': create('config'),\n\t\t\t\t\t\t'onCreate-secret': create('secret'),\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) return missingClient('CourierAdminClient');\n\t\t\t\t\tconst e = editing.value;\n\t\t\t\t\tif (e?.kind === 'template-new')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(t('nav.items.templates')),\n\t\t\t\t\t\t\th(TemplateCreateScreen, {\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\t...loc,\n\t\t\t\t\t\t\t\t...(e.type ? { type: e.type } : {}),\n\t\t\t\t\t\t\t\t...(e.locales ? { locales: e.locales } : {}),\n\t\t\t\t\t\t\t\t...(e.defaultLocale ? { defaultLocale: e.defaultLocale } : {}),\n\t\t\t\t\t\t\t\tonCreated: (c: { type: string; locale: string | null }) =>\n\t\t\t\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\t\t\t\ttype: c.type,\n\t\t\t\t\t\t\t\t\t\tlocale: c.locale,\n\t\t\t\t\t\t\t\t\t\tsystem: false,\n\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\tif (e?.kind === 'template')\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tback(t('nav.items.templates')),\n\t\t\t\t\t\t\th(TemplateEditorScreen, {\n\t\t\t\t\t\t\t\tkey: `${e.type}:${e.locale ?? ''}`,\n\t\t\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t\t\t...(props.locale ? { uiLocale: props.locale } : {}),\n\t\t\t\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\t\t\tlocale: e.locale,\n\t\t\t\t\t\t\t\tsystem: e.system,\n\t\t\t\t\t\t\t\tallowAddLocale: true,\n\t\t\t\t\t\t\t\tlocaleTabs: true,\n\t\t\t\t\t\t\t\tonSaved: () => (editing.value = null),\n\t\t\t\t\t\t\t\tonDeleted: () => (editing.value = null),\n\t\t\t\t\t\t\t\t'onAdd-locale': (type: string, c: { locales: string[]; defaultLocale?: string }) =>\n\t\t\t\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\t\t\t\tkind: 'template-new',\n\t\t\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\t\t\tlocales: c.locales,\n\t\t\t\t\t\t\t\t\t\t...(c.defaultLocale ? { defaultLocale: c.defaultLocale } : {}),\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'onSelect-locale': (tpl: {\n\t\t\t\t\t\t\t\t\ttype: string;\n\t\t\t\t\t\t\t\t\tlocale: string | null;\n\t\t\t\t\t\t\t\t\tsystem?: boolean;\n\t\t\t\t\t\t\t\t}) =>\n\t\t\t\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\t\t\t\ttype: tpl.type,\n\t\t\t\t\t\t\t\t\t\tlocale: tpl.locale,\n\t\t\t\t\t\t\t\t\t\tsystem: tpl.system === true,\n\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\treturn h(TemplateListScreen, {\n\t\t\t\t\t\tclient: kc,\n\t\t\t\t\t\t...loc,\n\t\t\t\t\t\tallowCreate: true,\n\t\t\t\t\t\t'onSelect-template': (t: { type: string; locale: string | null; system: boolean }) =>\n\t\t\t\t\t\t\t(editing.value = {\n\t\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\t\ttype: t.type,\n\t\t\t\t\t\t\t\tlocale: t.locale,\n\t\t\t\t\t\t\t\tsystem: t.system,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t'onCreate-template': (c: { locales: string[] }) =>\n\t\t\t\t\t\t\t(editing.value = { kind: 'template-new', locales: c.locales }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst visible = (i: {\n\t\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit' | 'operators';\n\t\t}) =>\n\t\t\t!i.needs ||\n\t\t\t(i.needs === 'operators'\n\t\t\t\t? props.operators\n\t\t\t\t: i.needs === 'config'\n\t\t\t\t\t? props.configClient\n\t\t\t\t\t: i.needs === 'courier'\n\t\t\t\t\t\t? props.courierClient\n\t\t\t\t\t\t: i.needs === 'auth'\n\t\t\t\t\t\t\t? props.authClient\n\t\t\t\t\t\t\t: i.needs === 'billing'\n\t\t\t\t\t\t\t\t? props.billingClient\n\t\t\t\t\t\t\t\t: props.auditClient);\n\n\t\tconst brand = () => {\n\t\t\tconst production = props.envLabel ? /^prod/i.test(props.envLabel) : false;\n\t\t\treturn h('div', { style: styles.navBrand }, [\n\t\t\t\th('div', { style: styles.navMark }, [icon('mark', 15)]),\n\t\t\t\th('div', { style: { minWidth: 0, flex: 1 } }, [\n\t\t\t\t\th('div', { style: styles.navBrandTitle }, props.appName),\n\t\t\t\t\tprops.envLabel\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{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.badge,\n\t\t\t\t\t\t\t\t\t\tmarginTop: '3px',\n\t\t\t\t\t\t\t\t\t\tpadding: '0 7px',\n\t\t\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\t\t\t...(production\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: 'var(--fonderie-danger,#e00)',\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderColor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'color-mix(in srgb, var(--fonderie-danger,#e00) 35%, transparent)',\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},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tprops.envLabel,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\t]),\n\t\t\t\tnarrow.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.buttonGhost,\n\t\t\t\t\t\t\t\t'aria-label': tr.value('shell.closeMenu'),\n\t\t\t\t\t\t\t\tonClick: () => (drawer.value = false),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[icon('close')],\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\n\t\tconst nav = () =>\n\t\t\th(\n\t\t\t\t'nav',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\t...styles.nav,\n\t\t\t\t\t\t...(narrow.value\n\t\t\t\t\t\t\t? { width: '280px', maxWidth: '85vw', boxShadow: '0 10px 40px rgba(0,0,0,.25)' }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t\t'aria-label': tr.value('shell.navLabel'),\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\tbrand(),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: styles.navScroll },\n\t\t\t\t\t\tNAV.map((g) => {\n\t\t\t\t\t\t\tconst items = g.items.filter(visible);\n\t\t\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\t\t\treturn h('div', { key: g.group }, [\n\t\t\t\t\t\t\t\th('div', { style: styles.navGroup }, tr.value(g.group)),\n\t\t\t\t\t\t\t\t...items.map((i) => {\n\t\t\t\t\t\t\t\t\tconst active = current.value === i.page;\n\t\t\t\t\t\t\t\t\treturn 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\tkey: i.page,\n\t\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\t\tclass: 'fonderie-admin-nav-item',\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.navItem, ...(active ? styles.navItemActive : {}) },\n\t\t\t\t\t\t\t\t\t\t\t'aria-current': active ? 'page' : undefined,\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\topenUser.value = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\tgo(i.page);\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\t[\n\t\t\t\t\t\t\t\t\t\t\ticon(ICON[i.page], 16, active ? styles.navIconActive : undefined),\n\t\t\t\t\t\t\t\t\t\t\ttr.value(i.label),\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]);\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tslots['footer'] ? h('div', { style: styles.navFooter }, slots['footer']()) : null,\n\t\t\t\t],\n\t\t\t);\n\n\t\treturn () => {\n\t\t\tconst titleKey = NAV.flatMap((g) => g.items).find((i) => i.page === current.value)?.label;\n\t\t\tconst title = titleKey ? tr.value(titleKey) : '';\n\t\t\treturn h(\n\t\t\t\t'div',\n\t\t\t\t{ style: { ...styles.shell, ...(narrow.value ? { flexDirection: 'column' } : {}) } },\n\t\t\t\t[\n\t\t\t\t\t...(narrow.value\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\th('div', { style: styles.topbar }, [\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: 'button',\n\t\t\t\t\t\t\t\t\t\t\tstyle: styles.buttonGhost,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': tr.value('shell.openMenu'),\n\t\t\t\t\t\t\t\t\t\t\t'aria-expanded': drawer.value,\n\t\t\t\t\t\t\t\t\t\t\tonClick: () => (drawer.value = true),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t[icon('menu')],\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\th('span', { style: { fontWeight: 600, fontSize: '14px' } }, title),\n\t\t\t\t\t\t\t\t\tprops.envLabel\n\t\t\t\t\t\t\t\t\t\t? h('span', { style: { ...styles.badge, marginLeft: 'auto' } }, props.envLabel)\n\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\tdrawer.value\n\t\t\t\t\t\t\t\t\t? h('div', { style: styles.drawer }, [\n\t\t\t\t\t\t\t\t\t\t\tnav(),\n\t\t\t\t\t\t\t\t\t\t\th('div', {\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: styles.scrim,\n\t\t\t\t\t\t\t\t\t\t\t\t'aria-hidden': 'true',\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (drawer.value = false),\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: null,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [nav()]),\n\t\t\t\t\th('main', { class: 'fonderie-admin-main', style: styles.main }, body()),\n\t\t\t\t],\n\t\t\t);\n\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.\n//\n// Tints (pill backgrounds) use color-mix() over the same tokens, so a status\n// colour and its background can never drift apart and dark mode needs no\n// second palette. Where color-mix is unsupported the background is simply\n// dropped and the coloured text still carries the meaning.\nexport const 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\n/** A token mixed into transparency — for tinted backgrounds that follow the theme. */\nexport const tint = (token: string, pct: number): string =>\n\t`color-mix(in srgb, ${token} ${pct}%, transparent)`;\n\nexport type Tone = 'ok' | 'bad' | 'warn' | 'neutral' | 'info';\nexport const toneColor: Record<Tone, string> = {\n\tok: t.accentStrong,\n\tbad: t.danger,\n\t// Amber on white fails contrast; mixing in the text colour darkens it in\n\t// light mode and lightens it in dark, from the same two tokens.\n\twarn: `color-mix(in srgb, ${t.warning} 70%, ${t.text})`,\n\tneutral: t.muted,\n\tinfo: t.text,\n};\n\nconst control: CSSProperties = {\n\tdisplay: 'inline-flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tgap: 6,\n\theight: 32,\n\tboxSizing: 'border-box',\n\tborderRadius: 6,\n\tpadding: '0 12px',\n\tfontSize: 13,\n\tfontWeight: 500,\n\tfontFamily: 'inherit',\n\tlineHeight: 1,\n\twhiteSpace: 'nowrap',\n};\n\nconst raw: 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// Sticky, full height, scrolls on its own: the nav never scrolls away with\n\t// a long table, and the footer (session controls) stays in reach.\n\tnav: {\n\t\twidth: 248,\n\t\tflexShrink: 0,\n\t\tboxSizing: 'border-box',\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tbackground: t.surface,\n\t\tposition: 'sticky',\n\t\ttop: 0,\n\t\theight: '100vh',\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t},\n\tnavBrand: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 10,\n\t\tpadding: '18px 16px 14px',\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t},\n\tnavMark: {\n\t\twidth: 28,\n\t\theight: 28,\n\t\tborderRadius: 7,\n\t\tbackground: t.text,\n\t\tcolor: t.surface,\n\t\tdisplay: 'grid',\n\t\tplaceItems: 'center',\n\t\tflexShrink: 0,\n\t},\n\tnavBrandTitle: {\n\t\tfontSize: 14,\n\t\tfontWeight: 600,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tlineHeight: 1.2,\n\t\toverflow: 'hidden',\n\t\ttextOverflow: 'ellipsis',\n\t\twhiteSpace: 'nowrap',\n\t},\n\tnavScroll: { flex: 1, overflowY: 'auto', padding: '8px 10px 16px' },\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 8px 4px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 10,\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: 6,\n\t\tpadding: '7px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13.5,\n\t\tfontWeight: 500,\n\t\tcolor: t.muted,\n\t\tfontFamily: 'inherit',\n\t\tposition: 'relative',\n\t},\n\tnavItemActive: { background: tint(t.accent, 12), color: t.text, fontWeight: 600 },\n\tnavIconActive: { color: t.accentStrong },\n\tnavFooter: {\n\t\tborderTop: `1px solid ${t.borderLight}`,\n\t\tpadding: 12,\n\t\tdisplay: 'flex',\n\t\tflexDirection: 'column',\n\t\tgap: 10,\n\t},\n\t// Phone layout: a top bar with the menu button replaces the sidebar, which\n\t// opens as a drawer over the content.\n\ttopbar: {\n\t\tposition: 'sticky',\n\t\ttop: 0,\n\t\tzIndex: 20,\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 10,\n\t\tpadding: '10px 16px',\n\t\tbackground: t.surface,\n\t\tborderBottom: `1px solid ${t.border}`,\n\t},\n\tdrawer: {\n\t\tposition: 'fixed',\n\t\tinset: 0,\n\t\tzIndex: 30,\n\t\tdisplay: 'flex',\n\t},\n\tscrim: { flex: 1, background: 'rgba(0,0,0,.35)' },\n\tmain: { flex: 1, minWidth: 0 },\n\tcontainer: { padding: '32px 40px 64px', maxWidth: 1160, boxSizing: 'border-box' },\n\n\t// ── page header ──\n\theader: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'flex-start',\n\t\tjustifyContent: 'space-between',\n\t\tgap: 16,\n\t\tmarginBottom: 24,\n\t\tflexWrap: 'wrap',\n\t},\n\ttitle: {\n\t\tfontSize: 22,\n\t\tfontWeight: 600,\n\t\tmargin: 0,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tlineHeight: 1.25,\n\t},\n\tlead: { color: t.muted, fontSize: 13.5, margin: '4px 0 0', lineHeight: 1.5 },\n\tactions: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' },\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 32,\n\t\tmarginBottom: 10,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tgap: 8,\n\t},\n\n\t// ── feedback ──\n\tstatus: { padding: '24px 0', color: t.muted, fontSize: 13.5 },\n\terror: {\n\t\tcolor: t.danger,\n\t\tbackground: tint(t.danger, 8),\n\t\tborder: `1px solid ${tint(t.danger, 25)}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: 16,\n\t\tfontSize: 13.5,\n\t},\n\tnotice: {\n\t\tcolor: t.text,\n\t\tbackground: tint(t.warning, 10),\n\t\tborder: `1px solid ${tint(t.warning, 35)}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: 16,\n\t\tfontSize: 13.5,\n\t},\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: 12.5 },\n\tcode: {\n\t\tfontFamily: t.mono,\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.borderLight}`,\n\t\tborderRadius: 4,\n\t\tpadding: '1px 5px',\n\t},\n\n\t// ── surfaces ──\n\t// Tables and lists are cards themselves, so every screen gets the framed,\n\t// rounded look without wrapping each one. The last row's rule is removed in\n\t// the shell stylesheet (a pseudo-selector); embedded without the shell it\n\t// simply doubles against the frame.\n\ttable: {\n\t\twidth: '100%',\n\t\tborderCollapse: 'separate',\n\t\tborderSpacing: 0,\n\t\tfontSize: 13.5,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\toverflow: 'hidden',\n\t\tboxShadow: t.shadowCard,\n\t},\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '9px 14px',\n\t\tfontWeight: 600,\n\t\tfontSize: 11.5,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.4,\n\t\tcolor: t.muted,\n\t\tbackground: t.surfaceAlt,\n\t\twhiteSpace: 'nowrap',\n\t},\n\ttd: {\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t\tpadding: '11px 14px',\n\t\tverticalAlign: 'top',\n\t},\n\tlist: {\n\t\tlistStyle: 'none',\n\t\tpadding: 0,\n\t\tmargin: 0,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\toverflow: 'hidden',\n\t\tboxShadow: t.shadowCard,\n\t},\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '12px 16px' },\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\tgrid: {\n\t\tdisplay: 'grid',\n\t\tgridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',\n\t\tgap: 12,\n\t\tmarginBottom: 24,\n\t},\n\tstatLabel: { fontSize: 12, color: t.muted, fontWeight: 500 },\n\tstatValue: {\n\t\tfontSize: 26,\n\t\tfontWeight: 600,\n\t\tletterSpacing: t.trackingDisplay,\n\t\tlineHeight: 1.2,\n\t\tmarginTop: 6,\n\t},\n\tstatHint: { fontSize: 12, color: t.muted, marginTop: 2 },\n\tempty: {\n\t\tbackground: t.surface,\n\t\tborder: `1px dashed ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: '40px 24px',\n\t\ttextAlign: 'center',\n\t\tcolor: t.muted,\n\t\tfontSize: 13.5,\n\t},\n\temptyTitle: { color: t.text, fontWeight: 600, fontSize: 14.5, margin: '10px 0 4px' },\n\tdl: { display: 'grid', gridTemplateColumns: '160px 1fr', margin: 0 },\n\tdt: {\n\t\tcolor: t.muted,\n\t\tfontSize: 13,\n\t\tpadding: '10px 16px',\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t},\n\tdd: {\n\t\tmargin: 0,\n\t\tpadding: '10px 16px',\n\t\tborderBottom: `1px solid ${t.borderLight}`,\n\t\tfontSize: 13.5,\n\t\tminWidth: 0,\n\t},\n\n\tbadge: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: 5,\n\t\tborderRadius: 999,\n\t\tpadding: '2px 8px',\n\t\tfontSize: 11.5,\n\t\tfontWeight: 500,\n\t\tlineHeight: 1.5,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t\twhiteSpace: 'nowrap',\n\t},\n\tpill: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: 6,\n\t\tborderRadius: 999,\n\t\tpadding: '2px 9px 2px 8px',\n\t\tfontSize: 12,\n\t\tfontWeight: 600,\n\t\tlineHeight: 1.5,\n\t\twhiteSpace: 'nowrap',\n\t\tverticalAlign: 'baseline',\n\t},\n\tdot: { width: 6, height: 6, borderRadius: 999, flexShrink: 0, background: 'currentColor' },\n\n\t// ── controls ──\n\tbutton: {\n\t\t...control,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.text,\n\t\tcursor: 'pointer',\n\t\tboxShadow: t.shadowCard,\n\t},\n\tbuttonPrimary: {\n\t\t...control,\n\t\tbackground: t.text,\n\t\tborder: `1px solid ${t.text}`,\n\t\tcolor: t.surface,\n\t\tcursor: 'pointer',\n\t},\n\tbuttonDanger: {\n\t\t...control,\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${tint(t.danger, 40)}`,\n\t\tcolor: t.danger,\n\t\tcursor: 'pointer',\n\t},\n\tbuttonGhost: {\n\t\t...control,\n\t\tbackground: 'none',\n\t\tborder: '1px solid transparent',\n\t\tcolor: t.muted,\n\t\tcursor: 'pointer',\n\t\tpadding: '0 8px',\n\t},\n\tlink: {\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tpadding: 0,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tfontSize: 'inherit',\n\t\tfontWeight: 500,\n\t\tcursor: 'pointer',\n\t\ttextAlign: 'left',\n\t},\n\tinput: {\n\t\theight: 32,\n\t\tboxSizing: 'border-box',\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: 6,\n\t\tpadding: '0 10px',\n\t\tfontSize: 13.5,\n\t\tfontFamily: 'inherit',\n\t\tbackground: t.surface,\n\t\tcolor: t.text,\n\t\tminWidth: 0,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 16, flexWrap: 'wrap' },\n\taccent: { color: t.accent },\n};\n\n// Same values as the React screens' styles.ts, which writes lengths as bare\n// numbers (React appends px). Vue assigns style values verbatim and the\n// browser drops a unitless length, so numbers become px here — except for\n// the properties that are genuinely unitless.\nconst UNITLESS = new Set([\n\t'fontWeight',\n\t'lineHeight',\n\t'opacity',\n\t'zIndex',\n\t'flex',\n\t'flexGrow',\n\t'flexShrink',\n\t'order',\n]);\nfunction withUnits(sheet: Record<string, CSSProperties>): Record<string, CSSProperties> {\n\tconst out: Record<string, CSSProperties> = {};\n\tfor (const [name, rule] of Object.entries(sheet)) {\n\t\tconst fixed: Record<string, unknown> = {};\n\t\tfor (const [prop, value] of Object.entries(rule)) {\n\t\t\tfixed[prop] = typeof value === 'number' && !UNITLESS.has(prop) ? `${value}px` : value;\n\t\t}\n\t\tout[name] = fixed as CSSProperties;\n\t}\n\treturn out;\n}\n\nexport const styles: Record<string, CSSProperties> = withUnits(raw);\n","import type { CSSProperties, VNode, VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { ICONS, type IconName } from './icons';\nimport { styles, type Tone, tint, toneColor } from './styles';\n\n// Small building blocks every screen composes, so a header, a status or an\n// empty page looks the same everywhere instead of being re-invented per\n// screen. Render helpers (not components), matching ./screens/common.ts;\n// the React screens ship the same blocks as components in ui.tsx.\n\nexport function icon(name: IconName, size = 16, style?: CSSProperties): VNode {\n\treturn h(\n\t\t'svg',\n\t\t{\n\t\t\twidth: size,\n\t\t\theight: size,\n\t\t\tviewBox: '0 0 24 24',\n\t\t\tfill: 'none',\n\t\t\tstroke: 'currentColor',\n\t\t\t'stroke-width': 2,\n\t\t\t'stroke-linecap': 'round',\n\t\t\t'stroke-linejoin': 'round',\n\t\t\t'aria-hidden': 'true',\n\t\t\tstyle: { flexShrink: 0, ...style },\n\t\t},\n\t\tICONS[name].map((d) => h('path', { key: d, d })),\n\t);\n}\n\n/** Title, one line saying what the page answers, and its actions on the right. */\nexport function pageHeader(title: VNodeChild, lead?: VNodeChild, actions?: VNodeChild[]): VNode {\n\treturn h('div', { style: styles.header }, [\n\t\th('div', { style: { minWidth: 0 } }, [\n\t\t\th('h1', { style: styles.title }, title as never),\n\t\t\tlead ? h('p', { style: styles.lead }, lead as never) : null,\n\t\t]),\n\t\tactions?.filter(Boolean).length ? h('div', { style: styles.actions }, actions as never) : null,\n\t]);\n}\n\n/** A status: coloured text on a tint of the same colour, with a dot. */\nexport function pill(tone: Tone, text: VNodeChild, dot = true): VNode {\n\tconst color = toneColor[tone];\n\treturn h(\n\t\t'span',\n\t\t{ style: { ...styles.pill, color, background: tint(color, tone === 'neutral' ? 10 : 13) } },\n\t\t[dot ? h('span', { style: styles.dot }) : null, text as never],\n\t);\n}\n\nexport function stat(label: VNodeChild, value: VNodeChild, hint?: VNodeChild, tone?: Tone): VNode {\n\treturn h('div', { style: styles.card }, [\n\t\th('div', { style: styles.statLabel }, label as never),\n\t\th(\n\t\t\t'div',\n\t\t\t{ style: { ...styles.statValue, ...(tone ? { color: toneColor[tone] } : {}) } },\n\t\t\tvalue as never,\n\t\t),\n\t\thint ? h('div', { style: styles.statHint }, hint as never) : null,\n\t]);\n}\n\nexport function empty(title: VNodeChild, body?: VNodeChild, iconName: IconName = 'check'): VNode {\n\treturn h('div', { style: styles.empty }, [\n\t\ticon(iconName, 22),\n\t\th('div', { style: styles.emptyTitle }, title as never),\n\t\tbody ? h('div', body as never) : null,\n\t]);\n}\n\nexport function refreshButton(\n\tonClick: () => void,\n\tbusy: boolean,\n\tlabel = 'Refresh',\n\tbusyLabel = 'Working…',\n): VNode {\n\treturn h('button', { type: 'button', style: styles.button, onClick, disabled: busy }, [\n\t\ticon('refresh', 14),\n\t\tbusy ? busyLabel : label,\n\t]);\n}\n\n/** Colour for an HTTP method chip. */\nexport function methodChip(method: string): VNode {\n\tconst tone: Tone =\n\t\tmethod === 'GET' ? 'ok' : method === 'DELETE' ? 'bad' : method === 'POST' ? 'info' : 'warn';\n\tconst color = toneColor[tone];\n\treturn h(\n\t\t'span',\n\t\t{\n\t\t\tstyle: {\n\t\t\t\t...styles.mono,\n\t\t\t\tfontSize: '11px',\n\t\t\t\tfontWeight: 700,\n\t\t\t\tcolor,\n\t\t\t\tbackground: tint(color, 12),\n\t\t\t\tborderRadius: '4px',\n\t\t\t\tpadding: '2px 6px',\n\t\t\t\tdisplay: 'inline-block',\n\t\t\t\tminWidth: '44px',\n\t\t\t\ttextAlign: 'center',\n\t\t\t},\n\t\t},\n\t\tmethod,\n\t);\n}\n","// Stroke icons (24×24, 2px, round caps — the Lucide geometry), as path data so\n// both the React and Vue screens draw the same glyphs with no icon font and no\n// fetch. Keep this file identical in react-admin-screens and vue-admin-screens.\nexport const ICONS = {\n\tattention: ['M22 12h-4l-3 9L9 3l-3 9H2'],\n\tmodules: [\n\t\t'M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z',\n\t\t'M3.3 7 12 12l8.7-5',\n\t\t'M12 22V12',\n\t],\n\tenvironment: [\n\t\t'M4 21v-7',\n\t\t'M4 10V3',\n\t\t'M12 21v-9',\n\t\t'M12 8V3',\n\t\t'M20 21v-5',\n\t\t'M20 12V3',\n\t\t'M1 14h6',\n\t\t'M9 8h6',\n\t\t'M17 16h6',\n\t],\n\tdoctor: [\n\t\t'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n\t],\n\troutes: [\n\t\t'M6 3v12',\n\t\t'M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n\t\t'M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n\t\t'M18 9a9 9 0 0 1-9 9',\n\t],\n\tusers: [\n\t\t'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2',\n\t\t'M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z',\n\t\t'M22 21v-2a4 4 0 0 0-3-3.87',\n\t\t'M16 3.13a4 4 0 0 1 0 7.75',\n\t],\n\tcatalog: [\n\t\t'M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z',\n\t\t'M7.5 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1z',\n\t],\n\tsubscriber: ['M2 7h20v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z', 'M2 11h20', 'M6 15h4'],\n\tsettings: [\n\t\t'M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z',\n\t\t'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n\t],\n\ttemplates: [\n\t\t'M22 7l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7',\n\t\t'M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z',\n\t],\n\taudit: ['M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z', 'M9 12l2 2 4-4'],\n\tlog: ['M12 8v4l3 3', 'M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5'],\n\ttokens: [\n\t\t'M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z',\n\t\t'M16.5 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1z',\n\t],\n\tmigrations: [\n\t\t'M12 22c4.97 0 9-1.79 9-4V6',\n\t\t'M3 6v12c0 2.21 4.03 4 9 4',\n\t\t'M12 10c4.97 0 9-1.79 9-4s-4.03-4-9-4-9 1.79-9 4 4.03 4 9 4z',\n\t\t'M3 12c0 2.21 4.03 4 9 4s9-1.79 9-4',\n\t],\n\tmenu: ['M4 6h16', 'M4 12h16', 'M4 18h16'],\n\tclose: ['M18 6 6 18', 'm6 6 12 12'],\n\trefresh: [\n\t\t'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8',\n\t\t'M21 3v5h-5',\n\t\t'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16',\n\t\t'M8 16H3v5',\n\t],\n\tcheck: ['M20 6 9 17l-5-5'],\n\talert: [\n\t\t'M12 9v4',\n\t\t'M12 17h.01',\n\t\t'M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z',\n\t],\n\tsearch: ['M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z', 'm21 21-4.3-4.3'],\n\tback: ['m12 19-7-7 7-7', 'M19 12H5'],\n\tlogout: ['M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4', 'm16 17 5-5-5-5', 'M21 12H9'],\n\tlock: [\n\t\t'M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2z',\n\t\t'M7 11V7a5 5 0 0 1 10 0v4',\n\t],\n\tplus: ['M12 5v14', 'M5 12h14'],\n\tmark: [\n\t\t'M4 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z',\n\t\t'M15 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z',\n\t\t'M15 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1z',\n\t\t'M4 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1z',\n\t],\n} as const;\n\nexport type IconName = keyof typeof ICONS;\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { empty, methodChip, pageHeader, pill } from '../ui';\nimport { loadMoreButton, refreshButton, table, td } from './common';\n\n// Who did what through the surface, newest first — refused requests included.\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\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\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\tconst t = createAdminT(props.locale);\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('log.title'), t('log.lead'), [\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\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 ? t('log.off') : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: entries.value.length === 0 && !isLoading.value\n\t\t\t\t\t\t? empty(t('log.empty'), undefined, 'log')\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt('log.colWhen'),\n\t\t\t\t\t\t\t\t\t\tt('log.colActor'),\n\t\t\t\t\t\t\t\t\t\tt('log.colRequest'),\n\t\t\t\t\t\t\t\t\t\tt('log.colStatus'),\n\t\t\t\t\t\t\t\t\t\tt('log.colModule'),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tentries.value.map((e) =>\n\t\t\t\t\t\t\t\t\t\th('tr', { key: e.id }, [\n\t\t\t\t\t\t\t\t\t\t\ttd(formatAdminDate(e.at, props.locale), {\n\t\t\t\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\ttd(e.actor),\n\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\tmethodChip(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, wordBreak: 'break-all' } }, e.path),\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\ttd(\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\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.status >= 500 ? 'bad' : e.status >= 400 ? 'warn' : 'ok',\n\t\t\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\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\th('span', { style: styles.muted }, `${e.durationMs} ms`),\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{ whiteSpace: 'nowrap' },\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\ttd(e.module, styles.muted),\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\tisLoading.value ? h('p', { style: styles.status }, t('common.loading')) : null,\n\t\t\t\t\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t\t\t\t\t? loadMoreButton(() => void loadMore(), t('common.loadMore'))\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t],\n\t\t\t]);\n\t\t};\n\t},\n});\n","import type { FonderieApiError } from '@fonderie/client';\nimport type { CSSProperties, Ref, VNode, VNodeChild } from 'vue';\nimport { h } from 'vue';\nimport { styles } from '../styles';\nimport { icon, pageHeader } from '../ui';\n\n// Shared frame: header (title, lead, actions on the right), then\n// loading / error / content.\nexport function page(\n\ttitle: string,\n\tstate: { isLoading: { readonly value: boolean }; error: Ref<FonderieApiError | null> },\n\tcontent: () => VNode | VNode[] | null,\n\ttoolbar: (VNode | null)[] = [],\n\toptions: {\n\t\tloadingText?: string;\n\t\terrorText?: (e: FonderieApiError) => string;\n\t\tlead?: VNodeChild;\n\t} = {},\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 }, [pageHeader(title, options.lead, toolbar), body]);\n}\n\nexport function table(\n\theaders: (string | { label: string; style: CSSProperties })[],\n\trows: VNode[],\n): 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) =>\n\t\t\t\t\ttypeof t === 'string'\n\t\t\t\t\t\t? h('th', { style: styles.th }, t)\n\t\t\t\t\t\t: h('th', { style: { ...styles.th, ...t.style } }, t.label),\n\t\t\t\t),\n\t\t\t),\n\t\t]),\n\t\th('tbody', rows),\n\t]);\n}\n\nexport const td = (children: VNodeChild, extra: object = {}) =>\n\th('td', { style: { ...styles.td, ...extra } }, children as never);\n\nexport const refreshButton = (\n\tlabel: string,\n\tdisabled: boolean,\n\tonClick: () => void,\n\tbusyLabel = 'Working…',\n) =>\n\th('button', { type: 'button', style: styles.button, disabled, onClick }, [\n\t\ticon('refresh', 14),\n\t\tdisabled ? busyLabel : label,\n\t]);\n\nexport const loadMoreButton = (onClick: () => void, label = 'Load more') =>\n\th('button', { type: 'button', style: { ...styles.button, marginTop: '12px' }, onClick }, label);\n\n// A plain action button (no refresh glyph); `style` picks the variant.\nexport const actionButton = (\n\tlabel: VNodeChild,\n\tdisabled: boolean,\n\tonClick: () => void,\n\tstyle: CSSProperties | undefined = styles.button,\n) => h('button', { type: 'button', style, disabled, onClick }, label as never);\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAttention, useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { empty, icon, pill, stat } from '../ui';\nimport { page, refreshButton } from './common';\n\n// What needs the operator today. Empty is green. The tiles above the list are\n// the at-a-glance answer; the list is what to do about it.\nexport const AttentionScreen = defineComponent({\n\tname: 'FonderieAttentionScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { attention, isLoading, error, refresh } = useAttention(props.client);\n\t\tconst { manifest } = useManifest(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst a = attention.value;\n\t\t\tconst m = manifest.value;\n\t\t\tconst errors = a?.items.filter((i) => i.severity === 'error') ?? [];\n\t\t\tconst advice = a?.items.filter((i) => i.severity !== 'error') ?? [];\n\t\t\tconst ready = m?.modules.filter((x) => x.readiness.ok).length ?? 0;\n\t\t\tconst total = m?.modules.length ?? 0;\n\t\t\tconst tiles = h('div', { style: styles.grid }, [\n\t\t\t\tstat(\n\t\t\t\t\tt('attention.needsAction'),\n\t\t\t\t\ta ? errors.length : '—',\n\t\t\t\t\tt('attention.needsActionHint'),\n\t\t\t\t\terrors.length ? 'bad' : a ? 'ok' : undefined,\n\t\t\t\t),\n\t\t\t\tstat(\n\t\t\t\t\tt('attention.advice'),\n\t\t\t\t\ta ? advice.length : '—',\n\t\t\t\t\tt('attention.adviceHint'),\n\t\t\t\t\tadvice.length ? 'warn' : undefined,\n\t\t\t\t),\n\t\t\t\tstat(\n\t\t\t\t\tt('attention.modulesReady'),\n\t\t\t\t\tm ? `${ready}/${total}` : '—',\n\t\t\t\t\tm ? t('attention.modulesReadyHint', { version: m.admin.version }) : undefined,\n\t\t\t\t\tm && ready < total ? 'warn' : m ? 'ok' : undefined,\n\t\t\t\t),\n\t\t\t\tstat(t('attention.routes'), m ? m.routes.length : '—', m ? m.env : undefined),\n\t\t\t]);\n\t\t\treturn page(\n\t\t\t\tt('attention.title'),\n\t\t\t\t// Tiles show while the checks run; only the list waits.\n\t\t\t\t{ isLoading: { value: false }, error },\n\t\t\t\t() => {\n\t\t\t\t\tif (isLoading.value && !a)\n\t\t\t\t\t\treturn [tiles, h('p', { style: styles.status }, t('attention.running'))];\n\t\t\t\t\tif (!a) return tiles;\n\t\t\t\t\tif (a.items.length === 0)\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\ttiles,\n\t\t\t\t\t\t\tempty(\n\t\t\t\t\t\t\t\tt('attention.emptyTitle'),\n\t\t\t\t\t\t\t\tt('attention.emptyBody', { time: formatAdminDate(a.generatedAt, props.locale) }),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t];\n\t\t\t\t\treturn [\n\t\t\t\t\t\ttiles,\n\t\t\t\t\t\th(\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[...errors, ...advice].map((item) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tkey: `${item.source}:${item.message}`,\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.row,\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\tgap: '12px',\n\t\t\t\t\t\t\t\t\t\t\talignItems: 'flex-start',\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[\n\t\t\t\t\t\t\t\t\t\ticon('alert', 16, {\n\t\t\t\t\t\t\t\t\t\t\tmarginTop: '3px',\n\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\titem.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-danger,#e00)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-warning,#f5a623)',\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\th('div', { style: { minWidth: 0, flex: 1 } }, [\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\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmarginBottom: '2px',\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\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.severity === 'error' ? 'bad' : 'warn',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.error')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.advice'),\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\th('span', { style: styles.mono }, item.source),\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('div', { style: { lineHeight: 1.55 } }, item.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),\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(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tlead: a\n\t\t\t\t\t\t? t('attention.leadChecked', {\n\t\t\t\t\t\t\t\ttime: formatAdminDate(a.generatedAt, props.locale, 'time'),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('attention.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { pill } from '../ui';\nimport { page } from './common';\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport const EnvironmentScreen = defineComponent({\n\tname: 'FonderieEnvironmentScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminEnvironment(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst r = report.value;\n\t\t\tconst missing = r?.env.filter((e) => !e.set).length ?? 0;\n\t\t\treturn page(\n\t\t\t\tt('environment.title'),\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tif (!r) return null;\n\t\t\t\t\treturn [\n\t\t\t\t\t\th('h2', { style: { ...styles.subtitle, marginTop: 0 } }, t('environment.variables')),\n\t\t\t\t\t\tr.env.length === 0\n\t\t\t\t\t\t\t? h('p', { style: styles.muted }, t('environment.noVariables'))\n\t\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t...styles.grid,\n\t\t\t\t\t\t\t\t\t\t\tgridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))',\n\t\t\t\t\t\t\t\t\t\t\tgap: '8px',\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\tr.env.map((e) =>\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: e.name,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: '10px 12px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: '8px',\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\th('span', { style: { ...styles.mono, wordBreak: 'break-all' } }, e.name),\n\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\te.set ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\t\t\t\te.set ? t('common.status.set') : t('common.status.missing'),\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),\n\t\t\t\t\t\th('h2', { style: styles.subtitle }, t('environment.moduleReadiness')),\n\t\t\t\t\t\th(\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\tr.modules.map((m) =>\n\t\t\t\t\t\t\t\th('li', { key: m.name, style: styles.row }, [\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\t\t\tgap: '12px',\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\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\t[\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: { ...styles.mono, fontWeight: 600 } }, m.name),\n\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\tm.problems.length === 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'ok'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: m.problems.some((p) => p.severity === 'error')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bad'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'warn',\n\t\t\t\t\t\t\t\t\t\t\t\tm.problems.length === 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.ready')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: m.problems.length === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('environment.problemOne')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t('environment.problemMany', { n: m.problems.length }),\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\t...m.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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-danger,#e00)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-text-muted,#5c5c5c)',\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\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),\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\tr && r.env.length > 0\n\t\t\t\t\t\t? pill(\n\t\t\t\t\t\t\t\tmissing ? 'bad' : 'ok',\n\t\t\t\t\t\t\t\tmissing ? t('environment.missingCount', { n: missing }) : t('environment.allSet'),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: t('environment.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { pill } from '../ui';\nimport { page, refreshButton, table, td } from './common';\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport const DoctorScreen = defineComponent({\n\tname: 'FonderieDoctorScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh } = useDoctor(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\treturn page(\n\t\t\t\tt('doctor.title'),\n\t\t\t\t{ isLoading: { value: isLoading.value && !report.value }, 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 table(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ label: t('doctor.colResult'), style: { width: '110px' } },\n\t\t\t\t\t\t\tt('doctor.colCheck'),\n\t\t\t\t\t\t\t{ label: t('doctor.colTime'), style: { textAlign: 'right', width: '90px' } },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tr.checks.map((c) =>\n\t\t\t\t\t\t\th('tr', { key: c.name }, [\n\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\tc.skipped ? 'neutral' : c.ok ? (c.findings.length ? 'warn' : 'ok') : 'bad',\n\t\t\t\t\t\t\t\t\t\tc.skipped\n\t\t\t\t\t\t\t\t\t\t\t? t('common.status.skipped')\n\t\t\t\t\t\t\t\t\t\t\t: c.ok\n\t\t\t\t\t\t\t\t\t\t\t\t? c.findings.length\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.advice')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.ok')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.failed'),\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([\n\t\t\t\t\t\t\t\t\th('div', [\n\t\t\t\t\t\t\t\t\t\th('span', { style: { ...styles.mono, fontWeight: 600 } }, c.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: styles.muted }, c.module),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\tc.skipped\n\t\t\t\t\t\t\t\t\t\t? h('div', { style: { ...styles.muted, marginTop: '4px' } }, c.skipped)\n\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t...c.findings.map((f) =>\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: f,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '4px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1.55,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: c.ok\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-text,#171717)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-danger,#e00)',\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\tf,\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(`${c.durationMs} ms`, {\n\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\ttextAlign: 'right',\n\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\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\treport.value && !isLoading.value\n\t\t\t\t\t\t? pill(\n\t\t\t\t\t\t\t\treport.value.ok ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\treport.value.ok ? t('doctor.allPass') : t('doctor.oneFailed'),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('doctor.runAgain'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('doctor.running'),\n\t\t\t\t\tlead: t('doctor.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useManifest } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { pill } from '../ui';\nimport { page, table, td } from './common';\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport const ModulesScreen = defineComponent({\n\tname: 'FonderieModulesScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { manifest, isLoading, error } = useManifest(props.client);\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst m = manifest.value;\n\t\t\treturn page(\n\t\t\t\tt('modules.title'),\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() => {\n\t\t\t\t\tif (!m) return null;\n\t\t\t\t\treturn table(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tt('modules.colModule'),\n\t\t\t\t\t\t\tt('modules.colVersion'),\n\t\t\t\t\t\t\tt('modules.colReadiness'),\n\t\t\t\t\t\t\tt('modules.colAdmin'),\n\t\t\t\t\t\t],\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, fontWeight: 600 }),\n\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\tmod.version ?? h('span', { style: styles.muted }, t('modules.notReported')),\n\t\t\t\t\t\t\t\t\tstyles.mono,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\tmod.readiness.ok ? t('common.status.ready') : t('common.status.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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tp.severity === 'error'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'var(--fonderie-danger,#e00)'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'var(--fonderie-text-muted,#5c5c5c)',\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\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(\n\t\t\t\t\t\t\t\t\tmod.describesAdmin\n\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.badge }, t('modules.describesAdmin'))\n\t\t\t\t\t\t\t\t\t\t: h('span', { style: 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\t\t);\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: m\n\t\t\t\t\t\t? t('modules.leadSummary', {\n\t\t\t\t\t\t\t\tenv: m.env,\n\t\t\t\t\t\t\t\tversion: m.admin.version,\n\t\t\t\t\t\t\t\tlog: m.admin.log ? t('modules.logOn') : t('modules.logOff'),\n\t\t\t\t\t\t\t\troutes: m.routes.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('modules.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import { type AdminClient, type AdminLocale, createAdminT } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { methodChip, pill } from '../ui';\nimport { page, table, td } from './common';\n\n// Every exposed route and what guards it. A hundred rows is normal, so the\n// page filters as you type.\nexport const RoutesScreen = defineComponent({\n\tname: 'FonderieRoutesScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error } = useAdminRoutes(props.client);\n\t\tconst q = ref('');\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst needle = q.value.trim().toLowerCase();\n\t\t\tconst routes = (report.value?.routes ?? []).filter(\n\t\t\t\t(r) =>\n\t\t\t\t\t!needle ||\n\t\t\t\t\t`${r.method} ${r.path} ${r.module ?? 'application'} ${r.guard}`\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes(needle),\n\t\t\t);\n\t\t\treturn page(\n\t\t\t\tt('routes.title'),\n\t\t\t\t{ isLoading, error },\n\t\t\t\t() =>\n\t\t\t\t\ttable(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ label: t('routes.colMethod'), style: { width: '80px' } },\n\t\t\t\t\t\t\tt('routes.colPath'),\n\t\t\t\t\t\t\tt('routes.colGuard'),\n\t\t\t\t\t\t\tt('routes.colModule'),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...routes.map((r) =>\n\t\t\t\t\t\t\t\th('tr', { key: `${r.method} ${r.path}` }, [\n\t\t\t\t\t\t\t\t\ttd(methodChip(r.method)),\n\t\t\t\t\t\t\t\t\ttd(r.path, { ...styles.mono, wordBreak: 'break-all' }),\n\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\tr.guard === 'admin' ? 'ok' : r.guard === 'probe' ? 'neutral' : 'info',\n\t\t\t\t\t\t\t\t\t\t\tr.guard,\n\t\t\t\t\t\t\t\t\t\t\tfalse,\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\ttd(r.module ?? t('routes.application'), 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\t...(routes.length === 0\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\th('tr', [\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'td',\n\t\t\t\t\t\t\t\t\t\t\t\t{ style: { ...styles.td, ...styles.muted }, colspan: 4 },\n\t\t\t\t\t\t\t\t\t\t\t\tt('routes.noMatch', { q: q.value }),\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: []),\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t[\n\t\t\t\t\th('input', {\n\t\t\t\t\t\ttype: 'search',\n\t\t\t\t\t\tvalue: q.value,\n\t\t\t\t\t\tplaceholder: t('routes.filterPlaceholder'),\n\t\t\t\t\t\tstyle: { ...styles.input, width: '280px' },\n\t\t\t\t\t\t'aria-label': t('routes.filterLabel'),\n\t\t\t\t\t\tonInput: (e: Event) => {\n\t\t\t\t\t\t\tq.value = (e.target as HTMLInputElement).value;\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\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: report.value\n\t\t\t\t\t\t? t('routes.leadCount', { n: report.value.routes.length })\n\t\t\t\t\t\t: t('routes.lead'),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminT,\n\tcreateAdminT,\n\ttype IAdminMigrationModule,\n} 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 { empty, pill } from '../ui';\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(t: AdminT, m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return t('migrations.blockedBy', { module: m.blockedBy });\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn t('migrations.destructiveBlocked');\n\treturn null;\n}\n\nexport const MigrationsScreen = defineComponent({\n\tname: 'FonderieMigrationsScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(props.client);\n\n\t\tconst section = (t: AdminT, m: IAdminMigrationModule, everApplied: boolean): VNode => {\n\t\t\tconst blocked = why(t, m, everApplied);\n\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\treturn h('section', { style: { ...styles.card, marginBottom: '16px' } }, [\n\t\t\t\th('h2', { style: { ...styles.subtitle, marginTop: 0 } }, [\n\t\t\t\t\th('span', { style: styles.mono }, m.name),\n\t\t\t\t\tpill('warn', t('migrations.pendingCount', { n: m.pending.length })),\n\t\t\t\t]),\n\t\t\t\th(\n\t\t\t\t\t'ul',\n\t\t\t\t\t{ style: { margin: '0 0 12px', paddingLeft: '18px', lineHeight: 1.9 } },\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', { style: styles.code }, p.file),\n\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\tp.impact === 'destructive'\n\t\t\t\t\t\t\t\t? pill('bad', t('migrations.destructive'))\n\t\t\t\t\t\t\t\t: pill('neutral', t('migrations.additive')),\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.notice, marginBottom: 0 } }, 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.buttonPrimary,\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\tt('migrations.confirmApply', { n: m.pending.length, module: m.name }),\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\tm.pending.length === 1\n\t\t\t\t\t\t\t\t? t('migrations.applyOne')\n\t\t\t\t\t\t\t\t: t('migrations.applyMany', { n: m.pending.length }),\n\t\t\t\t\t\t),\n\t\t\t]);\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\treturn page(\n\t\t\t\tt('migrations.title'),\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)\n\t\t\t\t\t\treturn empty(t('migrations.upToDate'), t('migrations.noPending'), 'migrations');\n\t\t\t\t\treturn [\n\t\t\t\t\t\tr.everApplied ? null : h('p', { style: styles.notice }, t('migrations.firstInstall')),\n\t\t\t\t\t\t...behind.map((m) => section(t, m, r.everApplied)),\n\t\t\t\t\t].filter(Boolean) as VNode[];\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tloadingText: t('common.loading'),\n\t\t\t\t\tlead: t('migrations.lead'),\n\t\t\t\t\terrorText: (e) => (e.status === 403 ? t('migrations.needsWrite') : e.explanation),\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\ttype AdminT,\n\tcreateAdminT,\n\tformatAdminDate,\n\ttype IAdminCreatedLink,\n\ttype IAdminOperator,\n} from '@fonderie/client';\nimport { useAdminOperators } from '@fonderie/vue-admin';\nimport type { PropType, VNode } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { styles } from '../styles';\nimport { empty, icon, pageHeader, pill } from '../ui';\nimport { table, td } from './common';\n\n// Access levels as people think of them; scopes underneath.\ntype LevelId = 'read' | 'editor' | 'owner';\nconst LEVELS: Array<{ id: LevelId; scopes: AdminScope[] }> = [\n\t{ id: 'read', scopes: ['read'] },\n\t{ id: 'editor', scopes: ['read', 'write'] },\n\t{ id: 'owner', scopes: ['read', 'write', 'secrets'] },\n];\nconst levelOf = (scopes: readonly AdminScope[]): LevelId =>\n\tscopes.includes('secrets') ? 'owner' : scopes.includes('write') ? 'editor' : 'read';\nconst scopesFor = (id: string): AdminScope[] => LEVELS.find((l) => l.id === id)?.scopes ?? ['read'];\n\nconst small = { height: '28px' };\n\n// The people who can sign in here. No registration: an owner invites, the\n// invitee sets a password and an authenticator. Lost device or password → a\n// recovery link from another owner.\nexport const OperatorsScreen = defineComponent({\n\tname: 'FonderieOperatorsScreen',\n\tprops: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\t// The signed-in operator's email: their own row offers no disable or\n\t\t// recovery (the server refuses both for yourself anyway).\n\t\tme: { type: String, default: undefined },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst { report, isLoading, error, invite, recover, update, revokeLink } = useAdminOperators(\n\t\t\tprops.client,\n\t\t);\n\t\tconst email = ref('');\n\t\tconst level = ref<string>('editor');\n\t\tconst minted = ref<IAdminCreatedLink | null>(null);\n\t\tconst copied = ref(false);\n\n\t\tconst status = (t: AdminT, o: IAdminOperator): VNode =>\n\t\t\to.disabledAt\n\t\t\t\t? pill('neutral', t('common.status.disabled'))\n\t\t\t\t: o.locked\n\t\t\t\t\t? pill('warn', t('common.status.locked'))\n\t\t\t\t\t: !o.enrolled\n\t\t\t\t\t\t? pill('warn', t('operators.settingUp'))\n\t\t\t\t\t\t: pill('ok', t('common.status.active'));\n\n\t\tconst mintedNotice = (t: AdminT, link: IAdminCreatedLink): VNode => {\n\t\t\tconst url = `${window.location.origin}${link.url}`;\n\t\t\treturn h(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\t...styles.notice,\n\t\t\t\t\t\tbackground: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\t\t\tborderColor: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\th('strong', t('operators.mintedTitle', { email: link.email })),\n\t\t\t\t\t` ${t('operators.mintedBody', { date: formatAdminDate(link.expiresAt, props.locale) })}`,\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: { display: 'flex', gap: '8px', marginTop: '8px', alignItems: 'center' } },\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'code',\n\t\t\t\t\t\t\t\t{ style: { ...styles.code, flex: 1, padding: '7px 10px', wordBreak: 'break-all' } },\n\t\t\t\t\t\t\t\turl,\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'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tstyle: styles.button,\n\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard?.writeText(url);\n\t\t\t\t\t\t\t\t\t\tcopied.value = true;\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\tcopied.value ? t('common.copied') : t('common.copy'),\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'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tstyle: styles.buttonGhost,\n\t\t\t\t\t\t\t\t\t'aria-label': t('common.dismiss'),\n\t\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\t\tminted.value = null;\n\t\t\t\t\t\t\t\t\t\tcopied.value = false;\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[icon('close', 14)],\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\t};\n\n\t\tconst setMinted = (l: IAdminCreatedLink) => {\n\t\t\tcopied.value = false;\n\t\t\tminted.value = l;\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst r = report.value;\n\t\t\tconst e = error.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('operators.title'), t('operators.lead')),\n\t\t\t\te\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\te.status === 403 && e.reason === 'FORBIDDEN'\n\t\t\t\t\t\t\t\t? t('operators.needsOwner')\n\t\t\t\t\t\t\t\t: e.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tminted.value ? mintedNotice(t, minted.value) : null,\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: {\n\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\tmarginBottom: '20px',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSubmit: (ev: Event) => {\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t\tvoid invite({ email: email.value.trim(), scopes: scopesFor(level.value) })\n\t\t\t\t\t\t\t\t.then((l) => {\n\t\t\t\t\t\t\t\t\tsetMinted(l);\n\t\t\t\t\t\t\t\t\temail.value = '';\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {});\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\ticon('users', 16),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t\t{ style: { fontSize: '13.5px', marginRight: '4px' } },\n\t\t\t\t\t\t\tt('operators.invite'),\n\t\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\trequired: true,\n\t\t\t\t\t\t\tvalue: email.value,\n\t\t\t\t\t\t\tonInput: (ev: Event) => (email.value = (ev.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tplaceholder: t('operators.invitePlaceholder'),\n\t\t\t\t\t\t\tstyle: { ...styles.input, flex: 1, minWidth: '220px' },\n\t\t\t\t\t\t\t'aria-label': t('operators.inviteLabel'),\n\t\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: level.value,\n\t\t\t\t\t\t\t\tonChange: (ev: Event) => (level.value = (ev.target as HTMLSelectElement).value),\n\t\t\t\t\t\t\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t'aria-label': t('operators.accessLevelLabel'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tLEVELS.map((l) =>\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'option',\n\t\t\t\t\t\t\t\t\t{ key: l.id, value: l.id },\n\t\t\t\t\t\t\t\t\t`${t(`operators.level.${l.id}`)} — ${t(`operators.levelHint.${l.id}`)}`,\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\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ type: 'submit', style: styles.buttonPrimary, disabled: !email.value.trim() },\n\t\t\t\t\t\t\t[icon('plus', 14), t('operators.createInvite')],\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t\tisLoading.value && !r\n\t\t\t\t\t? h('p', { style: styles.status }, t('common.loading'))\n\t\t\t\t\t: r && r.operators.length === 0\n\t\t\t\t\t\t? empty(t('operators.emptyTitle'), undefined, 'users')\n\t\t\t\t\t\t: r\n\t\t\t\t\t\t\t? table(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt('operators.col.operator'),\n\t\t\t\t\t\t\t\t\t\tt('operators.col.access'),\n\t\t\t\t\t\t\t\t\t\tt('operators.col.status'),\n\t\t\t\t\t\t\t\t\t\tt('operators.col.lastSignIn'),\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\tr.operators.map((o) => {\n\t\t\t\t\t\t\t\t\t\tconst mine = o.email === props.me;\n\t\t\t\t\t\t\t\t\t\treturn h('tr', { key: o.id }, [\n\t\t\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\th('div', { style: { fontWeight: 600 } }, o.name || o.email),\n\t\t\t\t\t\t\t\t\t\t\t\to.name ? h('div', { style: styles.muted }, o.email) : null,\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\ttd(\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'select',\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\tvalue: levelOf(o.scopes),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: mine,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange: (ev: Event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid update(o.id, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tscopes: scopesFor((ev.target as HTMLSelectElement).value),\n\t\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\t\tstyle: { ...styles.input, ...small, fontSize: '12.5px' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'aria-label': t('operators.accessLevelFor', { email: o.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\tLEVELS.map((l) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\th('option', { key: l.id, value: l.id }, t(`operators.level.${l.id}`)),\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\ttd([\n\t\t\t\t\t\t\t\t\t\t\t\tstatus(t, o),\n\t\t\t\t\t\t\t\t\t\t\t\to.enrolled && o.backupCodesLeft <= 2 && !o.disabledAt\n\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'div',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: { ...styles.muted, marginTop: '4px' } },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\to.backupCodesLeft === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'operators.backupCodesLeftOne'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'operators.backupCodesLeftMany',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ n: o.backupCodesLeft },\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: null,\n\t\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\to.lastLoginAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(o.lastLoginAt, props.locale)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.never'),\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\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\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\ttd(\n\t\t\t\t\t\t\t\t\t\t\t\tmine\n\t\t\t\t\t\t\t\t\t\t\t\t\t? h('span', { style: styles.muted }, t('common.you'))\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\th(\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, ...small, marginRight: '6px' },\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\tt('operators.recoveryConfirm', { email: o.email }),\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 recover(o.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(setMinted)\n\t\t\t\t\t\t\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\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\tt('operators.recoveryLink'),\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\th(\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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(o.disabledAt ? styles.button : styles.buttonDanger),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...small,\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\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\to.disabledAt ||\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\tt('operators.disableConfirm', { email: o.email }),\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 update(o.id, { disabled: !o.disabledAt }).catch(\n\t\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\t);\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\to.disabledAt ? t('operators.enable') : t('operators.disable'),\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{ textAlign: 'right', whiteSpace: 'nowrap' },\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)\n\t\t\t\t\t\t\t: null,\n\t\t\t\tr && r.links.length > 0\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, t('operators.pendingLinks')),\n\t\t\t\t\t\t\th(\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.links.map((l) =>\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tkey: l.id,\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.row, display: 'flex', gap: '12px', alignItems: 'center' },\n\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\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\tl.kind === 'invite' ? 'info' : 'warn',\n\t\t\t\t\t\t\t\t\t\t\t\tl.kind === 'invite'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('operators.linkKind.invite')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('operators.linkKind.recovery'),\n\t\t\t\t\t\t\t\t\t\t\t\tfalse,\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: { flex: 1 } }, [\n\t\t\t\t\t\t\t\t\t\t\t\tl.email,\n\t\t\t\t\t\t\t\t\t\t\t\tl.kind === 'invite'\n\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'span',\n\t\t\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\t\t` · ${t(`operators.level.${levelOf(l.scopes)}`)}`,\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: null,\n\t\t\t\t\t\t\t\t\t\t\t]),\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\tt('operators.expiresOn', {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdate: formatAdminDate(l.expiresAt, props.locale),\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(\n\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{\n\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\tstyle: { ...styles.buttonDanger, ...small },\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => void revokeLink(l.id).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\tt('operators.revoke'),\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),\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]);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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 { empty, icon, pageHeader, pill } from '../ui';\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: {\n\t\tclient: { type: Object as PropType<AdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\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 t = createAdminT(props.locale);\n\t\t\tconst loc = props.locale;\n\t\t\tconst r = report.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('tokens.title'), t('tokens.lead')),\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 ? t('tokens.needsRoot') : 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, marginTop: 0 } }, t('tokens.rootToken')),\n\t\t\t\tr\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ style: { ...styles.card, display: 'flex', gap: '12px', alignItems: 'flex-start' } },\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\ticon('lock', 18, { marginTop: '2px' }),\n\t\t\t\t\t\t\t\th('div', [\n\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\tr.admin.ok ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\tr.admin.ok ? t('tokens.strong') : t('tokens.weak'),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...r.admin.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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: 'var(--fonderie-danger,#e00)',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\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\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],\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\th('h2', { style: styles.subtitle }, t('tokens.issuedTokens')),\n\t\t\t\tr?.issued === null\n\t\t\t\t\t? h('p', { style: styles.muted }, t('tokens.issuingOff'))\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(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t...styles.notice,\n\t\t\t\t\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\t\t\t\t\t'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\t\t\t\t\t\t\t\t\tborderColor:\n\t\t\t\t\t\t\t\t\t\t\t\t\t'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\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\t[\n\t\t\t\t\t\t\t\t\t\t\th('strong', t('tokens.copyNow')),\n\t\t\t\t\t\t\t\t\t\t\t` (${minted.value.name})`,\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\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...styles.code,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: '8px 10px',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twordBreak: 'break-all',\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\tminted.value.token,\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: 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((tk) => {\n\t\t\t\t\t\t\t\t\t\t\t\tminted.value = { name: tk.name, token: tk.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: t('tokens.namePlaceholder'),\n\t\t\t\t\t\t\t\t\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t\t\t'aria-label': t('tokens.nameLabel'),\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(\n\t\t\t\t\t\t\t\t\t\t\t'label',\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: s,\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...styles.badge,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: '32px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxSizing: 'border-box',\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: '0 10px',\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '13px',\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\th('input', {\n\t\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\t\tchecked: scopes.value.includes(s),\n\t\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\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t` ${t(`tokens.scope.${s}`)}`,\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\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: t('tokens.daysPlaceholder'),\n\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, width: '140px' },\n\t\t\t\t\t\t\t\t\t\t'aria-label': t('tokens.daysLabel'),\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.buttonPrimary,\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[icon('plus', 14), t('tokens.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[\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.name'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.scopes'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.created'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.expires'),\n\t\t\t\t\t\t\t\t\t\t\tt('tokens.col.lastUsed'),\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\tr.issued.map((tk) =>\n\t\t\t\t\t\t\t\t\t\t\th('tr', { key: tk.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\ttk.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttk.revokedAt ? [' ', pill('neutral', t('tokens.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(tk.scopes.map((sc) => t(`tokens.scope.${sc}`)).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`${formatAdminDate(tk.createdAt, loc, 'date')} · ${tk.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\ttk.expiresAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(tk.expiresAt, loc, 'date')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.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\ttk.lastUsedAt ? formatAdminDate(tk.lastUsedAt, loc) : t('common.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\ttk.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.buttonDanger,\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(t('tokens.revokeConfirm', { name: tk.name }))\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(tk.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\tt('tokens.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: empty(t('tokens.emptyTitle'), t('tokens.emptyBody'), 'tokens'),\n\t\t\t\t\t\t],\n\t\t\t\th('h2', { style: styles.subtitle }, t('tokens.legacyTitle')),\n\t\t\t\tr && r.legacy.length === 0\n\t\t\t\t\t? h('p', { style: styles.muted }, t('tokens.legacyNone'))\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('span', { style: styles.muted }, t('tokens.legacyRow')),\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 {\n\ttype AdminLocale,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\tdescribeLocation,\n\tformatAdminDate,\n} 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 { statusLabel, statusTone, useSubscriptionIndex } from '../billing';\nimport { styles } from '../styles';\nimport { empty, icon, pageHeader, pill } from '../ui';\nimport { actionButton, loadMoreButton, refreshButton, table, td } from './common';\nimport { SubscriberBilling } from './SubscriberBilling';\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\t// Given ⇒ a Plan column, and each user's plan, credits and grant form on\n\t\t// their page. Everyone has a wallet; no subscription means the free tier.\n\t\tbillingClient: { type: Object as PropType<BillingAdminClient>, default: undefined },\n\t\t// Open this user on arrival (e.g. from the Subscriptions list).\n\t\topenUserId: { type: String, default: undefined },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst input = ref('');\n\t\tconst email = ref('');\n\t\tconst selectedId = ref(props.openUserId ?? '');\n\t\tconst plans = useSubscriptionIndex(props.billingClient);\n\t\t// Soft-deleted accounts are their own view: they cannot sign in and are\n\t\t// erased by the retention purge, but until then an operator can see them.\n\t\t// One list per mode — the composable reads its query once, at setup.\n\t\tconst showDeleted = ref(false);\n\t\tconst activeList = useAdminUsers(props.client, { limit: props.pageSize });\n\t\tconst deletedList = useAdminUsers(props.client, { limit: props.pageSize, deleted: true });\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 tr = computed(() => createAdminT(props.locale));\n\t\tconst yesNo = (v: boolean) =>\n\t\t\tv ? pill('ok', tr.value('common.yes')) : pill('neutral', tr.value('common.no'));\n\t\tconst row = (k: string, v: unknown) => h('tr', [td(k), td(v as never)]);\n\t\tconst planCell = (id: string) => {\n\t\t\tif (!plans.value) return h('span', { style: styles.muted }, '…');\n\t\t\tconst sub = plans.value.get(`user/${id}`);\n\t\t\tif (!sub || sub.status === 'canceled')\n\t\t\t\treturn h('span', { style: styles.muted }, tr.value('common.status.free'));\n\t\t\treturn [\n\t\t\t\th('strong', sub.plan),\n\t\t\t\t' ',\n\t\t\t\tsub.status !== 'active'\n\t\t\t\t\t? pill(statusTone(sub.status), statusLabel(tr.value, sub.status))\n\t\t\t\t\t: null,\n\t\t\t];\n\t\t};\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 t = tr.value;\n\t\t\tconst loc = props.locale;\n\t\t\tconst u = user.value;\n\t\t\tconst list = showDeleted.value ? deletedList : activeList;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('users.title'), t('users.lead')),\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: t('users.emailPlaceholder'),\n\t\t\t\t\t\t\tstyle: { ...styles.input, minWidth: '280px' },\n\t\t\t\t\t\t\t'aria-label': t('users.emailLabel'),\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.buttonPrimary, disabled: isLoading.value },\n\t\t\t\t\t\t\t[icon('search', 14), t('common.lookUp')],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? refreshButton(\n\t\t\t\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\t\t\t\tlist.isLoading.value,\n\t\t\t\t\t\t\t\t\t() => void list.refresh(),\n\t\t\t\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: actionButton(\n\t\t\t\t\t\t\t\t\t[icon('back', 14), t('users.allUsers')],\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tclear,\n\t\t\t\t\t\t\t\t\tstyles.buttonGhost,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\tshowList.value\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'fieldset',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\tgap: '6px',\n\t\t\t\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\t\t\t\tmargin: '0 0 0 auto',\n\t\t\t\t\t\t\t\t\t\t\tpadding: '0',\n\t\t\t\t\t\t\t\t\t\t\tminWidth: '0',\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t'aria-label': t('users.whichAccounts'),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t[false, true].map((d) =>\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'button',\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: String(d),\n\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'aria-pressed': showDeleted.value === d,\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => (showDeleted.value = d),\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(showDeleted.value === d ? styles.buttonPrimary : styles.button),\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: '28px',\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\td ? t('users.deletedAccounts') : t('users.activeAccounts'),\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: null,\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? empty(t('users.emptyTitle'), t('users.emptyBody'), 'users')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.email'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.name'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.plan'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.created'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.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: [\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.email'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.name'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.created'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.col.status'),\n\t\t\t\t\t\t\t\t\t\t\t\t],\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.link,\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\tprops.billingClient ? td(planCell(u.id)) : null,\n\t\t\t\t\t\t\t\t\t\t\t\ttd(formatAdminDate(u.createdAt, loc, 'date')),\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? pill('warn', t('common.status.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? pill('neutral', t('common.status.deleted'))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: pill('ok', t('common.status.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 }, t('common.loading')) : null,\n\t\t\t\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t\t\t\t? loadMoreButton(() => void list.loadMore(), t('common.loadMore'))\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 && !(error.value.status === 404 && selectedId.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 ? t('users.noUserWithEmail') : error.value.explanation,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\t// Opened by id (e.g. from Subscriptions) and the account is gone —\n\t\t\t\t// deleted or purged — while its billing rows remain. Say so, and\n\t\t\t\t// still show the money.\n\t\t\t\terror.value?.status === 404 && selectedId.value\n\t\t\t\t\t? [\n\t\t\t\t\t\t\th('div', { style: styles.notice, role: 'status' }, [\n\t\t\t\t\t\t\t\th('strong', `${t('users.missingIdPrefix')} `),\n\t\t\t\t\t\t\t\th('code', { style: styles.code }, selectedId.value),\n\t\t\t\t\t\t\t\th('strong', '.'),\n\t\t\t\t\t\t\t\t` ${t('users.missingIdBody')}`,\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t? h('h2', { style: styles.subtitle }, t('users.planCredits'))\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t? h(SubscriberBilling, {\n\t\t\t\t\t\t\t\t\t\tkey: `missing-${selectedId.value}`,\n\t\t\t\t\t\t\t\t\t\tclient: props.billingClient,\n\t\t\t\t\t\t\t\t\t\tsubscriberType: 'user',\n\t\t\t\t\t\t\t\t\t\tsubscriberId: selectedId.value,\n\t\t\t\t\t\t\t\t\t\t...(loc ? { locale: loc } : {}),\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\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 ? pill('warn', t('common.status.suspended')) : null,\n\t\t\t\t\t\t\t\tu.deletedAt ? pill('neutral', t('common.status.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(t('users.field.id'), h('span', { style: styles.mono }, u.id)),\n\t\t\t\t\t\t\t\t\trow(t('users.field.email'), [\n\t\t\t\t\t\t\t\t\t\tu.email,\n\t\t\t\t\t\t\t\t\t\t` · ${t('users.field.verified')} `,\n\t\t\t\t\t\t\t\t\t\tyesNo(u.isEmailVerified),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\trow(t('users.field.mfa'), yesNo(u.mfaEnabled)),\n\t\t\t\t\t\t\t\t\trow(\n\t\t\t\t\t\t\t\t\t\tt('users.field.provider'),\n\t\t\t\t\t\t\t\t\t\t`${u.provider || t('users.passwordProvider')}${u.hasPassword ? '' : ` · ${t('users.noPasswordSet')}`}`,\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\tt('users.field.lastLogin'),\n\t\t\t\t\t\t\t\t\t\tu.lastLogin\n\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(u.lastLogin, loc)\n\t\t\t\t\t\t\t\t\t\t\t: h('span', { style: styles.muted }, t('common.never')),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trow(t('users.field.created'), formatAdminDate(u.createdAt, loc)),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tu.deletedAt\n\t\t\t\t\t\t\t\t? h('div', { style: { ...styles.notice, marginTop: '12px' }, role: 'status' }, [\n\t\t\t\t\t\t\t\t\t\th('strong', t('users.deletedOn', { date: formatAdminDate(u.deletedAt, loc) })),\n\t\t\t\t\t\t\t\t\t\t` ${t('users.deletedBody')}`,\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t: h('div', { style: { ...styles.toolbar, marginTop: '12px' } }, [\n\t\t\t\t\t\t\t\t\t\tu.suspended\n\t\t\t\t\t\t\t\t\t\t\t? actionButton(t('users.unsuspend'), isLoading.value, () => void unsuspend())\n\t\t\t\t\t\t\t\t\t\t\t: actionButton(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt('users.suspend'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => void suspend(),\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.buttonDanger,\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tactionButton(\n\t\t\t\t\t\t\t\t\t\t\tt('users.signOutEverywhere'),\n\t\t\t\t\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t\t\t\t\t() => void revokeSessions().then(() => sessions.refresh()),\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\tprops.billingClient\n\t\t\t\t\t\t\t\t? h('h2', { style: styles.subtitle }, t('users.planCredits'))\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tprops.billingClient\n\t\t\t\t\t\t\t\t? h(SubscriberBilling, {\n\t\t\t\t\t\t\t\t\t\tkey: u.id,\n\t\t\t\t\t\t\t\t\t\tclient: props.billingClient,\n\t\t\t\t\t\t\t\t\t\tsubscriberType: 'user',\n\t\t\t\t\t\t\t\t\t\tsubscriberId: u.id,\n\t\t\t\t\t\t\t\t\t\t...(loc ? { locale: loc } : {}),\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\tu.deletedAt\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\th('h2', { style: styles.subtitle }, t('users.liveSessions')),\n\t\t\t\t\t\t\t\t\t\tsessions.sessions.value.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, t('common.none'))\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'ul',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\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\t\t\t\th('li', { key: s.id, style: styles.row }, [\n\t\t\t\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\t\t\t' ',\n\t\t\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\t\t'span',\n\t\t\t\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\t\t\tdescribeLocation(s.location) ?? '',\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\t' ',\n\t\t\t\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\t\t\t' ',\n\t\t\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\t\t'span',\n\t\t\t\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\t\t\tt('users.since', { date: formatAdminDate(s.createdAt, loc) }),\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),\n\t\t\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 }, t('users.recentSignIns')),\n\t\t\t\t\t\t\t\t\t\thistory.events.value.length === 0 && !history.isLoading.value\n\t\t\t\t\t\t\t\t\t\t\t? h('p', { style: styles.muted }, t('users.noneRecorded'))\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'ul',\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ style: styles.list },\n\t\t\t\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\t\t\t\th('li', { key: e.id, style: styles.row }, [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome === 'success' ? 'ok' : 'bad',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.outcome === 'success'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.success')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome === 'failure'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.failure')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome,\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\t' ',\n\t\t\t\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\t\t\t' ',\n\t\t\t\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\t\t\t' ',\n\t\t\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\t\t'span',\n\t\t\t\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\t\t\tdescribeLocation(e.location) ?? '',\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\te.location?.proxy || e.location?.hosting\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\t\t' ',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpill(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'warn',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.location.proxy ? t('users.proxyVpn') : t('users.hosting'),\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]\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' ',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, formatAdminDate(e.createdAt, loc)),\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\thistory.hasMore.value && !history.isLoading.value\n\t\t\t\t\t\t\t\t\t\t\t? loadMoreButton(() => void history.loadMore(), t('common.loadMore'))\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]\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminLocale,\n\ttype AdminT,\n\ttype BillingAdminClient,\n\ttype IAdminSubscriptionDTO,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { type Ref, ref } from 'vue';\nimport type { Tone } from './styles';\n\n/** What the period end means for this subscription. A canceled one does not renew. */\nexport function periodEnd(\n\ts: IAdminSubscriptionDTO,\n\tlocale?: AdminLocale,\n): { label: string; date: string } | null {\n\tif (!s.currentPeriodEnd) return null;\n\tconst t = createAdminT(locale);\n\tconst date = formatAdminDate(s.currentPeriodEnd, locale, 'date');\n\tif (s.status === 'canceled')\n\t\treturn {\n\t\t\tlabel: new Date(s.currentPeriodEnd) < new Date() ? t('billing.ended') : t('billing.ends'),\n\t\t\tdate,\n\t\t};\n\tif (s.cancelAtPeriodEnd) return { label: t('billing.ends'), date };\n\treturn { label: t('billing.renews'), date };\n}\n\nconst STATUS_KEYS = [\n\t'active',\n\t'trialing',\n\t'past_due',\n\t'unpaid',\n\t'canceled',\n\t'incomplete',\n\t'incomplete_expired',\n\t'paused',\n] as const;\n\n/** A subscription status in the console's language; an unknown one is shown as sent. */\nexport function statusLabel(t: AdminT, status: string): string {\n\treturn (STATUS_KEYS as readonly string[]).includes(status)\n\t\t? t(`billing.statusLabel.${status as (typeof STATUS_KEYS)[number]}`)\n\t\t: status;\n}\n\n/** A billing interval in the console's language; an unknown one is shown as sent. */\nexport function intervalLabel(t: AdminT, interval: string): string {\n\treturn interval === 'month' || interval === 'year'\n\t\t? t(`billing.intervalLabel.${interval}`)\n\t\t: interval;\n}\n\nexport const statusTone = (status: string): Tone =>\n\tstatus === 'active'\n\t\t? 'ok'\n\t\t: status === 'trialing'\n\t\t\t? 'info'\n\t\t\t: status === 'past_due' || status === 'unpaid'\n\t\t\t\t? 'warn'\n\t\t\t\t: 'neutral';\n\n/**\n * Every subscription, keyed by `type/id`, for showing a plan next to each user.\n * Reads the admin list page by page (100 at a time, at most 2,000) — a\n * console-sized index, not a query engine. Anyone absent from it is free.\n */\nexport function useSubscriptionIndex(\n\tclient: BillingAdminClient | undefined,\n): Ref<Map<string, IAdminSubscriptionDTO> | null> {\n\tconst index = ref<Map<string, IAdminSubscriptionDTO> | null>(null) as Ref<Map<\n\t\tstring,\n\t\tIAdminSubscriptionDTO\n\t> | null>;\n\tif (!client) return index;\n\tvoid (async () => {\n\t\tconst map = new Map<string, IAdminSubscriptionDTO>();\n\t\tlet cursor: string | undefined;\n\t\tfor (let page = 0; page < 20; page++) {\n\t\t\tconst { result } = await client.listSubscriptions({\n\t\t\t\tlimit: 100,\n\t\t\t\t...(cursor ? { cursor } : {}),\n\t\t\t});\n\t\t\tfor (const s of result.subscriptions) {\n\t\t\t\tconst key = `${s.subscriberType}/${s.subscriberId}`;\n\t\t\t\t// Newest first: keep the first (current) one per subscriber.\n\t\t\t\tif (!map.has(key)) map.set(key, s);\n\t\t\t}\n\t\t\tif (!result.nextCursor) break;\n\t\t\tcursor = result.nextCursor;\n\t\t}\n\t\tindex.value = map;\n\t})().catch(() => {\n\t\tindex.value = new Map();\n\t});\n\treturn index;\n}\n","import {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\tformatAdminDate,\n\ttype SubscriberType,\n} from '@fonderie/client';\nimport { useAdminSubscriber } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { computed, defineComponent, h, ref } from 'vue';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { empty, icon, pill } from '../ui';\nimport { loadMoreButton, table, td } from './common';\n\nconst LEDGER_KINDS = ['purchase', 'grant', 'usage', 'refund', 'adjustment', 'expiry'] as const;\n\n// One subscriber's money: plan, wallet, the one write (a grant,\n// idempotency-keyed) and what moved. Used on a user's page and for workspace\n// subscribers. A subscription is NOT required: everyone has a wallet, and a\n// user with no subscription is on the free tier.\nconst SubscriberBillingInner = defineComponent({\n\tname: 'FonderieSubscriberBillingInner',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tsubscriberType: { type: String as PropType<SubscriberType>, required: true },\n\t\tsubscriberId: { type: String, required: true },\n\t\tcurrency: { type: String, default: '' },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\temits: { 'change-currency': (_currency: string) => true },\n\tsetup(props, { emit }) {\n\t\tconst subscriber = computed(() => ({ type: props.subscriberType, id: props.subscriberId }));\n\t\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\t\tuseAdminSubscriber(props.client, subscriber, {\n\t\t\t\tlimit: 20,\n\t\t\t\t...(props.currency ? { currency: props.currency } : {}),\n\t\t\t});\n\t\tconst currencyDraft = ref(props.currency);\n\t\tconst amount = ref('');\n\t\tconst note = ref('');\n\t\tconst granted = ref<string | null>(null);\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst ledgerKind = (kind: string) =>\n\t\t\t\t(LEDGER_KINDS as readonly string[]).includes(kind)\n\t\t\t\t\t? t(`billing.ledgerKind.${kind as (typeof LEDGER_KINDS)[number]}`)\n\t\t\t\t\t: kind;\n\t\t\tconst s = subscription.value;\n\t\t\tconst w = wallet.value;\n\t\t\tif (isLoading.value && !w && !s)\n\t\t\t\treturn h('p', { style: styles.status }, t('billing.loading'));\n\t\t\tconst end = s ? periodEnd(s, props.locale) : null;\n\t\t\treturn h('div', [\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\th('div', { style: { ...styles.grid, marginBottom: '16px' } }, [\n\t\t\t\t\th('div', { style: styles.card }, [\n\t\t\t\t\t\th('div', { style: styles.statLabel }, t('billing.plan')),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\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[\n\t\t\t\t\t\t\t\th('strong', { style: { fontSize: '18px' } }, s ? s.plan : t('billing.free')),\n\t\t\t\t\t\t\t\t...(s\n\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 }, `· ${intervalLabel(t, s.interval)}`),\n\t\t\t\t\t\t\t\t\t\t\tpill(statusTone(s.status), statusLabel(t, s.status)),\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: [h('span', { style: styles.muted }, t('billing.noSubscription'))]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t\tend ? h('div', { style: styles.statHint }, `${end.label} ${end.date}`) : null,\n\t\t\t\t\t\ts?.providerSubscriptionId\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ style: { ...styles.statHint, fontFamily: 'var(--fonderie-mono,monospace)' } },\n\t\t\t\t\t\t\t\t\ts.providerSubscriptionId,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t]),\n\t\t\t\t\th('div', { style: styles.card }, [\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\tgap: '8px',\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[\n\t\t\t\t\t\t\t\th('div', { style: styles.statLabel }, t('billing.credits')),\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstyle: { display: 'flex', gap: '4px' },\n\t\t\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\temit('change-currency', currencyDraft.value.trim().toUpperCase());\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[\n\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\tvalue: currencyDraft.value,\n\t\t\t\t\t\t\t\t\t\t\tonInput: (e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tcurrencyDraft.value = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tplaceholder: w?.currency ?? t('billing.currencyPlaceholder'),\n\t\t\t\t\t\t\t\t\t\t\tmaxlength: 8,\n\t\t\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, height: '26px', width: '84px', fontSize: '12px' },\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': t('billing.currencyLabel'),\n\t\t\t\t\t\t\t\t\t\t\ttitle: t('billing.currencyTitle'),\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],\n\t\t\t\t\t\t),\n\t\t\t\t\t\t...(w\n\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\th('div', { style: styles.statValue }, [\n\t\t\t\t\t\t\t\t\t\t`${w.balance} `,\n\t\t\t\t\t\t\t\t\t\th('span', { style: { fontSize: '14px', fontWeight: 500 } }, w.currency),\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'div',\n\t\t\t\t\t\t\t\t\t\t{ style: styles.statHint },\n\t\t\t\t\t\t\t\t\t\t`${t('billing.breakdown', { permanent: w.purchased ?? '0', allowance: w.granted ?? '0' })}${\n\t\t\t\t\t\t\t\t\t\t\tw.grantedExpiresAt\n\t\t\t\t\t\t\t\t\t\t\t\t? t('billing.expires', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdate: formatAdminDate(w.grantedExpiresAt, props.locale, 'date'),\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}`,\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: [h('div', { style: styles.statHint }, t('billing.noWallet'))]),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t\tw\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'form',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\t\tmarginBottom: '16px',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${props.subscriberType}-${props.subscriberId}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tconst a = amount.value.trim();\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: a,\n\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\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\tgranted.value = t('billing.granted', { amount: a, currency: w.currency });\n\t\t\t\t\t\t\t\t\t\t\tamount.value = '';\n\t\t\t\t\t\t\t\t\t\t\tnote.value = '';\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.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[\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'strong',\n\t\t\t\t\t\t\t\t\t{ style: { fontSize: '13.5px', marginRight: '4px' } },\n\t\t\t\t\t\t\t\t\tt('billing.grantCredits'),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tvalue: amount.value,\n\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (amount.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\tplaceholder: t('billing.amountPlaceholder', { currency: w.currency }),\n\t\t\t\t\t\t\t\t\tinputmode: 'numeric',\n\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, width: '150px' },\n\t\t\t\t\t\t\t\t\t'aria-label': t('billing.amountLabel'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tvalue: note.value,\n\t\t\t\t\t\t\t\t\tonInput: (e: Event) => (note.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t\tplaceholder: t('billing.reasonPlaceholder'),\n\t\t\t\t\t\t\t\t\tstyle: { ...styles.input, flex: 1, minWidth: '180px' },\n\t\t\t\t\t\t\t\t\t'aria-label': t('billing.reasonLabel'),\n\t\t\t\t\t\t\t\t}),\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\ttype: 'submit',\n\t\t\t\t\t\t\t\t\t\tstyle: styles.buttonPrimary,\n\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},\n\t\t\t\t\t\t\t\t\t[icon('plus', 14), t('billing.grant')],\n\t\t\t\t\t\t\t\t),\n\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],\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t\tw\n\t\t\t\t\t? ledger.value.length === 0\n\t\t\t\t\t\t? empty(t('billing.noMovements'), undefined, 'subscriber')\n\t\t\t\t\t\t: h('div', [\n\t\t\t\t\t\t\t\ttable(\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt('billing.col.when'),\n\t\t\t\t\t\t\t\t\t\tt('billing.col.kind'),\n\t\t\t\t\t\t\t\t\t\tt('billing.col.amount'),\n\t\t\t\t\t\t\t\t\t\tt('billing.col.note'),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tledger.value.map((tx) =>\n\t\t\t\t\t\t\t\t\t\th('tr', { key: tx.id }, [\n\t\t\t\t\t\t\t\t\t\t\ttd(formatAdminDate(tx.createdAt, props.locale), {\n\t\t\t\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\ttd(ledgerKind(tx.type)),\n\t\t\t\t\t\t\t\t\t\t\ttd(tx.amount, styles.mono),\n\t\t\t\t\t\t\t\t\t\t\ttd(tx.description ?? '', styles.muted),\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\thasMoreLedger.value\n\t\t\t\t\t\t\t\t\t? loadMoreButton(() => void loadMoreLedger(), t('common.loadMore'))\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t])\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n\n// A wallet exists per currency. Empty ⇒ the billing default; submitting another\n// (e.g. EUR) reads that wallet instead — same as the CLI's --currency. The\n// composable reads its options once, so a currency change remounts the inner view.\nexport const SubscriberBilling = defineComponent({\n\tname: 'FonderieSubscriberBilling',\n\tprops: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tsubscriberType: { type: String as PropType<SubscriberType>, required: true },\n\t\tsubscriberId: { type: String, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst currency = ref('');\n\t\treturn () =>\n\t\t\th(SubscriberBillingInner, {\n\t\t\t\tkey: `${props.subscriberType}:${props.subscriberId}:${currency.value}`,\n\t\t\t\tclient: props.client,\n\t\t\t\tsubscriberType: props.subscriberType,\n\t\t\t\tsubscriberId: props.subscriberId,\n\t\t\t\tcurrency: currency.value,\n\t\t\t\t...(props.locale ? { locale: props.locale } : {}),\n\t\t\t\t'onChange-currency': (c: string) => {\n\t\t\t\t\tcurrency.value = c;\n\t\t\t\t},\n\t\t\t});\n\t},\n});\n","import { type AdminLocale, type BillingAdminClient, createAdminT } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h } from 'vue';\nimport { styles } from '../styles';\nimport { empty, pageHeader } from '../ui';\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: {\n\t\tclient: { type: Object as PropType<BillingAdminClient>, required: true },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\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 t = createAdminT(props.locale);\n\t\t\tconst c = catalog.value;\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('catalog.title'), t('catalog.lead'), [\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\tt('common.working'),\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\tisLoading.value && !c ? h('p', { style: styles.status }, t('common.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, marginTop: 0 } }, t('catalog.configured')),\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.card,\n\t\t\t\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\t\t\t\tmaxHeight: '360px',\n\t\t\t\t\t\t\t\t\t\tlineHeight: 1.6,\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 }, t('catalog.stored')),\n\t\t\t\t\t\t\tc.stored.length === 0\n\t\t\t\t\t\t\t\t? empty(t('catalog.emptyTitle'), t('catalog.emptyBody'), 'catalog')\n\t\t\t\t\t\t\t\t: table(\n\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.plan'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.tier'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.seats'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.monthly'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.yearly'),\n\t\t\t\t\t\t\t\t\t\t\tt('catalog.col.trial'),\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\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 ? t('catalog.trialDays', { n: p.trialDays }) : '—'),\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.buttonDanger,\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(t('catalog.deleteConfirm', { name: 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\tt('common.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 {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\ttype SubscriberType,\n} from '@fonderie/client';\nimport { useAdminSubscribers } from '@fonderie/vue-admin';\nimport type { PropType } from 'vue';\nimport { defineComponent, h, ref } from 'vue';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { empty, icon, pageHeader, pill, refreshButton } from '../ui';\nimport { loadMoreButton, table, td } from './common';\nimport { SubscriberBilling } from './SubscriberBilling';\n\ntype FilterId = 'all' | 'active' | 'trialing' | 'pastDue' | 'canceled';\nconst FILTERS: Array<{ id: FilterId; match: (status: string) => boolean }> = [\n\t{ id: 'all', match: () => true },\n\t{ id: 'active', match: (s) => s === 'active' },\n\t{ id: 'trialing', match: (s) => s === 'trialing' },\n\t{ id: 'pastDue', match: (s) => s === 'past_due' || s === 'unpaid' },\n\t{ id: 'canceled', match: (s) => s === 'canceled' },\n];\n\n// Who pays, and who is behind. A money list: plans and statuses across users\n// and workspaces. A user's own billing (plan, credits, grants) is on their\n// page under Users; free users have no subscription and appear only there.\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\t/**\n\t\t * A user subscriber opens on the Users page, where their plan and credits\n\t\t * live beside their account. Omit to open everything here.\n\t\t */\n\t\tonOpenUser: { type: Function as PropType<(userId: string) => void>, default: undefined },\n\t\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst list = useAdminSubscribers(props.client, { limit: props.pageSize });\n\t\tconst filter = ref<FilterId>('all');\n\t\tconst open = ref<{ type: SubscriberType; id: string } | null>(null);\n\t\tconst type = ref<SubscriberType>('workspace');\n\t\tconst idInput = ref('');\n\t\tconst openRow = (t: SubscriberType, id: string) => {\n\t\t\tif (t === 'user' && props.onOpenUser) props.onOpenUser(id);\n\t\t\telse open.value = { type: t, id };\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\tconst loc = props.locale ? { locale: props.locale } : {};\n\t\t\tconst o = open.value;\n\t\t\tif (o) {\n\t\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\t\tpageHeader(`${o.type}/${o.id}`, t('billing.subscriptions.detailLead'), [\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: 'button', style: styles.buttonGhost, onClick: () => (open.value = null) },\n\t\t\t\t\t\t\t[icon('back', 14), t('billing.subscriptions.back')],\n\t\t\t\t\t\t),\n\t\t\t\t\t]),\n\t\t\t\t\th(SubscriberBilling, {\n\t\t\t\t\t\tkey: `${o.type}/${o.id}`,\n\t\t\t\t\t\tclient: props.client,\n\t\t\t\t\t\tsubscriberType: o.type,\n\t\t\t\t\t\tsubscriberId: o.id,\n\t\t\t\t\t\t...loc,\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t}\n\t\t\tconst match = FILTERS.find((f) => f.id === filter.value)?.match ?? (() => true);\n\t\t\tconst rows = list.subscriptions.value.filter((s) => match(s.status));\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('billing.subscriptions.title'), t('billing.subscriptions.lead'), [\n\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t() => void list.refresh(),\n\t\t\t\t\t\tlist.isLoading.value,\n\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t),\n\t\t\t\t]),\n\t\t\t\th('div', { style: { ...styles.toolbar, justifyContent: 'space-between' } }, [\n\t\t\t\t\th(\n\t\t\t\t\t\t'fieldset',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tgap: '6px',\n\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'aria-label': t('billing.subscriptions.filterLabel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tFILTERS.map((f) => {\n\t\t\t\t\t\t\tconst n = list.subscriptions.value.filter((s) => f.match(s.status)).length;\n\t\t\t\t\t\t\tconst on = filter.value === f.id;\n\t\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: f.id,\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t'aria-pressed': on,\n\t\t\t\t\t\t\t\t\tonClick: () => (filter.value = f.id),\n\t\t\t\t\t\t\t\t\tstyle: { ...(on ? styles.buttonPrimary : styles.button), height: '28px' },\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\tt(`billing.subscriptions.filter.${f.id}`),\n\t\t\t\t\t\t\t\t\th('span', { style: { opacity: 0.7 } }, String(n)),\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\th(\n\t\t\t\t\t\t'form',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstyle: { display: 'flex', gap: '6px' },\n\t\t\t\t\t\t\tonSubmit: (e: Event) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tif (idInput.value.trim()) openRow(type.value, idInput.value.trim());\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'select',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tvalue: type.value,\n\t\t\t\t\t\t\t\t\tonChange: (e: Event) =>\n\t\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\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t\t'aria-label': t('billing.subscriptions.typeLabel'),\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('option', { value: 'workspace' }, t('billing.subscriptions.typeWorkspace')),\n\t\t\t\t\t\t\t\t\th('option', { value: 'user' }, t('billing.subscriptions.typeUser')),\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('input', {\n\t\t\t\t\t\t\t\tvalue: idInput.value,\n\t\t\t\t\t\t\t\tonInput: (e: Event) => (idInput.value = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\tplaceholder: t('billing.subscriptions.idPlaceholder'),\n\t\t\t\t\t\t\t\tstyle: { ...styles.input, width: '220px' },\n\t\t\t\t\t\t\t\t'aria-label': t('billing.subscriptions.idLabel'),\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'button',\n\t\t\t\t\t\t\t\t{ type: 'submit', style: styles.button, disabled: !idInput.value.trim() },\n\t\t\t\t\t\t\t\t[icon('search', 14), t('common.open')],\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\tlist.error.value\n\t\t\t\t\t? h('p', { style: styles.error, role: 'alert' }, list.error.value.explanation)\n\t\t\t\t\t: null,\n\t\t\t\trows.length === 0 && !list.isLoading.value\n\t\t\t\t\t? empty(\n\t\t\t\t\t\t\tt(`billing.subscriptions.empty.${filter.value}`),\n\t\t\t\t\t\t\tt('billing.subscriptions.emptyHint'),\n\t\t\t\t\t\t\t'subscriber',\n\t\t\t\t\t\t)\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.subscriber'),\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.plan'),\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.status'),\n\t\t\t\t\t\t\t\tt('billing.subscriptions.col.renewsEnds'),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\trows.map((s) => {\n\t\t\t\t\t\t\t\tconst end = periodEnd(s, props.locale);\n\t\t\t\t\t\t\t\treturn h('tr', { key: s.id }, [\n\t\t\t\t\t\t\t\t\ttd(\n\t\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t\t{\n\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\tstyle: { ...styles.link, ...styles.mono },\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: () => openRow(s.subscriberType, s.subscriberId),\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.subscriberType}/${s.subscriberId}`,\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\ttd([\n\t\t\t\t\t\t\t\t\t\th('strong', s.plan),\n\t\t\t\t\t\t\t\t\t\t' ',\n\t\t\t\t\t\t\t\t\t\th('span', { style: styles.muted }, `· ${intervalLabel(t, s.interval)}`),\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\ttd([\n\t\t\t\t\t\t\t\t\t\tpill(statusTone(s.status), statusLabel(t, s.status)),\n\t\t\t\t\t\t\t\t\t\ts.cancelAtPeriodEnd && s.status !== 'canceled'\n\t\t\t\t\t\t\t\t\t\t\t? h('span', [' ', pill('warn', t('billing.subscriptions.cancels'), false)])\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\ttd(\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\t\t? [h('span', { style: styles.muted }, end.label), ` ${end.date}`]\n\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{ whiteSpace: 'nowrap' },\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\tlist.isLoading.value ? h('p', { style: styles.status }, t('common.loading')) : null,\n\t\t\t\tlist.hasMore.value && !list.isLoading.value\n\t\t\t\t\t? loadMoreButton(() => void list.loadMore(), t('common.loadMore'))\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n","import {\n\ttype AdminLocale,\n\ttype AuditAdminClient,\n\tcreateAdminT,\n\tformatAdminDate,\n\ttype IAdminAuditQuery,\n} 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 { empty, icon, pageHeader } from '../ui';\nimport { loadMoreButton, 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\tlocale: { type: String as PropType<AdminLocale>, default: undefined },\n\t},\n\tsetup(props) {\n\t\tconst draft = ref({ workspaceId: '', type: '', actorId: '', from: '', to: '' });\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.input,\n\t\t\t\t'aria-label': placeholder,\n\t\t\t});\n\t\treturn () => {\n\t\t\tconst t = createAdminT(props.locale);\n\t\t\treturn h('div', { style: styles.container }, [\n\t\t\t\tpageHeader(t('audit.title'), t('audit.lead')),\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\t// Dates are whole days in the operator's time zone: \"to\" includes that day.\n\t\t\t\t\t\t\t\t...(d.from ? { from: new Date(`${d.from}T00:00:00`) } : {}),\n\t\t\t\t\t\t\t\t...(d.to ? { to: new Date(`${d.to}T23:59:59.999`) } : {}),\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', t('audit.workspacePlaceholder')),\n\t\t\t\t\t\tfield('type', t('audit.typePlaceholder')),\n\t\t\t\t\t\tfield('actorId', t('audit.actorPlaceholder')),\n\t\t\t\t\t\t...(['from', 'to'] as const).map((k) =>\n\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\ttype: 'date',\n\t\t\t\t\t\t\t\tvalue: draft.value[k],\n\t\t\t\t\t\t\t\tonInput: (e: Event) =>\n\t\t\t\t\t\t\t\t\t(draft.value = { ...draft.value, [k]: (e.target as HTMLInputElement).value }),\n\t\t\t\t\t\t\t\tstyle: styles.input,\n\t\t\t\t\t\t\t\t'aria-label': k === 'from' ? t('audit.fromLabel') : t('audit.toLabel'),\n\t\t\t\t\t\t\t\ttitle: k === 'from' ? t('audit.fromTitle') : t('audit.toTitle'),\n\t\t\t\t\t\t\t}),\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.buttonPrimary, disabled: isLoading.value },\n\t\t\t\t\t\t\t[icon('search', 14), t('common.filter')],\n\t\t\t\t\t\t),\n\t\t\t\t\t\trefreshButton(\n\t\t\t\t\t\t\tt('common.refresh'),\n\t\t\t\t\t\t\tisLoading.value,\n\t\t\t\t\t\t\t() => void refresh(),\n\t\t\t\t\t\t\tt('common.working'),\n\t\t\t\t\t\t),\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? empty(t('audit.empty'), undefined, 'audit')\n\t\t\t\t\t: table(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tt('audit.col.when'),\n\t\t\t\t\t\t\t\tt('audit.col.type'),\n\t\t\t\t\t\t\t\tt('audit.col.workspace'),\n\t\t\t\t\t\t\t\tt('audit.col.actor'),\n\t\t\t\t\t\t\t\tt('audit.col.request'),\n\t\t\t\t\t\t\t],\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(formatAdminDate(e.createdAt, props.locale), 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 }, t('common.loading')) : null,\n\t\t\t\thasMore.value && !isLoading.value\n\t\t\t\t\t? loadMoreButton(() => void loadMore(), t('common.loadMore'))\n\t\t\t\t\t: null,\n\t\t\t]);\n\t\t};\n\t},\n});\n"],"mappings":"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","names":["import_client","import_vue","import_vue","import_vue","t","refreshButton","t","refreshButton","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","import_client","import_vue","t","page","import_client","import_vue_admin","import_vue","t","t","refreshButton","u","import_client","import_vue_admin","import_vue","t","refreshButton","import_client","import_vue_admin","import_vue","t","import_client","import_vue_admin","import_vue","t","refreshButton","t","c"]}