@fonderie/react-admin-screens 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/index.cjs +141 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.js +141 -29
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.tsx","../src/styles.ts","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/ConfigScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["export type {\n\tAdminPage,\n\tIAdminLogScreenProps,\n\tIAdminShellProps,\n\tIAttentionScreenProps,\n\tIConfigScreenProps,\n\tIDoctorScreenProps,\n\tIModulesScreenProps,\n\tIRoutesScreenProps,\n\tITokensScreenProps,\n\tIUsersScreenProps,\n\tICatalogScreenProps,\n\tISubscriberScreenProps,\n\tIAuditScreenProps,\n} from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tAuditScreen,\n} from './screens';\n","import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\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| 'config'\n\t| 'routes'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\tauthClient?: AuthAdminClient;\n\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\tbillingClient?: BillingAdminClient;\n\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\tauditClient?: AuditAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tauthClient,\n\tbillingClient,\n\tauditClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n}: IAdminShellProps) {\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = {\n\t\tconfig: Boolean(configClient),\n\t\tcourier: Boolean(courierClient),\n\t\tauth: Boolean(authClient),\n\t\tbilling: Boolean(billingClient),\n\t\taudit: Boolean(auditClient),\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'config':\n\t\t\tbody = <ConfigScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to see the catalog here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'subscriber':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<SubscriberScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to look up subscribers here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'audit':\n\t\t\tbody = auditClient ? (\n\t\t\t\t<AuditScreen client={auditClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuditAdminClient to see the audit trail here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'users':\n\t\t\tbody = authClient ? (\n\t\t\t\t<UsersScreen client={authClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuthAdminClient to look up users here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={styles.status}>Pass a ConfigAdminClient to manage config and secrets here.</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={styles.status}>Pass a CourierAdminClient to manage templates here.</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div style={styles.shell}>\n\t\t\t<nav style={styles.nav} aria-label=\"Admin\">\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, ...(current === i.page ? styles.navItemActive : {}) }}\n\t\t\t\t\t\t\t\t\taria-current={current === i.page ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\tgo(i.page);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{i.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t\t<main style={styles.main}>{body}</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: 'system-ui, sans-serif',\n\t\tcolor: '#111',\n\t},\n\tnav: { width: 220, borderRight: '1px solid #eee', padding: 16, flexShrink: 0 },\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: '#888',\n\t\tmargin: '16px 0 6px',\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: 6,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: '#111',\n\t},\n\tnavItemActive: { background: '#f3f4f6', fontWeight: 600 },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: { fontSize: 20, fontWeight: 700, marginTop: 0, marginBottom: 12 },\n\tsubtitle: { fontSize: 15, fontWeight: 600, marginTop: 24, marginBottom: 8 },\n\tstatus: { padding: 12, color: '#666' },\n\terror: { color: '#e11d48', marginBottom: 12, fontSize: 14 },\n\tok: { color: '#15803d', fontWeight: 600 },\n\tbad: { color: '#e11d48', fontWeight: 600 },\n\tadvice: { color: '#b45309' },\n\tmuted: { color: '#666', fontSize: 13 },\n\tmono: { fontFamily: 'ui-monospace, monospace', fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: '1px solid #ddd',\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: '#444',\n\t},\n\ttd: { borderBottom: '1px solid #eee', padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: '1px solid #eee', padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: '#f3f4f6',\n\t},\n\tbutton: {\n\t\tbackground: 'none',\n\t\tborder: '1px solid #ddd',\n\t\tborderRadius: 8,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Admin log</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{e.method} {e.path}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<span style={e.status >= 400 ? styles.bad : styles.ok}>{e.status}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\n\n// What needs the operator today. Empty is green.\nexport function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Attention</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : attention?.items.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\tNothing needs you. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{attention?.items.map((item) => (\n\t\t\t\t\t\t<li key={`${item.source}:${item.message}`} style={styles.row}>\n\t\t\t\t\t\t\t<span style={item.severity === 'error' ? styles.bad : styles.advice}>\n\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span> — {item.message}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IConfigScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function ConfigScreen({ client }: IConfigScreenProps) {\n\tconst { report, isLoading, error } = useAdminConfig(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Configuration</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>{' '}\n\t\t\t\t\t\t\t\t{m.problems.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tm.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t\t<h2 style={styles.subtitle}>Environment</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.name} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t{e.set ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>set</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>missing</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Doctor</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRun again\n\t\t\t\t</button>\n\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t<span style={report.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t<li key={c.name} style={styles.row}>\n\t\t\t\t\t\t\t<span style={c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t\t\t{c.skipped ? 'skipped' : c.ok ? 'ok' : 'failed'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t{c.module} · {c.durationMs} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{c.skipped ? <div style={styles.muted}>{c.skipped}</div> : null}\n\t\t\t\t\t\t\t{c.findings.map((f) => (\n\t\t\t\t\t\t\t\t<div key={f} style={c.ok ? styles.advice : styles.bad}>\n\t\t\t\t\t\t\t\t\t{f}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Modules</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<>\n\t\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\t\t{manifest.env} · admin {manifest.admin.version} · admin log{' '}\n\t\t\t\t\t\t{manifest.admin.log ? 'on' : 'off'} · {manifest.routes.length} routes\n\t\t\t\t\t</p>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Describes admin</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{m.name}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>error</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.describesAdmin ? 'yes' : <span style={styles.muted}>no</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Routes</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.method}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<span style={styles.badge}>{r.guard}</span>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\n\nexport function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error } = useAdminTokens(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Admin token</h2>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\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</p>\n\t\t\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t\t\t{report.legacy.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.legacy.map((l) => (\n\t\t\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuthAdminClient } from '@fonderie/client';\nimport { useAdminLoginHistory, useAdminUser, useAdminUserSessions } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n}\n\n// Why can't this person log in. Look up by email, see the account, its live\n// sessions and recent sign-ins; suspend, unsuspend, or sign them out everywhere.\nexport function UsersScreen({ client }: IUsersScreenProps) {\n\tconst [input, setInput] = useState('');\n\tconst [email, setEmail] = useState<string | undefined>(undefined);\n\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\tclient,\n\t\temail ? { email } : {},\n\t);\n\tconst userId = user?.id ?? null;\n\tconst sessions = useAdminUserSessions(client, userId);\n\tconst history = useAdminLoginHistory(client, userId, { limit: 20 });\n\n\tconst yesNo = (v: boolean) =>\n\t\tv ? <span style={styles.ok}>yes</span> : <span style={styles.muted}>no</span>;\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Users</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetEmail(input.trim() || undefined);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"email address\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Email\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? 'No user with that email.' : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{user ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t{user.firstName || user.lastName\n\t\t\t\t\t\t\t? `${user.firstName} ${user.lastName}`.trim()\n\t\t\t\t\t\t\t: user.email}{' '}\n\t\t\t\t\t\t{user.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t{user.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>id</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{user.id}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>email</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.email} · verified {yesNo(user.isEmailVerified)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>MFA</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{yesNo(user.mfaEnabled)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.provider || 'password'}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ' · no password set'}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>last login</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.lastLogin ? (\n\t\t\t\t\t\t\t\t\t\tnew Date(user.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>never</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>created</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(user.createdAt).toLocaleString()}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t{user.suspended ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tUnsuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tonClick={() => void revokeSessions().then(() => sessions.refresh())}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign out everywhere\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Live sessions</h2>\n\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\t\t\t\t\t\t<li key={s.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{s.userAgent ?? ''}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>since {new Date(s.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Recent sign-ins</h2>\n\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>None recorded.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={e.outcome === 'success' ? styles.ok : styles.bad}>{e.outcome}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{new Date(e.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{history.hasMore && !history.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void history.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ICatalogScreenProps {\n\tclient: BillingAdminClient;\n}\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport function CatalogScreen({ client }: ICatalogScreenProps) {\n\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(client);\n\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Catalog</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{isLoading && !catalog ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{catalog ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Configured (code)</h2>\n\t\t\t\t\t<pre style={{ ...styles.mono, background: '#f9fafb', padding: 12, overflowX: 'auto' }}>\n\t\t\t\t\t\t{JSON.stringify(catalog.configured, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t\t<h2 style={styles.subtitle}>Stored (database)</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No stored plans.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Tier</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Seats</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Monthly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Yearly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Trial</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{catalog.stored.map((p) => (\n\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{p.name}</strong>\n\t\t\t\t\t\t\t\t\t\t\t{p.description ? <div style={styles.muted}>{p.description}</div> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.tier}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.seats ?? '∞'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{money(p.pricing?.monthly)} {p.pricing?.currency ?? ''}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{money(p.pricing?.yearly)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.trialDays ? `${p.trialDays} d` : '—'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n}\n\n// What is this subscriber on, what does their wallet hold, what moved — and\n// the one write: a manual grant, idempotency-keyed.\nexport function SubscriberScreen({ client }: ISubscriberScreenProps) {\n\tconst [type, setType] = useState<SubscriberType>('user');\n\tconst [idInput, setIdInput] = useState('');\n\tconst [subscriber, setSubscriber] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20 });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Subscriber</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetGranted(null);\n\t\t\t\t\tsetSubscriber(idInput.trim() ? { type, id: idInput.trim() } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<select\n\t\t\t\t\tvalue={type}\n\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\taria-label=\"Type\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"user\">user</option>\n\t\t\t\t\t<option value=\"workspace\">workspace</option>\n\t\t\t\t</select>\n\t\t\t\t<input\n\t\t\t\t\tvalue={idInput}\n\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"subscriber id\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Subscriber id\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{subscriber && !isLoading ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Subscription</h2>\n\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>plan</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<strong>{subscription.plan}</strong> · {subscription.interval}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>status</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.status}\n\t\t\t\t\t\t\t\t\t\t{subscription.cancelAtPeriodEnd ? ' · cancels at period end' : ''}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>period</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodStart\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodStart).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}{' '}\n\t\t\t\t\t\t\t\t\t\t→{' '}\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{subscription.providerSubscriptionId ?? '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No subscription.</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Wallet</h2>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t<strong>{wallet.balance}</strong> {wallet.currency}{' '}\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t(granted {wallet.granted ?? '0'} · purchased {wallet.purchased ?? '0'}) · minor\n\t\t\t\t\t\t\t\t\tunits, precision {wallet.precision}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t\t\t\t...(note ? { description: note } : {}),\n\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\tsetGranted(`Granted ${amount.trim()} ${wallet.currency}.`);\n\t\t\t\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\t\t\t\tsetNote('');\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"amount (minor units)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\t\t\taria-label=\"Amount\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"reason (optional)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 220 }}\n\t\t\t\t\t\t\t\t\taria-label=\"Reason\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!/^\\d+$/.test(amount.trim())}>\n\t\t\t\t\t\t\t\t\tGrant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>Ledger</h2>\n\t\t\t\t\t\t\t{ledger.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>Nothing moved yet.</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Kind</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Amount</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Note</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t{ledger.map((t) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{t.type}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.amount}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{t.description ?? ''}</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasMoreLedger ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No wallet — billing has no wallet configuration.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuditAdminClient } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IAuditScreenProps {\n\tclient: AuditAdminClient;\n\tpageSize?: number;\n}\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport function AuditScreen({ client, pageSize = 50 }: IAuditScreenProps) {\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '' });\n\tconst [filter, setFilter] = useState<{ workspaceId?: string; type?: string; actorId?: string }>(\n\t\t{},\n\t);\n\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(client, {\n\t\t...filter,\n\t\tlimit: pageSize,\n\t});\n\tconst field = (key: keyof typeof draft, placeholder: string) => (\n\t\t<input\n\t\t\tvalue={draft[key]}\n\t\t\tonChange={(e) => setDraft({ ...draft, [key]: e.target.value })}\n\t\t\tplaceholder={placeholder}\n\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\taria-label={placeholder}\n\t\t/>\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Audit</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetFilter({\n\t\t\t\t\t\t...(draft.workspaceId.trim() ? { workspaceId: draft.workspaceId.trim() } : {}),\n\t\t\t\t\t\t...(draft.type.trim() ? { type: draft.type.trim() } : {}),\n\t\t\t\t\t\t...(draft.actorId.trim() ? { actorId: draft.actorId.trim() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', 'workspace id (all if empty)')}\n\t\t\t\t{field('type', 'event type')}\n\t\t\t\t{field('actorId', 'actor id')}\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tFilter\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{events.length === 0 && !isLoading ? (\n\t\t\t\t<p style={styles.muted}>Nothing recorded for this filter.</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Type</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Workspace</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{events.map((e) => (\n\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t{new Date(e.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.type}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{String(e.payload['workspaceId'] ?? '—')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.actorId ?? '—'}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.requestId ?? ''}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t>\n\t\t\t\t\tLoad more\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQA,wCAAqD;AACrD,yCAAyD;AACzD,IAAAA,gBAAyB;;;ACNlB,IAAM,SAAwC;AAAA,EACpD,OAAO;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,EACR;AAAA,EACA,KAAK,EAAE,OAAO,KAAK,aAAa,kBAAkB,SAAS,IAAI,YAAY,EAAE;AAAA,EAC7E,UAAU;AAAA,IACT,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,EACR;AAAA,EACA,eAAe,EAAE,YAAY,WAAW,YAAY,IAAI;AAAA,EACxD,MAAM,EAAE,MAAM,GAAG,SAAS,IAAI,UAAU,IAAI;AAAA,EAC5C,WAAW,EAAE,SAAS,IAAI,UAAU,IAAI;AAAA,EACxC,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,WAAW,GAAG,cAAc,GAAG;AAAA,EACvE,UAAU,EAAE,UAAU,IAAI,YAAY,KAAK,WAAW,IAAI,cAAc,EAAE;AAAA,EAC1E,QAAQ,EAAE,SAAS,IAAI,OAAO,OAAO;AAAA,EACrC,OAAO,EAAE,OAAO,WAAW,cAAc,IAAI,UAAU,GAAG;AAAA,EAC1D,IAAI,EAAE,OAAO,WAAW,YAAY,IAAI;AAAA,EACxC,KAAK,EAAE,OAAO,WAAW,YAAY,IAAI;AAAA,EACzC,QAAQ,EAAE,OAAO,UAAU;AAAA,EAC3B,OAAO,EAAE,OAAO,QAAQ,UAAU,GAAG;AAAA,EACrC,MAAM,EAAE,YAAY,2BAA2B,UAAU,GAAG;AAAA,EAC5D,OAAO,EAAE,OAAO,QAAQ,gBAAgB,YAAY,UAAU,GAAG;AAAA,EACjE,IAAI;AAAA,IACH,WAAW;AAAA,IACX,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,EACR;AAAA,EACA,IAAI,EAAE,cAAc,kBAAkB,SAAS,WAAW,eAAe,MAAM;AAAA,EAC/E,MAAM,EAAE,WAAW,QAAQ,SAAS,GAAG,QAAQ,EAAE;AAAA,EACjD,KAAK,EAAE,cAAc,kBAAkB,SAAS,QAAQ;AAAA,EACxD,OAAO;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,EACX;AAAA,EACA,SAAS,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,UAAU,cAAc,GAAG;AAC5E;;;ACrEA,yBAA4B;AAezB;AANI,SAAS,eAAe,EAAE,QAAQ,WAAW,GAAG,GAAyB;AAC/E,QAAM,EAAE,SAAS,SAAS,WAAW,OAAO,SAAS,SAAS,QAAI,gCAAY,QAAQ;AAAA,IACrF,OAAO;AAAA,EACR,CAAC;AACD,SACC,6CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,iDAAC,SAAI,OAAO,OAAO,SAClB;AAAA,kDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,GAAG,uBAAS;AAAA,MAC1D;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO,OAAO;AAAA,UACd,SAAS,MAAM,KAAK,QAAQ;AAAA,UAC5B,UAAU;AAAA,UACV;AAAA;AAAA,MAED;AAAA,OACD;AAAA,IACC,QACA,4CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,WAAW,MACf,0DACA,MAAM,aACV,IAEA,4EACC;AAAA,mDAAC,WAAM,OAAO,OAAO,OACpB;AAAA,oDAAC,WACA,uDAAC,QACA;AAAA,sDAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,UAC1B,4CAAC,QAAG,OAAO,OAAO,IAAI,mBAAK;AAAA,UAC3B,4CAAC,QAAG,OAAO,OAAO,IAAI,qBAAO;AAAA,UAC7B,4CAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,UAC5B,4CAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,WAC7B,GACD;AAAA,QACA,4CAAC,WACC,kBAAQ,IAAI,CAAC,MACb,6CAAC,QACA;AAAA,sDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GACzC,cAAI,KAAK,EAAE,EAAE,EAAE,eAAe,GAChC;AAAA,UACA,4CAAC,QAAG,OAAO,OAAO,IAAK,YAAE,OAAM;AAAA,UAC/B,6CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GACxC;AAAA,cAAE;AAAA,YAAO;AAAA,YAAE,EAAE;AAAA,aACf;AAAA,UACA,6CAAC,QAAG,OAAO,OAAO,IACjB;AAAA,wDAAC,UAAK,OAAO,EAAE,UAAU,MAAM,OAAO,MAAM,OAAO,IAAK,YAAE,QAAO;AAAA,YAAQ;AAAA,YACzE,6CAAC,UAAK,OAAO,OAAO,OAAQ;AAAA,gBAAE;AAAA,cAAW;AAAA,eAAG;AAAA,aAC7C;AAAA,UACA,4CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GAAI,YAAE,QAAO;AAAA,aAZhD,EAAE,EAaX,CACA,GACF;AAAA,SACD;AAAA,MACC,YAAY,4CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAAO;AAAA,MACpD,WAAW,CAAC,YACZ;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,GAAG;AAAA,UACzC,SAAS,MAAM,KAAK,SAAS;AAAA,UAC7B;AAAA;AAAA,MAED,IACG;AAAA,OACL;AAAA,KAEF;AAEF;;;AC7EA,IAAAC,sBAA6B;AAY1B,IAAAC,sBAAA;AAJI,SAAS,gBAAgB,EAAE,OAAO,GAA0B;AAClE,QAAM,EAAE,WAAW,WAAW,OAAO,QAAQ,QAAI,kCAAa,MAAM;AACpE,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,kDAAC,SAAI,OAAO,OAAO,SAClB;AAAA,mDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,GAAG,uBAAS;AAAA,MAC1D;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO,OAAO;AAAA,UACd,SAAS,MAAM,KAAK,QAAQ;AAAA,UAC5B,UAAU;AAAA,UACV;AAAA;AAAA,MAED;AAAA,OACD;AAAA,IACC,aAAa,CAAC,YACd,6CAAC,OAAE,OAAO,OAAO,QAAQ,sCAAmB,IACzC,QACH,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG,WAAW,MAAM,WAAW,IAC/B,8CAAC,OAAE,OAAO,OAAO,IAAI;AAAA;AAAA,MACQ,IAAI,KAAK,UAAU,WAAW,EAAE,eAAe;AAAA,MAAE;AAAA,OAC9E,IAEA,6CAAC,QAAG,OAAO,OAAO,MAChB,qBAAW,MAAM,IAAI,CAAC,SACtB,8CAAC,QAA0C,OAAO,OAAO,KACxD;AAAA,mDAAC,UAAK,OAAO,KAAK,aAAa,UAAU,OAAO,MAAM,OAAO,QAC3D,eAAK,aAAa,UAAU,UAAU,UACxC;AAAA,MAAQ;AAAA,MACR,6CAAC,UAAK,OAAO,OAAO,MAAO,eAAK,QAAO;AAAA,MAAO;AAAA,MAAI,KAAK;AAAA,SAJ/C,GAAG,KAAK,MAAM,IAAI,KAAK,OAAO,EAKvC,CACA,GACF;AAAA,KAEF;AAEF;;;AC/CA,IAAAC,sBAA+B;AAa5B,IAAAC,sBAAA;AAJI,SAAS,aAAa,EAAE,OAAO,GAAuB;AAC5D,QAAM,EAAE,QAAQ,WAAW,MAAM,QAAI,oCAAe,MAAM;AAC1D,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,iDAAC,QAAG,OAAO,OAAO,OAAO,2BAAa;AAAA,IACrC,YACA,6CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAC9B,QACH,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG,SACH,8EACC;AAAA,mDAAC,QAAG,OAAO,OAAO,UAAU,uBAAS;AAAA,MACrC,6CAAC,QAAG,OAAO,OAAO,MAChB,iBAAO,QAAQ,IAAI,CAAC,MACpB,8CAAC,QAAgB,OAAO,OAAO,KAC9B;AAAA,qDAAC,UAAK,OAAO,OAAO,MAAO,YAAE,MAAK;AAAA,QAAQ;AAAA,QACzC,EAAE,SAAS,WAAW,IACtB,6CAAC,UAAK,OAAO,OAAO,IAAI,gBAAE,IAE1B,EAAE,SAAS,IAAI,CAAC,MACf;AAAA,UAAC;AAAA;AAAA,YAEA,OAAO,EAAE,aAAa,UAAU,OAAO,MAAM,OAAO;AAAA,YAEnD,YAAE;AAAA;AAAA,UAHE,EAAE;AAAA,QAIR,CACA;AAAA,WAZM,EAAE,IAcX,CACA,GACF;AAAA,MACA,6CAAC,QAAG,OAAO,OAAO,UAAU,yBAAW;AAAA,MACtC,OAAO,IAAI,WAAW,IACtB,6CAAC,OAAE,OAAO,OAAO,OAAO,qEAAkD,IAE1E,6CAAC,QAAG,OAAO,OAAO,MAChB,iBAAO,IAAI,IAAI,CAAC,MAChB,8CAAC,QAAgB,OAAO,OAAO,KAC9B;AAAA,qDAAC,UAAK,OAAO,OAAO,MAAO,YAAE,MAAK;AAAA,QAAQ;AAAA,QACzC,EAAE,MACF,6CAAC,UAAK,OAAO,OAAO,IAAI,iBAAG,IAE3B,6CAAC,UAAK,OAAO,OAAO,KAAK,qBAAO;AAAA,WALzB,EAAE,IAOX,CACA,GACF;AAAA,OAEF,IACG;AAAA,KACL;AAEF;;;AC/DA,IAAAC,sBAA0B;AAavB,IAAAC,sBAAA;AAJI,SAAS,aAAa,EAAE,OAAO,GAAuB;AAC5D,QAAM,EAAE,QAAQ,WAAW,OAAO,QAAQ,QAAI,+BAAU,MAAM;AAC9D,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,kDAAC,SAAI,OAAO,OAAO,SAClB;AAAA,mDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,GAAG,oBAAM;AAAA,MACvD;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO,OAAO;AAAA,UACd,SAAS,MAAM,KAAK,QAAQ;AAAA,UAC5B,UAAU;AAAA,UACV;AAAA;AAAA,MAED;AAAA,MACC,UAAU,CAAC,YACX,6CAAC,UAAK,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,KAC1C,iBAAO,KAAK,oBAAoB,kBAClC,IACG;AAAA,OACL;AAAA,IACC,aAAa,CAAC,SACd,6CAAC,OAAE,OAAO,OAAO,QAAQ,sCAAmB,IACzC,QACH,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IAEA,6CAAC,QAAG,OAAO,OAAO,MAChB,kBAAQ,OAAO,IAAI,CAAC,MACpB,8CAAC,QAAgB,OAAO,OAAO,KAC9B;AAAA,mDAAC,UAAK,OAAO,EAAE,UAAU,OAAO,QAAQ,EAAE,KAAK,OAAO,KAAK,OAAO,KAChE,YAAE,UAAU,YAAY,EAAE,KAAK,OAAO,UACxC;AAAA,MAAQ;AAAA,MACR,6CAAC,UAAK,OAAO,OAAO,MAAO,YAAE,MAAK;AAAA,MAAQ;AAAA,MAC1C,8CAAC,UAAK,OAAO,OAAO,OAClB;AAAA,UAAE;AAAA,QAAO;AAAA,QAAI,EAAE;AAAA,QAAW;AAAA,SAC5B;AAAA,MACC,EAAE,UAAU,6CAAC,SAAI,OAAO,OAAO,OAAQ,YAAE,SAAQ,IAAS;AAAA,MAC1D,EAAE,SAAS,IAAI,CAAC,MAChB,6CAAC,SAAY,OAAO,EAAE,KAAK,OAAO,SAAS,OAAO,KAChD,eADQ,CAEV,CACA;AAAA,SAbO,EAAE,IAcX,CACA,GACF;AAAA,KAEF;AAEF;;;AC1DA,IAAAC,sBAA4B;AAazB,IAAAC,sBAAA;AAJI,SAAS,cAAc,EAAE,OAAO,GAAwB;AAC9D,QAAM,EAAE,UAAU,WAAW,MAAM,QAAI,iCAAY,MAAM;AACzD,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,iDAAC,QAAG,OAAO,OAAO,OAAO,qBAAO;AAAA,IAC/B,YACA,6CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAC9B,QACH,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG,WACH,8EACC;AAAA,oDAAC,OAAE,OAAO,OAAO,OACf;AAAA,iBAAS;AAAA,QAAI;AAAA,QAAU,SAAS,MAAM;AAAA,QAAQ;AAAA,QAAa;AAAA,QAC3D,SAAS,MAAM,MAAM,OAAO;AAAA,QAAM;AAAA,QAAI,SAAS,OAAO;AAAA,QAAO;AAAA,SAC/D;AAAA,MACA,8CAAC,WAAM,OAAO,OAAO,OACpB;AAAA,qDAAC,WACA,wDAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,UAC5B,6CAAC,QAAG,OAAO,OAAO,IAAI,qBAAO;AAAA,UAC7B,6CAAC,QAAG,OAAO,OAAO,IAAI,uBAAS;AAAA,UAC/B,6CAAC,QAAG,OAAO,OAAO,IAAI,6BAAe;AAAA,WACtC,GACD;AAAA,QACA,6CAAC,WACC,mBAAS,QAAQ,IAAI,CAAC,MACtB,8CAAC,QACA;AAAA,uDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,YAAE,MAAK;AAAA,UACrD,6CAAC,QAAG,OAAO,OAAO,IAChB,YAAE,WAAW,6CAAC,UAAK,OAAO,OAAO,OAAO,0BAAY,GACtD;AAAA,UACA,8CAAC,QAAG,OAAO,OAAO,IAChB;AAAA,cAAE,UAAU,KACZ,6CAAC,UAAK,OAAO,OAAO,IAAI,gBAAE,IAE1B,6CAAC,UAAK,OAAO,OAAO,KAAK,mBAAK;AAAA,YAE9B,EAAE,UAAU,SAAS,IAAI,CAAC,MAC1B;AAAA,cAAC;AAAA;AAAA,gBAEA,OAAO,EAAE,aAAa,UAAU,OAAO,MAAM,OAAO;AAAA,gBAEnD,YAAE;AAAA;AAAA,cAHE,EAAE;AAAA,YAIR,CACA;AAAA,aACF;AAAA,UACA,6CAAC,QAAG,OAAO,OAAO,IAChB,YAAE,iBAAiB,QAAQ,6CAAC,UAAK,OAAO,OAAO,OAAO,gBAAE,GAC1D;AAAA,aAtBQ,EAAE,IAuBX,CACA,GACF;AAAA,SACD;AAAA,OACD,IACG;AAAA,KACL;AAEF;;;ACpEA,IAAAC,sBAA+B;AAW5B,IAAAC,sBAAA;AAJI,SAAS,aAAa,EAAE,OAAO,GAAuB;AAC5D,QAAM,EAAE,QAAQ,WAAW,MAAM,QAAI,oCAAe,MAAM;AAC1D,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,iDAAC,QAAG,OAAO,OAAO,OAAO,oBAAM;AAAA,IAC9B,YACA,6CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAC9B,QACH,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IAEA,8CAAC,WAAM,OAAO,OAAO,OACpB;AAAA,mDAAC,WACA,wDAAC,QACA;AAAA,qDAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,QAC5B,6CAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,QAC1B,6CAAC,QAAG,OAAO,OAAO,IAAI,mBAAK;AAAA,QAC3B,6CAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,SAC7B,GACD;AAAA,MACA,6CAAC,WACC,kBAAQ,OAAO,IAAI,CAAC,MACpB,8CAAC,QACA;AAAA,qDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,YAAE,QAAO;AAAA,QACvD,6CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,YAAE,MAAK;AAAA,QACrD,6CAAC,QAAG,OAAO,OAAO,IACjB,uDAAC,UAAK,OAAO,OAAO,OAAQ,YAAE,OAAM,GACrC;AAAA,QACA,6CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GAAI,YAAE,UAAU,eAAc;AAAA,WANjE,GAAG,EAAE,MAAM,IAAI,EAAE,IAAI,EAO9B,CACA,GACF;AAAA,OACD;AAAA,KAEF;AAEF;;;AC5CA,IAAAC,sBAA+B;AAW5B,IAAAC,sBAAA;AAJI,SAAS,aAAa,EAAE,OAAO,GAAuB;AAC5D,QAAM,EAAE,QAAQ,WAAW,MAAM,QAAI,oCAAe,MAAM;AAC1D,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,iDAAC,QAAG,OAAO,OAAO,OAAO,oBAAM;AAAA,IAC9B,YACA,6CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAC9B,QACH,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG,SACH,8EACC;AAAA,mDAAC,QAAG,OAAO,OAAO,UAAU,yBAAW;AAAA,MACvC,8CAAC,OACC;AAAA,eAAO,MAAM,KACb,6CAAC,UAAK,OAAO,OAAO,IAAI,oBAAM,IAE9B,6CAAC,UAAK,OAAO,OAAO,KAAK,kBAAI;AAAA,QAE7B,OAAO,MAAM,SAAS,IAAI,CAAC,MAC3B,6CAAC,SAAoB,OAAO,OAAO,KACjC,YAAE,WADM,EAAE,OAEZ,CACA;AAAA,SACF;AAAA,MACA,6CAAC,QAAG,OAAO,OAAO,UAAU,qCAAuB;AAAA,MAClD,OAAO,OAAO,WAAW,IACzB,6CAAC,OAAE,OAAO,OAAO,OAAO,8EAA2D,IAEnF,6CAAC,QAAG,OAAO,OAAO,MAChB,iBAAO,OAAO,IAAI,CAAC,MACnB,8CAAC,QAAkB,OAAO,OAAO,KAChC;AAAA,qDAAC,UAAK,OAAO,OAAO,MAAO,YAAE,QAAO;AAAA,QAAQ;AAAA,QAC5C,6CAAC,UAAK,OAAO,OAAO,OAAO,mFAE3B;AAAA,WAJQ,EAAE,MAKX,CACA,GACF;AAAA,OAEF,IACG;AAAA,KACL;AAEF;;;ACpDA,IAAAC,sBAAyE;AACzE,mBAAyB;AAqBnB,IAAAC,sBAAA;AAZC,SAAS,YAAY,EAAE,OAAO,GAAsB;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA6B,MAAS;AAChE,QAAM,EAAE,MAAM,WAAW,OAAO,SAAS,WAAW,eAAe,QAAI;AAAA,IACtE;AAAA,IACA,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EACtB;AACA,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,eAAW,0CAAqB,QAAQ,MAAM;AACpD,QAAM,cAAU,0CAAqB,QAAQ,QAAQ,EAAE,OAAO,GAAG,CAAC;AAElE,QAAM,QAAQ,CAAC,MACd,IAAI,6CAAC,UAAK,OAAO,OAAO,IAAI,iBAAG,IAAU,6CAAC,UAAK,OAAO,OAAO,OAAO,gBAAE;AAEvE,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,iDAAC,QAAG,OAAO,OAAO,OAAO,mBAAK;AAAA,IAC9B;AAAA,MAAC;AAAA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,UAAU,CAAC,MAAM;AAChB,YAAE,eAAe;AACjB,mBAAS,MAAM,KAAK,KAAK,MAAS;AAAA,QACnC;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,aAAY;AAAA,cACZ,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,QAAQ,UAAU,IAAI;AAAA,cACzD,cAAW;AAAA;AAAA,UACZ;AAAA,UACA,6CAAC,YAAO,MAAK,UAAS,OAAO,OAAO,QAAQ,UAAU,WAAW,qBAEjE;AAAA;AAAA;AAAA,IACD;AAAA,IACC,QACA,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,WAAW,MAAM,6BAA6B,MAAM,aAC5D,IACG;AAAA,IACH,OACA,8EACC;AAAA,oDAAC,QAAG,OAAO,OAAO,UAChB;AAAA,aAAK,aAAa,KAAK,WACrB,GAAG,KAAK,SAAS,IAAI,KAAK,QAAQ,GAAG,KAAK,IAC1C,KAAK;AAAA,QAAO;AAAA,QACd,KAAK,YAAY,6CAAC,UAAK,OAAO,OAAO,OAAO,uBAAS,IAAU;AAAA,QAC/D,KAAK,YAAY,6CAAC,UAAK,OAAO,OAAO,OAAO,qBAAO,IAAU;AAAA,SAC/D;AAAA,MACA,6CAAC,WAAM,OAAO,OAAO,OACpB,wDAAC,WACA;AAAA,sDAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,gBAAE;AAAA,UACxB,6CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,eAAK,IAAG;AAAA,WACvD;AAAA,QACA,8CAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,mBAAK;AAAA,UAC3B,8CAAC,QAAG,OAAO,OAAO,IAChB;AAAA,iBAAK;AAAA,YAAM;AAAA,YAAa,MAAM,KAAK,eAAe;AAAA,aACpD;AAAA,WACD;AAAA,QACA,8CAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,iBAAG;AAAA,UACzB,6CAAC,QAAG,OAAO,OAAO,IAAK,gBAAM,KAAK,UAAU,GAAE;AAAA,WAC/C;AAAA,QACA,8CAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,sBAAQ;AAAA,UAC9B,8CAAC,QAAG,OAAO,OAAO,IAChB;AAAA,iBAAK,YAAY;AAAA,YACjB,KAAK,cAAc,KAAK;AAAA,aAC1B;AAAA,WACD;AAAA,QACA,8CAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,wBAAU;AAAA,UAChC,6CAAC,QAAG,OAAO,OAAO,IAChB,eAAK,YACL,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,IAExC,6CAAC,UAAK,OAAO,OAAO,OAAO,mBAAK,GAElC;AAAA,WACD;AAAA,QACA,8CAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,qBAAO;AAAA,UAC7B,6CAAC,QAAG,OAAO,OAAO,IAAK,cAAI,KAAK,KAAK,SAAS,EAAE,eAAe,GAAE;AAAA,WAClE;AAAA,SACD,GACD;AAAA,MACA,8CAAC,SAAI,OAAO,EAAE,GAAG,OAAO,SAAS,WAAW,GAAG,GAC7C;AAAA,aAAK,YACL;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,OAAO,OAAO;AAAA,YACd,SAAS,MAAM,KAAK,UAAU;AAAA,YAC9B,UAAU;AAAA,YACV;AAAA;AAAA,QAED,IAEA;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,OAAO,OAAO;AAAA,YACd,SAAS,MAAM,KAAK,QAAQ;AAAA,YAC5B,UAAU;AAAA,YACV;AAAA;AAAA,QAED;AAAA,QAED;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,OAAO,OAAO;AAAA,YACd,SAAS,MAAM,KAAK,eAAe,EAAE,KAAK,MAAM,SAAS,QAAQ,CAAC;AAAA,YAClE,UAAU;AAAA,YACV;AAAA;AAAA,QAED;AAAA,SACD;AAAA,MAEA,6CAAC,QAAG,OAAO,OAAO,UAAU,2BAAa;AAAA,MACxC,SAAS,SAAS,WAAW,IAC7B,6CAAC,OAAE,OAAO,OAAO,OAAO,mBAAK,IAE7B,6CAAC,QAAG,OAAO,OAAO,MAChB,mBAAS,SAAS,IAAI,CAAC,MACvB,8CAAC,QAAc,OAAO,OAAO,KAC5B;AAAA,qDAAC,UAAK,OAAO,OAAO,MAAO,YAAE,aAAa,UAAI;AAAA,QAAQ;AAAA,QACtD,6CAAC,UAAK,OAAO,OAAO,OAAQ,YAAE,aAAa,IAAG;AAAA,QAAQ;AAAA,QACtD,8CAAC,UAAK,OAAO,OAAO,OAAO;AAAA;AAAA,UAAO,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe;AAAA,WAAE;AAAA,WAHjE,EAAE,EAIX,CACA,GACF;AAAA,MAGD,6CAAC,QAAG,OAAO,OAAO,UAAU,6BAAe;AAAA,MAC1C,QAAQ,OAAO,WAAW,KAAK,CAAC,QAAQ,YACxC,6CAAC,OAAE,OAAO,OAAO,OAAO,4BAAc,IAEtC,6CAAC,QAAG,OAAO,OAAO,MAChB,kBAAQ,OAAO,IAAI,CAAC,MACpB,8CAAC,QAAc,OAAO,OAAO,KAC5B;AAAA,qDAAC,UAAK,OAAO,EAAE,YAAY,YAAY,OAAO,KAAK,OAAO,KAAM,YAAE,SAAQ;AAAA,QAAQ;AAAA,QAClF,6CAAC,UAAK,OAAO,OAAO,OAAQ,YAAE,QAAO;AAAA,QAAQ;AAAA,QAC7C,6CAAC,UAAK,OAAO,OAAO,OAAQ,cAAI,KAAK,EAAE,SAAS,EAAE,eAAe,GAAE;AAAA,WAH3D,EAAE,EAIX,CACA,GACF;AAAA,MAEA,QAAQ,WAAW,CAAC,QAAQ,YAC5B;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,EAAE;AAAA,UACxC,SAAS,MAAM,KAAK,QAAQ,SAAS;AAAA,UACrC;AAAA;AAAA,MAED,IACG;AAAA,OACL,IACG;AAAA,KACL;AAEF;;;AC3KA,IAAAC,sBAAgC;AAc7B,IAAAC,sBAAA;AALI,SAAS,cAAc,EAAE,OAAO,GAAwB;AAC9D,QAAM,EAAE,SAAS,WAAW,OAAO,SAAS,WAAW,QAAI,qCAAgB,MAAM;AACjF,QAAM,QAAQ,CAAC,MAAkC,KAAK,OAAO,YAAO,IAAI,KAAK,QAAQ,CAAC;AACtF,SACC,8CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,kDAAC,SAAI,OAAO,OAAO,SAClB;AAAA,mDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,OAAO,cAAc,EAAE,GAAG,qBAAO;AAAA,MACxD;AAAA,QAAC;AAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAO,OAAO;AAAA,UACd,SAAS,MAAM,KAAK,QAAQ;AAAA,UAC5B,UAAU;AAAA,UACV;AAAA;AAAA,MAED;AAAA,OACD;AAAA,IACC,QACA,6CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG;AAAA,IACH,aAAa,CAAC,UAAU,6CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAAO;AAAA,IAChE,UACA,8EACC;AAAA,mDAAC,QAAG,OAAO,OAAO,UAAU,+BAAiB;AAAA,MAC7C,6CAAC,SAAI,OAAO,EAAE,GAAG,OAAO,MAAM,YAAY,WAAW,SAAS,IAAI,WAAW,OAAO,GAClF,eAAK,UAAU,QAAQ,YAAY,MAAM,CAAC,GAC5C;AAAA,MACA,6CAAC,QAAG,OAAO,OAAO,UAAU,+BAAiB;AAAA,MAC5C,QAAQ,OAAO,WAAW,IAC1B,6CAAC,OAAE,OAAO,OAAO,OAAO,8BAAgB,IAExC,8CAAC,WAAM,OAAO,OAAO,OACpB;AAAA,qDAAC,WACA,wDAAC,QACA;AAAA,uDAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,UAC1B,6CAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,UAC1B,6CAAC,QAAG,OAAO,OAAO,IAAI,mBAAK;AAAA,UAC3B,6CAAC,QAAG,OAAO,OAAO,IAAI,qBAAO;AAAA,UAC7B,6CAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,UAC5B,6CAAC,QAAG,OAAO,OAAO,IAAI,mBAAK;AAAA,UAC3B,6CAAC,QAAG,OAAO,OAAO,IAAI;AAAA,WACvB,GACD;AAAA,QACA,6CAAC,WACC,kBAAQ,OAAO,IAAI,CAAC,MACpB,8CAAC,QACA;AAAA,wDAAC,QAAG,OAAO,OAAO,IACjB;AAAA,yDAAC,YAAQ,YAAE,MAAK;AAAA,YACf,EAAE,cAAc,6CAAC,SAAI,OAAO,OAAO,OAAQ,YAAE,aAAY,IAAS;AAAA,aACpE;AAAA,UACA,6CAAC,QAAG,OAAO,OAAO,IAAK,YAAE,MAAK;AAAA,UAC9B,6CAAC,QAAG,OAAO,OAAO,IAAK,YAAE,SAAS,UAAI;AAAA,UACtC,8CAAC,QAAG,OAAO,OAAO,IAChB;AAAA,kBAAM,EAAE,SAAS,OAAO;AAAA,YAAE;AAAA,YAAE,EAAE,SAAS,YAAY;AAAA,aACrD;AAAA,UACA,6CAAC,QAAG,OAAO,OAAO,IAAK,gBAAM,EAAE,SAAS,MAAM,GAAE;AAAA,UAChD,6CAAC,QAAG,OAAO,OAAO,IAAK,YAAE,YAAY,GAAG,EAAE,SAAS,OAAO,UAAI;AAAA,UAC9D,6CAAC,QAAG,OAAO,OAAO,IACjB;AAAA,YAAC;AAAA;AAAA,cACA,MAAK;AAAA,cACL,OAAO,OAAO;AAAA,cACd,SAAS,MAAM;AACd,oBAAI,OAAO,QAAQ,uBAAuB,EAAE,IAAI,IAAI;AACnD,uBAAK,WAAW,EAAE,EAAE,EAAE,MAAM,MAAM;AAAA,kBAAC,CAAC;AAAA,cACtC;AAAA,cACA;AAAA;AAAA,UAED,GACD;AAAA,aAvBQ,EAAE,EAwBX,CACA,GACF;AAAA,SACD;AAAA,OAEF,IACG;AAAA,KACL;AAEF;;;ACxFA,IAAAC,uBAAmC;AACnC,IAAAC,gBAAyB;AAqBtB,IAAAC,uBAAA;AAZI,SAAS,iBAAiB,EAAE,OAAO,GAA2B;AACpE,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAyB,MAAM;AACvD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,EAAE;AACzC,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAsD,IAAI;AAC9F,QAAM,EAAE,cAAc,QAAQ,QAAQ,eAAe,WAAW,OAAO,gBAAgB,MAAM,QAC5F,yCAAmB,QAAQ,YAAY,EAAE,OAAO,GAAG,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,EAAE;AACvC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAwB,IAAI;AAE1D,SACC,+CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,kDAAC,QAAG,OAAO,OAAO,OAAO,wBAAU;AAAA,IACnC;AAAA,MAAC;AAAA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,UAAU,CAAC,MAAM;AAChB,YAAE,eAAe;AACjB,qBAAW,IAAI;AACf,wBAAc,QAAQ,KAAK,IAAI,EAAE,MAAM,IAAI,QAAQ,KAAK,EAAE,IAAI,IAAI;AAAA,QACnE;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAuB;AAAA,cACzD,OAAO,OAAO;AAAA,cACd,cAAW;AAAA,cAEX;AAAA,8DAAC,YAAO,OAAM,QAAO,kBAAI;AAAA,gBACzB,8CAAC,YAAO,OAAM,aAAY,uBAAS;AAAA;AAAA;AAAA,UACpC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACA,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,cAC1C,aAAY;AAAA,cACZ,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,QAAQ,UAAU,IAAI;AAAA,cACzD,cAAW;AAAA;AAAA,UACZ;AAAA,UACA,8CAAC,YAAO,MAAK,UAAS,OAAO,OAAO,QAAQ,UAAU,WAAW,qBAEjE;AAAA;AAAA;AAAA,IACD;AAAA,IACC,QACA,8CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG;AAAA,IACH,cAAc,CAAC,YACf,gFACC;AAAA,oDAAC,QAAG,OAAO,OAAO,UAAU,0BAAY;AAAA,MACvC,eACA,8CAAC,WAAM,OAAO,OAAO,OACpB,yDAAC,WACA;AAAA,uDAAC,QACA;AAAA,wDAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,UAC1B,+CAAC,QAAG,OAAO,OAAO,IACjB;AAAA,0DAAC,YAAQ,uBAAa,MAAK;AAAA,YAAS;AAAA,YAAI,aAAa;AAAA,aACtD;AAAA,WACD;AAAA,QACA,+CAAC,QACA;AAAA,wDAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,UAC5B,+CAAC,QAAG,OAAO,OAAO,IAChB;AAAA,yBAAa;AAAA,YACb,aAAa,oBAAoB,gCAA6B;AAAA,aAChE;AAAA,WACD;AAAA,QACA,+CAAC,QACA;AAAA,wDAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,UAC5B,+CAAC,QAAG,OAAO,OAAO,IAChB;AAAA,yBAAa,qBACX,IAAI,KAAK,aAAa,kBAAkB,EAAE,mBAAmB,IAC7D;AAAA,YAAK;AAAA,YAAI;AAAA,YACV;AAAA,YACD,aAAa,mBACX,IAAI,KAAK,aAAa,gBAAgB,EAAE,mBAAmB,IAC3D;AAAA,aACJ;AAAA,WACD;AAAA,QACA,+CAAC,QACA;AAAA,wDAAC,QAAG,OAAO,OAAO,IAAI,sBAAQ;AAAA,UAC9B,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GACxC,uBAAa,0BAA0B,UACzC;AAAA,WACD;AAAA,SACD,GACD,IAEA,8CAAC,OAAE,OAAO,OAAO,OAAO,8BAAgB;AAAA,MAEzC,8CAAC,QAAG,OAAO,OAAO,UAAU,oBAAM;AAAA,MACjC,SACA,gFACC;AAAA,uDAAC,OACA;AAAA,wDAAC,YAAQ,iBAAO,SAAQ;AAAA,UAAS;AAAA,UAAE,OAAO;AAAA,UAAU;AAAA,UACpD,+CAAC,UAAK,OAAO,OAAO,OAAO;AAAA;AAAA,YAChB,OAAO,WAAW;AAAA,YAAI;AAAA,YAAc,OAAO,aAAa;AAAA,YAAI;AAAA,YACpD,OAAO;AAAA,aAC1B;AAAA,WACD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,MAAM;AAChB,gBAAE,eAAe;AACjB,oBAAM,MAAM,eAAe,WAAW,IAAI,IAAI,WAAW,EAAE,IAAI,KAAK,IAAI,CAAC;AACzE,mBAAK,MAAM;AAAA,gBACV,QAAQ,OAAO,KAAK;AAAA,gBACpB,GAAI,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,gBACpC,gBAAgB;AAAA,cACjB,CAAC,EACC,KAAK,MAAM;AACX,2BAAW,WAAW,OAAO,KAAK,CAAC,IAAI,OAAO,QAAQ,GAAG;AACzD,0BAAU,EAAE;AACZ,wBAAQ,EAAE;AAAA,cACX,CAAC,EACA,MAAM,MAAM;AAAA,cAAC,CAAC;AAAA,YACjB;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACA,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,kBACzC,aAAY;AAAA,kBACZ,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,kBAC1C,cAAW;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACA,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,kBACvC,aAAY;AAAA,kBACZ,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,QAAQ,UAAU,IAAI;AAAA,kBACzD,cAAW;AAAA;AAAA,cACZ;AAAA,cACA,8CAAC,YAAO,MAAK,UAAS,OAAO,OAAO,QAAQ,UAAU,CAAC,QAAQ,KAAK,OAAO,KAAK,CAAC,GAAG,mBAEpF;AAAA,cACC,UAAU,8CAAC,UAAK,OAAO,OAAO,IAAK,mBAAQ,IAAU;AAAA;AAAA;AAAA,QACvD;AAAA,QACA,8CAAC,QAAG,OAAO,OAAO,UAAU,oBAAM;AAAA,QACjC,OAAO,WAAW,IAClB,8CAAC,OAAE,OAAO,OAAO,OAAO,gCAAkB,IAE1C,+CAAC,WAAM,OAAO,OAAO,OACpB;AAAA,wDAAC,WACA,yDAAC,QACA;AAAA,0DAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,YAC1B,8CAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,YAC1B,8CAAC,QAAG,OAAO,OAAO,IAAI,oBAAM;AAAA,YAC5B,8CAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,aAC3B,GACD;AAAA,UACA,8CAAC,WACC,iBAAO,IAAI,CAAC,MACZ,+CAAC,QACA;AAAA,0DAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GACzC,cAAI,KAAK,EAAE,SAAS,EAAE,eAAe,GACvC;AAAA,YACA,8CAAC,QAAG,OAAO,OAAO,IAAK,YAAE,MAAK;AAAA,YAC9B,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,YAAE,QAAO;AAAA,YACvD,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GAAI,YAAE,eAAe,IAAG;AAAA,eAN3D,EAAE,EAOX,CACA,GACF;AAAA,WACD;AAAA,QAEA,gBACA;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,EAAE;AAAA,YACxC,SAAS,MAAM,KAAK,eAAe;AAAA,YACnC;AAAA;AAAA,QAED,IACG;AAAA,SACL,IAEA,8CAAC,OAAE,OAAO,OAAO,OAAO,mEAAgD;AAAA,OAE1E,IACG;AAAA,KACL;AAEF;;;AC7LA,IAAAC,uBAA8B;AAC9B,IAAAC,gBAAyB;AAoBvB,IAAAC,uBAAA;AAVK,SAAS,YAAY,EAAE,QAAQ,WAAW,GAAG,GAAsB;AACzE,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE,aAAa,IAAI,MAAM,IAAI,SAAS,GAAG,CAAC;AAC7E,QAAM,CAAC,QAAQ,SAAS,QAAI;AAAA,IAC3B,CAAC;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,SAAS,WAAW,OAAO,SAAS,SAAS,QAAI,oCAAc,QAAQ;AAAA,IACtF,GAAG;AAAA,IACH,OAAO;AAAA,EACR,CAAC;AACD,QAAM,QAAQ,CAAC,KAAyB,gBACvC;AAAA,IAAC;AAAA;AAAA,MACA,OAAO,MAAM,GAAG;AAAA,MAChB,UAAU,CAAC,MAAM,SAAS,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,EAAE,OAAO,MAAM,CAAC;AAAA,MAC7D;AAAA,MACA,OAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MAC1C,cAAY;AAAA;AAAA,EACb;AAED,SACC,+CAAC,SAAI,OAAO,OAAO,WAClB;AAAA,kDAAC,QAAG,OAAO,OAAO,OAAO,mBAAK;AAAA,IAC9B;AAAA,MAAC;AAAA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,UAAU,CAAC,MAAM;AAChB,YAAE,eAAe;AACjB,oBAAU;AAAA,YACT,GAAI,MAAM,YAAY,KAAK,IAAI,EAAE,aAAa,MAAM,YAAY,KAAK,EAAE,IAAI,CAAC;AAAA,YAC5E,GAAI,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,YACvD,GAAI,MAAM,QAAQ,KAAK,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,UACjE,CAAC;AAAA,QACF;AAAA,QAEC;AAAA,gBAAM,eAAe,6BAA6B;AAAA,UAClD,MAAM,QAAQ,YAAY;AAAA,UAC1B,MAAM,WAAW,UAAU;AAAA,UAC5B,8CAAC,YAAO,MAAK,UAAS,OAAO,OAAO,QAAQ,UAAU,WAAW,oBAEjE;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACA,MAAK;AAAA,cACL,OAAO,OAAO;AAAA,cACd,SAAS,MAAM,KAAK,QAAQ;AAAA,cAC5B,UAAU;AAAA,cACV;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IACD;AAAA,IACC,QACA,8CAAC,OAAE,OAAO,OAAO,OAAO,MAAK,SAC3B,gBAAM,aACR,IACG;AAAA,IACH,OAAO,WAAW,KAAK,CAAC,YACxB,8CAAC,OAAE,OAAO,OAAO,OAAO,+CAAiC,IAEzD,+CAAC,WAAM,OAAO,OAAO,OACpB;AAAA,oDAAC,WACA,yDAAC,QACA;AAAA,sDAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,QAC1B,8CAAC,QAAG,OAAO,OAAO,IAAI,kBAAI;AAAA,QAC1B,8CAAC,QAAG,OAAO,OAAO,IAAI,uBAAS;AAAA,QAC/B,8CAAC,QAAG,OAAO,OAAO,IAAI,mBAAK;AAAA,QAC3B,8CAAC,QAAG,OAAO,OAAO,IAAI,qBAAO;AAAA,SAC9B,GACD;AAAA,MACA,8CAAC,WACC,iBAAO,IAAI,CAAC,MACZ,+CAAC,QACA;AAAA,sDAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GACzC,cAAI,KAAK,EAAE,SAAS,EAAE,eAAe,GACvC;AAAA,QACA,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,YAAE,MAAK;AAAA,QACrD,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GACxC,iBAAO,EAAE,QAAQ,aAAa,KAAK,QAAG,GACxC;AAAA,QACA,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,GAAI,YAAE,WAAW,UAAI;AAAA,QAC/D,8CAAC,QAAG,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,OAAO,MAAM,GAAI,YAAE,aAAa,IAAG;AAAA,WATzD,EAAE,EAUX,CACA,GACF;AAAA,OACD;AAAA,IAEA,YAAY,8CAAC,OAAE,OAAO,OAAO,QAAQ,2BAAQ,IAAO;AAAA,IACpD,WAAW,CAAC,YACZ;AAAA,MAAC;AAAA;AAAA,QACA,MAAK;AAAA,QACL,OAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,EAAE;AAAA,QACxC,SAAS,MAAM,KAAK,SAAS;AAAA,QAC7B;AAAA;AAAA,IAED,IACG;AAAA,KACL;AAEF;;;AZsBU,IAAAC,uBAAA;AAtEV,IAAM,MAOD;AAAA,EACJ,EAAE,OAAO,SAAS,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,YAAY,CAAC,EAAE;AAAA,EACrE;AAAA,IACC,OAAO;AAAA,IACP,OAAO;AAAA,MACN,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,MACpC,EAAE,MAAM,UAAU,OAAO,gBAAgB;AAAA,MACzC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,MAClC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,IACnC;AAAA,EACD;AAAA,EACA,EAAE,OAAO,UAAU,OAAO,CAAC,EAAE,MAAM,SAAS,OAAO,SAAS,OAAO,OAAO,CAAC,EAAE;AAAA,EAC7E;AAAA,IACC,OAAO;AAAA,IACP,OAAO;AAAA,MACN,EAAE,MAAM,WAAW,OAAO,WAAW,OAAO,UAAU;AAAA,MACtD,EAAE,MAAM,cAAc,OAAO,cAAc,OAAO,UAAU;AAAA,IAC7D;AAAA,EACD;AAAA,EACA,EAAE,OAAO,YAAY,OAAO,CAAC,EAAE,MAAM,YAAY,OAAO,oBAAoB,OAAO,SAAS,CAAC,EAAE;AAAA,EAC/F,EAAE,OAAO,aAAa,OAAO,CAAC,EAAE,MAAM,aAAa,OAAO,aAAa,OAAO,UAAU,CAAC,EAAE;AAAA,EAC3F;AAAA,IACC,OAAO;AAAA,IACP,OAAO;AAAA,MACN,EAAE,MAAM,SAAS,OAAO,SAAS,OAAO,QAAQ;AAAA,MAChD,EAAE,MAAM,OAAO,OAAO,YAAY;AAAA,MAClC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,IACnC;AAAA,EACD;AACD;AAEO,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAqB;AACpB,QAAM,CAAC,KAAK,MAAM,QAAI,wBAAoB,WAAW;AACrD,QAAM,UAAU,QAAQ;AACxB,QAAM,KAAK,CAAC,MAAiB;AAC5B,QAAI,WAAY,YAAW,CAAC;AAC5B,QAAI,SAAS,OAAW,QAAO,CAAC;AAAA,EACjC;AACA,QAAM,CAAC,SAAS,UAAU,QAAI,wBAE5B,IAAI;AAEN,QAAM,MAAM;AAAA,IACX,QAAQ,QAAQ,YAAY;AAAA,IAC5B,SAAS,QAAQ,aAAa;AAAA,IAC9B,MAAM,QAAQ,UAAU;AAAA,IACxB,SAAS,QAAQ,aAAa;AAAA,IAC9B,OAAO,QAAQ,WAAW;AAAA,EAC3B;AAEA,MAAI;AACJ,UAAQ,SAAS;AAAA,IAChB,KAAK;AACJ,aAAO,8CAAC,mBAAgB,QAAgB;AACxC;AAAA,IACD,KAAK;AACJ,aAAO,8CAAC,iBAAc,QAAgB;AACtC;AAAA,IACD,KAAK;AACJ,aAAO,8CAAC,gBAAa,QAAgB;AACrC;AAAA,IACD,KAAK;AACJ,aAAO,8CAAC,gBAAa,QAAgB;AACrC;AAAA,IACD,KAAK;AACJ,aAAO,8CAAC,gBAAa,QAAgB;AACrC;AAAA,IACD,KAAK;AACJ,aAAO,8CAAC,gBAAa,QAAgB;AACrC;AAAA,IACD,KAAK;AACJ,aAAO,8CAAC,kBAAe,QAAgB;AACvC;AAAA,IACD,KAAK;AACJ,aAAO,gBACN,8CAAC,iBAAc,QAAQ,eAAe,IAEtC,8CAAC,OAAE,OAAO,OAAO,QAAQ,gEAAkD;AAE5E;AAAA,IACD,KAAK;AACJ,aAAO,gBACN,8CAAC,oBAAiB,QAAQ,eAAe,IAEzC,8CAAC,OAAE,OAAO,OAAO,QAAQ,oEAAsD;AAEhF;AAAA,IACD,KAAK;AACJ,aAAO,cACN,8CAAC,eAAY,QAAQ,aAAa,IAElC,8CAAC,OAAE,OAAO,OAAO,QAAQ,mEAAqD;AAE/E;AAAA,IACD,KAAK;AACJ,aAAO,aACN,8CAAC,eAAY,QAAQ,YAAY,IAEjC,8CAAC,OAAE,OAAO,OAAO,QAAQ,4DAA8C;AAExE;AAAA,IACD,KAAK;AACJ,aAAO,CAAC,eACP,8CAAC,OAAE,OAAO,OAAO,QAAQ,yEAA2D,IACjF,WAAW,QAAQ,SAAS,aAC/B,gFACC;AAAA,sDAAC,YAAO,MAAK,UAAS,OAAO,OAAO,QAAQ,SAAS,MAAM,WAAW,IAAI,GAAG,yBAE7E;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,QAAQ;AAAA,YACR,MAAM,QAAQ;AAAA,YACd,WAAW,QAAQ;AAAA,YAClB,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,YACpD,SAAS,MAAM,WAAW,IAAI;AAAA;AAAA,QAC/B;AAAA,SACD,IAEA;AAAA,QAAC;AAAA;AAAA,UACA,QAAQ;AAAA,UACP,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,UACpD,gBAAgB,CAAC,QAAQ,WAAW,EAAE,MAAM,UAAU,IAAI,CAAC;AAAA,UAC3D,gBAAgB,CAAC,QAAQ,WAAW,EAAE,MAAM,UAAU,IAAI,CAAC;AAAA;AAAA,MAC5D;AAED;AAAA,IACD,KAAK;AACJ,aAAO,CAAC,gBACP,8CAAC,OAAE,OAAO,OAAO,QAAQ,iEAAmD,IACzE,SAAS,SAAS,aACrB,gFACC;AAAA,sDAAC,YAAO,MAAK,UAAS,OAAO,OAAO,QAAQ,SAAS,MAAM,WAAW,IAAI,GAAG,yBAE7E;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,QAAQ;AAAA,YACR,MAAM,QAAQ;AAAA,YACd,SAAS,MAAM,WAAW,IAAI;AAAA;AAAA,QAC/B;AAAA,SACD,IAEA;AAAA,QAAC;AAAA;AAAA,UACA,QAAQ;AAAA,UACR,kBAAkB,CAAC,MAAM,WAAW,EAAE,MAAM,YAAY,MAAM,EAAE,KAAK,CAAC;AAAA;AAAA,MACvE;AAED;AAAA,EACF;AAEA,SACC,+CAAC,SAAI,OAAO,OAAO,OAClB;AAAA,kDAAC,SAAI,OAAO,OAAO,KAAK,cAAW,SACjC,cAAI,IAAI,CAAC,MAAM;AACf,YAAM,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,KAAK,CAAC;AAC5D,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,aACC,+CAAC,SACA;AAAA,sDAAC,SAAI,OAAO,OAAO,UAAW,YAAE,OAAM;AAAA,QACrC,MAAM,IAAI,CAAC,MACX;AAAA,UAAC;AAAA;AAAA,YAEA,MAAK;AAAA,YACL,OAAO,EAAE,GAAG,OAAO,SAAS,GAAI,YAAY,EAAE,OAAO,OAAO,gBAAgB,CAAC,EAAG;AAAA,YAChF,gBAAc,YAAY,EAAE,OAAO,SAAS;AAAA,YAC5C,SAAS,MAAM;AACd,yBAAW,IAAI;AACf,iBAAG,EAAE,IAAI;AAAA,YACV;AAAA,YAEC,YAAE;AAAA;AAAA,UATE,EAAE;AAAA,QAUR,CACA;AAAA,WAfQ,EAAE,KAgBZ;AAAA,IAEF,CAAC,GACF;AAAA,IACA,8CAAC,UAAK,OAAO,OAAO,MAAO,gBAAK;AAAA,KACjC;AAEF;","names":["import_react","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/screens/AdminShell.tsx","../src/styles.ts","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/ConfigScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["export type {\n\tAdminPage,\n\tIAdminLogScreenProps,\n\tIAdminShellProps,\n\tIAttentionScreenProps,\n\tIConfigScreenProps,\n\tIDoctorScreenProps,\n\tIModulesScreenProps,\n\tIRoutesScreenProps,\n\tITokensScreenProps,\n\tIUsersScreenProps,\n\tICatalogScreenProps,\n\tISubscriberScreenProps,\n\tIAuditScreenProps,\n} from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tAuditScreen,\n} from './screens';\n","import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\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| 'config'\n\t| 'routes'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\tauthClient?: AuthAdminClient;\n\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\tbillingClient?: BillingAdminClient;\n\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\tauditClient?: AuditAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tauthClient,\n\tbillingClient,\n\tauditClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n}: IAdminShellProps) {\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = {\n\t\tconfig: Boolean(configClient),\n\t\tcourier: Boolean(courierClient),\n\t\tauth: Boolean(authClient),\n\t\tbilling: Boolean(billingClient),\n\t\taudit: Boolean(auditClient),\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'config':\n\t\t\tbody = <ConfigScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to see the catalog here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'subscriber':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<SubscriberScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to look up subscribers here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'audit':\n\t\t\tbody = auditClient ? (\n\t\t\t\t<AuditScreen client={auditClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuditAdminClient to see the audit trail here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'users':\n\t\t\tbody = authClient ? (\n\t\t\t\t<UsersScreen client={authClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuthAdminClient to look up users here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={styles.status}>Pass a ConfigAdminClient to manage config and secrets here.</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={styles.status}>Pass a CourierAdminClient to manage templates here.</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div style={styles.shell}>\n\t\t\t<nav style={styles.nav} aria-label=\"Admin\">\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, ...(current === i.page ? styles.navItemActive : {}) }}\n\t\t\t\t\t\t\t\t\taria-current={current === i.page ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\tgo(i.page);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{i.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t\t<main style={styles.main}>{body}</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: 'system-ui, sans-serif',\n\t\tcolor: '#111',\n\t},\n\tnav: { width: 220, borderRight: '1px solid #eee', padding: 16, flexShrink: 0 },\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: '#888',\n\t\tmargin: '16px 0 6px',\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: 6,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: '#111',\n\t},\n\tnavItemActive: { background: '#f3f4f6', fontWeight: 600 },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: { fontSize: 20, fontWeight: 700, marginTop: 0, marginBottom: 12 },\n\tsubtitle: { fontSize: 15, fontWeight: 600, marginTop: 24, marginBottom: 8 },\n\tstatus: { padding: 12, color: '#666' },\n\terror: { color: '#e11d48', marginBottom: 12, fontSize: 14 },\n\tok: { color: '#15803d', fontWeight: 600 },\n\tbad: { color: '#e11d48', fontWeight: 600 },\n\tadvice: { color: '#b45309' },\n\tmuted: { color: '#666', fontSize: 13 },\n\tmono: { fontFamily: 'ui-monospace, monospace', fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: '1px solid #ddd',\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: '#444',\n\t},\n\ttd: { borderBottom: '1px solid #eee', padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: '1px solid #eee', padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: '#f3f4f6',\n\t},\n\tbutton: {\n\t\tbackground: 'none',\n\t\tborder: '1px solid #ddd',\n\t\tborderRadius: 8,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Admin log</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{e.method} {e.path}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<span style={e.status >= 400 ? styles.bad : styles.ok}>{e.status}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\n\n// What needs the operator today. Empty is green.\nexport function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Attention</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : attention?.items.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\tNothing needs you. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{attention?.items.map((item) => (\n\t\t\t\t\t\t<li key={`${item.source}:${item.message}`} style={styles.row}>\n\t\t\t\t\t\t\t<span style={item.severity === 'error' ? styles.bad : styles.advice}>\n\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span> — {item.message}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IConfigScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function ConfigScreen({ client }: IConfigScreenProps) {\n\tconst { report, isLoading, error } = useAdminConfig(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Configuration</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>{' '}\n\t\t\t\t\t\t\t\t{m.problems.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tm.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t\t<h2 style={styles.subtitle}>Environment</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.name} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t{e.set ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>set</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>missing</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Doctor</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRun again\n\t\t\t\t</button>\n\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t<span style={report.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t<li key={c.name} style={styles.row}>\n\t\t\t\t\t\t\t<span style={c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t\t\t{c.skipped ? 'skipped' : c.ok ? 'ok' : 'failed'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t{c.module} · {c.durationMs} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{c.skipped ? <div style={styles.muted}>{c.skipped}</div> : null}\n\t\t\t\t\t\t\t{c.findings.map((f) => (\n\t\t\t\t\t\t\t\t<div key={f} style={c.ok ? styles.advice : styles.bad}>\n\t\t\t\t\t\t\t\t\t{f}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Modules</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<>\n\t\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\t\t{manifest.env} · admin {manifest.admin.version} · admin log{' '}\n\t\t\t\t\t\t{manifest.admin.log ? 'on' : 'off'} · {manifest.routes.length} routes\n\t\t\t\t\t</p>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Describes admin</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{m.name}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>error</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.describesAdmin ? 'yes' : <span style={styles.muted}>no</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Routes</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.method}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<span style={styles.badge}>{r.guard}</span>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(client);\n\tconst [name, setName] = useState('');\n\tconst [scopes, setScopes] = useState<AdminScope[]>(['read']);\n\tconst [days, setDays] = useState('');\n\tconst [minted, setMinted] = useState<{ name: string; token: string } | null>(null);\n\n\tconst toggle = (s: AdminScope) =>\n\t\tsetScopes((prev) => (prev.includes(s) ? prev.filter((x) => x !== s) : [...prev, s]));\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</h1>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 401\n\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Root token</h2>\n\t\t\t{report ? (\n\t\t\t\t<p>\n\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\n\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Issued tokens</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\tIssuing is off — give AdminModule a store and run its migrations.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{minted ? (\n\t\t\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\t\t\tCopy this now — it is never shown again.{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{minted.token}</span> ({minted.name})\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<form\n\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = Number(days);\n\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\tname: name.trim(),\n\t\t\t\t\t\t\t\tscopes,\n\t\t\t\t\t\t\t\t...(days && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\tsetMinted({ name: t.name, token: t.token });\n\t\t\t\t\t\t\t\t\tsetName('');\n\t\t\t\t\t\t\t\t\tsetDays('');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"name\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\taria-label=\"Name\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ALL.map((s) => (\n\t\t\t\t\t\t\t<label key={s} style={{ ...styles.badge, cursor: 'pointer' }}>\n\t\t\t\t\t\t\t\t<input type=\"checkbox\" checked={scopes.includes(s)} onChange={() => toggle(s)} />{' '}\n\t\t\t\t\t\t\t\t{s}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={days}\n\t\t\t\t\t\t\tonChange={(e) => setDays(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"days (optional)\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', width: 140 }}\n\t\t\t\t\t\t\taria-label=\"Days\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tdisabled={!name.trim() || scopes.length === 0 || isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tIssue\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t\t{report?.issued && report.issued.length > 0 ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Scopes</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Expires</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Last used</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{report.issued.map((t) => (\n\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.name}\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? <span style={styles.badge}> revoked</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.scopes.join(', ')}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleDateString()} · {t.createdBy}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tRevoke\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>None issued.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.legacy.map((l) => (\n\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AuthAdminClient } from '@fonderie/client';\nimport { useAdminLoginHistory, useAdminUser, useAdminUserSessions } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n}\n\n// Why can't this person log in. Look up by email, see the account, its live\n// sessions and recent sign-ins; suspend, unsuspend, or sign them out everywhere.\nexport function UsersScreen({ client }: IUsersScreenProps) {\n\tconst [input, setInput] = useState('');\n\tconst [email, setEmail] = useState<string | undefined>(undefined);\n\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\tclient,\n\t\temail ? { email } : {},\n\t);\n\tconst userId = user?.id ?? null;\n\tconst sessions = useAdminUserSessions(client, userId);\n\tconst history = useAdminLoginHistory(client, userId, { limit: 20 });\n\n\tconst yesNo = (v: boolean) =>\n\t\tv ? <span style={styles.ok}>yes</span> : <span style={styles.muted}>no</span>;\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Users</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetEmail(input.trim() || undefined);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"email address\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Email\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? 'No user with that email.' : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{user ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t{user.firstName || user.lastName\n\t\t\t\t\t\t\t? `${user.firstName} ${user.lastName}`.trim()\n\t\t\t\t\t\t\t: user.email}{' '}\n\t\t\t\t\t\t{user.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t{user.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>id</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{user.id}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>email</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.email} · verified {yesNo(user.isEmailVerified)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>MFA</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{yesNo(user.mfaEnabled)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.provider || 'password'}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ' · no password set'}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>last login</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.lastLogin ? (\n\t\t\t\t\t\t\t\t\t\tnew Date(user.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>never</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>created</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(user.createdAt).toLocaleString()}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t{user.suspended ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tUnsuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tonClick={() => void revokeSessions().then(() => sessions.refresh())}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign out everywhere\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Live sessions</h2>\n\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\t\t\t\t\t\t<li key={s.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{s.userAgent ?? ''}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>since {new Date(s.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Recent sign-ins</h2>\n\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>None recorded.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={e.outcome === 'success' ? styles.ok : styles.bad}>{e.outcome}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{new Date(e.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{history.hasMore && !history.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void history.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ICatalogScreenProps {\n\tclient: BillingAdminClient;\n}\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport function CatalogScreen({ client }: ICatalogScreenProps) {\n\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(client);\n\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Catalog</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{isLoading && !catalog ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{catalog ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Configured (code)</h2>\n\t\t\t\t\t<pre style={{ ...styles.mono, background: '#f9fafb', padding: 12, overflowX: 'auto' }}>\n\t\t\t\t\t\t{JSON.stringify(catalog.configured, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t\t<h2 style={styles.subtitle}>Stored (database)</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No stored plans.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Tier</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Seats</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Monthly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Yearly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Trial</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{catalog.stored.map((p) => (\n\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{p.name}</strong>\n\t\t\t\t\t\t\t\t\t\t\t{p.description ? <div style={styles.muted}>{p.description}</div> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.tier}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.seats ?? '∞'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{money(p.pricing?.monthly)} {p.pricing?.currency ?? ''}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{money(p.pricing?.yearly)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.trialDays ? `${p.trialDays} d` : '—'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n}\n\n// What is this subscriber on, what does their wallet hold, what moved — and\n// the one write: a manual grant, idempotency-keyed.\nexport function SubscriberScreen({ client }: ISubscriberScreenProps) {\n\tconst [type, setType] = useState<SubscriberType>('user');\n\tconst [idInput, setIdInput] = useState('');\n\tconst [subscriber, setSubscriber] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20 });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Subscriber</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetGranted(null);\n\t\t\t\t\tsetSubscriber(idInput.trim() ? { type, id: idInput.trim() } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<select\n\t\t\t\t\tvalue={type}\n\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\taria-label=\"Type\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"user\">user</option>\n\t\t\t\t\t<option value=\"workspace\">workspace</option>\n\t\t\t\t</select>\n\t\t\t\t<input\n\t\t\t\t\tvalue={idInput}\n\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"subscriber id\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Subscriber id\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{subscriber && !isLoading ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Subscription</h2>\n\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>plan</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<strong>{subscription.plan}</strong> · {subscription.interval}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>status</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.status}\n\t\t\t\t\t\t\t\t\t\t{subscription.cancelAtPeriodEnd ? ' · cancels at period end' : ''}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>period</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodStart\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodStart).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}{' '}\n\t\t\t\t\t\t\t\t\t\t→{' '}\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{subscription.providerSubscriptionId ?? '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No subscription.</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Wallet</h2>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t<strong>{wallet.balance}</strong> {wallet.currency}{' '}\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t(granted {wallet.granted ?? '0'} · purchased {wallet.purchased ?? '0'}) · minor\n\t\t\t\t\t\t\t\t\tunits, precision {wallet.precision}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t\t\t\t...(note ? { description: note } : {}),\n\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\tsetGranted(`Granted ${amount.trim()} ${wallet.currency}.`);\n\t\t\t\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\t\t\t\tsetNote('');\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"amount (minor units)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\t\t\taria-label=\"Amount\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"reason (optional)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 220 }}\n\t\t\t\t\t\t\t\t\taria-label=\"Reason\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!/^\\d+$/.test(amount.trim())}>\n\t\t\t\t\t\t\t\t\tGrant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>Ledger</h2>\n\t\t\t\t\t\t\t{ledger.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>Nothing moved yet.</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Kind</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Amount</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Note</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t{ledger.map((t) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{t.type}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.amount}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{t.description ?? ''}</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasMoreLedger ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No wallet — billing has no wallet configuration.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuditAdminClient } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IAuditScreenProps {\n\tclient: AuditAdminClient;\n\tpageSize?: number;\n}\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport function AuditScreen({ client, pageSize = 50 }: IAuditScreenProps) {\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '' });\n\tconst [filter, setFilter] = useState<{ workspaceId?: string; type?: string; actorId?: string }>(\n\t\t{},\n\t);\n\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(client, {\n\t\t...filter,\n\t\tlimit: pageSize,\n\t});\n\tconst field = (key: keyof typeof draft, placeholder: string) => (\n\t\t<input\n\t\t\tvalue={draft[key]}\n\t\t\tonChange={(e) => setDraft({ ...draft, [key]: e.target.value })}\n\t\t\tplaceholder={placeholder}\n\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\taria-label={placeholder}\n\t\t/>\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Audit</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetFilter({\n\t\t\t\t\t\t...(draft.workspaceId.trim() ? { workspaceId: draft.workspaceId.trim() } : {}),\n\t\t\t\t\t\t...(draft.type.trim() ? { type: draft.type.trim() } : {}),\n\t\t\t\t\t\t...(draft.actorId.trim() ? { actorId: draft.actorId.trim() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', 'workspace id (all if empty)')}\n\t\t\t\t{field('type', 'event type')}\n\t\t\t\t{field('actorId', 'actor id')}\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tFilter\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{events.length === 0 && !isLoading ? (\n\t\t\t\t<p style={styles.muted}>Nothing recorded for this filter.</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Type</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Workspace</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{events.map((e) => (\n\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t{new Date(e.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.type}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{String(e.payload['workspaceId'] ?? '—')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.actorId ?? '—'}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.requestId ?? ''}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t>\n\t\t\t\t\tLoad more\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["import_react","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { AdminClient, ConfigAdminClient, CourierAdminClient, AuthAdminClient, BillingAdminClient, AuditAdminClient } from '@fonderie/client';
|
|
3
|
+
|
|
4
|
+
type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'tokens' | 'log' | 'settings' | 'templates' | 'users' | 'catalog' | 'subscriber' | 'audit';
|
|
5
|
+
interface IAdminShellProps {
|
|
6
|
+
client: AdminClient;
|
|
7
|
+
configClient?: ConfigAdminClient;
|
|
8
|
+
courierClient?: CourierAdminClient;
|
|
9
|
+
authClient?: AuthAdminClient;
|
|
10
|
+
billingClient?: BillingAdminClient;
|
|
11
|
+
auditClient?: AuditAdminClient;
|
|
12
|
+
environment?: string;
|
|
13
|
+
page?: AdminPage;
|
|
14
|
+
onNavigate?: (page: AdminPage) => void;
|
|
15
|
+
}
|
|
16
|
+
declare function AdminShell({ client, configClient, courierClient, authClient, billingClient, auditClient, environment, page, onNavigate, }: IAdminShellProps): react.JSX.Element;
|
|
17
|
+
|
|
18
|
+
interface IAttentionScreenProps {
|
|
19
|
+
client: AdminClient;
|
|
20
|
+
}
|
|
21
|
+
declare function AttentionScreen({ client }: IAttentionScreenProps): react.JSX.Element;
|
|
22
|
+
|
|
23
|
+
interface IModulesScreenProps {
|
|
24
|
+
client: AdminClient;
|
|
25
|
+
}
|
|
26
|
+
declare function ModulesScreen({ client }: IModulesScreenProps): react.JSX.Element;
|
|
27
|
+
|
|
28
|
+
interface IDoctorScreenProps {
|
|
29
|
+
client: AdminClient;
|
|
30
|
+
}
|
|
31
|
+
declare function DoctorScreen({ client }: IDoctorScreenProps): react.JSX.Element;
|
|
32
|
+
|
|
33
|
+
interface IConfigScreenProps {
|
|
34
|
+
client: AdminClient;
|
|
35
|
+
}
|
|
36
|
+
declare function ConfigScreen({ client }: IConfigScreenProps): react.JSX.Element;
|
|
37
|
+
|
|
38
|
+
interface IRoutesScreenProps {
|
|
39
|
+
client: AdminClient;
|
|
40
|
+
}
|
|
41
|
+
declare function RoutesScreen({ client }: IRoutesScreenProps): react.JSX.Element;
|
|
42
|
+
|
|
43
|
+
interface ITokensScreenProps {
|
|
44
|
+
client: AdminClient;
|
|
45
|
+
}
|
|
46
|
+
declare function TokensScreen({ client }: ITokensScreenProps): react.JSX.Element;
|
|
47
|
+
|
|
48
|
+
interface IAdminLogScreenProps {
|
|
49
|
+
client: AdminClient;
|
|
50
|
+
pageSize?: number;
|
|
51
|
+
}
|
|
52
|
+
declare function AdminLogScreen({ client, pageSize }: IAdminLogScreenProps): react.JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface IUsersScreenProps {
|
|
55
|
+
client: AuthAdminClient;
|
|
56
|
+
}
|
|
57
|
+
declare function UsersScreen({ client }: IUsersScreenProps): react.JSX.Element;
|
|
58
|
+
|
|
59
|
+
interface ICatalogScreenProps {
|
|
60
|
+
client: BillingAdminClient;
|
|
61
|
+
}
|
|
62
|
+
declare function CatalogScreen({ client }: ICatalogScreenProps): react.JSX.Element;
|
|
63
|
+
|
|
64
|
+
interface ISubscriberScreenProps {
|
|
65
|
+
client: BillingAdminClient;
|
|
66
|
+
}
|
|
67
|
+
declare function SubscriberScreen({ client }: ISubscriberScreenProps): react.JSX.Element;
|
|
68
|
+
|
|
69
|
+
interface IAuditScreenProps {
|
|
70
|
+
client: AuditAdminClient;
|
|
71
|
+
pageSize?: number;
|
|
72
|
+
}
|
|
73
|
+
declare function AuditScreen({ client, pageSize }: IAuditScreenProps): react.JSX.Element;
|
|
74
|
+
|
|
75
|
+
export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, AuditScreen, CatalogScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IAuditScreenProps, type ICatalogScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ISubscriberScreenProps, type ITokensScreenProps, type IUsersScreenProps, ModulesScreen, RoutesScreen, SubscriberScreen, TokensScreen, UsersScreen };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { AdminClient, ConfigAdminClient, CourierAdminClient, AuthAdminClient, BillingAdminClient, AuditAdminClient } from '@fonderie/client';
|
|
3
|
+
|
|
4
|
+
type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'tokens' | 'log' | 'settings' | 'templates' | 'users' | 'catalog' | 'subscriber' | 'audit';
|
|
5
|
+
interface IAdminShellProps {
|
|
6
|
+
client: AdminClient;
|
|
7
|
+
configClient?: ConfigAdminClient;
|
|
8
|
+
courierClient?: CourierAdminClient;
|
|
9
|
+
authClient?: AuthAdminClient;
|
|
10
|
+
billingClient?: BillingAdminClient;
|
|
11
|
+
auditClient?: AuditAdminClient;
|
|
12
|
+
environment?: string;
|
|
13
|
+
page?: AdminPage;
|
|
14
|
+
onNavigate?: (page: AdminPage) => void;
|
|
15
|
+
}
|
|
16
|
+
declare function AdminShell({ client, configClient, courierClient, authClient, billingClient, auditClient, environment, page, onNavigate, }: IAdminShellProps): react.JSX.Element;
|
|
17
|
+
|
|
18
|
+
interface IAttentionScreenProps {
|
|
19
|
+
client: AdminClient;
|
|
20
|
+
}
|
|
21
|
+
declare function AttentionScreen({ client }: IAttentionScreenProps): react.JSX.Element;
|
|
22
|
+
|
|
23
|
+
interface IModulesScreenProps {
|
|
24
|
+
client: AdminClient;
|
|
25
|
+
}
|
|
26
|
+
declare function ModulesScreen({ client }: IModulesScreenProps): react.JSX.Element;
|
|
27
|
+
|
|
28
|
+
interface IDoctorScreenProps {
|
|
29
|
+
client: AdminClient;
|
|
30
|
+
}
|
|
31
|
+
declare function DoctorScreen({ client }: IDoctorScreenProps): react.JSX.Element;
|
|
32
|
+
|
|
33
|
+
interface IConfigScreenProps {
|
|
34
|
+
client: AdminClient;
|
|
35
|
+
}
|
|
36
|
+
declare function ConfigScreen({ client }: IConfigScreenProps): react.JSX.Element;
|
|
37
|
+
|
|
38
|
+
interface IRoutesScreenProps {
|
|
39
|
+
client: AdminClient;
|
|
40
|
+
}
|
|
41
|
+
declare function RoutesScreen({ client }: IRoutesScreenProps): react.JSX.Element;
|
|
42
|
+
|
|
43
|
+
interface ITokensScreenProps {
|
|
44
|
+
client: AdminClient;
|
|
45
|
+
}
|
|
46
|
+
declare function TokensScreen({ client }: ITokensScreenProps): react.JSX.Element;
|
|
47
|
+
|
|
48
|
+
interface IAdminLogScreenProps {
|
|
49
|
+
client: AdminClient;
|
|
50
|
+
pageSize?: number;
|
|
51
|
+
}
|
|
52
|
+
declare function AdminLogScreen({ client, pageSize }: IAdminLogScreenProps): react.JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface IUsersScreenProps {
|
|
55
|
+
client: AuthAdminClient;
|
|
56
|
+
}
|
|
57
|
+
declare function UsersScreen({ client }: IUsersScreenProps): react.JSX.Element;
|
|
58
|
+
|
|
59
|
+
interface ICatalogScreenProps {
|
|
60
|
+
client: BillingAdminClient;
|
|
61
|
+
}
|
|
62
|
+
declare function CatalogScreen({ client }: ICatalogScreenProps): react.JSX.Element;
|
|
63
|
+
|
|
64
|
+
interface ISubscriberScreenProps {
|
|
65
|
+
client: BillingAdminClient;
|
|
66
|
+
}
|
|
67
|
+
declare function SubscriberScreen({ client }: ISubscriberScreenProps): react.JSX.Element;
|
|
68
|
+
|
|
69
|
+
interface IAuditScreenProps {
|
|
70
|
+
client: AuditAdminClient;
|
|
71
|
+
pageSize?: number;
|
|
72
|
+
}
|
|
73
|
+
declare function AuditScreen({ client, pageSize }: IAuditScreenProps): react.JSX.Element;
|
|
74
|
+
|
|
75
|
+
export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, AuditScreen, CatalogScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IAuditScreenProps, type ICatalogScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ISubscriberScreenProps, type ITokensScreenProps, type IUsersScreenProps, ModulesScreen, RoutesScreen, SubscriberScreen, TokensScreen, UsersScreen };
|