@fonderie/react-admin-screens 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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/OperatorsScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/billing.ts","../src/screens/SubscriberBilling.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminMessageKey,\n\ttype AuditAdminClient,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\ttype ConfigAdminClient,\n\ttype CourierAdminClient,\n\tcreateAdminT,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport {\n\tTemplateCreateScreen,\n\tTemplateEditorScreen,\n\tTemplateListScreen,\n} 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 { OperatorsScreen } from './OperatorsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'operators'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\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\t// The deployment has operator accounts (@fonderie/admin with a store):\n\t// shows the Operators page.\n\toperators?: boolean;\n\t// The signed-in operator's email, when a person (not a token) is signed in.\n\tcurrentOperator?: string;\n\t// Where the app serves GET /config/public — marks public keys on the\n\t// Config page and previews exactly what frontends receive.\n\tpublicConfigUrl?: string;\n\t// The console's own language (the operator's choice, independent of the\n\t// locales the app serves). Default English.\n\tlocale?: AdminLocale | undefined;\n}\n\nconst ICON: Record<AdminPage, IconName> = {\n\tattention: 'attention',\n\tmodules: 'modules',\n\tenvironment: 'environment',\n\tdoctor: 'doctor',\n\troutes: 'routes',\n\tusers: 'users',\n\tcatalog: 'catalog',\n\tsubscriber: 'subscriber',\n\tsettings: 'settings',\n\ttemplates: 'templates',\n\taudit: 'audit',\n\tlog: 'log',\n\ttokens: 'tokens',\n\toperators: 'users',\n\tmigrations: 'migrations',\n};\n\n// Below this width the sidebar becomes a drawer behind a top bar. Measured in\n// JS rather than a media query so it also works embedded, with no stylesheet.\nconst NARROW = '(max-width: 820px)';\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: AdminMessageKey;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: AdminMessageKey;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit' | 'operators';\n\t}>;\n}> = [\n\t{ group: 'nav.groups.today', items: [{ page: 'attention', label: 'nav.items.attention' }] },\n\t{\n\t\tgroup: 'nav.groups.system',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'nav.items.modules' },\n\t\t\t{ page: 'environment', label: 'nav.items.environment' },\n\t\t\t{ page: 'doctor', label: 'nav.items.doctor' },\n\t\t\t{ page: 'routes', label: 'nav.items.routes' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.people',\n\t\titems: [{ page: 'users', label: 'nav.items.users', needs: 'auth' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'nav.items.catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'nav.items.subscriptions', needs: 'billing' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.settings',\n\t\titems: [{ page: 'settings', label: 'nav.items.settings', needs: 'config' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.messaging',\n\t\titems: [{ page: 'templates', label: 'nav.items.templates', needs: 'courier' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'nav.items.audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'nav.items.log' },\n\t\t\t{ page: 'operators', label: 'nav.items.operators', needs: 'operators' },\n\t\t\t{ page: 'tokens', label: 'nav.items.tokens' },\n\t\t\t{ page: 'migrations', label: 'nav.items.migrations' },\n\t\t],\n\t},\n];\n\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\toperators = false,\n\tcurrentOperator,\n\tpublicConfigUrl,\n\tlocale,\n}: IAdminShellProps) {\n\tconst t = createAdminT(locale);\n\tconst narrow = useNarrow();\n\tconst [drawer, setDrawer] = useState(false);\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\t// A user opened from Subscriptions: their billing lives on the Users page.\n\tconst [openUser, setOpenUser] = useState<string | undefined>(undefined);\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\t// What is open, and exactly which row: the same key exists per environment\n\t// and the same template per locale — dropping either opened the wrong row.\n\tconst [editing, setEditing] = useState<\n\t\t| { kind: 'config' | 'secret'; key: string; environment?: string; environments?: string[] }\n\t\t| { kind: 'template'; type: string; locale: string | null; system: boolean }\n\t\t| { kind: 'template-new'; type?: string; locales?: string[] }\n\t\t| 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\toperators,\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'environment':\n\t\t\tbody = <EnvironmentScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'operators':\n\t\t\tbody = <OperatorsScreen client={client} me={currentOperator} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'migrations':\n\t\t\tbody = <MigrationsScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} locale={locale} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'BillingAdminClient' })}\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\n\t\t\t\t\tclient={billingClient}\n\t\t\t\t\tlocale={locale}\n\t\t\t\t\t{...(authClient\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tonOpenUser: (id: string) => {\n\t\t\t\t\t\t\t\t\tsetOpenUser(id);\n\t\t\t\t\t\t\t\t\tgo('users');\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {})}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'BillingAdminClient' })}\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} locale={locale} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'AuditAdminClient' })}\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\n\t\t\t\t\tkey={openUser ?? 'list'}\n\t\t\t\t\tclient={authClient}\n\t\t\t\t\tbillingClient={billingClient}\n\t\t\t\t\topenUserId={openUser}\n\t\t\t\t\tlocale={locale}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'AuthAdminClient' })}\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\t{t('shell.missingClient', { client: 'ConfigAdminClient' })}\n\t\t\t\t</p>\n\t\t\t) : editing && (editing.kind === 'config' || editing.kind === 'secret') ? (\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\t{t('nav.items.settings')}\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\tkey={`${editing.kind}:${editing.key}:${editing.environment ?? ''}`}\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{...(editing.environment !== undefined\n\t\t\t\t\t\t\t? { environment: editing.environment }\n\t\t\t\t\t\t\t: environment !== undefined\n\t\t\t\t\t\t\t\t? { environment }\n\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t{...(editing.environments ? { environments: editing.environments } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t\tonDeleted={() => setEditing(null)}\n\t\t\t\t\t\tlocale={locale}\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\tlocale={locale}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t{...(publicConfigUrl ? { publicConfigUrl } : {})}\n\t\t\t\t\tonSelectConfig={(key, env) => setEditing({ kind: 'config', key, environment: env })}\n\t\t\t\t\tonSelectSecret={(key, env) => setEditing({ kind: 'secret', key, environment: env })}\n\t\t\t\t\tonCreateConfig={(c) =>\n\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\tkind: 'config',\n\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\tenvironments: c.environments,\n\t\t\t\t\t\t\t...(c.environment ? { environment: c.environment } : {}),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tonCreateSecret={(c) =>\n\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\tkind: 'secret',\n\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\tenvironments: c.environments,\n\t\t\t\t\t\t\t...(c.environment ? { environment: c.environment } : {}),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\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\t{t('shell.missingClient', { client: 'CourierAdminClient' })}\n\t\t\t\t</p>\n\t\t\t) : editing?.kind === 'template-new' ? (\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\t{t('nav.items.templates')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<TemplateCreateScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t{...(editing.type ? { type: editing.type } : {})}\n\t\t\t\t\t\t{...(editing.locales ? { locales: editing.locales } : {})}\n\t\t\t\t\t\tonCreated={(c) =>\n\t\t\t\t\t\t\tsetEditing({ kind: 'template', type: c.type, locale: c.locale, system: false })\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</>\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\t{t('nav.items.templates')}\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\tkey={`${editing.type}:${editing.locale ?? ''}`}\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tlocale={editing.locale}\n\t\t\t\t\t\tsystem={editing.system}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t\tonDeleted={() => setEditing(null)}\n\t\t\t\t\t\tonAddLocale={(type) => setEditing({ kind: 'template-new', type })}\n\t\t\t\t\t\tuiLocale={locale}\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\tlocale={locale}\n\t\t\t\t\tonSelectTemplate={(tpl) =>\n\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\ttype: tpl.type,\n\t\t\t\t\t\t\tlocale: tpl.locale ?? null,\n\t\t\t\t\t\t\tsystem: tpl.system === true,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tonCreateTemplate={(c) => setEditing({ kind: 'template-new', locales: c.locales })}\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={t('shell.closeMenu')}\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={t('shell.navLabel')}\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}>{t(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\tsetOpenUser(undefined);\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{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 titleKey = NAV.flatMap((g) => g.items).find((i) => i.page === current)?.label;\n\tconst title = titleKey ? t(titleKey) : '';\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={t('shell.openMenu')}\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\tbusyLabel = 'Working…',\n}: {\n\tonClick: () => void;\n\tbusy?: boolean;\n\tlabel?: string;\n\tbusyLabel?: 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 ? busyLabel : 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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50, locale }: IAdminLogScreenProps) {\n\tconst t = createAdminT(locale);\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={t('log.title')}\n\t\t\t\tlead={t('log.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t/>\n\t\t\t\t}\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 ? t('log.off') : 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={t('log.empty')} />\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}>{t('log.colWhen')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colActor')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colRequest')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colStatus')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colModule')}</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{formatAdminDate(e.at, locale, 'datetime')}\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}>{t('common.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\t{t('common.loadMore')}\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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\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, locale }: IAttentionScreenProps) {\n\tconst t = createAdminT(locale);\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={t('attention.title')}\n\t\t\t\tlead={\n\t\t\t\t\tattention\n\t\t\t\t\t\t? t('attention.leadChecked', {\n\t\t\t\t\t\t\t\ttime: formatAdminDate(attention.generatedAt, locale, 'time'),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('attention.lead')\n\t\t\t\t}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t/>\n\t\t\t\t}\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={t('attention.needsAction')}\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={t('attention.needsActionHint')}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel={t('attention.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={t('attention.adviceHint')}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel={t('attention.modulesReady')}\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={\n\t\t\t\t\t\tmanifest\n\t\t\t\t\t\t\t? t('attention.modulesReadyHint', { version: manifest.admin.version })\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel={t('attention.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}>{t('attention.running')}</p>\n\t\t\t) : attention && attention.items.length === 0 ? (\n\t\t\t\t<Empty title={t('attention.emptyTitle')}>\n\t\t\t\t\t{t('attention.emptyBody', {\n\t\t\t\t\t\ttime: formatAdminDate(attention.generatedAt, locale, 'datetime'),\n\t\t\t\t\t})}\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'\n\t\t\t\t\t\t\t\t\t\t\t? t('common.status.error')\n\t\t\t\t\t\t\t\t\t\t\t: t('common.status.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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: IEnvironmentScreenProps) {\n\tconst t = createAdminT(locale);\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={t('environment.title')}\n\t\t\t\tlead={t('environment.lead')}\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'}>\n\t\t\t\t\t\t\t{missing ? t('environment.missingCount', { n: missing }) : t('environment.allSet')}\n\t\t\t\t\t\t</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}>{t('common.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 }}>{t('environment.variables')}</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>{t('environment.noVariables')}</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'}>\n\t\t\t\t\t\t\t\t\t\t{e.set ? t('common.status.set') : t('common.status.missing')}\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))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>{t('environment.moduleReadiness')}</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? t('common.status.ready')\n\t\t\t\t\t\t\t\t\t\t\t: m.problems.length === 1\n\t\t\t\t\t\t\t\t\t\t\t\t? t('environment.problemOne')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('environment.problemMany', { n: m.problems.length })}\n\t\t\t\t\t\t\t\t\t</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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: IDoctorScreenProps) {\n\tconst t = createAdminT(locale);\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={t('doctor.title')}\n\t\t\t\tlead={t('doctor.lead')}\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 ? t('doctor.allPass') : t('doctor.oneFailed')}\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\n\t\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\t\tlabel={t('doctor.runAgain')}\n\t\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>{t('doctor.running')}</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 }}>{t('doctor.colResult')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('doctor.colCheck')}</th>\n\t\t\t\t\t\t\t<th style={{ ...styles.th, textAlign: 'right', width: 90 }}>{t('doctor.colTime')}</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? t('common.status.skipped')\n\t\t\t\t\t\t\t\t\t\t\t: c.ok\n\t\t\t\t\t\t\t\t\t\t\t\t? c.findings.length\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.advice')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.ok')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.failed')}\n\t\t\t\t\t\t\t\t\t</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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client, locale }: IModulesScreenProps) {\n\tconst t = createAdminT(locale);\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={t('modules.title')}\n\t\t\t\tlead={\n\t\t\t\t\tmanifest\n\t\t\t\t\t\t? t('modules.leadSummary', {\n\t\t\t\t\t\t\t\tenv: manifest.env,\n\t\t\t\t\t\t\t\tversion: manifest.admin.version,\n\t\t\t\t\t\t\t\tlog: manifest.admin.log ? t('modules.logOn') : t('modules.logOff'),\n\t\t\t\t\t\t\t\troutes: manifest.routes.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('modules.lead')\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>{t('common.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}>{t('modules.colModule')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('modules.colVersion')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('modules.colReadiness')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('modules.colAdmin')}</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}>{t('modules.notReported')}</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 ? t('common.status.ready') : t('common.status.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}>{t('modules.describesAdmin')}</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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: IRoutesScreenProps) {\n\tconst t = createAdminT(locale);\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={t('routes.title')}\n\t\t\t\tlead={report ? t('routes.leadCount', { n: report.routes.length }) : t('routes.lead')}\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={t('routes.filterPlaceholder')}\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 280 }}\n\t\t\t\t\t\taria-label={t('routes.filterLabel')}\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}>{t('common.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 }}>{t('routes.colMethod')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('routes.colPath')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('routes.colGuard')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('routes.colModule')}</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 }}>\n\t\t\t\t\t\t\t\t\t{r.module ?? t('routes.application')}\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\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\t{t('routes.noMatch', { 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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminT,\n\ttype IAdminMigrationModule,\n\tcreateAdminT,\n} 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\tlocale?: AdminLocale | undefined;\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, t: AdminT): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return t('migrations.blockedBy', { module: m.blockedBy });\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn t('migrations.destructiveBlocked');\n\treturn null;\n}\n\nexport function MigrationsScreen({ client, locale }: IMigrationsScreenProps) {\n\tconst t = createAdminT(locale);\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={t('migrations.title')}\n\t\t\t\tlead={t('migrations.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t/>\n\t\t\t\t}\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 ? t('migrations.needsWrite') : 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}>{t('migrations.firstInstall')}</p>\n\t\t\t) : null}\n\n\t\t\t{report && behind.length === 0 ? (\n\t\t\t\t<Empty icon=\"migrations\" title={t('migrations.upToDate')}>\n\t\t\t\t\t{t('migrations.noPending')}\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, t);\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\">{t('migrations.pendingCount', { n: m.pending.length })}</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\">{t('migrations.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\">{t('migrations.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\tt('migrations.confirmApply', { n: m.pending.length, module: m.name }),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The 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\t{m.pending.length === 1\n\t\t\t\t\t\t\t\t\t? t('migrations.applyOne')\n\t\t\t\t\t\t\t\t\t: t('migrations.applyMany', { n: m.pending.length })}\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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\ttype AdminT,\n\ttype IAdminCreatedLink,\n\ttype IAdminOperator,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAdminOperators } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\n\nexport interface IOperatorsScreenProps {\n\tclient: AdminClient;\n\t// The signed-in operator's email: their own row offers no disable or\n\t// recovery (the server refuses both for yourself anyway).\n\tme?: string | undefined;\n\tlocale?: AdminLocale | undefined;\n}\n\n// Access levels as people think of them; scopes underneath.\ntype LevelId = 'read' | 'editor' | 'owner';\nconst LEVELS: Array<{ id: LevelId; scopes: AdminScope[] }> = [\n\t{ id: 'read', scopes: ['read'] },\n\t{ id: 'editor', scopes: ['read', 'write'] },\n\t{ id: 'owner', scopes: ['read', 'write', 'secrets'] },\n];\nconst levelOf = (scopes: readonly AdminScope[]): LevelId =>\n\tscopes.includes('secrets') ? 'owner' : scopes.includes('write') ? 'editor' : 'read';\n\nfunction Minted({\n\tlink,\n\tonClose,\n\tt,\n\tlocale,\n}: {\n\tlink: IAdminCreatedLink;\n\tonClose: () => void;\n\tt: AdminT;\n\tlocale: AdminLocale | undefined;\n}) {\n\tconst [copied, setCopied] = useState(false);\n\tconst url = `${window.location.origin}${link.url}`;\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\t...styles.notice,\n\t\t\t\tbackground: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\tborderColor: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\n\t\t\t}}\n\t\t>\n\t\t\t<strong>{t('operators.mintedTitle', { email: link.email })}</strong>{' '}\n\t\t\t{t('operators.mintedBody', { date: formatAdminDate(link.expiresAt, locale) })}\n\t\t\t<div style={{ display: 'flex', gap: 8, marginTop: 8, alignItems: 'center' }}>\n\t\t\t\t<code style={{ ...styles.code, flex: 1, padding: '7px 10px', wordBreak: 'break-all' }}>\n\t\t\t\t\t{url}\n\t\t\t\t</code>\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={() => {\n\t\t\t\t\t\tvoid navigator.clipboard?.writeText(url);\n\t\t\t\t\t\tsetCopied(true);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{copied ? t('common.copied') : t('common.copy')}\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.buttonGhost}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label={t('common.dismiss')}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close\" size={14} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// The people who can sign in here. No registration: an owner invites, the\n// invitee sets a password and an authenticator. Lost device or password → a\n// recovery link from another owner.\nexport function OperatorsScreen({ client, me, locale }: IOperatorsScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst { report, isLoading, error, invite, recover, update, revokeLink } =\n\t\tuseAdminOperators(client);\n\tconst [email, setEmail] = useState('');\n\tconst [level, setLevel] = useState<LevelId>('editor');\n\tconst [minted, setMinted] = useState<IAdminCreatedLink | null>(null);\n\n\tconst scopesFor = (id: string) => LEVELS.find((l) => l.id === id)?.scopes ?? ['read'];\n\tconst status = (o: IAdminOperator) =>\n\t\to.disabledAt ? (\n\t\t\t<Pill tone=\"neutral\">{t('common.status.disabled')}</Pill>\n\t\t) : o.locked ? (\n\t\t\t<Pill tone=\"warn\">{t('common.status.locked')}</Pill>\n\t\t) : !o.enrolled ? (\n\t\t\t<Pill tone=\"warn\">{t('operators.settingUp')}</Pill>\n\t\t) : (\n\t\t\t<Pill tone=\"ok\">{t('common.status.active')}</Pill>\n\t\t);\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader title={t('operators.title')} lead={t('operators.lead')} />\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 && error.reason === 'FORBIDDEN'\n\t\t\t\t\t\t? t('operators.needsOwner')\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{minted ? (\n\t\t\t\t<Minted link={minted} onClose={() => setMinted(null)} t={t} locale={locale} />\n\t\t\t) : null}\n\n\t\t\t<form\n\t\t\t\tstyle={{\n\t\t\t\t\t...styles.card,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tgap: 8,\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\tmarginBottom: 20,\n\t\t\t\t}}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid invite({ email: email.trim(), scopes: scopesFor(level) })\n\t\t\t\t\t\t.then((l) => {\n\t\t\t\t\t\t\tsetMinted(l);\n\t\t\t\t\t\t\tsetEmail('');\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Icon name=\"users\" size={16} />\n\t\t\t\t<strong style={{ fontSize: 13.5, marginRight: 4 }}>{t('operators.invite')}</strong>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\trequired\n\t\t\t\t\tvalue={email}\n\t\t\t\t\tonChange={(e) => setEmail(e.target.value)}\n\t\t\t\t\tplaceholder={t('operators.invitePlaceholder')}\n\t\t\t\t\tstyle={{ ...styles.input, flex: 1, minWidth: 220 }}\n\t\t\t\t\taria-label={t('operators.inviteLabel')}\n\t\t\t\t/>\n\t\t\t\t<select\n\t\t\t\t\tvalue={level}\n\t\t\t\t\tonChange={(e) => setLevel(e.target.value as LevelId)}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label={t('operators.accessLevelLabel')}\n\t\t\t\t>\n\t\t\t\t\t{LEVELS.map((l) => (\n\t\t\t\t\t\t<option key={l.id} value={l.id}>\n\t\t\t\t\t\t\t{t(`operators.level.${l.id}`)} — {t(`operators.levelHint.${l.id}`)}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t\t<button type=\"submit\" style={styles.buttonPrimary} disabled={!email.trim()}>\n\t\t\t\t\t<Icon name=\"plus\" size={14} />\n\t\t\t\t\t{t('operators.createInvite')}\n\t\t\t\t</button>\n\t\t\t</form>\n\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>{t('common.loading')}</p>\n\t\t\t) : report && report.operators.length === 0 ? (\n\t\t\t\t<Empty icon=\"users\" title={t('operators.emptyTitle')} />\n\t\t\t) : report ? (\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}>{t('operators.col.operator')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('operators.col.access')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('operators.col.status')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('operators.col.lastSignIn')}</th>\n\t\t\t\t\t\t\t<th style={styles.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.operators.map((o) => (\n\t\t\t\t\t\t\t<tr key={o.id}>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<div style={{ fontWeight: 600 }}>{o.name || o.email}</div>\n\t\t\t\t\t\t\t\t\t{o.name ? <div style={styles.muted}>{o.email}</div> : null}\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<select\n\t\t\t\t\t\t\t\t\t\tvalue={levelOf(o.scopes)}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\t\tvoid update(o.id, { scopes: scopesFor(e.target.value) }).catch(() => {})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.input, height: 28, fontSize: 12.5 }}\n\t\t\t\t\t\t\t\t\t\tdisabled={o.email === me}\n\t\t\t\t\t\t\t\t\t\taria-label={t('operators.accessLevelFor', { email: o.email })}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{LEVELS.map((l) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={l.id} value={l.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t{t(`operators.level.${l.id}`)}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\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{status(o)}\n\t\t\t\t\t\t\t\t\t{o.enrolled && o.backupCodesLeft <= 2 && !o.disabledAt ? (\n\t\t\t\t\t\t\t\t\t\t<div style={{ ...styles.muted, marginTop: 4 }}>\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\to.backupCodesLeft === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'operators.backupCodesLeftOne'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'operators.backupCodesLeftMany',\n\t\t\t\t\t\t\t\t\t\t\t\t{ n: o.backupCodesLeft },\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\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, whiteSpace: 'nowrap' }}>\n\t\t\t\t\t\t\t\t\t{o.lastLoginAt ? formatAdminDate(o.lastLoginAt, locale) : t('common.never')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, textAlign: 'right', whiteSpace: 'nowrap' }}>\n\t\t\t\t\t\t\t\t\t{o.email === me ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{t('common.you')}</span>\n\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<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, height: 28, marginRight: 6 }}\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(t('operators.recoveryConfirm', { email: o.email })))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid recover(o.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(setMinted)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\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{t('operators.recoveryLink')}\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<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={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(o.disabledAt ? styles.button : styles.buttonDanger),\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: 28,\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\tonClick={() => {\n\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\to.disabledAt ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(t('operators.disableConfirm', { email: o.email }))\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid update(o.id, { disabled: !o.disabledAt }).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\t{o.disabledAt ? t('operators.enable') : t('operators.disable')}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t)}\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\n\t\t\t{report && report.links.length > 0 ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>{t('operators.pendingLinks')}</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.links.map((l) => (\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tkey={l.id}\n\t\t\t\t\t\t\t\tstyle={{ ...styles.row, display: 'flex', gap: 12, alignItems: 'center' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Pill tone={l.kind === 'invite' ? 'info' : 'warn'} dot={false}>\n\t\t\t\t\t\t\t\t\t{l.kind === 'invite'\n\t\t\t\t\t\t\t\t\t\t? t('operators.linkKind.invite')\n\t\t\t\t\t\t\t\t\t\t: t('operators.linkKind.recovery')}\n\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t<span style={{ flex: 1 }}>\n\t\t\t\t\t\t\t\t\t{l.email}\n\t\t\t\t\t\t\t\t\t{l.kind === 'invite' ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}> · {t(`operators.level.${levelOf(l.scopes)}`)}</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t{t('operators.expiresOn', { date: formatAdminDate(l.expiresAt, locale) })}\n\t\t\t\t\t\t\t\t</span>\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.buttonDanger, height: 28 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void revokeLink(l.id).catch(() => {})}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('operators.revoke')}\n\t\t\t\t\t\t\t\t</button>\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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\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, locale }: ITokensScreenProps) {\n\tconst t = createAdminT(locale);\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 title={t('tokens.title')} lead={t('tokens.lead')} />\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 ? t('tokens.needsRoot') : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={{ ...styles.subtitle, marginTop: 0 }}>{t('tokens.rootToken')}</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'}>\n\t\t\t\t\t\t\t{report.admin.ok ? t('tokens.strong') : t('tokens.weak')}\n\t\t\t\t\t\t</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}>{t('tokens.issuedTokens')}</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>{t('tokens.issuingOff')}</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>{t('tokens.copyNow')}</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={t('tokens.namePlaceholder')}\n\t\t\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\t\t\taria-label={t('tokens.nameLabel')}\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{t(`tokens.scope.${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={t('tokens.daysPlaceholder')}\n\t\t\t\t\t\t\tstyle={{ ...styles.input, width: 140 }}\n\t\t\t\t\t\t\taria-label={t('tokens.daysLabel')}\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\t{t('tokens.issue')}\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}>{t('tokens.col.name')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.scopes')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.created')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.expires')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.lastUsed')}</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((tk) => (\n\t\t\t\t\t\t\t\t\t<tr key={tk.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{tk.name}\n\t\t\t\t\t\t\t\t\t\t\t{tk.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\">{t('tokens.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 }}>\n\t\t\t\t\t\t\t\t\t\t\t{tk.scopes.map((s) => t(`tokens.scope.${s}`)).join(', ')}\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{formatAdminDate(tk.createdAt, locale, 'date')} · {tk.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{tk.expiresAt\n\t\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(tk.expiresAt, locale, 'date')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('common.never')}\n\t\t\t\t\t\t\t\t\t\t</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{tk.lastUsedAt ? formatAdminDate(tk.lastUsedAt, locale) : t('common.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{tk.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 (window.confirm(t('tokens.revokeConfirm', { name: tk.name })))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(tk.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\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{t('tokens.revoke')}\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={t('tokens.emptyTitle')}>\n\t\t\t\t\t\t\t{t('tokens.emptyBody')}\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}>{t('tokens.legacyTitle')}</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>{t('tokens.legacyNone')}</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}>{t('tokens.legacyRow')}</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 {\n\ttype AdminLocale,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\tdescribeLocation,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { statusLabel, statusTone, useSubscriptionIndex } from '../billing';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\nimport { SubscriberBilling } from './SubscriberBilling';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n\tpageSize?: number;\n\t// Given ⇒ a Plan column, and each user's plan, credits and grant form on\n\t// their page. Everyone has a wallet; no subscription means the free tier.\n\tbillingClient?: BillingAdminClient | undefined;\n\t// Open this user on arrival (e.g. from the Subscriptions list).\n\topenUserId?: string | undefined;\n\tlocale?: AdminLocale | undefined;\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({\n\tclient,\n\tpageSize = 50,\n\tbillingClient,\n\topenUserId,\n\tlocale,\n}: IUsersScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst [input, setInput] = useState('');\n\tconst [selected, setSelected] = useState<{ id?: string; email?: string } | null>(\n\t\topenUserId ? { id: openUserId } : null,\n\t);\n\tconst plans = useSubscriptionIndex(billingClient);\n\n\t// Soft-deleted accounts are their own view: they cannot sign in and are\n\t// erased by the retention purge, but until then an operator can see them.\n\tconst [showDeleted, setShowDeleted] = useState(false);\n\tconst list = useAdminUsers(client, {\n\t\tlimit: pageSize,\n\t\t...(showDeleted ? { deleted: true } : {}),\n\t});\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 ? <Pill tone=\"ok\">{t('common.yes')}</Pill> : <Pill tone=\"neutral\">{t('common.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 title={t('users.title')} lead={t('users.lead')} />\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={t('users.emailPlaceholder')}\n\t\t\t\t\tstyle={{ ...styles.input, minWidth: 280 }}\n\t\t\t\t\taria-label={t('users.emailLabel')}\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\t{t('common.lookUp')}\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\t{t('users.allUsers')}\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\t{t('common.refresh')}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{!selected ? (\n\t\t\t\t\t<fieldset\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tmargin: '0 0 0 auto',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\taria-label={t('users.whichAccounts')}\n\t\t\t\t\t>\n\t\t\t\t\t\t{[false, true].map((d) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={String(d)}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={showDeleted === d}\n\t\t\t\t\t\t\t\tonClick={() => setShowDeleted(d)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...(showDeleted === d ? styles.buttonPrimary : styles.button),\n\t\t\t\t\t\t\t\t\theight: 28,\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{d ? t('users.deletedAccounts') : t('users.activeAccounts')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</fieldset>\n\t\t\t\t) : null}\n\t\t\t</form>\n\t\t\t{error && !(error.status === 404 && selected?.id) ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? t('users.noUserWithEmail') : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{/* Opened by id (e.g. from Subscriptions) and the account is gone —\n\t\t\t deleted or purged — while its billing rows remain. Say so, and\n\t\t\t still show the money: a subscription and wallet outlive the\n\t\t\t account row, and the operator came here to look at them. */}\n\t\t\t{error?.status === 404 && selected?.id ? (\n\t\t\t\t<>\n\t\t\t\t\t<div style={styles.notice} role=\"status\">\n\t\t\t\t\t\t<strong>{t('users.missingIdPrefix')} </strong>\n\t\t\t\t\t\t<code style={styles.code}>{selected.id}</code>\n\t\t\t\t\t\t<strong>.</strong> {t('users.missingIdBody')}\n\t\t\t\t\t</div>\n\t\t\t\t\t{billingClient ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.planCredits')}</h2>\n\t\t\t\t\t\t\t<SubscriberBilling\n\t\t\t\t\t\t\t\tclient={billingClient}\n\t\t\t\t\t\t\t\tsubscriber={{ type: 'user', id: selected.id }}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\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={t('users.emptyTitle')}>\n\t\t\t\t\t\t\t{t('users.emptyBody')}\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}>{t('users.col.email')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('users.col.name')}</th>\n\t\t\t\t\t\t\t\t\t{billingClient ? <th style={styles.th}>{t('users.col.plan')}</th> : null}\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('users.col.created')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('users.col.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{billingClient ? (\n\t\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{(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst sub = plans?.get(`user/${u.id}`);\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!plans) return <span style={styles.muted}>…</span>;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!sub || sub.status === 'canceled')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn <span style={styles.muted}>{t('common.status.free')}</span>;\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\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\t<strong>{sub.plan}</strong>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{sub.status !== 'active' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone={statusTone(sub.status)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{statusLabel(t, sub.status)}\n\t\t\t\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\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{formatAdminDate(u.createdAt, locale, 'date')}</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\">{t('common.status.suspended')}</Pill> : null}\n\t\t\t\t\t\t\t\t\t\t\t{u.deletedAt ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone=\"neutral\">{t('common.status.deleted')}</Pill>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t{!u.suspended && !u.deletedAt ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone=\"ok\">{t('common.status.active')}</Pill>\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</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}>{t('common.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\t{t('common.loadMore')}\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\">{t('common.status.suspended')}</Pill> : null}\n\t\t\t\t\t\t{user.deletedAt ? <Pill tone=\"neutral\">{t('common.status.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}>{t('users.field.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}>{t('users.field.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} · {t('users.field.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}>{t('users.field.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}>{t('users.field.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 || t('users.passwordProvider')}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ` · ${t('users.noPasswordSet')}`}\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}>{t('users.field.lastLogin')}</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\tformatAdminDate(user.lastLogin, locale)\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}>{t('common.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}>{t('users.field.created')}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{formatAdminDate(user.createdAt, locale)}</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{user.deletedAt ? (\n\t\t\t\t\t\t<div style={{ ...styles.notice, marginTop: 12 }} role=\"status\">\n\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\t{t('users.deletedOn', { date: formatAdminDate(user.deletedAt, locale) })}\n\t\t\t\t\t\t\t</strong>{' '}\n\t\t\t\t\t\t\t{t('users.deletedBody')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t\t{user.suspended ? (\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}\n\t\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('users.unsuspend')}\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\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.buttonDanger}\n\t\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('users.suspend')}\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\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 revokeSessions().then(() => sessions.refresh())}\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\t{t('users.signOutEverywhere')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{billingClient ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.planCredits')}</h2>\n\t\t\t\t\t\t\t<SubscriberBilling\n\t\t\t\t\t\t\t\tclient={billingClient}\n\t\t\t\t\t\t\t\tsubscriber={{ type: 'user', id: user.id }}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t{!user.deletedAt ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.liveSessions')}</h2>\n\t\t\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>{t('common.none')}</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\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\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t{describeLocation(s.location) ? (\n\t\t\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\t\t) : null}\n\t\t\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\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t\t\t\t{t('users.since', { date: formatAdminDate(s.createdAt, locale) })}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.recentSignIns')}</h2>\n\t\t\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>{t('users.noneRecorded')}</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\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\t\t<Pill tone={e.outcome === 'success' ? 'ok' : 'bad'}>\n\t\t\t\t\t\t\t\t\t\t\t\t{e.outcome === 'success'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.success')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome === 'failure'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.failure')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome}\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<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\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\t\t{describeLocation(e.location) ? (\n\t\t\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\t\t) : null}\n\t\t\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\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\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{e.location.proxy ? t('users.proxyVpn') : t('users.hosting')}\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\t<span style={styles.muted}>{formatAdminDate(e.createdAt, locale)}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{history.hasMore && !history.isLoading ? (\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 history.loadMore()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('common.loadMore')}\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) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import {\n\ttype AdminLocale,\n\ttype AdminT,\n\ttype BillingAdminClient,\n\ttype IAdminSubscriptionDTO,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useEffect, useState } from 'react';\nimport type { Tone } from './styles';\n\n/** What the period end means for this subscription. A canceled one does not renew. */\nexport function periodEnd(\n\ts: IAdminSubscriptionDTO,\n\tlocale?: AdminLocale,\n): { label: string; date: string } | null {\n\tif (!s.currentPeriodEnd) return null;\n\tconst t = createAdminT(locale);\n\tconst date = formatAdminDate(s.currentPeriodEnd, locale, 'date');\n\tif (s.status === 'canceled')\n\t\treturn {\n\t\t\tlabel: new Date(s.currentPeriodEnd) < new Date() ? t('billing.ended') : t('billing.ends'),\n\t\t\tdate,\n\t\t};\n\tif (s.cancelAtPeriodEnd) return { label: t('billing.ends'), date };\n\treturn { label: t('billing.renews'), date };\n}\n\nconst STATUS_KEYS = [\n\t'active',\n\t'trialing',\n\t'past_due',\n\t'unpaid',\n\t'canceled',\n\t'incomplete',\n\t'incomplete_expired',\n\t'paused',\n] as const;\n\n/** A subscription status in the console's language; an unknown one is shown as sent. */\nexport function statusLabel(t: AdminT, status: string): string {\n\treturn (STATUS_KEYS as readonly string[]).includes(status)\n\t\t? t(`billing.statusLabel.${status as (typeof STATUS_KEYS)[number]}`)\n\t\t: status;\n}\n\n/** A billing interval in the console's language; an unknown one is shown as sent. */\nexport function intervalLabel(t: AdminT, interval: string): string {\n\treturn interval === 'month' || interval === 'year'\n\t\t? t(`billing.intervalLabel.${interval}`)\n\t\t: interval;\n}\n\nexport const statusTone = (status: string): Tone =>\n\tstatus === 'active'\n\t\t? 'ok'\n\t\t: status === 'trialing'\n\t\t\t? 'info'\n\t\t\t: status === 'past_due' || status === 'unpaid'\n\t\t\t\t? 'warn'\n\t\t\t\t: 'neutral';\n\n/**\n * Every subscription, keyed by `type/id`, for showing a plan next to each user.\n * Reads the admin list page by page (100 at a time, at most 2,000) — a\n * console-sized index, not a query engine. Anyone absent from it is free.\n */\nexport function useSubscriptionIndex(client: BillingAdminClient | undefined) {\n\tconst [index, setIndex] = useState<Map<string, IAdminSubscriptionDTO> | null>(null);\n\tuseEffect(() => {\n\t\tif (!client) return;\n\t\tlet live = true;\n\t\t(async () => {\n\t\t\tconst map = new Map<string, IAdminSubscriptionDTO>();\n\t\t\tlet cursor: string | undefined;\n\t\t\tfor (let page = 0; page < 20; page++) {\n\t\t\t\tconst { result } = await client.listSubscriptions({\n\t\t\t\t\tlimit: 100,\n\t\t\t\t\t...(cursor ? { cursor } : {}),\n\t\t\t\t});\n\t\t\t\tfor (const s of result.subscriptions) {\n\t\t\t\t\tconst key = `${s.subscriberType}/${s.subscriberId}`;\n\t\t\t\t\t// Newest first: keep the first (current) one per subscriber.\n\t\t\t\t\tif (!map.has(key)) map.set(key, s);\n\t\t\t\t}\n\t\t\t\tif (!result.nextCursor) break;\n\t\t\t\tcursor = result.nextCursor;\n\t\t\t}\n\t\t\tif (live) setIndex(map);\n\t\t})().catch(() => {\n\t\t\tif (live) setIndex(new Map());\n\t\t});\n\t\treturn () => {\n\t\t\tlive = false;\n\t\t};\n\t}, [client]);\n\treturn index;\n}\n","import {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\ttype SubscriberType,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAdminSubscriber } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { Empty, Icon, Pill } from '../ui';\n\nexport interface ISubscriberBillingProps {\n\tclient: BillingAdminClient;\n\tsubscriber: { type: SubscriberType; id: string };\n\tlocale?: AdminLocale | undefined;\n}\n\n// \"Permanent\" is purchases plus admin grants — it never expires. \"Plan\n// allowance\" is what the plan hands out each period, and can expire. The\n// wallet API calls the second `granted` and the first `purchased`; an admin\n// grant lands in the permanent part, which is why those names mislead here.\n//\n// One subscriber's money: plan, wallet, the one write (a grant,\n// idempotency-keyed) and what moved. Used on a user's page and for workspace\n// subscribers. A subscription is NOT required: everyone has a wallet, and a\n// user with no subscription is on the free tier.\nexport function SubscriberBilling({ client, subscriber, locale }: ISubscriberBillingProps) {\n\tconst t = createAdminT(locale);\n\tconst LEDGER_KINDS = ['purchase', 'grant', 'usage', 'refund', 'adjustment', 'expiry'] as const;\n\tconst ledgerKind = (kind: string) =>\n\t\t(LEDGER_KINDS as readonly string[]).includes(kind)\n\t\t\t? t(`billing.ledgerKind.${kind as (typeof LEDGER_KINDS)[number]}`)\n\t\t\t: kind;\n\t// A wallet exists per currency. Empty ⇒ the billing default; typing another\n\t// (e.g. EUR) reads that wallet instead — same as the CLI's --currency.\n\tconst [currency, setCurrency] = useState('');\n\tconst [currencyDraft, setCurrencyDraft] = useState('');\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20, ...(currency ? { currency } : {}) });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\tif (isLoading && !wallet && !subscription)\n\t\treturn <p style={styles.status}>{t('billing.loading')}</p>;\n\tconst end = subscription ? periodEnd(subscription, locale) : null;\n\n\treturn (\n\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, marginBottom: 16 }}>\n\t\t\t\t<div style={styles.card}>\n\t\t\t\t\t<div style={styles.statLabel}>{t('billing.plan')}</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tmarginTop: 6,\n\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong style={{ fontSize: 18 }}>\n\t\t\t\t\t\t\t{subscription ? subscription.plan : t('billing.free')}\n\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span style={styles.muted}>· {intervalLabel(t, subscription.interval)}</span>\n\t\t\t\t\t\t\t\t<Pill tone={statusTone(subscription.status)}>\n\t\t\t\t\t\t\t\t\t{statusLabel(t, subscription.status)}\n\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span style={styles.muted}>{t('billing.noSubscription')}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t{end ? (\n\t\t\t\t\t\t<div style={styles.statHint}>\n\t\t\t\t\t\t\t{end.label} {end.date}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{subscription?.providerSubscriptionId ? (\n\t\t\t\t\t\t<div style={{ ...styles.statHint, fontFamily: 'var(--fonderie-mono,monospace)' }}>\n\t\t\t\t\t\t\t{subscription.providerSubscriptionId}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t<div style={styles.card}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div style={styles.statLabel}>{t('billing.credits')}</div>\n\t\t\t\t\t\t<form\n\t\t\t\t\t\t\tstyle={{ display: 'flex', gap: 4 }}\n\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsetCurrency(currencyDraft.trim().toUpperCase());\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tvalue={currencyDraft}\n\t\t\t\t\t\t\t\tonChange={(e) => setCurrencyDraft(e.target.value)}\n\t\t\t\t\t\t\t\tplaceholder={wallet?.currency ?? t('billing.currencyPlaceholder')}\n\t\t\t\t\t\t\t\tmaxLength={8}\n\t\t\t\t\t\t\t\tstyle={{ ...styles.input, height: 26, width: 84, fontSize: 12 }}\n\t\t\t\t\t\t\t\taria-label={t('billing.currencyLabel')}\n\t\t\t\t\t\t\t\ttitle={t('billing.currencyTitle')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</div>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div style={styles.statValue}>\n\t\t\t\t\t\t\t\t{wallet.balance}{' '}\n\t\t\t\t\t\t\t\t<span style={{ fontSize: 14, fontWeight: 500 }}>{wallet.currency}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div style={styles.statHint}>\n\t\t\t\t\t\t\t\t{t('billing.breakdown', {\n\t\t\t\t\t\t\t\t\tpermanent: wallet.purchased ?? '0',\n\t\t\t\t\t\t\t\t\tallowance: wallet.granted ?? '0',\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t{wallet.grantedExpiresAt\n\t\t\t\t\t\t\t\t\t? t('billing.expires', {\n\t\t\t\t\t\t\t\t\t\t\tdate: formatAdminDate(wallet.grantedExpiresAt, locale, 'date'),\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</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div style={styles.statHint}>{t('billing.noWallet')}</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{wallet ? (\n\t\t\t\t<form\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\tmarginBottom: 16,\n\t\t\t\t\t}}\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t...(note ? { description: note } : {}),\n\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tsetGranted(\n\t\t\t\t\t\t\t\t\tt('billing.granted', { amount: amount.trim(), currency: wallet.currency }),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\tsetNote('');\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<strong style={{ fontSize: 13.5, marginRight: 4 }}>{t('billing.grantCredits')}</strong>\n\t\t\t\t\t<input\n\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\tplaceholder={t('billing.amountPlaceholder', { currency: wallet.currency })}\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 150 }}\n\t\t\t\t\t\taria-label={t('billing.amountLabel')}\n\t\t\t\t\t/>\n\t\t\t\t\t<input\n\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\tplaceholder={t('billing.reasonPlaceholder')}\n\t\t\t\t\t\tstyle={{ ...styles.input, flex: 1, minWidth: 180 }}\n\t\t\t\t\t\taria-label={t('billing.reasonLabel')}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tstyle={styles.buttonPrimary}\n\t\t\t\t\t\tdisabled={!/^\\d+$/.test(amount.trim())}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"plus\" size={14} />\n\t\t\t\t\t\t{t('billing.grant')}\n\t\t\t\t\t</button>\n\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t</form>\n\t\t\t) : null}\n\n\t\t\t{wallet ? (\n\t\t\t\tledger.length === 0 ? (\n\t\t\t\t\t<Empty icon=\"subscriber\" title={t('billing.noMovements')} />\n\t\t\t\t) : (\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}>{t('billing.col.when')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.col.kind')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.col.amount')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.col.note')}</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{ledger.map((tx) => (\n\t\t\t\t\t\t\t\t\t<tr key={tx.id}>\n\t\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\t{formatAdminDate(tx.createdAt, locale)}\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}>{ledgerKind(tx.type)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{tx.amount}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{tx.description ?? ''}</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\t{hasMoreLedger ? (\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, marginTop: 8 }}\n\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t('common.loadMore')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n","import { type AdminLocale, type BillingAdminClient, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: ICatalogScreenProps) {\n\tconst t = createAdminT(locale);\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={t('catalog.title')}\n\t\t\t\tlead={t('catalog.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t/>\n\t\t\t\t}\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}>{t('common.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 }}>{t('catalog.configured')}</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}>{t('catalog.stored')}</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<Empty icon=\"catalog\" title={t('catalog.emptyTitle')}>\n\t\t\t\t\t\t\t{t('catalog.emptyBody')}\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}>{t('catalog.col.plan')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.tier')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.seats')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.monthly')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.yearly')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.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}>\n\t\t\t\t\t\t\t\t\t\t\t{p.trialDays ? t('catalog.trialDays', { n: p.trialDays }) : '—'}\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<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(t('catalog.deleteConfirm', { name: 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\t{t('common.delete')}\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 {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\ttype SubscriberType,\n\tcreateAdminT,\n} from '@fonderie/client';\nimport { useAdminSubscribers } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill, RefreshButton } from '../ui';\nimport { SubscriberBilling } from './SubscriberBilling';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n\tpageSize?: number;\n\t/**\n\t * A user subscriber opens on the Users page, where their plan and credits\n\t * live beside their account. Omit to open everything here.\n\t */\n\tonOpenUser?: (userId: string) => void;\n\tlocale?: AdminLocale | undefined;\n}\n\ntype FilterId = 'all' | 'active' | 'trialing' | 'pastDue' | 'canceled';\nconst FILTERS: Array<{ id: FilterId; match: (status: string) => boolean }> = [\n\t{ id: 'all', match: () => true },\n\t{ id: 'active', match: (s) => s === 'active' },\n\t{ id: 'trialing', match: (s) => s === 'trialing' },\n\t{ id: 'pastDue', match: (s) => s === 'past_due' || s === 'unpaid' },\n\t{ id: 'canceled', match: (s) => s === 'canceled' },\n];\n\n// Who pays, and who is behind. A money list: plans and statuses across users\n// and workspaces. A user's own billing (plan, credits, grants) is on their\n// page under Users; free users have no subscription and appear only there.\nexport function SubscriberScreen({\n\tclient,\n\tpageSize = 50,\n\tonOpenUser,\n\tlocale,\n}: ISubscriberScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst list = useAdminSubscribers(client, { limit: pageSize });\n\tconst [filter, setFilter] = useState<FilterId>('all');\n\tconst [open, setOpen] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst [type, setType] = useState<SubscriberType>('workspace');\n\tconst [idInput, setIdInput] = useState('');\n\n\tif (open) {\n\t\treturn (\n\t\t\t<div style={styles.container}>\n\t\t\t\t<PageHeader\n\t\t\t\t\ttitle={`${open.type}/${open.id}`}\n\t\t\t\t\tlead={t('billing.subscriptions.detailLead')}\n\t\t\t\t\tactions={\n\t\t\t\t\t\t<button type=\"button\" style={styles.buttonGhost} onClick={() => setOpen(null)}>\n\t\t\t\t\t\t\t<Icon name=\"back\" size={14} />\n\t\t\t\t\t\t\t{t('billing.subscriptions.back')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<SubscriberBilling client={client} subscriber={open} locale={locale} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst match = FILTERS.find((f) => f.id === filter)?.match ?? (() => true);\n\tconst rows = list.subscriptions.filter((s) => match(s.status));\n\tconst openRow = (t: SubscriberType, id: string) =>\n\t\tt === 'user' && onOpenUser ? onOpenUser(id) : setOpen({ type: t, id });\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle={t('billing.subscriptions.title')}\n\t\t\t\tlead={t('billing.subscriptions.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tbusy={list.isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<div style={{ ...styles.toolbar, justifyContent: 'space-between' }}>\n\t\t\t\t<fieldset\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label={t('billing.subscriptions.filterLabel')}\n\t\t\t\t>\n\t\t\t\t\t{FILTERS.map((f) => {\n\t\t\t\t\t\tconst n = list.subscriptions.filter((s) => f.match(s.status)).length;\n\t\t\t\t\t\tconst on = filter === f.id;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={f.id}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={on}\n\t\t\t\t\t\t\t\tonClick={() => setFilter(f.id)}\n\t\t\t\t\t\t\t\tstyle={{ ...(on ? styles.buttonPrimary : styles.button), height: 28 }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t(`billing.subscriptions.filter.${f.id}`)}\n\t\t\t\t\t\t\t\t<span style={{ opacity: 0.7 }}>{n}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</fieldset>\n\t\t\t\t<form\n\t\t\t\t\tstyle={{ display: 'flex', gap: 6 }}\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (idInput.trim()) openRow(type, idInput.trim());\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<select\n\t\t\t\t\t\tvalue={type}\n\t\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\t\taria-label={t('billing.subscriptions.typeLabel')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"workspace\">{t('billing.subscriptions.typeWorkspace')}</option>\n\t\t\t\t\t\t<option value=\"user\">{t('billing.subscriptions.typeUser')}</option>\n\t\t\t\t\t</select>\n\t\t\t\t\t<input\n\t\t\t\t\t\tvalue={idInput}\n\t\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\t\tplaceholder={t('billing.subscriptions.idPlaceholder')}\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 220 }}\n\t\t\t\t\t\taria-label={t('billing.subscriptions.idLabel')}\n\t\t\t\t\t/>\n\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!idInput.trim()}>\n\t\t\t\t\t\t<Icon name=\"search\" size={14} />\n\t\t\t\t\t\t{t('common.open')}\n\t\t\t\t\t</button>\n\t\t\t\t</form>\n\t\t\t</div>\n\t\t\t{list.error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{list.error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{rows.length === 0 && !list.isLoading ? (\n\t\t\t\t<Empty icon=\"subscriber\" title={t(`billing.subscriptions.empty.${filter}`)}>\n\t\t\t\t\t{t('billing.subscriptions.emptyHint')}\n\t\t\t\t</Empty>\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}>{t('billing.subscriptions.col.subscriber')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.subscriptions.col.plan')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.subscriptions.col.status')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.subscriptions.col.renewsEnds')}</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{rows.map((s) => {\n\t\t\t\t\t\t\tconst end = periodEnd(s, locale);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<tr key={s.id}>\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<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.link, ...styles.mono }}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => openRow(s.subscriberType, s.subscriberId)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{s.subscriberType}/{s.subscriberId}\n\t\t\t\t\t\t\t\t\t\t</button>\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<strong>{s.plan}</strong>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>· {intervalLabel(t, s.interval)}</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<Pill tone={statusTone(s.status)}>{statusLabel(t, s.status)}</Pill>\n\t\t\t\t\t\t\t\t\t\t{s.cancelAtPeriodEnd && s.status !== 'canceled' ? (\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{' '}\n\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{t('billing.subscriptions.cancels')}\n\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</>\n\t\t\t\t\t\t\t\t\t\t) : null}\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{end ? (\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}>{end.label}</span> {end.date}\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<span style={styles.muted}>—</span>\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</tr>\n\t\t\t\t\t\t\t);\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{list.isLoading ? <p style={styles.status}>{t('common.loading')}</p> : null}\n\t\t\t{list.hasMore && !list.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 list.loadMore()}\n\t\t\t\t>\n\t\t\t\t\t{t('common.loadMore')}\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import {\n\ttype AdminLocale,\n\ttype AuditAdminClient,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\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, locale }: IAuditScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '', from: '', to: '' });\n\tconst [filter, setFilter] = useState<{\n\t\tworkspaceId?: string;\n\t\ttype?: string;\n\t\tactorId?: string;\n\t\tfrom?: Date;\n\t\tto?: Date;\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 title={t('audit.title')} lead={t('audit.lead')} />\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\t// Dates are whole days in the operator's time zone: \"to\" includes that day.\n\t\t\t\t\t\t...(draft.from ? { from: new Date(`${draft.from}T00:00:00`) } : {}),\n\t\t\t\t\t\t...(draft.to ? { to: new Date(`${draft.to}T23:59:59.999`) } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', t('audit.workspacePlaceholder'))}\n\t\t\t\t{field('type', t('audit.typePlaceholder'))}\n\t\t\t\t{field('actorId', t('audit.actorPlaceholder'))}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tvalue={draft.from}\n\t\t\t\t\tonChange={(e) => setDraft({ ...draft, from: e.target.value })}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label={t('audit.fromLabel')}\n\t\t\t\t\ttitle={t('audit.fromTitle')}\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tvalue={draft.to}\n\t\t\t\t\tonChange={(e) => setDraft({ ...draft, to: e.target.value })}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label={t('audit.toLabel')}\n\t\t\t\t\ttitle={t('audit.toTitle')}\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\t{t('common.filter')}\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\t{t('common.refresh')}\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={t('audit.empty')} />\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}>{t('audit.col.when')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.type')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.workspace')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.actor')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.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{formatAdminDate(e.createdAt, locale)}\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}>{t('common.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\t{t('common.loadMore')}\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":["createAdminT","useEffect","useState","jsx","jsxs","t","createAdminT","formatAdminDate","jsx","jsxs","t","createAdminT","formatAdminDate","createAdminT","Fragment","jsx","jsxs","t","createAdminT","createAdminT","Fragment","jsx","jsxs","t","createAdminT","createAdminT","useManifest","jsx","jsxs","t","createAdminT","useManifest","createAdminT","jsx","jsxs","t","createAdminT","createAdminT","jsx","jsxs","t","createAdminT","createAdminT","formatAdminDate","useState","Fragment","jsx","jsxs","t","useState","formatAdminDate","createAdminT","createAdminT","formatAdminDate","useState","Fragment","jsx","jsxs","t","createAdminT","useState","formatAdminDate","createAdminT","formatAdminDate","useState","createAdminT","formatAdminDate","useState","t","createAdminT","formatAdminDate","useState","Fragment","jsx","jsxs","t","createAdminT","useState","formatAdminDate","Fragment","jsx","jsxs","t","createAdminT","useState","formatAdminDate","createAdminT","Fragment","jsx","jsxs","t","createAdminT","createAdminT","useState","Fragment","jsx","jsxs","t","createAdminT","useState","createAdminT","formatAdminDate","useState","jsx","jsxs","t","createAdminT","useState","formatAdminDate","Fragment","jsx","jsxs","useState","useEffect","t","createAdminT"]}
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/OperatorsScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/billing.ts","../src/screens/SubscriberBilling.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["import {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminMessageKey,\n\ttype AuditAdminClient,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\ttype ConfigAdminClient,\n\ttype CourierAdminClient,\n\tcreateAdminT,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport {\n\tTemplateCreateScreen,\n\tTemplateEditorScreen,\n\tTemplateListScreen,\n} 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 { OperatorsScreen } from './OperatorsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'environment'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'operators'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\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\t// The deployment has operator accounts (@fonderie/admin with a store):\n\t// shows the Operators page.\n\toperators?: boolean;\n\t// The signed-in operator's email, when a person (not a token) is signed in.\n\tcurrentOperator?: string;\n\t// Where the app serves GET /config/public — marks public keys on the\n\t// Config page and previews exactly what frontends receive.\n\tpublicConfigUrl?: string;\n\t// The console's own language (the operator's choice, independent of the\n\t// locales the app serves). Default English.\n\tlocale?: AdminLocale | undefined;\n}\n\nconst ICON: Record<AdminPage, IconName> = {\n\tattention: 'attention',\n\tmodules: 'modules',\n\tenvironment: 'environment',\n\tdoctor: 'doctor',\n\troutes: 'routes',\n\tusers: 'users',\n\tcatalog: 'catalog',\n\tsubscriber: 'subscriber',\n\tsettings: 'settings',\n\ttemplates: 'templates',\n\taudit: 'audit',\n\tlog: 'log',\n\ttokens: 'tokens',\n\toperators: 'users',\n\tmigrations: 'migrations',\n};\n\n// Below this width the sidebar becomes a drawer behind a top bar. Measured in\n// JS rather than a media query so it also works embedded, with no stylesheet.\nconst NARROW = '(max-width: 820px)';\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: AdminMessageKey;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: AdminMessageKey;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit' | 'operators';\n\t}>;\n}> = [\n\t{ group: 'nav.groups.today', items: [{ page: 'attention', label: 'nav.items.attention' }] },\n\t{\n\t\tgroup: 'nav.groups.system',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'nav.items.modules' },\n\t\t\t{ page: 'environment', label: 'nav.items.environment' },\n\t\t\t{ page: 'doctor', label: 'nav.items.doctor' },\n\t\t\t{ page: 'routes', label: 'nav.items.routes' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.people',\n\t\titems: [{ page: 'users', label: 'nav.items.users', needs: 'auth' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'nav.items.catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'nav.items.subscriptions', needs: 'billing' },\n\t\t],\n\t},\n\t{\n\t\tgroup: 'nav.groups.settings',\n\t\titems: [{ page: 'settings', label: 'nav.items.settings', needs: 'config' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.messaging',\n\t\titems: [{ page: 'templates', label: 'nav.items.templates', needs: 'courier' }],\n\t},\n\t{\n\t\tgroup: 'nav.groups.activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'nav.items.audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'nav.items.log' },\n\t\t\t{ page: 'operators', label: 'nav.items.operators', needs: 'operators' },\n\t\t\t{ page: 'tokens', label: 'nav.items.tokens' },\n\t\t\t{ page: 'migrations', label: 'nav.items.migrations' },\n\t\t],\n\t},\n];\n\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\toperators = false,\n\tcurrentOperator,\n\tpublicConfigUrl,\n\tlocale,\n}: IAdminShellProps) {\n\tconst t = createAdminT(locale);\n\tconst narrow = useNarrow();\n\tconst [drawer, setDrawer] = useState(false);\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\t// A user opened from Subscriptions: their billing lives on the Users page.\n\tconst [openUser, setOpenUser] = useState<string | undefined>(undefined);\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\t// What is open, and exactly which row: the same key exists per environment\n\t// and the same template per locale — dropping either opened the wrong row.\n\tconst [editing, setEditing] = useState<\n\t\t| { kind: 'config' | 'secret'; key: string; environment?: string; environments?: string[] }\n\t\t| { kind: 'template'; type: string; locale: string | null; system: boolean }\n\t\t| { kind: 'template-new'; type?: string; locales?: string[] }\n\t\t| 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\toperators,\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'environment':\n\t\t\tbody = <EnvironmentScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'operators':\n\t\t\tbody = <OperatorsScreen client={client} me={currentOperator} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'migrations':\n\t\t\tbody = <MigrationsScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} locale={locale} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} locale={locale} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'BillingAdminClient' })}\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\n\t\t\t\t\tclient={billingClient}\n\t\t\t\t\tlocale={locale}\n\t\t\t\t\t{...(authClient\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tonOpenUser: (id: string) => {\n\t\t\t\t\t\t\t\t\tsetOpenUser(id);\n\t\t\t\t\t\t\t\t\tgo('users');\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {})}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'BillingAdminClient' })}\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} locale={locale} />\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'AuditAdminClient' })}\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\n\t\t\t\t\tkey={openUser ?? 'list'}\n\t\t\t\t\tclient={authClient}\n\t\t\t\t\tbillingClient={billingClient}\n\t\t\t\t\topenUserId={openUser}\n\t\t\t\t\tlocale={locale}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<p style={{ ...styles.status, padding: '32px 40px' }}>\n\t\t\t\t\t{t('shell.missingClient', { client: 'AuthAdminClient' })}\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\t{t('shell.missingClient', { client: 'ConfigAdminClient' })}\n\t\t\t\t</p>\n\t\t\t) : editing && (editing.kind === 'config' || editing.kind === 'secret') ? (\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\t{t('nav.items.settings')}\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\tkey={`${editing.kind}:${editing.key}:${editing.environment ?? ''}`}\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{...(editing.environment !== undefined\n\t\t\t\t\t\t\t? { environment: editing.environment }\n\t\t\t\t\t\t\t: environment !== undefined\n\t\t\t\t\t\t\t\t? { environment }\n\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t{...(editing.environments ? { environments: editing.environments } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t\tonDeleted={() => setEditing(null)}\n\t\t\t\t\t\tlocale={locale}\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\tlocale={locale}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t{...(publicConfigUrl ? { publicConfigUrl } : {})}\n\t\t\t\t\tonSelectConfig={(key, env) => setEditing({ kind: 'config', key, environment: env })}\n\t\t\t\t\tonSelectSecret={(key, env) => setEditing({ kind: 'secret', key, environment: env })}\n\t\t\t\t\tonCreateConfig={(c) =>\n\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\tkind: 'config',\n\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\tenvironments: c.environments,\n\t\t\t\t\t\t\t...(c.environment ? { environment: c.environment } : {}),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tonCreateSecret={(c) =>\n\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\tkind: 'secret',\n\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\tenvironments: c.environments,\n\t\t\t\t\t\t\t...(c.environment ? { environment: c.environment } : {}),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\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\t{t('shell.missingClient', { client: 'CourierAdminClient' })}\n\t\t\t\t</p>\n\t\t\t) : editing?.kind === 'template-new' ? (\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\t{t('nav.items.templates')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<TemplateCreateScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t{...(editing.type ? { type: editing.type } : {})}\n\t\t\t\t\t\t{...(editing.locales ? { locales: editing.locales } : {})}\n\t\t\t\t\t\tonCreated={(c) =>\n\t\t\t\t\t\t\tsetEditing({ kind: 'template', type: c.type, locale: c.locale, system: false })\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</>\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\t{t('nav.items.templates')}\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\tkey={`${editing.type}:${editing.locale ?? ''}`}\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tlocale={editing.locale}\n\t\t\t\t\t\tsystem={editing.system}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t\tonDeleted={() => setEditing(null)}\n\t\t\t\t\t\tonAddLocale={(type, c) => setEditing({ kind: 'template-new', type, locales: c.locales })}\n\t\t\t\t\t\tonSelectLocale={(tpl) =>\n\t\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\t\ttype: tpl.type,\n\t\t\t\t\t\t\t\tlocale: tpl.locale,\n\t\t\t\t\t\t\t\tsystem: tpl.system === true,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tuiLocale={locale}\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\tlocale={locale}\n\t\t\t\t\tonSelectTemplate={(tpl) =>\n\t\t\t\t\t\tsetEditing({\n\t\t\t\t\t\t\tkind: 'template',\n\t\t\t\t\t\t\ttype: tpl.type,\n\t\t\t\t\t\t\tlocale: tpl.locale ?? null,\n\t\t\t\t\t\t\tsystem: tpl.system === true,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tonCreateTemplate={(c) => setEditing({ kind: 'template-new', locales: c.locales })}\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={t('shell.closeMenu')}\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={t('shell.navLabel')}\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}>{t(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\tsetOpenUser(undefined);\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{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 titleKey = NAV.flatMap((g) => g.items).find((i) => i.page === current)?.label;\n\tconst title = titleKey ? t(titleKey) : '';\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={t('shell.openMenu')}\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\tbusyLabel = 'Working…',\n}: {\n\tonClick: () => void;\n\tbusy?: boolean;\n\tlabel?: string;\n\tbusyLabel?: 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 ? busyLabel : 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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50, locale }: IAdminLogScreenProps) {\n\tconst t = createAdminT(locale);\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={t('log.title')}\n\t\t\t\tlead={t('log.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t/>\n\t\t\t\t}\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 ? t('log.off') : 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={t('log.empty')} />\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}>{t('log.colWhen')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colActor')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colRequest')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colStatus')}</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>{t('log.colModule')}</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{formatAdminDate(e.at, locale, 'datetime')}\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}>{t('common.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\t{t('common.loadMore')}\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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\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, locale }: IAttentionScreenProps) {\n\tconst t = createAdminT(locale);\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={t('attention.title')}\n\t\t\t\tlead={\n\t\t\t\t\tattention\n\t\t\t\t\t\t? t('attention.leadChecked', {\n\t\t\t\t\t\t\t\ttime: formatAdminDate(attention.generatedAt, locale, 'time'),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('attention.lead')\n\t\t\t\t}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t/>\n\t\t\t\t}\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={t('attention.needsAction')}\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={t('attention.needsActionHint')}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel={t('attention.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={t('attention.adviceHint')}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel={t('attention.modulesReady')}\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={\n\t\t\t\t\t\tmanifest\n\t\t\t\t\t\t\t? t('attention.modulesReadyHint', { version: manifest.admin.version })\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<Stat\n\t\t\t\t\tlabel={t('attention.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}>{t('attention.running')}</p>\n\t\t\t) : attention && attention.items.length === 0 ? (\n\t\t\t\t<Empty title={t('attention.emptyTitle')}>\n\t\t\t\t\t{t('attention.emptyBody', {\n\t\t\t\t\t\ttime: formatAdminDate(attention.generatedAt, locale, 'datetime'),\n\t\t\t\t\t})}\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'\n\t\t\t\t\t\t\t\t\t\t\t? t('common.status.error')\n\t\t\t\t\t\t\t\t\t\t\t: t('common.status.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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: IEnvironmentScreenProps) {\n\tconst t = createAdminT(locale);\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={t('environment.title')}\n\t\t\t\tlead={t('environment.lead')}\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'}>\n\t\t\t\t\t\t\t{missing ? t('environment.missingCount', { n: missing }) : t('environment.allSet')}\n\t\t\t\t\t\t</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}>{t('common.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 }}>{t('environment.variables')}</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>{t('environment.noVariables')}</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'}>\n\t\t\t\t\t\t\t\t\t\t{e.set ? t('common.status.set') : t('common.status.missing')}\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))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>{t('environment.moduleReadiness')}</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? t('common.status.ready')\n\t\t\t\t\t\t\t\t\t\t\t: m.problems.length === 1\n\t\t\t\t\t\t\t\t\t\t\t\t? t('environment.problemOne')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('environment.problemMany', { n: m.problems.length })}\n\t\t\t\t\t\t\t\t\t</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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: IDoctorScreenProps) {\n\tconst t = createAdminT(locale);\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={t('doctor.title')}\n\t\t\t\tlead={t('doctor.lead')}\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 ? t('doctor.allPass') : t('doctor.oneFailed')}\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\n\t\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\t\tlabel={t('doctor.runAgain')}\n\t\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>{t('doctor.running')}</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 }}>{t('doctor.colResult')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('doctor.colCheck')}</th>\n\t\t\t\t\t\t\t<th style={{ ...styles.th, textAlign: 'right', width: 90 }}>{t('doctor.colTime')}</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? t('common.status.skipped')\n\t\t\t\t\t\t\t\t\t\t\t: c.ok\n\t\t\t\t\t\t\t\t\t\t\t\t? c.findings.length\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('common.status.advice')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.ok')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('common.status.failed')}\n\t\t\t\t\t\t\t\t\t</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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client, locale }: IModulesScreenProps) {\n\tconst t = createAdminT(locale);\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={t('modules.title')}\n\t\t\t\tlead={\n\t\t\t\t\tmanifest\n\t\t\t\t\t\t? t('modules.leadSummary', {\n\t\t\t\t\t\t\t\tenv: manifest.env,\n\t\t\t\t\t\t\t\tversion: manifest.admin.version,\n\t\t\t\t\t\t\t\tlog: manifest.admin.log ? t('modules.logOn') : t('modules.logOff'),\n\t\t\t\t\t\t\t\troutes: manifest.routes.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('modules.lead')\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>{t('common.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}>{t('modules.colModule')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('modules.colVersion')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('modules.colReadiness')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('modules.colAdmin')}</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}>{t('modules.notReported')}</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 ? t('common.status.ready') : t('common.status.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}>{t('modules.describesAdmin')}</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, type AdminLocale, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: IRoutesScreenProps) {\n\tconst t = createAdminT(locale);\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={t('routes.title')}\n\t\t\t\tlead={report ? t('routes.leadCount', { n: report.routes.length }) : t('routes.lead')}\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={t('routes.filterPlaceholder')}\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 280 }}\n\t\t\t\t\t\taria-label={t('routes.filterLabel')}\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}>{t('common.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 }}>{t('routes.colMethod')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('routes.colPath')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('routes.colGuard')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('routes.colModule')}</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 }}>\n\t\t\t\t\t\t\t\t\t{r.module ?? t('routes.application')}\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\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\t{t('routes.noMatch', { 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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminT,\n\ttype IAdminMigrationModule,\n\tcreateAdminT,\n} 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\tlocale?: AdminLocale | undefined;\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, t: AdminT): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return t('migrations.blockedBy', { module: m.blockedBy });\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn t('migrations.destructiveBlocked');\n\treturn null;\n}\n\nexport function MigrationsScreen({ client, locale }: IMigrationsScreenProps) {\n\tconst t = createAdminT(locale);\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={t('migrations.title')}\n\t\t\t\tlead={t('migrations.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t\tbusyLabel={t('common.working')}\n\t\t\t\t\t/>\n\t\t\t\t}\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 ? t('migrations.needsWrite') : 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}>{t('migrations.firstInstall')}</p>\n\t\t\t) : null}\n\n\t\t\t{report && behind.length === 0 ? (\n\t\t\t\t<Empty icon=\"migrations\" title={t('migrations.upToDate')}>\n\t\t\t\t\t{t('migrations.noPending')}\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, t);\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\">{t('migrations.pendingCount', { n: m.pending.length })}</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\">{t('migrations.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\">{t('migrations.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\tt('migrations.confirmApply', { n: m.pending.length, module: m.name }),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The 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\t{m.pending.length === 1\n\t\t\t\t\t\t\t\t\t? t('migrations.applyOne')\n\t\t\t\t\t\t\t\t\t: t('migrations.applyMany', { n: m.pending.length })}\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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\ttype AdminT,\n\ttype IAdminCreatedLink,\n\ttype IAdminOperator,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAdminOperators } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\n\nexport interface IOperatorsScreenProps {\n\tclient: AdminClient;\n\t// The signed-in operator's email: their own row offers no disable or\n\t// recovery (the server refuses both for yourself anyway).\n\tme?: string | undefined;\n\tlocale?: AdminLocale | undefined;\n}\n\n// Access levels as people think of them; scopes underneath.\ntype LevelId = 'read' | 'editor' | 'owner';\nconst LEVELS: Array<{ id: LevelId; scopes: AdminScope[] }> = [\n\t{ id: 'read', scopes: ['read'] },\n\t{ id: 'editor', scopes: ['read', 'write'] },\n\t{ id: 'owner', scopes: ['read', 'write', 'secrets'] },\n];\nconst levelOf = (scopes: readonly AdminScope[]): LevelId =>\n\tscopes.includes('secrets') ? 'owner' : scopes.includes('write') ? 'editor' : 'read';\n\nfunction Minted({\n\tlink,\n\tonClose,\n\tt,\n\tlocale,\n}: {\n\tlink: IAdminCreatedLink;\n\tonClose: () => void;\n\tt: AdminT;\n\tlocale: AdminLocale | undefined;\n}) {\n\tconst [copied, setCopied] = useState(false);\n\tconst url = `${window.location.origin}${link.url}`;\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\t...styles.notice,\n\t\t\t\tbackground: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 10%, transparent)',\n\t\t\t\tborderColor: 'color-mix(in srgb, var(--fonderie-accent,#00d294) 35%, transparent)',\n\t\t\t}}\n\t\t>\n\t\t\t<strong>{t('operators.mintedTitle', { email: link.email })}</strong>{' '}\n\t\t\t{t('operators.mintedBody', { date: formatAdminDate(link.expiresAt, locale) })}\n\t\t\t<div style={{ display: 'flex', gap: 8, marginTop: 8, alignItems: 'center' }}>\n\t\t\t\t<code style={{ ...styles.code, flex: 1, padding: '7px 10px', wordBreak: 'break-all' }}>\n\t\t\t\t\t{url}\n\t\t\t\t</code>\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={() => {\n\t\t\t\t\t\tvoid navigator.clipboard?.writeText(url);\n\t\t\t\t\t\tsetCopied(true);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{copied ? t('common.copied') : t('common.copy')}\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.buttonGhost}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label={t('common.dismiss')}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close\" size={14} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// The people who can sign in here. No registration: an owner invites, the\n// invitee sets a password and an authenticator. Lost device or password → a\n// recovery link from another owner.\nexport function OperatorsScreen({ client, me, locale }: IOperatorsScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst { report, isLoading, error, invite, recover, update, revokeLink } =\n\t\tuseAdminOperators(client);\n\tconst [email, setEmail] = useState('');\n\tconst [level, setLevel] = useState<LevelId>('editor');\n\tconst [minted, setMinted] = useState<IAdminCreatedLink | null>(null);\n\n\tconst scopesFor = (id: string) => LEVELS.find((l) => l.id === id)?.scopes ?? ['read'];\n\tconst status = (o: IAdminOperator) =>\n\t\to.disabledAt ? (\n\t\t\t<Pill tone=\"neutral\">{t('common.status.disabled')}</Pill>\n\t\t) : o.locked ? (\n\t\t\t<Pill tone=\"warn\">{t('common.status.locked')}</Pill>\n\t\t) : !o.enrolled ? (\n\t\t\t<Pill tone=\"warn\">{t('operators.settingUp')}</Pill>\n\t\t) : (\n\t\t\t<Pill tone=\"ok\">{t('common.status.active')}</Pill>\n\t\t);\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader title={t('operators.title')} lead={t('operators.lead')} />\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 && error.reason === 'FORBIDDEN'\n\t\t\t\t\t\t? t('operators.needsOwner')\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{minted ? (\n\t\t\t\t<Minted link={minted} onClose={() => setMinted(null)} t={t} locale={locale} />\n\t\t\t) : null}\n\n\t\t\t<form\n\t\t\t\tstyle={{\n\t\t\t\t\t...styles.card,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tgap: 8,\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\tmarginBottom: 20,\n\t\t\t\t}}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid invite({ email: email.trim(), scopes: scopesFor(level) })\n\t\t\t\t\t\t.then((l) => {\n\t\t\t\t\t\t\tsetMinted(l);\n\t\t\t\t\t\t\tsetEmail('');\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Icon name=\"users\" size={16} />\n\t\t\t\t<strong style={{ fontSize: 13.5, marginRight: 4 }}>{t('operators.invite')}</strong>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\trequired\n\t\t\t\t\tvalue={email}\n\t\t\t\t\tonChange={(e) => setEmail(e.target.value)}\n\t\t\t\t\tplaceholder={t('operators.invitePlaceholder')}\n\t\t\t\t\tstyle={{ ...styles.input, flex: 1, minWidth: 220 }}\n\t\t\t\t\taria-label={t('operators.inviteLabel')}\n\t\t\t\t/>\n\t\t\t\t<select\n\t\t\t\t\tvalue={level}\n\t\t\t\t\tonChange={(e) => setLevel(e.target.value as LevelId)}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label={t('operators.accessLevelLabel')}\n\t\t\t\t>\n\t\t\t\t\t{LEVELS.map((l) => (\n\t\t\t\t\t\t<option key={l.id} value={l.id}>\n\t\t\t\t\t\t\t{t(`operators.level.${l.id}`)} — {t(`operators.levelHint.${l.id}`)}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t\t<button type=\"submit\" style={styles.buttonPrimary} disabled={!email.trim()}>\n\t\t\t\t\t<Icon name=\"plus\" size={14} />\n\t\t\t\t\t{t('operators.createInvite')}\n\t\t\t\t</button>\n\t\t\t</form>\n\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>{t('common.loading')}</p>\n\t\t\t) : report && report.operators.length === 0 ? (\n\t\t\t\t<Empty icon=\"users\" title={t('operators.emptyTitle')} />\n\t\t\t) : report ? (\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}>{t('operators.col.operator')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('operators.col.access')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('operators.col.status')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('operators.col.lastSignIn')}</th>\n\t\t\t\t\t\t\t<th style={styles.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.operators.map((o) => (\n\t\t\t\t\t\t\t<tr key={o.id}>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<div style={{ fontWeight: 600 }}>{o.name || o.email}</div>\n\t\t\t\t\t\t\t\t\t{o.name ? <div style={styles.muted}>{o.email}</div> : null}\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<select\n\t\t\t\t\t\t\t\t\t\tvalue={levelOf(o.scopes)}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\t\tvoid update(o.id, { scopes: scopesFor(e.target.value) }).catch(() => {})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.input, height: 28, fontSize: 12.5 }}\n\t\t\t\t\t\t\t\t\t\tdisabled={o.email === me}\n\t\t\t\t\t\t\t\t\t\taria-label={t('operators.accessLevelFor', { email: o.email })}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{LEVELS.map((l) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={l.id} value={l.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t{t(`operators.level.${l.id}`)}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\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{status(o)}\n\t\t\t\t\t\t\t\t\t{o.enrolled && o.backupCodesLeft <= 2 && !o.disabledAt ? (\n\t\t\t\t\t\t\t\t\t\t<div style={{ ...styles.muted, marginTop: 4 }}>\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\to.backupCodesLeft === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'operators.backupCodesLeftOne'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'operators.backupCodesLeftMany',\n\t\t\t\t\t\t\t\t\t\t\t\t{ n: o.backupCodesLeft },\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\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, whiteSpace: 'nowrap' }}>\n\t\t\t\t\t\t\t\t\t{o.lastLoginAt ? formatAdminDate(o.lastLoginAt, locale) : t('common.never')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, textAlign: 'right', whiteSpace: 'nowrap' }}>\n\t\t\t\t\t\t\t\t\t{o.email === me ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{t('common.you')}</span>\n\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<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, height: 28, marginRight: 6 }}\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(t('operators.recoveryConfirm', { email: o.email })))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid recover(o.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.then(setMinted)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\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{t('operators.recoveryLink')}\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<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={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(o.disabledAt ? styles.button : styles.buttonDanger),\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: 28,\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\tonClick={() => {\n\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\to.disabledAt ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(t('operators.disableConfirm', { email: o.email }))\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid update(o.id, { disabled: !o.disabledAt }).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\t{o.disabledAt ? t('operators.enable') : t('operators.disable')}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t)}\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\n\t\t\t{report && report.links.length > 0 ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>{t('operators.pendingLinks')}</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.links.map((l) => (\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tkey={l.id}\n\t\t\t\t\t\t\t\tstyle={{ ...styles.row, display: 'flex', gap: 12, alignItems: 'center' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Pill tone={l.kind === 'invite' ? 'info' : 'warn'} dot={false}>\n\t\t\t\t\t\t\t\t\t{l.kind === 'invite'\n\t\t\t\t\t\t\t\t\t\t? t('operators.linkKind.invite')\n\t\t\t\t\t\t\t\t\t\t: t('operators.linkKind.recovery')}\n\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t\t<span style={{ flex: 1 }}>\n\t\t\t\t\t\t\t\t\t{l.email}\n\t\t\t\t\t\t\t\t\t{l.kind === 'invite' ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}> · {t(`operators.level.${levelOf(l.scopes)}`)}</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t{t('operators.expiresOn', { date: formatAdminDate(l.expiresAt, locale) })}\n\t\t\t\t\t\t\t\t</span>\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.buttonDanger, height: 28 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void revokeLink(l.id).catch(() => {})}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('operators.revoke')}\n\t\t\t\t\t\t\t\t</button>\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 {\n\ttype AdminClient,\n\ttype AdminLocale,\n\ttype AdminScope,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\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, locale }: ITokensScreenProps) {\n\tconst t = createAdminT(locale);\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 title={t('tokens.title')} lead={t('tokens.lead')} />\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 ? t('tokens.needsRoot') : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={{ ...styles.subtitle, marginTop: 0 }}>{t('tokens.rootToken')}</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'}>\n\t\t\t\t\t\t\t{report.admin.ok ? t('tokens.strong') : t('tokens.weak')}\n\t\t\t\t\t\t</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}>{t('tokens.issuedTokens')}</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>{t('tokens.issuingOff')}</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>{t('tokens.copyNow')}</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={t('tokens.namePlaceholder')}\n\t\t\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\t\t\taria-label={t('tokens.nameLabel')}\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{t(`tokens.scope.${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={t('tokens.daysPlaceholder')}\n\t\t\t\t\t\t\tstyle={{ ...styles.input, width: 140 }}\n\t\t\t\t\t\t\taria-label={t('tokens.daysLabel')}\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\t{t('tokens.issue')}\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}>{t('tokens.col.name')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.scopes')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.created')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.expires')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('tokens.col.lastUsed')}</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((tk) => (\n\t\t\t\t\t\t\t\t\t<tr key={tk.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{tk.name}\n\t\t\t\t\t\t\t\t\t\t\t{tk.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\">{t('tokens.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 }}>\n\t\t\t\t\t\t\t\t\t\t\t{tk.scopes.map((s) => t(`tokens.scope.${s}`)).join(', ')}\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{formatAdminDate(tk.createdAt, locale, 'date')} · {tk.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{tk.expiresAt\n\t\t\t\t\t\t\t\t\t\t\t\t? formatAdminDate(tk.expiresAt, locale, 'date')\n\t\t\t\t\t\t\t\t\t\t\t\t: t('common.never')}\n\t\t\t\t\t\t\t\t\t\t</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{tk.lastUsedAt ? formatAdminDate(tk.lastUsedAt, locale) : t('common.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{tk.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 (window.confirm(t('tokens.revokeConfirm', { name: tk.name })))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(tk.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\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{t('tokens.revoke')}\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={t('tokens.emptyTitle')}>\n\t\t\t\t\t\t\t{t('tokens.emptyBody')}\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}>{t('tokens.legacyTitle')}</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>{t('tokens.legacyNone')}</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}>{t('tokens.legacyRow')}</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 {\n\ttype AdminLocale,\n\ttype AuthAdminClient,\n\ttype BillingAdminClient,\n\tcreateAdminT,\n\tdescribeLocation,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { statusLabel, statusTone, useSubscriptionIndex } from '../billing';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill } from '../ui';\nimport { SubscriberBilling } from './SubscriberBilling';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n\tpageSize?: number;\n\t// Given ⇒ a Plan column, and each user's plan, credits and grant form on\n\t// their page. Everyone has a wallet; no subscription means the free tier.\n\tbillingClient?: BillingAdminClient | undefined;\n\t// Open this user on arrival (e.g. from the Subscriptions list).\n\topenUserId?: string | undefined;\n\tlocale?: AdminLocale | undefined;\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({\n\tclient,\n\tpageSize = 50,\n\tbillingClient,\n\topenUserId,\n\tlocale,\n}: IUsersScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst [input, setInput] = useState('');\n\tconst [selected, setSelected] = useState<{ id?: string; email?: string } | null>(\n\t\topenUserId ? { id: openUserId } : null,\n\t);\n\tconst plans = useSubscriptionIndex(billingClient);\n\n\t// Soft-deleted accounts are their own view: they cannot sign in and are\n\t// erased by the retention purge, but until then an operator can see them.\n\tconst [showDeleted, setShowDeleted] = useState(false);\n\tconst list = useAdminUsers(client, {\n\t\tlimit: pageSize,\n\t\t...(showDeleted ? { deleted: true } : {}),\n\t});\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 ? <Pill tone=\"ok\">{t('common.yes')}</Pill> : <Pill tone=\"neutral\">{t('common.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 title={t('users.title')} lead={t('users.lead')} />\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={t('users.emailPlaceholder')}\n\t\t\t\t\tstyle={{ ...styles.input, minWidth: 280 }}\n\t\t\t\t\taria-label={t('users.emailLabel')}\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\t{t('common.lookUp')}\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\t{t('users.allUsers')}\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\t{t('common.refresh')}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{!selected ? (\n\t\t\t\t\t<fieldset\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tmargin: '0 0 0 auto',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\taria-label={t('users.whichAccounts')}\n\t\t\t\t\t>\n\t\t\t\t\t\t{[false, true].map((d) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={String(d)}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={showDeleted === d}\n\t\t\t\t\t\t\t\tonClick={() => setShowDeleted(d)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...(showDeleted === d ? styles.buttonPrimary : styles.button),\n\t\t\t\t\t\t\t\t\theight: 28,\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{d ? t('users.deletedAccounts') : t('users.activeAccounts')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</fieldset>\n\t\t\t\t) : null}\n\t\t\t</form>\n\t\t\t{error && !(error.status === 404 && selected?.id) ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? t('users.noUserWithEmail') : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{/* Opened by id (e.g. from Subscriptions) and the account is gone —\n\t\t\t deleted or purged — while its billing rows remain. Say so, and\n\t\t\t still show the money: a subscription and wallet outlive the\n\t\t\t account row, and the operator came here to look at them. */}\n\t\t\t{error?.status === 404 && selected?.id ? (\n\t\t\t\t<>\n\t\t\t\t\t<div style={styles.notice} role=\"status\">\n\t\t\t\t\t\t<strong>{t('users.missingIdPrefix')} </strong>\n\t\t\t\t\t\t<code style={styles.code}>{selected.id}</code>\n\t\t\t\t\t\t<strong>.</strong> {t('users.missingIdBody')}\n\t\t\t\t\t</div>\n\t\t\t\t\t{billingClient ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.planCredits')}</h2>\n\t\t\t\t\t\t\t<SubscriberBilling\n\t\t\t\t\t\t\t\tclient={billingClient}\n\t\t\t\t\t\t\t\tsubscriber={{ type: 'user', id: selected.id }}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\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={t('users.emptyTitle')}>\n\t\t\t\t\t\t\t{t('users.emptyBody')}\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}>{t('users.col.email')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('users.col.name')}</th>\n\t\t\t\t\t\t\t\t\t{billingClient ? <th style={styles.th}>{t('users.col.plan')}</th> : null}\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('users.col.created')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('users.col.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{billingClient ? (\n\t\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{(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst sub = plans?.get(`user/${u.id}`);\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!plans) return <span style={styles.muted}>…</span>;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!sub || sub.status === 'canceled')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn <span style={styles.muted}>{t('common.status.free')}</span>;\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\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\t<strong>{sub.plan}</strong>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{sub.status !== 'active' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone={statusTone(sub.status)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{statusLabel(t, sub.status)}\n\t\t\t\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\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{formatAdminDate(u.createdAt, locale, 'date')}</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\">{t('common.status.suspended')}</Pill> : null}\n\t\t\t\t\t\t\t\t\t\t\t{u.deletedAt ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone=\"neutral\">{t('common.status.deleted')}</Pill>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t{!u.suspended && !u.deletedAt ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pill tone=\"ok\">{t('common.status.active')}</Pill>\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</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}>{t('common.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\t{t('common.loadMore')}\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\">{t('common.status.suspended')}</Pill> : null}\n\t\t\t\t\t\t{user.deletedAt ? <Pill tone=\"neutral\">{t('common.status.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}>{t('users.field.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}>{t('users.field.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} · {t('users.field.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}>{t('users.field.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}>{t('users.field.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 || t('users.passwordProvider')}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ` · ${t('users.noPasswordSet')}`}\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}>{t('users.field.lastLogin')}</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\tformatAdminDate(user.lastLogin, locale)\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}>{t('common.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}>{t('users.field.created')}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{formatAdminDate(user.createdAt, locale)}</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{user.deletedAt ? (\n\t\t\t\t\t\t<div style={{ ...styles.notice, marginTop: 12 }} role=\"status\">\n\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\t{t('users.deletedOn', { date: formatAdminDate(user.deletedAt, locale) })}\n\t\t\t\t\t\t\t</strong>{' '}\n\t\t\t\t\t\t\t{t('users.deletedBody')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t\t{user.suspended ? (\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}\n\t\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('users.unsuspend')}\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\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.buttonDanger}\n\t\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('users.suspend')}\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\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 revokeSessions().then(() => sessions.refresh())}\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\t{t('users.signOutEverywhere')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{billingClient ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.planCredits')}</h2>\n\t\t\t\t\t\t\t<SubscriberBilling\n\t\t\t\t\t\t\t\tclient={billingClient}\n\t\t\t\t\t\t\t\tsubscriber={{ type: 'user', id: user.id }}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t{!user.deletedAt ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.liveSessions')}</h2>\n\t\t\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>{t('common.none')}</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\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\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t{describeLocation(s.location) ? (\n\t\t\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\t\t) : null}\n\t\t\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\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t\t\t\t{t('users.since', { date: formatAdminDate(s.createdAt, locale) })}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>{t('users.recentSignIns')}</h2>\n\t\t\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>{t('users.noneRecorded')}</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\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\t\t<Pill tone={e.outcome === 'success' ? 'ok' : 'bad'}>\n\t\t\t\t\t\t\t\t\t\t\t\t{e.outcome === 'success'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.success')\n\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome === 'failure'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('users.outcome.failure')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.outcome}\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<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\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\t\t{describeLocation(e.location) ? (\n\t\t\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\t\t) : null}\n\t\t\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\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\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{e.location.proxy ? t('users.proxyVpn') : t('users.hosting')}\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\t<span style={styles.muted}>{formatAdminDate(e.createdAt, locale)}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{history.hasMore && !history.isLoading ? (\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 history.loadMore()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('common.loadMore')}\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) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import {\n\ttype AdminLocale,\n\ttype AdminT,\n\ttype BillingAdminClient,\n\ttype IAdminSubscriptionDTO,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useEffect, useState } from 'react';\nimport type { Tone } from './styles';\n\n/** What the period end means for this subscription. A canceled one does not renew. */\nexport function periodEnd(\n\ts: IAdminSubscriptionDTO,\n\tlocale?: AdminLocale,\n): { label: string; date: string } | null {\n\tif (!s.currentPeriodEnd) return null;\n\tconst t = createAdminT(locale);\n\tconst date = formatAdminDate(s.currentPeriodEnd, locale, 'date');\n\tif (s.status === 'canceled')\n\t\treturn {\n\t\t\tlabel: new Date(s.currentPeriodEnd) < new Date() ? t('billing.ended') : t('billing.ends'),\n\t\t\tdate,\n\t\t};\n\tif (s.cancelAtPeriodEnd) return { label: t('billing.ends'), date };\n\treturn { label: t('billing.renews'), date };\n}\n\nconst STATUS_KEYS = [\n\t'active',\n\t'trialing',\n\t'past_due',\n\t'unpaid',\n\t'canceled',\n\t'incomplete',\n\t'incomplete_expired',\n\t'paused',\n] as const;\n\n/** A subscription status in the console's language; an unknown one is shown as sent. */\nexport function statusLabel(t: AdminT, status: string): string {\n\treturn (STATUS_KEYS as readonly string[]).includes(status)\n\t\t? t(`billing.statusLabel.${status as (typeof STATUS_KEYS)[number]}`)\n\t\t: status;\n}\n\n/** A billing interval in the console's language; an unknown one is shown as sent. */\nexport function intervalLabel(t: AdminT, interval: string): string {\n\treturn interval === 'month' || interval === 'year'\n\t\t? t(`billing.intervalLabel.${interval}`)\n\t\t: interval;\n}\n\nexport const statusTone = (status: string): Tone =>\n\tstatus === 'active'\n\t\t? 'ok'\n\t\t: status === 'trialing'\n\t\t\t? 'info'\n\t\t\t: status === 'past_due' || status === 'unpaid'\n\t\t\t\t? 'warn'\n\t\t\t\t: 'neutral';\n\n/**\n * Every subscription, keyed by `type/id`, for showing a plan next to each user.\n * Reads the admin list page by page (100 at a time, at most 2,000) — a\n * console-sized index, not a query engine. Anyone absent from it is free.\n */\nexport function useSubscriptionIndex(client: BillingAdminClient | undefined) {\n\tconst [index, setIndex] = useState<Map<string, IAdminSubscriptionDTO> | null>(null);\n\tuseEffect(() => {\n\t\tif (!client) return;\n\t\tlet live = true;\n\t\t(async () => {\n\t\t\tconst map = new Map<string, IAdminSubscriptionDTO>();\n\t\t\tlet cursor: string | undefined;\n\t\t\tfor (let page = 0; page < 20; page++) {\n\t\t\t\tconst { result } = await client.listSubscriptions({\n\t\t\t\t\tlimit: 100,\n\t\t\t\t\t...(cursor ? { cursor } : {}),\n\t\t\t\t});\n\t\t\t\tfor (const s of result.subscriptions) {\n\t\t\t\t\tconst key = `${s.subscriberType}/${s.subscriberId}`;\n\t\t\t\t\t// Newest first: keep the first (current) one per subscriber.\n\t\t\t\t\tif (!map.has(key)) map.set(key, s);\n\t\t\t\t}\n\t\t\t\tif (!result.nextCursor) break;\n\t\t\t\tcursor = result.nextCursor;\n\t\t\t}\n\t\t\tif (live) setIndex(map);\n\t\t})().catch(() => {\n\t\t\tif (live) setIndex(new Map());\n\t\t});\n\t\treturn () => {\n\t\t\tlive = false;\n\t\t};\n\t}, [client]);\n\treturn index;\n}\n","import {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\ttype SubscriberType,\n\tcreateAdminT,\n\tformatAdminDate,\n} from '@fonderie/client';\nimport { useAdminSubscriber } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { Empty, Icon, Pill } from '../ui';\n\nexport interface ISubscriberBillingProps {\n\tclient: BillingAdminClient;\n\tsubscriber: { type: SubscriberType; id: string };\n\tlocale?: AdminLocale | undefined;\n}\n\n// \"Permanent\" is purchases plus admin grants — it never expires. \"Plan\n// allowance\" is what the plan hands out each period, and can expire. The\n// wallet API calls the second `granted` and the first `purchased`; an admin\n// grant lands in the permanent part, which is why those names mislead here.\n//\n// One subscriber's money: plan, wallet, the one write (a grant,\n// idempotency-keyed) and what moved. Used on a user's page and for workspace\n// subscribers. A subscription is NOT required: everyone has a wallet, and a\n// user with no subscription is on the free tier.\nexport function SubscriberBilling({ client, subscriber, locale }: ISubscriberBillingProps) {\n\tconst t = createAdminT(locale);\n\tconst LEDGER_KINDS = ['purchase', 'grant', 'usage', 'refund', 'adjustment', 'expiry'] as const;\n\tconst ledgerKind = (kind: string) =>\n\t\t(LEDGER_KINDS as readonly string[]).includes(kind)\n\t\t\t? t(`billing.ledgerKind.${kind as (typeof LEDGER_KINDS)[number]}`)\n\t\t\t: kind;\n\t// A wallet exists per currency. Empty ⇒ the billing default; typing another\n\t// (e.g. EUR) reads that wallet instead — same as the CLI's --currency.\n\tconst [currency, setCurrency] = useState('');\n\tconst [currencyDraft, setCurrencyDraft] = useState('');\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20, ...(currency ? { currency } : {}) });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\tif (isLoading && !wallet && !subscription)\n\t\treturn <p style={styles.status}>{t('billing.loading')}</p>;\n\tconst end = subscription ? periodEnd(subscription, locale) : null;\n\n\treturn (\n\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, marginBottom: 16 }}>\n\t\t\t\t<div style={styles.card}>\n\t\t\t\t\t<div style={styles.statLabel}>{t('billing.plan')}</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t\tmarginTop: 6,\n\t\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong style={{ fontSize: 18 }}>\n\t\t\t\t\t\t\t{subscription ? subscription.plan : t('billing.free')}\n\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span style={styles.muted}>· {intervalLabel(t, subscription.interval)}</span>\n\t\t\t\t\t\t\t\t<Pill tone={statusTone(subscription.status)}>\n\t\t\t\t\t\t\t\t\t{statusLabel(t, subscription.status)}\n\t\t\t\t\t\t\t\t</Pill>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span style={styles.muted}>{t('billing.noSubscription')}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t{end ? (\n\t\t\t\t\t\t<div style={styles.statHint}>\n\t\t\t\t\t\t\t{end.label} {end.date}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{subscription?.providerSubscriptionId ? (\n\t\t\t\t\t\t<div style={{ ...styles.statHint, fontFamily: 'var(--fonderie-mono,monospace)' }}>\n\t\t\t\t\t\t\t{subscription.providerSubscriptionId}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t<div style={styles.card}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div style={styles.statLabel}>{t('billing.credits')}</div>\n\t\t\t\t\t\t<form\n\t\t\t\t\t\t\tstyle={{ display: 'flex', gap: 4 }}\n\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsetCurrency(currencyDraft.trim().toUpperCase());\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tvalue={currencyDraft}\n\t\t\t\t\t\t\t\tonChange={(e) => setCurrencyDraft(e.target.value)}\n\t\t\t\t\t\t\t\tplaceholder={wallet?.currency ?? t('billing.currencyPlaceholder')}\n\t\t\t\t\t\t\t\tmaxLength={8}\n\t\t\t\t\t\t\t\tstyle={{ ...styles.input, height: 26, width: 84, fontSize: 12 }}\n\t\t\t\t\t\t\t\taria-label={t('billing.currencyLabel')}\n\t\t\t\t\t\t\t\ttitle={t('billing.currencyTitle')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</div>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div style={styles.statValue}>\n\t\t\t\t\t\t\t\t{wallet.balance}{' '}\n\t\t\t\t\t\t\t\t<span style={{ fontSize: 14, fontWeight: 500 }}>{wallet.currency}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div style={styles.statHint}>\n\t\t\t\t\t\t\t\t{t('billing.breakdown', {\n\t\t\t\t\t\t\t\t\tpermanent: wallet.purchased ?? '0',\n\t\t\t\t\t\t\t\t\tallowance: wallet.granted ?? '0',\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t{wallet.grantedExpiresAt\n\t\t\t\t\t\t\t\t\t? t('billing.expires', {\n\t\t\t\t\t\t\t\t\t\t\tdate: formatAdminDate(wallet.grantedExpiresAt, locale, 'date'),\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</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div style={styles.statHint}>{t('billing.noWallet')}</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{wallet ? (\n\t\t\t\t<form\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...styles.card,\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tgap: 8,\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\tmarginBottom: 16,\n\t\t\t\t\t}}\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t...(note ? { description: note } : {}),\n\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tsetGranted(\n\t\t\t\t\t\t\t\t\tt('billing.granted', { amount: amount.trim(), currency: wallet.currency }),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\tsetNote('');\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<strong style={{ fontSize: 13.5, marginRight: 4 }}>{t('billing.grantCredits')}</strong>\n\t\t\t\t\t<input\n\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\tplaceholder={t('billing.amountPlaceholder', { currency: wallet.currency })}\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 150 }}\n\t\t\t\t\t\taria-label={t('billing.amountLabel')}\n\t\t\t\t\t/>\n\t\t\t\t\t<input\n\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\tplaceholder={t('billing.reasonPlaceholder')}\n\t\t\t\t\t\tstyle={{ ...styles.input, flex: 1, minWidth: 180 }}\n\t\t\t\t\t\taria-label={t('billing.reasonLabel')}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tstyle={styles.buttonPrimary}\n\t\t\t\t\t\tdisabled={!/^\\d+$/.test(amount.trim())}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"plus\" size={14} />\n\t\t\t\t\t\t{t('billing.grant')}\n\t\t\t\t\t</button>\n\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t</form>\n\t\t\t) : null}\n\n\t\t\t{wallet ? (\n\t\t\t\tledger.length === 0 ? (\n\t\t\t\t\t<Empty icon=\"subscriber\" title={t('billing.noMovements')} />\n\t\t\t\t) : (\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}>{t('billing.col.when')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.col.kind')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.col.amount')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.col.note')}</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{ledger.map((tx) => (\n\t\t\t\t\t\t\t\t\t<tr key={tx.id}>\n\t\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\t{formatAdminDate(tx.createdAt, locale)}\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}>{ledgerKind(tx.type)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{tx.amount}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{tx.description ?? ''}</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\t{hasMoreLedger ? (\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, marginTop: 8 }}\n\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t('common.loadMore')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n","import { type AdminLocale, type BillingAdminClient, createAdminT } 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\tlocale?: AdminLocale | undefined;\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, locale }: ICatalogScreenProps) {\n\tconst t = createAdminT(locale);\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={t('catalog.title')}\n\t\t\t\tlead={t('catalog.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\t\tbusy={isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t/>\n\t\t\t\t}\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}>{t('common.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 }}>{t('catalog.configured')}</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}>{t('catalog.stored')}</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<Empty icon=\"catalog\" title={t('catalog.emptyTitle')}>\n\t\t\t\t\t\t\t{t('catalog.emptyBody')}\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}>{t('catalog.col.plan')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.tier')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.seats')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.monthly')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.yearly')}</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>{t('catalog.col.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}>\n\t\t\t\t\t\t\t\t\t\t\t{p.trialDays ? t('catalog.trialDays', { n: p.trialDays }) : '—'}\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<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(t('catalog.deleteConfirm', { name: 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\t{t('common.delete')}\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 {\n\ttype AdminLocale,\n\ttype BillingAdminClient,\n\ttype SubscriberType,\n\tcreateAdminT,\n} from '@fonderie/client';\nimport { useAdminSubscribers } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { intervalLabel, periodEnd, statusLabel, statusTone } from '../billing';\nimport { styles } from '../styles';\nimport { Empty, Icon, PageHeader, Pill, RefreshButton } from '../ui';\nimport { SubscriberBilling } from './SubscriberBilling';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n\tpageSize?: number;\n\t/**\n\t * A user subscriber opens on the Users page, where their plan and credits\n\t * live beside their account. Omit to open everything here.\n\t */\n\tonOpenUser?: (userId: string) => void;\n\tlocale?: AdminLocale | undefined;\n}\n\ntype FilterId = 'all' | 'active' | 'trialing' | 'pastDue' | 'canceled';\nconst FILTERS: Array<{ id: FilterId; match: (status: string) => boolean }> = [\n\t{ id: 'all', match: () => true },\n\t{ id: 'active', match: (s) => s === 'active' },\n\t{ id: 'trialing', match: (s) => s === 'trialing' },\n\t{ id: 'pastDue', match: (s) => s === 'past_due' || s === 'unpaid' },\n\t{ id: 'canceled', match: (s) => s === 'canceled' },\n];\n\n// Who pays, and who is behind. A money list: plans and statuses across users\n// and workspaces. A user's own billing (plan, credits, grants) is on their\n// page under Users; free users have no subscription and appear only there.\nexport function SubscriberScreen({\n\tclient,\n\tpageSize = 50,\n\tonOpenUser,\n\tlocale,\n}: ISubscriberScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst list = useAdminSubscribers(client, { limit: pageSize });\n\tconst [filter, setFilter] = useState<FilterId>('all');\n\tconst [open, setOpen] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst [type, setType] = useState<SubscriberType>('workspace');\n\tconst [idInput, setIdInput] = useState('');\n\n\tif (open) {\n\t\treturn (\n\t\t\t<div style={styles.container}>\n\t\t\t\t<PageHeader\n\t\t\t\t\ttitle={`${open.type}/${open.id}`}\n\t\t\t\t\tlead={t('billing.subscriptions.detailLead')}\n\t\t\t\t\tactions={\n\t\t\t\t\t\t<button type=\"button\" style={styles.buttonGhost} onClick={() => setOpen(null)}>\n\t\t\t\t\t\t\t<Icon name=\"back\" size={14} />\n\t\t\t\t\t\t\t{t('billing.subscriptions.back')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<SubscriberBilling client={client} subscriber={open} locale={locale} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst match = FILTERS.find((f) => f.id === filter)?.match ?? (() => true);\n\tconst rows = list.subscriptions.filter((s) => match(s.status));\n\tconst openRow = (t: SubscriberType, id: string) =>\n\t\tt === 'user' && onOpenUser ? onOpenUser(id) : setOpen({ type: t, id });\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<PageHeader\n\t\t\t\ttitle={t('billing.subscriptions.title')}\n\t\t\t\tlead={t('billing.subscriptions.lead')}\n\t\t\t\tactions={\n\t\t\t\t\t<RefreshButton\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tbusy={list.isLoading}\n\t\t\t\t\t\tlabel={t('common.refresh')}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<div style={{ ...styles.toolbar, justifyContent: 'space-between' }}>\n\t\t\t\t<fieldset\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\tflexWrap: 'wrap',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label={t('billing.subscriptions.filterLabel')}\n\t\t\t\t>\n\t\t\t\t\t{FILTERS.map((f) => {\n\t\t\t\t\t\tconst n = list.subscriptions.filter((s) => f.match(s.status)).length;\n\t\t\t\t\t\tconst on = filter === f.id;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={f.id}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={on}\n\t\t\t\t\t\t\t\tonClick={() => setFilter(f.id)}\n\t\t\t\t\t\t\t\tstyle={{ ...(on ? styles.buttonPrimary : styles.button), height: 28 }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t(`billing.subscriptions.filter.${f.id}`)}\n\t\t\t\t\t\t\t\t<span style={{ opacity: 0.7 }}>{n}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</fieldset>\n\t\t\t\t<form\n\t\t\t\t\tstyle={{ display: 'flex', gap: 6 }}\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (idInput.trim()) openRow(type, idInput.trim());\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<select\n\t\t\t\t\t\tvalue={type}\n\t\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\t\taria-label={t('billing.subscriptions.typeLabel')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"workspace\">{t('billing.subscriptions.typeWorkspace')}</option>\n\t\t\t\t\t\t<option value=\"user\">{t('billing.subscriptions.typeUser')}</option>\n\t\t\t\t\t</select>\n\t\t\t\t\t<input\n\t\t\t\t\t\tvalue={idInput}\n\t\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\t\tplaceholder={t('billing.subscriptions.idPlaceholder')}\n\t\t\t\t\t\tstyle={{ ...styles.input, width: 220 }}\n\t\t\t\t\t\taria-label={t('billing.subscriptions.idLabel')}\n\t\t\t\t\t/>\n\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!idInput.trim()}>\n\t\t\t\t\t\t<Icon name=\"search\" size={14} />\n\t\t\t\t\t\t{t('common.open')}\n\t\t\t\t\t</button>\n\t\t\t\t</form>\n\t\t\t</div>\n\t\t\t{list.error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{list.error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{rows.length === 0 && !list.isLoading ? (\n\t\t\t\t<Empty icon=\"subscriber\" title={t(`billing.subscriptions.empty.${filter}`)}>\n\t\t\t\t\t{t('billing.subscriptions.emptyHint')}\n\t\t\t\t</Empty>\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}>{t('billing.subscriptions.col.subscriber')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.subscriptions.col.plan')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.subscriptions.col.status')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('billing.subscriptions.col.renewsEnds')}</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{rows.map((s) => {\n\t\t\t\t\t\t\tconst end = periodEnd(s, locale);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<tr key={s.id}>\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<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.link, ...styles.mono }}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => openRow(s.subscriberType, s.subscriberId)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{s.subscriberType}/{s.subscriberId}\n\t\t\t\t\t\t\t\t\t\t</button>\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<strong>{s.plan}</strong>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>· {intervalLabel(t, s.interval)}</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<Pill tone={statusTone(s.status)}>{statusLabel(t, s.status)}</Pill>\n\t\t\t\t\t\t\t\t\t\t{s.cancelAtPeriodEnd && s.status !== 'canceled' ? (\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{' '}\n\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{t('billing.subscriptions.cancels')}\n\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</>\n\t\t\t\t\t\t\t\t\t\t) : null}\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{end ? (\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}>{end.label}</span> {end.date}\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<span style={styles.muted}>—</span>\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</tr>\n\t\t\t\t\t\t\t);\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{list.isLoading ? <p style={styles.status}>{t('common.loading')}</p> : null}\n\t\t\t{list.hasMore && !list.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 list.loadMore()}\n\t\t\t\t>\n\t\t\t\t\t{t('common.loadMore')}\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import {\n\ttype AdminLocale,\n\ttype AuditAdminClient,\n\tcreateAdminT,\n\tformatAdminDate,\n} 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\tlocale?: AdminLocale | undefined;\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, locale }: IAuditScreenProps) {\n\tconst t = createAdminT(locale);\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '', from: '', to: '' });\n\tconst [filter, setFilter] = useState<{\n\t\tworkspaceId?: string;\n\t\ttype?: string;\n\t\tactorId?: string;\n\t\tfrom?: Date;\n\t\tto?: Date;\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 title={t('audit.title')} lead={t('audit.lead')} />\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\t// Dates are whole days in the operator's time zone: \"to\" includes that day.\n\t\t\t\t\t\t...(draft.from ? { from: new Date(`${draft.from}T00:00:00`) } : {}),\n\t\t\t\t\t\t...(draft.to ? { to: new Date(`${draft.to}T23:59:59.999`) } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', t('audit.workspacePlaceholder'))}\n\t\t\t\t{field('type', t('audit.typePlaceholder'))}\n\t\t\t\t{field('actorId', t('audit.actorPlaceholder'))}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tvalue={draft.from}\n\t\t\t\t\tonChange={(e) => setDraft({ ...draft, from: e.target.value })}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label={t('audit.fromLabel')}\n\t\t\t\t\ttitle={t('audit.fromTitle')}\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tvalue={draft.to}\n\t\t\t\t\tonChange={(e) => setDraft({ ...draft, to: e.target.value })}\n\t\t\t\t\tstyle={styles.input}\n\t\t\t\t\taria-label={t('audit.toLabel')}\n\t\t\t\t\ttitle={t('audit.toTitle')}\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\t{t('common.filter')}\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\t{t('common.refresh')}\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={t('audit.empty')} />\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}>{t('audit.col.when')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.type')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.workspace')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.actor')}</th>\n\t\t\t\t\t\t\t<th style={styles.th}>{t('audit.col.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{formatAdminDate(e.createdAt, locale)}\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}>{t('common.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\t{t('common.loadMore')}\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":["createAdminT","useEffect","useState","jsx","jsxs","t","createAdminT","formatAdminDate","jsx","jsxs","t","createAdminT","formatAdminDate","createAdminT","Fragment","jsx","jsxs","t","createAdminT","createAdminT","Fragment","jsx","jsxs","t","createAdminT","createAdminT","useManifest","jsx","jsxs","t","createAdminT","useManifest","createAdminT","jsx","jsxs","t","createAdminT","createAdminT","jsx","jsxs","t","createAdminT","createAdminT","formatAdminDate","useState","Fragment","jsx","jsxs","t","useState","formatAdminDate","createAdminT","createAdminT","formatAdminDate","useState","Fragment","jsx","jsxs","t","createAdminT","useState","formatAdminDate","createAdminT","formatAdminDate","useState","createAdminT","formatAdminDate","useState","t","createAdminT","formatAdminDate","useState","Fragment","jsx","jsxs","t","createAdminT","useState","formatAdminDate","Fragment","jsx","jsxs","t","createAdminT","useState","formatAdminDate","createAdminT","Fragment","jsx","jsxs","t","createAdminT","createAdminT","useState","Fragment","jsx","jsxs","t","createAdminT","useState","createAdminT","formatAdminDate","useState","jsx","jsxs","t","createAdminT","useState","formatAdminDate","Fragment","jsx","jsxs","useState","useEffect","t","createAdminT"]}