@fonderie/react-admin-screens 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/screens/AdminShell.tsx","../src/styles.ts","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/EnvironmentScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/MigrationsScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { EnvironmentScreen } from './EnvironmentScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { MigrationsScreen } from './MigrationsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\tauthClient?: AuthAdminClient;\n\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\tbillingClient?: BillingAdminClient;\n\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\tauditClient?: AuditAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'environment', label: 'Environment' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tauthClient,\n\tbillingClient,\n\tauditClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n}: IAdminShellProps) {\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = {\n\t\tconfig: Boolean(configClient),\n\t\tcourier: Boolean(courierClient),\n\t\tauth: Boolean(authClient),\n\t\tbilling: Boolean(billingClient),\n\t\taudit: Boolean(auditClient),\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'environment':\n\t\t\tbody = <EnvironmentScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'migrations':\n\t\t\tbody = <MigrationsScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to see the catalog here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'subscriber':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<SubscriberScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to look up subscribers here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'audit':\n\t\t\tbody = auditClient ? (\n\t\t\t\t<AuditScreen client={auditClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuditAdminClient to see the audit trail here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'users':\n\t\t\tbody = authClient ? (\n\t\t\t\t<UsersScreen client={authClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuthAdminClient to look up users here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={styles.status}>Pass a ConfigAdminClient to manage config and secrets here.</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t\tonCreateConfig={() => setEditing({ kind: 'config', key: '' })}\n\t\t\t\t\tonCreateSecret={() => setEditing({ kind: 'secret', key: '' })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={styles.status}>Pass a CourierAdminClient to manage templates here.</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div style={styles.shell}>\n\t\t\t<nav style={styles.nav} aria-label=\"Admin\">\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, ...(current === i.page ? styles.navItemActive : {}) }}\n\t\t\t\t\t\t\t\t\taria-current={current === i.page ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\tgo(i.page);\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\t{i.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t\t<main style={styles.main}>{body}</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\n//\n// Colours, type and radii come from `var(--fonderie-*)`, the organisation's\n// design tokens, declared once in the served shell (@fonderie/admin's\n// ui/html.ts). Inline styles take CSS variables, so this needs no stylesheet,\n// no build step and no class plumbing — and light/dark follow the tokens\n// without a single conditional here.\n//\n// Every var carries a FALLBACK. These screens are published packages: a\n// consumer importing them into their own app has no Fonderie shell and\n// therefore none of these variables, and `color: var(--fonderie-text)` with\n// nothing behind it resolves to nothing — black text on black, or invisible\n// borders. The fallbacks are the light palette, so an embedded screen still\n// renders correctly and simply is not themed.\nconst t = {\n\ttext: 'var(--fonderie-text,#171717)',\n\tmuted: 'var(--fonderie-text-muted,#5c5c5c)',\n\tbg: 'var(--fonderie-bg,#fafafa)',\n\tsurface: 'var(--fonderie-surface,#fff)',\n\tsurfaceAlt: 'var(--fonderie-surface-alt,#fafafa)',\n\tborder: 'var(--fonderie-border,#e0e0e0)',\n\tborderLight: 'var(--fonderie-border-light,#f5f5f5)',\n\taccent: 'var(--fonderie-accent,#00d294)',\n\taccentStrong: 'var(--fonderie-accent-strong,#009767)',\n\twarning: 'var(--fonderie-warning,#f5a623)',\n\tdanger: 'var(--fonderie-danger,#e00)',\n\tfont: 'var(--fonderie-font,Inter,\"Inter Fallback\",-apple-system,BlinkMacSystemFont,\"Helvetica Neue\",system-ui,sans-serif)',\n\tmono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace)',\n\tradius: 'var(--fonderie-radius,4px)',\n\tradiusLg: 'var(--fonderie-radius-lg,8px)',\n\ttrackingDisplay: 'var(--fonderie-tracking-display,-0.05em)',\n\tshadowCard: 'var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))',\n} as const;\n\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// The sidebar sits on the raised surface against the page canvas, which is\n\t// what separates the two without a heavy rule between them.\n\tnav: {\n\t\twidth: 220,\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tpadding: 16,\n\t\tflexShrink: 0,\n\t\tbackground: t.surface,\n\t},\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 0 6px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: t.radius,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t},\n\tnavItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: {\n\t\tfontSize: 20,\n\t\tfontWeight: 600,\n\t\tmarginTop: 0,\n\t\tmarginBottom: 12,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 24,\n\t\tmarginBottom: 8,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tstatus: { padding: 12, color: t.muted },\n\terror: { color: t.danger, marginBottom: 12, fontSize: 14 },\n\tok: { color: t.accentStrong, fontWeight: 600 },\n\tbad: { color: t.danger, fontWeight: 600 },\n\tadvice: { color: t.warning },\n\tmuted: { color: t.muted, fontSize: 13 },\n\tmono: { fontFamily: t.mono, fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: t.muted,\n\t},\n\ttd: { borderBottom: `1px solid ${t.borderLight}`, padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t},\n\tbutton: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radius,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tboxShadow: t.shadowCard,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n\t// Surfaces the screens compose themselves, kept here so a card looks the\n\t// same on every page rather than being re-invented per screen.\n\tcard: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: 16,\n\t\tboxShadow: t.shadowCard,\n\t},\n\taccent: { color: t.accent },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Admin log</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{e.method} {e.path}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<span style={e.status >= 400 ? styles.bad : styles.ok}>{e.status}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\n\n// What needs the operator today. Empty is green.\nexport function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Attention</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : attention?.items.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\tNothing needs you. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{attention?.items.map((item) => (\n\t\t\t\t\t\t<li key={`${item.source}:${item.message}`} style={styles.row}>\n\t\t\t\t\t\t\t<span style={item.severity === 'error' ? styles.bad : styles.advice}>\n\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span> — {item.message}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IEnvironmentScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function EnvironmentScreen({ client }: IEnvironmentScreenProps) {\n\tconst { report, isLoading, error } = useAdminEnvironment(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Configuration</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>{' '}\n\t\t\t\t\t\t\t\t{m.problems.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tm.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\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)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t\t<h2 style={styles.subtitle}>Environment</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.name} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t{e.set ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>set</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>missing</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Doctor</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRun again\n\t\t\t\t</button>\n\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t<span style={report.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t<li key={c.name} style={styles.row}>\n\t\t\t\t\t\t\t<span style={c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t\t\t{c.skipped ? 'skipped' : c.ok ? 'ok' : 'failed'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t{c.module} · {c.durationMs} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{c.skipped ? <div style={styles.muted}>{c.skipped}</div> : null}\n\t\t\t\t\t\t\t{c.findings.map((f) => (\n\t\t\t\t\t\t\t\t<div key={f} style={c.ok ? styles.advice : styles.bad}>\n\t\t\t\t\t\t\t\t\t{f}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Modules</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<>\n\t\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\t\t{manifest.env} · admin {manifest.admin.version} · admin log{' '}\n\t\t\t\t\t\t{manifest.admin.log ? 'on' : 'off'} · {manifest.routes.length} routes\n\t\t\t\t\t</p>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Describes admin</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{m.name}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>error</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\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\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\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</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.describesAdmin ? 'yes' : <span style={styles.muted}>no</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Routes</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.method}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<span style={styles.badge}>{r.guard}</span>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IMigrationsScreenProps {\n\tclient: AdminClient;\n}\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport function MigrationsScreen({ client }: IMigrationsScreenProps) {\n\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(client);\n\n\tconst behind = report?.modules.filter((m) => m.pending.length > 0) ?? [];\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Migrations</h1>\n\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 403\n\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<p>\n\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => void refresh()} disabled={isLoading}>\n\t\t\t\t\t{isLoading ? 'Checking…' : 'Refresh'}\n\t\t\t\t</button>{' '}\n\t\t\t\t{report && !report.everApplied ? (\n\t\t\t\t\t<span style={styles.advice}>\n\t\t\t\t\t\tThis database has never been migrated — treating it as a first install, so nothing is\n\t\t\t\t\t\theld back.\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</p>\n\n\t\t\t{report && behind.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>Every module is up to date.</p>\n\t\t\t) : null}\n\n\t\t\t{behind.map((m) => {\n\t\t\t\tconst blocked = why(m, report?.everApplied ?? false);\n\t\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\t\treturn (\n\t\t\t\t\t<section key={m.name} style={{ marginBottom: 24 }}>\n\t\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t\t{m.name} — {m.pending.length} pending\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t{m.pending.map((p) => (\n\t\t\t\t\t\t\t\t<li key={p.file}>\n\t\t\t\t\t\t\t\t\t<code>{p.file}</code>{' '}\n\t\t\t\t\t\t\t\t\t{p.impact === 'destructive' ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>destructive</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.advice}>additive</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.destructive.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t\t{p.destructive.map((s) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={s}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<code>{s.slice(0, 120)}</code>\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t{blocked ? (\n\t\t\t\t\t\t\t<p style={styles.advice}>{blocked}</p>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tdisabled={isLoading || !m.appliable}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The hook already put any failure in `error` and re-read\n\t\t\t\t\t\t\t\t\t\t// the real state; nothing useful is left to do here.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tApply {m.pending.length} migration{m.pending.length === 1 ? '' : 's'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\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 function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(client);\n\tconst [name, setName] = useState('');\n\tconst [scopes, setScopes] = useState<AdminScope[]>(['read']);\n\tconst [days, setDays] = useState('');\n\tconst [minted, setMinted] = useState<{ name: string; token: string } | null>(null);\n\n\tconst toggle = (s: AdminScope) =>\n\t\tsetScopes((prev) => (prev.includes(s) ? prev.filter((x) => x !== s) : [...prev, s]));\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</h1>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 401\n\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Root token</h2>\n\t\t\t{report ? (\n\t\t\t\t<p>\n\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\n\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Issued tokens</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\tIssuing is off — give AdminModule a store and run its migrations.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{minted ? (\n\t\t\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\t\t\tCopy this now — it is never shown again.{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{minted.token}</span> ({minted.name})\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<form\n\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = Number(days);\n\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\tname: name.trim(),\n\t\t\t\t\t\t\t\tscopes,\n\t\t\t\t\t\t\t\t...(days && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\tsetMinted({ name: t.name, token: t.token });\n\t\t\t\t\t\t\t\t\tsetName('');\n\t\t\t\t\t\t\t\t\tsetDays('');\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\t<input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"name\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\taria-label=\"Name\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ALL.map((s) => (\n\t\t\t\t\t\t\t<label key={s} style={{ ...styles.badge, cursor: 'pointer' }}>\n\t\t\t\t\t\t\t\t<input type=\"checkbox\" checked={scopes.includes(s)} onChange={() => toggle(s)} />{' '}\n\t\t\t\t\t\t\t\t{s}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={days}\n\t\t\t\t\t\t\tonChange={(e) => setDays(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"days (optional)\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', width: 140 }}\n\t\t\t\t\t\t\taria-label=\"Days\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tdisabled={!name.trim() || scopes.length === 0 || isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tIssue\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t\t{report?.issued && report.issued.length > 0 ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Scopes</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Expires</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Last used</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{report.issued.map((t) => (\n\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.name}\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? <span style={styles.badge}> revoked</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.scopes.join(', ')}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleDateString()} · {t.createdBy}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? null : (\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\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\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\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\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\tvoid revoke(t.id).catch(() => {});\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\tRevoke\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)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>None issued.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.legacy.map((l) => (\n\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { type AuthAdminClient, describeLocation } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n\tpageSize?: number;\n}\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 function UsersScreen({ client, pageSize = 50 }: IUsersScreenProps) {\n\tconst [input, setInput] = useState('');\n\tconst [selected, setSelected] = useState<{ id?: string; email?: string } | null>(null);\n\n\tconst list = useAdminUsers(client, { limit: pageSize });\n\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\tclient,\n\t\tselected ?? {},\n\t);\n\tconst userId = user?.id ?? null;\n\tconst sessions = useAdminUserSessions(client, userId);\n\tconst history = useAdminLoginHistory(client, userId, { limit: 20 });\n\n\tconst yesNo = (v: boolean) =>\n\t\tv ? <span style={styles.ok}>yes</span> : <span style={styles.muted}>no</span>;\n\n\tconst clear = () => {\n\t\tsetSelected(null);\n\t\tsetInput('');\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Users</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst email = input.trim();\n\t\t\t\t\tsetSelected(email ? { email } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"email address\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Email\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{selected ? (\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={clear}>\n\t\t\t\t\t\t← All users\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? 'No user with that email.' : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!selected ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.users.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>No users yet.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Email</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.users.map((u) => (\n\t\t\t\t\t\t\t\t\t<tr key={u.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\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\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, padding: 0 }}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setSelected({ id: u.id })}\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{u.email}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\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<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(u.createdAt).toLocaleDateString()}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{u.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t{u.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t{!u.suspended && !u.deletedAt ? <span style={styles.muted}>active</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{user ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t{user.firstName || user.lastName\n\t\t\t\t\t\t\t? `${user.firstName} ${user.lastName}`.trim()\n\t\t\t\t\t\t\t: user.email}{' '}\n\t\t\t\t\t\t{user.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t{user.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>id</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{user.id}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>email</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.email} · verified {yesNo(user.isEmailVerified)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>MFA</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{yesNo(user.mfaEnabled)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.provider || 'password'}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ' · no password set'}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>last login</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.lastLogin ? (\n\t\t\t\t\t\t\t\t\t\tnew Date(user.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>never</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>created</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(user.createdAt).toLocaleString()}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t{user.suspended ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tUnsuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tonClick={() => void revokeSessions().then(() => sessions.refresh())}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign out everywhere\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Live sessions</h2>\n\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\t\t\t\t\t\t<li key={s.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t{describeLocation(s.location) ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{describeLocation(s.location)} </span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{s.userAgent ?? ''}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>since {new Date(s.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Recent sign-ins</h2>\n\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>None recorded.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={e.outcome === 'success' ? styles.ok : styles.bad}>{e.outcome}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t{describeLocation(e.location) ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{describeLocation(e.location)}</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{e.location?.proxy || e.location?.hosting ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}> {e.location.proxy ? 'proxy/VPN' : 'hosting'}</span>\n\t\t\t\t\t\t\t\t\t) : null}{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{new Date(e.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{history.hasMore && !history.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void history.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ICatalogScreenProps {\n\tclient: BillingAdminClient;\n}\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 function CatalogScreen({ client }: ICatalogScreenProps) {\n\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(client);\n\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Catalog</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{isLoading && !catalog ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{catalog ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Configured (code)</h2>\n\t\t\t\t\t<pre style={{ ...styles.mono, background: 'var(--fonderie-surface-alt,#fafafa)', padding: 12, overflowX: 'auto' }}>\n\t\t\t\t\t\t{JSON.stringify(catalog.configured, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t\t<h2 style={styles.subtitle}>Stored (database)</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No stored plans.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Tier</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Seats</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Monthly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Yearly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Trial</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{catalog.stored.map((p) => (\n\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{p.name}</strong>\n\t\t\t\t\t\t\t\t\t\t\t{p.description ? <div style={styles.muted}>{p.description}</div> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.tier}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.seats ?? '∞'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{money(p.pricing?.monthly)} {p.pricing?.currency ?? ''}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{money(p.pricing?.yearly)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.trialDays ? `${p.trialDays} d` : '—'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\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\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.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>\n\t\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n\tpageSize?: number;\n}\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport function SubscriberScreen({ client, pageSize = 50 }: ISubscriberScreenProps) {\n\tconst [type, setType] = useState<SubscriberType>('user');\n\tconst [idInput, setIdInput] = useState('');\n\tconst [subscriber, setSubscriber] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst list = useAdminSubscribers(client, { limit: pageSize });\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20 });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\tconst open = (t: SubscriberType, id: string) => {\n\t\tsetGranted(null);\n\t\tsetType(t);\n\t\tsetIdInput(id);\n\t\tsetSubscriber({ type: t, id });\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Subscriber</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetGranted(null);\n\t\t\t\t\tsetSubscriber(idInput.trim() ? { type, id: idInput.trim() } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<select\n\t\t\t\t\tvalue={type}\n\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\taria-label=\"Type\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"user\">user</option>\n\t\t\t\t\t<option value=\"workspace\">workspace</option>\n\t\t\t\t</select>\n\t\t\t\t<input\n\t\t\t\t\tvalue={idInput}\n\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"subscriber id\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Subscriber id\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{subscriber ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetSubscriber(null);\n\t\t\t\t\t\t\tsetIdInput('');\n\t\t\t\t\t\t\tsetGranted(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t← All subscribers\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!subscriber ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.subscriptions.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>No subscribers yet.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Subscriber</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Renews</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.subscriptions.map((s) => (\n\t\t\t\t\t\t\t\t\t<tr key={s.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\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\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, padding: 0, ...styles.mono }}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => open(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\t{s.subscriberType}/{s.subscriberId}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{s.plan}</strong> · {s.interval}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.status}\n\t\t\t\t\t\t\t\t\t\t\t{s.cancelAtPeriodEnd ? <span style={styles.badge}>cancels</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.currentPeriodEnd ? (\n\t\t\t\t\t\t\t\t\t\t\t\tnew Date(s.currentPeriodEnd).toLocaleDateString()\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<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{subscriber && !isLoading ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Subscription</h2>\n\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>plan</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<strong>{subscription.plan}</strong> · {subscription.interval}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>status</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.status}\n\t\t\t\t\t\t\t\t\t\t{subscription.cancelAtPeriodEnd ? ' · cancels at period end' : ''}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>period</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodStart\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodStart).toLocaleDateString()\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{subscription.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{subscription.providerSubscriptionId ?? '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No subscription.</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Wallet</h2>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t<strong>{wallet.balance}</strong> {wallet.currency}{' '}\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t(granted {wallet.granted ?? '0'} · purchased {wallet.purchased ?? '0'}) · minor\n\t\t\t\t\t\t\t\t\tunits, precision {wallet.precision}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t\t\t\t...(note ? { description: note } : {}),\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\tsetGranted(`Granted ${amount.trim()} ${wallet.currency}.`);\n\t\t\t\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\t\t\t\tsetNote('');\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\t<input\n\t\t\t\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"amount (minor units)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\t\t\taria-label=\"Amount\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"reason (optional)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 220 }}\n\t\t\t\t\t\t\t\t\taria-label=\"Reason\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!/^\\d+$/.test(amount.trim())}>\n\t\t\t\t\t\t\t\t\tGrant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>Ledger</h2>\n\t\t\t\t\t\t\t{ledger.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>Nothing moved yet.</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Kind</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Amount</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Note</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t{ledger.map((t) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleString()}\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<td style={styles.td}>{t.type}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.amount}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{t.description ?? ''}</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasMoreLedger ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No wallet — billing has no wallet configuration.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuditAdminClient } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IAuditScreenProps {\n\tclient: AuditAdminClient;\n\tpageSize?: number;\n}\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport function AuditScreen({ client, pageSize = 50 }: IAuditScreenProps) {\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '' });\n\tconst [filter, setFilter] = useState<{ workspaceId?: string; type?: string; actorId?: string }>(\n\t\t{},\n\t);\n\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(client, {\n\t\t...filter,\n\t\tlimit: pageSize,\n\t});\n\tconst field = (key: keyof typeof draft, placeholder: string) => (\n\t\t<input\n\t\t\tvalue={draft[key]}\n\t\t\tonChange={(e) => setDraft({ ...draft, [key]: e.target.value })}\n\t\t\tplaceholder={placeholder}\n\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\taria-label={placeholder}\n\t\t/>\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Audit</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetFilter({\n\t\t\t\t\t\t...(draft.workspaceId.trim() ? { workspaceId: draft.workspaceId.trim() } : {}),\n\t\t\t\t\t\t...(draft.type.trim() ? { type: draft.type.trim() } : {}),\n\t\t\t\t\t\t...(draft.actorId.trim() ? { actorId: draft.actorId.trim() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', 'workspace id (all if empty)')}\n\t\t\t\t{field('type', 'event type')}\n\t\t\t\t{field('actorId', 'actor id')}\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tFilter\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{events.length === 0 && !isLoading ? (\n\t\t\t\t<p style={styles.muted}>Nothing recorded for this filter.</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Type</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Workspace</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{events.map((e) => (\n\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t{new Date(e.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.type}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{String(e.payload['workspaceId'] ?? '—')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.actorId ?? '—'}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.requestId ?? ''}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t>\n\t\t\t\t\tLoad more\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","t","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t"]}
1
+ {"version":3,"sources":["../src/screens/AdminShell.tsx","../src/styles.ts","../src/icons.ts","../src/ui.tsx","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/EnvironmentScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/MigrationsScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { type ReactNode, useEffect, useState } from 'react';\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 { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\tauthClient?: AuthAdminClient;\n\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\tbillingClient?: BillingAdminClient;\n\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\tauditClient?: AuditAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n\t// Shown at the top of the sidebar. Defaults to \"Admin\".\n\tappName?: string;\n\t// A badge beside the name — the deployment's environment (\"production\").\n\t// Production is tinted so an operator always knows where their clicks land.\n\tenvLabel?: string;\n\t// Pinned to the bottom of the sidebar: session controls (theme, sign out).\n\tfooter?: ReactNode;\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\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)';\nfunction useNarrow(): boolean {\n\tconst query =\n\t\ttypeof window !== 'undefined' && window.matchMedia ? window.matchMedia(NARROW) : null;\n\tconst [narrow, setNarrow] = useState(() => query?.matches ?? false);\n\tuseEffect(() => {\n\t\tif (!query) return;\n\t\tconst on = (e: MediaQueryListEvent) => setNarrow(e.matches);\n\t\tquery.addEventListener('change', on);\n\t\treturn () => query.removeEventListener('change', on);\n\t}, [query]);\n\treturn narrow;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'environment', label: 'Environment' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tauthClient,\n\tbillingClient,\n\tauditClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n\tappName = 'Admin',\n\tenvLabel,\n\tfooter,\n}: IAdminShellProps) {\n\tconst narrow = useNarrow();\n\tconst [drawer, setDrawer] = useState(false);\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t\tsetDrawer(false);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = {\n\t\tconfig: Boolean(configClient),\n\t\tcourier: Boolean(courierClient),\n\t\tauth: Boolean(authClient),\n\t\tbilling: Boolean(billingClient),\n\t\taudit: Boolean(auditClient),\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'environment':\n\t\t\tbody = <EnvironmentScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'migrations':\n\t\t\tbody = <MigrationsScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\tPass a BillingAdminClient to see the catalog here.\n\t\t\t\t</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'subscriber':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<SubscriberScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\tPass a BillingAdminClient to look up subscribers here.\n\t\t\t\t</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'audit':\n\t\t\tbody = auditClient ? (\n\t\t\t\t<AuditScreen client={auditClient} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\tPass an AuditAdminClient to see the audit trail here.\n\t\t\t\t</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'users':\n\t\t\tbody = authClient ? (\n\t\t\t\t<UsersScreen client={authClient} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\tPass an AuthAdminClient to look up users here.\n\t\t\t\t</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\tPass a ConfigAdminClient to manage config and secrets here.\n\t\t\t\t</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<div style={{ padding: '24px 40px 0' }}>\n\t\t\t\t\t\t<button type=\"button\" style={styles.buttonGhost} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t\t<Icon name=\"back\" size={14} />\n\t\t\t\t\t\t\tConfig &amp; secrets\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t\tonCreateConfig={() => setEditing({ kind: 'config', key: '' })}\n\t\t\t\t\tonCreateSecret={() => setEditing({ kind: 'secret', key: '' })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\tPass a CourierAdminClient to manage templates here.\n\t\t\t\t</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<div style={{ padding: '24px 40px 0' }}>\n\t\t\t\t\t\t<button type=\"button\" style={styles.buttonGhost} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t\t<Icon name=\"back\" size={14} />\n\t\t\t\t\t\t\tTemplates\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\tconst production = envLabel ? /^prod/i.test(envLabel) : false;\n\tconst brand = (\n\t\t<div style={styles.navBrand}>\n\t\t\t<div style={styles.navMark}>\n\t\t\t\t<Icon name=\"mark\" size={15} />\n\t\t\t</div>\n\t\t\t<div style={{ minWidth: 0, flex: 1 }}>\n\t\t\t\t<div style={styles.navBrandTitle}>{appName}</div>\n\t\t\t\t{envLabel ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...styles.badge,\n\t\t\t\t\t\t\tmarginTop: 3,\n\t\t\t\t\t\t\tpadding: '0 7px',\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t...(production\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tcolor: 'var(--fonderie-danger,#e00)',\n\t\t\t\t\t\t\t\t\t\tborderColor: 'color-mix(in srgb, var(--fonderie-danger,#e00) 35%, transparent)',\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\t\t{envLabel}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{narrow ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.buttonGhost}\n\t\t\t\t\taria-label=\"Close menu\"\n\t\t\t\t\tonClick={() => setDrawer(false)}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close\" />\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n\n\tconst nav = (\n\t\t<nav\n\t\t\tstyle={{\n\t\t\t\t...styles.nav,\n\t\t\t\t...(narrow\n\t\t\t\t\t? { width: 280, maxWidth: '85vw', boxShadow: '0 10px 40px rgba(0,0,0,.25)' }\n\t\t\t\t\t: {}),\n\t\t\t}}\n\t\t\taria-label=\"Admin\"\n\t\t>\n\t\t\t{brand}\n\t\t\t<div style={styles.navScroll}>\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => {\n\t\t\t\t\t\t\t\tconst active = current === i.page;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"fonderie-admin-nav-item\"\n\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\taria-current={active ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\t\tgo(i.page);\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<Icon name={ICON[i.page]} style={active ? styles.navIconActive : undefined} />\n\t\t\t\t\t\t\t\t\t\t{i.label}\n\t\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})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t{footer ? <div style={styles.navFooter}>{footer}</div> : null}\n\t\t</nav>\n\t);\n\n\tconst title = NAV.flatMap((g) => g.items).find((i) => i.page === current)?.label ?? '';\n\n\treturn (\n\t\t<div style={{ ...styles.shell, ...(narrow ? { flexDirection: 'column' } : {}) }}>\n\t\t\t{narrow ? (\n\t\t\t\t<>\n\t\t\t\t\t<div style={styles.topbar}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.buttonGhost}\n\t\t\t\t\t\t\taria-label=\"Open menu\"\n\t\t\t\t\t\t\taria-expanded={drawer}\n\t\t\t\t\t\t\tonClick={() => setDrawer(true)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"menu\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span style={{ fontWeight: 600, fontSize: 14 }}>{title}</span>\n\t\t\t\t\t\t{envLabel ? (\n\t\t\t\t\t\t\t<span style={{ ...styles.badge, marginLeft: 'auto' }}>{envLabel}</span>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t\t{drawer ? (\n\t\t\t\t\t\t<div style={styles.drawer}>\n\t\t\t\t\t\t\t{nav}\n\t\t\t\t\t\t\t<div style={styles.scrim} onClick={() => setDrawer(false)} aria-hidden=\"true\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tnav\n\t\t\t)}\n\t\t\t<main className=\"fonderie-admin-main\" style={styles.main}>\n\t\t\t\t{body}\n\t\t\t</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\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\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// 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","// 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 type { CSSProperties, ReactNode } from 'react';\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 screen.\n\nexport function Icon({\n\tname,\n\tsize = 16,\n\tstyle,\n}: {\n\tname: IconName;\n\tsize?: number;\n\tstyle?: CSSProperties | undefined;\n}) {\n\treturn (\n\t\t<svg\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\tstrokeWidth={2}\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{ flexShrink: 0, ...style }}\n\t\t>\n\t\t\t{ICONS[name].map((d) => (\n\t\t\t\t<path key={d} d={d} />\n\t\t\t))}\n\t\t</svg>\n\t);\n}\n\n/** Title, one line saying what the page answers, and its actions on the right. */\nexport function PageHeader({\n\ttitle,\n\tlead,\n\tactions,\n}: {\n\ttitle: ReactNode;\n\tlead?: ReactNode | undefined;\n\tactions?: ReactNode | undefined;\n}) {\n\treturn (\n\t\t<div style={styles.header}>\n\t\t\t<div style={{ minWidth: 0 }}>\n\t\t\t\t<h1 style={styles.title}>{title}</h1>\n\t\t\t\t{lead ? <p style={styles.lead}>{lead}</p> : null}\n\t\t\t</div>\n\t\t\t{actions ? <div style={styles.actions}>{actions}</div> : null}\n\t\t</div>\n\t);\n}\n\n/** A status: coloured text on a tint of the same colour, with a dot. */\nexport function Pill({\n\ttone,\n\tchildren,\n\tdot = true,\n}: {\n\ttone: Tone;\n\tchildren: ReactNode;\n\tdot?: boolean;\n}) {\n\tconst color = toneColor[tone];\n\treturn (\n\t\t<span style={{ ...styles.pill, color, background: tint(color, tone === 'neutral' ? 10 : 13) }}>\n\t\t\t{dot ? <span style={styles.dot} /> : null}\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n\nexport function Stat({\n\tlabel,\n\tvalue,\n\thint,\n\ttone,\n}: {\n\tlabel: ReactNode;\n\tvalue: ReactNode;\n\thint?: ReactNode | undefined;\n\ttone?: Tone | undefined;\n}) {\n\treturn (\n\t\t<div style={styles.card}>\n\t\t\t<div style={styles.statLabel}>{label}</div>\n\t\t\t<div style={{ ...styles.statValue, ...(tone ? { color: toneColor[tone] } : {}) }}>\n\t\t\t\t{value}\n\t\t\t</div>\n\t\t\t{hint ? <div style={styles.statHint}>{hint}</div> : null}\n\t\t</div>\n\t);\n}\n\nexport function Empty({\n\ticon = 'check',\n\ttitle,\n\tchildren,\n}: {\n\ticon?: IconName;\n\ttitle: ReactNode;\n\tchildren?: ReactNode;\n}) {\n\treturn (\n\t\t<div style={styles.empty}>\n\t\t\t<Icon name={icon} size={22} />\n\t\t\t<div style={styles.emptyTitle}>{title}</div>\n\t\t\t{children ? <div>{children}</div> : null}\n\t\t</div>\n\t);\n}\n\nexport function RefreshButton({\n\tonClick,\n\tbusy,\n\tlabel = 'Refresh',\n}: {\n\tonClick: () => void;\n\tbusy?: boolean;\n\tlabel?: string;\n}) {\n\treturn (\n\t\t<button type=\"button\" style={styles.button} onClick={onClick} disabled={busy}>\n\t\t\t<Icon name=\"refresh\" size={14} />\n\t\t\t{busy ? 'Working…' : label}\n\t\t</button>\n\t);\n}\n\n/** Colour for an HTTP method chip. */\nexport function MethodChip({ method }: { method: string }) {\n\tconst tone: Tone =\n\t\tmethod === 'GET' ? 'ok' : method === 'DELETE' ? 'bad' : method === 'POST' ? 'info' : 'warn';\n\tconst color = toneColor[tone];\n\treturn (\n\t\t<span\n\t\t\tstyle={{\n\t\t\t\t...styles.mono,\n\t\t\t\tfontSize: 11,\n\t\t\t\tfontWeight: 700,\n\t\t\t\tcolor,\n\t\t\t\tbackground: tint(color, 12),\n\t\t\t\tborderRadius: 4,\n\t\t\t\tpadding: '2px 6px',\n\t\t\t\tdisplay: 'inline-block',\n\t\t\t\tminWidth: 44,\n\t\t\t\ttextAlign: 'center',\n\t\t\t}}\n\t\t>\n\t\t\t{method}\n\t\t</span>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { Empty, MethodChip, PageHeader, Pill, RefreshButton } from '../ui';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Admin log\"\n\t\t\t\tlead=\"Every request made through this surface, newest first — refused ones included.\"\n\t\t\t\tactions={<RefreshButton onClick={() => void refresh()} busy={isLoading} />}\n\t\t\t/>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : entries.length === 0 && !isLoading ? (\n\t\t\t\t<Empty icon=\"log\" title=\"No requests yet\" />\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted, whiteSpace: 'nowrap' }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<MethodChip method={e.method} />{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={{ ...styles.mono, wordBreak: 'break-all' }}>{e.path}</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, whiteSpace: 'nowrap' }}>\n\t\t\t\t\t\t\t\t\t\t<Pill tone={e.status >= 500 ? 'bad' : e.status >= 400 ? 'warn' : 'ok'}>\n\t\t\t\t\t\t\t\t\t\t\t{e.status}\n\t\t\t\t\t\t\t\t\t\t</Pill>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention, useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill, RefreshButton, Stat } from '../ui';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\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 function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\tconst { manifest } = useManifest(client);\n\tconst errors = attention?.items.filter((i) => i.severity === 'error') ?? [];\n\tconst advice = attention?.items.filter((i) => i.severity !== 'error') ?? [];\n\tconst ready = manifest?.modules.filter((m) => m.readiness.ok).length ?? 0;\n\tconst total = manifest?.modules.length ?? 0;\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Attention\"\n\t\t\t\tlead={\n\t\t\t\t\tattention\n\t\t\t\t\t\t? `What needs you on this deployment · checked ${new Date(attention.generatedAt).toLocaleTimeString()}`\n\t\t\t\t\t\t: 'What needs you on this deployment'\n\t\t\t\t}\n\t\t\t\tactions={<RefreshButton onClick={() => void refresh()} busy={isLoading} />}\n\t\t\t/>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t<div style={styles.grid}>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel=\"Needs action\"\n\t\t\t\t\tvalue={attention ? errors.length : '—'}\n\t\t\t\t\ttone={errors.length ? 'bad' : attention ? 'ok' : undefined}\n\t\t\t\t\thint=\"errors to fix\"\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel=\"Advice\"\n\t\t\t\t\tvalue={attention ? advice.length : '—'}\n\t\t\t\t\ttone={advice.length ? 'warn' : undefined}\n\t\t\t\t\thint=\"worth a look\"\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel=\"Modules ready\"\n\t\t\t\t\tvalue={manifest ? `${ready}/${total}` : '—'}\n\t\t\t\t\ttone={manifest && ready < total ? 'warn' : manifest ? 'ok' : undefined}\n\t\t\t\t\thint={manifest ? `admin ${manifest.admin.version}` : undefined}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel=\"Routes\"\n\t\t\t\t\tvalue={manifest ? manifest.routes.length : '—'}\n\t\t\t\t\thint={manifest ? manifest.env : undefined}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : attention && attention.items.length === 0 ? (\n\t\t\t\t<Empty title=\"Nothing needs you\">\n\t\t\t\t\tEvery check passes. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</Empty>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{[...errors, ...advice].map((item) => (\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tkey={`${item.source}:${item.message}`}\n\t\t\t\t\t\t\tstyle={{ ...styles.row, display: 'flex', gap: 12, alignItems: 'flex-start' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tname=\"alert\"\n\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tmarginTop: 3,\n\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\titem.severity === 'error'\n\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: 'var(--fonderie-warning,#f5a623)',\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<div style={{ minWidth: 0, flex: 1 }}>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t\t\t\t\tmarginBottom: 2,\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\t<Pill tone={item.severity === 'error' ? 'bad' : 'warn'}>\n\t\t\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div style={{ lineHeight: 1.55 }}>{item.message}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminEnvironment } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { PageHeader, Pill } from '../ui';\n\nexport interface IEnvironmentScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function EnvironmentScreen({ client }: IEnvironmentScreenProps) {\n\tconst { report, isLoading, error } = useAdminEnvironment(client);\n\tconst missing = report?.env.filter((e) => !e.set).length ?? 0;\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Environment\"\n\t\t\t\tlead=\"Whether each module is configured and each variable the app reads is set. Values are never shown.\"\n\t\t\t\tactions={\n\t\t\t\t\treport && report.env.length > 0 ? (\n\t\t\t\t\t\t<Pill tone={missing ? 'bad' : 'ok'}>{missing ? `${missing} missing` : 'all set'}</Pill>\n\t\t\t\t\t) : null\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={{ ...styles.subtitle, marginTop: 0 }}>Variables</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t...styles.grid,\n\t\t\t\t\t\t\t\tgridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))',\n\t\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={e.name}\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\tpadding: '10px 12px',\n\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\tgap: 8,\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\t<span style={{ ...styles.mono, wordBreak: 'break-all' }}>{e.name}</span>\n\t\t\t\t\t\t\t\t\t<Pill tone={e.set ? 'ok' : 'bad'}>{e.set ? 'set' : 'missing'}</Pill>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Module readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\tgap: 12,\n\t\t\t\t\t\t\t\t\t\talignItems: 'center',\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\t<span style={{ ...styles.mono, fontWeight: 600 }}>{m.name}</span>\n\t\t\t\t\t\t\t\t\t<Pill\n\t\t\t\t\t\t\t\t\t\ttone={\n\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? 'ok'\n\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? 'bad'\n\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}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{m.problems.length === 0\n\t\t\t\t\t\t\t\t\t\t\t? 'ready'\n\t\t\t\t\t\t\t\t\t\t\t: `${m.problems.length} problem${m.problems.length === 1 ? '' : 's'}`}\n\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{m.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tmarginTop: 6,\n\t\t\t\t\t\t\t\t\t\t\tfontSize: 13,\n\t\t\t\t\t\t\t\t\t\t\tcolor:\n\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? 'var(--fonderie-danger,#e00)'\n\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}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { PageHeader, Pill, RefreshButton } from '../ui';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Doctor\"\n\t\t\t\tlead=\"Every reconciliation check across the installed modules, run on demand.\"\n\t\t\t\tactions={\n\t\t\t\t\t<>\n\t\t\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t\t\t<Pill tone={report.ok ? 'ok' : 'bad'}>\n\t\t\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<RefreshButton onClick={() => void refresh()} busy={isLoading} label=\"Run again\" />\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={{ ...styles.th, width: 110 }}>Result</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Check</th>\n\t\t\t\t\t\t\t<th style={{ ...styles.th, textAlign: 'right', width: 90 }}>Time</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t\t<tr key={c.name}>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<Pill\n\t\t\t\t\t\t\t\t\t\ttone={\n\t\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\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{c.skipped\n\t\t\t\t\t\t\t\t\t\t\t? '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? 'advice'\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: 'failed'}\n\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<span style={{ ...styles.mono, fontWeight: 600 }}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{c.module}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{c.skipped ? (\n\t\t\t\t\t\t\t\t\t\t<div style={{ ...styles.muted, marginTop: 4 }}>{c.skipped}</div>\n\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\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={f}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: 4,\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: 13,\n\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\tcolor: c.ok\n\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: 'var(--fonderie-danger,#e00)',\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\t{f}\n\t\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</td>\n\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t...styles.td,\n\t\t\t\t\t\t\t\t\t\t...styles.muted,\n\t\t\t\t\t\t\t\t\t\ttextAlign: 'right',\n\t\t\t\t\t\t\t\t\t\twhiteSpace: '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\t\t{c.durationMs} ms\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { PageHeader, Pill } from '../ui';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Modules\"\n\t\t\t\tlead={\n\t\t\t\t\tmanifest\n\t\t\t\t\t\t? `${manifest.env} · admin ${manifest.admin.version} · admin log ${manifest.admin.log ? 'on' : 'off'} · ${manifest.routes.length} routes`\n\t\t\t\t\t\t: 'Every installed module, its version and whether it is ready.'\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Admin</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono, fontWeight: 600 }}>{m.name}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<Pill tone={m.readiness.ok ? 'ok' : 'bad'}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? 'ready' : 'error'}\n\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: 6,\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: 13,\n\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\tp.severity === 'error'\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\t\t: 'var(--fonderie-text-muted,#5c5c5c)',\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\t{p.message}\n\t\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</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{m.describesAdmin ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.badge}>describes admin</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { MethodChip, PageHeader, Pill } from '../ui';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\n// Every exposed route and what guards it. A hundred rows is normal, so the\n// page filters as you type.\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\tconst [q, setQ] = useState('');\n\tconst needle = q.trim().toLowerCase();\n\tconst routes = (report?.routes ?? []).filter(\n\t\t(r) =>\n\t\t\t!needle ||\n\t\t\t`${r.method} ${r.path} ${r.module ?? 'application'} ${r.guard}`\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(needle),\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Routes\"\n\t\t\t\tlead={\n\t\t\t\t\treport\n\t\t\t\t\t\t? `${report.routes.length} routes exposed by this deployment, with the guard in front of each.`\n\t\t\t\t\t\t: 'Every exposed route, with its guard.'\n\t\t\t\t}\n\t\t\t\tactions={\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tvalue={q}\n\t\t\t\t\t\tonChange={(e) => setQ(e.target.value)}\n\t\t\t\t\t\tplaceholder=\"Filter by path, method, module…\"\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 280 }}\n\t\t\t\t\t\taria-label=\"Filter routes\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={{ ...styles.th, width: 80 }}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<MethodChip method={r.method} />\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono, wordBreak: 'break-all' }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<Pill\n\t\t\t\t\t\t\t\t\t\ttone={r.guard === 'admin' ? 'ok' : r.guard === 'probe' ? 'neutral' : 'info'}\n\t\t\t\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{r.guard}\n\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{routes.length === 0 ? (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }} colSpan={4}>\n\t\t\t\t\t\t\t\t\tNo route matches “{q}”.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { Empty, PageHeader, Pill, RefreshButton } from '../ui';\n\nexport interface IMigrationsScreenProps {\n\tclient: AdminClient;\n}\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport function MigrationsScreen({ client }: IMigrationsScreenProps) {\n\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(client);\n\n\tconst behind = report?.modules.filter((m) => m.pending.length > 0) ?? [];\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Migrations\"\n\t\t\t\tlead=\"Schema changes each module ships, and whether this database has them.\"\n\t\t\t\tactions={<RefreshButton onClick={() => void refresh()} busy={isLoading} />}\n\t\t\t/>\n\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 403\n\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t{report && !report.everApplied ? (\n\t\t\t\t<p style={styles.notice}>\n\t\t\t\t\tThis database has never been migrated — treating it as a first install, so nothing is held\n\t\t\t\t\tback.\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t{report && behind.length === 0 ? (\n\t\t\t\t<Empty icon=\"migrations\" title=\"Every module is up to date\">\n\t\t\t\t\tNo pending migrations.\n\t\t\t\t</Empty>\n\t\t\t) : null}\n\n\t\t\t{behind.map((m) => {\n\t\t\t\tconst blocked = why(m, report?.everApplied ?? false);\n\t\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\t\treturn (\n\t\t\t\t\t<section key={m.name} style={{ ...styles.card, marginBottom: 16 }}>\n\t\t\t\t\t\t<h2 style={{ ...styles.subtitle, marginTop: 0 }}>\n\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>\n\t\t\t\t\t\t\t<Pill tone=\"warn\">{m.pending.length} pending</Pill>\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t<ul style={{ margin: '0 0 12px', paddingLeft: 18, lineHeight: 1.9 }}>\n\t\t\t\t\t\t\t{m.pending.map((p) => (\n\t\t\t\t\t\t\t\t<li key={p.file}>\n\t\t\t\t\t\t\t\t\t<code style={styles.code}>{p.file}</code>{' '}\n\t\t\t\t\t\t\t\t\t{p.impact === 'destructive' ? (\n\t\t\t\t\t\t\t\t\t\t<Pill tone=\"bad\">destructive</Pill>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Pill tone=\"neutral\">additive</Pill>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.destructive.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t\t{p.destructive.map((s) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={s}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<code>{s.slice(0, 120)}</code>\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t{blocked ? (\n\t\t\t\t\t\t\t<p style={{ ...styles.notice, marginBottom: 0 }}>{blocked}</p>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\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 || !m.appliable}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The hook already put any failure in `error` and re-read\n\t\t\t\t\t\t\t\t\t\t// the real state; nothing useful is left to do here.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tApply {m.pending.length} migration{m.pending.length === 1 ? '' : 's'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\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 function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(client);\n\tconst [name, setName] = useState('');\n\tconst [scopes, setScopes] = useState<AdminScope[]>(['read']);\n\tconst [days, setDays] = useState('');\n\tconst [minted, setMinted] = useState<{ name: string; token: string } | null>(null);\n\n\tconst toggle = (s: AdminScope) =>\n\t\tsetScopes((prev) => (prev.includes(s) ? prev.filter((x) => x !== s) : [...prev, s]));\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Access\"\n\t\t\t\tlead=\"Who can open this surface: the root token's strength, scoped tokens you have issued, and any legacy per-module tokens.\"\n\t\t\t/>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 401\n\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={{ ...styles.subtitle, marginTop: 0 }}>Root token</h2>\n\t\t\t{report ? (\n\t\t\t\t<div style={{ ...styles.card, display: 'flex', gap: 12, alignItems: 'flex-start' }}>\n\t\t\t\t\t<Icon name=\"lock\" size={18} style={{ marginTop: 2 }} />\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Pill tone={report.admin.ok ? 'ok' : 'bad'}>{report.admin.ok ? 'strong' : 'weak'}</Pill>\n\t\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\tstyle={{ marginTop: 6, color: 'var(--fonderie-danger,#e00)', fontSize: 13 }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Issued tokens</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\tIssuing is off — give AdminModule a store and run its migrations.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{minted ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t...styles.notice,\n\t\t\t\t\t\t\t\tbackground: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\t\t\t\t\tborderColor: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<strong>Copy this now — it is never shown again.</strong> ({minted.name})\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...styles.code,\n\t\t\t\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\t\t\t\tmarginTop: 8,\n\t\t\t\t\t\t\t\t\tpadding: '8px 10px',\n\t\t\t\t\t\t\t\t\twordBreak: 'break-all',\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\t{minted.token}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<form\n\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = Number(days);\n\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\tname: name.trim(),\n\t\t\t\t\t\t\t\tscopes,\n\t\t\t\t\t\t\t\t...(days && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\tsetMinted({ name: t.name, token: t.token });\n\t\t\t\t\t\t\t\t\tsetName('');\n\t\t\t\t\t\t\t\t\tsetDays('');\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\t<input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"name\"\n\t\t\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\t\t\taria-label=\"Name\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ALL.map((s) => (\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tkey={s}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...styles.badge,\n\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\tboxSizing: 'border-box',\n\t\t\t\t\t\t\t\t\tpadding: '0 10px',\n\t\t\t\t\t\t\t\t\tfontSize: 13,\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\t<input type=\"checkbox\" checked={scopes.includes(s)} onChange={() => toggle(s)} />{' '}\n\t\t\t\t\t\t\t\t{s}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={days}\n\t\t\t\t\t\t\tonChange={(e) => setDays(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"days (optional)\"\n\t\t\t\t\t\t\tstyle={{ ...styles.input, width: 140 }}\n\t\t\t\t\t\t\taria-label=\"Days\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tstyle={styles.buttonPrimary}\n\t\t\t\t\t\t\tdisabled={!name.trim() || scopes.length === 0 || isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"plus\" size={14} />\n\t\t\t\t\t\t\tIssue token\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t\t{report?.issued && report.issued.length > 0 ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Scopes</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Expires</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Last used</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{report.issued.map((t) => (\n\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.name}\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? (\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{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone=\"neutral\">revoked</Pill>\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.scopes.join(', ')}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleDateString()} · {t.createdBy}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? null : (\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\ttype=\"button\"\n\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\tonClick={() => {\n\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\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\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\tvoid revoke(t.id).catch(() => {});\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\tRevoke\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)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Empty icon=\"tokens\" title=\"No scoped tokens yet\">\n\t\t\t\t\t\t\tIssue a read-only token for a dashboard or a teammate instead of sharing the root.\n\t\t\t\t\t\t</Empty>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.legacy.map((l) => (\n\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { type AuthAdminClient, describeLocation } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n\tpageSize?: number;\n}\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 function UsersScreen({ client, pageSize = 50 }: IUsersScreenProps) {\n\tconst [input, setInput] = useState('');\n\tconst [selected, setSelected] = useState<{ id?: string; email?: string } | null>(null);\n\n\tconst list = useAdminUsers(client, { limit: pageSize });\n\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\tclient,\n\t\tselected ?? {},\n\t);\n\tconst userId = user?.id ?? null;\n\tconst sessions = useAdminUserSessions(client, userId);\n\tconst history = useAdminLoginHistory(client, userId, { limit: 20 });\n\n\tconst yesNo = (v: boolean) => (v ? <Pill tone=\"ok\">yes</Pill> : <Pill tone=\"neutral\">no</Pill>);\n\n\tconst clear = () => {\n\t\tsetSelected(null);\n\t\tsetInput('');\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Users\"\n\t\t\t\tlead=\"Everyone signed up. Open an account for its sessions, sign-ins and the suspend and sign-out controls.\"\n\t\t\t/>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst email = input.trim();\n\t\t\t\t\tsetSelected(email ? { email } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"email address\"\n\t\t\t\t\tstyle={{ ...styles.input, minWidth: 280 }}\n\t\t\t\t\taria-label=\"Email\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.buttonPrimary} disabled={isLoading}>\n\t\t\t\t\t<Icon name=\"search\" size={14} />\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{selected ? (\n\t\t\t\t\t<button type=\"button\" style={styles.buttonGhost} onClick={clear}>\n\t\t\t\t\t\t<Icon name=\"back\" size={14} />\n\t\t\t\t\t\tAll users\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? 'No user with that email.' : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!selected ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.users.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<Empty icon=\"users\" title=\"No users yet\">\n\t\t\t\t\t\t\tSign-ups appear here as they happen.\n\t\t\t\t\t\t</Empty>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Email</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.users.map((u) => (\n\t\t\t\t\t\t\t\t\t<tr key={u.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\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\ttype=\"button\"\n\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\tonClick={() => setSelected({ id: u.id })}\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{u.email}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\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<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(u.createdAt).toLocaleDateString()}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{u.suspended ? <Pill tone=\"warn\">suspended</Pill> : null}\n\t\t\t\t\t\t\t\t\t\t\t{u.deletedAt ? <Pill tone=\"neutral\">deleted</Pill> : null}\n\t\t\t\t\t\t\t\t\t\t\t{!u.suspended && !u.deletedAt ? <Pill tone=\"ok\">active</Pill> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{user ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t{user.firstName || user.lastName\n\t\t\t\t\t\t\t? `${user.firstName} ${user.lastName}`.trim()\n\t\t\t\t\t\t\t: user.email}{' '}\n\t\t\t\t\t\t{user.suspended ? <Pill tone=\"warn\">suspended</Pill> : null}\n\t\t\t\t\t\t{user.deletedAt ? <Pill tone=\"neutral\">deleted</Pill> : null}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>id</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{user.id}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>email</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.email} · verified {yesNo(user.isEmailVerified)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>MFA</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{yesNo(user.mfaEnabled)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.provider || 'password'}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ' · no password set'}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>last login</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.lastLogin ? (\n\t\t\t\t\t\t\t\t\t\tnew Date(user.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>never</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>created</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(user.createdAt).toLocaleString()}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t{user.suspended ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tUnsuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.buttonDanger}\n\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tonClick={() => void revokeSessions().then(() => sessions.refresh())}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign out everywhere\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Live sessions</h2>\n\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\t\t\t\t\t\t<li key={s.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t{describeLocation(s.location) ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{describeLocation(s.location)} </span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{s.userAgent ?? ''}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>since {new Date(s.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Recent sign-ins</h2>\n\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>None recorded.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<Pill tone={e.outcome === 'success' ? 'ok' : 'bad'}>{e.outcome}</Pill>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t{describeLocation(e.location) ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{describeLocation(e.location)}</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{e.location?.proxy || e.location?.hosting ? (\n\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<Pill tone=\"warn\">{e.location.proxy ? 'proxy/VPN' : 'hosting'}</Pill>\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\t\t<span style={styles.muted}>{new Date(e.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{history.hasMore && !history.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void history.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\nimport { Empty, PageHeader, RefreshButton } from '../ui';\n\nexport interface ICatalogScreenProps {\n\tclient: BillingAdminClient;\n}\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 function CatalogScreen({ client }: ICatalogScreenProps) {\n\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(client);\n\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Catalog\"\n\t\t\t\tlead=\"What you sell: plans as configured in code, and as stored in the database, side by side.\"\n\t\t\t\tactions={<RefreshButton onClick={() => void refresh()} busy={isLoading} />}\n\t\t\t/>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{isLoading && !catalog ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{catalog ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={{ ...styles.subtitle, marginTop: 0 }}>Configured (code)</h2>\n\t\t\t\t\t<pre\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\toverflowX: 'auto',\n\t\t\t\t\t\t\tmaxHeight: 360,\n\t\t\t\t\t\t\tlineHeight: 1.6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{JSON.stringify(catalog.configured, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t\t<h2 style={styles.subtitle}>Stored (database)</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<Empty icon=\"catalog\" title=\"No stored plans\">\n\t\t\t\t\t\t\tPlans are configured in code; nothing has been written to the database.\n\t\t\t\t\t\t</Empty>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Tier</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Seats</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Monthly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Yearly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Trial</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{catalog.stored.map((p) => (\n\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{p.name}</strong>\n\t\t\t\t\t\t\t\t\t\t\t{p.description ? <div style={styles.muted}>{p.description}</div> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.tier}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.seats ?? '∞'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{money(p.pricing?.monthly)} {p.pricing?.currency ?? ''}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{money(p.pricing?.yearly)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.trialDays ? `${p.trialDays} d` : '—'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\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\ttype=\"button\"\n\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\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.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>\n\t\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n\tpageSize?: number;\n}\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport function SubscriberScreen({ client, pageSize = 50 }: ISubscriberScreenProps) {\n\tconst [type, setType] = useState<SubscriberType>('user');\n\tconst [idInput, setIdInput] = useState('');\n\tconst [subscriber, setSubscriber] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst list = useAdminSubscribers(client, { limit: pageSize });\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20 });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\tconst open = (t: SubscriberType, id: string) => {\n\t\tsetGranted(null);\n\t\tsetType(t);\n\t\tsetIdInput(id);\n\t\tsetSubscriber({ type: t, id });\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Subscribers\"\n\t\t\t\tlead=\"Who is subscribed. Open one for their plan, wallet and ledger, and to grant credit.\"\n\t\t\t/>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetGranted(null);\n\t\t\t\t\tsetSubscriber(idInput.trim() ? { type, id: idInput.trim() } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<select\n\t\t\t\t\tvalue={type}\n\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label=\"Type\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"user\">user</option>\n\t\t\t\t\t<option value=\"workspace\">workspace</option>\n\t\t\t\t</select>\n\t\t\t\t<input\n\t\t\t\t\tvalue={idInput}\n\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"subscriber id\"\n\t\t\t\t\tstyle={{ ...styles.input, minWidth: 280 }}\n\t\t\t\t\taria-label=\"Subscriber id\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.buttonPrimary} disabled={isLoading}>\n\t\t\t\t\t<Icon name=\"search\" size={14} />\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{subscriber ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetSubscriber(null);\n\t\t\t\t\t\t\tsetIdInput('');\n\t\t\t\t\t\t\tsetGranted(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"back\" size={14} />\n\t\t\t\t\t\tAll subscribers\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!subscriber ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.subscriptions.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<Empty icon=\"subscriber\" title=\"No subscribers yet\">\n\t\t\t\t\t\t\tSubscriptions appear here once someone checks out.\n\t\t\t\t\t\t</Empty>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Subscriber</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Renews</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.subscriptions.map((s) => (\n\t\t\t\t\t\t\t\t\t<tr key={s.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\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\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={() => open(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\t{s.subscriberType}/{s.subscriberId}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{s.plan}</strong> · {s.interval}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<Pill\n\t\t\t\t\t\t\t\t\t\t\t\ttone={\n\t\t\t\t\t\t\t\t\t\t\t\t\ts.status === 'active'\n\t\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\t: s.status === 'trialing'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'info'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: s.status === 'past_due'\n\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: 'neutral'\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{s.status}\n\t\t\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t\t\t\t{s.cancelAtPeriodEnd ? (\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{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone=\"warn\" dot={false}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcancels\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.currentPeriodEnd ? (\n\t\t\t\t\t\t\t\t\t\t\t\tnew Date(s.currentPeriodEnd).toLocaleDateString()\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<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{subscriber && !isLoading ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Subscription</h2>\n\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>plan</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<strong>{subscription.plan}</strong> · {subscription.interval}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>status</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.status}\n\t\t\t\t\t\t\t\t\t\t{subscription.cancelAtPeriodEnd ? ' · cancels at period end' : ''}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>period</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodStart\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodStart).toLocaleDateString()\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{subscription.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{subscription.providerSubscriptionId ?? '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No subscription.</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Wallet</h2>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p\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\talignItems: 'baseline',\n\t\t\t\t\t\t\t\t\tgap: 8,\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\t<strong\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tfontSize: 22,\n\t\t\t\t\t\t\t\t\t\tletterSpacing: 'var(--fonderie-tracking-display,-0.05em)',\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\t{wallet.balance}\n\t\t\t\t\t\t\t\t</strong>{' '}\n\t\t\t\t\t\t\t\t{wallet.currency}{' '}\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t(granted {wallet.granted ?? '0'} · purchased {wallet.purchased ?? '0'}) · minor\n\t\t\t\t\t\t\t\t\tunits, precision {wallet.precision}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t\t\t\t...(note ? { description: note } : {}),\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\tsetGranted(`Granted ${amount.trim()} ${wallet.currency}.`);\n\t\t\t\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\t\t\t\tsetNote('');\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\t<input\n\t\t\t\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"amount (minor units)\"\n\t\t\t\t\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\t\t\t\t\taria-label=\"Amount\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"reason (optional)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.input, minWidth: 220 }}\n\t\t\t\t\t\t\t\t\taria-label=\"Reason\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\t\tstyle={styles.buttonPrimary}\n\t\t\t\t\t\t\t\t\tdisabled={!/^\\d+$/.test(amount.trim())}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"plus\" size={14} />\n\t\t\t\t\t\t\t\t\tGrant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>Ledger</h2>\n\t\t\t\t\t\t\t{ledger.length === 0 ? (\n\t\t\t\t\t\t\t\t<Empty icon=\"subscriber\" title=\"Nothing moved yet\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Kind</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Amount</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Note</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t{ledger.map((t) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleString()}\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<td style={styles.td}>{t.type}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.amount}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{t.description ?? ''}</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasMoreLedger ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No wallet — billing has no wallet configuration.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuditAdminClient } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader } from '../ui';\n\nexport interface IAuditScreenProps {\n\tclient: AuditAdminClient;\n\tpageSize?: number;\n}\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport function AuditScreen({ client, pageSize = 50 }: IAuditScreenProps) {\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '' });\n\tconst [filter, setFilter] = useState<{ workspaceId?: string; type?: string; actorId?: string }>(\n\t\t{},\n\t);\n\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(client, {\n\t\t...filter,\n\t\tlimit: pageSize,\n\t});\n\tconst field = (key: keyof typeof draft, placeholder: string) => (\n\t\t<input\n\t\t\tvalue={draft[key]}\n\t\t\tonChange={(e) => setDraft({ ...draft, [key]: e.target.value })}\n\t\t\tplaceholder={placeholder}\n\t\t\tstyle={styles.input}\n\t\t\taria-label={placeholder}\n\t\t/>\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle=\"Audit\"\n\t\t\t\tlead=\"What happened, across every workspace unless you name one. The chain's integrity verdict is on the Doctor page.\"\n\t\t\t/>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetFilter({\n\t\t\t\t\t\t...(draft.workspaceId.trim() ? { workspaceId: draft.workspaceId.trim() } : {}),\n\t\t\t\t\t\t...(draft.type.trim() ? { type: draft.type.trim() } : {}),\n\t\t\t\t\t\t...(draft.actorId.trim() ? { actorId: draft.actorId.trim() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', 'workspace id (all if empty)')}\n\t\t\t\t{field('type', 'event type')}\n\t\t\t\t{field('actorId', 'actor id')}\n\t\t\t\t<button type=\"submit\" style={styles.buttonPrimary} disabled={isLoading}>\n\t\t\t\t\t<Icon name=\"search\" size={14} />\n\t\t\t\t\tFilter\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{events.length === 0 && !isLoading ? (\n\t\t\t\t<Empty icon=\"audit\" title=\"Nothing recorded for this filter\" />\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Type</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Workspace</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{events.map((e) => (\n\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t{new Date(e.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.type}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{String(e.payload['workspaceId'] ?? '—')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.actorId ?? '—'}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.requestId ?? ''}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t>\n\t\t\t\t\tLoad more\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useManifest","jsx","jsxs","useManifest","jsx","jsxs","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t"]}