@realiizlabs/admin 0.13.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/events/index.cjs +1 -1
- package/dist/events/index.cjs.map +1 -1
- package/dist/events/index.d.cts +2 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.js +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/forms/index.cjs +1 -1
- package/dist/forms/index.cjs.map +1 -1
- package/dist/forms/index.d.cts +2 -2
- package/dist/forms/index.d.ts +2 -2
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.js.map +1 -1
- package/dist/forms-ui/index.d.cts +1 -1
- package/dist/forms-ui/index.d.ts +1 -1
- package/dist/shell/index.cjs +7 -1
- package/dist/shell/index.cjs.map +1 -1
- package/dist/shell/index.d.cts +2 -2
- package/dist/shell/index.d.ts +2 -2
- package/dist/shell/index.js +7 -1
- package/dist/shell/index.js.map +1 -1
- package/dist/studio/index.d.cts +1 -1
- package/dist/studio/index.d.ts +1 -1
- package/dist/studio-ui/index.cjs +7 -1
- package/dist/studio-ui/index.cjs.map +1 -1
- package/dist/studio-ui/index.d.cts +1 -1
- package/dist/studio-ui/index.d.ts +1 -1
- package/dist/studio-ui/index.js +7 -1
- package/dist/studio-ui/index.js.map +1 -1
- package/dist/{types-D46UjOfv.d.cts → types-DeHdasdP.d.cts} +2 -0
- package/dist/{types-D46UjOfv.d.ts → types-DeHdasdP.d.ts} +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/studio-ui/context.tsx","../../src/shell/icons.tsx","../../src/shell/Sidebar.tsx","../../src/shell/ThemeToggle.tsx","../../src/shell/AccountMenu.tsx","../../src/shell/TopBar.tsx","../../src/shell/tokens.ts","../../src/shell/AdminShell.tsx","../../src/shell/Button.tsx","../../src/shell/primitives.tsx","../../src/shell/Tabs.tsx","../../src/studio-ui/css.ts","../../src/studio-ui/shell.tsx","../../src/forms-ui/styles.ts","../../src/auth-ui/MagicLinkForm.tsx","../../src/auth-ui/SignOutButton.tsx","../../src/studio-ui/states.tsx","../../src/studio-ui/term.tsx","../../src/studio-ui/copy.ts","../../src/forms/internals.ts","../../src/forms/checks.ts","../../src/forms/unwrap.ts","../../src/forms/inputs.ts","../../src/forms/labels.ts","../../src/forms/walk.ts","../../src/forms-ui/ChipsInput.tsx","../../src/forms-ui/SelectInput.tsx","../../src/forms-ui/controls.tsx","../../src/forms-ui/images.ts","../../src/forms-ui/md/upload.ts","../../src/forms-ui/ImageInput.tsx","../../src/forms-ui/Field.tsx","../../src/forms-ui/md/table.ts","../../src/forms-ui/md/edits.ts","../../src/forms-ui/md/icons.tsx","../../src/forms-ui/md/TableGrid.tsx","../../src/forms-ui/MarkdownEditor.tsx","../../src/forms-ui/issues.ts","../../src/forms-ui/values.ts","../../src/forms-ui/ContentForm.tsx","../../src/media/errors.ts","../../src/media/resize.ts","../../src/media/paths.ts","../../src/studio-ui/useImages.ts","../../src/studio-ui/ContentEditor.tsx","../../src/studio-ui/RemoveItem.tsx","../../src/studio-ui/useDeployed.ts","../../src/studio-ui/PublishPanel.tsx","../../src/studio-ui/SlugToggle.tsx","../../src/studio-ui/account/ui.tsx","../../src/studio-ui/PasswordSignIn.tsx","../../src/studio-ui/AcceptInvite.tsx","../../src/studio-ui/pages.tsx","../../src/studio-ui/account/PictureUploader.tsx","../../src/studio-ui/account/ProfileTab.tsx","../../src/studio-ui/account/PasswordTab.tsx","../../src/studio-ui/account/TeamTab.tsx","../../src/studio-ui/account/BusinessTab.tsx","../../src/studio-ui/account/AccountTabs.tsx","../../src/studio-ui/account/StudioAccount.tsx","../../src/studio-ui/facts.ts","../../src/studio-ui/types.ts"],"names":["createContext","jsx","useContext","jsxs","useState","useEffect","useRef","usePathname","Fragment","useMemo","createBrowserClient","useId","labelFor","useCallback","base","useImages","useTransition","read","useRouter","Link","keyFor","useSyncExternalStore","Field","toBase64","error","initialsOf","role","useSearchParams","Suspense"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\n/**\n * What every Studio component needs and cannot import: the site's registry\n * (functions and zod schemas — not serialisable, so it must come from a client\n * module the site owns) and the site's server actions (created in the site,\n * because Next only compiles \"use server\" in app code).\n *\n * A site provides both once, in its own tiny client file:\n *\n * \"use client\";\n * import { contentTypes } from \"./content-types\";\n * import { StudioProvider } from \"@realiizlabs/admin/studio-ui\";\n * export function Studio({ actions, children }) {\n * return <StudioProvider contentTypes={contentTypes} actions={actions}>{children}</StudioProvider>;\n * }\n */\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport type { ContentTypeEntry } from \"../forms/types\";\nimport type { StudioActions } from \"./types\";\n\nexport interface StudioContextValue {\n contentTypes: Record<string, ContentTypeEntry>;\n actions: StudioActions;\n /** Who to ask when something needs the agency — \"your web team\" by default. */\n supportName: string;\n siteName: string;\n}\n\nconst Ctx = createContext<StudioContextValue | null>(null);\n\nexport function StudioProvider({ contentTypes, actions, supportName = \"your web team\", siteName = \"Studio\", children }: {\n contentTypes: Record<string, ContentTypeEntry>;\n actions: StudioActions;\n supportName?: string;\n siteName?: string;\n children: ReactNode;\n}) {\n return <Ctx.Provider value={{ contentTypes, actions, supportName, siteName }}>{children}</Ctx.Provider>;\n}\n\nexport function useStudio(): StudioContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"Studio components need a <StudioProvider> above them — see @realiizlabs/admin/studio-ui.\");\n return v;\n}\n\nexport function useEntry(typeId: string): ContentTypeEntry | null {\n return useStudio().contentTypes[typeId] ?? null;\n}\n\n/** Pictures for a type live under public/<last folder segment>/. */\nexport function publicDirOf(entry: { folder: string }): string {\n return `/${entry.folder.split(\"/\").filter(Boolean).pop() ?? \"images\"}/`;\n}\n","/** Seven stroke icons, 18px, currentColor. Registry ids pick one; unknown ids get `doc`. */\n\nimport type { SVGProps } from \"react\";\n\nexport type IconName = \"home\" | \"posts\" | \"events\" | \"venues\" | \"users\" | \"settings\" | \"doc\";\n\nconst base: SVGProps<SVGSVGElement> = {\n width: 18, height: 18, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\",\n strokeWidth: 1.7, strokeLinecap: \"round\", strokeLinejoin: \"round\", \"aria-hidden\": true,\n style: { flexShrink: 0 },\n};\n\nexport function Icon({ name }: { name: IconName }) {\n switch (name) {\n case \"home\":\n return <svg {...base}><rect x=\"3\" y=\"3\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\" rx=\"1\" /><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\" rx=\"1\" /></svg>;\n case \"posts\":\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /><path d=\"M9 12h7M9 16h7M9 8h3\" /></svg>;\n case \"events\":\n return <svg {...base}><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M8 3v4M16 3v4M3 10h18\" /></svg>;\n case \"venues\":\n return <svg {...base}><path d=\"M12 21s7-6.2 7-11.5A7 7 0 0 0 5 9.5C5 14.8 12 21 12 21z\" /><circle cx=\"12\" cy=\"9.5\" r=\"2.5\" /></svg>;\n case \"users\":\n return <svg {...base}><circle cx=\"9\" cy=\"8\" r=\"3.5\" /><path d=\"M2.5 20a6.5 6.5 0 0 1 13 0\" /><circle cx=\"17\" cy=\"9\" r=\"2.5\" /><path d=\"M15.5 14.5a5 5 0 0 1 6 5\" /></svg>;\n case \"settings\":\n // Two sliders — the same mark the visibility tracker uses, so Studio and the tracker read as one family.\n return <svg {...base}><path d=\"M4 7h9\" /><circle cx=\"16\" cy=\"7\" r=\"2\" /><path d=\"M19 7h1\" /><path d=\"M4 17h9\" /><circle cx=\"16\" cy=\"17\" r=\"2\" /><path d=\"M19 17h1\" /></svg>;\n default:\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /></svg>;\n }\n}\n\nexport function iconFor(id: string): IconName {\n const known: IconName[] = [\"home\", \"posts\", \"events\", \"venues\", \"users\", \"settings\"];\n return (known as string[]).includes(id) ? (id as IconName) : \"doc\";\n}\n","/**\n * Sidebar — items from the content-type registry (via navFromContentTypes),\n * active by href prefix, collapsible with the state remembered per browser.\n * Plain anchors: the package does not know which router the host uses.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { Icon, iconFor } from \"./icons\";\n\nexport interface NavItem {\n id: string;\n label: string;\n href: string;\n /** Icon id; unknown ids fall back to a document icon. Defaults to `id`. */\n icon?: string;\n /** Shown greyed out and not navigable — a section that is coming but not built yet. */\n disabled?: boolean;\n}\n\nexport const SIDEBAR_KEY = \"rz-admin-sidebar\";\n\nexport function isActive(item: NavItem, activeHref: string, basePath: string): boolean {\n if (item.href === basePath) return activeHref === basePath || activeHref === `${basePath}/`;\n return activeHref === item.href || activeHref.startsWith(`${item.href}/`);\n}\n\nexport function Sidebar({ items, pinned = [], activeHref, basePath }: { items: NavItem[]; pinned?: NavItem[]; activeHref: string; basePath: string }) {\n const [collapsed, setCollapsed] = useState(false);\n\n useEffect(() => {\n try {\n if (window.localStorage.getItem(SIDEBAR_KEY) === \"collapsed\") setCollapsed(true);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const toggle = () => {\n const next = !collapsed;\n setCollapsed(next);\n try {\n window.localStorage.setItem(SIDEBAR_KEY, next ? \"collapsed\" : \"open\");\n } catch {\n /* ignore */\n }\n };\n\n const renderItem = (item: NavItem) => {\n const active = !item.disabled && isActive(item, activeHref, basePath);\n if (item.disabled) {\n return (\n <span key={item.id} className=\"rz-sidebar__item rz-sidebar__item--disabled\" aria-disabled=\"true\" title={collapsed ? `${item.label} — coming soon` : \"Coming soon\"}>\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </span>\n );\n }\n return (\n <a\n key={item.id}\n href={item.href}\n className={[\"rz-sidebar__item\", active && \"rz-sidebar__item--active\"].filter(Boolean).join(\" \")}\n aria-current={active ? \"page\" : undefined}\n title={collapsed ? item.label : undefined}\n >\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </a>\n );\n };\n\n return (\n <aside className={[\"rz-sidebar\", collapsed && \"rz-sidebar--collapsed\"].filter(Boolean).join(\" \")} aria-label=\"Admin navigation\">\n <nav className=\"rz-sidebar__nav\">{items.map(renderItem)}</nav>\n {/* Pinned above Collapse (Settings) so it stays in one place as sections are added, instead of drifting down the list. */}\n {pinned.length > 0 && <nav className=\"rz-sidebar__pinned\" aria-label=\"Settings\">{pinned.map(renderItem)}</nav>}\n <button\n type=\"button\"\n className=\"rz-sidebar__collapse\"\n onClick={toggle}\n aria-label={collapsed ? \"Expand navigation\" : \"Collapse navigation\"}\n title={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ transform: collapsed ? \"rotate(180deg)\" : undefined }}>\n <path d=\"M15 6l-6 6 6 6\" />\n </svg>\n <span className=\"rz-sidebar__label\">Collapse</span>\n </button>\n </aside>\n );\n}\n","/**\n * Light / dark, remembered per browser. The attribute lives on the .rz-admin\n * root (not <html>) so the host site's own theme is never touched.\n *\n * No flash of the wrong theme: the server renders defaultTheme, and the effect\n * only flips when a stored value differs — a single client-side change, never\n * a mismatch between server HTML and first client render.\n */\n\nimport { useEffect, useState } from \"react\";\n\nexport type Theme = \"light\" | \"dark\";\nexport const THEME_KEY = \"rz-admin-theme\";\n\nexport function useTheme(defaultTheme: Theme = \"light\"): [Theme, (t: Theme) => void] {\n const [theme, setTheme] = useState<Theme>(defaultTheme);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(THEME_KEY);\n if (stored === \"light\" || stored === \"dark\") setTheme(stored);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const set = (t: Theme) => {\n setTheme(t);\n try {\n window.localStorage.setItem(THEME_KEY, t);\n } catch {\n /* ignore */\n }\n };\n return [theme, set];\n}\n\nexport function ThemeToggle({ theme, onChange }: { theme: Theme; onChange: (t: Theme) => void }) {\n return (\n <span className=\"rz-seg\" role=\"group\" aria-label=\"Theme\">\n <button type=\"button\" aria-pressed={theme === \"light\"} onClick={() => onChange(\"light\")}>Light</button>\n <button type=\"button\" aria-pressed={theme === \"dark\"} onClick={() => onChange(\"dark\")}>Dark</button>\n </span>\n );\n}\n","/**\n * Avatar button → menu, tracker-style: a header with who you are, then\n * full-width rows each led by a 14px icon. Sign out is a plain POST form so it\n * works before hydration.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { ThemeToggle, type Theme } from \"./ThemeToggle\";\n\nexport interface ShellUser {\n email: string;\n name?: string | null;\n /** Profile photo; initials show when absent. */\n avatarUrl?: string | null;\n}\n\nexport function firstNameOf(user: ShellUser): string {\n const fromName = user.name?.trim().split(/\\s+/)[0];\n if (fromName) return fromName;\n const local = user.email.split(\"@\")[0] ?? \"\";\n return local ? local.charAt(0).toUpperCase() + local.slice(1) : \"there\";\n}\n\nexport function initialsOf(user: ShellUser): string {\n const parts = user.name?.trim().split(/\\s+/).filter(Boolean) ?? [];\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (user.email[0] ?? \"?\").toUpperCase();\n}\n\nconst ico = { width: 14, height: 14, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const, \"aria-hidden\": true };\nconst ShieldIcon = () => <svg {...ico}><path d=\"M12 3l7 3v5c0 5-3.5 8.5-7 10-3.5-1.5-7-5-7-10V6z\" /></svg>;\nconst SunIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" /></svg>;\nconst UserIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 21a8 8 0 0 1 16 0\" /></svg>;\n// An open book — \"the guide\". Two clean strokes that stay legible at 14px.\nconst HelpIcon = () => <svg {...ico}><path d=\"M2 4h6a4 4 0 0 1 4 4v12a3 3 0 0 0-3-3H2z\" /><path d=\"M22 4h-6a4 4 0 0 0-4 4v12a3 3 0 0 1 3-3h7z\" /></svg>;\nconst OutIcon = () => <svg {...ico}><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"M16 17l5-5-5-5\" /><path d=\"M21 12H9\" /></svg>;\n\nexport function AccountMenu({ user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n user: ShellUser;\n role: string;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n /** The Account page (My Profile · Change Password · Team · Business). Omit to hide the item. */\n accountHref?: string;\n /** The Help centre. Omit to hide the item. */\n helpHref?: string;\n}) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (!wrap.current?.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n return (\n <div ref={wrap} style={{ position: \"relative\" }}>\n <button type=\"button\" className=\"rz-avatar\" aria-haspopup=\"menu\" aria-expanded={open} aria-label=\"Account menu\" onClick={() => setOpen((v) => !v)}>\n {user.avatarUrl ? <img src={user.avatarUrl} alt=\"\" className=\"rz-avatar__img\" /> : initialsOf(user)}\n </button>\n\n {open && (\n <div className=\"rz-menu\" role=\"menu\">\n <div className=\"rz-menu__who\">\n <div className=\"rz-menu__name\">{user.name?.trim() || user.email}</div>\n {user.name?.trim() && <div className=\"rz-menu__email\">{user.email}</div>}\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <ShieldIcon />\n <span>Role</span>\n <span className=\"rz-menu__end rz-pill rz-pill--plain\">{role}</span>\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <SunIcon />\n <span>Theme</span>\n <span className=\"rz-menu__end\"><ThemeToggle theme={theme} onChange={onTheme} /></span>\n </div>\n {(accountHref || helpHref) && <div className=\"rz-menu__sep\" />}\n {accountHref && (\n <a href={accountHref} role=\"menuitem\" className=\"rz-menu__item\">\n <UserIcon />\n Account\n </a>\n )}\n {helpHref && (\n <a href={helpHref} role=\"menuitem\" className=\"rz-menu__item\">\n <HelpIcon />\n Help\n </a>\n )}\n <div className=\"rz-menu__sep\" />\n <form method=\"post\" action={signOutPath} className=\"rz-menu__signout\">\n <button type=\"submit\" role=\"menuitem\" className=\"rz-menu__item\">\n <OutIcon />\n Sign out\n </button>\n </form>\n </div>\n )}\n </div>\n );\n}\n","/** Top bar: brand on the left, greeting + account menu on the right. */\n\nimport { AccountMenu, firstNameOf, type ShellUser } from \"./AccountMenu\";\nimport type { Theme } from \"./ThemeToggle\";\n\nexport function TopBar({ siteName, productName, logoUrl, homeHref, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n siteName: string;\n productName: string;\n logoUrl?: string | null;\n homeHref: string;\n user: ShellUser | null;\n role: string | null;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n accountHref?: string;\n helpHref?: string;\n}) {\n return (\n <header className=\"rz-topbar\">\n <a href={homeHref} className=\"rz-topbar__brand\">\n {/* the site's own mark (usually its favicon); next/image is deliberately not used in the package */}\n {logoUrl && <img src={logoUrl} alt=\"\" className=\"rz-topbar__logo\" />}\n <span>{siteName}</span>\n <span className=\"rz-topbar__product\">{productName}</span>\n </a>\n {user && role && (\n <div className=\"rz-topbar__right\">\n <span className=\"rz-topbar__greeting\" data-testid=\"rz-greeting\">Welcome back, {firstNameOf(user)}</span>\n <AccountMenu user={user} role={role} theme={theme} onTheme={onTheme} signOutPath={signOutPath} accountHref={accountHref} helpHref={helpHref} />\n </div>\n )}\n </header>\n );\n}\n","/**\n * SHELL_CSS — the design system, as one string the shell injects.\n *\n * Palette borrowed from the visibility tracker (Realiiz's back-office look):\n * warm bone/ink with an operative-green signal. Light is the default so every\n * install looks finished; dark is one attribute away. Everything is scoped to\n * `.rz-admin` so a host site's variables never leak in and ours never leak out.\n *\n * A site overrides by redeclaring any variable on `.rz-admin` — e.g.\n * .rz-admin { --signal: #0a58ca; --rz-font: var(--font-inter), sans-serif; }\n *\n * The block at the end maps the forms-ui variables onto these tokens, so\n * ContentForm and MagicLinkForm re-skin without touching their own code.\n */\n\nexport const SHELL_CSS = `\n.rz-admin, .rz-admin[data-theme=\"light\"] {\n /* realiiz.com palette (src/app/globals.css): ink, bone, paper, signal blue, slate, line, amber */\n --ink: #0e1726; --bone: #f7f5f0; --signal: #1f6feb;\n --surface-0: #f7f5f0; --surface-1: #ffffff; --surface-2: #f1eee7; --surface-3: #e8e4da;\n --text-primary: #0e1726; --text-secondary: #5b6678; --text-muted: #8a93a5;\n --signal-dim: #1a63d8; --signal-glow: #5b9bff; --signal-warn: #e0a03b; --series-blue: #1f6feb;\n --border: #d9d4c8; --separator: #e9e5dc;\n --status-up: #15803d; --status-down: #dc2626; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin[data-theme=\"dark\"] { color-scheme: dark; }\n.rz-admin[data-theme=\"dark\"] {\n --ink: #eef0f5; --bone: #1b2334; --signal: #3b82f6;\n --surface-0: #1b2334; --surface-1: #222c42; --surface-2: #29344a; --surface-3: #36415c;\n --text-primary: #eef0f5; --text-secondary: #a2abbf; --text-muted: #77819a;\n --signal-dim: #8db4ff; --signal-glow: #aec9ff; --signal-warn: #eab058; --series-blue: #3b82f6;\n --border: #36415c; --separator: #2c3750;\n --status-up: #4ade80; --status-down: #f87171; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin {\n --rz-font: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --rz-font-display: var(--rz-font);\n --rz-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --rz-radius: 6px;\n --rz-sidebar: 220px; --rz-sidebar-collapsed: 58px; --rz-topbar: 52px;\n\n /* forms-ui speaks these; map them once so both packages agree */\n --realiiz-form-fg: var(--text-primary); --realiiz-form-muted: var(--text-muted);\n --realiiz-form-border: var(--border); --realiiz-form-accent: var(--signal);\n --realiiz-form-accent-fg: var(--signal-fg); --realiiz-form-danger: var(--status-down);\n --realiiz-form-radius: var(--rz-radius); --realiiz-form-font: var(--rz-font);\n --realiiz-form-focus-ring: 0 0 0 3px color-mix(in srgb, var(--signal) 25%, transparent);\n\n box-sizing: border-box; min-height: 100vh; display: flex; flex-direction: column;\n background: var(--surface-0); color: var(--text-primary);\n font-family: var(--rz-font); font-size: 14px; line-height: 1.45;\n}\n.rz-admin *, .rz-admin *::before, .rz-admin *::after { box-sizing: inherit; }\n.rz-admin a { color: inherit; }\n.rz-admin h1, .rz-admin h2, .rz-admin h3 { font-family: var(--rz-font-display); color: var(--text-primary); margin: 0; }\n.rz-admin .realiiz-form__control { background: var(--surface-0); }\n.rz-admin .realiiz-image { background: var(--surface-0); }\n.rz-admin .realiiz-image__thumb { background: var(--surface-2); }\n.rz-admin[data-theme=\"dark\"] .realiiz-form__control::-webkit-calendar-picker-indicator { filter: invert(1) opacity(.7); }\n.rz-admin .realiiz-form__button { background: var(--surface-1); color: var(--text-primary); }\n.rz-admin .realiiz-form__button--primary { background: var(--signal); color: var(--signal-fg); }\n\n/* ---- frame ---------------------------------------------------------- */\n.rz-topbar { height: var(--rz-topbar); display: flex; align-items: center; gap: 1rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); background: var(--surface-1); flex-shrink: 0; }\n.rz-topbar__brand { display: flex; align-items: center; gap: .6rem; font-weight: 600; font-size: .9375rem; text-decoration: none; }\n.rz-topbar__logo { height: 22px; width: auto; display: block; }\n.rz-topbar__product { font-weight: 400; color: var(--text-secondary); }\n.rz-topbar__right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }\n.rz-topbar__greeting { color: var(--text-secondary); font-size: .8rem; }\n.rz-body { display: flex; flex: 1; min-height: 0; }\n/* Top bar and sidebar stay put while the content scrolls, so Collapse is always at the bottom-left. */\n.rz-topbar { position: sticky; top: 0; z-index: 20; }\n.rz-sidebar { position: sticky; top: var(--rz-topbar); height: calc(100vh - var(--rz-topbar)); width: var(--rz-sidebar); flex-shrink: 0; border-right: 1px solid var(--border); background: var(--surface-1); display: flex; flex-direction: column; transition: width .15s ease; overflow: hidden; }\n.rz-sidebar--collapsed { width: var(--rz-sidebar-collapsed); }\n.rz-sidebar__nav { padding: .75rem 0; flex: 1; overflow-y: auto; }\n.rz-sidebar__item { display: flex; align-items: center; gap: .65rem; padding: .55rem 1rem; color: var(--text-secondary); text-decoration: none; font-size: .875rem; font-weight: 400; white-space: nowrap; overflow: hidden; }\n.rz-sidebar__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-sidebar__item--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-sidebar__item--disabled, .rz-sidebar__item--disabled:hover { color: var(--text-muted); opacity: .55; background: transparent; cursor: default; }\n.rz-sidebar--collapsed .rz-sidebar__item { justify-content: center; padding: .55rem 0; }\n.rz-sidebar--collapsed .rz-sidebar__label { display: none; }\n.rz-sidebar__pinned { border-top: 1px solid var(--separator); padding: .3rem 0; }\n.rz-sidebar__collapse { display: flex; align-items: center; gap: .7rem; padding: .6rem 1rem; border: 0; border-top: 1px solid var(--separator); background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: .8rem; text-align: left; }\n.rz-sidebar__collapse:hover { color: var(--text-primary); }\n.rz-sidebar__collapse svg { flex-shrink: 0; }\n.rz-sidebar--collapsed .rz-sidebar__collapse { justify-content: center; padding: .6rem 0; }\n.rz-main { flex: 1; min-width: 0; }\n.rz-content { max-width: 1400px; margin: 0; padding: 28px 32px 80px; }\n.rz-content .realiiz-form { max-width: none; }\n.rz-content .realiiz-form fieldset, .rz-content .realiiz-form__alert, .rz-content .realiiz-form__actions { max-width: 920px; }\n/* The form's save bar pins to the bottom of the content column: bleed out over .rz-content's padding, then pad back in. */\n.rz-content .realiiz-form__bar { position: sticky; bottom: 0; z-index: 10; margin: 24px -32px -80px; padding: 12px 32px; background: var(--surface-1); border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.05); }\n.rz-content .realiiz-form__status { color: var(--text-muted); }\n.rz-content .realiiz-form__bar[data-dirty] .realiiz-form__status { color: var(--text-primary); font-weight: 500; }\n\n/* ---- primitives ----------------------------------------------------- */\n/* Same metrics as the form's Save button (.realiiz-form__button) so every button in the admin matches. */\n.rz-btn { font-family: inherit; font-weight: 600; border-radius: var(--rz-radius); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .4rem; white-space: nowrap; line-height: 1.2; }\n.rz-btn--md { padding: 10px 16px; font-size: 15px; min-height: 40px; }\n.rz-btn--sm { padding: 6px 12px; font-size: 13px; min-height: 32px; }\n.rz-admin .rz-btn--primary, .rz-admin a.rz-btn--primary { background: var(--signal); color: var(--signal-fg); border: 1px solid var(--signal); }\n.rz-admin .rz-btn--secondary, .rz-admin a.rz-btn--secondary { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn--danger, .rz-admin a.rz-btn--danger { background: transparent; color: var(--status-down); border: 1px solid var(--status-down); }\n.rz-admin .rz-btn--ghost, .rz-admin a.rz-btn--ghost { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn:disabled { opacity: .55; cursor: default; }\n.rz-arrow { width: 1.1em; height: 1.1em; flex-shrink: 0; transition: transform .15s ease-out; }\n@media (prefers-reduced-motion: no-preference) {\n .rz-btn:hover .rz-arrow, a:hover .rz-arrow { transform: translate(2px, -2px); }\n .rz-btn:hover .rz-arrow--fwd, a:hover .rz-arrow--fwd { transform: translateX(4px); }\n}\n.rz-card { display: flex; flex-direction: column; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.rz-card--narrow { max-width: 760px; }\n.rz-card__title { font-size: .9375rem; font-weight: 600; margin-bottom: .35rem; }\n.rz-card__meta { color: var(--text-muted); font-size: .8rem; }\n.rz-card__actions { display: flex; gap: .5rem; margin-top: auto; padding-top: .9rem; flex-wrap: wrap; }\n.rz-card__note { margin-top: .5rem; }\n.rz-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }\n.rz-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n.rz-pagehead__eyebrow { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: .3rem; }\n.rz-pagehead h1 { font-size: 1.375rem; font-weight: 600; }\n.rz-pagehead__sub { color: var(--text-secondary); font-size: .85rem; margin-top: .25rem; }\n.rz-pill { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; padding: .15rem .5rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text-secondary); }\n.rz-pill::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--status-neutral); }\n.rz-pill--up::before { background: var(--status-up); } .rz-pill--warn::before { background: var(--signal-warn); } .rz-pill--down::before { background: var(--status-down); }\n.rz-pill--plain::before { display: none; }\n/* ---- steps tracker ------------------------------------------------- */\n/* Dots on one rail, connectors dot-to-dot, label under each dot; left-aligned like the rest of the page. */\n.rz-steps { list-style: none; margin: 4px 0 22px; padding: 0 0 22px; display: flex; border-bottom: 1px solid var(--separator); }\n.rz-step { flex: 1; position: relative; display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 8px; min-width: 0; }\n.rz-step:last-child { flex: 0 0 auto; }\n.rz-step:not(:last-child)::after { content: \"\"; position: absolute; top: 12px; left: 26px; right: 0; height: 2px; background: var(--border); }\n.rz-step--done:not(:last-child)::after { background: var(--status-up); }\n.rz-step__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex-shrink: 0; border: 2px solid var(--border); color: var(--text-muted); background: var(--surface-1); }\n.rz-step--done .rz-step__dot { background: var(--status-up); border-color: var(--status-up); color: #fff; }\n.rz-step--active .rz-step__dot { position: relative; border-color: color-mix(in srgb, var(--signal) 30%, transparent); color: var(--signal); }\n/* A spinning arc over the ring: the step is working, not waiting on you. */\n.rz-step--active .rz-step__dot::after { content: \"\"; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--signal); animation: rz-spin .9s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .rz-step--active .rz-step__dot::after { animation: none; border-color: var(--signal); } }\n@keyframes rz-spin { to { transform: rotate(360deg); } }\n.rz-step--failed .rz-step__dot { background: var(--status-down); border-color: var(--status-down); color: #fff; }\n.rz-step__text { display: flex; flex-direction: column; gap: 1px; padding-right: 16px; }\n.rz-step__label { font-size: .875rem; font-weight: 500; color: var(--text-secondary); }\n.rz-step--active .rz-step__label, .rz-step--done .rz-step__label { color: var(--text-primary); }\n.rz-step--failed .rz-step__label { color: var(--status-down); }\n.rz-step__note { font-size: .75rem; color: var(--text-muted); }\n@keyframes rz-pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); } 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--signal) 8%, transparent); } }\n.rz-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 20px; }\n.rz-actions__hint { font-size: .8rem; color: var(--text-muted); }\n.rz-notice { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-1); margin-bottom: 18px; font-size: .9rem; }\n.rz-notice__text { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n.rz-status-link { text-decoration: none; }\n.rz-discard { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--separator); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .85rem; color: var(--text-secondary); }\n.rz-discard__link { background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-discard__link:hover { color: var(--status-down); }\n.rz-nowrap { white-space: nowrap; }\n.rz-table td.rz-fit, .rz-table th.rz-fit { width: 1%; white-space: nowrap; }\n.rz-empty { border: 1px dashed var(--border); border-radius: 8px; padding: 32px; text-align: center; color: var(--text-secondary); }\n.rz-empty h3 { font-size: 1rem; margin-bottom: .4rem; }\n.rz-table-wrap { width: 100%; }\n.rz-table { width: 100%; border-collapse: collapse; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\n.rz-table th, .rz-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--separator); font-size: .875rem; vertical-align: top; }\n.rz-table th { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); background: var(--surface-2); }\n.rz-table tr:last-child td { border-bottom: 0; }\n.rz-muted { color: var(--text-muted); }\n.rz-alert { border: 1px solid var(--status-down); color: var(--status-down); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n.rz-ok { border: 1px solid var(--status-up); color: var(--signal-dim); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n\n/* ---- account menu --------------------------------------------------- */\n.rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }\n.rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }\n.rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }\n.rz-tabs__tab:hover { color: var(--text-primary); }\n.rz-tabs__tab[aria-selected=\"true\"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }\n.rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }\n.rz-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); color: var(--text-primary); font-size: .6875rem; font-weight: 600; letter-spacing: .04em; display: flex; align-items: center; justify-content: center; cursor: pointer; font-family: inherit; padding: 0; overflow: hidden; }\n.rz-menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 15rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(14,23,38,.14); overflow: hidden; z-index: 50; }\n.rz-menu__who { padding: .75rem .9rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }\n.rz-menu__name { font-weight: 600; font-size: .875rem; }\n.rz-menu__email { color: var(--text-muted); font-size: .75rem; word-break: break-all; }\n.rz-menu__sep { height: 1px; background: var(--border); margin: .3rem 0; }\n.rz-menu__item { display: flex; align-items: center; gap: .55rem; width: 100%; padding: .45rem .9rem; font: inherit; font-size: .8125rem; color: var(--text-secondary); background: none; border: 0; text-align: left; cursor: pointer; text-decoration: none; }\n.rz-menu__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-menu__item svg { flex-shrink: 0; }\n.rz-menu__item--static { cursor: default; }\n.rz-menu__item--static:hover { background: none; color: var(--text-secondary); }\n.rz-menu__item .rz-menu__end { margin-left: auto; }\n.rz-menu__signout { margin: 0 0 .3rem; }\n.rz-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--rz-radius); overflow: hidden; }\n.rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }\n.rz-seg button[aria-pressed=\"true\"] { background: var(--surface-3); color: var(--text-primary); }\n\n/* ---- mobile: sidebar becomes a strip under the top bar --------------- */\n@media (max-width: 720px) {\n .rz-body { flex-direction: column; }\n .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }\n .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }\n .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }\n .rz-sidebar--collapsed .rz-sidebar__label { display: block; }\n .rz-sidebar__collapse { display: none; }\n .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }\n .rz-topbar__greeting { display: none; }\n .rz-content { padding: 18px 14px 60px; }\n /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */\n .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }\n .rz-sidebar__item--disabled { display: none; }\n /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */\n .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }\n .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }\n /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */\n .rz-admin .realiiz-md__head { padding: 5px; }\n .rz-admin .realiiz-md__insert { border-left: 0; padding-left: 0; margin-left: 0; }\n .rz-admin .realiiz-md__lab { display: none; }\n .rz-admin .realiiz-md--fs { padding: 8px; }\n /* Tracker: notes hide, labels shrink, so three steps fit a phone. */\n .rz-step__note { display: none; }\n .rz-step__label { font-size: .8rem; }\n .rz-step:not(:last-child)::after { right: 6px; }\n /* Tables scroll sideways inside their own box instead of stretching the page. */\n .rz-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n .rz-pagehead { align-items: flex-start; flex-direction: column; }\n .rz-notice { flex-direction: column; align-items: flex-start; }\n .rz-card--narrow { max-width: none; }\n}\n\n/* ---- forms extras: markdown editor, chips, gauges, preview prose --------- */\n.rz-admin .realiiz-md { --_md-head: var(--surface-2); --_md-hover: var(--surface-2); --_md-hover-line: var(--signal-glow); --_md-on: color-mix(in srgb, var(--signal) 12%, var(--surface-1)); --_md-tip: var(--ink); }\n.rz-admin .realiiz-md__mode { background: var(--surface-2); }\n.rz-admin .realiiz-md__mode button { color: var(--text-secondary); }\n.rz-admin .realiiz-md__mode button[aria-selected=\"true\"] { background: var(--surface-1); color: var(--text-primary); box-shadow: 0 1px 2px rgba(14,23,38,.12); }\n.rz-admin .realiiz-md__panel, .rz-admin .realiiz-md__tgrid, .rz-admin .realiiz-md--fs, .rz-admin .realiiz-md .realiiz-md__ta, .rz-admin .realiiz-md__preview, .rz-admin .realiiz-md__head button { background: var(--surface-1); }\n.rz-admin .realiiz-md__head { background: var(--surface-2); }\n.rz-admin .realiiz-md__head button { color: var(--text-primary); }\n.rz-admin .realiiz-md__insert button { background: var(--surface-2); color: var(--text-secondary); }\n.rz-admin .realiiz-md__tgcells i { background: var(--surface-1); }\n.rz-admin .realiiz-md__tgcells i.hot { background: color-mix(in srgb, var(--signal) 18%, var(--surface-1)); }\n.rz-admin .realiiz-md__loading { color: var(--text-muted); font-size: .8rem; }\n.rz-admin .realiiz-prose { max-width: 68ch; font-size: 1rem; line-height: 1.65; color: var(--text-primary); }\n.rz-admin .realiiz-prose h1, .rz-admin .realiiz-prose h2, .rz-admin .realiiz-prose h3 { font-family: var(--rz-font-display); line-height: 1.25; margin: 1.4em 0 .5em; }\n.rz-admin .realiiz-prose h2 { font-size: 1.35rem; } .rz-admin .realiiz-prose h3 { font-size: 1.1rem; }\n.rz-admin .realiiz-prose p, .rz-admin .realiiz-prose ul, .rz-admin .realiiz-prose ol, .rz-admin .realiiz-prose blockquote { margin: 0 0 1em; }\n.rz-admin .realiiz-prose a { color: var(--signal); }\n/* The site's prose class picks a slate body colour for a light page; on the dark surface that reads as disabled. */\n.rz-admin[data-theme=\"dark\"] .realiiz-prose, .rz-admin[data-theme=\"dark\"] .realiiz-prose :is(p, li, td, th, dd, dt, figcaption, strong, b, em, i, h1, h2, h3, h4, h5, h6) { color: var(--text-primary); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose :is(code, kbd) { color: var(--text-primary); background: var(--surface-3); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose a { color: var(--signal-dim); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose hr { border-color: var(--border); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose blockquote { color: var(--text-secondary); }\n.rz-admin .realiiz-prose blockquote { border-left: 3px solid var(--border); padding-left: 1em; color: var(--text-secondary); }\n.rz-admin .realiiz-prose code { background: var(--surface-2); padding: 0 4px; border-radius: 4px; font-family: var(--rz-font-mono); font-size: .9em; }\n.rz-admin .realiiz-prose pre { background: var(--surface-2); padding: 12px 14px; border-radius: 6px; overflow-x: auto; }\n.rz-admin .realiiz-prose img { max-width: 100%; height: auto; border-radius: 6px; }\n.rz-admin .realiiz-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 40px; padding: 5px 8px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--rz-radius); }\n.rz-admin .realiiz-chips:focus-within { border-color: var(--signal); box-shadow: var(--realiiz-form-focus-ring); }\n.rz-admin .realiiz-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; color: var(--text-primary); }\n.rz-admin .realiiz-chip button { font: inherit; line-height: 1; width: 18px; height: 18px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; }\n.rz-admin .realiiz-chip button:hover { background: var(--status-down); color: #fff; }\n.rz-admin .realiiz-chips__input { flex: 1; min-width: 120px; border: 0; background: transparent; font: inherit; color: inherit; outline: none; padding: 4px; }\n.rz-admin .realiiz-chips__count { margin-left: auto; color: var(--text-muted); font-size: .75rem; font-variant-numeric: tabular-nums; }\n.rz-admin .realiiz-gauge { color: var(--text-muted); }\n.rz-admin .realiiz-gauge__bar { background: var(--surface-3); }\n.rz-admin .realiiz-gauge__zone { background: color-mix(in srgb, var(--status-up) 28%, transparent); }\n.rz-admin .realiiz-gauge__fill { background: var(--text-muted); }\n.rz-admin .realiiz-gauge--ok .realiiz-gauge__fill { background: var(--status-up); } .rz-admin .realiiz-gauge--ok { color: var(--status-up); }\n.rz-admin .realiiz-gauge--over .realiiz-gauge__fill { background: var(--status-down); } .rz-admin .realiiz-gauge--over { color: var(--status-down); }\n`;\n","/**\n * AdminShell — the frame every /admin page renders inside.\n *\n * Pure presentation: the host passes the session, the nav (from the registry)\n * and the current path. No env, no fetch, no router import. Tokens are\n * injected once via <style>; a site overrides them on `.rz-admin`.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ShellUser } from \"./AccountMenu\";\nimport { Sidebar, type NavItem } from \"./Sidebar\";\nimport { TopBar } from \"./TopBar\";\nimport { useTheme, type Theme } from \"./ThemeToggle\";\nimport { SHELL_CSS } from \"./tokens\";\n\nexport interface AdminShellProps {\n siteName: string;\n /** What the product is called in the top bar, e.g. \"Realiiz Studio\". Default \"Studio\" (shown as \"{siteName} Studio\"). */\n productName?: string;\n logoUrl?: string | null;\n /** null when nobody is signed in (sign-in page, not-configured page). */\n user: ShellUser | null;\n role: string | null;\n nav: NavItem[];\n /** Items pinned above Collapse (Settings), so they stay put as sections are added. */\n pinnedNav?: NavItem[];\n /** The current pathname, for the active nav item. */\n activeHref: string;\n /** Default \"/admin\". */\n basePath?: string;\n /** Default `${basePath}/auth/signout`. */\n signOutPath?: string;\n /** Account page for the avatar menu. Default `${basePath}/account`; null hides the item. */\n accountHref?: string | null;\n /** Help centre for the avatar menu. Default `${basePath}/help`; null hides the item. */\n helpHref?: string | null;\n /**\n * The client's own branding (Business tab). `name` replaces siteName in the top bar\n * and `logoUrl` replaces the logo; the product word (\"Studio\") stays.\n */\n branding?: { name?: string | null; logoUrl?: string | null } | null;\n defaultTheme?: Theme;\n children: ReactNode;\n}\n\nexport function AdminShell({\n siteName, productName = \"Studio\", logoUrl, user, role, nav, pinnedNav, activeHref,\n basePath = \"/admin\", signOutPath, accountHref, helpHref, branding, defaultTheme = \"light\", children,\n}: AdminShellProps) {\n const [theme, setTheme] = useTheme(defaultTheme);\n const showNav = Boolean(user && role);\n const shownName = branding?.name?.trim() || siteName;\n const shownLogo = branding?.logoUrl || logoUrl;\n\n return (\n <div className=\"rz-admin\" data-theme={theme}>\n <style>{SHELL_CSS}</style>\n <TopBar\n siteName={shownName}\n productName={productName}\n logoUrl={shownLogo}\n homeHref={basePath}\n user={user}\n role={role}\n theme={theme}\n onTheme={setTheme}\n signOutPath={signOutPath ?? `${basePath}/auth/signout`}\n accountHref={accountHref === null ? undefined : (accountHref ?? `${basePath}/account`)}\n helpHref={helpHref === null ? undefined : (helpHref ?? `${basePath}/help`)}\n />\n <div className=\"rz-body\">\n {showNav && <Sidebar items={nav} pinned={pinnedNav} activeHref={activeHref} basePath={basePath} />}\n <main className=\"rz-main\">\n <div className=\"rz-content\">{children}</div>\n </main>\n </div>\n </div>\n );\n}\n","/**\n * The one source of button styling (the tracker's rule: hand-rolled buttons\n * drift). Classes only — everything resolves to tokens in SHELL_CSS.\n */\n\nimport type { AnchorHTMLAttributes, ButtonHTMLAttributes } from \"react\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\";\n\nexport function buttonClass(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\", extra?: string): string {\n return [\"rz-btn\", `rz-btn--${variant}`, `rz-btn--${size}`, extra].filter(Boolean).join(\" \");\n}\n\n/** Kept for parity with the tracker's API; returns the class string to spread onto an <a>. */\nexport function buttonStyle(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\") {\n return { className: buttonClass(variant, size) };\n}\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nexport function Button({ variant = \"secondary\", size = \"md\", className, type = \"button\", ...rest }: ButtonProps) {\n return <button type={type} className={buttonClass(variant, size, className)} {...rest} />;\n}\n\ninterface LinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Opens elsewhere (GitHub, the live site): new tab + the outbound arrow that lifts on hover, like realiiz.com. */\n external?: boolean;\n /** Leads onward inside the app (next step): a right arrow that slides on hover, like realiiz.com's CTAs. */\n forward?: boolean;\n}\n\nexport function LinkButton({ variant = \"secondary\", size = \"md\", className, external, forward, children, ...rest }: LinkButtonProps) {\n const extra = external ? { target: \"_blank\", rel: \"noreferrer\", ...rest } : rest;\n return (\n <a className={buttonClass(variant, size, className)} {...extra}>\n {children}\n {external && <OutboundArrow />}\n {forward && !external && <ForwardArrow />}\n </a>\n );\n}\n\nexport function ForwardArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow rz-arrow--fwd\">\n <path d=\"M5 12h14\" /><path d=\"m13 6 6 6-6 6\" />\n </svg>\n );\n}\n\n/** Drawn, not the ↗ glyph — the glyph sits high in its box and never centres. */\nexport function OutboundArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow\">\n <path d=\"M7 17 17 7\" /><path d=\"M7 7h10v10\" />\n </svg>\n );\n}\n","/** Card, PageHeader, StatusPill, EmptyState, Steps — the page-level vocabulary. */\n\nimport type { ReactNode } from \"react\";\n\nexport function Card({ title, meta, note, children, actions, className }: {\n title?: ReactNode; meta?: ReactNode;\n /** A short status line under the meta — a pill, a count — kept out of `meta` so long text never pushes the actions around. */\n note?: ReactNode;\n children?: ReactNode; actions?: ReactNode; className?: string;\n}) {\n return (\n <div className={[\"rz-card\", className].filter(Boolean).join(\" \")}>\n {title && <div className=\"rz-card__title\">{title}</div>}\n {meta && <div className=\"rz-card__meta\">{meta}</div>}\n {note && <div className=\"rz-card__note\">{note}</div>}\n {children}\n {actions && <div className=\"rz-card__actions\">{actions}</div>}\n </div>\n );\n}\n\nexport function PageHeader({ eyebrow, title, subtitle, actions }: {\n eyebrow?: ReactNode; title: ReactNode; subtitle?: ReactNode; actions?: ReactNode;\n}) {\n return (\n <div className=\"rz-pagehead\">\n <div>\n {eyebrow && <div className=\"rz-pagehead__eyebrow\">{eyebrow}</div>}\n <h1>{title}</h1>\n {subtitle && <div className=\"rz-pagehead__sub\">{subtitle}</div>}\n </div>\n {actions && <div className=\"rz-card__actions\" style={{ marginTop: 0 }}>{actions}</div>}\n </div>\n );\n}\n\nexport type PillTone = \"up\" | \"warn\" | \"down\" | \"neutral\" | \"plain\";\n\nexport function StatusPill({ tone = \"neutral\", children, title }: { tone?: PillTone; children: ReactNode; title?: string }) {\n return <span className={`rz-pill rz-pill--${tone}`} title={title}>{children}</span>;\n}\n\nexport function EmptyState({ title, children, action }: { title: ReactNode; children?: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"rz-empty\">\n <h3>{title}</h3>\n {children && <div>{children}</div>}\n {action && <div style={{ marginTop: 14 }}>{action}</div>}\n </div>\n );\n}\n\nexport type StepState = \"done\" | \"active\" | \"todo\" | \"failed\";\n\n/**\n * A short horizontal progress tracker: Saved → Checking → Live. One state per\n * step; the active one gets the pulse. Small enough to sit at the top of a card.\n */\nexport function Steps({ steps }: { steps: { label: ReactNode; state: StepState; note?: ReactNode }[] }) {\n return (\n <ol className=\"rz-steps\" aria-label=\"Progress\">\n {steps.map((st, i) => (\n <li key={i} className={`rz-step rz-step--${st.state}`} aria-current={st.state === \"active\" ? \"step\" : undefined}>\n <span className=\"rz-step__dot\" aria-hidden=\"true\">{st.state === \"done\" ? \"✓\" : st.state === \"failed\" ? \"!\" : i + 1}</span>\n <span className=\"rz-step__text\">\n <span className=\"rz-step__label\">{st.label}</span>\n {st.note && <span className=\"rz-step__note\">{st.note}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n","/**\n * Tabs — which SECTION of this page am I on (Account: My Profile · Change\n * Password · Team · Business). Underlined strip, same as the visibility\n * tracker's: five two-word labels stay on one line where pills would wrap.\n * Not for choosing a value or filtering — that is a segmented control.\n * Keyboard: Left/Right (and Home/End) move between tabs.\n */\n\nimport { useRef, type KeyboardEvent } from \"react\";\n\nexport interface TabOption {\n value: string;\n label: string;\n /** A small marker after the label — a count, an unsaved dot. Keep it short. */\n suffix?: string;\n}\n\nexport function Tabs({ options, value, onChange, label = \"Sections\" }: {\n options: TabOption[];\n value: string;\n onChange: (value: string) => void;\n label?: string;\n}) {\n const list = useRef<HTMLDivElement>(null);\n\n const onKey = (e: KeyboardEvent<HTMLDivElement>) => {\n const i = options.findIndex((o) => o.value === value);\n if (i < 0) return;\n let next = i;\n if (e.key === \"ArrowRight\") next = (i + 1) % options.length;\n else if (e.key === \"ArrowLeft\") next = (i - 1 + options.length) % options.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = options.length - 1;\n else return;\n e.preventDefault();\n onChange(options[next].value);\n (list.current?.children[next] as HTMLElement | undefined)?.focus();\n };\n\n return (\n <div ref={list} className=\"rz-tabs\" role=\"tablist\" aria-label={label} onKeyDown={onKey}>\n {options.map((o) => {\n const active = o.value === value;\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"tab\"\n className=\"rz-tabs__tab\"\n aria-selected={active}\n tabIndex={active ? 0 : -1}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n {o.suffix && <span className=\"rz-muted\"> {o.suffix}</span>}\n </button>\n );\n })}\n </div>\n );\n}\n","/** Studio's page styles (lists, account tabs, drop zones) — injected once by StudioShellFrame. */\n\nexport const STUDIO_CSS = `\n/*\n * /admin — overrides only. Layout, colour and components come from\n * @realiizlabs/admin/shell (SHELL_CSS, injected by AdminShell). The Realiiz\n * palette is the package default, so this file just maps the shell's font\n * hooks onto the site's loaded fonts. To rebrand, redeclare tokens here:\n * .rz-admin { --signal: #0a58ca; }\n */\n.rz-admin {\n --rz-font: var(--font-inter), system-ui, sans-serif;\n --rz-font-display: var(--font-space-grotesk), system-ui, sans-serif;\n --rz-font-mono: var(--font-jetbrains-mono), ui-monospace, monospace;\n}\n\n/* Posts table: one wide column for the post (title, slug beneath in small mono) and\n tight fixed columns for the known-width bits. Nothing wraps; the title and slug end in\n an ellipsis with the full text as tooltip. The title opens the live post; the outbound\n arrow sits inline after it and appears on hover (the shell's a:hover .rz-arrow motion). */\n.rz-admin .rz-table--posts { table-layout: fixed; width: 100%; }\n.rz-admin .rz-table--posts td, .rz-admin .rz-table--posts th { white-space: nowrap; overflow: hidden; }\n.rz-admin .rz-col-title { width: auto; }\n.rz-admin .rz-col-date { width: 7.5rem; }\n.rz-admin .rz-col-status { width: 11.5rem; }\n.rz-admin .rz-col-actions { width: 8.5rem; }\n.rz-admin .rz-title-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.rz-admin .rz-slug { font-family: var(--rz-font-mono); font-size: .78rem; margin-top: .2rem; }\n.rz-admin [data-slugs=\"off\"] .rz-slug { display: none; }\n.rz-admin .rz-toolbar { display: flex; justify-content: flex-end; margin: 0 0 .6rem; }\n.rz-admin .rz-switch { display: inline-flex; align-items: center; gap: .55rem; font-size: .8rem; color: var(--text-secondary); cursor: pointer; user-select: none; }\n.rz-admin .rz-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; }\n.rz-admin .rz-switch__track { position: relative; width: 30px; height: 18px; border-radius: 999px; background: var(--surface-3); transition: background .15s; }\n.rz-admin .rz-switch__thumb { position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.25); transition: transform .15s; }\n.rz-admin .rz-switch input:checked + .rz-switch__track { background: var(--signal); }\n.rz-admin .rz-switch input:checked + .rz-switch__track .rz-switch__thumb { transform: translateX(12px); }\n.rz-admin .rz-switch input:focus-visible + .rz-switch__track { outline: 2px solid var(--signal); outline-offset: 2px; }\n.rz-admin .rz-switch:hover .rz-switch__label { color: var(--text-primary); }\n.rz-admin .rz-title-link { display: flex; align-items: center; gap: .35em; max-width: 100%; color: inherit; text-decoration: none; }\n.rz-admin .rz-title-link .rz-arrow { opacity: 0; }\n.rz-admin .rz-title-link:hover { color: var(--signal); }\n.rz-admin .rz-title-link:hover .rz-arrow { opacity: 1; }\n@media (max-width: 720px) {\n .rz-admin .rz-col-status { width: 9rem; }\n .rz-admin .rz-col-actions { width: 6rem; }\n}\n\n/* Dashboard card for a section that isn't built yet: the real card, faded, buttons disabled. */\n/* Account page (05b): tracker-style — H1, email, underlined tabs, stacked form cards. */\n.rz-admin .acct-h1 { font-size: 1.25rem; font-weight: 600; margin: 0 0 .25rem; color: var(--text-primary); }\n.rz-admin .acct-email { font-size: .875rem; color: var(--text-muted); margin: 0 0 1.25rem; }\n.rz-admin .acct-stack { display: flex; flex-direction: column; gap: 1rem; max-width: 560px; }\n.rz-admin .acct-stack:has(.acct-team) { max-width: none; }\n.rz-admin .acct-card { display: flex; flex-direction: column; gap: .9rem; }\n.rz-admin .acct-title { font-size: 1rem; font-weight: 600; margin: 0; color: var(--text-primary); }\n.rz-admin .acct-blurb { font-size: .875rem; color: var(--text-secondary); margin: -.4rem 0 0; line-height: 1.5; }\n.rz-admin .acct-field { display: flex; flex-direction: column; gap: .35rem; }\n.rz-admin .acct-label { font-size: .85rem; font-weight: 500; color: var(--text-primary); }\n.rz-admin .acct-hint { font-size: .78rem; color: var(--text-muted); }\n.rz-admin .acct-input { font: inherit; font-size: .9rem; color: var(--text-primary); background: var(--surface-0); border: 1px solid var(--border); border-radius: 6px; padding: 9px 11px; min-height: 40px; width: 100%; }\n.rz-admin .acct-input:read-only { color: var(--text-secondary); background: var(--surface-2); }\n.rz-admin .acct-input:focus-visible { outline: 2px solid var(--signal); outline-offset: 1px; }\n.rz-admin .acct-select { width: auto; padding-right: 2rem; }\n.rz-admin .acct-select--sm { min-height: 32px; padding: 4px 28px 4px 8px; font-size: .8rem; }\n.rz-admin .acct-actions { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; }\n.rz-admin .acct-ok { font-size: .85rem; color: var(--signal); }\n.rz-admin .acct-link { font: inherit; font-size: .82rem; background: none; border: 0; padding: 0; color: var(--text-secondary); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-admin .acct-link:hover { color: var(--signal); }\n.rz-admin .acct-link--danger:hover { color: #c0392b; }\n.rz-admin .acct-link:disabled { opacity: .5; cursor: default; }\n.rz-admin .acct-team-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }\n.rz-admin .acct-invite__row { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; }\n.rz-admin .acct-invite__row .acct-input[type=\"email\"] { flex: 1 1 220px; width: auto; }\n.rz-admin .acct-person { display: flex; align-items: center; gap: .7rem; }\n.rz-admin .acct-person__avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); display: inline-flex; align-items: center; justify-content: center; font-size: .7rem; font-weight: 600; overflow: hidden; flex-shrink: 0; }\n.rz-admin .acct-person__avatar img { width: 100%; height: 100%; object-fit: cover; }\n.rz-admin .acct-person__text { display: flex; flex-direction: column; line-height: 1.25; }\n.rz-admin .acct-person__email { font-size: .78rem; }\n.rz-admin .acct-row-actions { display: flex; gap: .8rem; align-items: center; white-space: nowrap; min-height: 34px; }\n.rz-admin .acct-help-list { margin: 0; padding-left: 1.2rem; color: var(--text-secondary); line-height: 1.7; }\n\n/* Sign-in: the password option under the magic-link form. */\n.rz-admin .pwsi-toggle { margin: 1.1rem 0 0; text-align: center; }\n.rz-admin .pwsi { display: flex; flex-direction: column; gap: .9rem; margin-top: 1.25rem; padding-top: 1.25rem; border-top: 1px solid var(--separator); }\n\n/* Password boxes: eye toggle + the requirement checklist that lights up as each rule passes. */\n.rz-admin .acct-pw { position: relative; }\n.rz-admin .acct-pw .acct-input { padding-right: 2.6rem; }\n.rz-admin .acct-pw__eye { position: absolute; right: .5rem; top: 50%; transform: translateY(-50%); background: none; border: 0; padding: .35rem; color: var(--text-muted); cursor: pointer; display: inline-flex; border-radius: 4px; }\n.rz-admin .acct-pw__eye:hover, .rz-admin .acct-pw__eye[aria-pressed=\"true\"] { color: var(--text-secondary); }\n.rz-admin .acct-rules { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }\n.rz-admin .acct-rule { display: flex; align-items: center; gap: .5rem; font-size: .8125rem; color: var(--text-muted); transition: color .15s; }\n.rz-admin .acct-rule--met { color: var(--signal); }\n\n/* Picture uploader (avatar, logo, favicon): one grid everywhere — preview | buttons row, hint under the buttons. */\n.rz-admin .acct-pic { border: 1px dashed var(--border); border-radius: 8px; padding: 16px 18px; background: var(--surface-0); outline: none; transition: border-color .15s; }\n.rz-admin .acct-pic:focus-visible, .rz-admin .acct-pic--over { border-color: var(--signal); border-style: solid; }\n.rz-admin .acct-pic--busy { opacity: .7; }\n.rz-admin .acct-pic__file { display: none; }\n.rz-admin .acct-pic__empty { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; color: var(--text-muted); }\n.rz-admin .acct-pic__fallback { width: 44px; height: 44px; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; border-radius: 8px; background: var(--surface-3); color: var(--text-muted); font-size: .9rem; font-weight: 600; letter-spacing: .04em; }\n.rz-admin .acct-pic__fallback--circle { border-radius: 50%; }\n.rz-admin .acct-pic__or { font-size: .8125rem; }\n.rz-admin .acct-pic__has { display: flex; align-items: flex-start; gap: 16px; }\n.rz-admin .acct-pic__thumb { display: block; width: 96px; height: 96px; object-fit: cover; border-radius: 8px; border: 1px solid var(--border); background: var(--surface-3); flex-shrink: 0; }\n.rz-admin .acct-pic__thumb--circle { border-radius: 50%; }\n.rz-admin .acct-pic__meta { display: flex; flex-direction: column; gap: 10px; min-width: 0; }\n.rz-admin .acct-pic__actions { display: flex; align-items: center; gap: 14px; }\n.rz-admin .acct-pic__remove { font: inherit; font-size: .8125rem; background: none; border: 0; padding: 0; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-admin .acct-pic__remove:hover { color: #c0392b; }\n.rz-admin .acct-pic__remove:disabled { cursor: default; opacity: .6; }\n.rz-admin .acct-pic__hint { margin: 10px 0 0; font-size: .75rem; color: var(--text-muted); line-height: 1.4; }\n.rz-admin .acct-pic__has .acct-pic__hint { margin-top: 0; }\n.rz-admin .acct-pic__note { margin: 8px 0 0; }\n.rz-admin .acct-pic__error { margin: 8px 0 0; font-size: .8rem; color: #c0392b; }\n\n/* Branded dropdown (role pickers): a bordered button that opens the shell's menu, checkmark on the current choice. */\n.rz-admin .acct-dd { position: relative; display: inline-block; }\n.rz-admin .acct-dd__btn { display: inline-flex; align-items: center; gap: .5rem; font: inherit; font-size: .85rem; color: var(--text-primary); background: var(--surface-0); border: 1px solid var(--border); border-radius: 6px; padding: 0 .7rem; height: 34px; cursor: pointer; }\n.rz-admin .acct-dd__btn:hover { border-color: var(--text-muted); }\n.rz-admin .acct-dd__btn:focus-visible { outline: 2px solid var(--signal); outline-offset: 1px; }\n.rz-admin .acct-dd__btn:disabled { opacity: .6; cursor: default; }\n.rz-admin .acct-dd__menu { left: 0; right: auto; min-width: 15rem; padding: .3rem 0; }\n.rz-admin .acct-dd__item { align-items: flex-start; }\n.rz-admin .acct-dd__check { width: 1rem; flex-shrink: 0; color: var(--signal); font-weight: 700; }\n.rz-admin .acct-dd__text { display: flex; flex-direction: column; line-height: 1.3; }\n.rz-admin .acct-dd__hint { font-size: .74rem; color: var(--text-muted); }\n/* Team table: everything on one centre line, and the role menu may overflow the table (the shell\n clips .rz-table for rounded corners, so round the header cells by hand instead). */\n.rz-admin .acct-team { overflow: visible; }\n.rz-admin .acct-team thead th:first-child { border-top-left-radius: 8px; }\n.rz-admin .acct-team thead th:last-child { border-top-right-radius: 8px; }\n.rz-admin .acct-team tbody tr:last-child td { border-bottom: 0; }\n.rz-admin .acct-team td { vertical-align: middle; }\n.rz-admin .acct-team td > * { vertical-align: middle; }\n.rz-admin .acct-team .rz-pill { position: relative; top: 0; }\n.rz-admin .acct-dd__menu { z-index: 60; }\n.rz-admin .acct-invite__row .acct-dd__btn { height: 40px; }\n\n.rz-admin .rz-term { position: relative; display: inline; }\n.rz-admin .rz-term__word { cursor: help; text-decoration: underline dotted; text-underline-offset: 4px; text-decoration-color: color-mix(in srgb, currentColor 50%, transparent); }\n.rz-admin .rz-term__word:hover, .rz-admin .rz-term__word:focus-visible { text-decoration-color: var(--signal); outline: none; }\n.rz-admin .rz-term__tip { position: absolute; left: 0; top: calc(100% + 8px); z-index: 70; width: 272px; max-width: 80vw; padding: 12px 14px; border-radius: 8px; background: var(--text-primary); color: var(--surface-0); font-size: .8125rem; line-height: 1.4; font-weight: 400; box-shadow: 0 8px 24px rgba(14,23,38,.18); opacity: 0; pointer-events: none; transition: opacity .15s; }\n.rz-admin .rz-term__tip--open { opacity: 1; }\n`;\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { AdminShell, type NavItem, type ShellUser } from \"../shell\";\nimport { STUDIO_CSS } from \"./css\";\n\n/**\n * The frame every Studio page sits in: the shell with the current path for the\n * active nav item, plus Studio's page styles injected once. Session, nav and\n * branding arrive as props from the site's server layout.\n */\nexport function StudioShellFrame({ siteName, logoUrl, user, role, nav, pinnedNav, branding, children }: {\n siteName: string;\n logoUrl?: string | null;\n user: ShellUser | null;\n role: string | null;\n nav: NavItem[];\n pinnedNav?: NavItem[];\n branding?: { name?: string | null; logoUrl?: string | null } | null;\n children: React.ReactNode;\n}) {\n const pathname = usePathname() ?? \"/admin\";\n return (\n <>\n <style>{STUDIO_CSS}</style>\n <AdminShell siteName={siteName} logoUrl={logoUrl ?? undefined} user={user} role={role} nav={nav} pinnedNav={pinnedNav} branding={branding} accountHref={null} activeHref={pathname}>\n {children}\n </AdminShell>\n </>\n );\n}\n","/**\n * Theming hooks, same convention as BookingWidget: a root class, BEM elements,\n * and --realiiz-form-* custom properties with fallbacks so the form is usable\n * with zero host CSS and fully themeable with a dozen variables.\n */\n\nexport const FORM_CSS = `\n.realiiz-form{\n --_fg:var(--realiiz-form-fg,#111);\n --_muted:var(--realiiz-form-muted,#666);\n --_border:var(--realiiz-form-border,#cfcfcf);\n --_accent:var(--realiiz-form-accent,#111);\n --_accent-fg:var(--realiiz-form-accent-fg,#fff);\n --_danger:var(--realiiz-form-danger,#b3261e);\n --_radius:var(--realiiz-form-radius,6px);\n --_font:var(--realiiz-form-font,system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif);\n --_ring:var(--realiiz-form-focus-ring,0 0 0 3px rgba(0,0,0,.15));\n box-sizing:border-box;max-width:100%;color:var(--_fg);font-family:var(--_font);font-size:15px;line-height:1.4;\n}\n.realiiz-form *,.realiiz-form *::before,.realiiz-form *::after{box-sizing:inherit}\n.realiiz-form fieldset{border:0;margin:0 0 20px;padding:0;min-width:0}\n.realiiz-form legend{font-weight:600;font-size:13px;letter-spacing:.02em;text-transform:uppercase;color:var(--_muted);margin-bottom:12px;padding:0}\n.realiiz-form__field{display:block;margin:0 0 16px}\n.realiiz-form__label{display:block;font-weight:500;margin-bottom:6px}\n.realiiz-form__required{color:var(--_danger);margin-left:3px}\n.realiiz-form__control{display:block;width:100%;max-width:100%;font:inherit;color:inherit;background:#fff;border:1px solid var(--_border);border-radius:var(--_radius);padding:9px 11px;min-height:40px}\n.realiiz-form__control:focus{outline:none;border-color:var(--_accent);box-shadow:var(--_ring)}\n.realiiz-form__control--textarea{min-height:110px;resize:vertical}\n.realiiz-form__control--body{min-height:280px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:14px}\n.realiiz-form__control--invalid{border-color:var(--_danger)}\n.realiiz-select{position:relative}\n.realiiz-select__btn{display:flex;align-items:center;justify-content:space-between;gap:10px;text-align:left;cursor:pointer;background:#fff}\n.realiiz-select__btn svg{flex-shrink:0;color:var(--_muted);transition:transform .15s}\n.realiiz-select__btn--open{border-color:var(--_accent);box-shadow:var(--_ring)}\n.realiiz-select__btn--open svg{transform:rotate(180deg)}\n.realiiz-select__btn:disabled{opacity:.6;cursor:default}\n.realiiz-select__placeholder{color:var(--_muted)}\n.realiiz-select__menu{position:absolute;left:0;right:0;top:calc(100% + 6px);margin:0;padding:6px 0;list-style:none;background:#fff;border:1px solid var(--_border);border-radius:var(--_radius);box-shadow:0 8px 24px rgba(14,23,38,.14);max-height:260px;overflow:auto;z-index:40}\n.realiiz-select__item{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:14px;color:var(--_fg);cursor:pointer}\n.realiiz-select__item--active{background:var(--realiiz-form-hover,rgba(0,0,0,.05))}\n.realiiz-select__item--selected{font-weight:600}\n.realiiz-select__check{width:1em;flex-shrink:0;color:var(--_accent);font-weight:700}\n.realiiz-form__check{display:flex;align-items:center;gap:8px;font-weight:500}\n.realiiz-form__check input{width:18px;height:18px;margin:0}\n.realiiz-form__helper{display:flex;justify-content:space-between;gap:12px;font-size:12px;color:var(--_muted);margin-top:4px;min-height:1em}\n.realiiz-form__count{margin-left:auto;font-variant-numeric:tabular-nums}\n.realiiz-form__error{color:var(--_danger);font-size:13px;margin-top:4px}\n.realiiz-image{border:1px dashed var(--_border);border-radius:var(--_radius);padding:16px 18px;background:#fff;outline:none;transition:border-color .15s}\n.realiiz-image--over{border-color:var(--_accent);border-style:solid}\n.realiiz-image--invalid{border-color:var(--_danger)}\n.realiiz-image--busy{opacity:.7}\n.realiiz-image__empty{display:flex;align-items:center;gap:14px;flex-wrap:wrap;color:var(--_muted)}\n.realiiz-image__icon{flex-shrink:0;color:var(--_muted)}\n.realiiz-image__or{font-size:13px}\n.realiiz-image__has{display:flex;align-items:flex-start;gap:16px}\n.realiiz-image__thumb{display:block;max-height:160px;max-width:min(320px,55%);width:auto;object-fit:cover;border-radius:8px;border:1px solid var(--_border);background:#f6f8fa}\n.realiiz-image__meta{display:flex;flex-direction:column;gap:10px;min-width:0}\n.realiiz-image__detail{font-size:13px;color:var(--_muted);word-break:break-all}\n.realiiz-image__actions{display:flex;align-items:center;gap:14px}\n.realiiz-image__remove{font:inherit;font-size:13px;background:none;border:0;padding:0;color:var(--_muted);text-decoration:underline;text-underline-offset:3px;cursor:pointer}\n.realiiz-image__remove:hover{color:var(--_danger)}\n.realiiz-image__hint{font-size:12px;color:var(--_muted);margin-top:10px}\n.realiiz-image .realiiz-form__error{margin-top:8px}\n@media (max-width:720px){.realiiz-image__has{flex-direction:column}.realiiz-image__thumb{max-width:100%}}\n.realiiz-form__alert{border:1px solid var(--_danger);border-radius:var(--_radius);padding:12px 14px;margin:0 0 20px;color:var(--_danger)}\n.realiiz-form__alert ul{margin:6px 0 0;padding-left:18px}\n.realiiz-form__actions{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin-top:8px}\n.realiiz-form__help{text-decoration:underline dotted;text-decoration-color:color-mix(in srgb,currentColor 45%,transparent);text-underline-offset:4px;cursor:help}\n.realiiz-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n.realiiz-form__footer{max-width:920px}\n.realiiz-form__bar{display:flex;align-items:center;gap:10px;margin-top:16px;padding:12px 0;border-top:1px solid var(--_border);background:#fff}\n.realiiz-form__status{margin-right:auto;font-size:.85rem;color:var(--_muted)}\n.realiiz-form__bar[data-dirty] .realiiz-form__status{color:var(--_fg)}\n.realiiz-form__button{font:inherit;font-weight:600;border-radius:var(--_radius);padding:10px 16px;border:1px solid var(--_border);background:#fff;color:var(--_fg);cursor:pointer;min-height:40px}\n.realiiz-form__button--primary{background:var(--_accent);color:var(--_accent-fg);border-color:var(--_accent)}\n.realiiz-form__button:disabled{opacity:.6;cursor:default}\n.realiiz-md{--_md-head:#fafbfd;--_md-hover:#f4f8fd;--_md-hover-line:#bcd0ea;--_md-on:#eef4fb;--_md-tip:#1f2933;position:relative}\n.realiiz-md__mode{display:inline-flex;align-self:flex-start;width:max-content;gap:2px;padding:3px;background:color-mix(in srgb,var(--_border) 40%,transparent);border-radius:8px;margin-bottom:8px}\n.realiiz-md__mode button{font:inherit;font-size:.8rem;padding:5px 13px;border:0;border-radius:6px;background:transparent;color:var(--_muted);cursor:pointer}\n.realiiz-md__mode button[aria-selected=\"true\"]{background:#fff;color:var(--_fg);box-shadow:0 1px 2px rgba(0,0,0,.12)}\n.realiiz-md__panel{position:relative;z-index:0;display:flex;flex-direction:column;border:1px solid var(--_border);border-radius:10px;background:#fff;overflow:hidden}\n.realiiz-md__panel:focus-within{border-color:var(--_md-hover-line)}\n.realiiz-md__head{position:relative;z-index:5;display:flex;align-items:center;gap:2px;flex-wrap:wrap;padding:5px 7px;background:var(--_md-head);border-bottom:1px solid var(--_border);flex-shrink:0}\n.realiiz-md__tools{display:flex;align-items:center;gap:3px;flex-wrap:wrap}\n.realiiz-md__spacer{flex:1}\n.realiiz-md__head button{position:relative;min-width:31px;height:28px;padding:0 9px;display:inline-flex;align-items:center;justify-content:center;background:#fff;border:1px solid var(--_border);border-radius:6px;font-family:inherit;font-size:.82rem;color:var(--_fg);cursor:pointer;line-height:1}\n.realiiz-md__head button:hover:not(:disabled){border-color:var(--_md-hover-line);background:var(--_md-hover)}\n.realiiz-md__head button:active{background:var(--_md-on)}\n.realiiz-md__head button.on{background:var(--_md-on);border-color:var(--_accent);color:var(--_accent);font-weight:600}\n.realiiz-md__ico{width:15px;height:15px;display:block}\n.realiiz-md__dot{font-size:1.05rem;line-height:1}\n.realiiz-md__sep{width:1px;height:17px;background:var(--_border);margin:0 5px}\n.realiiz-md__insert{display:inline-flex;align-items:center;gap:3px;border-left:1px solid var(--_border);padding-left:8px;margin-left:6px}\n.realiiz-md__insert button{background:#f6f8fa;color:var(--_muted);padding:0;width:31px}\n.realiiz-md__insert button:hover{color:var(--_accent)}\n.realiiz-md__lab{font-size:.74rem;color:var(--_muted);margin-right:3px}\n.realiiz-md__head button[data-tip]::after{content:attr(data-tip);position:absolute;top:calc(100% + 6px);left:0;background:var(--_md-tip);color:#fff;font-size:.72rem;padding:4px 8px;border-radius:5px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s;z-index:20}\n.realiiz-md__head button[data-tip]:hover::after,.realiiz-md__head button[data-tip]:focus-visible::after{opacity:1}\n.realiiz-md__expand[data-tip]::after{left:auto;right:0}\n.realiiz-md__tgwrap{position:relative;display:inline-flex}\n.realiiz-md__tgrid{position:absolute;top:calc(100% + 6px);left:0;background:#fff;border:1px solid var(--_border);border-radius:9px;padding:9px;box-shadow:0 10px 28px rgba(0,0,0,.14);z-index:7;display:block}\n.realiiz-md__tgcells{display:grid;grid-template-columns:repeat(6,17px);gap:3px}\n.realiiz-md__tgcells i{width:17px;height:15px;border:1px solid var(--_border);border-radius:2px;background:#fff;cursor:pointer;display:block}\n.realiiz-md__tgcells i.hot{background:#dbe9fb;border-color:var(--_accent)}\n.realiiz-md__tglab{display:block;margin-top:8px;font-size:.74rem;color:var(--_muted);text-align:center;white-space:nowrap}\n.realiiz-md .realiiz-md__ta{flex:1 1 auto;border:0;border-radius:0;resize:vertical;background:#fff;max-width:none;padding:16px 18px;line-height:1.65}\n.realiiz-md .realiiz-md__ta:focus{outline:none;box-shadow:none}\n.realiiz-md__preview{padding:20px 24px;background:#fff}\n.realiiz-md__note{padding:4px 2px}\n.realiiz-md--fs{position:fixed;inset:0;z-index:60;background:#fff;padding:14px 22px 22px;overflow:auto;display:flex;flex-direction:column}\n.realiiz-md--fs .realiiz-md__panel{flex:1;min-height:0}\n.realiiz-md--fs .realiiz-md__ta,.realiiz-md--fs .realiiz-md__preview{flex:1;min-height:0;overflow:auto;resize:none}\n.realiiz-prose{max-width:68ch;line-height:1.65}\n.realiiz-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:40px;padding:5px 8px;background:#fff;border:1px solid var(--_border);border-radius:var(--_radius)}\n.realiiz-chips:focus-within{border-color:var(--_accent);box-shadow:var(--_ring)}\n.realiiz-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 9px;border:1px solid var(--_border);border-radius:999px;font-size:.8rem}\n.realiiz-chip button{font:inherit;line-height:1;width:18px;height:18px;border-radius:50%;border:0;background:transparent;color:var(--_muted);cursor:pointer}\n.realiiz-chips__input{flex:1;min-width:120px;border:0;background:transparent;font:inherit;color:inherit;outline:none;padding:4px}\n.realiiz-chips__count{margin-left:auto;color:var(--_muted);font-size:.75rem}\n.realiiz-gauge{display:inline-flex;align-items:center;gap:10px;font-size:.75rem;color:var(--_muted)}\n.realiiz-gauge__bar{position:relative;width:140px;height:6px;border-radius:3px;background:var(--_border);overflow:hidden}\n.realiiz-gauge__zone{position:absolute;top:0;bottom:0;background:rgba(21,128,61,.28)}\n.realiiz-gauge__fill{position:absolute;top:0;bottom:0;left:0;background:var(--_muted);border-radius:3px;transition:width .12s}\n.realiiz-gauge__text b{font-weight:600;color:inherit}\n.realiiz-gauge--ok{color:#15803d}.realiiz-gauge--ok .realiiz-gauge__fill{background:#15803d}\n.realiiz-gauge--over{color:var(--_danger)}.realiiz-gauge--over .realiiz-gauge__fill{background:var(--_danger)}\n`;\n","/**\n * MagicLinkForm — one field, one button, and the right words for each outcome.\n *\n * The audience is a non-technical client. Two outcomes matter:\n * sent → tell them where the link went and that it expires in an hour\n * uninvited → signups are off, so Supabase refuses unknown emails with a\n * \"Signups not allowed\" error. That string is a support ticket;\n * \"this email isn't set up for this site\" is not.\n *\n * `shouldCreateUser: false` restates the dashboard setting in code — the flag\n * a reviewer greps for.\n */\n\nimport { createBrowserClient } from \"@supabase/ssr\";\nimport { useMemo, useState, type FormEvent } from \"react\";\nimport { FORM_CSS } from \"../forms-ui/styles\";\n\nexport interface MagicLinkFormProps {\n url: string;\n anonKey: string;\n /** The site's callback, e.g. https://5degrees.org/admin/auth/callback?next=/admin */\n redirectTo: string;\n /** Shown in the heading: \"Sign in to {siteName}\". */\n siteName: string;\n className?: string;\n}\n\ntype State = { kind: \"idle\" } | { kind: \"sending\" } | { kind: \"sent\"; email: string } | { kind: \"error\"; message: string; uninvited: boolean };\n\nexport const UNINVITED_MESSAGE =\n \"This email address isn't set up for this site yet. Ask the site owner to send you an invite.\";\n\nexport function isUninvitedError(message: string): boolean {\n return /signups? not allowed|not allowed|user not found|invalid login/i.test(message);\n}\n\nexport function MagicLinkForm({ url, anonKey, redirectTo, siteName, className }: MagicLinkFormProps) {\n const supabase = useMemo(() => createBrowserClient(url, anonKey), [url, anonKey]);\n const [email, setEmail] = useState(\"\");\n const [state, setState] = useState<State>({ kind: \"idle\" });\n\n const submit = async (e: FormEvent) => {\n e.preventDefault();\n if (state.kind === \"sending\") return;\n const address = email.trim().toLowerCase();\n setState({ kind: \"sending\" });\n const { error } = await supabase.auth.signInWithOtp({\n email: address,\n options: { emailRedirectTo: redirectTo, shouldCreateUser: false },\n });\n if (error) {\n const uninvited = isUninvitedError(error.message);\n setState({ kind: \"error\", message: uninvited ? UNINVITED_MESSAGE : error.message, uninvited });\n return;\n }\n setState({ kind: \"sent\", email: address });\n };\n\n const root = [\"realiiz-form\", \"realiiz-signin\", className].filter(Boolean).join(\" \");\n\n if (state.kind === \"sent\") {\n return (\n <div className={root} data-realiiz-signin=\"sent\">\n <style>{FORM_CSS}</style>\n <h2 className=\"realiiz-signin__heading\">Check your email</h2>\n <p>\n We sent a sign-in link to <strong>{state.email}</strong>. It expires in an hour.\n </p>\n <button type=\"button\" className=\"realiiz-form__button\" onClick={() => setState({ kind: \"idle\" })}>\n Use a different address\n </button>\n </div>\n );\n }\n\n const sending = state.kind === \"sending\";\n const fieldError = state.kind === \"error\" && !state.uninvited ? state.message : null;\n\n return (\n <form className={root} onSubmit={submit} noValidate data-realiiz-signin=\"form\">\n <style>{FORM_CSS}</style>\n <h2 className=\"realiiz-signin__heading\">Sign in to {siteName}</h2>\n\n {state.kind === \"error\" && state.uninvited && (\n <div className=\"realiiz-form__alert\" role=\"alert\">{state.message}</div>\n )}\n\n <div className=\"realiiz-form__field\">\n <label className=\"realiiz-form__label\" htmlFor=\"realiiz-signin-email\">Email address</label>\n <input\n id=\"realiiz-signin-email\"\n className={[\"realiiz-form__control\", fieldError && \"realiiz-form__control--invalid\"].filter(Boolean).join(\" \")}\n type=\"email\"\n name=\"email\"\n autoComplete=\"email\"\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? \"realiiz-signin-email-error\" : undefined}\n />\n {fieldError && (\n <div className=\"realiiz-form__error\" id=\"realiiz-signin-email-error\">{fieldError}</div>\n )}\n </div>\n\n <div className=\"realiiz-form__actions\">\n <button type=\"submit\" className=\"realiiz-form__button realiiz-form__button--primary\" disabled={sending || email.trim() === \"\"}>\n {sending ? \"Sending…\" : \"Send me a sign-in link\"}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * SignOutButton — a plain POST form. No JavaScript needed, so it works before\n * hydration and inside a server component. The site's route (ADMIN-04) calls\n * signOut() from @realiizlabs/admin/auth and redirects.\n */\n\nexport interface SignOutButtonProps {\n /** Default \"/admin/auth/signout\". */\n actionPath?: string;\n className?: string;\n label?: string;\n}\n\nexport function SignOutButton({ actionPath = \"/admin/auth/signout\", className, label = \"Sign out\" }: SignOutButtonProps) {\n return (\n <form method=\"post\" action={actionPath} className={[\"realiiz-signout\", className].filter(Boolean).join(\" \")}>\n <button type=\"submit\" className=\"realiiz-form__button\">{label}</button>\n </form>\n );\n}\n","\"use client\";\n\nimport { SignOutButton } from \"../auth-ui\";\nimport { Card, PageHeader } from \"../shell\";\n\nexport function StudioNotConfigured() {\n return (\n <>\n <PageHeader eyebrow=\"Setup\" title=\"Studio isn't configured on this deployment\" />\n <Card>\n <p style={{ margin: 0 }}>\n Set the variables listed in <code>.env.example</code> under “Studio”. Nothing else on the site is affected.\n </p>\n </Card>\n </>\n );\n}\n\nexport function StudioNoAccess({ actual }: { actual: string | null }) {\n return (\n <>\n <PageHeader eyebrow=\"Access\" title=\"No access to this site\" />\n <Card actions={<SignOutButton />}>\n <p style={{ margin: 0 }}>\n You're signed in, but this account isn't set up to publish here\n {actual ? ` (current role: ${actual})` : \"\"}. Ask the site owner for an invite.\n </p>\n </Card>\n </>\n );\n}\n","\"use client\";\n\n/**\n * A plain-English definition on hover / focus / tap. Kept deliberately small —\n * the public sites have their own richer tooltips; Studio needs one that works\n * everywhere with no site CSS.\n */\n\nimport { useId, useState, type ReactNode } from \"react\";\n\nexport function StudioTerm({ children, definition }: { children: ReactNode; definition: string }) {\n const [open, setOpen] = useState(false);\n const id = useId();\n return (\n <span className=\"rz-term\" onMouseEnter={() => setOpen(true)} onMouseLeave={() => setOpen(false)}>\n <span\n role=\"button\"\n tabIndex={0}\n aria-describedby={id}\n aria-expanded={open}\n className=\"rz-term__word\"\n onClick={() => setOpen((o) => !o)}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); setOpen((o) => !o); } if (e.key === \"Escape\") setOpen(false); }}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n </span>\n <span id={id} className={open ? \"rz-term__tip rz-term__tip--open\" : \"rz-term__tip\"} role=\"tooltip\">{definition}</span>\n </span>\n );\n}\n\n/** Studio's jargon, defined once. */\nexport const GLOSSARY = {\n pullRequest:\n \"The safety step between you and the live website. When you save, your edit is set aside on GitHub (the service that stores your site) and the site is test-built with it first. Only when that passes can you press Publish and make it live. GitHub calls this a pull request — you never need to go there yourself.\",\n repository:\n \"Where your website actually lives: a private, backed-up folder on GitHub that keeps every version of every page. This list is read straight from it, so it's always current — even for items added outside Studio.\",\n change:\n \"Your edit while it's on its way to the live site. You save it, it gets checked, then you publish it. An item can have one change in progress at a time, and you can come back to it whenever you like.\",\n checks:\n \"A practice run. The whole website is rebuilt with your edit in it, to make sure nothing broke — a missing field, a picture that isn't there. If something's wrong you find out here, not on the live site.\",\n publish:\n \"Makes your checked edit live for everyone. Takes about two minutes to appear on the website.\",\n} as const;\n\nexport function Jargon({ term, children }: { term: keyof typeof GLOSSARY; children: ReactNode }) {\n return <StudioTerm definition={GLOSSARY[term]}>{children}</StudioTerm>;\n}\n","import type { ContentTypeEntry } from \"../forms/types\";\n\n/**\n * The words a list and editor use for a content type. Posts keep the exact\n * strings Studio shipped with; any other type reads from its registry label\n * and singular so a new type needs no new copy.\n */\nexport function copyFor(entry: Pick<ContentTypeEntry, \"id\" | \"label\" | \"singular\">) {\n const singular = entry.singular ?? entry.label;\n if (entry.id === \"posts\") {\n return {\n newItem: \"New post\",\n empty: \"No posts yet\",\n first: \"Write the first one\",\n removeLink: \"Remove this post from the website\",\n removeConfirm: \"Take this post off the website? You’ll get a change to review first — nothing disappears until you publish it.\",\n removing: \"This post is being removed, so it can’t be edited right now. Cancel the removal from the change page if you’ve changed your mind.\",\n newSubtitle: \"The web address fills itself from the title; change it if you like before you save.\",\n };\n }\n const lower = singular.toLowerCase();\n return {\n newItem: `New ${lower}`,\n empty: `No ${entry.label.toLowerCase()} yet`,\n first: \"Add the first one\",\n removeLink: `Remove this ${lower} from the website`,\n removeConfirm: `Take this ${lower} off the website? You’ll get a change to review first — nothing disappears until you publish it.`,\n removing: `This ${lower} is being removed, so it can’t be edited right now. Cancel the removal from the change page if you’ve changed your mind.`,\n newSubtitle: \"The web address fills itself from the title; change it if you like before you save.\",\n };\n}\n","/**\n * The slice of zod 4's `_zod.def` surface this module reads, typed loosely.\n *\n * Tested against zod 4.5.4. These are semi-public internals (the v4 \"core\"\n * shape), stable across 4.x so far but not covered by semver promises — hence\n * the peer-dep range and the fixture tests. No zod value is imported here.\n */\n\nexport interface ZodCheckDef {\n check?: string;\n format?: string;\n minimum?: number;\n maximum?: number;\n length?: number;\n value?: number;\n inclusive?: boolean;\n pattern?: RegExp;\n error?: string | ((issue: unknown) => string | { message?: string } | undefined);\n}\n\nexport interface ZodDef {\n type: string;\n shape?: Record<string, ZodNode>;\n innerType?: ZodNode;\n in?: ZodNode;\n out?: ZodNode;\n element?: ZodNode;\n entries?: Record<string, string | number>;\n checks?: Array<{ _zod: { def: ZodCheckDef } }>;\n coerce?: boolean;\n}\n\nexport interface ZodNode {\n _zod: { def: ZodDef };\n description?: string;\n}\n\n/** Narrow an unknown schema to the internal node shape, or throw a clear error. */\nexport function asNode(schema: unknown, what = \"schema\"): ZodNode {\n const n = schema as Partial<ZodNode> | null;\n if (!n || typeof n !== \"object\" || !n._zod?.def?.type) {\n throw new TypeError(`walkSchema: ${what} is not a zod 4 schema`);\n }\n return n as ZodNode;\n}\n\n/** Resolve a check's error to a plain string, if it has one. */\nexport function checkMessage(def: ZodCheckDef): string | undefined {\n const e = def.error;\n if (!e) return undefined;\n if (typeof e === \"string\") return e;\n const out = e({});\n if (typeof out === \"string\") return out;\n return out?.message;\n}\n","/**\n * checks[] → constraints + messages.\n *\n * Messages are keyed PER CHECK. The spike's walker wrote `out.message = …` on\n * every check, so a field with min and max kept only the max message and\n * showed the wrong error for a too-short value. Here each check kind gets its\n * own key; a renderer maps a failed issue to its message by that key.\n *\n * Unknown check kinds (e.g. a per-field `.refine`, which is `custom`) are kept\n * as a message when they carry one and otherwise skipped — never fatal.\n */\n\nimport type { Constraints, Messages } from \"./types\";\nimport type { ZodNode } from \"./internals\";\nimport { checkMessage } from \"./internals\";\n\nexport function readChecks(node: ZodNode): { constraints: Constraints; messages: Messages } {\n const constraints: Constraints = {};\n const messages: Messages = {};\n\n for (const c of node._zod.def.checks ?? []) {\n const d = c._zod.def;\n const msg = checkMessage(d);\n let key: string | undefined;\n\n switch (d.check) {\n case \"min_length\":\n constraints.min = d.minimum;\n key = \"min_length\";\n break;\n case \"max_length\":\n constraints.max = d.maximum;\n key = \"max_length\";\n break;\n case \"length_equals\":\n constraints.exact = d.length;\n key = \"length_equals\";\n break;\n case \"greater_than\":\n constraints.min = d.inclusive ? d.value : (d.value ?? 0) + 1;\n key = \"greater_than\";\n break;\n case \"less_than\":\n constraints.max = d.inclusive ? d.value : (d.value ?? 0) - 1;\n key = \"less_than\";\n break;\n case \"string_format\":\n if (d.format === \"regex\" && d.pattern) {\n constraints.pattern = d.pattern.source;\n constraints.format = \"regex\";\n key = \"regex\";\n } else if (d.format === \"url\" || d.format === \"email\") {\n constraints.format = d.format;\n key = d.format;\n } else {\n key = d.format;\n }\n break;\n case \"number_format\":\n if (d.format === \"safeint\" || d.format === \"int32\") {\n constraints.format = \"int\";\n key = \"int\";\n }\n break;\n case \"custom\":\n key = \"custom\";\n break;\n default:\n key = d.check;\n }\n\n if (key && msg) messages[key] = msg;\n }\n\n return { constraints, messages };\n}\n","/**\n * Peel wrapper types off a field until the real type is reached.\n *\n * optional / nullable / default → the field is not required.\n * pipe → follow `out` (older 4.x wrapped z.coerce.date in a pipe; 4.5 marks\n * the date itself with `coerce: true` — both land on the same node here).\n */\n\nimport type { ZodNode } from \"./internals\";\n\nexport interface Unwrapped {\n node: ZodNode;\n type: string;\n required: boolean;\n}\n\nexport function unwrap(start: ZodNode): Unwrapped {\n let node = start;\n let required = true;\n // Bounded so a malformed schema can't loop forever.\n for (let i = 0; i < 16; i++) {\n const def = node._zod.def;\n if (def.type === \"optional\" || def.type === \"nullable\" || def.type === \"default\") {\n required = false;\n if (!def.innerType) break;\n node = def.innerType;\n } else if (def.type === \"pipe\") {\n const next = def.out ?? def.in;\n if (!next) break;\n node = next;\n } else {\n break;\n }\n }\n return { node, type: node._zod.def.type, required };\n}\n","/**\n * zod type → InputKind, plus the extras some kinds carry (enum options, the\n * array item's constraints).\n *\n * Long strings become textareas by a simple rule: a max over 120 chars. That\n * is a heuristic, and the registry can't override it today — if a site needs\n * to, that is a one-line change here, not a per-site branch.\n */\n\nimport type { Constraints, InputKind, Messages } from \"./types\";\nimport type { ZodNode } from \"./internals\";\nimport { readChecks } from \"./checks\";\nimport { unwrap } from \"./unwrap\";\n\nconst TEXTAREA_MIN_MAX = 120;\n\nexport interface InputInfo {\n input: InputKind;\n constraints: Constraints;\n messages: Messages;\n options?: string[];\n}\n\nexport function inputFor(node: ZodNode): InputInfo {\n const def = node._zod.def;\n const { constraints, messages } = readChecks(node);\n\n switch (def.type) {\n case \"string\": {\n if (constraints.format === \"url\") return { input: \"url\", constraints, messages };\n const long = (constraints.max ?? 0) > TEXTAREA_MIN_MAX;\n return { input: long ? \"textarea\" : \"text\", constraints, messages };\n }\n case \"date\":\n return { input: \"date\", constraints, messages };\n case \"number\":\n case \"int\":\n return { input: \"number\", constraints, messages };\n case \"boolean\":\n return { input: \"boolean\", constraints, messages };\n case \"enum\":\n case \"literal\": {\n const options = Object.values(def.entries ?? {}).map(String);\n return { input: \"select\", constraints, messages, options };\n }\n case \"array\": {\n if (def.element) {\n const item = unwrap(def.element);\n const inner = readChecks(item.node);\n constraints.item = inner;\n }\n return { input: \"tags\", constraints, messages };\n }\n default:\n // Anything unrecognised (object, union, …) is presented as text so the\n // value can at least be carried; a renderer may choose to treat it as hidden.\n return { input: \"text\", constraints, messages };\n }\n}\n","/**\n * Labels and placeholders.\n *\n * Precedence (decided 2026-09-08):\n * label: registry.labels[name] → .meta({ label }) → .describe() → titlecase(name)\n * placeholder: registry.placeholders[name] → .meta({ placeholder }) → undefined\n *\n * The registry tier exists for schemas that can't be edited yet (5degrees\n * until its repo transfer). The meta tier is the intended home — one source of\n * truth beside the validation rules. Titlecase is the floor, and it is naive on\n * purpose: an acronym coming out as \"Rsvp url\" is the signal that a real label\n * is missing.\n *\n * Meta is read from zod's global registry via the schema's own `meta()` /\n * `description` accessors, so no zod value is imported here.\n */\n\nimport type { ContentTypeEntry, InputKind } from \"./types\";\n\ninterface MetaBearing {\n meta?: () => Record<string, unknown> | undefined;\n description?: string;\n}\n\ninterface FieldMeta {\n label?: string;\n placeholder?: string;\n description?: string;\n recommended?: [number, number];\n suffix?: string;\n help?: string;\n input?: InputKind;\n}\n\nexport function readMeta(schema: unknown): FieldMeta {\n const s = schema as MetaBearing;\n const raw = typeof s.meta === \"function\" ? (s.meta() ?? {}) : {};\n const pick = (k: keyof FieldMeta) => (typeof raw[k] === \"string\" ? (raw[k] as string) : undefined);\n const rec = raw.recommended;\n const recommended =\n Array.isArray(rec) && rec.length === 2 && rec.every((n) => typeof n === \"number\") ? ([rec[0], rec[1]] as [number, number]) : undefined;\n const INPUTS: InputKind[] = [\"text\", \"textarea\", \"date\", \"number\", \"boolean\", \"select\", \"tags\", \"image\", \"url\", \"time\"];\n const input = typeof raw.input === \"string\" && (INPUTS as string[]).includes(raw.input) ? (raw.input as InputKind) : undefined;\n return {\n label: pick(\"label\"),\n placeholder: pick(\"placeholder\"),\n description: pick(\"description\") ?? (typeof s.description === \"string\" ? s.description : undefined),\n recommended,\n suffix: pick(\"suffix\"),\n help: pick(\"help\"),\n input,\n };\n}\n\nexport function inputOverrideFor(\n name: string,\n schema: unknown,\n entry?: Pick<ContentTypeEntry, \"inputs\">,\n): InputKind | undefined {\n return entry?.inputs?.[name] ?? readMeta(schema).input;\n}\n\nexport function recommendedFor(\n name: string,\n schema: unknown,\n entry?: Pick<ContentTypeEntry, \"recommended\">,\n): [number, number] | undefined {\n return entry?.recommended?.[name] ?? readMeta(schema).recommended;\n}\n\nexport function titlecase(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase()\n .trim();\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nexport function labelFor(name: string, schema: unknown, entry?: Pick<ContentTypeEntry, \"labels\">): string {\n const fromRegistry = entry?.labels?.[name];\n if (fromRegistry) return fromRegistry;\n const meta = readMeta(schema);\n return meta.label ?? meta.description ?? titlecase(name);\n}\n\nexport function placeholderFor(\n name: string,\n schema: unknown,\n entry?: Pick<ContentTypeEntry, \"placeholders\">,\n): string | undefined {\n return entry?.placeholders?.[name] ?? readMeta(schema).placeholder;\n}\n\nexport function helpFor(name: string, schema: unknown, entry?: Pick<ContentTypeEntry, \"help\">): string | undefined {\n return entry?.help?.[name] ?? readMeta(schema).help;\n}\n","/**\n * walkSchema — a zod object schema (+ optional registry entry) → FieldSpec[].\n *\n * Synchronous and pure. Reads the schema's shape and checks; never parses a\n * value, never calls an options resolver, never imports zod at runtime.\n *\n * Roles from the registry override the schema-derived input kind: a field the\n * entry names as an image is `role: \"image\"` even though zod sees a string.\n * Hidden fields are still emitted so a renderer can carry their values through.\n */\n\nimport type { ContentTypeEntry, FieldRole, FieldSpec } from \"./types\";\nimport type { ZodNode } from \"./internals\";\nimport { asNode } from \"./internals\";\nimport { inputFor } from \"./inputs\";\nimport { helpFor, inputOverrideFor, labelFor, placeholderFor, readMeta, recommendedFor } from \"./labels\";\nimport { unwrap } from \"./unwrap\";\n\ntype Entry = Partial<Omit<ContentTypeEntry, \"schema\" | \"filename\" | \"id\" | \"label\" | \"folder\">>;\n\nexport function walkSchema(schema: unknown, entry: Entry = {}): FieldSpec[] {\n const root = asNode(schema);\n const shape = shapeOf(root);\n const names = Object.keys(shape);\n\n const specs = names.map((name): FieldSpec => {\n const raw = shape[name];\n const { node, required } = unwrap(raw);\n const info = inputFor(node);\n const role = roleFor(name, entry);\n\n return {\n name,\n label: labelFor(name, raw, entry),\n input: role === \"image\" ? \"image\" : (inputOverrideFor(name, raw, entry) ?? info.input),\n required,\n constraints: info.constraints,\n messages: info.messages,\n placeholder: placeholderFor(name, raw, entry),\n recommended: recommendedFor(name, raw, entry),\n suffix: readMeta(raw).suffix,\n help: helpFor(name, raw, entry),\n order: 0,\n role,\n options: entry.options?.[name] ?? info.options,\n };\n });\n\n return applyOrder(specs, entry.order ?? []);\n}\n\n/** `.strict()` and object-level `.refine()` both leave `shape` on the object def. */\nfunction shapeOf(root: ZodNode): Record<string, ZodNode> {\n let node = root;\n for (let i = 0; i < 8 && !node._zod.def.shape; i++) {\n const def = node._zod.def;\n const next = def.innerType ?? def.in;\n if (!next) break;\n node = next;\n }\n const shape = node._zod.def.shape;\n if (!shape) throw new TypeError(`walkSchema: expected an object schema, got \"${root._zod.def.type}\"`);\n return shape;\n}\n\nfunction roleFor(name: string, entry: Entry): FieldRole {\n if (entry.hidden?.includes(name)) return \"hidden\";\n if (entry.body === name) return \"body\";\n if (entry.images?.includes(name)) return \"image\";\n return \"field\";\n}\n\n/** Named fields first in the given order; the rest keep schema key order. */\nfunction applyOrder(specs: FieldSpec[], order: string[]): FieldSpec[] {\n const rank = new Map(order.map((n, i) => [n, i]));\n const named = specs.filter((s) => rank.has(s.name)).sort((a, b) => rank.get(a.name)! - rank.get(b.name)!);\n const rest = specs.filter((s) => !rank.has(s.name));\n return [...named, ...rest].map((s, i) => ({ ...s, order: i }));\n}\n","/**\n * ChipsInput — tags as chips. Enter or comma adds, × or Backspace-on-empty\n * removes. The value is a string[]; the schema's length/regex rules still run\n * on submit, this is only a nicer way to type them.\n */\n\nimport { useState, type KeyboardEvent } from \"react\";\n\nexport function ChipsInput({ id, name, value, onChange, onBlur, placeholder, invalid, max }: {\n id: string;\n name: string;\n value: string[];\n onChange: (v: string[]) => void;\n onBlur: () => void;\n placeholder?: string;\n invalid?: boolean;\n /** When the schema says exactly N, show \"n of N\". */\n max?: number;\n}) {\n const [draft, setDraft] = useState(\"\");\n\n const commit = () => {\n const parts = draft.split(\",\").map((s) => s.trim()).filter(Boolean);\n if (parts.length) onChange([...value, ...parts.filter((p) => !value.includes(p))]);\n setDraft(\"\");\n };\n\n const onKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Backspace\" && draft === \"\" && value.length) {\n onChange(value.slice(0, -1));\n }\n };\n\n return (\n <div className={[\"realiiz-chips\", invalid && \"realiiz-form__control--invalid\"].filter(Boolean).join(\" \")} data-name={name}>\n {value.map((tag) => (\n <span key={tag} className=\"realiiz-chip\">\n {tag}\n <button type=\"button\" aria-label={`Remove ${tag}`} onClick={() => onChange(value.filter((t) => t !== tag))}>×</button>\n </span>\n ))}\n <input\n id={id}\n type=\"text\"\n className=\"realiiz-chips__input\"\n value={draft}\n placeholder={value.length ? \"\" : placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKey}\n onBlur={() => { commit(); onBlur(); }}\n aria-invalid={invalid || undefined}\n />\n {typeof max === \"number\" && <span className=\"realiiz-chips__count\">{value.length} of {max}</span>}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * A branded single-select: a button that opens a listbox, styled like the rest\n * of the form instead of the browser's native <select>. Values stay raw (what\n * the schema wants); the visible label is Title Case unless the host supplies\n * its own labels. Keyboard: arrows move, Enter/Space pick, Escape closes,\n * typing jumps to the first match.\n */\n\nimport { useEffect, useId, useRef, useState, type KeyboardEvent } from \"react\";\nimport { titlecase } from \"../forms/labels\";\n\nexport interface SelectInputProps {\n id: string;\n name: string;\n value: string;\n options: string[];\n /** Optional display names, keyed by value. */\n labels?: Record<string, string>;\n /** Adds a \"—\" choice at the top that sets the value to \"\". */\n allowEmpty?: boolean;\n invalid?: boolean;\n disabled?: boolean;\n onChange: (v: string) => void;\n onBlur?: () => void;\n}\n\nexport function labelFor(value: string, labels?: Record<string, string>): string {\n if (labels?.[value]) return labels[value];\n return value ? titlecase(value) : \"—\";\n}\n\nexport function SelectInput(p: SelectInputProps) {\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(0);\n const wrap = useRef<HTMLDivElement>(null);\n const list = useRef<HTMLUListElement>(null);\n const listId = useId();\n const choices = p.allowEmpty ? [\"\", ...p.options] : p.options;\n\n const latest = useRef({ choices, value: p.value });\n latest.current = { choices, value: p.value };\n useEffect(() => {\n if (!open) return;\n setActive(Math.max(0, latest.current.choices.indexOf(latest.current.value)));\n const onDoc = (e: MouseEvent) => { if (!wrap.current?.contains(e.target as Node)) close(); };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]); // runs when the menu opens; the rest is read at that moment on purpose\n\n useEffect(() => {\n if (!open) return;\n list.current?.querySelectorAll<HTMLElement>(\"[role=option]\")[active]?.scrollIntoView?.({ block: \"nearest\" });\n }, [open, active]);\n\n const close = () => { setOpen(false); p.onBlur?.(); };\n const pick = (v: string) => { if (v !== p.value) p.onChange(v); close(); };\n\n const onKey = (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); setOpen(true); }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\": e.preventDefault(); setActive((i) => Math.min(choices.length - 1, i + 1)); break;\n case \"ArrowUp\": e.preventDefault(); setActive((i) => Math.max(0, i - 1)); break;\n case \"Home\": e.preventDefault(); setActive(0); break;\n case \"End\": e.preventDefault(); setActive(choices.length - 1); break;\n case \"Enter\": case \" \": e.preventDefault(); pick(choices[active] ?? \"\"); break;\n case \"Escape\": e.preventDefault(); close(); break;\n case \"Tab\": close(); break;\n default: {\n if (e.key.length === 1 && /\\S/.test(e.key)) {\n const k = e.key.toLowerCase();\n const idx = choices.findIndex((c) => labelFor(c, p.labels).toLowerCase().startsWith(k));\n if (idx >= 0) setActive(idx);\n }\n }\n }\n };\n\n const cls = [\"realiiz-form__control\", \"realiiz-select__btn\", p.invalid && \"realiiz-form__control--invalid\", open && \"realiiz-select__btn--open\"].filter(Boolean).join(\" \");\n\n return (\n <div ref={wrap} className=\"realiiz-select\" onKeyDown={onKey}>\n <input type=\"hidden\" name={p.name} value={p.value} readOnly />\n <button\n type=\"button\"\n id={p.id}\n className={cls}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-invalid={p.invalid || undefined}\n aria-describedby={p.invalid ? `${p.id}-error` : undefined}\n disabled={p.disabled}\n onClick={() => (open ? close() : setOpen(true))}\n >\n <span className={p.value ? undefined : \"realiiz-select__placeholder\"}>{labelFor(p.value, p.labels)}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\" /></svg>\n </button>\n {open && (\n <ul ref={list} id={listId} className=\"realiiz-select__menu\" role=\"listbox\" aria-labelledby={p.id} tabIndex={-1}>\n {choices.map((c, i) => (\n <li\n key={c || \"__empty\"}\n role=\"option\"\n aria-selected={c === p.value}\n data-value={c}\n className={[\"realiiz-select__item\", i === active && \"realiiz-select__item--active\", c === p.value && \"realiiz-select__item--selected\"].filter(Boolean).join(\" \")}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => pick(c)}\n >\n <span className=\"realiiz-select__check\" aria-hidden=\"true\">{c === p.value ? \"✓\" : \"\"}</span>\n <span>{labelFor(c, p.labels)}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * One control per InputKind. Dumb: value in, change out. Field.tsx owns the\n * label, helper row and error; ContentForm owns state.\n */\n\nimport type { FieldSpec } from \"../forms\";\nimport type { ControlValue } from \"./values\";\nimport { SelectInput } from \"./SelectInput\";\n\nexport interface ControlProps {\n id: string;\n spec: FieldSpec;\n value: ControlValue;\n invalid: boolean;\n options?: string[] | \"loading\";\n onChange: (v: ControlValue) => void;\n onBlur: () => void;\n}\n\nexport function Control(p: ControlProps) {\n const cls = [\"realiiz-form__control\", p.invalid && \"realiiz-form__control--invalid\"].filter(Boolean).join(\" \");\n const common = {\n id: p.id,\n name: p.spec.name,\n \"aria-invalid\": p.invalid || undefined,\n \"aria-describedby\": p.invalid ? `${p.id}-error` : undefined,\n onBlur: p.onBlur,\n } as const;\n const str = typeof p.value === \"string\" ? p.value : \"\";\n\n if (p.options === \"loading\") {\n return <div className={cls} aria-busy=\"true\" style={{ color: \"var(--_muted)\" }}>Loading options…</div>;\n }\n\n if (p.options || p.spec.input === \"select\") {\n return (\n <SelectInput\n id={p.id}\n name={p.spec.name}\n value={str}\n options={p.options ?? []}\n allowEmpty={!p.spec.required}\n invalid={p.invalid}\n onChange={p.onChange}\n onBlur={p.onBlur}\n />\n );\n }\n\n switch (p.spec.input) {\n case \"textarea\":\n return (\n <textarea {...common} className={`${cls} realiiz-form__control--textarea`} value={str}\n placeholder={p.spec.placeholder} onChange={(e) => p.onChange(e.target.value)} />\n );\n case \"boolean\":\n return (\n <input {...common} type=\"checkbox\" checked={p.value === true} onChange={(e) => p.onChange(e.target.checked)} />\n );\n case \"image\":\n // Without a host picker (Field.onPickImage) an image field is its path, typed by hand.\n return <input {...common} type=\"text\" className={cls} value={str} placeholder={p.spec.placeholder ?? \"/images/picture.webp\"} onChange={(e) => p.onChange(e.target.value)} />;\n case \"date\":\n return <input {...common} type=\"date\" className={cls} value={str} onChange={(e) => p.onChange(e.target.value)} />;\n case \"number\":\n return (\n <input {...common} type=\"number\" inputMode=\"numeric\" className={cls} value={str}\n min={p.spec.constraints.min} max={p.spec.constraints.max}\n step={p.spec.constraints.format === \"int\" ? 1 : undefined}\n placeholder={p.spec.placeholder} onChange={(e) => p.onChange(e.target.value)} />\n );\n case \"time\":\n return <input {...common} type=\"time\" className={cls} value={str} onChange={(e) => p.onChange(e.target.value)} />;\n case \"url\":\n return (\n <input {...common} type=\"url\" className={cls} value={str} placeholder={p.spec.placeholder ?? \"https://\"}\n onChange={(e) => p.onChange(e.target.value)} />\n );\n default:\n return (\n <input {...common} type=\"text\" className={cls} value={str} placeholder={p.spec.placeholder}\n maxLength={p.spec.constraints.max} onChange={(e) => p.onChange(e.target.value)} />\n );\n }\n}\n","/**\n * Picked images beside the form state. An image FIELD's value stays a path\n * string (what the frontmatter wants); the shrunk bytes for a newly chosen\n * picture live here until submit, keyed by field name, with an object URL for\n * the preview and the previous path so Remove can restore it.\n *\n * The host decides the path and does the shrinking (`onPickImage`) because it\n * knows the slug and the size rules; this hook only keeps the result.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface PickedImage {\n path: string;\n blob: Blob;\n previewUrl: string;\n width?: number;\n height?: number;\n /** The field's value before this pick, restored by Remove. */\n previous: string;\n}\n\nexport type PickResult = { path: string; blob: Blob; previewUrl?: string; width?: number; height?: number };\nexport type PickImage = (field: string, file: File) => Promise<PickResult>;\n\nexport type SubmittedImages = Record<string, { path: string; blob: Blob }>;\n\nexport function useImages() {\n const [images, setImages] = useState<Record<string, PickedImage>>({});\n const latest = useRef(images);\n latest.current = images;\n const urls = useRef(new Set<string>());\n\n useEffect(() => {\n const set = urls.current;\n return () => { for (const u of set) URL.revokeObjectURL(u); };\n }, []);\n\n const keep = useCallback((field: string, r: PickResult, previous: string): PickedImage => {\n const previewUrl = r.previewUrl ?? URL.createObjectURL(r.blob);\n if (!r.previewUrl) urls.current.add(previewUrl);\n const picked: PickedImage = { path: r.path, blob: r.blob, previewUrl, width: r.width, height: r.height, previous };\n setImages((m) => ({ ...m, [field]: picked }));\n return picked;\n }, []);\n\n /** Drop the pick; returns the value to put back in the field. */\n const remove = useCallback((field: string): string | undefined => {\n const previous = latest.current[field]?.previous;\n setImages((m) => {\n const rest = { ...m };\n delete rest[field];\n return rest;\n });\n return previous;\n }, []);\n\n const toSubmission = useCallback((): SubmittedImages => {\n return Object.fromEntries(Object.entries(images).map(([k, v]) => [k, { path: v.path, blob: v.blob }]));\n }, [images]);\n\n return { images, keep, remove, toSubmission };\n}\n\n/** \"214 KB\" / \"1.3 MB\" for the detail line. */\nexport function formatBytes(n: number): string {\n if (n < 1024 * 1024) return `${Math.max(1, Math.round(n / 1024))} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Getting a picture out of the browser and into a handler — shared by the\n * ImageInput control and the editor's toolbar. Three doors, one exit: a file\n * picker, a drop, or a paste, each yielding the first image File it finds.\n * No shrinking or naming here — that is the host's `onPick`/`onUploadImage`.\n */\n\nimport type { ClipboardEvent, DragEvent } from \"react\";\n\nexport const IMAGE_ACCEPT = \"image/jpeg,image/png,image/webp,image/gif\";\n\n/** Open the OS file picker and resolve with the chosen file (undefined if dismissed). */\nexport function pickFile(accept = IMAGE_ACCEPT): Promise<File | undefined> {\n return new Promise((resolve) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = accept;\n input.style.display = \"none\";\n document.body.appendChild(input);\n const done = () => { resolve(input.files?.[0]); input.remove(); };\n input.addEventListener(\"change\", done, { once: true });\n // Dismissing the picker fires no change event; window focus returning is the best signal.\n window.addEventListener(\"focus\", () => setTimeout(() => { if (document.body.contains(input)) done(); }, 400), { once: true });\n input.click();\n });\n}\n\nexport function imageFromDrop(e: DragEvent): File | undefined {\n return Array.from(e.dataTransfer?.files ?? []).find((f) => f.type.startsWith(\"image/\"));\n}\n\nexport function imageFromPaste(e: ClipboardEvent): File | undefined {\n const item = Array.from(e.clipboardData?.items ?? []).find((i) => i.kind === \"file\" && i.type.startsWith(\"image/\"));\n return item?.getAsFile() ?? undefined;\n}\n\n/** The sentence for the person when a handler throws — MediaError carries its own. */\nexport function messageOf(err: unknown): string {\n if (err && typeof err === \"object\" && (err as { name?: string }).name === \"MediaError\") return (err as Error).message;\n return \"That picture couldn’t be prepared. Try a different file.\";\n}\n","/**\n * ImageInput — the picture control for an image field.\n *\n * Empty: a dashed drop zone with \"Choose a picture\", \"or drag one here\", and the\n * size hint. With a value: a thumbnail (the current path, or the freshly shrunk\n * picture from its object URL) plus the detail line \"1600 × 900 · 214 KB\",\n * Replace, and — for a new pick — Remove, which restores the previous path.\n * Paste works anywhere on the control. The host's `onPick` shrinks and names the\n * file; this component shows \"Shrinking…\" meanwhile and any MediaError after.\n */\n\nimport { useRef, useState, type DragEvent, type ClipboardEvent } from \"react\";\nimport type { PickedImage } from \"./images\";\nimport { formatBytes } from \"./images\";\nimport { imageFromDrop, imageFromPaste, messageOf, pickFile } from \"./md/upload\";\n\nexport const IMAGE_HINT = \"JPG, PNG or WebP, up to 10MB. We shrink it for the web.\";\n\nexport interface ImageInputProps {\n id: string;\n name: string;\n /** The field's current value — a path such as /blog/my-post.webp, or \"\". */\n value: string;\n picked?: PickedImage;\n invalid?: boolean;\n disabled?: boolean;\n onPick: (file: File) => Promise<void>;\n onRemove?: () => void;\n onBlur?: () => void;\n}\n\nexport function ImageInput(p: ImageInputProps) {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [over, setOver] = useState(false);\n const zone = useRef<HTMLDivElement>(null);\n\n const take = async (file: File | undefined) => {\n if (!file || busy || p.disabled) return;\n setBusy(true);\n setError(null);\n try {\n await p.onPick(file);\n } catch (err) {\n setError(messageOf(err));\n } finally {\n setBusy(false);\n }\n };\n\n const choose = async () => take(await pickFile());\n const onDrop = (e: DragEvent) => { e.preventDefault(); setOver(false); void take(imageFromDrop(e)); };\n const onPaste = (e: ClipboardEvent) => { const f = imageFromPaste(e); if (f) { e.preventDefault(); void take(f); } };\n\n const src = p.picked?.previewUrl ?? (p.value || null);\n const detail = p.picked\n ? [p.picked.width && p.picked.height ? `${p.picked.width} × ${p.picked.height}` : null, formatBytes(p.picked.blob.size)].filter(Boolean).join(\" · \")\n : p.value;\n\n return (\n <div\n ref={zone}\n className={[\"realiiz-image\", over && \"realiiz-image--over\", p.invalid && \"realiiz-image--invalid\", busy && \"realiiz-image--busy\"].filter(Boolean).join(\" \")}\n data-field={p.name}\n onDragOver={(e) => { e.preventDefault(); if (!over) setOver(true); }}\n onDragLeave={() => setOver(false)}\n onDrop={onDrop}\n onPaste={onPaste}\n onBlur={p.onBlur}\n tabIndex={-1}\n >\n {/* the real value travels in the form state; this input exists for the label's htmlFor and assistive tech */}\n <input id={p.id} name={p.name} type=\"text\" value={p.value} readOnly className=\"realiiz-sr-only\" aria-busy={busy || undefined} />\n\n {src ? (\n <div className=\"realiiz-image__has\">\n <img src={src} alt=\"\" className=\"realiiz-image__thumb\" data-testid=\"realiiz-image-thumb\" />\n <div className=\"realiiz-image__meta\">\n <div className=\"realiiz-image__detail\">{busy ? \"Shrinking…\" : detail}</div>\n <div className=\"realiiz-image__actions\">\n <button type=\"button\" className=\"realiiz-form__button\" onClick={choose} disabled={busy || p.disabled}>Replace</button>\n {p.picked && p.onRemove && (\n <button type=\"button\" className=\"realiiz-image__remove\" onClick={p.onRemove} disabled={busy}>Remove</button>\n )}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"realiiz-image__empty\">\n <PictureIcon />\n <button type=\"button\" className=\"realiiz-form__button\" onClick={choose} disabled={busy || p.disabled}>\n {busy ? \"Shrinking…\" : \"Choose a picture\"}\n </button>\n <span className=\"realiiz-image__or\">or drag one here</span>\n </div>\n )}\n <div className=\"realiiz-image__hint\">{IMAGE_HINT}</div>\n {error && <div className=\"realiiz-form__error\" role=\"alert\">{error}</div>}\n </div>\n );\n}\n\nfunction PictureIcon() {\n return (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"realiiz-image__icon\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <circle cx=\"9\" cy=\"10\" r=\"1.6\" />\n <path d=\"M21 16l-5-5-8 8\" />\n </svg>\n );\n}\n","/**\n * Field anatomy: label (+ required marker) → control → helper row (length\n * gauge / character count) → error text. The error sits under the control,\n * never in a tooltip — the audience is a non-technical client.\n */\n\nimport type { FieldSpec } from \"../forms\";\nimport type { FieldIssue } from \"./issues\";\nimport type { ReactNode } from \"react\";\nimport { ChipsInput } from \"./ChipsInput\";\nimport { Control } from \"./controls\";\nimport { ImageInput } from \"./ImageInput\";\nimport type { PickedImage } from \"./images\";\nimport type { ControlValue } from \"./values\";\n\nexport interface FieldProps {\n formId: string;\n spec: FieldSpec;\n value: ControlValue;\n issues: FieldIssue[];\n options?: string[] | \"loading\";\n onChange: (v: ControlValue) => void;\n onBlur: () => void;\n /** How to draw a label that has help text — e.g. the site's own tooltip component. */\n renderLabel?: LabelRenderer;\n /** Image fields: the freshly picked picture (if any), and how to pick/remove one. Without onPickImage the field is a plain text path. */\n picked?: PickedImage;\n onPickImage?: (file: File) => Promise<void>;\n onRemoveImage?: () => void;\n}\n\nexport type LabelRenderer = (label: string, help: string) => ReactNode;\n\n/** Fallback when the host has no tooltip component: dotted underline + the browser's own title bubble. */\nconst defaultLabel: LabelRenderer = (label, help) => <span className=\"realiiz-form__help\" title={help}>{label}</span>;\n\n/**\n * Advisory length gauge. The bar is the whole scale (a bit past the max so\n * \"over\" has room to show), a green band marks the target range, and the fill\n * grows with the text in the state's colour: grey while short, green in range,\n * red past it. The words repeat only what the bar can't: the count and a verdict.\n */\nexport function LengthGauge({ length: raw, range, suffix }: { length: number; range: [number, number]; suffix?: string }) {\n const [min, max] = range;\n // The suffix is what the site adds on render (\" — Realiiz\"), so it counts once there is something to add it to.\n const length = raw === 0 ? 0 : raw + (suffix?.length ?? 0);\n const state = length === 0 ? \"empty\" : length < min ? \"short\" : length <= max ? \"ok\" : \"over\";\n const scale = Math.round(max * 1.3);\n const pct = (n: number) => `${Math.min(100, (n / scale) * 100)}%`;\n const verdict =\n state === \"ok\" ? \"good length\"\n : state === \"over\" ? `over ${max} — may be cut off`\n : `aim for ${min}–${max}`;\n const incl = suffix && length > 0 ? ` incl. “${suffix.trim()}”` : \"\";\n return (\n <span className={`realiiz-gauge realiiz-gauge--${state}`} title={`Recommended ${min}–${max} characters${suffix ? ` including “${suffix.trim()}”` : \"\"}`}>\n <span className=\"realiiz-gauge__bar\" aria-hidden=\"true\">\n <span className=\"realiiz-gauge__zone\" style={{ left: pct(min), width: `calc(${pct(max)} - ${pct(min)})` }} />\n <span className=\"realiiz-gauge__fill\" style={{ width: pct(length) }} />\n </span>\n <span className=\"realiiz-gauge__text\">\n <b>{length}</b> characters{incl} · {verdict}\n </span>\n </span>\n );\n}\n\nexport function Field(p: FieldProps) {\n const id = `${p.formId}-${p.spec.name}`;\n const invalid = p.issues.length > 0;\n const max = p.spec.constraints.max;\n const isText = p.spec.input === \"text\" || p.spec.input === \"textarea\";\n const len = typeof p.value === \"string\" ? p.value.length : 0;\n const isCheck = p.spec.input === \"boolean\";\n const isTags = p.spec.input === \"tags\";\n const labelText = p.spec.help ? (p.renderLabel ?? defaultLabel)(p.spec.label, p.spec.help) : p.spec.label;\n\n const control = p.spec.input === \"image\" && p.onPickImage ? (\n <ImageInput\n id={id}\n name={p.spec.name}\n value={typeof p.value === \"string\" ? p.value : \"\"}\n picked={p.picked}\n invalid={invalid}\n onPick={p.onPickImage}\n onRemove={p.onRemoveImage}\n onBlur={p.onBlur}\n />\n ) : isTags ? (\n <ChipsInput\n id={id}\n name={p.spec.name}\n value={Array.isArray(p.value) ? p.value : []}\n onChange={(v) => p.onChange(v)}\n onBlur={p.onBlur}\n placeholder={p.spec.placeholder}\n invalid={invalid}\n max={p.spec.constraints.exact ?? p.spec.constraints.max}\n />\n ) : (\n <Control id={id} spec={p.spec} value={p.value} invalid={invalid} options={p.options} onChange={p.onChange} onBlur={p.onBlur} />\n );\n\n return (\n <div className={`realiiz-form__field realiiz-form__field--${p.spec.input}`} data-field={p.spec.name}>\n {isCheck ? (\n <label className=\"realiiz-form__check\" htmlFor={id}>\n {control}\n <span>{labelText}{p.spec.required && <span className=\"realiiz-form__required\" aria-hidden=\"true\">*</span>}</span>\n </label>\n ) : (\n <>\n <label className=\"realiiz-form__label\" htmlFor={id}>\n {labelText}\n {p.spec.required && <span className=\"realiiz-form__required\" aria-hidden=\"true\">*</span>}\n </label>\n {control}\n </>\n )}\n {isText && (p.spec.recommended || typeof max === \"number\") && (\n <div className=\"realiiz-form__helper\">\n {p.spec.recommended ? (\n <LengthGauge length={len} range={p.spec.recommended} suffix={p.spec.suffix} />\n ) : (\n <span />\n )}\n {typeof max === \"number\" && <span className=\"realiiz-form__count\">{len} / {max}</span>}\n </div>\n )}\n {invalid && (\n <div className=\"realiiz-form__error\" id={`${id}-error`}>\n {p.issues.map((i, n) => <div key={n}>{i.message}</div>)}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Markdown tables as data — ported from the surveillance-review report editor.\n *\n * `tableAt` finds the table under the caret (header + separator required),\n * `renderTable` writes one back padded to an even grid so the source is\n * readable, and `applyTableOp` does the four row/column edits. Pure functions\n * over the textarea's string; no DOM.\n */\n\nexport type Align = \"l\" | \"L\" | \"c\" | \"r\";\nexport type TableOp = \"rowAfter\" | \"rowDel\" | \"colAfter\" | \"colDel\";\n\nexport interface TableAt {\n start: number;\n end: number;\n rows: string[][];\n align: Align[];\n /** Row index of the caret; header and separator both count as 0. */\n row: number;\n col: number;\n}\n\nconst ROW = /^\\s*\\|.*\\|\\s*$/;\nconst SEP = /^\\s*\\|[\\s:|-]+\\|\\s*$/;\n\nexport function tableCells(line: string): string[] {\n return line.trim().replace(/^\\|/, \"\").replace(/\\|$/, \"\").split(/(?<!\\\\)\\|/).map((c) => c.trim());\n}\n\nexport function tableAt(v: string, pos: number): TableAt | null {\n const lines = v.split(\"\\n\");\n let i = 0, off = 0;\n while (i < lines.length && pos > off + lines[i].length) { off += lines[i].length + 1; i++; }\n if (i >= lines.length || !ROW.test(lines[i])) return null;\n let s = i, e = i;\n while (s > 0 && ROW.test(lines[s - 1])) s--;\n while (e < lines.length - 1 && ROW.test(lines[e + 1])) e++;\n if (e - s < 1 || !SEP.test(lines[s + 1])) return null;\n const start = lines.slice(0, s).reduce((n, l) => n + l.length + 1, 0);\n const end = start + lines.slice(s, e + 1).join(\"\\n\").length;\n // \"L\" is an explicit left-align (:---) kept distinct from the default so we never rewrite a line the user typed.\n const align = tableCells(lines[s + 1]).map((c): Align =>\n c.startsWith(\":\") && c.endsWith(\":\") ? \"c\" : c.endsWith(\":\") ? \"r\" : c.startsWith(\":\") ? \"L\" : \"l\");\n const rows = lines.slice(s, e + 1).filter((_, n) => n !== 1).map(tableCells);\n const col = Math.max(0, (lines[i].slice(0, pos - off).match(/(?<!\\\\)\\|/g) || []).length - 1);\n const row = i - s <= 1 ? 0 : i - s - 1;\n return { start, end, rows, align, row, col };\n}\n\nexport function renderTable(rows: string[][], align: Align[]): string {\n const cols = Math.max(...rows.map((r) => r.length));\n const w: number[] = [];\n for (let c = 0; c < cols; c++) w[c] = Math.max(3, ...rows.map((r) => (r[c] || \"\").length));\n const pad = (t: string | undefined, c: number) => (t || \"\").padEnd(w[c]);\n const line = (r: string[]) => \"| \" + Array.from({ length: cols }, (_, c) => pad(r[c], c)).join(\" | \") + \" |\";\n const sep = \"|\" + Array.from({ length: cols }, (_, c) =>\n align[c] === \"c\" ? \":\" + \"-\".repeat(w[c]) + \":\"\n : align[c] === \"r\" ? \" \" + \"-\".repeat(w[c] - 1) + \": \"\n : align[c] === \"L\" ? \":\" + \"-\".repeat(w[c] - 1) + \" \"\n : \" \" + \"-\".repeat(w[c]) + \" \").join(\"|\") + \"|\";\n return [line(rows[0]), sep, ...rows.slice(1).map(line)].join(\"\\n\");\n}\n\n/** A new table: header placeholders (\"Column 1\"…) plus `rows` empty body rows. */\nexport function newTable(rows: number, cols: number): { text: string; firstHeader: string } {\n const head = Array.from({ length: cols }, (_, i) => `Column ${i + 1}`);\n const grid = [head, ...Array.from({ length: rows }, () => Array<string>(cols).fill(\"\"))];\n return { text: renderTable(grid, Array<Align>(cols).fill(\"l\")), firstHeader: head[0] };\n}\n\nexport type TableEdit = { text: string; a: number; b: number } | { error: string };\n\nexport function applyTableOp(v: string, pos: number, op: TableOp): TableEdit | null {\n const t = tableAt(v, pos);\n if (!t) return null;\n const rows = t.rows.map((r) => r.slice());\n const cols = Math.max(...rows.map((r) => r.length));\n const align = t.align.slice();\n if (op === \"rowAfter\") {\n rows.splice(Math.max(1, t.row + 1), 0, Array<string>(cols).fill(\"\"));\n } else if (op === \"rowDel\") {\n if (t.row === 0 || rows.length <= 2) return { error: \"A table needs its header row and at least one row below it.\" };\n rows.splice(t.row, 1);\n } else if (op === \"colAfter\") {\n rows.forEach((r) => { while (r.length < cols) r.push(\"\"); r.splice(t.col + 1, 0, \"\"); });\n align.splice(t.col + 1, 0, \"l\");\n } else if (op === \"colDel\") {\n if (cols <= 1) return { error: \"That's the last column — delete the table instead.\" };\n rows.forEach((r) => r.splice(t.col, 1));\n align.splice(t.col, 1);\n }\n const out = renderTable(rows, align);\n return { text: v.slice(0, t.start) + out + v.slice(t.end), a: t.start, b: t.start + out.length };\n}\n","/**\n * Toolbar edits — pure functions (text, selStart, selEnd) → { text, a, b }.\n *\n * Every formatting tool TOGGLES, like the surveillance-review report editor:\n * bold on bold text un-bolds; H2 on an H2 line removes it; H3 on an H2 line\n * swaps it; link anywhere inside a link removes it. `activeTools` reports which\n * of them the caret is currently \"in\", so the buttons can light up and say what\n * they're about to do.\n */\n\nimport { newTable } from \"./table\";\n\nexport type Edit = { text: string; a: number; b: number };\nexport type Apply = (s: string, a: number, b: number) => Edit;\n\n/** Inline marks: wrapped selection → unwrap; selection inside markers → unwrap; else wrap. */\nexport const toggleWrap = (mark: string, placeholder = \"text\"): Apply =>\n (s, a, b) => {\n const sel = s.slice(a, b);\n const n = mark.length;\n if (sel.length >= 2 * n && sel.startsWith(mark) && sel.endsWith(mark)) {\n const inner = sel.slice(n, sel.length - n);\n return { text: s.slice(0, a) + inner + s.slice(b), a, b: a + inner.length };\n }\n if (s.slice(a - n, a) === mark && s.slice(b, b + n) === mark) {\n return { text: s.slice(0, a - n) + sel + s.slice(b + n), a: a - n, b: a - n + sel.length };\n }\n const body = sel || placeholder;\n return { text: s.slice(0, a) + mark + body + mark + s.slice(b), a: a + n, b: a + n + body.length };\n };\n\n/** Every line prefix a line tool might own; setting one strips any other in the family. */\nexport const PREFIX_RE = /^(#{1,6}\\s+|[-*+]\\s+|\\d+[.)]\\s+|>\\s?)/;\n\nconst lineSpan = (s: string, a: number, b: number) => {\n const start = s.lastIndexOf(\"\\n\", a - 1) + 1;\n const endIdx = s.indexOf(\"\\n\", Math.max(b, a));\n return { start, end: endIdx === -1 ? s.length : endIdx };\n};\n\n/** Line tools: if every selected line already has THIS prefix, remove it; otherwise replace whatever prefix they have. */\nexport const toggleLines = (prefix: string | ((i: number) => string), matches: (line: string) => boolean): Apply =>\n (s, a, b) => {\n const { start, end } = lineSpan(s, a, b);\n const lines = s.slice(start, end).split(\"\\n\");\n const allOn = lines.every((l) => l.trim() === \"\" || matches(l));\n const out = lines.map((l, i) => {\n const bare = l.replace(PREFIX_RE, \"\");\n return allOn ? bare : (typeof prefix === \"string\" ? prefix : prefix(i)) + bare;\n });\n const replaced = out.join(\"\\n\");\n return { text: s.slice(0, start) + replaced + s.slice(end), a: start, b: start + replaced.length };\n };\n\nconst LINK_RE = /\\[([^\\]\\n]*)\\]\\(([^)\\n]*)\\)/g;\n\n/** The `[label](url)` that contains [a,b], or null. Images (``) don't count. */\nexport function linkAt(s: string, a: number, b: number): { from: number; to: number; label: string } | null {\n for (const m of s.matchAll(LINK_RE)) {\n if (s[m.index - 1] === \"!\") continue;\n const from = m.index, to = from + m[0].length;\n if (a >= from && b <= to) return { from, to, label: m[1] };\n if (from > b) break;\n }\n return null;\n}\n\n/** Link: any selection or caret inside a link removes it (label kept); otherwise link the selection and select the URL. */\nexport const toggleLink: Apply = (s, a, b) => {\n const hit = linkAt(s, a, b);\n if (hit) return { text: s.slice(0, hit.from) + hit.label + s.slice(hit.to), a: hit.from, b: hit.from + hit.label.length };\n const label = s.slice(a, b) || \"link text\";\n const urlStart = a + label.length + 3;\n return { text: s.slice(0, a) + `[${label}](https://)` + s.slice(b), a: urlStart, b: urlStart + 8 };\n};\n\n/** Image: `` with the URL selected for typing or pasting. */\nexport const insertImage: Apply = (s, a, b) => {\n const alt = s.slice(a, b) || \"description\";\n const urlStart = a + alt.length + 4;\n return { text: s.slice(0, a) + `` + s.slice(b), a: urlStart, b: urlStart + 8 };\n};\n\n/** Inline separator between details, e.g. `email · phone`. */\nexport const insertDot: Apply = (s, a, b) => {\n const t = \" · \";\n return { text: s.slice(0, a) + t + s.slice(b), a: a + t.length, b: a + t.length };\n};\n\n/** Needs a blank line before it or the paragraph above swallows the block. */\nconst blockBefore = (s: string, a: number) => (a === 0 || s.slice(0, a).endsWith(\"\\n\\n\") ? \"\" : s.slice(0, a).endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\");\n\nexport const insertRule: Apply = (s, a, b) => {\n const before = blockBefore(s, a);\n const t = before + \"---\\n\\n\";\n return { text: s.slice(0, a) + t + s.slice(b), a: a + t.length, b: a + t.length };\n};\n\n/** Table of `rows` body rows × `cols`; lands with the first header selected so typing replaces it. */\nexport const insertTable = (rows: number, cols: number): Apply => (s, a, b) => {\n const { text, firstHeader } = newTable(rows, cols);\n const before = blockBefore(s, a);\n const t = before + text + \"\\n\";\n const at = a + before.length + text.indexOf(firstHeader);\n return { text: s.slice(0, a) + t + s.slice(b), a: at, b: at + firstHeader.length };\n};\n\n/**\n * Tooltip term — an MDX component, so opt-in per site: `<Term definition=\"…\">word</Term>`.\n * Select a word → wrapped with the caret inside the empty quotes, ready for the\n * definition. Anywhere inside an existing Term → unwrapped back to the word.\n */\nexport const toggleTerm = (component = \"Term\", attr = \"definition\"): Apply => (s, a, b) => {\n const re = new RegExp(`<${component}\\\\s+${attr}=\"([^\"]*)\"\\\\s*>([\\\\s\\\\S]*?)</${component}>`, \"g\");\n for (const m of s.matchAll(re)) {\n const from = m.index, to = from + m[0].length;\n if (a >= from && b <= to) return { text: s.slice(0, from) + m[2] + s.slice(to), a: from, b: from + m[2].length };\n if (from > b) break;\n }\n const word = s.slice(a, b) || \"term\";\n const open = `<${component} ${attr}=\"`;\n const text = s.slice(0, a) + open + `\">${word}</${component}>` + s.slice(b);\n return { text, a: a + open.length, b: a + open.length };\n};\n\nexport interface Tool { id: string; title: string; apply: Apply }\n\nexport const TOOLS: Tool[] = [\n { id: \"bold\", title: \"Bold — ⌘B\", apply: toggleWrap(\"**\") },\n { id: \"italic\", title: \"Italic — ⌘I\", apply: toggleWrap(\"_\") },\n { id: \"h2\", title: \"Section heading\", apply: toggleLines(\"## \", (l) => /^##\\s/.test(l)) },\n { id: \"h3\", title: \"Sub-heading\", apply: toggleLines(\"### \", (l) => /^###\\s/.test(l)) },\n { id: \"ul\", title: \"Bulleted list\", apply: toggleLines(\"- \", (l) => /^[-*+]\\s/.test(l)) },\n { id: \"ol\", title: \"Numbered list\", apply: toggleLines((i) => `${i + 1}. `, (l) => /^\\d+[.)]\\s/.test(l)) },\n { id: \"quote\", title: \"Quote\", apply: toggleLines(\"> \", (l) => /^>/.test(l)) },\n { id: \"link\", title: \"Link\", apply: toggleLink },\n { id: \"code\", title: \"Inline code\", apply: toggleWrap(\"`\", \"code\") },\n { id: \"image\", title: \"Image\", apply: insertImage },\n { id: \"dot\", title: \"Separator between details ( · )\", apply: insertDot },\n { id: \"rule\", title: \"Divider line across the page\", apply: insertRule },\n];\n\nexport const toolById = (id: string): Tool => TOOLS.find((t) => t.id === id)!;\n\n/** Which toggle tools the caret is currently inside, so their buttons can light up. */\nexport function activeTools(s: string, a: number, b: number): Set<string> {\n const on = new Set<string>();\n const sel = s.slice(a, b);\n const wrapped = (m: string) =>\n (s.slice(a - m.length, a) === m && s.slice(b, b + m.length) === m) ||\n (sel.length >= 2 * m.length && sel.startsWith(m) && sel.endsWith(m));\n if (wrapped(\"**\") || spanAt(s, a, b, /\\*\\*[^*\\n]+\\*\\*/g, 2)) on.add(\"bold\");\n if (wrapped(\"_\") || spanAt(s, a, b, /(?<![\\w_])_[^_\\n]+_(?![\\w_])/g, 1)) on.add(\"italic\");\n if (wrapped(\"`\") || spanAt(s, a, b, /`[^`\\n]+`/g, 1)) on.add(\"code\");\n if (linkAt(s, a, b)) on.add(\"link\");\n if (spanAt(s, a, b, /<([A-Z][\\w]*)\\s[^>]*>[\\s\\S]*?<\\/\\1>/g, 0)) on.add(\"term\");\n const { start, end } = lineSpan(s, a, a);\n const line = s.slice(start, end);\n if (/^##\\s/.test(line)) on.add(\"h2\");\n else if (/^###\\s/.test(line)) on.add(\"h3\");\n else if (/^[-*+]\\s/.test(line)) on.add(\"ul\");\n else if (/^\\d+[.)]\\s/.test(line)) on.add(\"ol\");\n else if (/^>/.test(line)) on.add(\"quote\");\n return on;\n}\n\n/** True when [a,b] lies strictly inside the content of a span matched by `re` (pad = marker length). */\nfunction spanAt(s: string, a: number, b: number, re: RegExp, pad: number): boolean {\n for (const m of s.matchAll(re)) {\n const from = m.index, to = from + m[0].length;\n if (a >= from + pad && b <= to - pad) return true;\n if (from > b) break;\n }\n return false;\n}\n","/**\n * Toolbar glyphs — drawn, not typed, like the report editor: \"H\", \"1.\" and a\n * quotation mark as characters next to real icons is two visual languages for\n * one job. B and I stay as letters because the letterform IS the icon.\n */\n\nimport type { ReactNode } from \"react\";\n\nconst Svg = ({ children, fill = \"none\" }: { children: ReactNode; fill?: string }) => (\n <svg className=\"realiiz-md__ico\" viewBox=\"0 0 24 24\" fill={fill} stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {children}\n </svg>\n);\n\nexport const MD_ICONS: Record<string, ReactNode> = {\n bold: <b>B</b>,\n italic: <i>I</i>,\n h2: <Svg><path d=\"M6 5v14\" /><path d=\"M14 5v14\" /><path d=\"M6 12h8\" /><path d=\"M17.5 19v-6.5l-1.6 1.2\" /></Svg>,\n h3: <Svg><path d=\"M5 5v14\" /><path d=\"M12 5v14\" /><path d=\"M5 12h7\" /><path d=\"M16 12.5h3.5l-2 2.2a1.9 1.9 0 1 1-1.5 3.2\" /></Svg>,\n ul: (\n <Svg>\n <line x1=\"9\" y1=\"6.5\" x2=\"20\" y2=\"6.5\" /><line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" /><line x1=\"9\" y1=\"17.5\" x2=\"20\" y2=\"17.5\" />\n <circle cx=\"4.6\" cy=\"6.5\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"4.6\" cy=\"12\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"4.6\" cy=\"17.5\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n </Svg>\n ),\n ol: (\n <Svg>\n <line x1=\"10\" y1=\"6.5\" x2=\"20\" y2=\"6.5\" /><line x1=\"10\" y1=\"12\" x2=\"20\" y2=\"12\" /><line x1=\"10\" y1=\"17.5\" x2=\"20\" y2=\"17.5\" />\n <path d=\"M4 5.6 5.2 5v3.4\" /><path d=\"M3.6 11.2h1.8L3.6 13.7h1.9\" /><path d=\"M3.7 16.3h1.7v1.2H4.2h1.2v1.2H3.7\" />\n </Svg>\n ),\n quote: (\n <Svg>\n <path d=\"M9 7c-2.4 0-4 1.7-4 4 0 1.9 1.3 3.2 3 3.2.4 0 .8-.1 1-.2-.3 1.4-1.5 2.6-3 3l.7 1.5c2.8-.8 4.8-3.3 4.8-6.6C11.5 8.7 10.5 7 9 7z\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M18 7c-2.4 0-4 1.7-4 4 0 1.9 1.3 3.2 3 3.2.4 0 .8-.1 1-.2-.3 1.4-1.5 2.6-3 3l.7 1.5c2.8-.8 4.8-3.3 4.8-6.6C20.5 8.7 19.5 7 18 7z\" fill=\"currentColor\" stroke=\"none\" />\n </Svg>\n ),\n link: <Svg><path d=\"M10 13a5 5 0 0 0 7.5.5l2.5-2.5a5 5 0 0 0-7-7l-1.5 1.4\" /><path d=\"M14 11a5 5 0 0 0-7.5-.5L4 13a5 5 0 0 0 7 7l1.4-1.4\" /></Svg>,\n code: <Svg><path d=\"m8 7-5 5 5 5\" /><path d=\"m16 7 5 5-5 5\" /><path d=\"m14 4-4 16\" /></Svg>,\n // A tooltip: a tall speech bubble with an \"i\" — what the reader will actually see on the page.\n term: (\n <Svg>\n <path d=\"M5 2.5h14a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-4.5L12 21.5 9.5 17.5H5a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2z\" />\n <path d=\"M12 9v4.5\" />\n <circle cx=\"12\" cy=\"6.2\" r=\".9\" fill=\"currentColor\" stroke=\"none\" />\n </Svg>\n ),\n image: <Svg><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><circle cx=\"8.5\" cy=\"8.5\" r=\"1.6\" /><path d=\"m21 15-5-5L5 21\" /></Svg>,\n dot: <span className=\"realiiz-md__dot\">·</span>,\n rule: <Svg><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /></Svg>,\n table: <Svg><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><line x1=\"3\" y1=\"9.5\" x2=\"21\" y2=\"9.5\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" /><line x1=\"12\" y1=\"9.5\" x2=\"12\" y2=\"20\" /></Svg>,\n expand: <Svg><path d=\"M9 3H3v6\" /><path d=\"M15 21h6v-6\" /><path d=\"M3 3l7 7\" /><path d=\"M21 21l-7-7\" /></Svg>,\n contract: <Svg><path d=\"M4 10h6V4\" /><path d=\"M20 14h-6v6\" /><path d=\"M3 3l7 7\" /><path d=\"M21 21l-7-7\" /></Svg>,\n};\n","/**\n * Table size picker — point at a 6×6 grid instead of typing two numbers.\n * The count is body rows; the header is always added on top.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { MD_ICONS } from \"./icons\";\n\nconst MAX = 6;\n\nexport function TableGrid({ onPick }: { onPick: (rows: number, cols: number) => void }) {\n const [open, setOpen] = useState(false);\n const [hot, setHot] = useState<[number, number]>([0, 0]);\n const wrap = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const away = (e: MouseEvent) => { if (!wrap.current?.contains(e.target as Node)) setOpen(false); };\n const esc = (e: globalThis.KeyboardEvent) => { if (e.key === \"Escape\") setOpen(false); };\n document.addEventListener(\"mousedown\", away);\n document.addEventListener(\"keydown\", esc);\n return () => { document.removeEventListener(\"mousedown\", away); document.removeEventListener(\"keydown\", esc); };\n }, [open]);\n\n const [r, c] = hot;\n const label = r && c ? `${c} column${c === 1 ? \"\" : \"s\"} × ${r} row${r === 1 ? \"\" : \"s\"}` : \"Pick a size\";\n\n return (\n <span className={[\"realiiz-md__tgwrap\", open && \"is-open\"].filter(Boolean).join(\" \")} ref={wrap}>\n <button type=\"button\" data-tool=\"table\" data-tip=\"New table — pick a size\" aria-label=\"Insert a table\" aria-expanded={open} onClick={() => setOpen((o) => !o)}>\n {MD_ICONS.table}\n </button>\n {open && (\n <span className=\"realiiz-md__tgrid\" role=\"dialog\" aria-label=\"Table size\" onMouseLeave={() => setHot([0, 0])}>\n <span className=\"realiiz-md__tgcells\">\n {Array.from({ length: MAX * MAX }, (_, n) => {\n const rr = Math.floor(n / MAX) + 1, cc = (n % MAX) + 1;\n return (\n <i\n key={n}\n className={rr <= r && cc <= c ? \"hot\" : undefined}\n onMouseEnter={() => setHot([rr, cc])}\n onClick={() => { setOpen(false); onPick(rr, cc); }}\n aria-label={`${cc} × ${rr}`}\n role=\"button\"\n />\n );\n })}\n </span>\n <span className=\"realiiz-md__tglab\">{label}</span>\n </span>\n )}\n </span>\n );\n}\n","/**\n * MarkdownEditor — a plain textarea with the report editor's toolbar and a real preview.\n *\n * Shape borrowed from the surveillance-review report editor: a segmented\n * \"Edit Markdown | Preview\" control, one toolbar row (format · link · Insert:\n * image, separator, divider, table) with buttons that TOGGLE and light up when\n * the caret sits in text of that kind, row/column controls that appear only\n * while the caret is in a table, and an Expand button that fills the window\n * (pure CSS, Esc to come back). No rich-text model — the text is the truth.\n *\n * An existing post opens in Preview (read first, then edit); a blank body opens\n * in Edit. Preview is delegated: `renderPreview(markdown)` is supplied by the\n * host site and runs its real pipeline, so what you see is what the blog\n * renders. Without it, the Preview tab is hidden.\n *\n * Edits go through execCommand(\"insertText\") when the browser allows it so the\n * native undo stack survives (assigning .value wipes it); otherwise onChange.\n */\n\nimport { useCallback, useEffect, useRef, useState, type ClipboardEvent, type DragEvent, type KeyboardEvent } from \"react\";\nimport { activeTools, insertTable, toggleTerm, toolById, type Apply, type Edit, type Tool } from \"./md/edits\";\nimport { applyTableOp, tableAt, type TableOp } from \"./md/table\";\nimport { MD_ICONS } from \"./md/icons\";\nimport { TableGrid } from \"./md/TableGrid\";\nimport { imageFromDrop, imageFromPaste, messageOf, pickFile } from \"./md/upload\";\n\nexport { TOOLS } from \"./md/edits\";\n\nexport interface MarkdownEditorProps {\n id: string;\n name?: string;\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n /** Host-supplied renderer returning HTML. Errors should be returned as `{ error }`. */\n renderPreview?: (markdown: string) => Promise<{ html: string } | { error: string }>;\n /** Extra class on the preview body, e.g. the site's own prose class so it matches the blog. */\n previewClassName?: string;\n minHeight?: number;\n /**\n * Name of the site's tooltip MDX component, e.g. \"Term\" → a toolbar button that wraps the\n * selection as `<Term definition=\"\">word</Term>`. Off unless the site has such a component.\n */\n termComponent?: string;\n /**\n * Upload a picture for the body: shrink, name and hand back its final path and a\n * preview URL. When set, the toolbar Image button opens a file picker (and drop or\n * paste of an image onto the text does the same) and inserts .\n */\n onUploadImage?: (file: File) => Promise<{ path: string; previewUrl: string }>;\n /** Paths of not-yet-committed pictures → object URLs, applied to <img src> in the preview. */\n previewSrc?: Record<string, string>;\n}\n\nconst FORMAT = [\"bold\", \"italic\"] as const;\nconst BLOCK = [\"h2\", \"h3\", \"ul\", \"ol\", \"quote\"] as const;\nconst INLINE = [\"link\", \"code\"] as const;\nconst INSERT = [\"image\", \"dot\", \"rule\"] as const;\nconst TABLE_OPS: { op: TableOp; label: string; tip: string }[] = [\n { op: \"rowAfter\", label: \"+ Row\", tip: \"Insert a row below this one\" },\n { op: \"rowDel\", label: \"− Row\", tip: \"Delete this row\" },\n { op: \"colAfter\", label: \"+ Col\", tip: \"Insert a column to the right\" },\n { op: \"colDel\", label: \"− Col\", tip: \"Delete this column\" },\n];\n\nexport function MarkdownEditor({ id, name = \"body\", value, onChange, placeholder, renderPreview, previewClassName, minHeight = 320, termComponent, onUploadImage, previewSrc }: MarkdownEditorProps) {\n const [mode, setMode] = useState<\"edit\" | \"preview\">(() => (renderPreview && value.trim() ? \"preview\" : \"edit\"));\n const [preview, setPreview] = useState<{ html: string } | { error: string } | null>(null);\n const [loading, setLoading] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [on, setOn] = useState<Set<string>>(() => new Set());\n const [inTable, setInTable] = useState(false);\n const [note, setNote] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const ta = useRef<HTMLTextAreaElement>(null);\n\n const sync = useCallback(() => {\n const el = ta.current;\n if (!el) return;\n setOn(activeTools(el.value, el.selectionStart, el.selectionEnd));\n setInTable(Boolean(tableAt(el.value, el.selectionStart)));\n }, []);\n\n const commit = (edit: Edit) => {\n const el = ta.current;\n if (!el) return;\n const { text, a, b } = edit;\n // Replace only the changed span through insertText so undo keeps working; fall back to a plain set.\n const from = commonPrefix(el.value, text);\n const oldTail = el.value.length - from, newTail = text.length - from;\n const suffix = commonSuffix(el.value.slice(from), text.slice(from));\n const oldEnd = from + oldTail - suffix, newEnd = from + newTail - suffix;\n let ok = false;\n el.focus();\n el.setSelectionRange(from, oldEnd);\n try { ok = document.execCommand(\"insertText\", false, text.slice(from, newEnd)); } catch { ok = false; }\n if (!ok || el.value !== text) onChange(text);\n requestAnimationFrame(() => { el.setSelectionRange(a, b); sync(); });\n };\n\n const run = (apply: Apply) => {\n const el = ta.current;\n if (!el) return;\n commit(apply(value, el.selectionStart, el.selectionEnd));\n };\n\n const runTable = (op: TableOp) => {\n const el = ta.current;\n if (!el) return;\n const r = applyTableOp(value, el.selectionStart, op);\n if (!r) return;\n if (\"error\" in r) { setNote(r.error); return; }\n setNote(null);\n commit(r);\n };\n\n /** Toolbar Image (with a host uploader), or a picture dropped/pasted onto the text. */\n const upload = async (file: File | undefined) => {\n const el = ta.current;\n if (!file || !onUploadImage || !el || uploading) return;\n setUploading(true);\n setNote(null);\n const a = el.selectionStart, b = el.selectionEnd;\n try {\n const { path } = await onUploadImage(file);\n const alt = value.slice(a, b) || \"description\";\n const text = value.slice(0, a) + `` + value.slice(b);\n commit({ text, a: a + 2, b: a + 2 + alt.length });\n } catch (err) {\n setNote(messageOf(err));\n } finally {\n setUploading(false);\n }\n };\n const onDrop = (e: DragEvent<HTMLTextAreaElement>) => { const f = imageFromDrop(e); if (f && onUploadImage) { e.preventDefault(); void upload(f); } };\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => { const f = imageFromPaste(e); if (f && onUploadImage) { e.preventDefault(); void upload(f); } };\n\n const onKey = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\" && expanded) { e.preventDefault(); setExpanded(false); return; }\n if (!(e.metaKey || e.ctrlKey)) return;\n if (e.key === \"b\") { e.preventDefault(); run(toolById(\"bold\").apply); }\n if (e.key === \"i\") { e.preventDefault(); run(toolById(\"italic\").apply); }\n if (e.key === \"k\") { e.preventDefault(); run(toolById(\"link\").apply); }\n };\n\n useEffect(() => {\n if (!expanded) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n const esc = (e: globalThis.KeyboardEvent) => { if (e.key === \"Escape\") setExpanded(false); };\n document.addEventListener(\"keydown\", esc);\n return () => { document.body.style.overflow = prev; document.removeEventListener(\"keydown\", esc); };\n }, [expanded]);\n\n useEffect(() => {\n if (mode !== \"preview\" || !renderPreview) return;\n let live = true;\n setLoading(true);\n renderPreview(value)\n .then((r) => { if (live) setPreview(\"html\" in r ? { html: swapPreviewSrc(r.html, previewSrc) } : r); })\n .catch((err: unknown) => { if (live) setPreview({ error: err instanceof Error ? err.message : String(err) }); })\n .finally(() => { if (live) setLoading(false); });\n return () => { live = false; };\n }, [mode, value, renderPreview, previewSrc]);\n\n const termTool: Tool | null = termComponent\n ? { id: \"term\", title: `Tooltip — wraps the selection in <${termComponent}>`, apply: toggleTerm(termComponent) }\n : null;\n\n const btn = (toolId: string) => {\n const t = toolId === \"term\" && termTool ? termTool : toolById(toolId);\n const uploads = t.id === \"image\" && Boolean(onUploadImage);\n const title = uploads ? (uploading ? \"Shrinking…\" : \"Picture — choose a file, or drop/paste one into the text\") : t.title;\n return (\n <button key={t.id} type=\"button\" data-tool={t.id} data-tip={title} aria-label={title} aria-pressed={on.has(t.id) || undefined} aria-busy={uploads && uploading ? true : undefined} className={on.has(t.id) ? \"on\" : undefined} disabled={uploads && uploading} onMouseDown={(e) => e.preventDefault()} onClick={() => (uploads ? pickFile().then(upload) : run(t.apply))}>\n {MD_ICONS[t.id]}\n </button>\n );\n };\n\n return (\n <div className={[\"realiiz-md\", expanded && \"realiiz-md--fs\"].filter(Boolean).join(\" \")}>\n {renderPreview && (\n <span className=\"realiiz-md__mode\" role=\"tablist\" aria-label=\"Editor mode\">\n <button type=\"button\" role=\"tab\" aria-selected={mode === \"edit\"} onClick={() => setMode(\"edit\")}>Edit Markdown</button>\n <button type=\"button\" role=\"tab\" aria-selected={mode === \"preview\"} onClick={() => setMode(\"preview\")}>Preview</button>\n </span>\n )}\n\n <div className=\"realiiz-md__panel\">\n <div className=\"realiiz-md__head\">\n {mode === \"edit\" && (\n <span className=\"realiiz-md__tools\" role=\"toolbar\" aria-label=\"Formatting\">\n {FORMAT.map(btn)}\n <span className=\"realiiz-md__sep\" />\n {BLOCK.map(btn)}\n <span className=\"realiiz-md__sep\" />\n {INLINE.map(btn)}\n {termTool && btn(\"term\")}\n {inTable && (\n <>\n <span className=\"realiiz-md__sep\" />\n {TABLE_OPS.map((t) => (\n <button key={t.op} type=\"button\" data-tbl-op={t.op} data-tip={t.tip} aria-label={t.tip} onMouseDown={(e) => e.preventDefault()} onClick={() => runTable(t.op)}>{t.label}</button>\n ))}\n </>\n )}\n <span className=\"realiiz-md__insert\">\n <span className=\"realiiz-md__lab\">Insert</span>\n {INSERT.map(btn)}\n <TableGrid onPick={(r, c) => run(insertTable(r, c))} />\n </span>\n </span>\n )}\n <span className=\"realiiz-md__spacer\" />\n <button\n type=\"button\"\n className=\"realiiz-md__expand\"\n data-tip={expanded ? \"Back to the normal layout — or press Esc\" : \"Fill the window — Esc to come back\"}\n aria-label={expanded ? \"Exit\" : \"Expand\"}\n onClick={() => setExpanded((x) => !x)}\n >\n {expanded ? MD_ICONS.contract : MD_ICONS.expand}\n </button>\n </div>\n\n {mode === \"edit\" ? (\n <textarea\n ref={ta}\n id={id}\n name={name}\n className=\"realiiz-form__control realiiz-form__control--body realiiz-md__ta\"\n style={expanded ? undefined : { minHeight }}\n value={value}\n placeholder={placeholder}\n onChange={(e) => { onChange(e.target.value); sync(); }}\n onSelect={sync}\n onKeyUp={sync}\n onClick={sync}\n onKeyDown={onKey}\n onDrop={onDrop}\n onPaste={onPaste}\n spellCheck\n />\n ) : (\n <div className=\"realiiz-md__preview\" style={expanded ? undefined : { minHeight }} aria-live=\"polite\" aria-busy={loading}>\n {loading && <div className=\"realiiz-md__loading\">Rendering…</div>}\n {!loading && preview && \"error\" in preview && (\n <div className=\"realiiz-form__alert\" role=\"alert\">Couldn't render: {preview.error}</div>\n )}\n {!loading && preview && \"html\" in preview && (\n <div className={[\"realiiz-prose\", previewClassName].filter(Boolean).join(\" \")} dangerouslySetInnerHTML={{ __html: preview.html }} />\n )}\n </div>\n )}\n </div>\n {(note || uploading) && <div className=\"realiiz-form__helper realiiz-md__note\" role=\"status\">{uploading ? \"Shrinking…\" : note}</div>}\n </div>\n );\n}\n\n/** Point <img src=\"/blog/x/y.webp\"> at its object URL while the file exists only in this browser. */\nexport function swapPreviewSrc(html: string, map?: Record<string, string>): string {\n if (!map || Object.keys(map).length === 0) return html;\n return html.replace(/(<img\\b[^>]*\\bsrc=\")([^\"]+)(\")/g, (m, pre: string, src: string, post: string) => (map[src] ? `${pre}${map[src]}${post}` : m));\n}\n\nfunction commonPrefix(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[i] === b[i]) i++;\n return i;\n}\nfunction commonSuffix(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[a.length - 1 - i] === b[b.length - 1 - i]) i++;\n return i;\n}\n","/**\n * zod issue → { field, key, message }. Pure.\n *\n * The key matches FieldSpec.messages so the schema's own per-check wording is\n * what the client reads. Observed on zod 4.5.4 (see the ADMIN-02b brief):\n * too_small / too_big origin string|array → min_length / max_length\n * origin number → greater_than / less_than\n * when the spec has `exact` → length_equals\n * invalid_format format regex|url|… → that format\n * invalid_type + format safeint (from .int()) → int\n * custom → custom\n * unrecognized_keys path [] , keys: [...] → form-level\n */\n\nimport type { FieldSpec } from \"../forms\";\n\nexport interface FieldIssue {\n /** null for form-level issues. */\n field: string | null;\n key: string;\n message: string;\n}\n\ninterface ZodIssueLike {\n code: string;\n path: PropertyKey[];\n message: string;\n origin?: string;\n format?: string;\n keys?: string[];\n}\n\nexport function mapIssues(issues: ZodIssueLike[], specs: FieldSpec[]): FieldIssue[] {\n const byName = new Map(specs.map((s) => [s.name, s]));\n return issues.map((issue) => {\n const field = typeof issue.path[0] === \"string\" ? issue.path[0] : null;\n const spec = field ? byName.get(field) : undefined;\n const key = keyFor(issue, spec);\n const message =\n (spec?.messages[key] ?? (issue.code === \"unrecognized_keys\" ? unknownKeysMessage(issue) : undefined)) ??\n issue.message;\n return { field, key, message };\n });\n}\n\nfunction keyFor(issue: ZodIssueLike, spec?: FieldSpec): string {\n const numeric = issue.origin === \"number\" || issue.origin === \"int\";\n switch (issue.code) {\n case \"too_small\":\n if (spec?.constraints.exact !== undefined) return \"length_equals\";\n return numeric ? \"greater_than\" : \"min_length\";\n case \"too_big\":\n if (spec?.constraints.exact !== undefined) return \"length_equals\";\n return numeric ? \"less_than\" : \"max_length\";\n case \"invalid_format\":\n return issue.format ?? \"format\";\n case \"invalid_type\":\n return issue.format === \"safeint\" || issue.format === \"int32\" ? \"int\" : \"invalid_type\";\n default:\n return issue.code;\n }\n}\n\nfunction unknownKeysMessage(issue: ZodIssueLike): string {\n const keys = issue.keys ?? [];\n return `This file has ${keys.length === 1 ? \"a field\" : \"fields\"} the site does not recognise: ${keys.join(\", \")}. It was probably edited by hand — remove or rename ${keys.length === 1 ? \"it\" : \"them\"} to continue.`;\n}\n\n/** Group by field for rendering. */\nexport function groupIssues(list: FieldIssue[]): { byField: Map<string, FieldIssue[]>; formLevel: FieldIssue[] } {\n const byField = new Map<string, FieldIssue[]>();\n const formLevel: FieldIssue[] = [];\n for (const i of list) {\n if (i.field === null) formLevel.push(i);\n else byField.set(i.field, [...(byField.get(i.field) ?? []), i]);\n }\n return { byField, formLevel };\n}\n","/**\n * Control strings ↔ frontmatter values. Pure.\n *\n * Controls hold strings (or booleans / string arrays). The schema wants typed\n * values. An image field holds its PATH as a string; the picked bytes live\n * beside the form state (ContentForm `images`) and never pass through here.\n * `toControl` seeds a control from an existing frontmatter value — including\n * a Date from a previously-parsed file — and `toValue` assembles what goes to\n * safeParse. Anything the schema then coerces (dates) is the schema's business.\n */\n\nimport type { FieldSpec } from \"../forms\";\n\nexport type ControlValue = string | string[] | boolean | null;\nexport type FormState = Record<string, ControlValue>;\n\nexport function toControl(spec: FieldSpec, raw: unknown): ControlValue {\n if (raw === undefined || raw === null) return spec.input === \"boolean\" ? false : \"\";\n switch (spec.input) {\n case \"boolean\":\n return Boolean(raw);\n case \"date\": {\n // <input type=\"date\"> only accepts YYYY-MM-DD; frontmatter often carries a full ISO stamp.\n if (raw instanceof Date) return raw.toISOString().slice(0, 10);\n const s = String(raw);\n return /^\\d{4}-\\d{2}-\\d{2}/.test(s) ? s.slice(0, 10) : s;\n }\n case \"tags\":\n return Array.isArray(raw) ? raw.map(String) : String(raw).split(\",\").map((t) => t.trim()).filter(Boolean);\n default:\n return String(raw);\n }\n}\n\n/** Build the object that goes to schema.safeParse. Empty optional fields are omitted. */\nexport function toFrontmatter(\n specs: FieldSpec[],\n state: FormState,\n hiddenValues: Record<string, unknown>,\n): Record<string, unknown> {\n const frontmatter: Record<string, unknown> = { ...hiddenValues };\n\n for (const spec of specs) {\n if (spec.role === \"hidden\" || spec.role === \"body\") continue;\n const v = state[spec.name];\n\n if (spec.input === \"boolean\") {\n if (v === true) frontmatter[spec.name] = true;\n else if (spec.required) frontmatter[spec.name] = false;\n continue;\n }\n if (Array.isArray(v)) {\n if (v.length || spec.required) frontmatter[spec.name] = v;\n continue;\n }\n const s = typeof v === \"string\" ? v.trim() : \"\";\n if (s === \"\") {\n // Required fields are sent empty so the schema's own \"is required\" message fires.\n if (spec.required) frontmatter[spec.name] = spec.input === \"tags\" ? [] : \"\";\n continue;\n }\n switch (spec.input) {\n case \"number\": {\n const n = Number(s);\n frontmatter[spec.name] = Number.isNaN(n) ? s : n;\n break;\n }\n case \"tags\":\n frontmatter[spec.name] = s.split(\",\").map((t) => t.trim()).filter(Boolean);\n break;\n default:\n frontmatter[spec.name] = s;\n }\n }\n return frontmatter;\n}\n","/**\n * ContentForm — a ContentTypeEntry in, validated { frontmatter, body, images } out.\n *\n * Validation runs on submit. After the first failed submit it also re-runs on\n * blur, so the client watches the error clear as they fix it. Before that\n * first submit the form stays quiet — nagging someone who hasn't finished\n * typing is the wrong default for this audience.\n *\n * The schema is the only judge. This component never decides what is valid;\n * it assembles values, calls entry.schema.safeParse, and maps issues back to\n * fields with the schema's own messages.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type FormEvent, type ReactNode } from \"react\";\nimport type { ContentTypeEntry, FieldSpec } from \"../forms\";\nimport { walkSchema } from \"../forms\";\nimport { Field, type LabelRenderer } from \"./Field\";\nimport { MarkdownEditor, type MarkdownEditorProps } from \"./MarkdownEditor\";\nimport { groupIssues, mapIssues, type FieldIssue } from \"./issues\";\nimport { FORM_CSS } from \"./styles\";\nimport { toControl, toFrontmatter, type ControlValue, type FormState } from \"./values\";\nimport { useImages, type PickImage, type SubmittedImages } from \"./images\";\n\nexport interface ContentFormSubmission {\n frontmatter: Record<string, unknown>;\n body: string;\n /** Newly picked pictures by field name — the frontmatter already holds each one's final path. */\n images: SubmittedImages;\n}\n\nexport interface ContentFormProps {\n entry: ContentTypeEntry;\n initialValues?: Record<string, unknown>;\n initialBody?: string;\n onSubmit: (s: ContentFormSubmission) => void | Promise<void>;\n onCancel?: () => void;\n submitLabel?: string;\n className?: string;\n /**\n * Show the MDX body textarea (the content below the frontmatter). Default\n * true — most types have a body. Pass false for frontmatter-only types such\n * as venues. Independent of entry.body, which names a frontmatter FIELD\n * that should be edited as long text.\n */\n showBody?: boolean;\n bodyLabel?: string;\n /** Host-supplied Markdown/MDX renderer for the Preview tab. Without it the editor is edit-only. */\n renderPreview?: MarkdownEditorProps[\"renderPreview\"];\n previewClassName?: string;\n /** Site tooltip MDX component name (e.g. \"Term\") to expose as a toolbar button. */\n termComponent?: string;\n /**\n * Image fields: shrink and name a chosen file (the host knows the slug and the\n * size rules) and hand back { path, blob, previewUrl?, width?, height? }. The\n * field's value becomes `path`; the blob rides along in the submission. Without\n * this, image fields are plain text paths.\n */\n onPickImage?: PickImage;\n /** Editor toolbar Image button: upload a picture for the body and return its path + preview URL. */\n onUploadImage?: MarkdownEditorProps[\"onUploadImage\"];\n /** Paths of not-yet-committed pictures → object URLs, so the Preview tab shows them. */\n previewSrc?: MarkdownEditorProps[\"previewSrc\"];\n /**\n * Put Cancel/Save in a bar that the host can pin to the bottom of the page\n * (`.realiiz-form__bar`; the shell makes it sticky). The bar also reports\n * \"Unsaved changes\" / \"No changes yet\", or `status` when the host supplies one.\n */\n stickyBar?: boolean;\n status?: ReactNode;\n /** Extra controls in the bar, before Cancel/Save — e.g. a link to review a pending change. */\n barExtra?: ReactNode;\n /** Rendered after the fields and before the bar — the right place for a quiet destructive action (remove this item). */\n footer?: ReactNode;\n /** Draw a field label that has `.meta({ help })` — pass the site's tooltip component so labels explain themselves. */\n renderLabel?: LabelRenderer;\n /**\n * Fill `target` from `source` while the person types, until they edit `target`\n * themselves — e.g. { source: \"title\", target: \"slug\" } for a web address.\n * Only kicks in when `target` started empty (a new item), never on an existing one.\n */\n derive?: { source: string; target: string; transform?: (value: string) => string };\n /**\n * Warn before leaving with unsaved edits: the browser's own prompt on close/reload,\n * and a confirm on in-app link clicks (which never fire beforeunload). Default true.\n */\n guardUnsaved?: boolean;\n}\n\nconst LEAVE_MESSAGE = \"You have unsaved changes. Leave this page and lose them?\";\n\n/** \"Hello, World! 2026\" → \"hello-world-2026\" — the same rule the blog's slug regex enforces. */\nexport function slugify(s: string): string {\n return s\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\ntype SafeParse = { success: true; data: unknown } | { success: false; error: { issues: Parameters<typeof mapIssues>[0] } };\n\nexport function ContentForm({ entry, initialValues = {}, initialBody = \"\", onSubmit, onCancel, submitLabel = \"Save\", className, showBody = true, bodyLabel = \"Content\", renderPreview, previewClassName, termComponent, onPickImage, onUploadImage, previewSrc, stickyBar = false, status, barExtra, footer, renderLabel, derive, guardUnsaved = true }: ContentFormProps) {\n const formId = useId();\n const specs = useMemo(() => walkSchema(entry.schema, entry), [entry]);\n const visible = useMemo(() => specs.filter((s) => s.role !== \"hidden\" && s.role !== \"body\"), [specs]);\n const bodySpec = specs.find((s) => s.role === \"body\");\n // Main section first, then each registry group in its own fieldset, fields in the group's order.\n const sections = useMemo(() => {\n const groups = entry.groups ?? [];\n const grouped = new Set(groups.flatMap((g) => g.fields));\n const byName = new Map(visible.map((s) => [s.name, s]));\n const main = { label: entry.singular ?? entry.label, fields: visible.filter((s) => !grouped.has(s.name)) };\n const rest = groups\n .map((g) => ({ label: g.label, fields: g.fields.map((n) => byName.get(n)).filter((s): s is FieldSpec => Boolean(s)) }))\n .filter((g) => g.fields.length > 0);\n return [main, ...rest];\n }, [visible, entry.groups, entry.label, entry.singular]);\n\n const initialState = useMemo<FormState>(() => Object.fromEntries(specs.map((s) => [s.name, toControl(s, initialValues[s.name])])), [specs, initialValues]);\n const [state, setState] = useState<FormState>(initialState);\n // Derivation runs only while the target is untouched AND started empty (a new item).\n const [deriving, setDeriving] = useState(() => Boolean(derive && !initialState[derive.target]));\n const update = (name: string, v: ControlValue) =>\n setState((st) => {\n const next = { ...st, [name]: v };\n if (derive && deriving && name === derive.source && typeof v === \"string\") {\n next[derive.target] = (derive.transform ?? slugify)(v);\n }\n return next;\n });\n const onFieldChange = (name: string, v: ControlValue) => {\n if (derive && deriving && name === derive.target) setDeriving(false);\n update(name, v);\n };\n const [body, setBody] = useState(initialBody);\n const pictures = useImages();\n const pickImage = onPickImage\n ? (field: string) => async (file: File) => {\n const r = await onPickImage(field, file);\n pictures.keep(field, r, typeof state[field] === \"string\" ? (state[field] as string) : \"\");\n onFieldChange(field, r.path);\n }\n : undefined;\n const removeImage = (field: string) => () => {\n const previous = pictures.remove(field);\n onFieldChange(field, previous ?? \"\");\n };\n const dirty = body !== initialBody || specs.some((s) => !sameValue(state[s.name], initialState[s.name]));\n const [issues, setIssues] = useState<FieldIssue[]>([]);\n const [attempted, setAttempted] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [options, setOptions] = useState<Record<string, string[] | \"loading\">>({});\n\n // Hidden fields (and any initial key with no spec) ride through untouched.\n const hiddenValues = useMemo(() => {\n const shown = new Set(visible.map((s) => s.name));\n if (bodySpec) shown.add(bodySpec.name);\n return Object.fromEntries(Object.entries(initialValues).filter(([k]) => !shown.has(k)));\n }, [initialValues, visible, bodySpec]);\n\n // Resolve function option sources once, on mount.\n useEffect(() => {\n let live = true;\n for (const s of visible) {\n if (typeof s.options !== \"function\") continue;\n setOptions((o) => ({ ...o, [s.name]: \"loading\" }));\n Promise.resolve(s.options()).then((list) => {\n if (live) setOptions((o) => ({ ...o, [s.name]: list }));\n });\n }\n return () => {\n live = false;\n };\n }, [visible]);\n\n // Leaving with edits: native prompt for close/reload, a confirm for same-app links (client routers skip beforeunload).\n const leaving = useRef(false);\n useEffect(() => {\n if (!guardUnsaved || !dirty || submitting) return;\n const onUnload = (e: BeforeUnloadEvent) => { if (!leaving.current) { e.preventDefault(); e.returnValue = LEAVE_MESSAGE; } };\n const onClick = (e: MouseEvent) => {\n const a = (e.target as HTMLElement | null)?.closest?.(\"a[href]\") as HTMLAnchorElement | null;\n if (!a || a.target === \"_blank\" || e.defaultPrevented || e.metaKey || e.ctrlKey) return;\n if (a.origin !== window.location.origin) return;\n if (!window.confirm(LEAVE_MESSAGE)) { e.preventDefault(); e.stopPropagation(); }\n else leaving.current = true;\n };\n window.addEventListener(\"beforeunload\", onUnload);\n document.addEventListener(\"click\", onClick, true);\n return () => { window.removeEventListener(\"beforeunload\", onUnload); document.removeEventListener(\"click\", onClick, true); };\n }, [guardUnsaved, dirty, submitting]);\n\n const validate = useCallback((): SafeParse => {\n const frontmatter = toFrontmatter(specs, state, hiddenValues);\n const result = (entry.schema as { safeParse: (v: unknown) => SafeParse }).safeParse(frontmatter);\n setIssues(result.success ? [] : mapIssues(result.error.issues, specs));\n return result;\n }, [entry.schema, specs, state, hiddenValues]);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (submitting) return;\n setAttempted(true);\n const result = validate();\n if (!result.success) return;\n setSubmitting(true);\n try {\n await onSubmit({ frontmatter: result.data as Record<string, unknown>, body, images: pictures.toSubmission() });\n } finally {\n setSubmitting(false);\n }\n };\n\n const { byField, formLevel } = groupIssues(issues);\n const optionsFor = (s: FieldSpec) => options[s.name] ?? (Array.isArray(s.options) ? s.options : undefined);\n\n return (\n <form className={[\"realiiz-form\", className].filter(Boolean).join(\" \")} onSubmit={handleSubmit} noValidate data-realiiz-content-form={entry.id}>\n <style>{FORM_CSS}</style>\n\n {formLevel.length > 0 && (\n <div className=\"realiiz-form__alert\" role=\"alert\">\n <strong>This can't be saved yet.</strong>\n <ul>{formLevel.map((i, n) => <li key={n}>{i.message}</li>)}</ul>\n </div>\n )}\n\n {sections.map((sec) => (\n <fieldset key={sec.label}>\n <legend>{sec.label}</legend>\n {sec.fields.map((s) => (\n <Field key={s.name} formId={formId} spec={s} value={state[s.name]} issues={byField.get(s.name) ?? []}\n options={optionsFor(s)}\n renderLabel={renderLabel}\n picked={pictures.images[s.name]}\n onPickImage={pickImage?.(s.name)}\n onRemoveImage={removeImage(s.name)}\n onChange={(v: ControlValue) => onFieldChange(s.name, v)}\n onBlur={() => { if (attempted) validate(); }} />\n ))}\n </fieldset>\n ))}\n\n {(showBody || bodySpec) && (\n <fieldset>\n <legend>{bodySpec?.label ?? bodyLabel}</legend>\n {/* The legend already names this section; the label stays for assistive tech only. */}\n <label className=\"realiiz-form__label realiiz-sr-only\" htmlFor={`${formId}-body`}>{bodySpec?.label ?? bodyLabel}</label>\n <MarkdownEditor\n id={`${formId}-body`}\n value={body}\n onChange={setBody}\n placeholder={bodySpec?.placeholder ?? \"Write in Markdown. Headings with ##, links as [text](url).\"}\n renderPreview={renderPreview}\n previewClassName={previewClassName}\n termComponent={termComponent}\n onUploadImage={onUploadImage}\n previewSrc={previewSrc}\n />\n </fieldset>\n )}\n\n {/* Sole child of its own box: a server-created element dropped straight into this children array trips React's key check. */}\n {footer && <div className=\"realiiz-form__footer\">{footer}</div>}\n\n <div className={stickyBar ? \"realiiz-form__bar\" : \"realiiz-form__actions\"} data-dirty={dirty || undefined}>\n {stickyBar && (\n <span className=\"realiiz-form__status\" role=\"status\">\n {status ?? (dirty ? \"Unsaved changes\" : \"No changes yet\")}\n </span>\n )}\n {stickyBar && barExtra}\n {onCancel && <button type=\"button\" className=\"realiiz-form__button\" onClick={onCancel}>Cancel</button>}\n <button type=\"submit\" className=\"realiiz-form__button realiiz-form__button--primary\" disabled={submitting}>\n {submitting ? `${submitLabel}…` : submitLabel}\n </button>\n </div>\n </form>\n );\n}\n\nfunction sameValue(a: ControlValue | undefined, b: ControlValue | undefined): boolean {\n if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((v, i) => v === b[i]);\n return a === b;\n}\n","/** A picture problem the person can act on. The message is the sentence shown under the control. */\nexport class MediaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MediaError\";\n }\n}\n\nexport const MESSAGES = {\n type: \"That file type isn’t supported — use a JPG, PNG or WebP.\",\n size: \"That picture is too big to send — pick one under 10MB.\",\n encode: \"This browser can’t prepare pictures — try Chrome, Edge or Safari 16+.\",\n} as const;\n","/**\n * resizeImage — shrink a picture in the browser to web size, as WebP.\n *\n * Phone photos are 3–8MB; a Vercel server action body is capped at 4.5MB and the\n * GitHub API wants base64. So the shrink happens here, before anything leaves the\n * browser: decode → fit inside maxWidth → draw to a canvas → encode WebP, lowering\n * quality in steps until the result is under maxBytes. GIFs lose their animation\n * (a still frame is encoded) — acceptable for a blog.\n *\n * No network, no dependencies. Throws MediaError with a plain sentence for the\n * three things that can go wrong: wrong type, too big to even try, or a browser\n * that cannot encode WebP (toBlob returns null or a non-WebP type).\n */\n\nimport { MediaError, MESSAGES } from \"./errors\";\n\nexport const ACCEPTED_TYPES = [\"image/jpeg\", \"image/png\", \"image/webp\", \"image/gif\"] as const;\nexport const MAX_INPUT_BYTES = 10 * 1024 * 1024;\n\nexport interface ResizeOptions {\n /** Longest allowed width in pixels. Default 1600. */\n maxWidth?: number;\n /** Starting WebP quality 0–1. Default 0.82. */\n quality?: number;\n /** Target ceiling for the encoded size. Default 600KB. */\n maxBytes?: number;\n}\n\nexport interface ResizedImage {\n blob: Blob;\n width: number;\n height: number;\n}\n\n/** Pure: fit (width × height) inside maxWidth, never scaling up, whole pixels. */\nexport function fitWithin(width: number, height: number, maxWidth: number): { width: number; height: number } {\n if (width <= maxWidth) return { width, height };\n const ratio = maxWidth / width;\n return { width: Math.round(width * ratio), height: Math.max(1, Math.round(height * ratio)) };\n}\n\n/** The type/size guards, separated so they can run (and be tested) without a canvas. */\nexport function checkInput(file: { type: string; size: number }): void {\n if (!(ACCEPTED_TYPES as readonly string[]).includes(file.type)) throw new MediaError(MESSAGES.type);\n if (file.size > MAX_INPUT_BYTES) throw new MediaError(MESSAGES.size);\n}\n\nexport async function resizeImage(file: File, opts: ResizeOptions = {}): Promise<ResizedImage> {\n checkInput(file);\n const { maxWidth = 1600, quality = 0.82, maxBytes = 600 * 1024 } = opts;\n\n const bitmap = await decode(file);\n const { width, height } = fitWithin(bitmap.width, bitmap.height, maxWidth);\n const canvas = makeCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new MediaError(MESSAGES.encode);\n ctx.drawImage(bitmap, 0, 0, width, height);\n bitmap.close?.();\n\n let q = quality;\n let blob = await encode(canvas, q);\n while (blob.size > maxBytes && q - 0.08 >= 0.5) {\n q -= 0.08;\n blob = await encode(canvas, q);\n }\n return { blob, width, height };\n}\n\nasync function decode(file: File): Promise<ImageBitmap> {\n try {\n return await createImageBitmap(file);\n } catch {\n throw new MediaError(MESSAGES.encode);\n }\n}\n\ntype AnyCanvas = HTMLCanvasElement | OffscreenCanvas;\n\nfunction makeCanvas(width: number, height: number): AnyCanvas {\n if (typeof OffscreenCanvas !== \"undefined\") return new OffscreenCanvas(width, height);\n const c = document.createElement(\"canvas\");\n c.width = width;\n c.height = height;\n return c;\n}\n\nasync function encode(canvas: AnyCanvas, quality: number): Promise<Blob> {\n const blob =\n \"convertToBlob\" in canvas\n ? await canvas.convertToBlob({ type: \"image/webp\", quality }).catch(() => null)\n : await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, \"image/webp\", quality));\n if (!blob || blob.type !== \"image/webp\") throw new MediaError(MESSAGES.encode);\n return blob;\n}\n","/**\n * Where a picture lives, decided from the post's slug so the path is known before\n * anything is committed: hero → /blog/{slug}.webp, social → /blog/{slug}-social.webp,\n * body → /blog/{slug}/{name}.webp. The host commits the file under public/ + path.\n */\n\nexport type ImageKind = \"hero\" | \"social\" | \"body\";\n\nexport interface PathOptions {\n /** URL prefix the pictures are served from. Default \"/blog\". */\n publicDir?: string;\n}\n\n/** Lower-case letters, digits and single hyphens; empty in → \"image\". */\nexport function slugifyName(name: string): string {\n const base = name.replace(/\\.[a-z0-9]+$/i, \"\");\n const s = base\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s || \"image\";\n}\n\nexport function imagePathFor(kind: ImageKind, slug: string, originalName = \"\", opts: PathOptions = {}): string {\n const dir = (opts.publicDir ?? \"/blog\").replace(/\\/$/, \"\");\n switch (kind) {\n case \"hero\":\n return `${dir}/${slug}.webp`;\n case \"social\":\n return `${dir}/${slug}-social.webp`;\n case \"body\":\n return `${dir}/${slug}/${slugifyName(originalName)}.webp`;\n }\n}\n","\"use client\";\n\n/**\n * Pictures for the post editor (ADMIN-06b). Chosen files are shrunk to WebP in\n * the browser, named from the slug, and held here until Save, when they ride\n * along with the post as base64 and land in the same commit. Nothing is\n * written when a picture is picked.\n *\n * Field pictures (hero, social) are kept by ContentForm itself; this hook only\n * shrinks and names them. Body pictures (toolbar / paste / drop) are kept here,\n * with an object URL so the Preview tab can show them before they exist.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { imagePathFor, MediaError, resizeImage, type ImageKind } from \"../media\";\nimport type { PickResult, SubmittedImages } from \"../forms-ui\";\nimport type { ImagePayload } from \"./types\";\n\nconst HERO_WIDTH = 1600;\nconst BODY_WIDTH = 1400;\nconst SLUG_FIRST = \"Fill in the web address (slug) first — the picture is named after it.\";\n\nexport function useImages(getSlug: () => string, publicDir = \"/blog/\") {\n const dir = publicDir.replace(/\\/$/, \"\");\n const [body, setBody] = useState<Record<string, { blob: Blob; previewUrl: string }>>({});\n const urls = useRef(new Set<string>());\n useEffect(() => {\n const set = urls.current;\n return () => { for (const u of set) URL.revokeObjectURL(u); };\n }, []);\n\n const latest = useRef({ getSlug, dir });\n latest.current = { getSlug, dir };\n const slugOrThrow = () => {\n const slug = latest.current.getSlug().trim();\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) throw new MediaError(SLUG_FIRST);\n return slug;\n };\n\n /** ContentForm's onPickImage: hero and social-share fields. */\n const pickField = useCallback(async (field: string, file: File): Promise<PickResult> => {\n const slug = slugOrThrow();\n const kind: ImageKind = field === \"ogImage\" ? \"social\" : \"hero\";\n const r = await resizeImage(file, { maxWidth: HERO_WIDTH });\n return { path: imagePathFor(kind, slug, undefined, { publicDir: latest.current.dir }), blob: r.blob, width: r.width, height: r.height };\n }, []);\n\n /** MarkdownEditor's onUploadImage: pictures in the text. */\n const uploadBody = useCallback(async (file: File) => {\n const slug = slugOrThrow();\n const r = await resizeImage(file, { maxWidth: BODY_WIDTH });\n const path = imagePathFor(\"body\", slug, file.name, { publicDir: latest.current.dir });\n const previewUrl = URL.createObjectURL(r.blob);\n urls.current.add(previewUrl);\n setBody((m) => ({ ...m, [path]: { blob: r.blob, previewUrl } }));\n return { path, previewUrl };\n }, []);\n\n const previewSrc = Object.fromEntries(Object.entries(body).map(([p, v]) => [p, v.previewUrl]));\n\n /** Everything to send with the save: field pictures from the form plus body pictures still referenced in the text. */\n const toPayload = useCallback(async (fields: SubmittedImages, markdown: string): Promise<ImagePayload[]> => {\n const out: { path: string; blob: Blob }[] = Object.values(fields);\n for (const [path, v] of Object.entries(body)) if (markdown.includes(path)) out.push({ path, blob: v.blob });\n return Promise.all(out.map(async ({ path, blob }) => ({ path, base64: await toBase64(blob) })));\n }, [body]);\n\n return { pickField, uploadBody, previewSrc, toPayload };\n}\n\nfunction toBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result).split(\",\")[1] ?? \"\");\n r.onerror = () => reject(r.error);\n r.readAsDataURL(blob);\n });\n}\n","\"use client\";\n\nimport { useState, useTransition } from \"react\";\nimport { ContentForm, type ContentFormSubmission } from \"../forms-ui\";\nimport { LinkButton } from \"../shell\";\nimport { StudioTerm } from \"./term\";\nimport { publicDirOf, useEntry, useStudio } from \"./context\";\nimport { useImages } from \"./useImages\";\n\n/**\n * Client wrapper for any registered content type: ContentForm (client) →\n * publishContent (server action). The registry entry holds functions and a\n * zod schema, so it can't cross the server→client boundary — the page passes\n * the type id and this component looks the entry up on the client.\n */\nexport function ContentEditor({ typeId, initialValues, initialBody, existing = null, isNew = false, footer }: {\n typeId: string;\n initialValues?: Record<string, unknown>;\n /** A brand-new item: the web address follows the title until it's edited by hand. */\n isNew?: boolean;\n initialBody?: string;\n /** An open change for this file; saves go onto its branch (05c). */\n existing?: { number: number; branch: string; state: \"checking\" | \"ready\" | \"failed\" } | null;\n /** Rendered under the fields, above the save bar (e.g. Remove this post). */\n footer?: React.ReactNode;\n}) {\n const entry = useEntry(typeId);\n const { publishContent, previewBody } = useStudio().actions;\n const [error, setError] = useState<string | null>(null);\n const [, startTransition] = useTransition();\n // Pictures are named after the slug, read from the form at pick time (ContentForm owns the field state).\n const pictures = useImages(\n () => (document.querySelector(`form[data-realiiz-content-form=\"${typeId}\"] [name=\"slug\"]`) as HTMLInputElement | null)?.value ?? \"\",\n entry ? publicDirOf(entry) : \"/images/\",\n );\n if (!entry) return <div className=\"rz-alert\" role=\"alert\">Unknown content type “{typeId}”.</div>;\n\n const onSubmit = (s: ContentFormSubmission) =>\n new Promise<void>((resolve) => {\n startTransition(async () => {\n setError(null);\n const images = await pictures.toPayload(s.images, s.body);\n const result = await publishContent({ type: typeId, frontmatter: s.frontmatter, body: s.body, images, existing: existing ? { number: existing.number, branch: existing.branch } : null });\n // A redirect never returns; anything that does is an error.\n if (result && result.ok === false) setError(result.error);\n resolve();\n });\n });\n\n return (\n <>\n {error && <div className=\"rz-alert\" role=\"alert\">{error}</div>}\n <ContentForm\n entry={entry}\n initialValues={initialValues}\n initialBody={initialBody}\n onSubmit={onSubmit}\n submitLabel={existing ? \"Save changes\" : \"Save and continue\"}\n stickyBar\n status={existing ? `Change #${existing.number} is waiting to publish — saving updates it` : undefined}\n barExtra={existing ? <LinkButton forward href={`/admin/pr/${existing.number}`}>{existing.state === \"ready\" ? \"Review & publish\" : \"See progress\"}</LinkButton> : undefined}\n bodyLabel={entry.id === \"posts\" ? \"Post content\" : \"Description\"}\n renderPreview={previewBody}\n previewClassName=\"blog-prose\"\n termComponent=\"StudioTerm\"\n onPickImage={pictures.pickField}\n onUploadImage={pictures.uploadBody}\n previewSrc={pictures.previewSrc}\n renderLabel={(label, help) => <StudioTerm definition={help}>{label}</StudioTerm>}\n derive={isNew ? { source: \"title\", target: \"slug\" } : undefined}\n footer={footer}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useTransition } from \"react\";\nimport { Button } from \"../shell\";\nimport { useEntry, useStudio } from \"./context\";\nimport { copyFor } from \"./copy\";\n\n/**\n * Take an item down. Quiet link → inline confirm → one change that deletes the\n * file, reviewed and published like any other. Nothing disappears until Publish.\n */\nexport function RemoveItem({ typeId, slug }: { typeId: string; slug: string }) {\n const [confirm, setConfirm] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pending, start] = useTransition();\n const entry = useEntry(typeId);\n const { removeContent } = useStudio().actions;\n if (!entry) return null;\n const copy = copyFor(entry);\n\n const remove = () =>\n start(async () => {\n const r = await removeContent({ type: typeId, slug });\n if (r && r.ok === false) setError(r.error);\n });\n\n return (\n <div className=\"rz-discard\">\n {confirm ? (\n <>\n <span>{copy.removeConfirm}</span>\n <Button variant=\"danger\" size=\"sm\" disabled={pending} onClick={remove}>{pending ? \"Preparing…\" : \"Yes, remove it\"}</Button>\n <Button size=\"sm\" onClick={() => setConfirm(false)}>Keep it</Button>\n </>\n ) : (\n <button type=\"button\" className=\"rz-discard__link\" onClick={() => setConfirm(true)}>{copy.removeLink}</button>\n )}\n {error && <div className=\"rz-alert admin__alert\">{error}</div>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst POLL_MS = 8_000;\nconst LOCAL_FALLBACK_MS = 150_000;\nconst GIVE_UP_MS = 15 * 60_000;\n\nexport type DeployState = \"waiting\" | \"live\" | \"slow\";\n\n/**\n * After a publish, is the change actually on the live site yet?\n *\n * Polls /api/version until the running production build's commit is the merge\n * commit — or any commit newer than the one serving at publish time (main is\n * linear, so a later deploy contains ours). Locally there is no commit stamp,\n * so it falls back to a timer. Gives up politely after 15 minutes.\n */\nexport function useDeployed(active: boolean, mergedSha: string | null): DeployState {\n const [state, setState] = useState<DeployState>(\"waiting\");\n\n useEffect(() => {\n if (!active) return;\n let stop = false;\n let baseline: string | null | undefined; // undefined = not read yet\n const started = Date.now();\n\n const read = async (): Promise<string | null> => {\n try {\n const r = await fetch(\"/api/version\", { cache: \"no-store\" });\n const j = (await r.json()) as { sha: string | null };\n return j.sha;\n } catch {\n return null;\n }\n };\n\n const tick = async () => {\n if (stop) return;\n const sha = await read();\n if (stop) return;\n if (baseline === undefined) baseline = sha;\n const elapsed = Date.now() - started;\n const matched = sha !== null && mergedSha !== null && sha === mergedSha;\n const moved = sha !== null && baseline !== null && sha !== baseline;\n const localDone = sha === null && elapsed >= LOCAL_FALLBACK_MS;\n if (matched || moved || localDone) { setState(\"live\"); return; }\n if (elapsed >= GIVE_UP_MS) { setState(\"slow\"); return; }\n setTimeout(tick, POLL_MS);\n };\n void tick();\n return () => { stop = true; };\n }, [active, mergedSha]);\n\n return state;\n}\n","\"use client\";\n\nimport { useEffect, useState, useTransition } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport type { PullRequestStatus } from \"../git/types\";\nimport { Button, LinkButton, Steps, type StepState } from \"../shell\";\nimport type { MergeOutcome } from \"./types\";\nimport { useStudio } from \"./context\";\nimport { useDeployed } from \"./useDeployed\";\n\nconst REFRESH_MS = 10_000;\n\n/**\n * Saved → Checking → Live, as a tracker, with one sentence of plain language\n * under it and the Publish button that unlocks when the checks pass. Refreshes\n * itself while checks are pending. Copy is load-bearing (see the brief).\n */\nexport function PublishPanel({ number, htmlUrl, merged, closed = false, branch, removal = false, mergedSha = null, status, item }: {\n number: number;\n htmlUrl: string;\n merged: boolean;\n /** Closed without publishing — discarded here or on GitHub. */\n closed?: boolean;\n branch: string;\n /** The change deletes the post instead of editing it. */\n removal?: boolean;\n /** Merge commit once published; lets the page confirm the deploy rather than guess. */\n mergedSha?: string | null;\n status: PullRequestStatus | null;\n /** The item this change is about, resolved by the site page (Studio.readers.locate); null when it can't be. */\n item: { noun: string; label: string; typeId: string; slug: string; liveUrl: string | null } | null;\n}) {\n const { mergeContentPr, discardChange } = useStudio().actions;\n const router = useRouter();\n const [outcome, setOutcome] = useState<MergeOutcome | null>(merged ? { state: \"merged\", sha: \"\" } : null);\n const [pending, start] = useTransition();\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n const [discarded, setDiscarded] = useState(closed);\n const [discardError, setDiscardError] = useState<string | null>(null);\n\n const isPending = !merged && outcome === null && status?.state === \"pending\";\n useEffect(() => {\n if (!isPending) return;\n const t = setInterval(() => router.refresh(), REFRESH_MS);\n return () => clearInterval(t);\n }, [isPending, router]);\n\n const publish = () => start(async () => setOutcome(await mergeContentPr(number)));\n const discard = () =>\n start(async () => {\n const r = await discardChange(number, branch);\n if (r.state === \"discarded\") { setDiscarded(true); setConfirmDiscard(false); }\n else if (r.state === \"already-published\") setOutcome({ state: \"merged\", sha: \"\" });\n else setDiscardError(r.message);\n });\n const publicPath = item?.liveUrl ?? null;\n const liveUrl = publicPath;\n const editUrl = item ? `/admin/${item.typeId}/${item.slug}` : null;\n const noun = item?.noun ?? \"item\";\n const listUrl = item ? `/admin/${item.typeId}` : \"/admin\";\n const backLabel = item ? `Back to ${item.label}` : \"Back to the dashboard\";\n\n const live = outcome?.state === \"merged\";\n const deploy = useDeployed(live, outcome?.state === \"merged\" && outcome.sha ? outcome.sha : mergedSha);\n const onSite = live && deploy === \"live\";\n const failed = status?.state === \"red\" || outcome?.state === \"red\";\n const failing = status?.state === \"red\" ? status.failingCheck : outcome?.state === \"red\" ? outcome.failingCheck : null;\n const stale = outcome?.state === \"stale\";\n const ready = !live && !failed && !stale && status?.state === \"green\";\n // The checks ARE a full preview build of the site with this change; link straight to this post on it.\n const previewBase = status?.state === \"green\" ? status.previewUrl : undefined;\n const previewUrl = previewBase && publicPath && !removal ? `${previewBase.replace(/\\/$/, \"\")}${publicPath}` : previewBase;\n\n const checkState: StepState = live || ready ? \"done\" : failed ? \"failed\" : \"active\";\n const steps = [\n { label: \"Saved\", state: \"done\" as StepState, note: `Change #${number}` },\n { label: \"Checks\", state: checkState, note: checkState === \"active\" ? \"Usually a minute or two\" : checkState === \"failed\" ? \"Something needs fixing\" : \"Passed\" },\n { label: \"Published\", state: (live ? \"done\" : pending ? \"active\" : \"todo\") as StepState, note: live ? \"Sent to the site\" : pending ? \"Publishing…\" : \"When you're ready\" },\n {\n label: removal ? \"Removed\" : \"Live\",\n state: (onSite ? \"done\" : live ? \"active\" : \"todo\") as StepState,\n note: onSite ? (removal ? \"Off the site\" : \"On the site\") : live ? (deploy === \"slow\" ? \"Taking longer than usual\" : \"Rebuilding, about two minutes\") : \"Automatic\",\n },\n ];\n\n if (discarded) {\n return (\n <>\n <Steps steps={[{ label: \"Saved\", state: \"done\", note: `Change #${number}` }, { label: \"Discarded\", state: \"failed\", note: \"Nothing was published\" }, { label: \"Live\", state: \"todo\", note: \"Unchanged\" }]} />\n <p style={{ margin: 0 }}>This change was discarded. The live site is exactly as it was{editUrl ? `; the ${noun} still shows its published version` : \"\"}.</p>\n <div className=\"rz-actions\">\n {editUrl && <LinkButton variant=\"primary\" href={editUrl}>Open the {noun}</LinkButton>}\n <LinkButton href={listUrl}>{backLabel}</LinkButton>\n </div>\n </>\n );\n }\n\n return (\n <>\n <Steps steps={steps} />\n\n {live ? (\n onSite ? (\n <p style={{ margin: 0 }}>{removal ? `Done — the ${noun} is off the website.` : \"Done — your change is on the website now.\"}</p>\n ) : deploy === \"slow\" ? (\n <p style={{ margin: 0 }}>The site is taking longer than usual to rebuild. It will get there; check back in a few minutes.</p>\n ) : (\n <p style={{ margin: 0 }}>Published. The website is rebuilding with your change — this usually takes about two minutes. Stay here and this page will tell you the moment it's live; if you look at the site before then you'll still see the old version.</p>\n )\n ) : stale ? (\n <div className=\"rz-alert admin__alert\">Someone else changed this file first. <Link href=\"/admin\">Open it again</Link>, make your change on the latest version, and publish.</div>\n ) : failed ? (\n <div className=\"rz-alert admin__alert\">\n The site couldn't build with this change{failing ? ` (${failing})` : \"\"}. Nothing was published. Open the {noun}, fix it, and save again.\n </div>\n ) : outcome?.state === \"error\" ? (\n <div className=\"rz-alert admin__alert\">{outcome.message}</div>\n ) : ready ? (\n <p style={{ margin: 0 }}>\n {removal\n ? `Everything checks out. Publishing takes this ${noun} off the live site.`\n : previewUrl\n ? \"Everything checks out. Have a look at the preview — it's a private copy of the site with your change — then publish when you're happy.\"\n : \"Everything checks out. Publishing puts this change on the live site.\"}\n </p>\n ) : (\n <p style={{ margin: 0 }} className=\"rz-muted\">We're building a test copy of the site with your change to make sure nothing breaks. This page updates itself.</p>\n )}\n\n <div className=\"rz-actions\">\n {live ? (\n <>\n {liveUrl && !removal && (onSite\n ? <LinkButton variant=\"primary\" external href={liveUrl}>View the {noun}</LinkButton>\n : <Button variant=\"primary\" disabled title=\"Available once the site has rebuilt\">View the {noun}</Button>)}\n <LinkButton variant={removal || !liveUrl ? \"primary\" : \"secondary\"} href={listUrl}>{backLabel}</LinkButton>\n {live && !onSite && <span className=\"rz-actions__hint\">{deploy === \"slow\" ? \"Still rebuilding.\" : \"Waiting for the site to rebuild…\"}</span>}\n </>\n ) : (\n <>\n <Button variant=\"primary\" disabled={pending || !ready} onClick={publish}>\n {pending ? \"Publishing…\" : \"Publish\"}\n </Button>\n {previewUrl && ready && <LinkButton external href={previewUrl}>Preview the change</LinkButton>}\n {editUrl && !removal && <LinkButton href={editUrl}>Keep editing</LinkButton>}\n <LinkButton href={htmlUrl} external>View on GitHub</LinkButton>\n {!ready && !failed && !stale && <span className=\"rz-actions__hint\">Publish unlocks when the checks pass.</span>}\n </>\n )}\n </div>\n\n {!live && (\n <div className=\"rz-discard\">\n {confirmDiscard ? (\n <>\n <span>{removal ? `Cancel the removal and keep the ${noun} on the website?` : `Throw away the unpublished changes to this ${noun}? The live site isn't affected. This can't be undone.`}</span>\n <Button variant=\"danger\" size=\"sm\" disabled={pending} onClick={discard}>{pending ? \"Discarding…\" : \"Yes, discard\"}</Button>\n <Button size=\"sm\" onClick={() => setConfirmDiscard(false)}>Keep it</Button>\n </>\n ) : (\n <button type=\"button\" className=\"rz-discard__link\" onClick={() => setConfirmDiscard(true)}>{removal ? \"Cancel this removal\" : \"Discard this change\"}</button>\n )}\n {discardError && <div className=\"rz-alert admin__alert\">{discardError}</div>}\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\n/**\n * Show/hide the slug line under each title in a content list. Remembered per\n * browser and per content type. `SlugVisibility` wraps the (server-rendered) table and stamps\n * data-slugs on it; `SlugToggle` sits in the column header. CSS does the rest.\n * localStorage is read through useSyncExternalStore so the server render and\n * first client paint agree (\"on\"), then the stored choice applies.\n */\n\nimport { useSyncExternalStore, type ReactNode } from \"react\";\n\nconst keyFor = (typeId: string) => `rz-${typeId}-slugs`;\nconst EVENT = \"rz-slugs-change\";\n\nfunction read(typeId: string): boolean {\n try { return window.localStorage.getItem(keyFor(typeId)) !== \"off\"; } catch { return true; }\n}\nfunction subscribe(cb: () => void) {\n window.addEventListener(EVENT, cb);\n window.addEventListener(\"storage\", cb);\n return () => { window.removeEventListener(EVENT, cb); window.removeEventListener(\"storage\", cb); };\n}\nfunction useSlugsOn(typeId: string): boolean {\n return useSyncExternalStore(subscribe, () => read(typeId), () => true);\n}\nfunction setSlugsOn(typeId: string, next: boolean) {\n try { window.localStorage.setItem(keyFor(typeId), next ? \"on\" : \"off\"); } catch { /* ignore */ }\n window.dispatchEvent(new Event(EVENT));\n}\n\nexport function SlugVisibility({ typeId, children }: { typeId: string; children: ReactNode }) {\n const on = useSlugsOn(typeId);\n return <div data-slugs={on ? \"on\" : \"off\"}>{children}</div>;\n}\n\nexport function SlugToggle({ typeId }: { typeId: string }) {\n const on = useSlugsOn(typeId);\n return (\n <label className=\"rz-switch\">\n <span className=\"rz-switch__label\">Show web addresses</span>\n <input type=\"checkbox\" role=\"switch\" checked={on} onChange={(e) => setSlugsOn(typeId, e.target.checked)} />\n <span className=\"rz-switch__track\" aria-hidden=\"true\"><span className=\"rz-switch__thumb\" /></span>\n </label>\n );\n}\n","\"use client\";\n\n/**\n * Small shared pieces for the Account tabs: a labelled field, a form card\n * with its own Save, an inline result line, and a base64 helper for pictures.\n * Styled by .acct-* rules in admin.css using the shell's tokens.\n */\n\nimport { useEffect, useRef, useState, type FormEvent, type ReactNode } from \"react\";\nimport { Button } from \"../../shell\";\nimport type { ActionResult } from \"../types\";\n\nexport function Field({ id, label, hint, children }: { id: string; label: string; hint?: string; children: ReactNode }) {\n return (\n <div className=\"acct-field\">\n <label htmlFor={id} className=\"acct-label\">{label}</label>\n {children}\n {hint && <div className=\"acct-hint\">{hint}</div>}\n </div>\n );\n}\n\nexport function Result({ r }: { r: ActionResult | null }) {\n if (!r) return null;\n return r.ok\n ? <div className=\"acct-ok\" role=\"status\">{r.message ?? \"Saved.\"}</div>\n : <div className=\"rz-alert admin__alert\" role=\"alert\">{r.error}</div>;\n}\n\n/** A card with a title, a sentence, the fields, and one Save button that runs `action`. */\nexport function FormCard({ title, blurb, children, action, saveLabel = \"Save\", disabled }: {\n title: string;\n blurb?: ReactNode;\n children: ReactNode;\n action: () => Promise<ActionResult>;\n saveLabel?: string;\n disabled?: boolean;\n}) {\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<ActionResult | null>(null);\n const submit = async (e: FormEvent) => {\n e.preventDefault();\n if (busy) return;\n setBusy(true);\n setResult(null);\n try {\n setResult(await action());\n } catch (err) {\n setResult({ ok: false, error: err instanceof Error ? err.message : \"Something went wrong. Try again.\" });\n } finally {\n setBusy(false);\n }\n };\n return (\n <form className=\"rz-card acct-card\" onSubmit={submit} noValidate>\n <h2 className=\"acct-title\">{title}</h2>\n {blurb && <p className=\"acct-blurb\">{blurb}</p>}\n {children}\n <div className=\"acct-actions\">\n <Button type=\"submit\" variant=\"primary\" disabled={busy || disabled}>{busy ? `${saveLabel}…` : saveLabel}</Button>\n <Result r={result} />\n </div>\n </form>\n );\n}\n\nexport function toBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result).split(\",\")[1] ?? \"\");\n r.onerror = () => reject(r.error);\n r.readAsDataURL(blob);\n });\n}\n\n/** A password box with the show/hide eye on the right. Masked by default. */\nexport function PasswordInput({ id, value, onChange, autoComplete }: { id: string; value: string; onChange: (v: string) => void; autoComplete: string }) {\n const [show, setShow] = useState(false);\n return (\n <div className=\"acct-pw\">\n <input id={id} className=\"acct-input\" type={show ? \"text\" : \"password\"} value={value} onChange={(e) => onChange(e.target.value)} autoComplete={autoComplete} spellCheck={false} />\n <button type=\"button\" className=\"acct-pw__eye\" onClick={() => setShow((s) => !s)} aria-label={show ? \"Hide password\" : \"Show password\"} aria-pressed={show}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {show ? (\n <><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>\n ) : (\n <><path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" /><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" /></>\n )}\n </svg>\n </button>\n </div>\n );\n}\n\n/** \"(555) 123-4567\" as you type — US/CA numbers; a leading 1 is dropped. Anything past 10 digits is ignored. */\nexport function formatPhone(raw: string): string {\n let d = raw.replace(/\\D/g, \"\");\n if (d.length === 11 && d.startsWith(\"1\")) d = d.slice(1);\n d = d.slice(0, 10);\n if (d.length === 0) return \"\";\n if (d.length < 4) return `(${d}`;\n if (d.length < 7) return `(${d.slice(0, 3)}) ${d.slice(3)}`;\n return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;\n}\n\n/** A small branded dropdown (button + shell-styled menu) for picking one of a few options. */\nexport function Dropdown<T extends string>({ value, options, onChange, disabled, label }: {\n value: T;\n options: { value: T; label: string; hint?: string }[];\n onChange: (v: T) => void;\n disabled?: boolean;\n label: string;\n}) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => { if (!wrap.current?.contains(e.target as Node)) setOpen(false); };\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") setOpen(false); };\n document.addEventListener(\"mousedown\", onDoc);\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onDoc); document.removeEventListener(\"keydown\", onKey); };\n }, [open]);\n const current = options.find((o) => o.value === value);\n return (\n <div ref={wrap} className=\"acct-dd\">\n <button type=\"button\" className=\"acct-dd__btn\" aria-haspopup=\"listbox\" aria-expanded={open} aria-label={label} disabled={disabled} onClick={() => setOpen((v) => !v)}>\n {current?.label ?? value}\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\" /></svg>\n </button>\n {open && (\n <div className=\"rz-menu acct-dd__menu\" role=\"listbox\" aria-label={label}>\n {options.map((o) => (\n <button key={o.value} type=\"button\" role=\"option\" aria-selected={o.value === value} className=\"rz-menu__item acct-dd__item\" onClick={() => { setOpen(false); if (o.value !== value) onChange(o.value); }}>\n <span className=\"acct-dd__check\" aria-hidden=\"true\">{o.value === value ? \"✓\" : \"\"}</span>\n <span className=\"acct-dd__text\">\n <span>{o.label}</span>\n {o.hint && <span className=\"acct-dd__hint\">{o.hint}</span>}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * A second way in (05b): email + password, revealed under the magic-link\n * form. Magic links stay the default — this is for people who set a password\n * on the Account page and are somewhere without their inbox.\n */\n\nimport { useMemo, useState, type FormEvent } from \"react\";\nimport { createBrowserClient } from \"@supabase/ssr\";\nimport { Button } from \"../shell\";\nimport { PasswordInput } from \"./account/ui\";\n\nexport function PasswordSignIn({ url, anonKey, next = \"/admin\" }: { url: string; anonKey: string; next?: string }) {\n const supabase = useMemo(() => createBrowserClient(url, anonKey), [url, anonKey]);\n const [open, setOpen] = useState(false);\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (e: FormEvent) => {\n e.preventDefault();\n if (busy) return;\n setBusy(true);\n setError(null);\n const { error } = await supabase.auth.signInWithPassword({ email: email.trim().toLowerCase(), password });\n if (error) {\n setError(/invalid/i.test(error.message) ? \"That email and password don’t match. Try again, or use an email link instead.\" : error.message);\n setBusy(false);\n return;\n }\n window.location.assign(next);\n };\n\n if (!open) {\n return (\n <p className=\"pwsi-toggle\">\n <button type=\"button\" className=\"acct-link\" onClick={() => setOpen(true)}>Have a password? Sign in with it instead</button>\n </p>\n );\n }\n\n return (\n <form className=\"pwsi\" onSubmit={submit} noValidate>\n <h2 className=\"acct-title\">Sign in with a password</h2>\n <p className=\"acct-blurb\">Forgotten it? Sign in with an email link and set a new one under Settings → Change Password.</p>\n <div className=\"acct-field\">\n <label htmlFor=\"pwsi-email\" className=\"acct-label\">Email address</label>\n <input id=\"pwsi-email\" className=\"acct-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} autoComplete=\"username\" required />\n </div>\n <div className=\"acct-field\">\n <label htmlFor=\"pwsi-password\" className=\"acct-label\">Password</label>\n <PasswordInput id=\"pwsi-password\" value={password} onChange={setPassword} autoComplete=\"current-password\" />\n </div>\n {error && <div className=\"rz-alert admin__alert\" role=\"alert\">{error}</div>}\n <div className=\"acct-actions\">\n <Button type=\"submit\" variant=\"primary\" disabled={busy}>{busy ? \"Signing in…\" : \"Sign in\"}</Button>\n <button type=\"button\" className=\"acct-link\" onClick={() => setOpen(false)}>Forgot it? Use an email link instead</button>\n </div>\n </form>\n );\n}\n","\"use client\";\n\n/**\n * Where an invitation email lands (05b). Supabase delivers an invite as tokens\n * in the URL HASH (implicit flow — the invitee's browser has no PKCE verifier),\n * which no server route can read. So this runs in the browser: take the tokens\n * from the hash, set the session (cookies), and go to /admin. A ?code= (PKCE)\n * is handed to the normal callback route instead.\n */\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { createBrowserClient } from \"@supabase/ssr\";\n\nexport function AcceptInvite({ url, anonKey }: { url: string; anonKey: string }) {\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const run = async () => {\n const search = new URLSearchParams(window.location.search);\n const code = search.get(\"code\");\n if (code) { window.location.replace(`/admin/auth/callback?code=${encodeURIComponent(code)}&next=/admin/account`); return; }\n\n const hash = new URLSearchParams(window.location.hash.replace(/^#/, \"\"));\n const access_token = hash.get(\"access_token\");\n const refresh_token = hash.get(\"refresh_token\");\n const described = hash.get(\"error_description\");\n if (described) { setError(described.replace(/\\+/g, \" \")); return; }\n if (!access_token || !refresh_token) { setError(\"This invitation link is incomplete or has already been used. Ask for a new one.\"); return; }\n\n const supabase = createBrowserClient(url, anonKey);\n const { error } = await supabase.auth.setSession({ access_token, refresh_token });\n if (error) { setError(error.message); return; }\n // Drop the tokens from the address bar before moving on.\n window.history.replaceState(null, \"\", window.location.pathname);\n window.location.replace(\"/admin/account\");\n };\n void run();\n }, [url, anonKey]);\n\n if (error) {\n return (\n <div className=\"rz-alert admin__alert\" role=\"alert\">\n {error} <Link href=\"/admin/sign-in\">Sign in with an email link instead.</Link>\n </div>\n );\n }\n return <p className=\"rz-muted\" role=\"status\">Setting up your access…</p>;\n}\n","\"use client\";\n\n/**\n * The page bodies. Each takes serialisable props a site page loaded with\n * Studio.readers and renders the same thing realiiz-website did in-repo.\n * Registry and actions come from <StudioProvider>.\n */\n\nimport Link from \"next/link\";\nimport { Card, EmptyState, LinkButton, OutboundArrow, PageHeader, StatusPill } from \"../shell\";\nimport { MagicLinkForm } from \"../auth-ui\";\nimport { useEntry, useStudio } from \"./context\";\nimport { Jargon } from \"./term\";\nimport { copyFor } from \"./copy\";\nimport { ContentEditor } from \"./ContentEditor\";\nimport { RemoveItem } from \"./RemoveItem\";\nimport { PublishPanel } from \"./PublishPanel\";\nimport { SlugToggle, SlugVisibility } from \"./SlugToggle\";\nimport { PasswordSignIn } from \"./PasswordSignIn\";\nimport { AcceptInvite } from \"./AcceptInvite\";\nimport type { ListRow, PendingSummary, PullRequestStatus } from \"./types\";\n\nconst pendingText = (p: NonNullable<ListRow[\"pending\"]>) =>\n p.removal ? (p.state === \"ready\" ? \"Removal ready\" : p.state === \"failed\" ? \"Removal needs fixing\" : \"Removing…\")\n : p.state === \"ready\" ? \"Ready to publish\" : p.state === \"failed\" ? \"Needs fixing\" : \"Checking…\";\n\nconst pendingLabel: Record<PendingSummary[\"state\"], string> = { checking: \"Checking…\", ready: \"Ready to publish\", failed: \"Needs fixing\" };\n\n/** Home: one card per content type. `cards` is [{ typeId, count, waiting }] in registry order. */\nexport function StudioDashboard({ greeting, cards }: { greeting: string; cards: { typeId: string; count: number; waiting: number }[] }) {\n const { contentTypes, siteName } = useStudio();\n return (\n <>\n <PageHeader eyebrow={siteName} title={`Welcome back, ${greeting}`} subtitle={<>Nothing goes live by accident: every edit is saved and <Jargon term=\"pullRequest\">checked first</Jargon>, then you press Publish.</>} />\n {cards.length === 0 ? (\n <EmptyState title=\"No content types yet\">Content types are defined in <code>src/lib/admin/content-types.ts</code>.</EmptyState>\n ) : (\n <div className=\"rz-grid\">\n {cards.map((c) => {\n const e = contentTypes[c.typeId];\n if (!e) return null;\n return (\n <Card\n key={e.id}\n title={e.label}\n meta={<>{c.count} {c.count === 1 ? \"item\" : \"items\"} · {e.folder}</>}\n note={c.waiting > 0 && <Link href={`/admin/${e.id}`} className=\"rz-status-link\"><StatusPill tone=\"warn\">{c.waiting} {c.waiting === 1 ? \"change\" : \"changes\"} waiting</StatusPill></Link>}\n actions={<><LinkButton variant=\"primary\" href={`/admin/${e.id}/new`}>New</LinkButton><LinkButton variant=\"secondary\" href={`/admin/${e.id}`}>Open</LinkButton></>}\n />\n );\n })}\n </div>\n )}\n </>\n );\n}\n\nexport function StudioList({ typeId, items }: { typeId: string; items: ListRow[] }) {\n const entry = useEntry(typeId);\n if (!entry) return null;\n const copy = copyFor(entry);\n const dateHeading = entry.id === \"posts\" ? \"Published\" : \"Date\";\n return (\n <>\n <PageHeader\n eyebrow={entry.folder}\n title={entry.label}\n subtitle={<>Everything in this list comes straight from <Jargon term=\"repository\">where the site is stored</Jargon> — including anything added outside Studio.</>}\n actions={<LinkButton variant=\"primary\" href={`/admin/${entry.id}/new`}>{copy.newItem}</LinkButton>}\n />\n {items.length === 0 ? (\n <EmptyState title={copy.empty} action={<LinkButton variant=\"primary\" href={`/admin/${entry.id}/new`}>{copy.first}</LinkButton>} />\n ) : (\n <SlugVisibility typeId={entry.id}>\n <div className=\"rz-toolbar\"><SlugToggle typeId={entry.id} /></div>\n <div className=\"rz-table-wrap\">\n <table className=\"rz-table rz-table--posts\">\n <colgroup><col className=\"rz-col-title\" /><col className=\"rz-col-date\" /><col className=\"rz-col-status\" /><col className=\"rz-col-actions\" /></colgroup>\n <thead><tr><th>{entry.singular ?? entry.label}</th><th className=\"rz-fit\">{dateHeading}</th><th className=\"rz-fit\">Status</th><th className=\"rz-fit\"></th></tr></thead>\n <tbody>\n {items.map((p) => (\n <tr key={p.slug}>\n <td className=\"rz-title-cell\">\n {p.isNew || !p.liveUrl ? (\n <span className=\"rz-title-text\" title={p.title}>{p.title}</span>\n ) : (\n <a href={p.liveUrl} target=\"_blank\" rel=\"noreferrer\" className=\"rz-title-link\" title={`${p.title} — opens the live page in a new tab`}>\n <span className=\"rz-title-text\">{p.title}</span><OutboundArrow />\n </a>\n )}\n <div className=\"rz-muted rz-title-text rz-slug\" title={p.liveUrl ?? p.slug}>{p.liveUrl ?? p.slug}</div>\n {p.needsAttention && <div style={{ marginTop: 4 }}><StatusPill tone=\"warn\">Needs attention</StatusPill></div>}\n </td>\n <td className=\"rz-muted rz-fit\">{p.date ? p.date.slice(0, 10) : \"—\"}</td>\n <td className=\"rz-fit\">\n {p.pending ? (\n <Link href={`/admin/pr/${p.pending.number}`} className=\"rz-status-link\" title={p.isNew ? \"Not on the live site yet\" : \"An unpublished change is waiting\"}>\n <StatusPill tone={p.pending.state === \"ready\" ? \"up\" : p.pending.state === \"failed\" ? \"down\" : \"warn\"}>{p.isNew ? `New · ${pendingText(p.pending)}` : pendingText(p.pending)}</StatusPill>\n </Link>\n ) : <StatusPill tone=\"up\">Live</StatusPill>}\n </td>\n <td className=\"rz-fit\">\n <Link href={`/admin/${entry.id}/${p.slug}`}>Edit</Link>\n {p.pending && <> · <Link href={`/admin/pr/${p.pending.number}`}>{p.pending.state === \"ready\" ? \"Publish\" : \"Review\"}</Link></>}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SlugVisibility>\n )}\n </>\n );\n}\n\nexport function StudioNew({ typeId, initialValues }: { typeId: string; initialValues: Record<string, unknown> }) {\n const entry = useEntry(typeId);\n if (!entry) return null;\n const copy = copyFor(entry);\n return (\n <>\n <PageHeader eyebrow={entry.label} title={copy.newItem} subtitle={copy.newSubtitle} />\n <ContentEditor typeId={entry.id} isNew initialValues={initialValues} />\n </>\n );\n}\n\nexport function StudioEdit({ typeId, slug, frontmatter, body, pending }: {\n typeId: string; slug: string; frontmatter: Record<string, unknown>; body: string; pending: PendingSummary | null;\n}) {\n const entry = useEntry(typeId);\n if (!entry) return null;\n const copy = copyFor(entry);\n return (\n <>\n <PageHeader\n eyebrow={entry.label}\n title={String(frontmatter.title ?? slug)}\n subtitle={pending\n ? <>You're picking up an edit you haven't published yet. Save again and it stays as one <Jargon term=\"change\">change</Jargon>.</>\n : <>Saving doesn't touch the live site. Your edit is <Jargon term=\"checks\">checked first</Jargon>, then you decide when to <Jargon term=\"publish\">publish</Jargon>.</>}\n />\n {pending && (\n <div className=\"rz-notice\" role=\"status\">\n <span className=\"rz-notice__text\">\n <StatusPill tone={pending.state === \"ready\" ? \"up\" : pending.state === \"failed\" ? \"down\" : \"warn\"}>{pendingLabel[pending.state]}</StatusPill>\n <span>\n <strong>{pending.removal ? \"Removal\" : \"Unpublished change\"} #{pending.number}</strong>\n {pending.removal\n ? (pending.state === \"ready\" ? \" — ready to publish; it stays on the site until you do.\" : pending.state === \"failed\" ? ` — ${pending.failingCheck ?? \"something needs fixing\"}` : \" — we're checking it now.\")\n : (pending.state === \"failed\" && pending.failingCheck ? ` — ${pending.failingCheck}` : pending.state === \"ready\" ? \" — checks passed, nothing is live until you publish.\" : \" — we're checking it now.\")}\n </span>\n </span>\n <LinkButton variant=\"primary\" size=\"sm\" forward href={`/admin/pr/${pending.number}`}>{pending.removal ? \"Review removal\" : pending.state === \"ready\" ? \"Review & publish\" : \"See progress\"}</LinkButton>\n </div>\n )}\n {pending?.removal ? (\n <p className=\"rz-muted\">{copy.removing}</p>\n ) : (\n <ContentEditor\n typeId={entry.id}\n initialValues={frontmatter}\n initialBody={body}\n existing={pending ? { number: pending.number, branch: pending.branch, state: pending.state } : null}\n footer={!pending ? <RemoveItem typeId={entry.id} slug={slug} /> : undefined}\n />\n )}\n </>\n );\n}\n\nexport function StudioPullRequest({ pr, status, item }: {\n pr: { number: number; title: string; html_url: string; merged: boolean; state: \"open\" | \"closed\"; branch: string; removal: boolean; mergeCommitSha: string | null };\n status: PullRequestStatus | null;\n item: { noun: string; label: string; typeId: string; slug: string; liveUrl: string | null } | null;\n}) {\n return (\n <>\n <PageHeader\n eyebrow={pr.removal ? (pr.merged ? \"Removed\" : \"Removing\") : pr.merged ? \"Published\" : \"Publishing\"}\n title={pr.title.replace(/^(Publish|Remove):\\s*/, \"\")}\n subtitle={item ? `Changes to ${item.liveUrl ?? `${item.label} · ${item.slug}`}` : undefined}\n />\n <Card className=\"rz-card--narrow\">\n <PublishPanel number={pr.number} htmlUrl={pr.html_url} merged={pr.merged} closed={pr.state === \"closed\" && !pr.merged} branch={pr.branch} removal={pr.removal} mergedSha={pr.mergeCommitSha} status={status} item={item} />\n </Card>\n </>\n );\n}\n\nexport function StudioHelp() {\n return (\n <>\n <PageHeader eyebrow=\"Help\" title=\"Help centre\" subtitle=\"Everything about running your website from Studio, in plain English.\" />\n <Card className=\"rz-card--narrow\">\n <p style={{ marginTop: 0 }}>\n The full guide is on its way. In the meantime the <b>Ask</b> bubble in the bottom-right corner knows how Studio works — ask it anything, from\n “what does Publish do?” to “how do I add a picture?”.\n </p>\n <p style={{ marginBottom: 4 }}>Coming here soon:</p>\n <ul className=\"acct-help-list\">\n <li>Writing and editing a blog post — every field explained</li>\n <li>Pictures: choosing, sizing and where they go</li>\n <li>Save, checks, preview and Publish — the whole journey</li>\n <li>Fixing a change that “needs fixing”, discarding, removing a post</li>\n <li>Your account, your team and putting your own name on Studio</li>\n </ul>\n </Card>\n </>\n );\n}\n\nexport function StudioSignIn({ url, anonKey, redirectTo, siteName, error }: { url: string; anonKey: string; redirectTo: string; siteName: string; error?: string | null }) {\n return (\n <div className=\"rz-card\" style={{ maxWidth: 440, margin: \"40px auto\" }}>\n {error === \"link\" && (\n <div className=\"rz-alert admin__alert\" role=\"alert\">\n That sign-in link didn't work — it may have expired or been used already. Request a new one below.\n </div>\n )}\n <MagicLinkForm url={url} anonKey={anonKey} redirectTo={redirectTo} siteName={`${siteName} Studio`} />\n <PasswordSignIn url={url} anonKey={anonKey} />\n </div>\n );\n}\n\nexport function StudioAcceptInvite({ url, anonKey }: { url: string; anonKey: string }) {\n return (\n <div className=\"rz-card\" style={{ maxWidth: 440, margin: \"40px auto\" }}>\n <h1 className=\"acct-h1\">Welcome to Studio</h1>\n <AcceptInvite url={url} anonKey={anonKey} />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * The same dashed drop zone as the post form's picture fields: choose, drag\n * or paste a picture; once set, a thumbnail with Replace / Remove. Choosing a file shrinks it in the\n * browser and saves straight away — no separate Save step for pictures.\n */\n\nimport { useRef, useState } from \"react\";\nimport { resizeImage } from \"../../media\";\nimport { Button } from \"../../shell\";\nimport type { ActionResult } from \"../types\";\nimport { toBase64 } from \"./ui\";\n\nexport function PictureUploader({ kind, shape, currentUrl, fallback, maxWidth, hint, onUpload, onRemove, onChanged }: {\n /** The noun in the buttons: \"photo\", \"logo\", \"favicon\". */\n kind: string;\n shape: \"circle\" | \"square\";\n currentUrl: string | null;\n /** Shown in the preview when there is no picture (initials, or an icon). */\n fallback: React.ReactNode;\n maxWidth: number;\n hint: string;\n onUpload: (base64: string) => Promise<ActionResult>;\n onRemove: () => Promise<ActionResult>;\n onChanged?: () => void;\n}) {\n const input = useRef<HTMLInputElement>(null);\n const [url, setUrl] = useState<string | null>(currentUrl);\n const [busy, setBusy] = useState(false);\n const [note, setNote] = useState<{ ok: boolean; text: string } | null>(null);\n const [over, setOver] = useState(false);\n\n const choose = async (file: File | undefined) => {\n if (!file || busy) return;\n setBusy(true);\n setNote(null);\n try {\n const r = await resizeImage(file, { maxWidth, maxBytes: 300 * 1024 });\n const preview = URL.createObjectURL(r.blob);\n const res = await onUpload(await toBase64(r.blob));\n if (res.ok) { setUrl(preview); setNote({ ok: true, text: res.message ?? \"Saved.\" }); onChanged?.(); }\n else setNote({ ok: false, text: res.error });\n } catch (err) {\n setNote({ ok: false, text: err instanceof Error ? err.message : \"That picture couldn’t be prepared. Try a different file.\" });\n } finally {\n setBusy(false);\n if (input.current) input.current.value = \"\";\n }\n };\n\n const remove = async () => {\n if (busy) return;\n setBusy(true);\n setNote(null);\n const res = await onRemove();\n if (res.ok) { setUrl(null); setNote({ ok: true, text: res.message ?? \"Removed.\" }); onChanged?.(); }\n else setNote({ ok: false, text: res.error });\n setBusy(false);\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setOver(false);\n void choose(e.dataTransfer.files?.[0]);\n };\n const onPaste = (e: React.ClipboardEvent) => {\n const f = Array.from(e.clipboardData.files ?? [])[0];\n if (f) { e.preventDefault(); void choose(f); }\n };\n\n const zoneCls = [\"acct-pic\", over && \"acct-pic--over\", busy && \"acct-pic--busy\"].filter(Boolean).join(\" \");\n const thumbCls = shape === \"circle\" ? \"acct-pic__thumb acct-pic__thumb--circle\" : \"acct-pic__thumb\";\n\n return (\n <div\n className={zoneCls}\n data-testid={`${kind}-zone`}\n onDragOver={(e) => { e.preventDefault(); setOver(true); }}\n onDragLeave={() => setOver(false)}\n onDrop={onDrop}\n onPaste={onPaste}\n tabIndex={0}\n >\n <input ref={input} type=\"file\" accept=\"image/jpeg,image/png,image/webp\" className=\"acct-pic__file\" onChange={(e) => void choose(e.target.files?.[0])} tabIndex={-1} aria-hidden=\"true\" />\n {url ? (\n <div className=\"acct-pic__has\">\n <img src={url} alt=\"\" className={thumbCls} data-testid={`${kind}-preview`} />\n <div className=\"acct-pic__meta\">\n <div className=\"acct-pic__actions\">\n <Button onClick={() => input.current?.click()} disabled={busy}>{busy ? \"Uploading…\" : \"Replace\"}</Button>\n <button type=\"button\" className=\"acct-pic__remove\" onClick={remove} disabled={busy}>Remove</button>\n </div>\n <p className=\"acct-pic__hint\">{hint}</p>\n </div>\n </div>\n ) : (\n <>\n <div className=\"acct-pic__empty\">\n <span className={shape === \"circle\" ? \"acct-pic__fallback acct-pic__fallback--circle\" : \"acct-pic__fallback\"} aria-hidden=\"true\">{fallback}</span>\n <Button onClick={() => input.current?.click()} disabled={busy}>{busy ? \"Uploading…\" : \"Choose a picture\"}</Button>\n <span className=\"acct-pic__or\">or drag one here</span>\n </div>\n <p className=\"acct-pic__hint\">{hint}</p>\n </>\n )}\n {note && <p className={note.ok ? \"acct-ok acct-pic__note\" : \"acct-pic__error\"} role={note.ok ? \"status\" : \"alert\"}>{note.text}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { useStudio } from \"../context\";\nimport { Field, FormCard } from \"./ui\";\nimport { PictureUploader } from \"./PictureUploader\";\n\nfunction initialsOf(name: string | null, email: string): string {\n const parts = (name ?? \"\").trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (email[0] ?? \"?\").toUpperCase();\n}\n\n/** My Profile — photo (saves on choose), then name. Email is shown, not editable (it is the login). */\nexport function ProfileTab({ email, name, displayName, avatarUrl }: { email: string; name: string | null; displayName: string | null; avatarUrl: string | null }) {\n const router = useRouter();\n const { saveAvatar, saveProfile } = useStudio().actions;\n const { supportName } = useStudio();\n const [fullName, setFullName] = useState(name ?? \"\");\n // Stored blank when it matches the full name, so changing the name later carries the byline with it.\n const [byline, setByline] = useState(displayName && displayName !== name ? displayName : \"\");\n\n return (\n <div className=\"acct-stack\">\n <section className=\"rz-card acct-card\">\n <h2 className=\"acct-title\">Avatar</h2>\n <PictureUploader\n kind=\"photo\"\n shape=\"circle\"\n currentUrl={avatarUrl}\n fallback={initialsOf(name, email)}\n maxWidth={256}\n hint=\"Square works best. JPG, PNG or WebP.\"\n onUpload={(base64) => saveAvatar({ base64 })}\n onRemove={() => saveAvatar(null)}\n onChanged={() => router.refresh()}\n />\n </section>\n\n <FormCard\n title=\"Your name\"\n blurb=\"How you're greeted in Studio and how teammates see you.\"\n action={async () => { const r = await saveProfile({ name: fullName, displayName: byline }); if (r.ok) router.refresh(); return r; }}\n >\n <Field id=\"acct-name\" label=\"Full name\">\n <input id=\"acct-name\" className=\"acct-input\" value={fullName} onChange={(e) => setFullName(e.target.value)} maxLength={80} autoComplete=\"name\" />\n </Field>\n <Field id=\"acct-byline\" label=\"Name on blog posts\" hint=\"How your name appears as the author of a post. Leave blank to use your full name.\">\n <input id=\"acct-byline\" className=\"acct-input\" value={byline} onChange={(e) => setByline(e.target.value)} maxLength={80} placeholder={fullName || \"e.g. E. Bordi\"} />\n </Field>\n <Field id=\"acct-email\" label=\"Email\" hint={`This is your login. Ask ${supportName} if it needs to change.`}>\n <input id=\"acct-email\" className=\"acct-input\" value={email} readOnly />\n </Field>\n </FormCard>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useStudio } from \"../context\";\nimport { Field, FormCard, PasswordInput } from \"./ui\";\n\n/** Same rules the tracker shows, with Studio's 10-character minimum (the package enforces it server-side too). */\nconst RULES: { id: string; label: string; test: (pw: string, confirm: string) => boolean }[] = [\n { id: \"length\", label: \"At least 10 characters\", test: (pw) => pw.length >= 10 },\n { id: \"case\", label: \"Uppercase and lowercase letters\", test: (pw) => /[A-Z]/.test(pw) && /[a-z]/.test(pw) },\n { id: \"number\", label: \"At least one number\", test: (pw) => /[0-9]/.test(pw) },\n { id: \"special\", label: \"At least one special character (e.g. !@#$)\", test: (pw) => /[^A-Za-z0-9]/.test(pw) },\n { id: \"match\", label: \"Passwords match\", test: (pw, confirm) => pw === confirm },\n];\n\n/** Change Password — optional; email links keep working alongside it. */\nexport function PasswordTab() {\n const { changePassword } = useStudio().actions;\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n // Everything reads as unmet until they start typing, so \"match\" isn't green on two empty boxes.\n const met = (r: (typeof RULES)[number]) => password.length > 0 && r.test(password, confirm);\n const allMet = RULES.every(met);\n\n return (\n <div className=\"acct-stack\">\n <FormCard\n title=\"Set a password\"\n blurb=\"Email links always work. A password is a second way in, handy when you're somewhere without your inbox.\"\n saveLabel=\"Update password\"\n disabled={!allMet}\n action={async () => {\n const r = await changePassword({ password, confirm });\n if (r.ok) { setPassword(\"\"); setConfirm(\"\"); }\n return r;\n }}\n >\n <Field id=\"acct-pw\" label=\"New password\">\n <PasswordInput id=\"acct-pw\" value={password} onChange={setPassword} autoComplete=\"new-password\" />\n </Field>\n <Field id=\"acct-pw2\" label=\"Confirm new password\">\n <PasswordInput id=\"acct-pw2\" value={confirm} onChange={setConfirm} autoComplete=\"new-password\" />\n </Field>\n <ul className=\"acct-rules\" aria-label=\"Password requirements\">\n {RULES.map((r) => {\n const ok = met(r);\n return (\n <li key={r.id} className={ok ? \"acct-rule acct-rule--met\" : \"acct-rule\"} data-met={ok}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n {ok ? (\n <><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"var(--signal)\" /><path d=\"M7 12.5l3.2 3.2L17 9\" fill=\"none\" stroke=\"#fff\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></>\n ) : (\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"var(--text-muted)\" strokeWidth=\"2\" />\n )}\n </svg>\n {r.label}\n </li>\n );\n })}\n </ul>\n </FormCard>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useTransition, type FormEvent } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport type { SiteMember } from \"../../auth/index\";\nimport { Button, EmptyState, StatusPill } from \"../../shell\";\nimport type { ActionResult } from \"../types\";\nimport { Dropdown, Result } from \"./ui\";\nimport { useStudio } from \"../context\";\n\nfunction initials(m: SiteMember): string {\n const parts = (m.name ?? \"\").trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (m.email[0] ?? \"?\").toUpperCase();\n}\n\n/** Team — who can sign in to this site. Owners and staff only. */\nexport function TeamTab({ members, canInvite, myUserId, myRole }: { members: SiteMember[]; canInvite: boolean; myUserId: string; myRole: string }) {\n const router = useRouter();\n const { changeRole, invite, remove, resend } = useStudio().actions;\n const { supportName } = useStudio();\n const [pending, start] = useTransition();\n const [result, setResult] = useState<ActionResult | null>(null);\n const [inviting, setInviting] = useState(false);\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<\"owner\" | \"editor\">(\"editor\");\n const [confirmRemove, setConfirmRemove] = useState<string | null>(null);\n\n const run = (fn: () => Promise<ActionResult>) =>\n start(async () => {\n setResult(null);\n const r = await fn();\n setResult(r);\n if (r.ok) router.refresh();\n });\n\n const sendInvite = (e: FormEvent) => {\n e.preventDefault();\n run(async () => {\n const r = await invite({ email, role });\n if (r.ok) { setEmail(\"\"); setInviting(false); }\n return r;\n });\n };\n\n return (\n <div className=\"acct-stack\">\n {!canInvite && <div className=\"rz-alert admin__alert\">Inviting people isn’t set up on this deployment yet.</div>}\n\n <div className=\"acct-team-head\">\n <p className=\"acct-blurb\" style={{ margin: 0 }}>\n Everyone here can sign in and publish. <b>Owners</b> can also manage this list and the business details; <b>editors</b> just write and publish.\n </p>\n <Button variant=\"primary\" onClick={() => setInviting((v) => !v)} disabled={!canInvite || pending}>+ Invite someone</Button>\n </div>\n\n {inviting && (\n <form className=\"rz-card acct-card acct-invite\" onSubmit={sendInvite}>\n <h2 className=\"acct-title\">Invite someone</h2>\n <p className=\"acct-blurb\">They get an email with a sign-in link. No password to set up.</p>\n <div className=\"acct-invite__row\">\n <input className=\"acct-input\" type=\"email\" placeholder=\"name@company.com\" value={email} onChange={(e) => setEmail(e.target.value)} required autoFocus />\n <Dropdown\n label=\"Role\"\n value={role}\n onChange={setRole}\n options={[\n { value: \"editor\", label: \"Editor\", hint: \"Writes and publishes\" },\n { value: \"owner\", label: \"Owner\", hint: \"Also manages the team\" },\n ]}\n />\n <Button type=\"submit\" variant=\"primary\" disabled={pending}>{pending ? \"Sending…\" : \"Send invitation\"}</Button>\n <Button type=\"button\" onClick={() => setInviting(false)}>Cancel</Button>\n </div>\n </form>\n )}\n\n <Result r={result} />\n\n {myRole === \"staff\" && (\n <p className=\"acct-blurb\" style={{ margin: 0 }}>\n You’re signed in as <b>{supportName} staff</b>, so you’re not listed here — staff can reach every site without being a member of it. The site’s own owners and editors appear below.\n </p>\n )}\n\n {members.length === 0 ? (\n <EmptyState title=\"Nobody on this site’s team yet\" action={canInvite ? <Button variant=\"primary\" onClick={() => setInviting(true)}>Invite the site owner</Button> : undefined}>\n Invite the person who owns this website as an <b>Owner</b>; they can bring in editors themselves.\n </EmptyState>\n ) : (\n <div className=\"rz-table-wrap\">\n <table className=\"rz-table acct-team\">\n <thead>\n <tr><th>Person</th><th className=\"rz-fit\">Role</th><th className=\"rz-fit\">Status</th><th className=\"rz-fit\"></th></tr>\n </thead>\n <tbody>\n {members.map((m) => {\n const me = m.userId === myUserId;\n return (\n <tr key={m.userId} style={{ opacity: m.status === \"invited\" ? 0.8 : 1 }}>\n <td>\n <div className=\"acct-person\">\n <span className=\"acct-person__avatar\">\n {m.avatarUrl ? <img src={m.avatarUrl} alt=\"\" /> : m.status === \"invited\" ? \"—\" : initials(m)}\n </span>\n <span className=\"acct-person__text\">\n <span className=\"acct-person__name\">{m.name ?? m.email}{me && <span className=\"rz-muted\"> (you)</span>}</span>\n {m.name && <span className=\"acct-person__email rz-muted\">{m.email}</span>}\n </span>\n </div>\n </td>\n <td className=\"rz-fit\">\n {m.status === \"active\" && !me && canInvite ? (\n <Dropdown\n label={`Role for ${m.email}`}\n value={m.role}\n disabled={pending}\n options={[\n { value: \"editor\", label: \"Editor\", hint: \"Writes and publishes\" },\n { value: \"owner\", label: \"Owner\", hint: \"Also manages the team\" },\n ]}\n onChange={(role) => run(() => changeRole({ userId: m.userId, role }))}\n />\n ) : (\n <StatusPill tone=\"plain\">{m.role}</StatusPill>\n )}\n </td>\n <td className=\"rz-fit\"><StatusPill tone={m.status === \"active\" ? \"up\" : \"warn\"}>{m.status === \"active\" ? \"Active\" : \"Pending invite\"}</StatusPill></td>\n <td className=\"rz-fit\">\n <div className=\"acct-row-actions\">\n {me || !canInvite ? null : m.status === \"invited\" ? (\n <>\n <button type=\"button\" className=\"acct-link\" disabled={pending} onClick={() => run(() => resend({ email: m.email }))}>Resend</button>\n <button type=\"button\" className=\"acct-link acct-link--danger\" disabled={pending} onClick={() => run(() => remove({ userId: m.userId }))}>Revoke</button>\n </>\n ) : confirmRemove === m.userId ? (\n <>\n <span className=\"rz-muted\">Remove {m.name ?? m.email} from this site?</span>\n <button type=\"button\" className=\"acct-link acct-link--danger\" disabled={pending} onClick={() => { setConfirmRemove(null); run(() => remove({ userId: m.userId })); }}>Yes, remove</button>\n <button type=\"button\" className=\"acct-link\" onClick={() => setConfirmRemove(null)}>Keep</button>\n </>\n ) : (\n <button type=\"button\" className=\"acct-link acct-link--danger\" disabled={pending} onClick={() => setConfirmRemove(m.userId)}>Remove from this site</button>\n )}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport type { SiteBranding } from \"../../auth/index\";\nimport { useStudio } from \"../context\";\nimport { Field, FormCard, formatPhone } from \"./ui\";\nimport { PictureUploader } from \"./PictureUploader\";\n\nconst ImageIcon = () => (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><circle cx=\"9\" cy=\"10\" r=\"1.6\" /><path d=\"M21 16l-5-5-8 8\" />\n </svg>\n);\n\n/** Business — put the client's own name and logo on Studio. Owners and staff only. */\nexport function BusinessTab({ initial }: { initial: SiteBranding | null }) {\n const router = useRouter();\n const { saveBranding, saveBrandingPicture } = useStudio().actions;\n const [name, setName] = useState(initial?.name ?? \"\");\n const [email, setEmail] = useState(initial?.businessEmail ?? \"\");\n const [phone, setPhone] = useState(formatPhone(initial?.businessPhone ?? \"\"));\n\n return (\n <div className=\"acct-stack\">\n <FormCard\n title=\"Your business\"\n blurb=\"Put your own name and logo on Studio. They show at the top of every page for everyone who signs in to your site.\"\n action={async () => { const r = await saveBranding({ name, businessEmail: email, businessPhone: phone }); if (r.ok) router.refresh(); return r; }}\n >\n <Field id=\"biz-name\" label=\"Business name\" hint=\"Appears next to “Studio” at the top of the page.\">\n <input id=\"biz-name\" className=\"acct-input\" value={name} onChange={(e) => setName(e.target.value)} maxLength={80} required />\n </Field>\n <Field id=\"biz-email\" label=\"Business email — optional\">\n <input id=\"biz-email\" className=\"acct-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"hello@yourbusiness.com\" />\n </Field>\n <Field id=\"biz-phone\" label=\"Business phone — optional\">\n <input id=\"biz-phone\" className=\"acct-input\" type=\"tel\" inputMode=\"tel\" autoComplete=\"tel-national\" value={phone} onChange={(e) => setPhone(formatPhone(e.target.value))} placeholder=\"(555) 123-4567\" maxLength={14} />\n </Field>\n </FormCard>\n\n <section className=\"rz-card acct-card\">\n <h2 className=\"acct-title\">Logo</h2>\n <PictureUploader\n kind=\"logo\"\n shape=\"square\"\n currentUrl={initial?.logoUrl ?? null}\n fallback={<ImageIcon />}\n maxWidth={512}\n hint=\"Shown in the top bar. Square or wide.\"\n onUpload={(base64) => saveBrandingPicture({ kind: \"logo\", base64 })}\n onRemove={() => saveBrandingPicture({ kind: \"logo\", base64: null })}\n onChanged={() => router.refresh()}\n />\n </section>\n\n <section className=\"rz-card acct-card\">\n <h2 className=\"acct-title\">Favicon</h2>\n <PictureUploader\n kind=\"favicon\"\n shape=\"square\"\n currentUrl={initial?.faviconUrl ?? null}\n fallback={<ImageIcon />}\n maxWidth={64}\n hint=\"The browser-tab icon. Square, simple.\"\n onUpload={(base64) => saveBrandingPicture({ kind: \"favicon\", base64 })}\n onRemove={() => saveBrandingPicture({ kind: \"favicon\", base64: null })}\n onChanged={() => router.refresh()}\n />\n </section>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Account — H1, email, tab strip, one section at a time. Mirrors the\n * visibility tracker's Account page. Team and Business only for owners and\n * staff. The active tab lives in ?tab= so a reload (and a router.refresh after\n * a save) lands on the same section.\n */\n\nimport { usePathname, useRouter, useSearchParams } from \"next/navigation\";\nimport { Tabs } from \"../../shell\";\nimport type { SiteBranding, SiteMember } from \"../../auth/index\";\nimport { ProfileTab } from \"./ProfileTab\";\nimport { PasswordTab } from \"./PasswordTab\";\nimport { TeamTab } from \"./TeamTab\";\nimport { BusinessTab } from \"./BusinessTab\";\n\nexport type TabId = \"profile\" | \"password\" | \"team\" | \"business\";\n\nconst LABELS: Record<TabId, string> = { profile: \"My Profile\", password: \"Change Password\", team: \"Team\", business: \"Business\" };\n\nexport function AccountTabs({ me, manages, team, branding, myUserId, myRole }: {\n me: { email: string; name: string | null; displayName: string | null; avatarUrl: string | null };\n /** Owners and staff see Team and Business. */\n manages: boolean;\n team: { ok: true; members: SiteMember[]; canInvite: boolean } | { ok: false; error: string } | null;\n branding: SiteBranding | null;\n myUserId: string;\n myRole: string;\n}) {\n const router = useRouter();\n const pathname = usePathname();\n const params = useSearchParams();\n const ids: TabId[] = manages ? [\"profile\", \"password\", \"team\", \"business\"] : [\"profile\", \"password\"];\n const requested = params.get(\"tab\") as TabId | null;\n const active: TabId = requested && ids.includes(requested) ? requested : \"profile\";\n const setActive = (v: string) => router.replace(`${pathname}?tab=${v}`, { scroll: false });\n\n return (\n <>\n <Tabs options={ids.map((id) => ({ value: id, label: LABELS[id] }))} value={active} onChange={setActive} label=\"Account sections\" />\n {active === \"profile\" && <ProfileTab email={me.email} name={me.name} displayName={me.displayName} avatarUrl={me.avatarUrl} />}\n {active === \"password\" && <PasswordTab />}\n {active === \"team\" && manages && (\n team?.ok ? <TeamTab members={team.members} canInvite={team.canInvite} myUserId={myUserId} myRole={myRole} /> : <div className=\"rz-alert admin__alert\">{team?.error ?? \"Couldn’t load the team.\"}</div>\n )}\n {active === \"business\" && manages && <BusinessTab initial={branding} />}\n </>\n );\n}\n","\"use client\";\n\nimport { Suspense } from \"react\";\nimport type { SiteBranding, SiteMember } from \"../types\";\nimport { AccountTabs } from \"./AccountTabs\";\n\n/** Account — My Profile · Change Password · Team · Business. Data is loaded by the site page; the tabs are client forms. */\nexport function StudioAccount({ me, manages, team, branding, myUserId, myRole }: {\n me: { email: string; name: string | null; displayName: string | null; avatarUrl: string | null };\n manages: boolean;\n team: { ok: true; members: SiteMember[]; canInvite: boolean } | { ok: false; error: string } | null;\n branding: SiteBranding | null;\n myUserId: string;\n myRole: string;\n}) {\n return (\n <div className=\"acct\">\n <h1 className=\"acct-h1\">Account</h1>\n <p className=\"acct-email\">{me.email}</p>\n {/* useSearchParams in the tabs needs a Suspense boundary for the static shell */}\n <Suspense fallback={null}>\n <AccountTabs me={me} manages={manages} team={team} branding={branding} myUserId={myUserId} myRole={myRole} />\n </Suspense>\n </div>\n );\n}\n","/**\n * Plain-English facts about how Studio works — the same text a site's help\n * assistant reads. Generic: no site or agency names.\n */\n\nexport const STUDIO_FACTS = `\nHOW REALIIZ STUDIO WORKS (the publishing dashboard at /admin)\n\nThe big picture: your website is stored as files in a private \"repository\" on GitHub (think: a version-controlled folder in the cloud that keeps every change ever made). Studio is a friendly front end over that folder. You never need to open GitHub — every action you take in Studio is one of these steps:\n\n1. SAVE. You edit a post and click \"Save and continue\" (or \"Save changes\"). Studio writes your post as a file and opens a \"change\" — GitHub calls this a pull request, or PR. Nothing on the live site changes yet. Think of it as a draft submitted for checking.\n2. CHECKS. The moment a change exists, the site builds a private test copy with your change in it, to make sure nothing breaks (a broken link tag, a missing required field, an image path that doesn't exist). This usually takes a minute or two. The change page shows a tracker: Saved → Checks → Published → Live, and refreshes itself.\n3. PUBLISH. When the checks pass the status becomes \"Ready to publish\" and the Publish button unlocks. A \"Preview the change\" button also appears: it opens a private copy of the website with your edit in it, so you can see exactly how the post will look before anyone else does. Clicking Publish sends your change to the live site.\n4. LIVE. The website then rebuilds itself with your change — usually about two minutes. The Live step keeps spinning until the rebuild is really done, and \"View the post\" unlocks at that moment. If you look at the website before the Live step turns green you will still see the old version; that's normal, not a failure.\n\nCONTENT TYPES: the sidebar lists every kind of content this site publishes — Blog posts and Speaking & Media (talks, panels, podcasts; shown at realiiz.com/speaking, upcoming first). Speaking items have a date, optional start/end time and time zone, a kind, a host, a place, links for details, the recording and slides, and — for Ed's own events — an RSVP link, capacity, “sign-ups closed” and “private” (invited guests only; the event still shows but has no RSVP button). Each works the same way — a list, a New button, a form, Save, checks, Publish.\n\nSTATUSES you'll see in each list and on each item:\n- Live: what's on the website right now, no change waiting.\n- Checking…: you saved; the test build is running. Wait a minute or two.\n- Ready to publish: checks passed; open the change and click Publish.\n- Needs fixing: the test build failed. Nothing was published. Open the post, fix the problem the message names, save again — the same change re-runs its checks.\n- New · …: a brand-new post that exists only in a change; it isn't on the live site until you publish.\n\nRULES OF THUMB:\n- One open change per post. Saving again while a change is waiting updates that same change (it doesn't create a second one). The sticky bar at the bottom of the editor tells you which change you're updating.\n- You can leave and come back: the posts table's Status column links to the change, and the post page shows a notice with a Publish button when a change is waiting.\n- Changed your mind? On the change page, \"Discard this change\" (with a confirm step) throws the unpublished edits away. The live site is untouched and the post goes back to Live.\n- \"View on GitHub\" opens the raw change for the curious; you never need it.\n- Only signed-in editors and owners can save or publish. Sign-in is by email link (no password).\n- If two people edit the same post, the second to publish is told the file changed first and asked to redo their edit on the latest version — nothing is silently overwritten.\n\nFIELDS on a blog post:\n- Title (H1): the headline at the top of the post. Can be long.\n- Web address (slug): the last part of the post's URL, e.g. my-first-post → realiiz.com/blog/my-first-post. Lowercase words joined by hyphens.\n- Excerpt: the short teaser shown on the blog listing page.\n- Publish date / Last updated: shown on the post and used for ordering; Last updated is optional, for revisions.\n- Author, Tags (exactly 3, lowercase-hyphenated), Header image (choose or drop a picture — see PICTURES below), Header image description (alt text for accessibility), Featured (pins the post).\n- Search & social group: Search title (what Google and the browser tab show — aim for 50–60 characters including the site name; blank means same as Title), Meta description (the snippet under the title in Google — aim for 120–155 characters), Focus keyword (the phrase the post targets; used for SEO reporting, never shown), Social share image (the picture for social cards; blank reuses the hero image), Canonical (advanced; leave blank unless the article was published elsewhere first).\n- Post content: Markdown. The toolbar buttons toggle formatting on and off; Preview shows exactly how the blog will render it; the tooltip button wraps a selected term in a definition that appears on hover; Expand fills the window (Esc to come back).\n- Length gauges under the search fields: the green band is the target range; the fill turns green when you're inside it and red when you're over.\n\nPICTURES:\n- Choose a picture (or drag one in, or paste) for the header image, the social share image, or anywhere in the post content via the toolbar's picture button. JPG, PNG or WebP up to 10 MB; Studio shrinks it in your browser to a web-friendly WebP (about 1600 pixels wide, usually 100–400 KB) before sending.\n- Nothing is uploaded when you pick — the pictures are saved together with the post when you press Save, into the same change, and go live with it when you Publish. Discarding a change discards its pictures too.\n- Pictures are named after the post's web address (slug), so fill that in first: the header image becomes /blog/<slug>.webp and pictures in the text go under /blog/<slug>/.\n- Preview shows new pictures before they're saved. The \"Preview the change\" link after the checks shows them on the real site design.\n\nACCOUNT (avatar menu → Account, or Settings in the sidebar):\n- My Profile: your photo, your name (shown in the greeting and to teammates) and “Name on blog posts” — how you're credited as the author; blank means your full name. Your email is your login and can't be changed here — ask your web team.\n- Change Password: optional. Email links always work; a password is a second way in. At least 10 characters. On the sign-in page, \"Have a password? Sign in with it instead\" reveals the password form. Forgot your password? There's nothing to reset — sign in with an email link and set a new one under Settings → Change Password.\n- Team (owners only): who can sign in to this site. \"+ Invite someone\" sends an email link — no password needed. Editors write and publish; owners also manage the team and the business details. Pending invites can be resent or revoked; active people can be removed from this site (their login survives for any other site). A site always keeps at least one owner. Support staff aren't listed in a site's team — they can reach every site without being a member.\n- Business (owners only): your business name, contact email/phone, logo and favicon. Saving puts your name and logo at the top of Studio for everyone who signs in to your site — it never changes the public website.\n- Help (avatar menu): the help centre. For now it points here, to the Ask bubble; a full browsable guide is coming.\n`;\n","/**\n * The serialisable shapes that cross from a site's server pages into these\n * client components, and the exact set of server actions a site must provide.\n */\n\nimport type { ContentTypeEntry } from \"../forms/types\";\nimport type { PullRequestStatus } from \"../git/types\";\nimport type { SiteBranding } from \"../auth/branding\";\nimport type { SiteMember } from \"../auth/members\";\n\nexport type ActionResult = { ok: true; message?: string } | { ok: false; error: string };\nexport type PublishResult = { ok: false; error: string };\nexport type MergeOutcome =\n | { state: \"merged\"; sha: string } | { state: \"pending\" } | { state: \"stale\" }\n | { state: \"red\"; failingCheck: string | null } | { state: \"error\"; message: string };\nexport type DiscardOutcome = { state: \"discarded\" } | { state: \"already-published\" } | { state: \"error\"; message: string };\nexport type TeamState = { ok: true; members: SiteMember[]; canInvite: boolean } | { ok: false; error: string };\n\nexport interface ImagePayload { path: string; base64: string }\nexport interface PublishInput {\n type: string;\n frontmatter: Record<string, unknown>;\n body: string;\n existing?: { number: number; branch: string } | null;\n images?: ImagePayload[];\n}\n\n/** Exactly what a site's \"use server\" wrapper file must export. */\nexport interface StudioActions {\n publishContent: (input: PublishInput) => Promise<PublishResult | never>;\n removeContent: (input: { type: string; slug: string }) => Promise<PublishResult | never>;\n mergeContentPr: (number: number) => Promise<MergeOutcome>;\n discardChange: (number: number, branch: string) => Promise<DiscardOutcome>;\n previewBody: (markdown: string) => Promise<{ html: string } | { error: string }>;\n saveProfile: (input: { name: string; displayName: string }) => Promise<ActionResult>;\n saveAvatar: (input: { base64: string } | null) => Promise<ActionResult>;\n changePassword: (input: { password: string; confirm: string }) => Promise<ActionResult>;\n loadBranding: () => Promise<SiteBranding | null>;\n saveBranding: (input: { name: string; businessEmail: string; businessPhone: string }) => Promise<ActionResult>;\n saveBrandingPicture: (input: { kind: \"logo\" | \"favicon\"; base64: string | null }) => Promise<ActionResult>;\n loadMe: () => Promise<{ email: string; role: string; name: string | null; displayName: string | null; avatarUrl: string | null }>;\n loadTeam: () => Promise<TeamState>;\n invite: (input: { email: string; role: \"owner\" | \"editor\" }) => Promise<ActionResult>;\n changeRole: (input: { userId: string; role: \"owner\" | \"editor\" }) => Promise<ActionResult>;\n resend: (input: { email: string }) => Promise<ActionResult>;\n remove: (input: { userId: string }) => Promise<ActionResult>;\n}\n\nexport const ACTION_NAMES = [\n \"publishContent\", \"removeContent\", \"mergeContentPr\", \"discardChange\", \"previewBody\",\n \"saveProfile\", \"saveAvatar\", \"changePassword\", \"loadBranding\", \"saveBranding\", \"saveBrandingPicture\", \"loadMe\",\n \"loadTeam\", \"invite\", \"changeRole\", \"resend\", \"remove\",\n] as const satisfies readonly (keyof StudioActions)[];\n\n/** One row of a content list, as the site page loads it from Studio.readers.listItems. */\nexport interface ListRow {\n slug: string;\n title: string;\n date: string | null;\n needsAttention: boolean;\n isNew: boolean;\n /** Where the live item is on the public site, or null when the type has no page. */\n liveUrl: string | null;\n pending: { number: number; state: \"checking\" | \"ready\" | \"failed\"; removal: boolean } | null;\n}\n\nexport type PendingSummary = { number: number; branch: string; state: \"checking\" | \"ready\" | \"failed\"; failingCheck: string | null; removal: boolean };\n\nexport type { ContentTypeEntry, PullRequestStatus, SiteBranding, SiteMember };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/studio-ui/context.tsx","../../src/shell/icons.tsx","../../src/shell/Sidebar.tsx","../../src/shell/ThemeToggle.tsx","../../src/shell/AccountMenu.tsx","../../src/shell/TopBar.tsx","../../src/shell/tokens.ts","../../src/shell/AdminShell.tsx","../../src/shell/Button.tsx","../../src/shell/primitives.tsx","../../src/shell/Tabs.tsx","../../src/studio-ui/css.ts","../../src/studio-ui/shell.tsx","../../src/forms-ui/styles.ts","../../src/auth-ui/MagicLinkForm.tsx","../../src/auth-ui/SignOutButton.tsx","../../src/studio-ui/states.tsx","../../src/studio-ui/term.tsx","../../src/studio-ui/copy.ts","../../src/forms/internals.ts","../../src/forms/checks.ts","../../src/forms/unwrap.ts","../../src/forms/inputs.ts","../../src/forms/labels.ts","../../src/forms/walk.ts","../../src/forms-ui/ChipsInput.tsx","../../src/forms-ui/SelectInput.tsx","../../src/forms-ui/controls.tsx","../../src/forms-ui/images.ts","../../src/forms-ui/md/upload.ts","../../src/forms-ui/ImageInput.tsx","../../src/forms-ui/Field.tsx","../../src/forms-ui/md/table.ts","../../src/forms-ui/md/edits.ts","../../src/forms-ui/md/icons.tsx","../../src/forms-ui/md/TableGrid.tsx","../../src/forms-ui/MarkdownEditor.tsx","../../src/forms-ui/issues.ts","../../src/forms-ui/values.ts","../../src/forms-ui/ContentForm.tsx","../../src/media/errors.ts","../../src/media/resize.ts","../../src/media/paths.ts","../../src/studio-ui/useImages.ts","../../src/studio-ui/ContentEditor.tsx","../../src/studio-ui/RemoveItem.tsx","../../src/studio-ui/useDeployed.ts","../../src/studio-ui/PublishPanel.tsx","../../src/studio-ui/SlugToggle.tsx","../../src/studio-ui/account/ui.tsx","../../src/studio-ui/PasswordSignIn.tsx","../../src/studio-ui/AcceptInvite.tsx","../../src/studio-ui/pages.tsx","../../src/studio-ui/account/PictureUploader.tsx","../../src/studio-ui/account/ProfileTab.tsx","../../src/studio-ui/account/PasswordTab.tsx","../../src/studio-ui/account/TeamTab.tsx","../../src/studio-ui/account/BusinessTab.tsx","../../src/studio-ui/account/AccountTabs.tsx","../../src/studio-ui/account/StudioAccount.tsx","../../src/studio-ui/facts.ts","../../src/studio-ui/types.ts"],"names":["createContext","jsx","useContext","jsxs","useState","useEffect","useRef","usePathname","Fragment","useMemo","createBrowserClient","useId","labelFor","useCallback","base","useImages","useTransition","read","useRouter","Link","keyFor","useSyncExternalStore","Field","toBase64","error","initialsOf","role","useSearchParams","Suspense"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\n/**\n * What every Studio component needs and cannot import: the site's registry\n * (functions and zod schemas — not serialisable, so it must come from a client\n * module the site owns) and the site's server actions (created in the site,\n * because Next only compiles \"use server\" in app code).\n *\n * A site provides both once, in its own tiny client file:\n *\n * \"use client\";\n * import { contentTypes } from \"./content-types\";\n * import { StudioProvider } from \"@realiizlabs/admin/studio-ui\";\n * export function Studio({ actions, children }) {\n * return <StudioProvider contentTypes={contentTypes} actions={actions}>{children}</StudioProvider>;\n * }\n */\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport type { ContentTypeEntry } from \"../forms/types\";\nimport type { StudioActions } from \"./types\";\n\nexport interface StudioContextValue {\n contentTypes: Record<string, ContentTypeEntry>;\n actions: StudioActions;\n /** Who to ask when something needs the agency — \"your web team\" by default. */\n supportName: string;\n siteName: string;\n}\n\nconst Ctx = createContext<StudioContextValue | null>(null);\n\nexport function StudioProvider({ contentTypes, actions, supportName = \"your web team\", siteName = \"Studio\", children }: {\n contentTypes: Record<string, ContentTypeEntry>;\n actions: StudioActions;\n supportName?: string;\n siteName?: string;\n children: ReactNode;\n}) {\n return <Ctx.Provider value={{ contentTypes, actions, supportName, siteName }}>{children}</Ctx.Provider>;\n}\n\nexport function useStudio(): StudioContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"Studio components need a <StudioProvider> above them — see @realiizlabs/admin/studio-ui.\");\n return v;\n}\n\nexport function useEntry(typeId: string): ContentTypeEntry | null {\n return useStudio().contentTypes[typeId] ?? null;\n}\n\n/** Pictures for a type live under public/<last folder segment>/. */\nexport function publicDirOf(entry: { folder: string }): string {\n return `/${entry.folder.split(\"/\").filter(Boolean).pop() ?? \"images\"}/`;\n}\n","/** Eight stroke icons, 18px, currentColor. Registry ids pick one; unknown ids get `doc`. */\n\nimport type { SVGProps } from \"react\";\n\nexport type IconName = \"home\" | \"posts\" | \"events\" | \"mic\" | \"venues\" | \"users\" | \"settings\" | \"doc\";\n\nconst base: SVGProps<SVGSVGElement> = {\n width: 18, height: 18, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\",\n strokeWidth: 1.7, strokeLinecap: \"round\", strokeLinejoin: \"round\", \"aria-hidden\": true,\n style: { flexShrink: 0 },\n};\n\nexport function Icon({ name }: { name: IconName }) {\n switch (name) {\n case \"home\":\n return <svg {...base}><rect x=\"3\" y=\"3\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\" rx=\"1\" /><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\" rx=\"1\" /></svg>;\n case \"posts\":\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /><path d=\"M9 12h7M9 16h7M9 8h3\" /></svg>;\n case \"events\":\n return <svg {...base}><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M8 3v4M16 3v4M3 10h18\" /></svg>;\n case \"mic\":\n return <svg {...base}><rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\" /><path d=\"M5 11a7 7 0 0 0 14 0\" /><path d=\"M12 18v3M9 21h6\" /></svg>;\n case \"venues\":\n return <svg {...base}><path d=\"M12 21s7-6.2 7-11.5A7 7 0 0 0 5 9.5C5 14.8 12 21 12 21z\" /><circle cx=\"12\" cy=\"9.5\" r=\"2.5\" /></svg>;\n case \"users\":\n return <svg {...base}><circle cx=\"9\" cy=\"8\" r=\"3.5\" /><path d=\"M2.5 20a6.5 6.5 0 0 1 13 0\" /><circle cx=\"17\" cy=\"9\" r=\"2.5\" /><path d=\"M15.5 14.5a5 5 0 0 1 6 5\" /></svg>;\n case \"settings\":\n // Two sliders — the same mark the visibility tracker uses, so Studio and the tracker read as one family.\n return <svg {...base}><path d=\"M4 7h9\" /><circle cx=\"16\" cy=\"7\" r=\"2\" /><path d=\"M19 7h1\" /><path d=\"M4 17h9\" /><circle cx=\"16\" cy=\"17\" r=\"2\" /><path d=\"M19 17h1\" /></svg>;\n default:\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /></svg>;\n }\n}\n\nexport function iconFor(id: string): IconName {\n const known: IconName[] = [\"home\", \"posts\", \"events\", \"mic\", \"venues\", \"users\", \"settings\"];\n return (known as string[]).includes(id) ? (id as IconName) : \"doc\";\n}\n","/**\n * Sidebar — items from the content-type registry (via navFromContentTypes),\n * active by href prefix, collapsible with the state remembered per browser.\n * Plain anchors: the package does not know which router the host uses.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { Icon, iconFor } from \"./icons\";\n\nexport interface NavItem {\n id: string;\n label: string;\n href: string;\n /** Icon id; unknown ids fall back to a document icon. Defaults to `id`. */\n icon?: string;\n /** Shown greyed out and not navigable — a section that is coming but not built yet. */\n disabled?: boolean;\n}\n\nexport const SIDEBAR_KEY = \"rz-admin-sidebar\";\n\nexport function isActive(item: NavItem, activeHref: string, basePath: string): boolean {\n if (item.href === basePath) return activeHref === basePath || activeHref === `${basePath}/`;\n return activeHref === item.href || activeHref.startsWith(`${item.href}/`);\n}\n\nexport function Sidebar({ items, pinned = [], activeHref, basePath }: { items: NavItem[]; pinned?: NavItem[]; activeHref: string; basePath: string }) {\n const [collapsed, setCollapsed] = useState(false);\n\n useEffect(() => {\n try {\n if (window.localStorage.getItem(SIDEBAR_KEY) === \"collapsed\") setCollapsed(true);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const toggle = () => {\n const next = !collapsed;\n setCollapsed(next);\n try {\n window.localStorage.setItem(SIDEBAR_KEY, next ? \"collapsed\" : \"open\");\n } catch {\n /* ignore */\n }\n };\n\n const renderItem = (item: NavItem) => {\n const active = !item.disabled && isActive(item, activeHref, basePath);\n if (item.disabled) {\n return (\n <span key={item.id} className=\"rz-sidebar__item rz-sidebar__item--disabled\" aria-disabled=\"true\" title={collapsed ? `${item.label} — coming soon` : \"Coming soon\"}>\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </span>\n );\n }\n return (\n <a\n key={item.id}\n href={item.href}\n className={[\"rz-sidebar__item\", active && \"rz-sidebar__item--active\"].filter(Boolean).join(\" \")}\n aria-current={active ? \"page\" : undefined}\n title={collapsed ? item.label : undefined}\n >\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </a>\n );\n };\n\n return (\n <aside className={[\"rz-sidebar\", collapsed && \"rz-sidebar--collapsed\"].filter(Boolean).join(\" \")} aria-label=\"Admin navigation\">\n <nav className=\"rz-sidebar__nav\">{items.map(renderItem)}</nav>\n {/* Pinned above Collapse (Settings) so it stays in one place as sections are added, instead of drifting down the list. */}\n {pinned.length > 0 && <nav className=\"rz-sidebar__pinned\" aria-label=\"Settings\">{pinned.map(renderItem)}</nav>}\n <button\n type=\"button\"\n className=\"rz-sidebar__collapse\"\n onClick={toggle}\n aria-label={collapsed ? \"Expand navigation\" : \"Collapse navigation\"}\n title={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ transform: collapsed ? \"rotate(180deg)\" : undefined }}>\n <path d=\"M15 6l-6 6 6 6\" />\n </svg>\n <span className=\"rz-sidebar__label\">Collapse</span>\n </button>\n </aside>\n );\n}\n","/**\n * Light / dark, remembered per browser. The attribute lives on the .rz-admin\n * root (not <html>) so the host site's own theme is never touched.\n *\n * No flash of the wrong theme: the server renders defaultTheme, and the effect\n * only flips when a stored value differs — a single client-side change, never\n * a mismatch between server HTML and first client render.\n */\n\nimport { useEffect, useState } from \"react\";\n\nexport type Theme = \"light\" | \"dark\";\nexport const THEME_KEY = \"rz-admin-theme\";\n\nexport function useTheme(defaultTheme: Theme = \"light\"): [Theme, (t: Theme) => void] {\n const [theme, setTheme] = useState<Theme>(defaultTheme);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(THEME_KEY);\n if (stored === \"light\" || stored === \"dark\") setTheme(stored);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const set = (t: Theme) => {\n setTheme(t);\n try {\n window.localStorage.setItem(THEME_KEY, t);\n } catch {\n /* ignore */\n }\n };\n return [theme, set];\n}\n\nexport function ThemeToggle({ theme, onChange }: { theme: Theme; onChange: (t: Theme) => void }) {\n return (\n <span className=\"rz-seg\" role=\"group\" aria-label=\"Theme\">\n <button type=\"button\" aria-pressed={theme === \"light\"} onClick={() => onChange(\"light\")}>Light</button>\n <button type=\"button\" aria-pressed={theme === \"dark\"} onClick={() => onChange(\"dark\")}>Dark</button>\n </span>\n );\n}\n","/**\n * Avatar button → menu, tracker-style: a header with who you are, then\n * full-width rows each led by a 14px icon. Sign out is a plain POST form so it\n * works before hydration.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { ThemeToggle, type Theme } from \"./ThemeToggle\";\n\nexport interface ShellUser {\n email: string;\n name?: string | null;\n /** Profile photo; initials show when absent. */\n avatarUrl?: string | null;\n}\n\nexport function firstNameOf(user: ShellUser): string {\n const fromName = user.name?.trim().split(/\\s+/)[0];\n if (fromName) return fromName;\n const local = user.email.split(\"@\")[0] ?? \"\";\n return local ? local.charAt(0).toUpperCase() + local.slice(1) : \"there\";\n}\n\nexport function initialsOf(user: ShellUser): string {\n const parts = user.name?.trim().split(/\\s+/).filter(Boolean) ?? [];\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (user.email[0] ?? \"?\").toUpperCase();\n}\n\nconst ico = { width: 14, height: 14, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const, \"aria-hidden\": true };\nconst ShieldIcon = () => <svg {...ico}><path d=\"M12 3l7 3v5c0 5-3.5 8.5-7 10-3.5-1.5-7-5-7-10V6z\" /></svg>;\nconst SunIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" /></svg>;\nconst UserIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 21a8 8 0 0 1 16 0\" /></svg>;\n// An open book — \"the guide\". Two clean strokes that stay legible at 14px.\nconst HelpIcon = () => <svg {...ico}><path d=\"M2 4h6a4 4 0 0 1 4 4v12a3 3 0 0 0-3-3H2z\" /><path d=\"M22 4h-6a4 4 0 0 0-4 4v12a3 3 0 0 1 3-3h7z\" /></svg>;\nconst OutIcon = () => <svg {...ico}><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"M16 17l5-5-5-5\" /><path d=\"M21 12H9\" /></svg>;\n\nexport function AccountMenu({ user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n user: ShellUser;\n role: string;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n /** The Account page (My Profile · Change Password · Team · Business). Omit to hide the item. */\n accountHref?: string;\n /** The Help centre. Omit to hide the item. */\n helpHref?: string;\n}) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (!wrap.current?.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n return (\n <div ref={wrap} style={{ position: \"relative\" }}>\n <button type=\"button\" className=\"rz-avatar\" aria-haspopup=\"menu\" aria-expanded={open} aria-label=\"Account menu\" onClick={() => setOpen((v) => !v)}>\n {user.avatarUrl ? <img src={user.avatarUrl} alt=\"\" className=\"rz-avatar__img\" /> : initialsOf(user)}\n </button>\n\n {open && (\n <div className=\"rz-menu\" role=\"menu\">\n <div className=\"rz-menu__who\">\n <div className=\"rz-menu__name\">{user.name?.trim() || user.email}</div>\n {user.name?.trim() && <div className=\"rz-menu__email\">{user.email}</div>}\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <ShieldIcon />\n <span>Role</span>\n <span className=\"rz-menu__end rz-pill rz-pill--plain\">{role}</span>\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <SunIcon />\n <span>Theme</span>\n <span className=\"rz-menu__end\"><ThemeToggle theme={theme} onChange={onTheme} /></span>\n </div>\n {(accountHref || helpHref) && <div className=\"rz-menu__sep\" />}\n {accountHref && (\n <a href={accountHref} role=\"menuitem\" className=\"rz-menu__item\">\n <UserIcon />\n Account\n </a>\n )}\n {helpHref && (\n <a href={helpHref} role=\"menuitem\" className=\"rz-menu__item\">\n <HelpIcon />\n Help\n </a>\n )}\n <div className=\"rz-menu__sep\" />\n <form method=\"post\" action={signOutPath} className=\"rz-menu__signout\">\n <button type=\"submit\" role=\"menuitem\" className=\"rz-menu__item\">\n <OutIcon />\n Sign out\n </button>\n </form>\n </div>\n )}\n </div>\n );\n}\n","/** Top bar: brand on the left, greeting + account menu on the right. */\n\nimport { AccountMenu, firstNameOf, type ShellUser } from \"./AccountMenu\";\nimport type { Theme } from \"./ThemeToggle\";\n\nexport function TopBar({ siteName, productName, logoUrl, homeHref, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n siteName: string;\n productName: string;\n logoUrl?: string | null;\n homeHref: string;\n user: ShellUser | null;\n role: string | null;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n accountHref?: string;\n helpHref?: string;\n}) {\n return (\n <header className=\"rz-topbar\">\n <a href={homeHref} className=\"rz-topbar__brand\">\n {/* the site's own mark (usually its favicon); next/image is deliberately not used in the package */}\n {logoUrl && <img src={logoUrl} alt=\"\" className=\"rz-topbar__logo\" />}\n <span>{siteName}</span>\n <span className=\"rz-topbar__product\">{productName}</span>\n </a>\n {user && role && (\n <div className=\"rz-topbar__right\">\n <span className=\"rz-topbar__greeting\" data-testid=\"rz-greeting\">Welcome back, {firstNameOf(user)}</span>\n <AccountMenu user={user} role={role} theme={theme} onTheme={onTheme} signOutPath={signOutPath} accountHref={accountHref} helpHref={helpHref} />\n </div>\n )}\n </header>\n );\n}\n","/**\n * SHELL_CSS — the design system, as one string the shell injects.\n *\n * Palette borrowed from the visibility tracker (Realiiz's back-office look):\n * warm bone/ink with an operative-green signal. Light is the default so every\n * install looks finished; dark is one attribute away. Everything is scoped to\n * `.rz-admin` so a host site's variables never leak in and ours never leak out.\n *\n * A site overrides by redeclaring any variable on `.rz-admin` — e.g.\n * .rz-admin { --signal: #0a58ca; --rz-font: var(--font-inter), sans-serif; }\n *\n * The block at the end maps the forms-ui variables onto these tokens, so\n * ContentForm and MagicLinkForm re-skin without touching their own code.\n */\n\nexport const SHELL_CSS = `\n.rz-admin, .rz-admin[data-theme=\"light\"] {\n /* realiiz.com palette (src/app/globals.css): ink, bone, paper, signal blue, slate, line, amber */\n --ink: #0e1726; --bone: #f7f5f0; --signal: #1f6feb;\n --surface-0: #f7f5f0; --surface-1: #ffffff; --surface-2: #f1eee7; --surface-3: #e8e4da;\n --text-primary: #0e1726; --text-secondary: #5b6678; --text-muted: #8a93a5;\n --signal-dim: #1a63d8; --signal-glow: #5b9bff; --signal-warn: #e0a03b; --series-blue: #1f6feb;\n --border: #d9d4c8; --separator: #e9e5dc;\n --status-up: #15803d; --status-down: #dc2626; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin[data-theme=\"dark\"] { color-scheme: dark; }\n.rz-admin[data-theme=\"dark\"] {\n --ink: #eef0f5; --bone: #1b2334; --signal: #3b82f6;\n --surface-0: #1b2334; --surface-1: #222c42; --surface-2: #29344a; --surface-3: #36415c;\n --text-primary: #eef0f5; --text-secondary: #a2abbf; --text-muted: #77819a;\n --signal-dim: #8db4ff; --signal-glow: #aec9ff; --signal-warn: #eab058; --series-blue: #3b82f6;\n --border: #36415c; --separator: #2c3750;\n --status-up: #4ade80; --status-down: #f87171; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin {\n --rz-font: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --rz-font-display: var(--rz-font);\n --rz-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --rz-radius: 6px;\n --rz-sidebar: 220px; --rz-sidebar-collapsed: 58px; --rz-topbar: 52px;\n\n /* forms-ui speaks these; map them once so both packages agree */\n --realiiz-form-fg: var(--text-primary); --realiiz-form-muted: var(--text-muted);\n --realiiz-form-border: var(--border); --realiiz-form-accent: var(--signal);\n --realiiz-form-accent-fg: var(--signal-fg); --realiiz-form-danger: var(--status-down);\n --realiiz-form-radius: var(--rz-radius); --realiiz-form-font: var(--rz-font);\n --realiiz-form-focus-ring: 0 0 0 3px color-mix(in srgb, var(--signal) 25%, transparent);\n\n box-sizing: border-box; min-height: 100vh; display: flex; flex-direction: column;\n background: var(--surface-0); color: var(--text-primary);\n font-family: var(--rz-font); font-size: 14px; line-height: 1.45;\n}\n.rz-admin *, .rz-admin *::before, .rz-admin *::after { box-sizing: inherit; }\n.rz-admin a { color: inherit; }\n.rz-admin h1, .rz-admin h2, .rz-admin h3 { font-family: var(--rz-font-display); color: var(--text-primary); margin: 0; }\n.rz-admin .realiiz-form__control { background: var(--surface-0); }\n.rz-admin .realiiz-image { background: var(--surface-0); }\n.rz-admin .realiiz-image__thumb { background: var(--surface-2); }\n.rz-admin[data-theme=\"dark\"] .realiiz-form__control::-webkit-calendar-picker-indicator { filter: invert(1) opacity(.7); }\n.rz-admin .realiiz-form__button { background: var(--surface-1); color: var(--text-primary); }\n.rz-admin .realiiz-form__button--primary { background: var(--signal); color: var(--signal-fg); }\n\n/* ---- frame ---------------------------------------------------------- */\n.rz-topbar { height: var(--rz-topbar); display: flex; align-items: center; gap: 1rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); background: var(--surface-1); flex-shrink: 0; }\n.rz-topbar__brand { display: flex; align-items: center; gap: .6rem; font-weight: 600; font-size: .9375rem; text-decoration: none; }\n.rz-topbar__logo { height: 22px; width: auto; display: block; }\n.rz-topbar__product { font-weight: 400; color: var(--text-secondary); }\n.rz-topbar__right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }\n.rz-topbar__greeting { color: var(--text-secondary); font-size: .8rem; }\n.rz-body { display: flex; flex: 1; min-height: 0; }\n/* Top bar and sidebar stay put while the content scrolls, so Collapse is always at the bottom-left. */\n.rz-topbar { position: sticky; top: 0; z-index: 20; }\n.rz-sidebar { position: sticky; top: var(--rz-topbar); height: calc(100vh - var(--rz-topbar)); width: var(--rz-sidebar); flex-shrink: 0; border-right: 1px solid var(--border); background: var(--surface-1); display: flex; flex-direction: column; transition: width .15s ease; overflow: hidden; }\n.rz-sidebar--collapsed { width: var(--rz-sidebar-collapsed); }\n.rz-sidebar__nav { padding: .75rem 0; flex: 1; overflow-y: auto; }\n.rz-sidebar__item { display: flex; align-items: center; gap: .65rem; padding: .55rem 1rem; color: var(--text-secondary); text-decoration: none; font-size: .875rem; font-weight: 400; white-space: nowrap; overflow: hidden; }\n.rz-sidebar__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-sidebar__item--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-sidebar__item--disabled, .rz-sidebar__item--disabled:hover { color: var(--text-muted); opacity: .55; background: transparent; cursor: default; }\n.rz-sidebar--collapsed .rz-sidebar__item { justify-content: center; padding: .55rem 0; }\n.rz-sidebar--collapsed .rz-sidebar__label { display: none; }\n.rz-sidebar__pinned { border-top: 1px solid var(--separator); padding: .3rem 0; }\n.rz-sidebar__collapse { display: flex; align-items: center; gap: .7rem; padding: .6rem 1rem; border: 0; border-top: 1px solid var(--separator); background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: .8rem; text-align: left; }\n.rz-sidebar__collapse:hover { color: var(--text-primary); }\n.rz-sidebar__collapse svg { flex-shrink: 0; }\n.rz-sidebar--collapsed .rz-sidebar__collapse { justify-content: center; padding: .6rem 0; }\n.rz-main { flex: 1; min-width: 0; }\n.rz-content { max-width: 1400px; margin: 0; padding: 28px 32px 80px; }\n.rz-content .realiiz-form { max-width: none; }\n.rz-content .realiiz-form fieldset, .rz-content .realiiz-form__alert, .rz-content .realiiz-form__actions { max-width: 920px; }\n/* The form's save bar pins to the bottom of the content column: bleed out over .rz-content's padding, then pad back in. */\n.rz-content .realiiz-form__bar { position: sticky; bottom: 0; z-index: 10; margin: 24px -32px -80px; padding: 12px 32px; background: var(--surface-1); border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.05); }\n.rz-content .realiiz-form__status { color: var(--text-muted); }\n.rz-content .realiiz-form__bar[data-dirty] .realiiz-form__status { color: var(--text-primary); font-weight: 500; }\n\n/* ---- primitives ----------------------------------------------------- */\n/* Same metrics as the form's Save button (.realiiz-form__button) so every button in the admin matches. */\n.rz-btn { font-family: inherit; font-weight: 600; border-radius: var(--rz-radius); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .4rem; white-space: nowrap; line-height: 1.2; }\n.rz-btn--md { padding: 10px 16px; font-size: 15px; min-height: 40px; }\n.rz-btn--sm { padding: 6px 12px; font-size: 13px; min-height: 32px; }\n.rz-admin .rz-btn--primary, .rz-admin a.rz-btn--primary { background: var(--signal); color: var(--signal-fg); border: 1px solid var(--signal); }\n.rz-admin .rz-btn--secondary, .rz-admin a.rz-btn--secondary { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn--danger, .rz-admin a.rz-btn--danger { background: transparent; color: var(--status-down); border: 1px solid var(--status-down); }\n.rz-admin .rz-btn--ghost, .rz-admin a.rz-btn--ghost { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn:disabled { opacity: .55; cursor: default; }\n.rz-arrow { width: 1.1em; height: 1.1em; flex-shrink: 0; transition: transform .15s ease-out; }\n@media (prefers-reduced-motion: no-preference) {\n .rz-btn:hover .rz-arrow, a:hover .rz-arrow { transform: translate(2px, -2px); }\n .rz-btn:hover .rz-arrow--fwd, a:hover .rz-arrow--fwd { transform: translateX(4px); }\n}\n.rz-card { display: flex; flex-direction: column; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.rz-card--narrow { max-width: 760px; }\n.rz-card__title { font-size: .9375rem; font-weight: 600; margin-bottom: .35rem; }\n.rz-card__meta { color: var(--text-muted); font-size: .8rem; }\n.rz-card__actions { display: flex; gap: .5rem; margin-top: auto; padding-top: .9rem; flex-wrap: wrap; }\n.rz-card__note { margin-top: .5rem; }\n.rz-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }\n.rz-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n.rz-pagehead__eyebrow { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: .3rem; }\n.rz-pagehead h1 { font-size: 1.375rem; font-weight: 600; }\n.rz-pagehead__sub { color: var(--text-secondary); font-size: .85rem; margin-top: .25rem; }\n.rz-pill { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; padding: .15rem .5rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text-secondary); }\n.rz-pill::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--status-neutral); }\n.rz-pill--up::before { background: var(--status-up); } .rz-pill--warn::before { background: var(--signal-warn); } .rz-pill--down::before { background: var(--status-down); }\n.rz-pill--plain::before { display: none; }\n/* ---- steps tracker ------------------------------------------------- */\n/* Dots on one rail, connectors dot-to-dot, label under each dot; left-aligned like the rest of the page. */\n.rz-steps { list-style: none; margin: 4px 0 22px; padding: 0 0 22px; display: flex; border-bottom: 1px solid var(--separator); }\n.rz-step { flex: 1; position: relative; display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 8px; min-width: 0; }\n.rz-step:last-child { flex: 0 0 auto; }\n.rz-step:not(:last-child)::after { content: \"\"; position: absolute; top: 12px; left: 26px; right: 0; height: 2px; background: var(--border); }\n.rz-step--done:not(:last-child)::after { background: var(--status-up); }\n.rz-step__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex-shrink: 0; border: 2px solid var(--border); color: var(--text-muted); background: var(--surface-1); }\n.rz-step--done .rz-step__dot { background: var(--status-up); border-color: var(--status-up); color: #fff; }\n.rz-step--active .rz-step__dot { position: relative; border-color: color-mix(in srgb, var(--signal) 30%, transparent); color: var(--signal); }\n/* A spinning arc over the ring: the step is working, not waiting on you. */\n.rz-step--active .rz-step__dot::after { content: \"\"; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--signal); animation: rz-spin .9s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .rz-step--active .rz-step__dot::after { animation: none; border-color: var(--signal); } }\n@keyframes rz-spin { to { transform: rotate(360deg); } }\n.rz-step--failed .rz-step__dot { background: var(--status-down); border-color: var(--status-down); color: #fff; }\n.rz-step__text { display: flex; flex-direction: column; gap: 1px; padding-right: 16px; }\n.rz-step__label { font-size: .875rem; font-weight: 500; color: var(--text-secondary); }\n.rz-step--active .rz-step__label, .rz-step--done .rz-step__label { color: var(--text-primary); }\n.rz-step--failed .rz-step__label { color: var(--status-down); }\n.rz-step__note { font-size: .75rem; color: var(--text-muted); }\n@keyframes rz-pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); } 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--signal) 8%, transparent); } }\n.rz-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 20px; }\n.rz-actions__hint { font-size: .8rem; color: var(--text-muted); }\n.rz-notice { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-1); margin-bottom: 18px; font-size: .9rem; }\n.rz-notice__text { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n.rz-status-link { text-decoration: none; }\n.rz-discard { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--separator); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .85rem; color: var(--text-secondary); }\n.rz-discard__link { background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-discard__link:hover { color: var(--status-down); }\n.rz-nowrap { white-space: nowrap; }\n.rz-table td.rz-fit, .rz-table th.rz-fit { width: 1%; white-space: nowrap; }\n.rz-empty { border: 1px dashed var(--border); border-radius: 8px; padding: 32px; text-align: center; color: var(--text-secondary); }\n.rz-empty h3 { font-size: 1rem; margin-bottom: .4rem; }\n.rz-table-wrap { width: 100%; }\n.rz-table { width: 100%; border-collapse: collapse; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\n.rz-table th, .rz-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--separator); font-size: .875rem; vertical-align: top; }\n.rz-table th { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); background: var(--surface-2); }\n.rz-table tr:last-child td { border-bottom: 0; }\n.rz-muted { color: var(--text-muted); }\n.rz-alert { border: 1px solid var(--status-down); color: var(--status-down); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n.rz-ok { border: 1px solid var(--status-up); color: var(--signal-dim); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n\n/* ---- account menu --------------------------------------------------- */\n.rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }\n.rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }\n.rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }\n.rz-tabs__tab:hover { color: var(--text-primary); }\n.rz-tabs__tab[aria-selected=\"true\"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }\n.rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }\n.rz-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); color: var(--text-primary); font-size: .6875rem; font-weight: 600; letter-spacing: .04em; display: flex; align-items: center; justify-content: center; cursor: pointer; font-family: inherit; padding: 0; overflow: hidden; }\n.rz-menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 15rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(14,23,38,.14); overflow: hidden; z-index: 50; }\n.rz-menu__who { padding: .75rem .9rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }\n.rz-menu__name { font-weight: 600; font-size: .875rem; }\n.rz-menu__email { color: var(--text-muted); font-size: .75rem; word-break: break-all; }\n.rz-menu__sep { height: 1px; background: var(--border); margin: .3rem 0; }\n.rz-menu__item { display: flex; align-items: center; gap: .55rem; width: 100%; padding: .45rem .9rem; font: inherit; font-size: .8125rem; color: var(--text-secondary); background: none; border: 0; text-align: left; cursor: pointer; text-decoration: none; }\n.rz-menu__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-menu__item svg { flex-shrink: 0; }\n.rz-menu__item--static { cursor: default; }\n.rz-menu__item--static:hover { background: none; color: var(--text-secondary); }\n.rz-menu__item .rz-menu__end { margin-left: auto; }\n.rz-menu__signout { margin: 0 0 .3rem; }\n.rz-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--rz-radius); overflow: hidden; }\n.rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }\n.rz-seg button[aria-pressed=\"true\"] { background: var(--surface-3); color: var(--text-primary); }\n\n/* ---- mobile: sidebar becomes a strip under the top bar --------------- */\n@media (max-width: 720px) {\n .rz-body { flex-direction: column; }\n .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }\n .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }\n .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }\n .rz-sidebar--collapsed .rz-sidebar__label { display: block; }\n .rz-sidebar__collapse { display: none; }\n .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }\n .rz-topbar__greeting { display: none; }\n .rz-content { padding: 18px 14px 60px; }\n /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */\n .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }\n .rz-sidebar__item--disabled { display: none; }\n /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */\n .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }\n .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }\n /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */\n .rz-admin .realiiz-md__head { padding: 5px; }\n .rz-admin .realiiz-md__insert { border-left: 0; padding-left: 0; margin-left: 0; }\n .rz-admin .realiiz-md__lab { display: none; }\n .rz-admin .realiiz-md--fs { padding: 8px; }\n /* Tracker: notes hide, labels shrink, so three steps fit a phone. */\n .rz-step__note { display: none; }\n .rz-step__label { font-size: .8rem; }\n .rz-step:not(:last-child)::after { right: 6px; }\n /* Tables scroll sideways inside their own box instead of stretching the page. */\n .rz-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n .rz-pagehead { align-items: flex-start; flex-direction: column; }\n .rz-notice { flex-direction: column; align-items: flex-start; }\n .rz-card--narrow { max-width: none; }\n}\n\n/* ---- forms extras: markdown editor, chips, gauges, preview prose --------- */\n.rz-admin .realiiz-md { --_md-head: var(--surface-2); --_md-hover: var(--surface-2); --_md-hover-line: var(--signal-glow); --_md-on: color-mix(in srgb, var(--signal) 12%, var(--surface-1)); --_md-tip: var(--ink); }\n.rz-admin .realiiz-md__mode { background: var(--surface-2); }\n.rz-admin .realiiz-md__mode button { color: var(--text-secondary); }\n.rz-admin .realiiz-md__mode button[aria-selected=\"true\"] { background: var(--surface-1); color: var(--text-primary); box-shadow: 0 1px 2px rgba(14,23,38,.12); }\n.rz-admin .realiiz-md__panel, .rz-admin .realiiz-md__tgrid, .rz-admin .realiiz-md--fs, .rz-admin .realiiz-md .realiiz-md__ta, .rz-admin .realiiz-md__preview, .rz-admin .realiiz-md__head button { background: var(--surface-1); }\n.rz-admin .realiiz-md__head { background: var(--surface-2); }\n.rz-admin .realiiz-md__head button { color: var(--text-primary); }\n.rz-admin .realiiz-md__insert button { background: var(--surface-2); color: var(--text-secondary); }\n.rz-admin .realiiz-md__tgcells i { background: var(--surface-1); }\n.rz-admin .realiiz-md__tgcells i.hot { background: color-mix(in srgb, var(--signal) 18%, var(--surface-1)); }\n.rz-admin .realiiz-md__loading { color: var(--text-muted); font-size: .8rem; }\n.rz-admin .realiiz-prose { max-width: 68ch; font-size: 1rem; line-height: 1.65; color: var(--text-primary); }\n.rz-admin .realiiz-prose h1, .rz-admin .realiiz-prose h2, .rz-admin .realiiz-prose h3 { font-family: var(--rz-font-display); line-height: 1.25; margin: 1.4em 0 .5em; }\n.rz-admin .realiiz-prose h2 { font-size: 1.35rem; } .rz-admin .realiiz-prose h3 { font-size: 1.1rem; }\n.rz-admin .realiiz-prose p, .rz-admin .realiiz-prose ul, .rz-admin .realiiz-prose ol, .rz-admin .realiiz-prose blockquote { margin: 0 0 1em; }\n.rz-admin .realiiz-prose a { color: var(--signal); }\n/* The site's prose class picks a slate body colour for a light page; on the dark surface that reads as disabled. */\n.rz-admin[data-theme=\"dark\"] .realiiz-prose, .rz-admin[data-theme=\"dark\"] .realiiz-prose :is(p, li, td, th, dd, dt, figcaption, strong, b, em, i, h1, h2, h3, h4, h5, h6) { color: var(--text-primary); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose :is(code, kbd) { color: var(--text-primary); background: var(--surface-3); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose a { color: var(--signal-dim); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose hr { border-color: var(--border); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose blockquote { color: var(--text-secondary); }\n.rz-admin .realiiz-prose blockquote { border-left: 3px solid var(--border); padding-left: 1em; color: var(--text-secondary); }\n.rz-admin .realiiz-prose code { background: var(--surface-2); padding: 0 4px; border-radius: 4px; font-family: var(--rz-font-mono); font-size: .9em; }\n.rz-admin .realiiz-prose pre { background: var(--surface-2); padding: 12px 14px; border-radius: 6px; overflow-x: auto; }\n.rz-admin .realiiz-prose img { max-width: 100%; height: auto; border-radius: 6px; }\n.rz-admin .realiiz-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 40px; padding: 5px 8px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--rz-radius); }\n.rz-admin .realiiz-chips:focus-within { border-color: var(--signal); box-shadow: var(--realiiz-form-focus-ring); }\n.rz-admin .realiiz-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; color: var(--text-primary); }\n.rz-admin .realiiz-chip button { font: inherit; line-height: 1; width: 18px; height: 18px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; }\n.rz-admin .realiiz-chip button:hover { background: var(--status-down); color: #fff; }\n.rz-admin .realiiz-chips__input { flex: 1; min-width: 120px; border: 0; background: transparent; font: inherit; color: inherit; outline: none; padding: 4px; }\n.rz-admin .realiiz-chips__count { margin-left: auto; color: var(--text-muted); font-size: .75rem; font-variant-numeric: tabular-nums; }\n.rz-admin .realiiz-gauge { color: var(--text-muted); }\n.rz-admin .realiiz-gauge__bar { background: var(--surface-3); }\n.rz-admin .realiiz-gauge__zone { background: color-mix(in srgb, var(--status-up) 28%, transparent); }\n.rz-admin .realiiz-gauge__fill { background: var(--text-muted); }\n.rz-admin .realiiz-gauge--ok .realiiz-gauge__fill { background: var(--status-up); } .rz-admin .realiiz-gauge--ok { color: var(--status-up); }\n.rz-admin .realiiz-gauge--over .realiiz-gauge__fill { background: var(--status-down); } .rz-admin .realiiz-gauge--over { color: var(--status-down); }\n`;\n","/**\n * AdminShell — the frame every /admin page renders inside.\n *\n * Pure presentation: the host passes the session, the nav (from the registry)\n * and the current path. No env, no fetch, no router import. Tokens are\n * injected once via <style>; a site overrides them on `.rz-admin`.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ShellUser } from \"./AccountMenu\";\nimport { Sidebar, type NavItem } from \"./Sidebar\";\nimport { TopBar } from \"./TopBar\";\nimport { useTheme, type Theme } from \"./ThemeToggle\";\nimport { SHELL_CSS } from \"./tokens\";\n\nexport interface AdminShellProps {\n siteName: string;\n /** What the product is called in the top bar, e.g. \"Realiiz Studio\". Default \"Studio\" (shown as \"{siteName} Studio\"). */\n productName?: string;\n logoUrl?: string | null;\n /** null when nobody is signed in (sign-in page, not-configured page). */\n user: ShellUser | null;\n role: string | null;\n nav: NavItem[];\n /** Items pinned above Collapse (Settings), so they stay put as sections are added. */\n pinnedNav?: NavItem[];\n /** The current pathname, for the active nav item. */\n activeHref: string;\n /** Default \"/admin\". */\n basePath?: string;\n /** Default `${basePath}/auth/signout`. */\n signOutPath?: string;\n /** Account page for the avatar menu. Default `${basePath}/account`; null hides the item. */\n accountHref?: string | null;\n /** Help centre for the avatar menu. Default `${basePath}/help`; null hides the item. */\n helpHref?: string | null;\n /**\n * The client's own branding (Business tab). `name` replaces siteName in the top bar\n * and `logoUrl` replaces the logo; the product word (\"Studio\") stays.\n */\n branding?: { name?: string | null; logoUrl?: string | null } | null;\n defaultTheme?: Theme;\n children: ReactNode;\n}\n\nexport function AdminShell({\n siteName, productName = \"Studio\", logoUrl, user, role, nav, pinnedNav, activeHref,\n basePath = \"/admin\", signOutPath, accountHref, helpHref, branding, defaultTheme = \"light\", children,\n}: AdminShellProps) {\n const [theme, setTheme] = useTheme(defaultTheme);\n const showNav = Boolean(user && role);\n const shownName = branding?.name?.trim() || siteName;\n const shownLogo = branding?.logoUrl || logoUrl;\n\n return (\n <div className=\"rz-admin\" data-theme={theme}>\n <style>{SHELL_CSS}</style>\n <TopBar\n siteName={shownName}\n productName={productName}\n logoUrl={shownLogo}\n homeHref={basePath}\n user={user}\n role={role}\n theme={theme}\n onTheme={setTheme}\n signOutPath={signOutPath ?? `${basePath}/auth/signout`}\n accountHref={accountHref === null ? undefined : (accountHref ?? `${basePath}/account`)}\n helpHref={helpHref === null ? undefined : (helpHref ?? `${basePath}/help`)}\n />\n <div className=\"rz-body\">\n {showNav && <Sidebar items={nav} pinned={pinnedNav} activeHref={activeHref} basePath={basePath} />}\n <main className=\"rz-main\">\n <div className=\"rz-content\">{children}</div>\n </main>\n </div>\n </div>\n );\n}\n","/**\n * The one source of button styling (the tracker's rule: hand-rolled buttons\n * drift). Classes only — everything resolves to tokens in SHELL_CSS.\n */\n\nimport type { AnchorHTMLAttributes, ButtonHTMLAttributes } from \"react\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\";\n\nexport function buttonClass(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\", extra?: string): string {\n return [\"rz-btn\", `rz-btn--${variant}`, `rz-btn--${size}`, extra].filter(Boolean).join(\" \");\n}\n\n/** Kept for parity with the tracker's API; returns the class string to spread onto an <a>. */\nexport function buttonStyle(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\") {\n return { className: buttonClass(variant, size) };\n}\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nexport function Button({ variant = \"secondary\", size = \"md\", className, type = \"button\", ...rest }: ButtonProps) {\n return <button type={type} className={buttonClass(variant, size, className)} {...rest} />;\n}\n\ninterface LinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Opens elsewhere (GitHub, the live site): new tab + the outbound arrow that lifts on hover, like realiiz.com. */\n external?: boolean;\n /** Leads onward inside the app (next step): a right arrow that slides on hover, like realiiz.com's CTAs. */\n forward?: boolean;\n}\n\nexport function LinkButton({ variant = \"secondary\", size = \"md\", className, external, forward, children, ...rest }: LinkButtonProps) {\n const extra = external ? { target: \"_blank\", rel: \"noreferrer\", ...rest } : rest;\n return (\n <a className={buttonClass(variant, size, className)} {...extra}>\n {children}\n {external && <OutboundArrow />}\n {forward && !external && <ForwardArrow />}\n </a>\n );\n}\n\nexport function ForwardArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow rz-arrow--fwd\">\n <path d=\"M5 12h14\" /><path d=\"m13 6 6 6-6 6\" />\n </svg>\n );\n}\n\n/** Drawn, not the ↗ glyph — the glyph sits high in its box and never centres. */\nexport function OutboundArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow\">\n <path d=\"M7 17 17 7\" /><path d=\"M7 7h10v10\" />\n </svg>\n );\n}\n","/** Card, PageHeader, StatusPill, EmptyState, Steps — the page-level vocabulary. */\n\nimport type { ReactNode } from \"react\";\n\nexport function Card({ title, meta, note, children, actions, className }: {\n title?: ReactNode; meta?: ReactNode;\n /** A short status line under the meta — a pill, a count — kept out of `meta` so long text never pushes the actions around. */\n note?: ReactNode;\n children?: ReactNode; actions?: ReactNode; className?: string;\n}) {\n return (\n <div className={[\"rz-card\", className].filter(Boolean).join(\" \")}>\n {title && <div className=\"rz-card__title\">{title}</div>}\n {meta && <div className=\"rz-card__meta\">{meta}</div>}\n {note && <div className=\"rz-card__note\">{note}</div>}\n {children}\n {actions && <div className=\"rz-card__actions\">{actions}</div>}\n </div>\n );\n}\n\nexport function PageHeader({ eyebrow, title, subtitle, actions }: {\n eyebrow?: ReactNode; title: ReactNode; subtitle?: ReactNode; actions?: ReactNode;\n}) {\n return (\n <div className=\"rz-pagehead\">\n <div>\n {eyebrow && <div className=\"rz-pagehead__eyebrow\">{eyebrow}</div>}\n <h1>{title}</h1>\n {subtitle && <div className=\"rz-pagehead__sub\">{subtitle}</div>}\n </div>\n {actions && <div className=\"rz-card__actions\" style={{ marginTop: 0 }}>{actions}</div>}\n </div>\n );\n}\n\nexport type PillTone = \"up\" | \"warn\" | \"down\" | \"neutral\" | \"plain\";\n\nexport function StatusPill({ tone = \"neutral\", children, title }: { tone?: PillTone; children: ReactNode; title?: string }) {\n return <span className={`rz-pill rz-pill--${tone}`} title={title}>{children}</span>;\n}\n\nexport function EmptyState({ title, children, action }: { title: ReactNode; children?: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"rz-empty\">\n <h3>{title}</h3>\n {children && <div>{children}</div>}\n {action && <div style={{ marginTop: 14 }}>{action}</div>}\n </div>\n );\n}\n\nexport type StepState = \"done\" | \"active\" | \"todo\" | \"failed\";\n\n/**\n * A short horizontal progress tracker: Saved → Checking → Live. One state per\n * step; the active one gets the pulse. Small enough to sit at the top of a card.\n */\nexport function Steps({ steps }: { steps: { label: ReactNode; state: StepState; note?: ReactNode }[] }) {\n return (\n <ol className=\"rz-steps\" aria-label=\"Progress\">\n {steps.map((st, i) => (\n <li key={i} className={`rz-step rz-step--${st.state}`} aria-current={st.state === \"active\" ? \"step\" : undefined}>\n <span className=\"rz-step__dot\" aria-hidden=\"true\">{st.state === \"done\" ? \"✓\" : st.state === \"failed\" ? \"!\" : i + 1}</span>\n <span className=\"rz-step__text\">\n <span className=\"rz-step__label\">{st.label}</span>\n {st.note && <span className=\"rz-step__note\">{st.note}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n","/**\n * Tabs — which SECTION of this page am I on (Account: My Profile · Change\n * Password · Team · Business). Underlined strip, same as the visibility\n * tracker's: five two-word labels stay on one line where pills would wrap.\n * Not for choosing a value or filtering — that is a segmented control.\n * Keyboard: Left/Right (and Home/End) move between tabs.\n */\n\nimport { useRef, type KeyboardEvent } from \"react\";\n\nexport interface TabOption {\n value: string;\n label: string;\n /** A small marker after the label — a count, an unsaved dot. Keep it short. */\n suffix?: string;\n}\n\nexport function Tabs({ options, value, onChange, label = \"Sections\" }: {\n options: TabOption[];\n value: string;\n onChange: (value: string) => void;\n label?: string;\n}) {\n const list = useRef<HTMLDivElement>(null);\n\n const onKey = (e: KeyboardEvent<HTMLDivElement>) => {\n const i = options.findIndex((o) => o.value === value);\n if (i < 0) return;\n let next = i;\n if (e.key === \"ArrowRight\") next = (i + 1) % options.length;\n else if (e.key === \"ArrowLeft\") next = (i - 1 + options.length) % options.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = options.length - 1;\n else return;\n e.preventDefault();\n onChange(options[next].value);\n (list.current?.children[next] as HTMLElement | undefined)?.focus();\n };\n\n return (\n <div ref={list} className=\"rz-tabs\" role=\"tablist\" aria-label={label} onKeyDown={onKey}>\n {options.map((o) => {\n const active = o.value === value;\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"tab\"\n className=\"rz-tabs__tab\"\n aria-selected={active}\n tabIndex={active ? 0 : -1}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n {o.suffix && <span className=\"rz-muted\"> {o.suffix}</span>}\n </button>\n );\n })}\n </div>\n );\n}\n","/** Studio's page styles (lists, account tabs, drop zones) — injected once by StudioShellFrame. */\n\nexport const STUDIO_CSS = `\n/*\n * /admin — overrides only. Layout, colour and components come from\n * @realiizlabs/admin/shell (SHELL_CSS, injected by AdminShell). The Realiiz\n * palette is the package default, so this file just maps the shell's font\n * hooks onto the site's loaded fonts. To rebrand, redeclare tokens here:\n * .rz-admin { --signal: #0a58ca; }\n */\n.rz-admin {\n --rz-font: var(--font-inter), system-ui, sans-serif;\n --rz-font-display: var(--font-space-grotesk), system-ui, sans-serif;\n --rz-font-mono: var(--font-jetbrains-mono), ui-monospace, monospace;\n}\n\n/* Posts table: one wide column for the post (title, slug beneath in small mono) and\n tight fixed columns for the known-width bits. Nothing wraps; the title and slug end in\n an ellipsis with the full text as tooltip. The title opens the live post; the outbound\n arrow sits inline after it and appears on hover (the shell's a:hover .rz-arrow motion). */\n.rz-admin .rz-table--posts { table-layout: fixed; width: 100%; }\n.rz-admin .rz-table--posts td, .rz-admin .rz-table--posts th { white-space: nowrap; overflow: hidden; }\n.rz-admin .rz-col-title { width: auto; }\n.rz-admin .rz-col-date { width: 7.5rem; }\n.rz-admin .rz-col-status { width: 11.5rem; }\n.rz-admin .rz-col-actions { width: 8.5rem; }\n.rz-admin .rz-title-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.rz-admin .rz-slug { font-family: var(--rz-font-mono); font-size: .78rem; margin-top: .2rem; }\n.rz-admin [data-slugs=\"off\"] .rz-slug { display: none; }\n.rz-admin .rz-toolbar { display: flex; justify-content: flex-end; margin: 0 0 .6rem; }\n.rz-admin .rz-switch { display: inline-flex; align-items: center; gap: .55rem; font-size: .8rem; color: var(--text-secondary); cursor: pointer; user-select: none; }\n.rz-admin .rz-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; }\n.rz-admin .rz-switch__track { position: relative; width: 30px; height: 18px; border-radius: 999px; background: var(--surface-3); transition: background .15s; }\n.rz-admin .rz-switch__thumb { position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.25); transition: transform .15s; }\n.rz-admin .rz-switch input:checked + .rz-switch__track { background: var(--signal); }\n.rz-admin .rz-switch input:checked + .rz-switch__track .rz-switch__thumb { transform: translateX(12px); }\n.rz-admin .rz-switch input:focus-visible + .rz-switch__track { outline: 2px solid var(--signal); outline-offset: 2px; }\n.rz-admin .rz-switch:hover .rz-switch__label { color: var(--text-primary); }\n.rz-admin .rz-title-link { display: flex; align-items: center; gap: .35em; max-width: 100%; color: inherit; text-decoration: none; }\n.rz-admin .rz-title-link .rz-arrow { opacity: 0; }\n.rz-admin .rz-title-link:hover { color: var(--signal); }\n.rz-admin .rz-title-link:hover .rz-arrow { opacity: 1; }\n@media (max-width: 720px) {\n .rz-admin .rz-col-status { width: 9rem; }\n .rz-admin .rz-col-actions { width: 6rem; }\n}\n\n/* Dashboard card for a section that isn't built yet: the real card, faded, buttons disabled. */\n/* Account page (05b): tracker-style — H1, email, underlined tabs, stacked form cards. */\n.rz-admin .acct-h1 { font-size: 1.25rem; font-weight: 600; margin: 0 0 .25rem; color: var(--text-primary); }\n.rz-admin .acct-email { font-size: .875rem; color: var(--text-muted); margin: 0 0 1.25rem; }\n.rz-admin .acct-stack { display: flex; flex-direction: column; gap: 1rem; max-width: 560px; }\n.rz-admin .acct-stack:has(.acct-team) { max-width: none; }\n.rz-admin .acct-card { display: flex; flex-direction: column; gap: .9rem; }\n.rz-admin .acct-title { font-size: 1rem; font-weight: 600; margin: 0; color: var(--text-primary); }\n.rz-admin .acct-blurb { font-size: .875rem; color: var(--text-secondary); margin: -.4rem 0 0; line-height: 1.5; }\n.rz-admin .acct-field { display: flex; flex-direction: column; gap: .35rem; }\n.rz-admin .acct-label { font-size: .85rem; font-weight: 500; color: var(--text-primary); }\n.rz-admin .acct-hint { font-size: .78rem; color: var(--text-muted); }\n.rz-admin .acct-input { font: inherit; font-size: .9rem; color: var(--text-primary); background: var(--surface-0); border: 1px solid var(--border); border-radius: 6px; padding: 9px 11px; min-height: 40px; width: 100%; }\n.rz-admin .acct-input:read-only { color: var(--text-secondary); background: var(--surface-2); }\n.rz-admin .acct-input:focus-visible { outline: 2px solid var(--signal); outline-offset: 1px; }\n.rz-admin .acct-select { width: auto; padding-right: 2rem; }\n.rz-admin .acct-select--sm { min-height: 32px; padding: 4px 28px 4px 8px; font-size: .8rem; }\n.rz-admin .acct-actions { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; }\n.rz-admin .acct-ok { font-size: .85rem; color: var(--signal); }\n.rz-admin .acct-link { font: inherit; font-size: .82rem; background: none; border: 0; padding: 0; color: var(--text-secondary); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-admin .acct-link:hover { color: var(--signal); }\n.rz-admin .acct-link--danger:hover { color: #c0392b; }\n.rz-admin .acct-link:disabled { opacity: .5; cursor: default; }\n.rz-admin .acct-team-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }\n.rz-admin .acct-invite__row { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; }\n.rz-admin .acct-invite__row .acct-input[type=\"email\"] { flex: 1 1 220px; width: auto; }\n.rz-admin .acct-person { display: flex; align-items: center; gap: .7rem; }\n.rz-admin .acct-person__avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); display: inline-flex; align-items: center; justify-content: center; font-size: .7rem; font-weight: 600; overflow: hidden; flex-shrink: 0; }\n.rz-admin .acct-person__avatar img { width: 100%; height: 100%; object-fit: cover; }\n.rz-admin .acct-person__text { display: flex; flex-direction: column; line-height: 1.25; }\n.rz-admin .acct-person__email { font-size: .78rem; }\n.rz-admin .acct-row-actions { display: flex; gap: .8rem; align-items: center; white-space: nowrap; min-height: 34px; }\n.rz-admin .acct-help-list { margin: 0; padding-left: 1.2rem; color: var(--text-secondary); line-height: 1.7; }\n\n/* Sign-in: the password option under the magic-link form. */\n.rz-admin .pwsi-toggle { margin: 1.1rem 0 0; text-align: center; }\n.rz-admin .pwsi { display: flex; flex-direction: column; gap: .9rem; margin-top: 1.25rem; padding-top: 1.25rem; border-top: 1px solid var(--separator); }\n\n/* Password boxes: eye toggle + the requirement checklist that lights up as each rule passes. */\n.rz-admin .acct-pw { position: relative; }\n.rz-admin .acct-pw .acct-input { padding-right: 2.6rem; }\n.rz-admin .acct-pw__eye { position: absolute; right: .5rem; top: 50%; transform: translateY(-50%); background: none; border: 0; padding: .35rem; color: var(--text-muted); cursor: pointer; display: inline-flex; border-radius: 4px; }\n.rz-admin .acct-pw__eye:hover, .rz-admin .acct-pw__eye[aria-pressed=\"true\"] { color: var(--text-secondary); }\n.rz-admin .acct-rules { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }\n.rz-admin .acct-rule { display: flex; align-items: center; gap: .5rem; font-size: .8125rem; color: var(--text-muted); transition: color .15s; }\n.rz-admin .acct-rule--met { color: var(--signal); }\n\n/* Picture uploader (avatar, logo, favicon): one grid everywhere — preview | buttons row, hint under the buttons. */\n.rz-admin .acct-pic { border: 1px dashed var(--border); border-radius: 8px; padding: 16px 18px; background: var(--surface-0); outline: none; transition: border-color .15s; }\n.rz-admin .acct-pic:focus-visible, .rz-admin .acct-pic--over { border-color: var(--signal); border-style: solid; }\n.rz-admin .acct-pic--busy { opacity: .7; }\n.rz-admin .acct-pic__file { display: none; }\n.rz-admin .acct-pic__empty { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; color: var(--text-muted); }\n.rz-admin .acct-pic__fallback { width: 44px; height: 44px; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; border-radius: 8px; background: var(--surface-3); color: var(--text-muted); font-size: .9rem; font-weight: 600; letter-spacing: .04em; }\n.rz-admin .acct-pic__fallback--circle { border-radius: 50%; }\n.rz-admin .acct-pic__or { font-size: .8125rem; }\n.rz-admin .acct-pic__has { display: flex; align-items: flex-start; gap: 16px; }\n.rz-admin .acct-pic__thumb { display: block; width: 96px; height: 96px; object-fit: cover; border-radius: 8px; border: 1px solid var(--border); background: var(--surface-3); flex-shrink: 0; }\n.rz-admin .acct-pic__thumb--circle { border-radius: 50%; }\n.rz-admin .acct-pic__meta { display: flex; flex-direction: column; gap: 10px; min-width: 0; }\n.rz-admin .acct-pic__actions { display: flex; align-items: center; gap: 14px; }\n.rz-admin .acct-pic__remove { font: inherit; font-size: .8125rem; background: none; border: 0; padding: 0; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-admin .acct-pic__remove:hover { color: #c0392b; }\n.rz-admin .acct-pic__remove:disabled { cursor: default; opacity: .6; }\n.rz-admin .acct-pic__hint { margin: 10px 0 0; font-size: .75rem; color: var(--text-muted); line-height: 1.4; }\n.rz-admin .acct-pic__has .acct-pic__hint { margin-top: 0; }\n.rz-admin .acct-pic__note { margin: 8px 0 0; }\n.rz-admin .acct-pic__error { margin: 8px 0 0; font-size: .8rem; color: #c0392b; }\n\n/* Branded dropdown (role pickers): a bordered button that opens the shell's menu, checkmark on the current choice. */\n.rz-admin .acct-dd { position: relative; display: inline-block; }\n.rz-admin .acct-dd__btn { display: inline-flex; align-items: center; gap: .5rem; font: inherit; font-size: .85rem; color: var(--text-primary); background: var(--surface-0); border: 1px solid var(--border); border-radius: 6px; padding: 0 .7rem; height: 34px; cursor: pointer; }\n.rz-admin .acct-dd__btn:hover { border-color: var(--text-muted); }\n.rz-admin .acct-dd__btn:focus-visible { outline: 2px solid var(--signal); outline-offset: 1px; }\n.rz-admin .acct-dd__btn:disabled { opacity: .6; cursor: default; }\n.rz-admin .acct-dd__menu { left: 0; right: auto; min-width: 15rem; padding: .3rem 0; }\n.rz-admin .acct-dd__item { align-items: flex-start; }\n.rz-admin .acct-dd__check { width: 1rem; flex-shrink: 0; color: var(--signal); font-weight: 700; }\n.rz-admin .acct-dd__text { display: flex; flex-direction: column; line-height: 1.3; }\n.rz-admin .acct-dd__hint { font-size: .74rem; color: var(--text-muted); }\n/* Team table: everything on one centre line, and the role menu may overflow the table (the shell\n clips .rz-table for rounded corners, so round the header cells by hand instead). */\n.rz-admin .acct-team { overflow: visible; }\n.rz-admin .acct-team thead th:first-child { border-top-left-radius: 8px; }\n.rz-admin .acct-team thead th:last-child { border-top-right-radius: 8px; }\n.rz-admin .acct-team tbody tr:last-child td { border-bottom: 0; }\n.rz-admin .acct-team td { vertical-align: middle; }\n.rz-admin .acct-team td > * { vertical-align: middle; }\n.rz-admin .acct-team .rz-pill { position: relative; top: 0; }\n.rz-admin .acct-dd__menu { z-index: 60; }\n.rz-admin .acct-invite__row .acct-dd__btn { height: 40px; }\n\n.rz-admin .rz-term { position: relative; display: inline; }\n.rz-admin .rz-term__word { cursor: help; text-decoration: underline dotted; text-underline-offset: 4px; text-decoration-color: color-mix(in srgb, currentColor 50%, transparent); }\n.rz-admin .rz-term__word:hover, .rz-admin .rz-term__word:focus-visible { text-decoration-color: var(--signal); outline: none; }\n.rz-admin .rz-term__tip { position: absolute; left: 0; top: calc(100% + 8px); z-index: 70; width: 272px; max-width: 80vw; padding: 12px 14px; border-radius: 8px; background: var(--text-primary); color: var(--surface-0); font-size: .8125rem; line-height: 1.4; font-weight: 400; box-shadow: 0 8px 24px rgba(14,23,38,.18); opacity: 0; pointer-events: none; transition: opacity .15s; }\n.rz-admin .rz-term__tip--open { opacity: 1; }\n`;\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { AdminShell, type NavItem, type ShellUser } from \"../shell\";\nimport { STUDIO_CSS } from \"./css\";\n\n/**\n * The frame every Studio page sits in: the shell with the current path for the\n * active nav item, plus Studio's page styles injected once. Session, nav and\n * branding arrive as props from the site's server layout.\n */\nexport function StudioShellFrame({ siteName, logoUrl, user, role, nav, pinnedNav, branding, children }: {\n siteName: string;\n logoUrl?: string | null;\n user: ShellUser | null;\n role: string | null;\n nav: NavItem[];\n pinnedNav?: NavItem[];\n branding?: { name?: string | null; logoUrl?: string | null } | null;\n children: React.ReactNode;\n}) {\n const pathname = usePathname() ?? \"/admin\";\n return (\n <>\n <style>{STUDIO_CSS}</style>\n <AdminShell siteName={siteName} logoUrl={logoUrl ?? undefined} user={user} role={role} nav={nav} pinnedNav={pinnedNav} branding={branding} accountHref={null} activeHref={pathname}>\n {children}\n </AdminShell>\n </>\n );\n}\n","/**\n * Theming hooks, same convention as BookingWidget: a root class, BEM elements,\n * and --realiiz-form-* custom properties with fallbacks so the form is usable\n * with zero host CSS and fully themeable with a dozen variables.\n */\n\nexport const FORM_CSS = `\n.realiiz-form{\n --_fg:var(--realiiz-form-fg,#111);\n --_muted:var(--realiiz-form-muted,#666);\n --_border:var(--realiiz-form-border,#cfcfcf);\n --_accent:var(--realiiz-form-accent,#111);\n --_accent-fg:var(--realiiz-form-accent-fg,#fff);\n --_danger:var(--realiiz-form-danger,#b3261e);\n --_radius:var(--realiiz-form-radius,6px);\n --_font:var(--realiiz-form-font,system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif);\n --_ring:var(--realiiz-form-focus-ring,0 0 0 3px rgba(0,0,0,.15));\n box-sizing:border-box;max-width:100%;color:var(--_fg);font-family:var(--_font);font-size:15px;line-height:1.4;\n}\n.realiiz-form *,.realiiz-form *::before,.realiiz-form *::after{box-sizing:inherit}\n.realiiz-form fieldset{border:0;margin:0 0 20px;padding:0;min-width:0}\n.realiiz-form legend{font-weight:600;font-size:13px;letter-spacing:.02em;text-transform:uppercase;color:var(--_muted);margin-bottom:12px;padding:0}\n.realiiz-form__field{display:block;margin:0 0 16px}\n.realiiz-form__label{display:block;font-weight:500;margin-bottom:6px}\n.realiiz-form__required{color:var(--_danger);margin-left:3px}\n.realiiz-form__control{display:block;width:100%;max-width:100%;font:inherit;color:inherit;background:#fff;border:1px solid var(--_border);border-radius:var(--_radius);padding:9px 11px;min-height:40px}\n.realiiz-form__control:focus{outline:none;border-color:var(--_accent);box-shadow:var(--_ring)}\n.realiiz-form__control--textarea{min-height:110px;resize:vertical}\n.realiiz-form__control--body{min-height:280px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:14px}\n.realiiz-form__control--invalid{border-color:var(--_danger)}\n.realiiz-select{position:relative}\n.realiiz-select__btn{display:flex;align-items:center;justify-content:space-between;gap:10px;text-align:left;cursor:pointer;background:#fff}\n.realiiz-select__btn svg{flex-shrink:0;color:var(--_muted);transition:transform .15s}\n.realiiz-select__btn--open{border-color:var(--_accent);box-shadow:var(--_ring)}\n.realiiz-select__btn--open svg{transform:rotate(180deg)}\n.realiiz-select__btn:disabled{opacity:.6;cursor:default}\n.realiiz-select__placeholder{color:var(--_muted)}\n.realiiz-select__menu{position:absolute;left:0;right:0;top:calc(100% + 6px);margin:0;padding:6px 0;list-style:none;background:#fff;border:1px solid var(--_border);border-radius:var(--_radius);box-shadow:0 8px 24px rgba(14,23,38,.14);max-height:260px;overflow:auto;z-index:40}\n.realiiz-select__item{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:14px;color:var(--_fg);cursor:pointer}\n.realiiz-select__item--active{background:var(--realiiz-form-hover,rgba(0,0,0,.05))}\n.realiiz-select__item--selected{font-weight:600}\n.realiiz-select__check{width:1em;flex-shrink:0;color:var(--_accent);font-weight:700}\n.realiiz-form__check{display:flex;align-items:center;gap:8px;font-weight:500}\n.realiiz-form__check input{width:18px;height:18px;margin:0}\n.realiiz-form__helper{display:flex;justify-content:space-between;gap:12px;font-size:12px;color:var(--_muted);margin-top:4px;min-height:1em}\n.realiiz-form__count{margin-left:auto;font-variant-numeric:tabular-nums}\n.realiiz-form__error{color:var(--_danger);font-size:13px;margin-top:4px}\n.realiiz-image{border:1px dashed var(--_border);border-radius:var(--_radius);padding:16px 18px;background:#fff;outline:none;transition:border-color .15s}\n.realiiz-image--over{border-color:var(--_accent);border-style:solid}\n.realiiz-image--invalid{border-color:var(--_danger)}\n.realiiz-image--busy{opacity:.7}\n.realiiz-image__empty{display:flex;align-items:center;gap:14px;flex-wrap:wrap;color:var(--_muted)}\n.realiiz-image__icon{flex-shrink:0;color:var(--_muted)}\n.realiiz-image__or{font-size:13px}\n.realiiz-image__has{display:flex;align-items:flex-start;gap:16px}\n.realiiz-image__thumb{display:block;max-height:160px;max-width:min(320px,55%);width:auto;object-fit:cover;border-radius:8px;border:1px solid var(--_border);background:#f6f8fa}\n.realiiz-image__meta{display:flex;flex-direction:column;gap:10px;min-width:0}\n.realiiz-image__detail{font-size:13px;color:var(--_muted);word-break:break-all}\n.realiiz-image__actions{display:flex;align-items:center;gap:14px}\n.realiiz-image__remove{font:inherit;font-size:13px;background:none;border:0;padding:0;color:var(--_muted);text-decoration:underline;text-underline-offset:3px;cursor:pointer}\n.realiiz-image__remove:hover{color:var(--_danger)}\n.realiiz-image__hint{font-size:12px;color:var(--_muted);margin-top:10px}\n.realiiz-image .realiiz-form__error{margin-top:8px}\n@media (max-width:720px){.realiiz-image__has{flex-direction:column}.realiiz-image__thumb{max-width:100%}}\n.realiiz-form__alert{border:1px solid var(--_danger);border-radius:var(--_radius);padding:12px 14px;margin:0 0 20px;color:var(--_danger)}\n.realiiz-form__alert ul{margin:6px 0 0;padding-left:18px}\n.realiiz-form__actions{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin-top:8px}\n.realiiz-form__help{text-decoration:underline dotted;text-decoration-color:color-mix(in srgb,currentColor 45%,transparent);text-underline-offset:4px;cursor:help}\n.realiiz-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n.realiiz-form__footer{max-width:920px}\n.realiiz-form__bar{display:flex;align-items:center;gap:10px;margin-top:16px;padding:12px 0;border-top:1px solid var(--_border);background:#fff}\n.realiiz-form__status{margin-right:auto;font-size:.85rem;color:var(--_muted)}\n.realiiz-form__bar[data-dirty] .realiiz-form__status{color:var(--_fg)}\n.realiiz-form__button{font:inherit;font-weight:600;border-radius:var(--_radius);padding:10px 16px;border:1px solid var(--_border);background:#fff;color:var(--_fg);cursor:pointer;min-height:40px}\n.realiiz-form__button--primary{background:var(--_accent);color:var(--_accent-fg);border-color:var(--_accent)}\n.realiiz-form__button:disabled{opacity:.6;cursor:default}\n.realiiz-md{--_md-head:#fafbfd;--_md-hover:#f4f8fd;--_md-hover-line:#bcd0ea;--_md-on:#eef4fb;--_md-tip:#1f2933;position:relative}\n.realiiz-md__mode{display:inline-flex;align-self:flex-start;width:max-content;gap:2px;padding:3px;background:color-mix(in srgb,var(--_border) 40%,transparent);border-radius:8px;margin-bottom:8px}\n.realiiz-md__mode button{font:inherit;font-size:.8rem;padding:5px 13px;border:0;border-radius:6px;background:transparent;color:var(--_muted);cursor:pointer}\n.realiiz-md__mode button[aria-selected=\"true\"]{background:#fff;color:var(--_fg);box-shadow:0 1px 2px rgba(0,0,0,.12)}\n.realiiz-md__panel{position:relative;z-index:0;display:flex;flex-direction:column;border:1px solid var(--_border);border-radius:10px;background:#fff;overflow:hidden}\n.realiiz-md__panel:focus-within{border-color:var(--_md-hover-line)}\n.realiiz-md__head{position:relative;z-index:5;display:flex;align-items:center;gap:2px;flex-wrap:wrap;padding:5px 7px;background:var(--_md-head);border-bottom:1px solid var(--_border);flex-shrink:0}\n.realiiz-md__tools{display:flex;align-items:center;gap:3px;flex-wrap:wrap}\n.realiiz-md__spacer{flex:1}\n.realiiz-md__head button{position:relative;min-width:31px;height:28px;padding:0 9px;display:inline-flex;align-items:center;justify-content:center;background:#fff;border:1px solid var(--_border);border-radius:6px;font-family:inherit;font-size:.82rem;color:var(--_fg);cursor:pointer;line-height:1}\n.realiiz-md__head button:hover:not(:disabled){border-color:var(--_md-hover-line);background:var(--_md-hover)}\n.realiiz-md__head button:active{background:var(--_md-on)}\n.realiiz-md__head button.on{background:var(--_md-on);border-color:var(--_accent);color:var(--_accent);font-weight:600}\n.realiiz-md__ico{width:15px;height:15px;display:block}\n.realiiz-md__dot{font-size:1.05rem;line-height:1}\n.realiiz-md__sep{width:1px;height:17px;background:var(--_border);margin:0 5px}\n.realiiz-md__insert{display:inline-flex;align-items:center;gap:3px;border-left:1px solid var(--_border);padding-left:8px;margin-left:6px}\n.realiiz-md__insert button{background:#f6f8fa;color:var(--_muted);padding:0;width:31px}\n.realiiz-md__insert button:hover{color:var(--_accent)}\n.realiiz-md__lab{font-size:.74rem;color:var(--_muted);margin-right:3px}\n.realiiz-md__head button[data-tip]::after{content:attr(data-tip);position:absolute;top:calc(100% + 6px);left:0;background:var(--_md-tip);color:#fff;font-size:.72rem;padding:4px 8px;border-radius:5px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s;z-index:20}\n.realiiz-md__head button[data-tip]:hover::after,.realiiz-md__head button[data-tip]:focus-visible::after{opacity:1}\n.realiiz-md__expand[data-tip]::after{left:auto;right:0}\n.realiiz-md__tgwrap{position:relative;display:inline-flex}\n.realiiz-md__tgrid{position:absolute;top:calc(100% + 6px);left:0;background:#fff;border:1px solid var(--_border);border-radius:9px;padding:9px;box-shadow:0 10px 28px rgba(0,0,0,.14);z-index:7;display:block}\n.realiiz-md__tgcells{display:grid;grid-template-columns:repeat(6,17px);gap:3px}\n.realiiz-md__tgcells i{width:17px;height:15px;border:1px solid var(--_border);border-radius:2px;background:#fff;cursor:pointer;display:block}\n.realiiz-md__tgcells i.hot{background:#dbe9fb;border-color:var(--_accent)}\n.realiiz-md__tglab{display:block;margin-top:8px;font-size:.74rem;color:var(--_muted);text-align:center;white-space:nowrap}\n.realiiz-md .realiiz-md__ta{flex:1 1 auto;border:0;border-radius:0;resize:vertical;background:#fff;max-width:none;padding:16px 18px;line-height:1.65}\n.realiiz-md .realiiz-md__ta:focus{outline:none;box-shadow:none}\n.realiiz-md__preview{padding:20px 24px;background:#fff}\n.realiiz-md__note{padding:4px 2px}\n.realiiz-md--fs{position:fixed;inset:0;z-index:60;background:#fff;padding:14px 22px 22px;overflow:auto;display:flex;flex-direction:column}\n.realiiz-md--fs .realiiz-md__panel{flex:1;min-height:0}\n.realiiz-md--fs .realiiz-md__ta,.realiiz-md--fs .realiiz-md__preview{flex:1;min-height:0;overflow:auto;resize:none}\n.realiiz-prose{max-width:68ch;line-height:1.65}\n.realiiz-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:40px;padding:5px 8px;background:#fff;border:1px solid var(--_border);border-radius:var(--_radius)}\n.realiiz-chips:focus-within{border-color:var(--_accent);box-shadow:var(--_ring)}\n.realiiz-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 9px;border:1px solid var(--_border);border-radius:999px;font-size:.8rem}\n.realiiz-chip button{font:inherit;line-height:1;width:18px;height:18px;border-radius:50%;border:0;background:transparent;color:var(--_muted);cursor:pointer}\n.realiiz-chips__input{flex:1;min-width:120px;border:0;background:transparent;font:inherit;color:inherit;outline:none;padding:4px}\n.realiiz-chips__count{margin-left:auto;color:var(--_muted);font-size:.75rem}\n.realiiz-gauge{display:inline-flex;align-items:center;gap:10px;font-size:.75rem;color:var(--_muted)}\n.realiiz-gauge__bar{position:relative;width:140px;height:6px;border-radius:3px;background:var(--_border);overflow:hidden}\n.realiiz-gauge__zone{position:absolute;top:0;bottom:0;background:rgba(21,128,61,.28)}\n.realiiz-gauge__fill{position:absolute;top:0;bottom:0;left:0;background:var(--_muted);border-radius:3px;transition:width .12s}\n.realiiz-gauge__text b{font-weight:600;color:inherit}\n.realiiz-gauge--ok{color:#15803d}.realiiz-gauge--ok .realiiz-gauge__fill{background:#15803d}\n.realiiz-gauge--over{color:var(--_danger)}.realiiz-gauge--over .realiiz-gauge__fill{background:var(--_danger)}\n`;\n","/**\n * MagicLinkForm — one field, one button, and the right words for each outcome.\n *\n * The audience is a non-technical client. Two outcomes matter:\n * sent → tell them where the link went and that it expires in an hour\n * uninvited → signups are off, so Supabase refuses unknown emails with a\n * \"Signups not allowed\" error. That string is a support ticket;\n * \"this email isn't set up for this site\" is not.\n *\n * `shouldCreateUser: false` restates the dashboard setting in code — the flag\n * a reviewer greps for.\n */\n\nimport { createBrowserClient } from \"@supabase/ssr\";\nimport { useMemo, useState, type FormEvent } from \"react\";\nimport { FORM_CSS } from \"../forms-ui/styles\";\n\nexport interface MagicLinkFormProps {\n url: string;\n anonKey: string;\n /** The site's callback, e.g. https://5degrees.org/admin/auth/callback?next=/admin */\n redirectTo: string;\n /** Shown in the heading: \"Sign in to {siteName}\". */\n siteName: string;\n className?: string;\n}\n\ntype State = { kind: \"idle\" } | { kind: \"sending\" } | { kind: \"sent\"; email: string } | { kind: \"error\"; message: string; uninvited: boolean };\n\nexport const UNINVITED_MESSAGE =\n \"This email address isn't set up for this site yet. Ask the site owner to send you an invite.\";\n\nexport function isUninvitedError(message: string): boolean {\n return /signups? not allowed|not allowed|user not found|invalid login/i.test(message);\n}\n\nexport function MagicLinkForm({ url, anonKey, redirectTo, siteName, className }: MagicLinkFormProps) {\n const supabase = useMemo(() => createBrowserClient(url, anonKey), [url, anonKey]);\n const [email, setEmail] = useState(\"\");\n const [state, setState] = useState<State>({ kind: \"idle\" });\n\n const submit = async (e: FormEvent) => {\n e.preventDefault();\n if (state.kind === \"sending\") return;\n const address = email.trim().toLowerCase();\n setState({ kind: \"sending\" });\n const { error } = await supabase.auth.signInWithOtp({\n email: address,\n options: { emailRedirectTo: redirectTo, shouldCreateUser: false },\n });\n if (error) {\n const uninvited = isUninvitedError(error.message);\n setState({ kind: \"error\", message: uninvited ? UNINVITED_MESSAGE : error.message, uninvited });\n return;\n }\n setState({ kind: \"sent\", email: address });\n };\n\n const root = [\"realiiz-form\", \"realiiz-signin\", className].filter(Boolean).join(\" \");\n\n if (state.kind === \"sent\") {\n return (\n <div className={root} data-realiiz-signin=\"sent\">\n <style>{FORM_CSS}</style>\n <h2 className=\"realiiz-signin__heading\">Check your email</h2>\n <p>\n We sent a sign-in link to <strong>{state.email}</strong>. It expires in an hour.\n </p>\n <button type=\"button\" className=\"realiiz-form__button\" onClick={() => setState({ kind: \"idle\" })}>\n Use a different address\n </button>\n </div>\n );\n }\n\n const sending = state.kind === \"sending\";\n const fieldError = state.kind === \"error\" && !state.uninvited ? state.message : null;\n\n return (\n <form className={root} onSubmit={submit} noValidate data-realiiz-signin=\"form\">\n <style>{FORM_CSS}</style>\n <h2 className=\"realiiz-signin__heading\">Sign in to {siteName}</h2>\n\n {state.kind === \"error\" && state.uninvited && (\n <div className=\"realiiz-form__alert\" role=\"alert\">{state.message}</div>\n )}\n\n <div className=\"realiiz-form__field\">\n <label className=\"realiiz-form__label\" htmlFor=\"realiiz-signin-email\">Email address</label>\n <input\n id=\"realiiz-signin-email\"\n className={[\"realiiz-form__control\", fieldError && \"realiiz-form__control--invalid\"].filter(Boolean).join(\" \")}\n type=\"email\"\n name=\"email\"\n autoComplete=\"email\"\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? \"realiiz-signin-email-error\" : undefined}\n />\n {fieldError && (\n <div className=\"realiiz-form__error\" id=\"realiiz-signin-email-error\">{fieldError}</div>\n )}\n </div>\n\n <div className=\"realiiz-form__actions\">\n <button type=\"submit\" className=\"realiiz-form__button realiiz-form__button--primary\" disabled={sending || email.trim() === \"\"}>\n {sending ? \"Sending…\" : \"Send me a sign-in link\"}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * SignOutButton — a plain POST form. No JavaScript needed, so it works before\n * hydration and inside a server component. The site's route (ADMIN-04) calls\n * signOut() from @realiizlabs/admin/auth and redirects.\n */\n\nexport interface SignOutButtonProps {\n /** Default \"/admin/auth/signout\". */\n actionPath?: string;\n className?: string;\n label?: string;\n}\n\nexport function SignOutButton({ actionPath = \"/admin/auth/signout\", className, label = \"Sign out\" }: SignOutButtonProps) {\n return (\n <form method=\"post\" action={actionPath} className={[\"realiiz-signout\", className].filter(Boolean).join(\" \")}>\n <button type=\"submit\" className=\"realiiz-form__button\">{label}</button>\n </form>\n );\n}\n","\"use client\";\n\nimport { SignOutButton } from \"../auth-ui\";\nimport { Card, PageHeader } from \"../shell\";\n\nexport function StudioNotConfigured() {\n return (\n <>\n <PageHeader eyebrow=\"Setup\" title=\"Studio isn't configured on this deployment\" />\n <Card>\n <p style={{ margin: 0 }}>\n Set the variables listed in <code>.env.example</code> under “Studio”. Nothing else on the site is affected.\n </p>\n </Card>\n </>\n );\n}\n\nexport function StudioNoAccess({ actual }: { actual: string | null }) {\n return (\n <>\n <PageHeader eyebrow=\"Access\" title=\"No access to this site\" />\n <Card actions={<SignOutButton />}>\n <p style={{ margin: 0 }}>\n You're signed in, but this account isn't set up to publish here\n {actual ? ` (current role: ${actual})` : \"\"}. Ask the site owner for an invite.\n </p>\n </Card>\n </>\n );\n}\n","\"use client\";\n\n/**\n * A plain-English definition on hover / focus / tap. Kept deliberately small —\n * the public sites have their own richer tooltips; Studio needs one that works\n * everywhere with no site CSS.\n */\n\nimport { useId, useState, type ReactNode } from \"react\";\n\nexport function StudioTerm({ children, definition }: { children: ReactNode; definition: string }) {\n const [open, setOpen] = useState(false);\n const id = useId();\n return (\n <span className=\"rz-term\" onMouseEnter={() => setOpen(true)} onMouseLeave={() => setOpen(false)}>\n <span\n role=\"button\"\n tabIndex={0}\n aria-describedby={id}\n aria-expanded={open}\n className=\"rz-term__word\"\n onClick={() => setOpen((o) => !o)}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); setOpen((o) => !o); } if (e.key === \"Escape\") setOpen(false); }}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n </span>\n <span id={id} className={open ? \"rz-term__tip rz-term__tip--open\" : \"rz-term__tip\"} role=\"tooltip\">{definition}</span>\n </span>\n );\n}\n\n/** Studio's jargon, defined once. */\nexport const GLOSSARY = {\n pullRequest:\n \"The safety step between you and the live website. When you save, your edit is set aside on GitHub (the service that stores your site) and the site is test-built with it first. Only when that passes can you press Publish and make it live. GitHub calls this a pull request — you never need to go there yourself.\",\n repository:\n \"Where your website actually lives: a private, backed-up folder on GitHub that keeps every version of every page. This list is read straight from it, so it's always current — even for items added outside Studio.\",\n change:\n \"Your edit while it's on its way to the live site. You save it, it gets checked, then you publish it. An item can have one change in progress at a time, and you can come back to it whenever you like.\",\n checks:\n \"A practice run. The whole website is rebuilt with your edit in it, to make sure nothing broke — a missing field, a picture that isn't there. If something's wrong you find out here, not on the live site.\",\n publish:\n \"Makes your checked edit live for everyone. Takes about two minutes to appear on the website.\",\n} as const;\n\nexport function Jargon({ term, children }: { term: keyof typeof GLOSSARY; children: ReactNode }) {\n return <StudioTerm definition={GLOSSARY[term]}>{children}</StudioTerm>;\n}\n","import type { ContentTypeEntry } from \"../forms/types\";\n\n/**\n * The words a list and editor use for a content type. Posts keep the exact\n * strings Studio shipped with; any other type reads from its registry label\n * and singular so a new type needs no new copy.\n */\nexport function copyFor(entry: Pick<ContentTypeEntry, \"id\" | \"label\" | \"singular\">) {\n const singular = entry.singular ?? entry.label;\n if (entry.id === \"posts\") {\n return {\n newItem: \"New post\",\n empty: \"No posts yet\",\n first: \"Write the first one\",\n removeLink: \"Remove this post from the website\",\n removeConfirm: \"Take this post off the website? You’ll get a change to review first — nothing disappears until you publish it.\",\n removing: \"This post is being removed, so it can’t be edited right now. Cancel the removal from the change page if you’ve changed your mind.\",\n newSubtitle: \"The web address fills itself from the title; change it if you like before you save.\",\n };\n }\n const lower = singular.toLowerCase();\n return {\n newItem: `New ${lower}`,\n empty: `No ${entry.label.toLowerCase()} yet`,\n first: \"Add the first one\",\n removeLink: `Remove this ${lower} from the website`,\n removeConfirm: `Take this ${lower} off the website? You’ll get a change to review first — nothing disappears until you publish it.`,\n removing: `This ${lower} is being removed, so it can’t be edited right now. Cancel the removal from the change page if you’ve changed your mind.`,\n newSubtitle: \"The web address fills itself from the title; change it if you like before you save.\",\n };\n}\n","/**\n * The slice of zod 4's `_zod.def` surface this module reads, typed loosely.\n *\n * Tested against zod 4.5.4. These are semi-public internals (the v4 \"core\"\n * shape), stable across 4.x so far but not covered by semver promises — hence\n * the peer-dep range and the fixture tests. No zod value is imported here.\n */\n\nexport interface ZodCheckDef {\n check?: string;\n format?: string;\n minimum?: number;\n maximum?: number;\n length?: number;\n value?: number;\n inclusive?: boolean;\n pattern?: RegExp;\n error?: string | ((issue: unknown) => string | { message?: string } | undefined);\n}\n\nexport interface ZodDef {\n type: string;\n shape?: Record<string, ZodNode>;\n innerType?: ZodNode;\n in?: ZodNode;\n out?: ZodNode;\n element?: ZodNode;\n entries?: Record<string, string | number>;\n checks?: Array<{ _zod: { def: ZodCheckDef } }>;\n coerce?: boolean;\n}\n\nexport interface ZodNode {\n _zod: { def: ZodDef };\n description?: string;\n}\n\n/** Narrow an unknown schema to the internal node shape, or throw a clear error. */\nexport function asNode(schema: unknown, what = \"schema\"): ZodNode {\n const n = schema as Partial<ZodNode> | null;\n if (!n || typeof n !== \"object\" || !n._zod?.def?.type) {\n throw new TypeError(`walkSchema: ${what} is not a zod 4 schema`);\n }\n return n as ZodNode;\n}\n\n/** Resolve a check's error to a plain string, if it has one. */\nexport function checkMessage(def: ZodCheckDef): string | undefined {\n const e = def.error;\n if (!e) return undefined;\n if (typeof e === \"string\") return e;\n const out = e({});\n if (typeof out === \"string\") return out;\n return out?.message;\n}\n","/**\n * checks[] → constraints + messages.\n *\n * Messages are keyed PER CHECK. The spike's walker wrote `out.message = …` on\n * every check, so a field with min and max kept only the max message and\n * showed the wrong error for a too-short value. Here each check kind gets its\n * own key; a renderer maps a failed issue to its message by that key.\n *\n * Unknown check kinds (e.g. a per-field `.refine`, which is `custom`) are kept\n * as a message when they carry one and otherwise skipped — never fatal.\n */\n\nimport type { Constraints, Messages } from \"./types\";\nimport type { ZodNode } from \"./internals\";\nimport { checkMessage } from \"./internals\";\n\nexport function readChecks(node: ZodNode): { constraints: Constraints; messages: Messages } {\n const constraints: Constraints = {};\n const messages: Messages = {};\n\n for (const c of node._zod.def.checks ?? []) {\n const d = c._zod.def;\n const msg = checkMessage(d);\n let key: string | undefined;\n\n switch (d.check) {\n case \"min_length\":\n constraints.min = d.minimum;\n key = \"min_length\";\n break;\n case \"max_length\":\n constraints.max = d.maximum;\n key = \"max_length\";\n break;\n case \"length_equals\":\n constraints.exact = d.length;\n key = \"length_equals\";\n break;\n case \"greater_than\":\n constraints.min = d.inclusive ? d.value : (d.value ?? 0) + 1;\n key = \"greater_than\";\n break;\n case \"less_than\":\n constraints.max = d.inclusive ? d.value : (d.value ?? 0) - 1;\n key = \"less_than\";\n break;\n case \"string_format\":\n if (d.format === \"regex\" && d.pattern) {\n constraints.pattern = d.pattern.source;\n constraints.format = \"regex\";\n key = \"regex\";\n } else if (d.format === \"url\" || d.format === \"email\") {\n constraints.format = d.format;\n key = d.format;\n } else {\n key = d.format;\n }\n break;\n case \"number_format\":\n if (d.format === \"safeint\" || d.format === \"int32\") {\n constraints.format = \"int\";\n key = \"int\";\n }\n break;\n case \"custom\":\n key = \"custom\";\n break;\n default:\n key = d.check;\n }\n\n if (key && msg) messages[key] = msg;\n }\n\n return { constraints, messages };\n}\n","/**\n * Peel wrapper types off a field until the real type is reached.\n *\n * optional / nullable / default → the field is not required.\n * pipe → follow `out` (older 4.x wrapped z.coerce.date in a pipe; 4.5 marks\n * the date itself with `coerce: true` — both land on the same node here).\n */\n\nimport type { ZodNode } from \"./internals\";\n\nexport interface Unwrapped {\n node: ZodNode;\n type: string;\n required: boolean;\n}\n\nexport function unwrap(start: ZodNode): Unwrapped {\n let node = start;\n let required = true;\n // Bounded so a malformed schema can't loop forever.\n for (let i = 0; i < 16; i++) {\n const def = node._zod.def;\n if (def.type === \"optional\" || def.type === \"nullable\" || def.type === \"default\") {\n required = false;\n if (!def.innerType) break;\n node = def.innerType;\n } else if (def.type === \"pipe\") {\n const next = def.out ?? def.in;\n if (!next) break;\n node = next;\n } else {\n break;\n }\n }\n return { node, type: node._zod.def.type, required };\n}\n","/**\n * zod type → InputKind, plus the extras some kinds carry (enum options, the\n * array item's constraints).\n *\n * Long strings become textareas by a simple rule: a max over 120 chars. That\n * is a heuristic, and the registry can't override it today — if a site needs\n * to, that is a one-line change here, not a per-site branch.\n */\n\nimport type { Constraints, InputKind, Messages } from \"./types\";\nimport type { ZodNode } from \"./internals\";\nimport { readChecks } from \"./checks\";\nimport { unwrap } from \"./unwrap\";\n\nconst TEXTAREA_MIN_MAX = 120;\n\nexport interface InputInfo {\n input: InputKind;\n constraints: Constraints;\n messages: Messages;\n options?: string[];\n}\n\nexport function inputFor(node: ZodNode): InputInfo {\n const def = node._zod.def;\n const { constraints, messages } = readChecks(node);\n\n switch (def.type) {\n case \"string\": {\n if (constraints.format === \"url\") return { input: \"url\", constraints, messages };\n const long = (constraints.max ?? 0) > TEXTAREA_MIN_MAX;\n return { input: long ? \"textarea\" : \"text\", constraints, messages };\n }\n case \"date\":\n return { input: \"date\", constraints, messages };\n case \"number\":\n case \"int\":\n return { input: \"number\", constraints, messages };\n case \"boolean\":\n return { input: \"boolean\", constraints, messages };\n case \"enum\":\n case \"literal\": {\n const options = Object.values(def.entries ?? {}).map(String);\n return { input: \"select\", constraints, messages, options };\n }\n case \"array\": {\n if (def.element) {\n const item = unwrap(def.element);\n const inner = readChecks(item.node);\n constraints.item = inner;\n }\n return { input: \"tags\", constraints, messages };\n }\n default:\n // Anything unrecognised (object, union, …) is presented as text so the\n // value can at least be carried; a renderer may choose to treat it as hidden.\n return { input: \"text\", constraints, messages };\n }\n}\n","/**\n * Labels and placeholders.\n *\n * Precedence (decided 2026-09-08):\n * label: registry.labels[name] → .meta({ label }) → .describe() → titlecase(name)\n * placeholder: registry.placeholders[name] → .meta({ placeholder }) → undefined\n *\n * The registry tier exists for schemas that can't be edited yet (5degrees\n * until its repo transfer). The meta tier is the intended home — one source of\n * truth beside the validation rules. Titlecase is the floor, and it is naive on\n * purpose: an acronym coming out as \"Rsvp url\" is the signal that a real label\n * is missing.\n *\n * Meta is read from zod's global registry via the schema's own `meta()` /\n * `description` accessors, so no zod value is imported here.\n */\n\nimport type { ContentTypeEntry, InputKind } from \"./types\";\n\ninterface MetaBearing {\n meta?: () => Record<string, unknown> | undefined;\n description?: string;\n}\n\ninterface FieldMeta {\n label?: string;\n placeholder?: string;\n description?: string;\n recommended?: [number, number];\n suffix?: string;\n help?: string;\n input?: InputKind;\n}\n\nexport function readMeta(schema: unknown): FieldMeta {\n const s = schema as MetaBearing;\n const raw = typeof s.meta === \"function\" ? (s.meta() ?? {}) : {};\n const pick = (k: keyof FieldMeta) => (typeof raw[k] === \"string\" ? (raw[k] as string) : undefined);\n const rec = raw.recommended;\n const recommended =\n Array.isArray(rec) && rec.length === 2 && rec.every((n) => typeof n === \"number\") ? ([rec[0], rec[1]] as [number, number]) : undefined;\n const INPUTS: InputKind[] = [\"text\", \"textarea\", \"date\", \"number\", \"boolean\", \"select\", \"tags\", \"image\", \"url\", \"time\"];\n const input = typeof raw.input === \"string\" && (INPUTS as string[]).includes(raw.input) ? (raw.input as InputKind) : undefined;\n return {\n label: pick(\"label\"),\n placeholder: pick(\"placeholder\"),\n description: pick(\"description\") ?? (typeof s.description === \"string\" ? s.description : undefined),\n recommended,\n suffix: pick(\"suffix\"),\n help: pick(\"help\"),\n input,\n };\n}\n\nexport function inputOverrideFor(\n name: string,\n schema: unknown,\n entry?: Pick<ContentTypeEntry, \"inputs\">,\n): InputKind | undefined {\n return entry?.inputs?.[name] ?? readMeta(schema).input;\n}\n\nexport function recommendedFor(\n name: string,\n schema: unknown,\n entry?: Pick<ContentTypeEntry, \"recommended\">,\n): [number, number] | undefined {\n return entry?.recommended?.[name] ?? readMeta(schema).recommended;\n}\n\nexport function titlecase(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase()\n .trim();\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nexport function labelFor(name: string, schema: unknown, entry?: Pick<ContentTypeEntry, \"labels\">): string {\n const fromRegistry = entry?.labels?.[name];\n if (fromRegistry) return fromRegistry;\n const meta = readMeta(schema);\n return meta.label ?? meta.description ?? titlecase(name);\n}\n\nexport function placeholderFor(\n name: string,\n schema: unknown,\n entry?: Pick<ContentTypeEntry, \"placeholders\">,\n): string | undefined {\n return entry?.placeholders?.[name] ?? readMeta(schema).placeholder;\n}\n\nexport function helpFor(name: string, schema: unknown, entry?: Pick<ContentTypeEntry, \"help\">): string | undefined {\n return entry?.help?.[name] ?? readMeta(schema).help;\n}\n","/**\n * walkSchema — a zod object schema (+ optional registry entry) → FieldSpec[].\n *\n * Synchronous and pure. Reads the schema's shape and checks; never parses a\n * value, never calls an options resolver, never imports zod at runtime.\n *\n * Roles from the registry override the schema-derived input kind: a field the\n * entry names as an image is `role: \"image\"` even though zod sees a string.\n * Hidden fields are still emitted so a renderer can carry their values through.\n */\n\nimport type { ContentTypeEntry, FieldRole, FieldSpec } from \"./types\";\nimport type { ZodNode } from \"./internals\";\nimport { asNode } from \"./internals\";\nimport { inputFor } from \"./inputs\";\nimport { helpFor, inputOverrideFor, labelFor, placeholderFor, readMeta, recommendedFor } from \"./labels\";\nimport { unwrap } from \"./unwrap\";\n\ntype Entry = Partial<Omit<ContentTypeEntry, \"schema\" | \"filename\" | \"id\" | \"label\" | \"folder\">>;\n\nexport function walkSchema(schema: unknown, entry: Entry = {}): FieldSpec[] {\n const root = asNode(schema);\n const shape = shapeOf(root);\n const names = Object.keys(shape);\n\n const specs = names.map((name): FieldSpec => {\n const raw = shape[name];\n const { node, required } = unwrap(raw);\n const info = inputFor(node);\n const role = roleFor(name, entry);\n\n return {\n name,\n label: labelFor(name, raw, entry),\n input: role === \"image\" ? \"image\" : (inputOverrideFor(name, raw, entry) ?? info.input),\n required,\n constraints: info.constraints,\n messages: info.messages,\n placeholder: placeholderFor(name, raw, entry),\n recommended: recommendedFor(name, raw, entry),\n suffix: readMeta(raw).suffix,\n help: helpFor(name, raw, entry),\n order: 0,\n role,\n options: entry.options?.[name] ?? info.options,\n };\n });\n\n return applyOrder(specs, entry.order ?? []);\n}\n\n/** `.strict()` and object-level `.refine()` both leave `shape` on the object def. */\nfunction shapeOf(root: ZodNode): Record<string, ZodNode> {\n let node = root;\n for (let i = 0; i < 8 && !node._zod.def.shape; i++) {\n const def = node._zod.def;\n const next = def.innerType ?? def.in;\n if (!next) break;\n node = next;\n }\n const shape = node._zod.def.shape;\n if (!shape) throw new TypeError(`walkSchema: expected an object schema, got \"${root._zod.def.type}\"`);\n return shape;\n}\n\nfunction roleFor(name: string, entry: Entry): FieldRole {\n if (entry.hidden?.includes(name)) return \"hidden\";\n if (entry.body === name) return \"body\";\n if (entry.images?.includes(name)) return \"image\";\n return \"field\";\n}\n\n/** Named fields first in the given order; the rest keep schema key order. */\nfunction applyOrder(specs: FieldSpec[], order: string[]): FieldSpec[] {\n const rank = new Map(order.map((n, i) => [n, i]));\n const named = specs.filter((s) => rank.has(s.name)).sort((a, b) => rank.get(a.name)! - rank.get(b.name)!);\n const rest = specs.filter((s) => !rank.has(s.name));\n return [...named, ...rest].map((s, i) => ({ ...s, order: i }));\n}\n","/**\n * ChipsInput — tags as chips. Enter or comma adds, × or Backspace-on-empty\n * removes. The value is a string[]; the schema's length/regex rules still run\n * on submit, this is only a nicer way to type them.\n */\n\nimport { useState, type KeyboardEvent } from \"react\";\n\nexport function ChipsInput({ id, name, value, onChange, onBlur, placeholder, invalid, max }: {\n id: string;\n name: string;\n value: string[];\n onChange: (v: string[]) => void;\n onBlur: () => void;\n placeholder?: string;\n invalid?: boolean;\n /** When the schema says exactly N, show \"n of N\". */\n max?: number;\n}) {\n const [draft, setDraft] = useState(\"\");\n\n const commit = () => {\n const parts = draft.split(\",\").map((s) => s.trim()).filter(Boolean);\n if (parts.length) onChange([...value, ...parts.filter((p) => !value.includes(p))]);\n setDraft(\"\");\n };\n\n const onKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Backspace\" && draft === \"\" && value.length) {\n onChange(value.slice(0, -1));\n }\n };\n\n return (\n <div className={[\"realiiz-chips\", invalid && \"realiiz-form__control--invalid\"].filter(Boolean).join(\" \")} data-name={name}>\n {value.map((tag) => (\n <span key={tag} className=\"realiiz-chip\">\n {tag}\n <button type=\"button\" aria-label={`Remove ${tag}`} onClick={() => onChange(value.filter((t) => t !== tag))}>×</button>\n </span>\n ))}\n <input\n id={id}\n type=\"text\"\n className=\"realiiz-chips__input\"\n value={draft}\n placeholder={value.length ? \"\" : placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKey}\n onBlur={() => { commit(); onBlur(); }}\n aria-invalid={invalid || undefined}\n />\n {typeof max === \"number\" && <span className=\"realiiz-chips__count\">{value.length} of {max}</span>}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * A branded single-select: a button that opens a listbox, styled like the rest\n * of the form instead of the browser's native <select>. Values stay raw (what\n * the schema wants); the visible label is Title Case unless the host supplies\n * its own labels. Keyboard: arrows move, Enter/Space pick, Escape closes,\n * typing jumps to the first match.\n */\n\nimport { useEffect, useId, useRef, useState, type KeyboardEvent } from \"react\";\nimport { titlecase } from \"../forms/labels\";\n\nexport interface SelectInputProps {\n id: string;\n name: string;\n value: string;\n options: string[];\n /** Optional display names, keyed by value. */\n labels?: Record<string, string>;\n /** Adds a \"—\" choice at the top that sets the value to \"\". */\n allowEmpty?: boolean;\n invalid?: boolean;\n disabled?: boolean;\n onChange: (v: string) => void;\n onBlur?: () => void;\n}\n\nexport function labelFor(value: string, labels?: Record<string, string>): string {\n if (labels?.[value]) return labels[value];\n return value ? titlecase(value) : \"—\";\n}\n\nexport function SelectInput(p: SelectInputProps) {\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(0);\n const wrap = useRef<HTMLDivElement>(null);\n const list = useRef<HTMLUListElement>(null);\n const listId = useId();\n const choices = p.allowEmpty ? [\"\", ...p.options] : p.options;\n\n const latest = useRef({ choices, value: p.value });\n latest.current = { choices, value: p.value };\n useEffect(() => {\n if (!open) return;\n setActive(Math.max(0, latest.current.choices.indexOf(latest.current.value)));\n const onDoc = (e: MouseEvent) => { if (!wrap.current?.contains(e.target as Node)) close(); };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open]); // runs when the menu opens; the rest is read at that moment on purpose\n\n useEffect(() => {\n if (!open) return;\n list.current?.querySelectorAll<HTMLElement>(\"[role=option]\")[active]?.scrollIntoView?.({ block: \"nearest\" });\n }, [open, active]);\n\n const close = () => { setOpen(false); p.onBlur?.(); };\n const pick = (v: string) => { if (v !== p.value) p.onChange(v); close(); };\n\n const onKey = (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); setOpen(true); }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\": e.preventDefault(); setActive((i) => Math.min(choices.length - 1, i + 1)); break;\n case \"ArrowUp\": e.preventDefault(); setActive((i) => Math.max(0, i - 1)); break;\n case \"Home\": e.preventDefault(); setActive(0); break;\n case \"End\": e.preventDefault(); setActive(choices.length - 1); break;\n case \"Enter\": case \" \": e.preventDefault(); pick(choices[active] ?? \"\"); break;\n case \"Escape\": e.preventDefault(); close(); break;\n case \"Tab\": close(); break;\n default: {\n if (e.key.length === 1 && /\\S/.test(e.key)) {\n const k = e.key.toLowerCase();\n const idx = choices.findIndex((c) => labelFor(c, p.labels).toLowerCase().startsWith(k));\n if (idx >= 0) setActive(idx);\n }\n }\n }\n };\n\n const cls = [\"realiiz-form__control\", \"realiiz-select__btn\", p.invalid && \"realiiz-form__control--invalid\", open && \"realiiz-select__btn--open\"].filter(Boolean).join(\" \");\n\n return (\n <div ref={wrap} className=\"realiiz-select\" onKeyDown={onKey}>\n <input type=\"hidden\" name={p.name} value={p.value} readOnly />\n <button\n type=\"button\"\n id={p.id}\n className={cls}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-invalid={p.invalid || undefined}\n aria-describedby={p.invalid ? `${p.id}-error` : undefined}\n disabled={p.disabled}\n onClick={() => (open ? close() : setOpen(true))}\n >\n <span className={p.value ? undefined : \"realiiz-select__placeholder\"}>{labelFor(p.value, p.labels)}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\" /></svg>\n </button>\n {open && (\n <ul ref={list} id={listId} className=\"realiiz-select__menu\" role=\"listbox\" aria-labelledby={p.id} tabIndex={-1}>\n {choices.map((c, i) => (\n <li\n key={c || \"__empty\"}\n role=\"option\"\n aria-selected={c === p.value}\n data-value={c}\n className={[\"realiiz-select__item\", i === active && \"realiiz-select__item--active\", c === p.value && \"realiiz-select__item--selected\"].filter(Boolean).join(\" \")}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => pick(c)}\n >\n <span className=\"realiiz-select__check\" aria-hidden=\"true\">{c === p.value ? \"✓\" : \"\"}</span>\n <span>{labelFor(c, p.labels)}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * One control per InputKind. Dumb: value in, change out. Field.tsx owns the\n * label, helper row and error; ContentForm owns state.\n */\n\nimport type { FieldSpec } from \"../forms\";\nimport type { ControlValue } from \"./values\";\nimport { SelectInput } from \"./SelectInput\";\n\nexport interface ControlProps {\n id: string;\n spec: FieldSpec;\n value: ControlValue;\n invalid: boolean;\n options?: string[] | \"loading\";\n onChange: (v: ControlValue) => void;\n onBlur: () => void;\n}\n\nexport function Control(p: ControlProps) {\n const cls = [\"realiiz-form__control\", p.invalid && \"realiiz-form__control--invalid\"].filter(Boolean).join(\" \");\n const common = {\n id: p.id,\n name: p.spec.name,\n \"aria-invalid\": p.invalid || undefined,\n \"aria-describedby\": p.invalid ? `${p.id}-error` : undefined,\n onBlur: p.onBlur,\n } as const;\n const str = typeof p.value === \"string\" ? p.value : \"\";\n\n if (p.options === \"loading\") {\n return <div className={cls} aria-busy=\"true\" style={{ color: \"var(--_muted)\" }}>Loading options…</div>;\n }\n\n if (p.options || p.spec.input === \"select\") {\n return (\n <SelectInput\n id={p.id}\n name={p.spec.name}\n value={str}\n options={p.options ?? []}\n allowEmpty={!p.spec.required}\n invalid={p.invalid}\n onChange={p.onChange}\n onBlur={p.onBlur}\n />\n );\n }\n\n switch (p.spec.input) {\n case \"textarea\":\n return (\n <textarea {...common} className={`${cls} realiiz-form__control--textarea`} value={str}\n placeholder={p.spec.placeholder} onChange={(e) => p.onChange(e.target.value)} />\n );\n case \"boolean\":\n return (\n <input {...common} type=\"checkbox\" checked={p.value === true} onChange={(e) => p.onChange(e.target.checked)} />\n );\n case \"image\":\n // Without a host picker (Field.onPickImage) an image field is its path, typed by hand.\n return <input {...common} type=\"text\" className={cls} value={str} placeholder={p.spec.placeholder ?? \"/images/picture.webp\"} onChange={(e) => p.onChange(e.target.value)} />;\n case \"date\":\n return <input {...common} type=\"date\" className={cls} value={str} onChange={(e) => p.onChange(e.target.value)} />;\n case \"number\":\n return (\n <input {...common} type=\"number\" inputMode=\"numeric\" className={cls} value={str}\n min={p.spec.constraints.min} max={p.spec.constraints.max}\n step={p.spec.constraints.format === \"int\" ? 1 : undefined}\n placeholder={p.spec.placeholder} onChange={(e) => p.onChange(e.target.value)} />\n );\n case \"time\":\n return <input {...common} type=\"time\" className={cls} value={str} onChange={(e) => p.onChange(e.target.value)} />;\n case \"url\":\n return (\n <input {...common} type=\"url\" className={cls} value={str} placeholder={p.spec.placeholder ?? \"https://\"}\n onChange={(e) => p.onChange(e.target.value)} />\n );\n default:\n return (\n <input {...common} type=\"text\" className={cls} value={str} placeholder={p.spec.placeholder}\n maxLength={p.spec.constraints.max} onChange={(e) => p.onChange(e.target.value)} />\n );\n }\n}\n","/**\n * Picked images beside the form state. An image FIELD's value stays a path\n * string (what the frontmatter wants); the shrunk bytes for a newly chosen\n * picture live here until submit, keyed by field name, with an object URL for\n * the preview and the previous path so Remove can restore it.\n *\n * The host decides the path and does the shrinking (`onPickImage`) because it\n * knows the slug and the size rules; this hook only keeps the result.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface PickedImage {\n path: string;\n blob: Blob;\n previewUrl: string;\n width?: number;\n height?: number;\n /** The field's value before this pick, restored by Remove. */\n previous: string;\n}\n\nexport type PickResult = { path: string; blob: Blob; previewUrl?: string; width?: number; height?: number };\nexport type PickImage = (field: string, file: File) => Promise<PickResult>;\n\nexport type SubmittedImages = Record<string, { path: string; blob: Blob }>;\n\nexport function useImages() {\n const [images, setImages] = useState<Record<string, PickedImage>>({});\n const latest = useRef(images);\n latest.current = images;\n const urls = useRef(new Set<string>());\n\n useEffect(() => {\n const set = urls.current;\n return () => { for (const u of set) URL.revokeObjectURL(u); };\n }, []);\n\n const keep = useCallback((field: string, r: PickResult, previous: string): PickedImage => {\n const previewUrl = r.previewUrl ?? URL.createObjectURL(r.blob);\n if (!r.previewUrl) urls.current.add(previewUrl);\n const picked: PickedImage = { path: r.path, blob: r.blob, previewUrl, width: r.width, height: r.height, previous };\n setImages((m) => ({ ...m, [field]: picked }));\n return picked;\n }, []);\n\n /** Drop the pick; returns the value to put back in the field. */\n const remove = useCallback((field: string): string | undefined => {\n const previous = latest.current[field]?.previous;\n setImages((m) => {\n const rest = { ...m };\n delete rest[field];\n return rest;\n });\n return previous;\n }, []);\n\n const toSubmission = useCallback((): SubmittedImages => {\n return Object.fromEntries(Object.entries(images).map(([k, v]) => [k, { path: v.path, blob: v.blob }]));\n }, [images]);\n\n return { images, keep, remove, toSubmission };\n}\n\n/** \"214 KB\" / \"1.3 MB\" for the detail line. */\nexport function formatBytes(n: number): string {\n if (n < 1024 * 1024) return `${Math.max(1, Math.round(n / 1024))} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Getting a picture out of the browser and into a handler — shared by the\n * ImageInput control and the editor's toolbar. Three doors, one exit: a file\n * picker, a drop, or a paste, each yielding the first image File it finds.\n * No shrinking or naming here — that is the host's `onPick`/`onUploadImage`.\n */\n\nimport type { ClipboardEvent, DragEvent } from \"react\";\n\nexport const IMAGE_ACCEPT = \"image/jpeg,image/png,image/webp,image/gif\";\n\n/** Open the OS file picker and resolve with the chosen file (undefined if dismissed). */\nexport function pickFile(accept = IMAGE_ACCEPT): Promise<File | undefined> {\n return new Promise((resolve) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = accept;\n input.style.display = \"none\";\n document.body.appendChild(input);\n const done = () => { resolve(input.files?.[0]); input.remove(); };\n input.addEventListener(\"change\", done, { once: true });\n // Dismissing the picker fires no change event; window focus returning is the best signal.\n window.addEventListener(\"focus\", () => setTimeout(() => { if (document.body.contains(input)) done(); }, 400), { once: true });\n input.click();\n });\n}\n\nexport function imageFromDrop(e: DragEvent): File | undefined {\n return Array.from(e.dataTransfer?.files ?? []).find((f) => f.type.startsWith(\"image/\"));\n}\n\nexport function imageFromPaste(e: ClipboardEvent): File | undefined {\n const item = Array.from(e.clipboardData?.items ?? []).find((i) => i.kind === \"file\" && i.type.startsWith(\"image/\"));\n return item?.getAsFile() ?? undefined;\n}\n\n/** The sentence for the person when a handler throws — MediaError carries its own. */\nexport function messageOf(err: unknown): string {\n if (err && typeof err === \"object\" && (err as { name?: string }).name === \"MediaError\") return (err as Error).message;\n return \"That picture couldn’t be prepared. Try a different file.\";\n}\n","/**\n * ImageInput — the picture control for an image field.\n *\n * Empty: a dashed drop zone with \"Choose a picture\", \"or drag one here\", and the\n * size hint. With a value: a thumbnail (the current path, or the freshly shrunk\n * picture from its object URL) plus the detail line \"1600 × 900 · 214 KB\",\n * Replace, and — for a new pick — Remove, which restores the previous path.\n * Paste works anywhere on the control. The host's `onPick` shrinks and names the\n * file; this component shows \"Shrinking…\" meanwhile and any MediaError after.\n */\n\nimport { useRef, useState, type DragEvent, type ClipboardEvent } from \"react\";\nimport type { PickedImage } from \"./images\";\nimport { formatBytes } from \"./images\";\nimport { imageFromDrop, imageFromPaste, messageOf, pickFile } from \"./md/upload\";\n\nexport const IMAGE_HINT = \"JPG, PNG or WebP, up to 10MB. We shrink it for the web.\";\n\nexport interface ImageInputProps {\n id: string;\n name: string;\n /** The field's current value — a path such as /blog/my-post.webp, or \"\". */\n value: string;\n picked?: PickedImage;\n invalid?: boolean;\n disabled?: boolean;\n onPick: (file: File) => Promise<void>;\n onRemove?: () => void;\n onBlur?: () => void;\n}\n\nexport function ImageInput(p: ImageInputProps) {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [over, setOver] = useState(false);\n const zone = useRef<HTMLDivElement>(null);\n\n const take = async (file: File | undefined) => {\n if (!file || busy || p.disabled) return;\n setBusy(true);\n setError(null);\n try {\n await p.onPick(file);\n } catch (err) {\n setError(messageOf(err));\n } finally {\n setBusy(false);\n }\n };\n\n const choose = async () => take(await pickFile());\n const onDrop = (e: DragEvent) => { e.preventDefault(); setOver(false); void take(imageFromDrop(e)); };\n const onPaste = (e: ClipboardEvent) => { const f = imageFromPaste(e); if (f) { e.preventDefault(); void take(f); } };\n\n const src = p.picked?.previewUrl ?? (p.value || null);\n const detail = p.picked\n ? [p.picked.width && p.picked.height ? `${p.picked.width} × ${p.picked.height}` : null, formatBytes(p.picked.blob.size)].filter(Boolean).join(\" · \")\n : p.value;\n\n return (\n <div\n ref={zone}\n className={[\"realiiz-image\", over && \"realiiz-image--over\", p.invalid && \"realiiz-image--invalid\", busy && \"realiiz-image--busy\"].filter(Boolean).join(\" \")}\n data-field={p.name}\n onDragOver={(e) => { e.preventDefault(); if (!over) setOver(true); }}\n onDragLeave={() => setOver(false)}\n onDrop={onDrop}\n onPaste={onPaste}\n onBlur={p.onBlur}\n tabIndex={-1}\n >\n {/* the real value travels in the form state; this input exists for the label's htmlFor and assistive tech */}\n <input id={p.id} name={p.name} type=\"text\" value={p.value} readOnly className=\"realiiz-sr-only\" aria-busy={busy || undefined} />\n\n {src ? (\n <div className=\"realiiz-image__has\">\n <img src={src} alt=\"\" className=\"realiiz-image__thumb\" data-testid=\"realiiz-image-thumb\" />\n <div className=\"realiiz-image__meta\">\n <div className=\"realiiz-image__detail\">{busy ? \"Shrinking…\" : detail}</div>\n <div className=\"realiiz-image__actions\">\n <button type=\"button\" className=\"realiiz-form__button\" onClick={choose} disabled={busy || p.disabled}>Replace</button>\n {p.picked && p.onRemove && (\n <button type=\"button\" className=\"realiiz-image__remove\" onClick={p.onRemove} disabled={busy}>Remove</button>\n )}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"realiiz-image__empty\">\n <PictureIcon />\n <button type=\"button\" className=\"realiiz-form__button\" onClick={choose} disabled={busy || p.disabled}>\n {busy ? \"Shrinking…\" : \"Choose a picture\"}\n </button>\n <span className=\"realiiz-image__or\">or drag one here</span>\n </div>\n )}\n <div className=\"realiiz-image__hint\">{IMAGE_HINT}</div>\n {error && <div className=\"realiiz-form__error\" role=\"alert\">{error}</div>}\n </div>\n );\n}\n\nfunction PictureIcon() {\n return (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"realiiz-image__icon\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <circle cx=\"9\" cy=\"10\" r=\"1.6\" />\n <path d=\"M21 16l-5-5-8 8\" />\n </svg>\n );\n}\n","/**\n * Field anatomy: label (+ required marker) → control → helper row (length\n * gauge / character count) → error text. The error sits under the control,\n * never in a tooltip — the audience is a non-technical client.\n */\n\nimport type { FieldSpec } from \"../forms\";\nimport type { FieldIssue } from \"./issues\";\nimport type { ReactNode } from \"react\";\nimport { ChipsInput } from \"./ChipsInput\";\nimport { Control } from \"./controls\";\nimport { ImageInput } from \"./ImageInput\";\nimport type { PickedImage } from \"./images\";\nimport type { ControlValue } from \"./values\";\n\nexport interface FieldProps {\n formId: string;\n spec: FieldSpec;\n value: ControlValue;\n issues: FieldIssue[];\n options?: string[] | \"loading\";\n onChange: (v: ControlValue) => void;\n onBlur: () => void;\n /** How to draw a label that has help text — e.g. the site's own tooltip component. */\n renderLabel?: LabelRenderer;\n /** Image fields: the freshly picked picture (if any), and how to pick/remove one. Without onPickImage the field is a plain text path. */\n picked?: PickedImage;\n onPickImage?: (file: File) => Promise<void>;\n onRemoveImage?: () => void;\n}\n\nexport type LabelRenderer = (label: string, help: string) => ReactNode;\n\n/** Fallback when the host has no tooltip component: dotted underline + the browser's own title bubble. */\nconst defaultLabel: LabelRenderer = (label, help) => <span className=\"realiiz-form__help\" title={help}>{label}</span>;\n\n/**\n * Advisory length gauge. The bar is the whole scale (a bit past the max so\n * \"over\" has room to show), a green band marks the target range, and the fill\n * grows with the text in the state's colour: grey while short, green in range,\n * red past it. The words repeat only what the bar can't: the count and a verdict.\n */\nexport function LengthGauge({ length: raw, range, suffix }: { length: number; range: [number, number]; suffix?: string }) {\n const [min, max] = range;\n // The suffix is what the site adds on render (\" — Realiiz\"), so it counts once there is something to add it to.\n const length = raw === 0 ? 0 : raw + (suffix?.length ?? 0);\n const state = length === 0 ? \"empty\" : length < min ? \"short\" : length <= max ? \"ok\" : \"over\";\n const scale = Math.round(max * 1.3);\n const pct = (n: number) => `${Math.min(100, (n / scale) * 100)}%`;\n const verdict =\n state === \"ok\" ? \"good length\"\n : state === \"over\" ? `over ${max} — may be cut off`\n : `aim for ${min}–${max}`;\n const incl = suffix && length > 0 ? ` incl. “${suffix.trim()}”` : \"\";\n return (\n <span className={`realiiz-gauge realiiz-gauge--${state}`} title={`Recommended ${min}–${max} characters${suffix ? ` including “${suffix.trim()}”` : \"\"}`}>\n <span className=\"realiiz-gauge__bar\" aria-hidden=\"true\">\n <span className=\"realiiz-gauge__zone\" style={{ left: pct(min), width: `calc(${pct(max)} - ${pct(min)})` }} />\n <span className=\"realiiz-gauge__fill\" style={{ width: pct(length) }} />\n </span>\n <span className=\"realiiz-gauge__text\">\n <b>{length}</b> characters{incl} · {verdict}\n </span>\n </span>\n );\n}\n\nexport function Field(p: FieldProps) {\n const id = `${p.formId}-${p.spec.name}`;\n const invalid = p.issues.length > 0;\n const max = p.spec.constraints.max;\n const isText = p.spec.input === \"text\" || p.spec.input === \"textarea\";\n const len = typeof p.value === \"string\" ? p.value.length : 0;\n const isCheck = p.spec.input === \"boolean\";\n const isTags = p.spec.input === \"tags\";\n const labelText = p.spec.help ? (p.renderLabel ?? defaultLabel)(p.spec.label, p.spec.help) : p.spec.label;\n\n const control = p.spec.input === \"image\" && p.onPickImage ? (\n <ImageInput\n id={id}\n name={p.spec.name}\n value={typeof p.value === \"string\" ? p.value : \"\"}\n picked={p.picked}\n invalid={invalid}\n onPick={p.onPickImage}\n onRemove={p.onRemoveImage}\n onBlur={p.onBlur}\n />\n ) : isTags ? (\n <ChipsInput\n id={id}\n name={p.spec.name}\n value={Array.isArray(p.value) ? p.value : []}\n onChange={(v) => p.onChange(v)}\n onBlur={p.onBlur}\n placeholder={p.spec.placeholder}\n invalid={invalid}\n max={p.spec.constraints.exact ?? p.spec.constraints.max}\n />\n ) : (\n <Control id={id} spec={p.spec} value={p.value} invalid={invalid} options={p.options} onChange={p.onChange} onBlur={p.onBlur} />\n );\n\n return (\n <div className={`realiiz-form__field realiiz-form__field--${p.spec.input}`} data-field={p.spec.name}>\n {isCheck ? (\n <label className=\"realiiz-form__check\" htmlFor={id}>\n {control}\n <span>{labelText}{p.spec.required && <span className=\"realiiz-form__required\" aria-hidden=\"true\">*</span>}</span>\n </label>\n ) : (\n <>\n <label className=\"realiiz-form__label\" htmlFor={id}>\n {labelText}\n {p.spec.required && <span className=\"realiiz-form__required\" aria-hidden=\"true\">*</span>}\n </label>\n {control}\n </>\n )}\n {isText && (p.spec.recommended || typeof max === \"number\") && (\n <div className=\"realiiz-form__helper\">\n {p.spec.recommended ? (\n <LengthGauge length={len} range={p.spec.recommended} suffix={p.spec.suffix} />\n ) : (\n <span />\n )}\n {typeof max === \"number\" && <span className=\"realiiz-form__count\">{len} / {max}</span>}\n </div>\n )}\n {invalid && (\n <div className=\"realiiz-form__error\" id={`${id}-error`}>\n {p.issues.map((i, n) => <div key={n}>{i.message}</div>)}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Markdown tables as data — ported from the surveillance-review report editor.\n *\n * `tableAt` finds the table under the caret (header + separator required),\n * `renderTable` writes one back padded to an even grid so the source is\n * readable, and `applyTableOp` does the four row/column edits. Pure functions\n * over the textarea's string; no DOM.\n */\n\nexport type Align = \"l\" | \"L\" | \"c\" | \"r\";\nexport type TableOp = \"rowAfter\" | \"rowDel\" | \"colAfter\" | \"colDel\";\n\nexport interface TableAt {\n start: number;\n end: number;\n rows: string[][];\n align: Align[];\n /** Row index of the caret; header and separator both count as 0. */\n row: number;\n col: number;\n}\n\nconst ROW = /^\\s*\\|.*\\|\\s*$/;\nconst SEP = /^\\s*\\|[\\s:|-]+\\|\\s*$/;\n\nexport function tableCells(line: string): string[] {\n return line.trim().replace(/^\\|/, \"\").replace(/\\|$/, \"\").split(/(?<!\\\\)\\|/).map((c) => c.trim());\n}\n\nexport function tableAt(v: string, pos: number): TableAt | null {\n const lines = v.split(\"\\n\");\n let i = 0, off = 0;\n while (i < lines.length && pos > off + lines[i].length) { off += lines[i].length + 1; i++; }\n if (i >= lines.length || !ROW.test(lines[i])) return null;\n let s = i, e = i;\n while (s > 0 && ROW.test(lines[s - 1])) s--;\n while (e < lines.length - 1 && ROW.test(lines[e + 1])) e++;\n if (e - s < 1 || !SEP.test(lines[s + 1])) return null;\n const start = lines.slice(0, s).reduce((n, l) => n + l.length + 1, 0);\n const end = start + lines.slice(s, e + 1).join(\"\\n\").length;\n // \"L\" is an explicit left-align (:---) kept distinct from the default so we never rewrite a line the user typed.\n const align = tableCells(lines[s + 1]).map((c): Align =>\n c.startsWith(\":\") && c.endsWith(\":\") ? \"c\" : c.endsWith(\":\") ? \"r\" : c.startsWith(\":\") ? \"L\" : \"l\");\n const rows = lines.slice(s, e + 1).filter((_, n) => n !== 1).map(tableCells);\n const col = Math.max(0, (lines[i].slice(0, pos - off).match(/(?<!\\\\)\\|/g) || []).length - 1);\n const row = i - s <= 1 ? 0 : i - s - 1;\n return { start, end, rows, align, row, col };\n}\n\nexport function renderTable(rows: string[][], align: Align[]): string {\n const cols = Math.max(...rows.map((r) => r.length));\n const w: number[] = [];\n for (let c = 0; c < cols; c++) w[c] = Math.max(3, ...rows.map((r) => (r[c] || \"\").length));\n const pad = (t: string | undefined, c: number) => (t || \"\").padEnd(w[c]);\n const line = (r: string[]) => \"| \" + Array.from({ length: cols }, (_, c) => pad(r[c], c)).join(\" | \") + \" |\";\n const sep = \"|\" + Array.from({ length: cols }, (_, c) =>\n align[c] === \"c\" ? \":\" + \"-\".repeat(w[c]) + \":\"\n : align[c] === \"r\" ? \" \" + \"-\".repeat(w[c] - 1) + \": \"\n : align[c] === \"L\" ? \":\" + \"-\".repeat(w[c] - 1) + \" \"\n : \" \" + \"-\".repeat(w[c]) + \" \").join(\"|\") + \"|\";\n return [line(rows[0]), sep, ...rows.slice(1).map(line)].join(\"\\n\");\n}\n\n/** A new table: header placeholders (\"Column 1\"…) plus `rows` empty body rows. */\nexport function newTable(rows: number, cols: number): { text: string; firstHeader: string } {\n const head = Array.from({ length: cols }, (_, i) => `Column ${i + 1}`);\n const grid = [head, ...Array.from({ length: rows }, () => Array<string>(cols).fill(\"\"))];\n return { text: renderTable(grid, Array<Align>(cols).fill(\"l\")), firstHeader: head[0] };\n}\n\nexport type TableEdit = { text: string; a: number; b: number } | { error: string };\n\nexport function applyTableOp(v: string, pos: number, op: TableOp): TableEdit | null {\n const t = tableAt(v, pos);\n if (!t) return null;\n const rows = t.rows.map((r) => r.slice());\n const cols = Math.max(...rows.map((r) => r.length));\n const align = t.align.slice();\n if (op === \"rowAfter\") {\n rows.splice(Math.max(1, t.row + 1), 0, Array<string>(cols).fill(\"\"));\n } else if (op === \"rowDel\") {\n if (t.row === 0 || rows.length <= 2) return { error: \"A table needs its header row and at least one row below it.\" };\n rows.splice(t.row, 1);\n } else if (op === \"colAfter\") {\n rows.forEach((r) => { while (r.length < cols) r.push(\"\"); r.splice(t.col + 1, 0, \"\"); });\n align.splice(t.col + 1, 0, \"l\");\n } else if (op === \"colDel\") {\n if (cols <= 1) return { error: \"That's the last column — delete the table instead.\" };\n rows.forEach((r) => r.splice(t.col, 1));\n align.splice(t.col, 1);\n }\n const out = renderTable(rows, align);\n return { text: v.slice(0, t.start) + out + v.slice(t.end), a: t.start, b: t.start + out.length };\n}\n","/**\n * Toolbar edits — pure functions (text, selStart, selEnd) → { text, a, b }.\n *\n * Every formatting tool TOGGLES, like the surveillance-review report editor:\n * bold on bold text un-bolds; H2 on an H2 line removes it; H3 on an H2 line\n * swaps it; link anywhere inside a link removes it. `activeTools` reports which\n * of them the caret is currently \"in\", so the buttons can light up and say what\n * they're about to do.\n */\n\nimport { newTable } from \"./table\";\n\nexport type Edit = { text: string; a: number; b: number };\nexport type Apply = (s: string, a: number, b: number) => Edit;\n\n/** Inline marks: wrapped selection → unwrap; selection inside markers → unwrap; else wrap. */\nexport const toggleWrap = (mark: string, placeholder = \"text\"): Apply =>\n (s, a, b) => {\n const sel = s.slice(a, b);\n const n = mark.length;\n if (sel.length >= 2 * n && sel.startsWith(mark) && sel.endsWith(mark)) {\n const inner = sel.slice(n, sel.length - n);\n return { text: s.slice(0, a) + inner + s.slice(b), a, b: a + inner.length };\n }\n if (s.slice(a - n, a) === mark && s.slice(b, b + n) === mark) {\n return { text: s.slice(0, a - n) + sel + s.slice(b + n), a: a - n, b: a - n + sel.length };\n }\n const body = sel || placeholder;\n return { text: s.slice(0, a) + mark + body + mark + s.slice(b), a: a + n, b: a + n + body.length };\n };\n\n/** Every line prefix a line tool might own; setting one strips any other in the family. */\nexport const PREFIX_RE = /^(#{1,6}\\s+|[-*+]\\s+|\\d+[.)]\\s+|>\\s?)/;\n\nconst lineSpan = (s: string, a: number, b: number) => {\n const start = s.lastIndexOf(\"\\n\", a - 1) + 1;\n const endIdx = s.indexOf(\"\\n\", Math.max(b, a));\n return { start, end: endIdx === -1 ? s.length : endIdx };\n};\n\n/** Line tools: if every selected line already has THIS prefix, remove it; otherwise replace whatever prefix they have. */\nexport const toggleLines = (prefix: string | ((i: number) => string), matches: (line: string) => boolean): Apply =>\n (s, a, b) => {\n const { start, end } = lineSpan(s, a, b);\n const lines = s.slice(start, end).split(\"\\n\");\n const allOn = lines.every((l) => l.trim() === \"\" || matches(l));\n const out = lines.map((l, i) => {\n const bare = l.replace(PREFIX_RE, \"\");\n return allOn ? bare : (typeof prefix === \"string\" ? prefix : prefix(i)) + bare;\n });\n const replaced = out.join(\"\\n\");\n return { text: s.slice(0, start) + replaced + s.slice(end), a: start, b: start + replaced.length };\n };\n\nconst LINK_RE = /\\[([^\\]\\n]*)\\]\\(([^)\\n]*)\\)/g;\n\n/** The `[label](url)` that contains [a,b], or null. Images (``) don't count. */\nexport function linkAt(s: string, a: number, b: number): { from: number; to: number; label: string } | null {\n for (const m of s.matchAll(LINK_RE)) {\n if (s[m.index - 1] === \"!\") continue;\n const from = m.index, to = from + m[0].length;\n if (a >= from && b <= to) return { from, to, label: m[1] };\n if (from > b) break;\n }\n return null;\n}\n\n/** Link: any selection or caret inside a link removes it (label kept); otherwise link the selection and select the URL. */\nexport const toggleLink: Apply = (s, a, b) => {\n const hit = linkAt(s, a, b);\n if (hit) return { text: s.slice(0, hit.from) + hit.label + s.slice(hit.to), a: hit.from, b: hit.from + hit.label.length };\n const label = s.slice(a, b) || \"link text\";\n const urlStart = a + label.length + 3;\n return { text: s.slice(0, a) + `[${label}](https://)` + s.slice(b), a: urlStart, b: urlStart + 8 };\n};\n\n/** Image: `` with the URL selected for typing or pasting. */\nexport const insertImage: Apply = (s, a, b) => {\n const alt = s.slice(a, b) || \"description\";\n const urlStart = a + alt.length + 4;\n return { text: s.slice(0, a) + `` + s.slice(b), a: urlStart, b: urlStart + 8 };\n};\n\n/** Inline separator between details, e.g. `email · phone`. */\nexport const insertDot: Apply = (s, a, b) => {\n const t = \" · \";\n return { text: s.slice(0, a) + t + s.slice(b), a: a + t.length, b: a + t.length };\n};\n\n/** Needs a blank line before it or the paragraph above swallows the block. */\nconst blockBefore = (s: string, a: number) => (a === 0 || s.slice(0, a).endsWith(\"\\n\\n\") ? \"\" : s.slice(0, a).endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\");\n\nexport const insertRule: Apply = (s, a, b) => {\n const before = blockBefore(s, a);\n const t = before + \"---\\n\\n\";\n return { text: s.slice(0, a) + t + s.slice(b), a: a + t.length, b: a + t.length };\n};\n\n/** Table of `rows` body rows × `cols`; lands with the first header selected so typing replaces it. */\nexport const insertTable = (rows: number, cols: number): Apply => (s, a, b) => {\n const { text, firstHeader } = newTable(rows, cols);\n const before = blockBefore(s, a);\n const t = before + text + \"\\n\";\n const at = a + before.length + text.indexOf(firstHeader);\n return { text: s.slice(0, a) + t + s.slice(b), a: at, b: at + firstHeader.length };\n};\n\n/**\n * Tooltip term — an MDX component, so opt-in per site: `<Term definition=\"…\">word</Term>`.\n * Select a word → wrapped with the caret inside the empty quotes, ready for the\n * definition. Anywhere inside an existing Term → unwrapped back to the word.\n */\nexport const toggleTerm = (component = \"Term\", attr = \"definition\"): Apply => (s, a, b) => {\n const re = new RegExp(`<${component}\\\\s+${attr}=\"([^\"]*)\"\\\\s*>([\\\\s\\\\S]*?)</${component}>`, \"g\");\n for (const m of s.matchAll(re)) {\n const from = m.index, to = from + m[0].length;\n if (a >= from && b <= to) return { text: s.slice(0, from) + m[2] + s.slice(to), a: from, b: from + m[2].length };\n if (from > b) break;\n }\n const word = s.slice(a, b) || \"term\";\n const open = `<${component} ${attr}=\"`;\n const text = s.slice(0, a) + open + `\">${word}</${component}>` + s.slice(b);\n return { text, a: a + open.length, b: a + open.length };\n};\n\nexport interface Tool { id: string; title: string; apply: Apply }\n\nexport const TOOLS: Tool[] = [\n { id: \"bold\", title: \"Bold — ⌘B\", apply: toggleWrap(\"**\") },\n { id: \"italic\", title: \"Italic — ⌘I\", apply: toggleWrap(\"_\") },\n { id: \"h2\", title: \"Section heading\", apply: toggleLines(\"## \", (l) => /^##\\s/.test(l)) },\n { id: \"h3\", title: \"Sub-heading\", apply: toggleLines(\"### \", (l) => /^###\\s/.test(l)) },\n { id: \"ul\", title: \"Bulleted list\", apply: toggleLines(\"- \", (l) => /^[-*+]\\s/.test(l)) },\n { id: \"ol\", title: \"Numbered list\", apply: toggleLines((i) => `${i + 1}. `, (l) => /^\\d+[.)]\\s/.test(l)) },\n { id: \"quote\", title: \"Quote\", apply: toggleLines(\"> \", (l) => /^>/.test(l)) },\n { id: \"link\", title: \"Link\", apply: toggleLink },\n { id: \"code\", title: \"Inline code\", apply: toggleWrap(\"`\", \"code\") },\n { id: \"image\", title: \"Image\", apply: insertImage },\n { id: \"dot\", title: \"Separator between details ( · )\", apply: insertDot },\n { id: \"rule\", title: \"Divider line across the page\", apply: insertRule },\n];\n\nexport const toolById = (id: string): Tool => TOOLS.find((t) => t.id === id)!;\n\n/** Which toggle tools the caret is currently inside, so their buttons can light up. */\nexport function activeTools(s: string, a: number, b: number): Set<string> {\n const on = new Set<string>();\n const sel = s.slice(a, b);\n const wrapped = (m: string) =>\n (s.slice(a - m.length, a) === m && s.slice(b, b + m.length) === m) ||\n (sel.length >= 2 * m.length && sel.startsWith(m) && sel.endsWith(m));\n if (wrapped(\"**\") || spanAt(s, a, b, /\\*\\*[^*\\n]+\\*\\*/g, 2)) on.add(\"bold\");\n if (wrapped(\"_\") || spanAt(s, a, b, /(?<![\\w_])_[^_\\n]+_(?![\\w_])/g, 1)) on.add(\"italic\");\n if (wrapped(\"`\") || spanAt(s, a, b, /`[^`\\n]+`/g, 1)) on.add(\"code\");\n if (linkAt(s, a, b)) on.add(\"link\");\n if (spanAt(s, a, b, /<([A-Z][\\w]*)\\s[^>]*>[\\s\\S]*?<\\/\\1>/g, 0)) on.add(\"term\");\n const { start, end } = lineSpan(s, a, a);\n const line = s.slice(start, end);\n if (/^##\\s/.test(line)) on.add(\"h2\");\n else if (/^###\\s/.test(line)) on.add(\"h3\");\n else if (/^[-*+]\\s/.test(line)) on.add(\"ul\");\n else if (/^\\d+[.)]\\s/.test(line)) on.add(\"ol\");\n else if (/^>/.test(line)) on.add(\"quote\");\n return on;\n}\n\n/** True when [a,b] lies strictly inside the content of a span matched by `re` (pad = marker length). */\nfunction spanAt(s: string, a: number, b: number, re: RegExp, pad: number): boolean {\n for (const m of s.matchAll(re)) {\n const from = m.index, to = from + m[0].length;\n if (a >= from + pad && b <= to - pad) return true;\n if (from > b) break;\n }\n return false;\n}\n","/**\n * Toolbar glyphs — drawn, not typed, like the report editor: \"H\", \"1.\" and a\n * quotation mark as characters next to real icons is two visual languages for\n * one job. B and I stay as letters because the letterform IS the icon.\n */\n\nimport type { ReactNode } from \"react\";\n\nconst Svg = ({ children, fill = \"none\" }: { children: ReactNode; fill?: string }) => (\n <svg className=\"realiiz-md__ico\" viewBox=\"0 0 24 24\" fill={fill} stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {children}\n </svg>\n);\n\nexport const MD_ICONS: Record<string, ReactNode> = {\n bold: <b>B</b>,\n italic: <i>I</i>,\n h2: <Svg><path d=\"M6 5v14\" /><path d=\"M14 5v14\" /><path d=\"M6 12h8\" /><path d=\"M17.5 19v-6.5l-1.6 1.2\" /></Svg>,\n h3: <Svg><path d=\"M5 5v14\" /><path d=\"M12 5v14\" /><path d=\"M5 12h7\" /><path d=\"M16 12.5h3.5l-2 2.2a1.9 1.9 0 1 1-1.5 3.2\" /></Svg>,\n ul: (\n <Svg>\n <line x1=\"9\" y1=\"6.5\" x2=\"20\" y2=\"6.5\" /><line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" /><line x1=\"9\" y1=\"17.5\" x2=\"20\" y2=\"17.5\" />\n <circle cx=\"4.6\" cy=\"6.5\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"4.6\" cy=\"12\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"4.6\" cy=\"17.5\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n </Svg>\n ),\n ol: (\n <Svg>\n <line x1=\"10\" y1=\"6.5\" x2=\"20\" y2=\"6.5\" /><line x1=\"10\" y1=\"12\" x2=\"20\" y2=\"12\" /><line x1=\"10\" y1=\"17.5\" x2=\"20\" y2=\"17.5\" />\n <path d=\"M4 5.6 5.2 5v3.4\" /><path d=\"M3.6 11.2h1.8L3.6 13.7h1.9\" /><path d=\"M3.7 16.3h1.7v1.2H4.2h1.2v1.2H3.7\" />\n </Svg>\n ),\n quote: (\n <Svg>\n <path d=\"M9 7c-2.4 0-4 1.7-4 4 0 1.9 1.3 3.2 3 3.2.4 0 .8-.1 1-.2-.3 1.4-1.5 2.6-3 3l.7 1.5c2.8-.8 4.8-3.3 4.8-6.6C11.5 8.7 10.5 7 9 7z\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M18 7c-2.4 0-4 1.7-4 4 0 1.9 1.3 3.2 3 3.2.4 0 .8-.1 1-.2-.3 1.4-1.5 2.6-3 3l.7 1.5c2.8-.8 4.8-3.3 4.8-6.6C20.5 8.7 19.5 7 18 7z\" fill=\"currentColor\" stroke=\"none\" />\n </Svg>\n ),\n link: <Svg><path d=\"M10 13a5 5 0 0 0 7.5.5l2.5-2.5a5 5 0 0 0-7-7l-1.5 1.4\" /><path d=\"M14 11a5 5 0 0 0-7.5-.5L4 13a5 5 0 0 0 7 7l1.4-1.4\" /></Svg>,\n code: <Svg><path d=\"m8 7-5 5 5 5\" /><path d=\"m16 7 5 5-5 5\" /><path d=\"m14 4-4 16\" /></Svg>,\n // A tooltip: a tall speech bubble with an \"i\" — what the reader will actually see on the page.\n term: (\n <Svg>\n <path d=\"M5 2.5h14a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-4.5L12 21.5 9.5 17.5H5a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2z\" />\n <path d=\"M12 9v4.5\" />\n <circle cx=\"12\" cy=\"6.2\" r=\".9\" fill=\"currentColor\" stroke=\"none\" />\n </Svg>\n ),\n image: <Svg><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><circle cx=\"8.5\" cy=\"8.5\" r=\"1.6\" /><path d=\"m21 15-5-5L5 21\" /></Svg>,\n dot: <span className=\"realiiz-md__dot\">·</span>,\n rule: <Svg><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /></Svg>,\n table: <Svg><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><line x1=\"3\" y1=\"9.5\" x2=\"21\" y2=\"9.5\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" /><line x1=\"12\" y1=\"9.5\" x2=\"12\" y2=\"20\" /></Svg>,\n expand: <Svg><path d=\"M9 3H3v6\" /><path d=\"M15 21h6v-6\" /><path d=\"M3 3l7 7\" /><path d=\"M21 21l-7-7\" /></Svg>,\n contract: <Svg><path d=\"M4 10h6V4\" /><path d=\"M20 14h-6v6\" /><path d=\"M3 3l7 7\" /><path d=\"M21 21l-7-7\" /></Svg>,\n};\n","/**\n * Table size picker — point at a 6×6 grid instead of typing two numbers.\n * The count is body rows; the header is always added on top.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { MD_ICONS } from \"./icons\";\n\nconst MAX = 6;\n\nexport function TableGrid({ onPick }: { onPick: (rows: number, cols: number) => void }) {\n const [open, setOpen] = useState(false);\n const [hot, setHot] = useState<[number, number]>([0, 0]);\n const wrap = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const away = (e: MouseEvent) => { if (!wrap.current?.contains(e.target as Node)) setOpen(false); };\n const esc = (e: globalThis.KeyboardEvent) => { if (e.key === \"Escape\") setOpen(false); };\n document.addEventListener(\"mousedown\", away);\n document.addEventListener(\"keydown\", esc);\n return () => { document.removeEventListener(\"mousedown\", away); document.removeEventListener(\"keydown\", esc); };\n }, [open]);\n\n const [r, c] = hot;\n const label = r && c ? `${c} column${c === 1 ? \"\" : \"s\"} × ${r} row${r === 1 ? \"\" : \"s\"}` : \"Pick a size\";\n\n return (\n <span className={[\"realiiz-md__tgwrap\", open && \"is-open\"].filter(Boolean).join(\" \")} ref={wrap}>\n <button type=\"button\" data-tool=\"table\" data-tip=\"New table — pick a size\" aria-label=\"Insert a table\" aria-expanded={open} onClick={() => setOpen((o) => !o)}>\n {MD_ICONS.table}\n </button>\n {open && (\n <span className=\"realiiz-md__tgrid\" role=\"dialog\" aria-label=\"Table size\" onMouseLeave={() => setHot([0, 0])}>\n <span className=\"realiiz-md__tgcells\">\n {Array.from({ length: MAX * MAX }, (_, n) => {\n const rr = Math.floor(n / MAX) + 1, cc = (n % MAX) + 1;\n return (\n <i\n key={n}\n className={rr <= r && cc <= c ? \"hot\" : undefined}\n onMouseEnter={() => setHot([rr, cc])}\n onClick={() => { setOpen(false); onPick(rr, cc); }}\n aria-label={`${cc} × ${rr}`}\n role=\"button\"\n />\n );\n })}\n </span>\n <span className=\"realiiz-md__tglab\">{label}</span>\n </span>\n )}\n </span>\n );\n}\n","/**\n * MarkdownEditor — a plain textarea with the report editor's toolbar and a real preview.\n *\n * Shape borrowed from the surveillance-review report editor: a segmented\n * \"Edit Markdown | Preview\" control, one toolbar row (format · link · Insert:\n * image, separator, divider, table) with buttons that TOGGLE and light up when\n * the caret sits in text of that kind, row/column controls that appear only\n * while the caret is in a table, and an Expand button that fills the window\n * (pure CSS, Esc to come back). No rich-text model — the text is the truth.\n *\n * An existing post opens in Preview (read first, then edit); a blank body opens\n * in Edit. Preview is delegated: `renderPreview(markdown)` is supplied by the\n * host site and runs its real pipeline, so what you see is what the blog\n * renders. Without it, the Preview tab is hidden.\n *\n * Edits go through execCommand(\"insertText\") when the browser allows it so the\n * native undo stack survives (assigning .value wipes it); otherwise onChange.\n */\n\nimport { useCallback, useEffect, useRef, useState, type ClipboardEvent, type DragEvent, type KeyboardEvent } from \"react\";\nimport { activeTools, insertTable, toggleTerm, toolById, type Apply, type Edit, type Tool } from \"./md/edits\";\nimport { applyTableOp, tableAt, type TableOp } from \"./md/table\";\nimport { MD_ICONS } from \"./md/icons\";\nimport { TableGrid } from \"./md/TableGrid\";\nimport { imageFromDrop, imageFromPaste, messageOf, pickFile } from \"./md/upload\";\n\nexport { TOOLS } from \"./md/edits\";\n\nexport interface MarkdownEditorProps {\n id: string;\n name?: string;\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n /** Host-supplied renderer returning HTML. Errors should be returned as `{ error }`. */\n renderPreview?: (markdown: string) => Promise<{ html: string } | { error: string }>;\n /** Extra class on the preview body, e.g. the site's own prose class so it matches the blog. */\n previewClassName?: string;\n minHeight?: number;\n /**\n * Name of the site's tooltip MDX component, e.g. \"Term\" → a toolbar button that wraps the\n * selection as `<Term definition=\"\">word</Term>`. Off unless the site has such a component.\n */\n termComponent?: string;\n /**\n * Upload a picture for the body: shrink, name and hand back its final path and a\n * preview URL. When set, the toolbar Image button opens a file picker (and drop or\n * paste of an image onto the text does the same) and inserts .\n */\n onUploadImage?: (file: File) => Promise<{ path: string; previewUrl: string }>;\n /** Paths of not-yet-committed pictures → object URLs, applied to <img src> in the preview. */\n previewSrc?: Record<string, string>;\n}\n\nconst FORMAT = [\"bold\", \"italic\"] as const;\nconst BLOCK = [\"h2\", \"h3\", \"ul\", \"ol\", \"quote\"] as const;\nconst INLINE = [\"link\", \"code\"] as const;\nconst INSERT = [\"image\", \"dot\", \"rule\"] as const;\nconst TABLE_OPS: { op: TableOp; label: string; tip: string }[] = [\n { op: \"rowAfter\", label: \"+ Row\", tip: \"Insert a row below this one\" },\n { op: \"rowDel\", label: \"− Row\", tip: \"Delete this row\" },\n { op: \"colAfter\", label: \"+ Col\", tip: \"Insert a column to the right\" },\n { op: \"colDel\", label: \"− Col\", tip: \"Delete this column\" },\n];\n\nexport function MarkdownEditor({ id, name = \"body\", value, onChange, placeholder, renderPreview, previewClassName, minHeight = 320, termComponent, onUploadImage, previewSrc }: MarkdownEditorProps) {\n const [mode, setMode] = useState<\"edit\" | \"preview\">(() => (renderPreview && value.trim() ? \"preview\" : \"edit\"));\n const [preview, setPreview] = useState<{ html: string } | { error: string } | null>(null);\n const [loading, setLoading] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [on, setOn] = useState<Set<string>>(() => new Set());\n const [inTable, setInTable] = useState(false);\n const [note, setNote] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const ta = useRef<HTMLTextAreaElement>(null);\n\n const sync = useCallback(() => {\n const el = ta.current;\n if (!el) return;\n setOn(activeTools(el.value, el.selectionStart, el.selectionEnd));\n setInTable(Boolean(tableAt(el.value, el.selectionStart)));\n }, []);\n\n const commit = (edit: Edit) => {\n const el = ta.current;\n if (!el) return;\n const { text, a, b } = edit;\n // Replace only the changed span through insertText so undo keeps working; fall back to a plain set.\n const from = commonPrefix(el.value, text);\n const oldTail = el.value.length - from, newTail = text.length - from;\n const suffix = commonSuffix(el.value.slice(from), text.slice(from));\n const oldEnd = from + oldTail - suffix, newEnd = from + newTail - suffix;\n let ok = false;\n el.focus();\n el.setSelectionRange(from, oldEnd);\n try { ok = document.execCommand(\"insertText\", false, text.slice(from, newEnd)); } catch { ok = false; }\n if (!ok || el.value !== text) onChange(text);\n requestAnimationFrame(() => { el.setSelectionRange(a, b); sync(); });\n };\n\n const run = (apply: Apply) => {\n const el = ta.current;\n if (!el) return;\n commit(apply(value, el.selectionStart, el.selectionEnd));\n };\n\n const runTable = (op: TableOp) => {\n const el = ta.current;\n if (!el) return;\n const r = applyTableOp(value, el.selectionStart, op);\n if (!r) return;\n if (\"error\" in r) { setNote(r.error); return; }\n setNote(null);\n commit(r);\n };\n\n /** Toolbar Image (with a host uploader), or a picture dropped/pasted onto the text. */\n const upload = async (file: File | undefined) => {\n const el = ta.current;\n if (!file || !onUploadImage || !el || uploading) return;\n setUploading(true);\n setNote(null);\n const a = el.selectionStart, b = el.selectionEnd;\n try {\n const { path } = await onUploadImage(file);\n const alt = value.slice(a, b) || \"description\";\n const text = value.slice(0, a) + `` + value.slice(b);\n commit({ text, a: a + 2, b: a + 2 + alt.length });\n } catch (err) {\n setNote(messageOf(err));\n } finally {\n setUploading(false);\n }\n };\n const onDrop = (e: DragEvent<HTMLTextAreaElement>) => { const f = imageFromDrop(e); if (f && onUploadImage) { e.preventDefault(); void upload(f); } };\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => { const f = imageFromPaste(e); if (f && onUploadImage) { e.preventDefault(); void upload(f); } };\n\n const onKey = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\" && expanded) { e.preventDefault(); setExpanded(false); return; }\n if (!(e.metaKey || e.ctrlKey)) return;\n if (e.key === \"b\") { e.preventDefault(); run(toolById(\"bold\").apply); }\n if (e.key === \"i\") { e.preventDefault(); run(toolById(\"italic\").apply); }\n if (e.key === \"k\") { e.preventDefault(); run(toolById(\"link\").apply); }\n };\n\n useEffect(() => {\n if (!expanded) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n const esc = (e: globalThis.KeyboardEvent) => { if (e.key === \"Escape\") setExpanded(false); };\n document.addEventListener(\"keydown\", esc);\n return () => { document.body.style.overflow = prev; document.removeEventListener(\"keydown\", esc); };\n }, [expanded]);\n\n useEffect(() => {\n if (mode !== \"preview\" || !renderPreview) return;\n let live = true;\n setLoading(true);\n renderPreview(value)\n .then((r) => { if (live) setPreview(\"html\" in r ? { html: swapPreviewSrc(r.html, previewSrc) } : r); })\n .catch((err: unknown) => { if (live) setPreview({ error: err instanceof Error ? err.message : String(err) }); })\n .finally(() => { if (live) setLoading(false); });\n return () => { live = false; };\n }, [mode, value, renderPreview, previewSrc]);\n\n const termTool: Tool | null = termComponent\n ? { id: \"term\", title: `Tooltip — wraps the selection in <${termComponent}>`, apply: toggleTerm(termComponent) }\n : null;\n\n const btn = (toolId: string) => {\n const t = toolId === \"term\" && termTool ? termTool : toolById(toolId);\n const uploads = t.id === \"image\" && Boolean(onUploadImage);\n const title = uploads ? (uploading ? \"Shrinking…\" : \"Picture — choose a file, or drop/paste one into the text\") : t.title;\n return (\n <button key={t.id} type=\"button\" data-tool={t.id} data-tip={title} aria-label={title} aria-pressed={on.has(t.id) || undefined} aria-busy={uploads && uploading ? true : undefined} className={on.has(t.id) ? \"on\" : undefined} disabled={uploads && uploading} onMouseDown={(e) => e.preventDefault()} onClick={() => (uploads ? pickFile().then(upload) : run(t.apply))}>\n {MD_ICONS[t.id]}\n </button>\n );\n };\n\n return (\n <div className={[\"realiiz-md\", expanded && \"realiiz-md--fs\"].filter(Boolean).join(\" \")}>\n {renderPreview && (\n <span className=\"realiiz-md__mode\" role=\"tablist\" aria-label=\"Editor mode\">\n <button type=\"button\" role=\"tab\" aria-selected={mode === \"edit\"} onClick={() => setMode(\"edit\")}>Edit Markdown</button>\n <button type=\"button\" role=\"tab\" aria-selected={mode === \"preview\"} onClick={() => setMode(\"preview\")}>Preview</button>\n </span>\n )}\n\n <div className=\"realiiz-md__panel\">\n <div className=\"realiiz-md__head\">\n {mode === \"edit\" && (\n <span className=\"realiiz-md__tools\" role=\"toolbar\" aria-label=\"Formatting\">\n {FORMAT.map(btn)}\n <span className=\"realiiz-md__sep\" />\n {BLOCK.map(btn)}\n <span className=\"realiiz-md__sep\" />\n {INLINE.map(btn)}\n {termTool && btn(\"term\")}\n {inTable && (\n <>\n <span className=\"realiiz-md__sep\" />\n {TABLE_OPS.map((t) => (\n <button key={t.op} type=\"button\" data-tbl-op={t.op} data-tip={t.tip} aria-label={t.tip} onMouseDown={(e) => e.preventDefault()} onClick={() => runTable(t.op)}>{t.label}</button>\n ))}\n </>\n )}\n <span className=\"realiiz-md__insert\">\n <span className=\"realiiz-md__lab\">Insert</span>\n {INSERT.map(btn)}\n <TableGrid onPick={(r, c) => run(insertTable(r, c))} />\n </span>\n </span>\n )}\n <span className=\"realiiz-md__spacer\" />\n <button\n type=\"button\"\n className=\"realiiz-md__expand\"\n data-tip={expanded ? \"Back to the normal layout — or press Esc\" : \"Fill the window — Esc to come back\"}\n aria-label={expanded ? \"Exit\" : \"Expand\"}\n onClick={() => setExpanded((x) => !x)}\n >\n {expanded ? MD_ICONS.contract : MD_ICONS.expand}\n </button>\n </div>\n\n {mode === \"edit\" ? (\n <textarea\n ref={ta}\n id={id}\n name={name}\n className=\"realiiz-form__control realiiz-form__control--body realiiz-md__ta\"\n style={expanded ? undefined : { minHeight }}\n value={value}\n placeholder={placeholder}\n onChange={(e) => { onChange(e.target.value); sync(); }}\n onSelect={sync}\n onKeyUp={sync}\n onClick={sync}\n onKeyDown={onKey}\n onDrop={onDrop}\n onPaste={onPaste}\n spellCheck\n />\n ) : (\n <div className=\"realiiz-md__preview\" style={expanded ? undefined : { minHeight }} aria-live=\"polite\" aria-busy={loading}>\n {loading && <div className=\"realiiz-md__loading\">Rendering…</div>}\n {!loading && preview && \"error\" in preview && (\n <div className=\"realiiz-form__alert\" role=\"alert\">Couldn't render: {preview.error}</div>\n )}\n {!loading && preview && \"html\" in preview && (\n <div className={[\"realiiz-prose\", previewClassName].filter(Boolean).join(\" \")} dangerouslySetInnerHTML={{ __html: preview.html }} />\n )}\n </div>\n )}\n </div>\n {(note || uploading) && <div className=\"realiiz-form__helper realiiz-md__note\" role=\"status\">{uploading ? \"Shrinking…\" : note}</div>}\n </div>\n );\n}\n\n/** Point <img src=\"/blog/x/y.webp\"> at its object URL while the file exists only in this browser. */\nexport function swapPreviewSrc(html: string, map?: Record<string, string>): string {\n if (!map || Object.keys(map).length === 0) return html;\n return html.replace(/(<img\\b[^>]*\\bsrc=\")([^\"]+)(\")/g, (m, pre: string, src: string, post: string) => (map[src] ? `${pre}${map[src]}${post}` : m));\n}\n\nfunction commonPrefix(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[i] === b[i]) i++;\n return i;\n}\nfunction commonSuffix(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[a.length - 1 - i] === b[b.length - 1 - i]) i++;\n return i;\n}\n","/**\n * zod issue → { field, key, message }. Pure.\n *\n * The key matches FieldSpec.messages so the schema's own per-check wording is\n * what the client reads. Observed on zod 4.5.4 (see the ADMIN-02b brief):\n * too_small / too_big origin string|array → min_length / max_length\n * origin number → greater_than / less_than\n * when the spec has `exact` → length_equals\n * invalid_format format regex|url|… → that format\n * invalid_type + format safeint (from .int()) → int\n * custom → custom\n * unrecognized_keys path [] , keys: [...] → form-level\n */\n\nimport type { FieldSpec } from \"../forms\";\n\nexport interface FieldIssue {\n /** null for form-level issues. */\n field: string | null;\n key: string;\n message: string;\n}\n\ninterface ZodIssueLike {\n code: string;\n path: PropertyKey[];\n message: string;\n origin?: string;\n format?: string;\n keys?: string[];\n}\n\nexport function mapIssues(issues: ZodIssueLike[], specs: FieldSpec[]): FieldIssue[] {\n const byName = new Map(specs.map((s) => [s.name, s]));\n return issues.map((issue) => {\n const field = typeof issue.path[0] === \"string\" ? issue.path[0] : null;\n const spec = field ? byName.get(field) : undefined;\n const key = keyFor(issue, spec);\n const message =\n (spec?.messages[key] ?? (issue.code === \"unrecognized_keys\" ? unknownKeysMessage(issue) : undefined)) ??\n issue.message;\n return { field, key, message };\n });\n}\n\nfunction keyFor(issue: ZodIssueLike, spec?: FieldSpec): string {\n const numeric = issue.origin === \"number\" || issue.origin === \"int\";\n switch (issue.code) {\n case \"too_small\":\n if (spec?.constraints.exact !== undefined) return \"length_equals\";\n return numeric ? \"greater_than\" : \"min_length\";\n case \"too_big\":\n if (spec?.constraints.exact !== undefined) return \"length_equals\";\n return numeric ? \"less_than\" : \"max_length\";\n case \"invalid_format\":\n return issue.format ?? \"format\";\n case \"invalid_type\":\n return issue.format === \"safeint\" || issue.format === \"int32\" ? \"int\" : \"invalid_type\";\n default:\n return issue.code;\n }\n}\n\nfunction unknownKeysMessage(issue: ZodIssueLike): string {\n const keys = issue.keys ?? [];\n return `This file has ${keys.length === 1 ? \"a field\" : \"fields\"} the site does not recognise: ${keys.join(\", \")}. It was probably edited by hand — remove or rename ${keys.length === 1 ? \"it\" : \"them\"} to continue.`;\n}\n\n/** Group by field for rendering. */\nexport function groupIssues(list: FieldIssue[]): { byField: Map<string, FieldIssue[]>; formLevel: FieldIssue[] } {\n const byField = new Map<string, FieldIssue[]>();\n const formLevel: FieldIssue[] = [];\n for (const i of list) {\n if (i.field === null) formLevel.push(i);\n else byField.set(i.field, [...(byField.get(i.field) ?? []), i]);\n }\n return { byField, formLevel };\n}\n","/**\n * Control strings ↔ frontmatter values. Pure.\n *\n * Controls hold strings (or booleans / string arrays). The schema wants typed\n * values. An image field holds its PATH as a string; the picked bytes live\n * beside the form state (ContentForm `images`) and never pass through here.\n * `toControl` seeds a control from an existing frontmatter value — including\n * a Date from a previously-parsed file — and `toValue` assembles what goes to\n * safeParse. Anything the schema then coerces (dates) is the schema's business.\n */\n\nimport type { FieldSpec } from \"../forms\";\n\nexport type ControlValue = string | string[] | boolean | null;\nexport type FormState = Record<string, ControlValue>;\n\nexport function toControl(spec: FieldSpec, raw: unknown): ControlValue {\n if (raw === undefined || raw === null) return spec.input === \"boolean\" ? false : \"\";\n switch (spec.input) {\n case \"boolean\":\n return Boolean(raw);\n case \"date\": {\n // <input type=\"date\"> only accepts YYYY-MM-DD; frontmatter often carries a full ISO stamp.\n if (raw instanceof Date) return raw.toISOString().slice(0, 10);\n const s = String(raw);\n return /^\\d{4}-\\d{2}-\\d{2}/.test(s) ? s.slice(0, 10) : s;\n }\n case \"tags\":\n return Array.isArray(raw) ? raw.map(String) : String(raw).split(\",\").map((t) => t.trim()).filter(Boolean);\n default:\n return String(raw);\n }\n}\n\n/** Build the object that goes to schema.safeParse. Empty optional fields are omitted. */\nexport function toFrontmatter(\n specs: FieldSpec[],\n state: FormState,\n hiddenValues: Record<string, unknown>,\n): Record<string, unknown> {\n const frontmatter: Record<string, unknown> = { ...hiddenValues };\n\n for (const spec of specs) {\n if (spec.role === \"hidden\" || spec.role === \"body\") continue;\n const v = state[spec.name];\n\n if (spec.input === \"boolean\") {\n if (v === true) frontmatter[spec.name] = true;\n else if (spec.required) frontmatter[spec.name] = false;\n continue;\n }\n if (Array.isArray(v)) {\n if (v.length || spec.required) frontmatter[spec.name] = v;\n continue;\n }\n const s = typeof v === \"string\" ? v.trim() : \"\";\n if (s === \"\") {\n // Required fields are sent empty so the schema's own \"is required\" message fires.\n if (spec.required) frontmatter[spec.name] = spec.input === \"tags\" ? [] : \"\";\n continue;\n }\n switch (spec.input) {\n case \"number\": {\n const n = Number(s);\n frontmatter[spec.name] = Number.isNaN(n) ? s : n;\n break;\n }\n case \"tags\":\n frontmatter[spec.name] = s.split(\",\").map((t) => t.trim()).filter(Boolean);\n break;\n default:\n frontmatter[spec.name] = s;\n }\n }\n return frontmatter;\n}\n","/**\n * ContentForm — a ContentTypeEntry in, validated { frontmatter, body, images } out.\n *\n * Validation runs on submit. After the first failed submit it also re-runs on\n * blur, so the client watches the error clear as they fix it. Before that\n * first submit the form stays quiet — nagging someone who hasn't finished\n * typing is the wrong default for this audience.\n *\n * The schema is the only judge. This component never decides what is valid;\n * it assembles values, calls entry.schema.safeParse, and maps issues back to\n * fields with the schema's own messages.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type FormEvent, type ReactNode } from \"react\";\nimport type { ContentTypeEntry, FieldSpec } from \"../forms\";\nimport { walkSchema } from \"../forms\";\nimport { Field, type LabelRenderer } from \"./Field\";\nimport { MarkdownEditor, type MarkdownEditorProps } from \"./MarkdownEditor\";\nimport { groupIssues, mapIssues, type FieldIssue } from \"./issues\";\nimport { FORM_CSS } from \"./styles\";\nimport { toControl, toFrontmatter, type ControlValue, type FormState } from \"./values\";\nimport { useImages, type PickImage, type SubmittedImages } from \"./images\";\n\nexport interface ContentFormSubmission {\n frontmatter: Record<string, unknown>;\n body: string;\n /** Newly picked pictures by field name — the frontmatter already holds each one's final path. */\n images: SubmittedImages;\n}\n\nexport interface ContentFormProps {\n entry: ContentTypeEntry;\n initialValues?: Record<string, unknown>;\n initialBody?: string;\n onSubmit: (s: ContentFormSubmission) => void | Promise<void>;\n onCancel?: () => void;\n submitLabel?: string;\n className?: string;\n /**\n * Show the MDX body textarea (the content below the frontmatter). Default\n * true — most types have a body. Pass false for frontmatter-only types such\n * as venues. Independent of entry.body, which names a frontmatter FIELD\n * that should be edited as long text.\n */\n showBody?: boolean;\n bodyLabel?: string;\n /** Host-supplied Markdown/MDX renderer for the Preview tab. Without it the editor is edit-only. */\n renderPreview?: MarkdownEditorProps[\"renderPreview\"];\n previewClassName?: string;\n /** Site tooltip MDX component name (e.g. \"Term\") to expose as a toolbar button. */\n termComponent?: string;\n /**\n * Image fields: shrink and name a chosen file (the host knows the slug and the\n * size rules) and hand back { path, blob, previewUrl?, width?, height? }. The\n * field's value becomes `path`; the blob rides along in the submission. Without\n * this, image fields are plain text paths.\n */\n onPickImage?: PickImage;\n /** Editor toolbar Image button: upload a picture for the body and return its path + preview URL. */\n onUploadImage?: MarkdownEditorProps[\"onUploadImage\"];\n /** Paths of not-yet-committed pictures → object URLs, so the Preview tab shows them. */\n previewSrc?: MarkdownEditorProps[\"previewSrc\"];\n /**\n * Put Cancel/Save in a bar that the host can pin to the bottom of the page\n * (`.realiiz-form__bar`; the shell makes it sticky). The bar also reports\n * \"Unsaved changes\" / \"No changes yet\", or `status` when the host supplies one.\n */\n stickyBar?: boolean;\n status?: ReactNode;\n /** Extra controls in the bar, before Cancel/Save — e.g. a link to review a pending change. */\n barExtra?: ReactNode;\n /** Rendered after the fields and before the bar — the right place for a quiet destructive action (remove this item). */\n footer?: ReactNode;\n /** Draw a field label that has `.meta({ help })` — pass the site's tooltip component so labels explain themselves. */\n renderLabel?: LabelRenderer;\n /**\n * Fill `target` from `source` while the person types, until they edit `target`\n * themselves — e.g. { source: \"title\", target: \"slug\" } for a web address.\n * Only kicks in when `target` started empty (a new item), never on an existing one.\n */\n derive?: { source: string; target: string; transform?: (value: string) => string };\n /**\n * Warn before leaving with unsaved edits: the browser's own prompt on close/reload,\n * and a confirm on in-app link clicks (which never fire beforeunload). Default true.\n */\n guardUnsaved?: boolean;\n}\n\nconst LEAVE_MESSAGE = \"You have unsaved changes. Leave this page and lose them?\";\n\n/** \"Hello, World! 2026\" → \"hello-world-2026\" — the same rule the blog's slug regex enforces. */\nexport function slugify(s: string): string {\n return s\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\ntype SafeParse = { success: true; data: unknown } | { success: false; error: { issues: Parameters<typeof mapIssues>[0] } };\n\nexport function ContentForm({ entry, initialValues = {}, initialBody = \"\", onSubmit, onCancel, submitLabel = \"Save\", className, showBody = true, bodyLabel = \"Content\", renderPreview, previewClassName, termComponent, onPickImage, onUploadImage, previewSrc, stickyBar = false, status, barExtra, footer, renderLabel, derive, guardUnsaved = true }: ContentFormProps) {\n const formId = useId();\n const specs = useMemo(() => walkSchema(entry.schema, entry), [entry]);\n const visible = useMemo(() => specs.filter((s) => s.role !== \"hidden\" && s.role !== \"body\"), [specs]);\n const bodySpec = specs.find((s) => s.role === \"body\");\n // Main section first, then each registry group in its own fieldset, fields in the group's order.\n const sections = useMemo(() => {\n const groups = entry.groups ?? [];\n const grouped = new Set(groups.flatMap((g) => g.fields));\n const byName = new Map(visible.map((s) => [s.name, s]));\n const main = { label: entry.singular ?? entry.label, fields: visible.filter((s) => !grouped.has(s.name)) };\n const rest = groups\n .map((g) => ({ label: g.label, fields: g.fields.map((n) => byName.get(n)).filter((s): s is FieldSpec => Boolean(s)) }))\n .filter((g) => g.fields.length > 0);\n return [main, ...rest];\n }, [visible, entry.groups, entry.label, entry.singular]);\n\n const initialState = useMemo<FormState>(() => Object.fromEntries(specs.map((s) => [s.name, toControl(s, initialValues[s.name])])), [specs, initialValues]);\n const [state, setState] = useState<FormState>(initialState);\n // Derivation runs only while the target is untouched AND started empty (a new item).\n const [deriving, setDeriving] = useState(() => Boolean(derive && !initialState[derive.target]));\n const update = (name: string, v: ControlValue) =>\n setState((st) => {\n const next = { ...st, [name]: v };\n if (derive && deriving && name === derive.source && typeof v === \"string\") {\n next[derive.target] = (derive.transform ?? slugify)(v);\n }\n return next;\n });\n const onFieldChange = (name: string, v: ControlValue) => {\n if (derive && deriving && name === derive.target) setDeriving(false);\n update(name, v);\n };\n const [body, setBody] = useState(initialBody);\n const pictures = useImages();\n const pickImage = onPickImage\n ? (field: string) => async (file: File) => {\n const r = await onPickImage(field, file);\n pictures.keep(field, r, typeof state[field] === \"string\" ? (state[field] as string) : \"\");\n onFieldChange(field, r.path);\n }\n : undefined;\n const removeImage = (field: string) => () => {\n const previous = pictures.remove(field);\n onFieldChange(field, previous ?? \"\");\n };\n const dirty = body !== initialBody || specs.some((s) => !sameValue(state[s.name], initialState[s.name]));\n const [issues, setIssues] = useState<FieldIssue[]>([]);\n const [attempted, setAttempted] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [options, setOptions] = useState<Record<string, string[] | \"loading\">>({});\n\n // Hidden fields (and any initial key with no spec) ride through untouched.\n const hiddenValues = useMemo(() => {\n const shown = new Set(visible.map((s) => s.name));\n if (bodySpec) shown.add(bodySpec.name);\n return Object.fromEntries(Object.entries(initialValues).filter(([k]) => !shown.has(k)));\n }, [initialValues, visible, bodySpec]);\n\n // Resolve function option sources once, on mount.\n useEffect(() => {\n let live = true;\n for (const s of visible) {\n if (typeof s.options !== \"function\") continue;\n setOptions((o) => ({ ...o, [s.name]: \"loading\" }));\n Promise.resolve(s.options()).then((list) => {\n if (live) setOptions((o) => ({ ...o, [s.name]: list }));\n });\n }\n return () => {\n live = false;\n };\n }, [visible]);\n\n // Leaving with edits: native prompt for close/reload, a confirm for same-app links (client routers skip beforeunload).\n const leaving = useRef(false);\n useEffect(() => {\n if (!guardUnsaved || !dirty || submitting) return;\n const onUnload = (e: BeforeUnloadEvent) => { if (!leaving.current) { e.preventDefault(); e.returnValue = LEAVE_MESSAGE; } };\n const onClick = (e: MouseEvent) => {\n const a = (e.target as HTMLElement | null)?.closest?.(\"a[href]\") as HTMLAnchorElement | null;\n if (!a || a.target === \"_blank\" || e.defaultPrevented || e.metaKey || e.ctrlKey) return;\n if (a.origin !== window.location.origin) return;\n if (!window.confirm(LEAVE_MESSAGE)) { e.preventDefault(); e.stopPropagation(); }\n else leaving.current = true;\n };\n window.addEventListener(\"beforeunload\", onUnload);\n document.addEventListener(\"click\", onClick, true);\n return () => { window.removeEventListener(\"beforeunload\", onUnload); document.removeEventListener(\"click\", onClick, true); };\n }, [guardUnsaved, dirty, submitting]);\n\n const validate = useCallback((): SafeParse => {\n const frontmatter = toFrontmatter(specs, state, hiddenValues);\n const result = (entry.schema as { safeParse: (v: unknown) => SafeParse }).safeParse(frontmatter);\n setIssues(result.success ? [] : mapIssues(result.error.issues, specs));\n return result;\n }, [entry.schema, specs, state, hiddenValues]);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (submitting) return;\n setAttempted(true);\n const result = validate();\n if (!result.success) return;\n setSubmitting(true);\n try {\n await onSubmit({ frontmatter: result.data as Record<string, unknown>, body, images: pictures.toSubmission() });\n } finally {\n setSubmitting(false);\n }\n };\n\n const { byField, formLevel } = groupIssues(issues);\n const optionsFor = (s: FieldSpec) => options[s.name] ?? (Array.isArray(s.options) ? s.options : undefined);\n\n return (\n <form className={[\"realiiz-form\", className].filter(Boolean).join(\" \")} onSubmit={handleSubmit} noValidate data-realiiz-content-form={entry.id}>\n <style>{FORM_CSS}</style>\n\n {formLevel.length > 0 && (\n <div className=\"realiiz-form__alert\" role=\"alert\">\n <strong>This can't be saved yet.</strong>\n <ul>{formLevel.map((i, n) => <li key={n}>{i.message}</li>)}</ul>\n </div>\n )}\n\n {sections.map((sec) => (\n <fieldset key={sec.label}>\n <legend>{sec.label}</legend>\n {sec.fields.map((s) => (\n <Field key={s.name} formId={formId} spec={s} value={state[s.name]} issues={byField.get(s.name) ?? []}\n options={optionsFor(s)}\n renderLabel={renderLabel}\n picked={pictures.images[s.name]}\n onPickImage={pickImage?.(s.name)}\n onRemoveImage={removeImage(s.name)}\n onChange={(v: ControlValue) => onFieldChange(s.name, v)}\n onBlur={() => { if (attempted) validate(); }} />\n ))}\n </fieldset>\n ))}\n\n {(showBody || bodySpec) && (\n <fieldset>\n <legend>{bodySpec?.label ?? bodyLabel}</legend>\n {/* The legend already names this section; the label stays for assistive tech only. */}\n <label className=\"realiiz-form__label realiiz-sr-only\" htmlFor={`${formId}-body`}>{bodySpec?.label ?? bodyLabel}</label>\n <MarkdownEditor\n id={`${formId}-body`}\n value={body}\n onChange={setBody}\n placeholder={bodySpec?.placeholder ?? \"Write in Markdown. Headings with ##, links as [text](url).\"}\n renderPreview={renderPreview}\n previewClassName={previewClassName}\n termComponent={termComponent}\n onUploadImage={onUploadImage}\n previewSrc={previewSrc}\n />\n </fieldset>\n )}\n\n {/* Sole child of its own box: a server-created element dropped straight into this children array trips React's key check. */}\n {footer && <div className=\"realiiz-form__footer\">{footer}</div>}\n\n <div className={stickyBar ? \"realiiz-form__bar\" : \"realiiz-form__actions\"} data-dirty={dirty || undefined}>\n {stickyBar && (\n <span className=\"realiiz-form__status\" role=\"status\">\n {status ?? (dirty ? \"Unsaved changes\" : \"No changes yet\")}\n </span>\n )}\n {stickyBar && barExtra}\n {onCancel && <button type=\"button\" className=\"realiiz-form__button\" onClick={onCancel}>Cancel</button>}\n <button type=\"submit\" className=\"realiiz-form__button realiiz-form__button--primary\" disabled={submitting}>\n {submitting ? `${submitLabel}…` : submitLabel}\n </button>\n </div>\n </form>\n );\n}\n\nfunction sameValue(a: ControlValue | undefined, b: ControlValue | undefined): boolean {\n if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((v, i) => v === b[i]);\n return a === b;\n}\n","/** A picture problem the person can act on. The message is the sentence shown under the control. */\nexport class MediaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MediaError\";\n }\n}\n\nexport const MESSAGES = {\n type: \"That file type isn’t supported — use a JPG, PNG or WebP.\",\n size: \"That picture is too big to send — pick one under 10MB.\",\n encode: \"This browser can’t prepare pictures — try Chrome, Edge or Safari 16+.\",\n} as const;\n","/**\n * resizeImage — shrink a picture in the browser to web size, as WebP.\n *\n * Phone photos are 3–8MB; a Vercel server action body is capped at 4.5MB and the\n * GitHub API wants base64. So the shrink happens here, before anything leaves the\n * browser: decode → fit inside maxWidth → draw to a canvas → encode WebP, lowering\n * quality in steps until the result is under maxBytes. GIFs lose their animation\n * (a still frame is encoded) — acceptable for a blog.\n *\n * No network, no dependencies. Throws MediaError with a plain sentence for the\n * three things that can go wrong: wrong type, too big to even try, or a browser\n * that cannot encode WebP (toBlob returns null or a non-WebP type).\n */\n\nimport { MediaError, MESSAGES } from \"./errors\";\n\nexport const ACCEPTED_TYPES = [\"image/jpeg\", \"image/png\", \"image/webp\", \"image/gif\"] as const;\nexport const MAX_INPUT_BYTES = 10 * 1024 * 1024;\n\nexport interface ResizeOptions {\n /** Longest allowed width in pixels. Default 1600. */\n maxWidth?: number;\n /** Starting WebP quality 0–1. Default 0.82. */\n quality?: number;\n /** Target ceiling for the encoded size. Default 600KB. */\n maxBytes?: number;\n}\n\nexport interface ResizedImage {\n blob: Blob;\n width: number;\n height: number;\n}\n\n/** Pure: fit (width × height) inside maxWidth, never scaling up, whole pixels. */\nexport function fitWithin(width: number, height: number, maxWidth: number): { width: number; height: number } {\n if (width <= maxWidth) return { width, height };\n const ratio = maxWidth / width;\n return { width: Math.round(width * ratio), height: Math.max(1, Math.round(height * ratio)) };\n}\n\n/** The type/size guards, separated so they can run (and be tested) without a canvas. */\nexport function checkInput(file: { type: string; size: number }): void {\n if (!(ACCEPTED_TYPES as readonly string[]).includes(file.type)) throw new MediaError(MESSAGES.type);\n if (file.size > MAX_INPUT_BYTES) throw new MediaError(MESSAGES.size);\n}\n\nexport async function resizeImage(file: File, opts: ResizeOptions = {}): Promise<ResizedImage> {\n checkInput(file);\n const { maxWidth = 1600, quality = 0.82, maxBytes = 600 * 1024 } = opts;\n\n const bitmap = await decode(file);\n const { width, height } = fitWithin(bitmap.width, bitmap.height, maxWidth);\n const canvas = makeCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new MediaError(MESSAGES.encode);\n ctx.drawImage(bitmap, 0, 0, width, height);\n bitmap.close?.();\n\n let q = quality;\n let blob = await encode(canvas, q);\n while (blob.size > maxBytes && q - 0.08 >= 0.5) {\n q -= 0.08;\n blob = await encode(canvas, q);\n }\n return { blob, width, height };\n}\n\nasync function decode(file: File): Promise<ImageBitmap> {\n try {\n return await createImageBitmap(file);\n } catch {\n throw new MediaError(MESSAGES.encode);\n }\n}\n\ntype AnyCanvas = HTMLCanvasElement | OffscreenCanvas;\n\nfunction makeCanvas(width: number, height: number): AnyCanvas {\n if (typeof OffscreenCanvas !== \"undefined\") return new OffscreenCanvas(width, height);\n const c = document.createElement(\"canvas\");\n c.width = width;\n c.height = height;\n return c;\n}\n\nasync function encode(canvas: AnyCanvas, quality: number): Promise<Blob> {\n const blob =\n \"convertToBlob\" in canvas\n ? await canvas.convertToBlob({ type: \"image/webp\", quality }).catch(() => null)\n : await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, \"image/webp\", quality));\n if (!blob || blob.type !== \"image/webp\") throw new MediaError(MESSAGES.encode);\n return blob;\n}\n","/**\n * Where a picture lives, decided from the post's slug so the path is known before\n * anything is committed: hero → /blog/{slug}.webp, social → /blog/{slug}-social.webp,\n * body → /blog/{slug}/{name}.webp. The host commits the file under public/ + path.\n */\n\nexport type ImageKind = \"hero\" | \"social\" | \"body\";\n\nexport interface PathOptions {\n /** URL prefix the pictures are served from. Default \"/blog\". */\n publicDir?: string;\n}\n\n/** Lower-case letters, digits and single hyphens; empty in → \"image\". */\nexport function slugifyName(name: string): string {\n const base = name.replace(/\\.[a-z0-9]+$/i, \"\");\n const s = base\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s || \"image\";\n}\n\nexport function imagePathFor(kind: ImageKind, slug: string, originalName = \"\", opts: PathOptions = {}): string {\n const dir = (opts.publicDir ?? \"/blog\").replace(/\\/$/, \"\");\n switch (kind) {\n case \"hero\":\n return `${dir}/${slug}.webp`;\n case \"social\":\n return `${dir}/${slug}-social.webp`;\n case \"body\":\n return `${dir}/${slug}/${slugifyName(originalName)}.webp`;\n }\n}\n","\"use client\";\n\n/**\n * Pictures for the post editor (ADMIN-06b). Chosen files are shrunk to WebP in\n * the browser, named from the slug, and held here until Save, when they ride\n * along with the post as base64 and land in the same commit. Nothing is\n * written when a picture is picked.\n *\n * Field pictures (hero, social) are kept by ContentForm itself; this hook only\n * shrinks and names them. Body pictures (toolbar / paste / drop) are kept here,\n * with an object URL so the Preview tab can show them before they exist.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { imagePathFor, MediaError, resizeImage, type ImageKind } from \"../media\";\nimport type { PickResult, SubmittedImages } from \"../forms-ui\";\nimport type { ImagePayload } from \"./types\";\n\nconst HERO_WIDTH = 1600;\nconst BODY_WIDTH = 1400;\nconst SLUG_FIRST = \"Fill in the web address (slug) first — the picture is named after it.\";\n\nexport function useImages(getSlug: () => string, publicDir = \"/blog/\") {\n const dir = publicDir.replace(/\\/$/, \"\");\n const [body, setBody] = useState<Record<string, { blob: Blob; previewUrl: string }>>({});\n const urls = useRef(new Set<string>());\n useEffect(() => {\n const set = urls.current;\n return () => { for (const u of set) URL.revokeObjectURL(u); };\n }, []);\n\n const latest = useRef({ getSlug, dir });\n latest.current = { getSlug, dir };\n const slugOrThrow = () => {\n const slug = latest.current.getSlug().trim();\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) throw new MediaError(SLUG_FIRST);\n return slug;\n };\n\n /** ContentForm's onPickImage: hero and social-share fields. */\n const pickField = useCallback(async (field: string, file: File): Promise<PickResult> => {\n const slug = slugOrThrow();\n const kind: ImageKind = field === \"ogImage\" ? \"social\" : \"hero\";\n const r = await resizeImage(file, { maxWidth: HERO_WIDTH });\n return { path: imagePathFor(kind, slug, undefined, { publicDir: latest.current.dir }), blob: r.blob, width: r.width, height: r.height };\n }, []);\n\n /** MarkdownEditor's onUploadImage: pictures in the text. */\n const uploadBody = useCallback(async (file: File) => {\n const slug = slugOrThrow();\n const r = await resizeImage(file, { maxWidth: BODY_WIDTH });\n const path = imagePathFor(\"body\", slug, file.name, { publicDir: latest.current.dir });\n const previewUrl = URL.createObjectURL(r.blob);\n urls.current.add(previewUrl);\n setBody((m) => ({ ...m, [path]: { blob: r.blob, previewUrl } }));\n return { path, previewUrl };\n }, []);\n\n const previewSrc = Object.fromEntries(Object.entries(body).map(([p, v]) => [p, v.previewUrl]));\n\n /** Everything to send with the save: field pictures from the form plus body pictures still referenced in the text. */\n const toPayload = useCallback(async (fields: SubmittedImages, markdown: string): Promise<ImagePayload[]> => {\n const out: { path: string; blob: Blob }[] = Object.values(fields);\n for (const [path, v] of Object.entries(body)) if (markdown.includes(path)) out.push({ path, blob: v.blob });\n return Promise.all(out.map(async ({ path, blob }) => ({ path, base64: await toBase64(blob) })));\n }, [body]);\n\n return { pickField, uploadBody, previewSrc, toPayload };\n}\n\nfunction toBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result).split(\",\")[1] ?? \"\");\n r.onerror = () => reject(r.error);\n r.readAsDataURL(blob);\n });\n}\n","\"use client\";\n\nimport { useState, useTransition } from \"react\";\nimport { ContentForm, type ContentFormSubmission } from \"../forms-ui\";\nimport { LinkButton } from \"../shell\";\nimport { StudioTerm } from \"./term\";\nimport { publicDirOf, useEntry, useStudio } from \"./context\";\nimport { useImages } from \"./useImages\";\n\n/**\n * Client wrapper for any registered content type: ContentForm (client) →\n * publishContent (server action). The registry entry holds functions and a\n * zod schema, so it can't cross the server→client boundary — the page passes\n * the type id and this component looks the entry up on the client.\n */\nexport function ContentEditor({ typeId, initialValues, initialBody, existing = null, isNew = false, footer }: {\n typeId: string;\n initialValues?: Record<string, unknown>;\n /** A brand-new item: the web address follows the title until it's edited by hand. */\n isNew?: boolean;\n initialBody?: string;\n /** An open change for this file; saves go onto its branch (05c). */\n existing?: { number: number; branch: string; state: \"checking\" | \"ready\" | \"failed\" } | null;\n /** Rendered under the fields, above the save bar (e.g. Remove this post). */\n footer?: React.ReactNode;\n}) {\n const entry = useEntry(typeId);\n const { publishContent, previewBody } = useStudio().actions;\n const [error, setError] = useState<string | null>(null);\n const [, startTransition] = useTransition();\n // Pictures are named after the slug, read from the form at pick time (ContentForm owns the field state).\n const pictures = useImages(\n () => (document.querySelector(`form[data-realiiz-content-form=\"${typeId}\"] [name=\"slug\"]`) as HTMLInputElement | null)?.value ?? \"\",\n entry ? publicDirOf(entry) : \"/images/\",\n );\n if (!entry) return <div className=\"rz-alert\" role=\"alert\">Unknown content type “{typeId}”.</div>;\n\n const onSubmit = (s: ContentFormSubmission) =>\n new Promise<void>((resolve) => {\n startTransition(async () => {\n setError(null);\n const images = await pictures.toPayload(s.images, s.body);\n const result = await publishContent({ type: typeId, frontmatter: s.frontmatter, body: s.body, images, existing: existing ? { number: existing.number, branch: existing.branch } : null });\n // A redirect never returns; anything that does is an error.\n if (result && result.ok === false) setError(result.error);\n resolve();\n });\n });\n\n return (\n <>\n {error && <div className=\"rz-alert\" role=\"alert\">{error}</div>}\n <ContentForm\n entry={entry}\n initialValues={initialValues}\n initialBody={initialBody}\n onSubmit={onSubmit}\n submitLabel={existing ? \"Save changes\" : \"Save and continue\"}\n stickyBar\n status={existing ? `Change #${existing.number} is waiting to publish — saving updates it` : undefined}\n barExtra={existing ? <LinkButton forward href={`/admin/pr/${existing.number}`}>{existing.state === \"ready\" ? \"Review & publish\" : \"See progress\"}</LinkButton> : undefined}\n bodyLabel={entry.id === \"posts\" ? \"Post content\" : \"Description\"}\n renderPreview={previewBody}\n previewClassName=\"blog-prose\"\n termComponent=\"StudioTerm\"\n onPickImage={pictures.pickField}\n onUploadImage={pictures.uploadBody}\n previewSrc={pictures.previewSrc}\n renderLabel={(label, help) => <StudioTerm definition={help}>{label}</StudioTerm>}\n derive={isNew ? { source: \"title\", target: \"slug\" } : undefined}\n footer={footer}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useTransition } from \"react\";\nimport { Button } from \"../shell\";\nimport { useEntry, useStudio } from \"./context\";\nimport { copyFor } from \"./copy\";\n\n/**\n * Take an item down. Quiet link → inline confirm → one change that deletes the\n * file, reviewed and published like any other. Nothing disappears until Publish.\n */\nexport function RemoveItem({ typeId, slug }: { typeId: string; slug: string }) {\n const [confirm, setConfirm] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pending, start] = useTransition();\n const entry = useEntry(typeId);\n const { removeContent } = useStudio().actions;\n if (!entry) return null;\n const copy = copyFor(entry);\n\n const remove = () =>\n start(async () => {\n const r = await removeContent({ type: typeId, slug });\n if (r && r.ok === false) setError(r.error);\n });\n\n return (\n <div className=\"rz-discard\">\n {confirm ? (\n <>\n <span>{copy.removeConfirm}</span>\n <Button variant=\"danger\" size=\"sm\" disabled={pending} onClick={remove}>{pending ? \"Preparing…\" : \"Yes, remove it\"}</Button>\n <Button size=\"sm\" onClick={() => setConfirm(false)}>Keep it</Button>\n </>\n ) : (\n <button type=\"button\" className=\"rz-discard__link\" onClick={() => setConfirm(true)}>{copy.removeLink}</button>\n )}\n {error && <div className=\"rz-alert admin__alert\">{error}</div>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst POLL_MS = 8_000;\nconst LOCAL_FALLBACK_MS = 150_000;\nconst GIVE_UP_MS = 15 * 60_000;\n\nexport type DeployState = \"waiting\" | \"live\" | \"slow\";\n\n/**\n * After a publish, is the change actually on the live site yet?\n *\n * Polls /api/version until the running production build's commit is the merge\n * commit — or any commit newer than the one serving at publish time (main is\n * linear, so a later deploy contains ours). Locally there is no commit stamp,\n * so it falls back to a timer. Gives up politely after 15 minutes.\n */\nexport function useDeployed(active: boolean, mergedSha: string | null): DeployState {\n const [state, setState] = useState<DeployState>(\"waiting\");\n\n useEffect(() => {\n if (!active) return;\n let stop = false;\n let baseline: string | null | undefined; // undefined = not read yet\n const started = Date.now();\n\n const read = async (): Promise<string | null> => {\n try {\n const r = await fetch(\"/api/version\", { cache: \"no-store\" });\n const j = (await r.json()) as { sha: string | null };\n return j.sha;\n } catch {\n return null;\n }\n };\n\n const tick = async () => {\n if (stop) return;\n const sha = await read();\n if (stop) return;\n if (baseline === undefined) baseline = sha;\n const elapsed = Date.now() - started;\n const matched = sha !== null && mergedSha !== null && sha === mergedSha;\n const moved = sha !== null && baseline !== null && sha !== baseline;\n const localDone = sha === null && elapsed >= LOCAL_FALLBACK_MS;\n if (matched || moved || localDone) { setState(\"live\"); return; }\n if (elapsed >= GIVE_UP_MS) { setState(\"slow\"); return; }\n setTimeout(tick, POLL_MS);\n };\n void tick();\n return () => { stop = true; };\n }, [active, mergedSha]);\n\n return state;\n}\n","\"use client\";\n\nimport { useEffect, useState, useTransition } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport type { PullRequestStatus } from \"../git/types\";\nimport { Button, LinkButton, Steps, type StepState } from \"../shell\";\nimport type { MergeOutcome } from \"./types\";\nimport { useStudio } from \"./context\";\nimport { useDeployed } from \"./useDeployed\";\n\nconst REFRESH_MS = 10_000;\n\n/**\n * Saved → Checking → Live, as a tracker, with one sentence of plain language\n * under it and the Publish button that unlocks when the checks pass. Refreshes\n * itself while checks are pending. Copy is load-bearing (see the brief).\n */\nexport function PublishPanel({ number, htmlUrl, merged, closed = false, branch, removal = false, mergedSha = null, status, item }: {\n number: number;\n htmlUrl: string;\n merged: boolean;\n /** Closed without publishing — discarded here or on GitHub. */\n closed?: boolean;\n branch: string;\n /** The change deletes the post instead of editing it. */\n removal?: boolean;\n /** Merge commit once published; lets the page confirm the deploy rather than guess. */\n mergedSha?: string | null;\n status: PullRequestStatus | null;\n /** The item this change is about, resolved by the site page (Studio.readers.locate); null when it can't be. */\n item: { noun: string; label: string; typeId: string; slug: string; liveUrl: string | null } | null;\n}) {\n const { mergeContentPr, discardChange } = useStudio().actions;\n const router = useRouter();\n const [outcome, setOutcome] = useState<MergeOutcome | null>(merged ? { state: \"merged\", sha: \"\" } : null);\n const [pending, start] = useTransition();\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n const [discarded, setDiscarded] = useState(closed);\n const [discardError, setDiscardError] = useState<string | null>(null);\n\n const isPending = !merged && outcome === null && status?.state === \"pending\";\n useEffect(() => {\n if (!isPending) return;\n const t = setInterval(() => router.refresh(), REFRESH_MS);\n return () => clearInterval(t);\n }, [isPending, router]);\n\n const publish = () => start(async () => setOutcome(await mergeContentPr(number)));\n const discard = () =>\n start(async () => {\n const r = await discardChange(number, branch);\n if (r.state === \"discarded\") { setDiscarded(true); setConfirmDiscard(false); }\n else if (r.state === \"already-published\") setOutcome({ state: \"merged\", sha: \"\" });\n else setDiscardError(r.message);\n });\n const publicPath = item?.liveUrl ?? null;\n const liveUrl = publicPath;\n const editUrl = item ? `/admin/${item.typeId}/${item.slug}` : null;\n const noun = item?.noun ?? \"item\";\n const listUrl = item ? `/admin/${item.typeId}` : \"/admin\";\n const backLabel = item ? `Back to ${item.label}` : \"Back to the dashboard\";\n\n const live = outcome?.state === \"merged\";\n const deploy = useDeployed(live, outcome?.state === \"merged\" && outcome.sha ? outcome.sha : mergedSha);\n const onSite = live && deploy === \"live\";\n const failed = status?.state === \"red\" || outcome?.state === \"red\";\n const failing = status?.state === \"red\" ? status.failingCheck : outcome?.state === \"red\" ? outcome.failingCheck : null;\n const stale = outcome?.state === \"stale\";\n const ready = !live && !failed && !stale && status?.state === \"green\";\n // The checks ARE a full preview build of the site with this change; link straight to this post on it.\n const previewBase = status?.state === \"green\" ? status.previewUrl : undefined;\n const previewUrl = previewBase && publicPath && !removal ? `${previewBase.replace(/\\/$/, \"\")}${publicPath}` : previewBase;\n\n const checkState: StepState = live || ready ? \"done\" : failed ? \"failed\" : \"active\";\n const steps = [\n { label: \"Saved\", state: \"done\" as StepState, note: `Change #${number}` },\n { label: \"Checks\", state: checkState, note: checkState === \"active\" ? \"Usually a minute or two\" : checkState === \"failed\" ? \"Something needs fixing\" : \"Passed\" },\n { label: \"Published\", state: (live ? \"done\" : pending ? \"active\" : \"todo\") as StepState, note: live ? \"Sent to the site\" : pending ? \"Publishing…\" : \"When you're ready\" },\n {\n label: removal ? \"Removed\" : \"Live\",\n state: (onSite ? \"done\" : live ? \"active\" : \"todo\") as StepState,\n note: onSite ? (removal ? \"Off the site\" : \"On the site\") : live ? (deploy === \"slow\" ? \"Taking longer than usual\" : \"Rebuilding, about two minutes\") : \"Automatic\",\n },\n ];\n\n if (discarded) {\n return (\n <>\n <Steps steps={[{ label: \"Saved\", state: \"done\", note: `Change #${number}` }, { label: \"Discarded\", state: \"failed\", note: \"Nothing was published\" }, { label: \"Live\", state: \"todo\", note: \"Unchanged\" }]} />\n <p style={{ margin: 0 }}>This change was discarded. The live site is exactly as it was{editUrl ? `; the ${noun} still shows its published version` : \"\"}.</p>\n <div className=\"rz-actions\">\n {editUrl && <LinkButton variant=\"primary\" href={editUrl}>Open the {noun}</LinkButton>}\n <LinkButton href={listUrl}>{backLabel}</LinkButton>\n </div>\n </>\n );\n }\n\n return (\n <>\n <Steps steps={steps} />\n\n {live ? (\n onSite ? (\n <p style={{ margin: 0 }}>{removal ? `Done — the ${noun} is off the website.` : \"Done — your change is on the website now.\"}</p>\n ) : deploy === \"slow\" ? (\n <p style={{ margin: 0 }}>The site is taking longer than usual to rebuild. It will get there; check back in a few minutes.</p>\n ) : (\n <p style={{ margin: 0 }}>Published. The website is rebuilding with your change — this usually takes about two minutes. Stay here and this page will tell you the moment it's live; if you look at the site before then you'll still see the old version.</p>\n )\n ) : stale ? (\n <div className=\"rz-alert admin__alert\">Someone else changed this file first. <Link href=\"/admin\">Open it again</Link>, make your change on the latest version, and publish.</div>\n ) : failed ? (\n <div className=\"rz-alert admin__alert\">\n The site couldn't build with this change{failing ? ` (${failing})` : \"\"}. Nothing was published. Open the {noun}, fix it, and save again.\n </div>\n ) : outcome?.state === \"error\" ? (\n <div className=\"rz-alert admin__alert\">{outcome.message}</div>\n ) : ready ? (\n <p style={{ margin: 0 }}>\n {removal\n ? `Everything checks out. Publishing takes this ${noun} off the live site.`\n : previewUrl\n ? \"Everything checks out. Have a look at the preview — it's a private copy of the site with your change — then publish when you're happy.\"\n : \"Everything checks out. Publishing puts this change on the live site.\"}\n </p>\n ) : (\n <p style={{ margin: 0 }} className=\"rz-muted\">We're building a test copy of the site with your change to make sure nothing breaks. This page updates itself.</p>\n )}\n\n <div className=\"rz-actions\">\n {live ? (\n <>\n {liveUrl && !removal && (onSite\n ? <LinkButton variant=\"primary\" external href={liveUrl}>View the {noun}</LinkButton>\n : <Button variant=\"primary\" disabled title=\"Available once the site has rebuilt\">View the {noun}</Button>)}\n <LinkButton variant={removal || !liveUrl ? \"primary\" : \"secondary\"} href={listUrl}>{backLabel}</LinkButton>\n {live && !onSite && <span className=\"rz-actions__hint\">{deploy === \"slow\" ? \"Still rebuilding.\" : \"Waiting for the site to rebuild…\"}</span>}\n </>\n ) : (\n <>\n <Button variant=\"primary\" disabled={pending || !ready} onClick={publish}>\n {pending ? \"Publishing…\" : \"Publish\"}\n </Button>\n {previewUrl && ready && <LinkButton external href={previewUrl}>Preview the change</LinkButton>}\n {editUrl && !removal && <LinkButton href={editUrl}>Keep editing</LinkButton>}\n <LinkButton href={htmlUrl} external>View on GitHub</LinkButton>\n {!ready && !failed && !stale && <span className=\"rz-actions__hint\">Publish unlocks when the checks pass.</span>}\n </>\n )}\n </div>\n\n {!live && (\n <div className=\"rz-discard\">\n {confirmDiscard ? (\n <>\n <span>{removal ? `Cancel the removal and keep the ${noun} on the website?` : `Throw away the unpublished changes to this ${noun}? The live site isn't affected. This can't be undone.`}</span>\n <Button variant=\"danger\" size=\"sm\" disabled={pending} onClick={discard}>{pending ? \"Discarding…\" : \"Yes, discard\"}</Button>\n <Button size=\"sm\" onClick={() => setConfirmDiscard(false)}>Keep it</Button>\n </>\n ) : (\n <button type=\"button\" className=\"rz-discard__link\" onClick={() => setConfirmDiscard(true)}>{removal ? \"Cancel this removal\" : \"Discard this change\"}</button>\n )}\n {discardError && <div className=\"rz-alert admin__alert\">{discardError}</div>}\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\n/**\n * Show/hide the slug line under each title in a content list. Remembered per\n * browser and per content type. `SlugVisibility` wraps the (server-rendered) table and stamps\n * data-slugs on it; `SlugToggle` sits in the column header. CSS does the rest.\n * localStorage is read through useSyncExternalStore so the server render and\n * first client paint agree (\"on\"), then the stored choice applies.\n */\n\nimport { useSyncExternalStore, type ReactNode } from \"react\";\n\nconst keyFor = (typeId: string) => `rz-${typeId}-slugs`;\nconst EVENT = \"rz-slugs-change\";\n\nfunction read(typeId: string): boolean {\n try { return window.localStorage.getItem(keyFor(typeId)) !== \"off\"; } catch { return true; }\n}\nfunction subscribe(cb: () => void) {\n window.addEventListener(EVENT, cb);\n window.addEventListener(\"storage\", cb);\n return () => { window.removeEventListener(EVENT, cb); window.removeEventListener(\"storage\", cb); };\n}\nfunction useSlugsOn(typeId: string): boolean {\n return useSyncExternalStore(subscribe, () => read(typeId), () => true);\n}\nfunction setSlugsOn(typeId: string, next: boolean) {\n try { window.localStorage.setItem(keyFor(typeId), next ? \"on\" : \"off\"); } catch { /* ignore */ }\n window.dispatchEvent(new Event(EVENT));\n}\n\nexport function SlugVisibility({ typeId, children }: { typeId: string; children: ReactNode }) {\n const on = useSlugsOn(typeId);\n return <div data-slugs={on ? \"on\" : \"off\"}>{children}</div>;\n}\n\nexport function SlugToggle({ typeId }: { typeId: string }) {\n const on = useSlugsOn(typeId);\n return (\n <label className=\"rz-switch\">\n <span className=\"rz-switch__label\">Show web addresses</span>\n <input type=\"checkbox\" role=\"switch\" checked={on} onChange={(e) => setSlugsOn(typeId, e.target.checked)} />\n <span className=\"rz-switch__track\" aria-hidden=\"true\"><span className=\"rz-switch__thumb\" /></span>\n </label>\n );\n}\n","\"use client\";\n\n/**\n * Small shared pieces for the Account tabs: a labelled field, a form card\n * with its own Save, an inline result line, and a base64 helper for pictures.\n * Styled by .acct-* rules in admin.css using the shell's tokens.\n */\n\nimport { useEffect, useRef, useState, type FormEvent, type ReactNode } from \"react\";\nimport { Button } from \"../../shell\";\nimport type { ActionResult } from \"../types\";\n\nexport function Field({ id, label, hint, children }: { id: string; label: string; hint?: string; children: ReactNode }) {\n return (\n <div className=\"acct-field\">\n <label htmlFor={id} className=\"acct-label\">{label}</label>\n {children}\n {hint && <div className=\"acct-hint\">{hint}</div>}\n </div>\n );\n}\n\nexport function Result({ r }: { r: ActionResult | null }) {\n if (!r) return null;\n return r.ok\n ? <div className=\"acct-ok\" role=\"status\">{r.message ?? \"Saved.\"}</div>\n : <div className=\"rz-alert admin__alert\" role=\"alert\">{r.error}</div>;\n}\n\n/** A card with a title, a sentence, the fields, and one Save button that runs `action`. */\nexport function FormCard({ title, blurb, children, action, saveLabel = \"Save\", disabled }: {\n title: string;\n blurb?: ReactNode;\n children: ReactNode;\n action: () => Promise<ActionResult>;\n saveLabel?: string;\n disabled?: boolean;\n}) {\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<ActionResult | null>(null);\n const submit = async (e: FormEvent) => {\n e.preventDefault();\n if (busy) return;\n setBusy(true);\n setResult(null);\n try {\n setResult(await action());\n } catch (err) {\n setResult({ ok: false, error: err instanceof Error ? err.message : \"Something went wrong. Try again.\" });\n } finally {\n setBusy(false);\n }\n };\n return (\n <form className=\"rz-card acct-card\" onSubmit={submit} noValidate>\n <h2 className=\"acct-title\">{title}</h2>\n {blurb && <p className=\"acct-blurb\">{blurb}</p>}\n {children}\n <div className=\"acct-actions\">\n <Button type=\"submit\" variant=\"primary\" disabled={busy || disabled}>{busy ? `${saveLabel}…` : saveLabel}</Button>\n <Result r={result} />\n </div>\n </form>\n );\n}\n\nexport function toBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result).split(\",\")[1] ?? \"\");\n r.onerror = () => reject(r.error);\n r.readAsDataURL(blob);\n });\n}\n\n/** A password box with the show/hide eye on the right. Masked by default. */\nexport function PasswordInput({ id, value, onChange, autoComplete }: { id: string; value: string; onChange: (v: string) => void; autoComplete: string }) {\n const [show, setShow] = useState(false);\n return (\n <div className=\"acct-pw\">\n <input id={id} className=\"acct-input\" type={show ? \"text\" : \"password\"} value={value} onChange={(e) => onChange(e.target.value)} autoComplete={autoComplete} spellCheck={false} />\n <button type=\"button\" className=\"acct-pw__eye\" onClick={() => setShow((s) => !s)} aria-label={show ? \"Hide password\" : \"Show password\"} aria-pressed={show}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {show ? (\n <><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>\n ) : (\n <><path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" /><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" /></>\n )}\n </svg>\n </button>\n </div>\n );\n}\n\n/** \"(555) 123-4567\" as you type — US/CA numbers; a leading 1 is dropped. Anything past 10 digits is ignored. */\nexport function formatPhone(raw: string): string {\n let d = raw.replace(/\\D/g, \"\");\n if (d.length === 11 && d.startsWith(\"1\")) d = d.slice(1);\n d = d.slice(0, 10);\n if (d.length === 0) return \"\";\n if (d.length < 4) return `(${d}`;\n if (d.length < 7) return `(${d.slice(0, 3)}) ${d.slice(3)}`;\n return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;\n}\n\n/** A small branded dropdown (button + shell-styled menu) for picking one of a few options. */\nexport function Dropdown<T extends string>({ value, options, onChange, disabled, label }: {\n value: T;\n options: { value: T; label: string; hint?: string }[];\n onChange: (v: T) => void;\n disabled?: boolean;\n label: string;\n}) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => { if (!wrap.current?.contains(e.target as Node)) setOpen(false); };\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") setOpen(false); };\n document.addEventListener(\"mousedown\", onDoc);\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onDoc); document.removeEventListener(\"keydown\", onKey); };\n }, [open]);\n const current = options.find((o) => o.value === value);\n return (\n <div ref={wrap} className=\"acct-dd\">\n <button type=\"button\" className=\"acct-dd__btn\" aria-haspopup=\"listbox\" aria-expanded={open} aria-label={label} disabled={disabled} onClick={() => setOpen((v) => !v)}>\n {current?.label ?? value}\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\" /></svg>\n </button>\n {open && (\n <div className=\"rz-menu acct-dd__menu\" role=\"listbox\" aria-label={label}>\n {options.map((o) => (\n <button key={o.value} type=\"button\" role=\"option\" aria-selected={o.value === value} className=\"rz-menu__item acct-dd__item\" onClick={() => { setOpen(false); if (o.value !== value) onChange(o.value); }}>\n <span className=\"acct-dd__check\" aria-hidden=\"true\">{o.value === value ? \"✓\" : \"\"}</span>\n <span className=\"acct-dd__text\">\n <span>{o.label}</span>\n {o.hint && <span className=\"acct-dd__hint\">{o.hint}</span>}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * A second way in (05b): email + password, revealed under the magic-link\n * form. Magic links stay the default — this is for people who set a password\n * on the Account page and are somewhere without their inbox.\n */\n\nimport { useMemo, useState, type FormEvent } from \"react\";\nimport { createBrowserClient } from \"@supabase/ssr\";\nimport { Button } from \"../shell\";\nimport { PasswordInput } from \"./account/ui\";\n\nexport function PasswordSignIn({ url, anonKey, next = \"/admin\" }: { url: string; anonKey: string; next?: string }) {\n const supabase = useMemo(() => createBrowserClient(url, anonKey), [url, anonKey]);\n const [open, setOpen] = useState(false);\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (e: FormEvent) => {\n e.preventDefault();\n if (busy) return;\n setBusy(true);\n setError(null);\n const { error } = await supabase.auth.signInWithPassword({ email: email.trim().toLowerCase(), password });\n if (error) {\n setError(/invalid/i.test(error.message) ? \"That email and password don’t match. Try again, or use an email link instead.\" : error.message);\n setBusy(false);\n return;\n }\n window.location.assign(next);\n };\n\n if (!open) {\n return (\n <p className=\"pwsi-toggle\">\n <button type=\"button\" className=\"acct-link\" onClick={() => setOpen(true)}>Have a password? Sign in with it instead</button>\n </p>\n );\n }\n\n return (\n <form className=\"pwsi\" onSubmit={submit} noValidate>\n <h2 className=\"acct-title\">Sign in with a password</h2>\n <p className=\"acct-blurb\">Forgotten it? Sign in with an email link and set a new one under Settings → Change Password.</p>\n <div className=\"acct-field\">\n <label htmlFor=\"pwsi-email\" className=\"acct-label\">Email address</label>\n <input id=\"pwsi-email\" className=\"acct-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} autoComplete=\"username\" required />\n </div>\n <div className=\"acct-field\">\n <label htmlFor=\"pwsi-password\" className=\"acct-label\">Password</label>\n <PasswordInput id=\"pwsi-password\" value={password} onChange={setPassword} autoComplete=\"current-password\" />\n </div>\n {error && <div className=\"rz-alert admin__alert\" role=\"alert\">{error}</div>}\n <div className=\"acct-actions\">\n <Button type=\"submit\" variant=\"primary\" disabled={busy}>{busy ? \"Signing in…\" : \"Sign in\"}</Button>\n <button type=\"button\" className=\"acct-link\" onClick={() => setOpen(false)}>Forgot it? Use an email link instead</button>\n </div>\n </form>\n );\n}\n","\"use client\";\n\n/**\n * Where an invitation email lands (05b). Supabase delivers an invite as tokens\n * in the URL HASH (implicit flow — the invitee's browser has no PKCE verifier),\n * which no server route can read. So this runs in the browser: take the tokens\n * from the hash, set the session (cookies), and go to /admin. A ?code= (PKCE)\n * is handed to the normal callback route instead.\n */\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { createBrowserClient } from \"@supabase/ssr\";\n\nexport function AcceptInvite({ url, anonKey }: { url: string; anonKey: string }) {\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const run = async () => {\n const search = new URLSearchParams(window.location.search);\n const code = search.get(\"code\");\n if (code) { window.location.replace(`/admin/auth/callback?code=${encodeURIComponent(code)}&next=/admin/account`); return; }\n\n const hash = new URLSearchParams(window.location.hash.replace(/^#/, \"\"));\n const access_token = hash.get(\"access_token\");\n const refresh_token = hash.get(\"refresh_token\");\n const described = hash.get(\"error_description\");\n if (described) { setError(described.replace(/\\+/g, \" \")); return; }\n if (!access_token || !refresh_token) { setError(\"This invitation link is incomplete or has already been used. Ask for a new one.\"); return; }\n\n const supabase = createBrowserClient(url, anonKey);\n const { error } = await supabase.auth.setSession({ access_token, refresh_token });\n if (error) { setError(error.message); return; }\n // Drop the tokens from the address bar before moving on.\n window.history.replaceState(null, \"\", window.location.pathname);\n window.location.replace(\"/admin/account\");\n };\n void run();\n }, [url, anonKey]);\n\n if (error) {\n return (\n <div className=\"rz-alert admin__alert\" role=\"alert\">\n {error} <Link href=\"/admin/sign-in\">Sign in with an email link instead.</Link>\n </div>\n );\n }\n return <p className=\"rz-muted\" role=\"status\">Setting up your access…</p>;\n}\n","\"use client\";\n\n/**\n * The page bodies. Each takes serialisable props a site page loaded with\n * Studio.readers and renders the same thing realiiz-website did in-repo.\n * Registry and actions come from <StudioProvider>.\n */\n\nimport Link from \"next/link\";\nimport { Card, EmptyState, LinkButton, OutboundArrow, PageHeader, StatusPill } from \"../shell\";\nimport { MagicLinkForm } from \"../auth-ui\";\nimport { useEntry, useStudio } from \"./context\";\nimport { Jargon } from \"./term\";\nimport { copyFor } from \"./copy\";\nimport { ContentEditor } from \"./ContentEditor\";\nimport { RemoveItem } from \"./RemoveItem\";\nimport { PublishPanel } from \"./PublishPanel\";\nimport { SlugToggle, SlugVisibility } from \"./SlugToggle\";\nimport { PasswordSignIn } from \"./PasswordSignIn\";\nimport { AcceptInvite } from \"./AcceptInvite\";\nimport type { ListRow, PendingSummary, PullRequestStatus } from \"./types\";\n\nconst pendingText = (p: NonNullable<ListRow[\"pending\"]>) =>\n p.removal ? (p.state === \"ready\" ? \"Removal ready\" : p.state === \"failed\" ? \"Removal needs fixing\" : \"Removing…\")\n : p.state === \"ready\" ? \"Ready to publish\" : p.state === \"failed\" ? \"Needs fixing\" : \"Checking…\";\n\nconst pendingLabel: Record<PendingSummary[\"state\"], string> = { checking: \"Checking…\", ready: \"Ready to publish\", failed: \"Needs fixing\" };\n\n/** Home: one card per content type. `cards` is [{ typeId, count, waiting }] in registry order. */\nexport function StudioDashboard({ greeting, cards }: { greeting: string; cards: { typeId: string; count: number; waiting: number }[] }) {\n const { contentTypes, siteName } = useStudio();\n return (\n <>\n <PageHeader eyebrow={siteName} title={`Welcome back, ${greeting}`} subtitle={<>Nothing goes live by accident: every edit is saved and <Jargon term=\"pullRequest\">checked first</Jargon>, then you press Publish.</>} />\n {cards.length === 0 ? (\n <EmptyState title=\"No content types yet\">Content types are defined in <code>src/lib/admin/content-types.ts</code>.</EmptyState>\n ) : (\n <div className=\"rz-grid\">\n {cards.map((c) => {\n const e = contentTypes[c.typeId];\n if (!e) return null;\n return (\n <Card\n key={e.id}\n title={e.label}\n meta={<>{c.count} {c.count === 1 ? \"item\" : \"items\"} · {e.folder}</>}\n note={c.waiting > 0 && <Link href={`/admin/${e.id}`} className=\"rz-status-link\"><StatusPill tone=\"warn\">{c.waiting} {c.waiting === 1 ? \"change\" : \"changes\"} waiting</StatusPill></Link>}\n actions={<><LinkButton variant=\"primary\" href={`/admin/${e.id}/new`}>New</LinkButton><LinkButton variant=\"secondary\" href={`/admin/${e.id}`}>Open</LinkButton></>}\n />\n );\n })}\n </div>\n )}\n </>\n );\n}\n\nexport function StudioList({ typeId, items }: { typeId: string; items: ListRow[] }) {\n const entry = useEntry(typeId);\n if (!entry) return null;\n const copy = copyFor(entry);\n const dateHeading = entry.id === \"posts\" ? \"Published\" : \"Date\";\n return (\n <>\n <PageHeader\n eyebrow={entry.folder}\n title={entry.label}\n subtitle={<>Everything in this list comes straight from <Jargon term=\"repository\">where the site is stored</Jargon> — including anything added outside Studio.</>}\n actions={<LinkButton variant=\"primary\" href={`/admin/${entry.id}/new`}>{copy.newItem}</LinkButton>}\n />\n {items.length === 0 ? (\n <EmptyState title={copy.empty} action={<LinkButton variant=\"primary\" href={`/admin/${entry.id}/new`}>{copy.first}</LinkButton>} />\n ) : (\n <SlugVisibility typeId={entry.id}>\n <div className=\"rz-toolbar\"><SlugToggle typeId={entry.id} /></div>\n <div className=\"rz-table-wrap\">\n <table className=\"rz-table rz-table--posts\">\n <colgroup><col className=\"rz-col-title\" /><col className=\"rz-col-date\" /><col className=\"rz-col-status\" /><col className=\"rz-col-actions\" /></colgroup>\n <thead><tr><th>{entry.singular ?? entry.label}</th><th className=\"rz-fit\">{dateHeading}</th><th className=\"rz-fit\">Status</th><th className=\"rz-fit\"></th></tr></thead>\n <tbody>\n {items.map((p) => (\n <tr key={p.slug}>\n <td className=\"rz-title-cell\">\n {p.isNew || !p.liveUrl ? (\n <span className=\"rz-title-text\" title={p.title}>{p.title}</span>\n ) : (\n <a href={p.liveUrl} target=\"_blank\" rel=\"noreferrer\" className=\"rz-title-link\" title={`${p.title} — opens the live page in a new tab`}>\n <span className=\"rz-title-text\">{p.title}</span><OutboundArrow />\n </a>\n )}\n <div className=\"rz-muted rz-title-text rz-slug\" title={p.liveUrl ?? p.slug}>{p.liveUrl ?? p.slug}</div>\n {p.needsAttention && <div style={{ marginTop: 4 }}><StatusPill tone=\"warn\">Needs attention</StatusPill></div>}\n </td>\n <td className=\"rz-muted rz-fit\">{p.date ? p.date.slice(0, 10) : \"—\"}</td>\n <td className=\"rz-fit\">\n {p.pending ? (\n <Link href={`/admin/pr/${p.pending.number}`} className=\"rz-status-link\" title={p.isNew ? \"Not on the live site yet\" : \"An unpublished change is waiting\"}>\n <StatusPill tone={p.pending.state === \"ready\" ? \"up\" : p.pending.state === \"failed\" ? \"down\" : \"warn\"}>{p.isNew ? `New · ${pendingText(p.pending)}` : pendingText(p.pending)}</StatusPill>\n </Link>\n ) : <StatusPill tone=\"up\">Live</StatusPill>}\n </td>\n <td className=\"rz-fit\">\n <Link href={`/admin/${entry.id}/${p.slug}`}>Edit</Link>\n {p.pending && <> · <Link href={`/admin/pr/${p.pending.number}`}>{p.pending.state === \"ready\" ? \"Publish\" : \"Review\"}</Link></>}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SlugVisibility>\n )}\n </>\n );\n}\n\nexport function StudioNew({ typeId, initialValues }: { typeId: string; initialValues: Record<string, unknown> }) {\n const entry = useEntry(typeId);\n if (!entry) return null;\n const copy = copyFor(entry);\n return (\n <>\n <PageHeader eyebrow={entry.label} title={copy.newItem} subtitle={copy.newSubtitle} />\n <ContentEditor typeId={entry.id} isNew initialValues={initialValues} />\n </>\n );\n}\n\nexport function StudioEdit({ typeId, slug, frontmatter, body, pending }: {\n typeId: string; slug: string; frontmatter: Record<string, unknown>; body: string; pending: PendingSummary | null;\n}) {\n const entry = useEntry(typeId);\n if (!entry) return null;\n const copy = copyFor(entry);\n return (\n <>\n <PageHeader\n eyebrow={entry.label}\n title={String(frontmatter.title ?? slug)}\n subtitle={pending\n ? <>You're picking up an edit you haven't published yet. Save again and it stays as one <Jargon term=\"change\">change</Jargon>.</>\n : <>Saving doesn't touch the live site. Your edit is <Jargon term=\"checks\">checked first</Jargon>, then you decide when to <Jargon term=\"publish\">publish</Jargon>.</>}\n />\n {pending && (\n <div className=\"rz-notice\" role=\"status\">\n <span className=\"rz-notice__text\">\n <StatusPill tone={pending.state === \"ready\" ? \"up\" : pending.state === \"failed\" ? \"down\" : \"warn\"}>{pendingLabel[pending.state]}</StatusPill>\n <span>\n <strong>{pending.removal ? \"Removal\" : \"Unpublished change\"} #{pending.number}</strong>\n {pending.removal\n ? (pending.state === \"ready\" ? \" — ready to publish; it stays on the site until you do.\" : pending.state === \"failed\" ? ` — ${pending.failingCheck ?? \"something needs fixing\"}` : \" — we're checking it now.\")\n : (pending.state === \"failed\" && pending.failingCheck ? ` — ${pending.failingCheck}` : pending.state === \"ready\" ? \" — checks passed, nothing is live until you publish.\" : \" — we're checking it now.\")}\n </span>\n </span>\n <LinkButton variant=\"primary\" size=\"sm\" forward href={`/admin/pr/${pending.number}`}>{pending.removal ? \"Review removal\" : pending.state === \"ready\" ? \"Review & publish\" : \"See progress\"}</LinkButton>\n </div>\n )}\n {pending?.removal ? (\n <p className=\"rz-muted\">{copy.removing}</p>\n ) : (\n <ContentEditor\n typeId={entry.id}\n initialValues={frontmatter}\n initialBody={body}\n existing={pending ? { number: pending.number, branch: pending.branch, state: pending.state } : null}\n footer={!pending ? <RemoveItem typeId={entry.id} slug={slug} /> : undefined}\n />\n )}\n </>\n );\n}\n\nexport function StudioPullRequest({ pr, status, item }: {\n pr: { number: number; title: string; html_url: string; merged: boolean; state: \"open\" | \"closed\"; branch: string; removal: boolean; mergeCommitSha: string | null };\n status: PullRequestStatus | null;\n item: { noun: string; label: string; typeId: string; slug: string; liveUrl: string | null } | null;\n}) {\n return (\n <>\n <PageHeader\n eyebrow={pr.removal ? (pr.merged ? \"Removed\" : \"Removing\") : pr.merged ? \"Published\" : \"Publishing\"}\n title={pr.title.replace(/^(Publish|Remove):\\s*/, \"\")}\n subtitle={item ? `Changes to ${item.liveUrl ?? `${item.label} · ${item.slug}`}` : undefined}\n />\n <Card className=\"rz-card--narrow\">\n <PublishPanel number={pr.number} htmlUrl={pr.html_url} merged={pr.merged} closed={pr.state === \"closed\" && !pr.merged} branch={pr.branch} removal={pr.removal} mergedSha={pr.mergeCommitSha} status={status} item={item} />\n </Card>\n </>\n );\n}\n\nexport function StudioHelp() {\n return (\n <>\n <PageHeader eyebrow=\"Help\" title=\"Help centre\" subtitle=\"Everything about running your website from Studio, in plain English.\" />\n <Card className=\"rz-card--narrow\">\n <p style={{ marginTop: 0 }}>\n The full guide is on its way. In the meantime the <b>Ask</b> bubble in the bottom-right corner knows how Studio works — ask it anything, from\n “what does Publish do?” to “how do I add a picture?”.\n </p>\n <p style={{ marginBottom: 4 }}>Coming here soon:</p>\n <ul className=\"acct-help-list\">\n <li>Writing and editing a blog post — every field explained</li>\n <li>Pictures: choosing, sizing and where they go</li>\n <li>Save, checks, preview and Publish — the whole journey</li>\n <li>Fixing a change that “needs fixing”, discarding, removing a post</li>\n <li>Your account, your team and putting your own name on Studio</li>\n </ul>\n </Card>\n </>\n );\n}\n\nexport function StudioSignIn({ url, anonKey, redirectTo, siteName, error }: { url: string; anonKey: string; redirectTo: string; siteName: string; error?: string | null }) {\n return (\n <div className=\"rz-card\" style={{ maxWidth: 440, margin: \"40px auto\" }}>\n {error === \"link\" && (\n <div className=\"rz-alert admin__alert\" role=\"alert\">\n That sign-in link didn't work — it may have expired or been used already. Request a new one below.\n </div>\n )}\n <MagicLinkForm url={url} anonKey={anonKey} redirectTo={redirectTo} siteName={`${siteName} Studio`} />\n <PasswordSignIn url={url} anonKey={anonKey} />\n </div>\n );\n}\n\nexport function StudioAcceptInvite({ url, anonKey }: { url: string; anonKey: string }) {\n return (\n <div className=\"rz-card\" style={{ maxWidth: 440, margin: \"40px auto\" }}>\n <h1 className=\"acct-h1\">Welcome to Studio</h1>\n <AcceptInvite url={url} anonKey={anonKey} />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * The same dashed drop zone as the post form's picture fields: choose, drag\n * or paste a picture; once set, a thumbnail with Replace / Remove. Choosing a file shrinks it in the\n * browser and saves straight away — no separate Save step for pictures.\n */\n\nimport { useRef, useState } from \"react\";\nimport { resizeImage } from \"../../media\";\nimport { Button } from \"../../shell\";\nimport type { ActionResult } from \"../types\";\nimport { toBase64 } from \"./ui\";\n\nexport function PictureUploader({ kind, shape, currentUrl, fallback, maxWidth, hint, onUpload, onRemove, onChanged }: {\n /** The noun in the buttons: \"photo\", \"logo\", \"favicon\". */\n kind: string;\n shape: \"circle\" | \"square\";\n currentUrl: string | null;\n /** Shown in the preview when there is no picture (initials, or an icon). */\n fallback: React.ReactNode;\n maxWidth: number;\n hint: string;\n onUpload: (base64: string) => Promise<ActionResult>;\n onRemove: () => Promise<ActionResult>;\n onChanged?: () => void;\n}) {\n const input = useRef<HTMLInputElement>(null);\n const [url, setUrl] = useState<string | null>(currentUrl);\n const [busy, setBusy] = useState(false);\n const [note, setNote] = useState<{ ok: boolean; text: string } | null>(null);\n const [over, setOver] = useState(false);\n\n const choose = async (file: File | undefined) => {\n if (!file || busy) return;\n setBusy(true);\n setNote(null);\n try {\n const r = await resizeImage(file, { maxWidth, maxBytes: 300 * 1024 });\n const preview = URL.createObjectURL(r.blob);\n const res = await onUpload(await toBase64(r.blob));\n if (res.ok) { setUrl(preview); setNote({ ok: true, text: res.message ?? \"Saved.\" }); onChanged?.(); }\n else setNote({ ok: false, text: res.error });\n } catch (err) {\n setNote({ ok: false, text: err instanceof Error ? err.message : \"That picture couldn’t be prepared. Try a different file.\" });\n } finally {\n setBusy(false);\n if (input.current) input.current.value = \"\";\n }\n };\n\n const remove = async () => {\n if (busy) return;\n setBusy(true);\n setNote(null);\n const res = await onRemove();\n if (res.ok) { setUrl(null); setNote({ ok: true, text: res.message ?? \"Removed.\" }); onChanged?.(); }\n else setNote({ ok: false, text: res.error });\n setBusy(false);\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setOver(false);\n void choose(e.dataTransfer.files?.[0]);\n };\n const onPaste = (e: React.ClipboardEvent) => {\n const f = Array.from(e.clipboardData.files ?? [])[0];\n if (f) { e.preventDefault(); void choose(f); }\n };\n\n const zoneCls = [\"acct-pic\", over && \"acct-pic--over\", busy && \"acct-pic--busy\"].filter(Boolean).join(\" \");\n const thumbCls = shape === \"circle\" ? \"acct-pic__thumb acct-pic__thumb--circle\" : \"acct-pic__thumb\";\n\n return (\n <div\n className={zoneCls}\n data-testid={`${kind}-zone`}\n onDragOver={(e) => { e.preventDefault(); setOver(true); }}\n onDragLeave={() => setOver(false)}\n onDrop={onDrop}\n onPaste={onPaste}\n tabIndex={0}\n >\n <input ref={input} type=\"file\" accept=\"image/jpeg,image/png,image/webp\" className=\"acct-pic__file\" onChange={(e) => void choose(e.target.files?.[0])} tabIndex={-1} aria-hidden=\"true\" />\n {url ? (\n <div className=\"acct-pic__has\">\n <img src={url} alt=\"\" className={thumbCls} data-testid={`${kind}-preview`} />\n <div className=\"acct-pic__meta\">\n <div className=\"acct-pic__actions\">\n <Button onClick={() => input.current?.click()} disabled={busy}>{busy ? \"Uploading…\" : \"Replace\"}</Button>\n <button type=\"button\" className=\"acct-pic__remove\" onClick={remove} disabled={busy}>Remove</button>\n </div>\n <p className=\"acct-pic__hint\">{hint}</p>\n </div>\n </div>\n ) : (\n <>\n <div className=\"acct-pic__empty\">\n <span className={shape === \"circle\" ? \"acct-pic__fallback acct-pic__fallback--circle\" : \"acct-pic__fallback\"} aria-hidden=\"true\">{fallback}</span>\n <Button onClick={() => input.current?.click()} disabled={busy}>{busy ? \"Uploading…\" : \"Choose a picture\"}</Button>\n <span className=\"acct-pic__or\">or drag one here</span>\n </div>\n <p className=\"acct-pic__hint\">{hint}</p>\n </>\n )}\n {note && <p className={note.ok ? \"acct-ok acct-pic__note\" : \"acct-pic__error\"} role={note.ok ? \"status\" : \"alert\"}>{note.text}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { useStudio } from \"../context\";\nimport { Field, FormCard } from \"./ui\";\nimport { PictureUploader } from \"./PictureUploader\";\n\nfunction initialsOf(name: string | null, email: string): string {\n const parts = (name ?? \"\").trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (email[0] ?? \"?\").toUpperCase();\n}\n\n/** My Profile — photo (saves on choose), then name. Email is shown, not editable (it is the login). */\nexport function ProfileTab({ email, name, displayName, avatarUrl }: { email: string; name: string | null; displayName: string | null; avatarUrl: string | null }) {\n const router = useRouter();\n const { saveAvatar, saveProfile } = useStudio().actions;\n const { supportName } = useStudio();\n const [fullName, setFullName] = useState(name ?? \"\");\n // Stored blank when it matches the full name, so changing the name later carries the byline with it.\n const [byline, setByline] = useState(displayName && displayName !== name ? displayName : \"\");\n\n return (\n <div className=\"acct-stack\">\n <section className=\"rz-card acct-card\">\n <h2 className=\"acct-title\">Avatar</h2>\n <PictureUploader\n kind=\"photo\"\n shape=\"circle\"\n currentUrl={avatarUrl}\n fallback={initialsOf(name, email)}\n maxWidth={256}\n hint=\"Square works best. JPG, PNG or WebP.\"\n onUpload={(base64) => saveAvatar({ base64 })}\n onRemove={() => saveAvatar(null)}\n onChanged={() => router.refresh()}\n />\n </section>\n\n <FormCard\n title=\"Your name\"\n blurb=\"How you're greeted in Studio and how teammates see you.\"\n action={async () => { const r = await saveProfile({ name: fullName, displayName: byline }); if (r.ok) router.refresh(); return r; }}\n >\n <Field id=\"acct-name\" label=\"Full name\">\n <input id=\"acct-name\" className=\"acct-input\" value={fullName} onChange={(e) => setFullName(e.target.value)} maxLength={80} autoComplete=\"name\" />\n </Field>\n <Field id=\"acct-byline\" label=\"Name on blog posts\" hint=\"How your name appears as the author of a post. Leave blank to use your full name.\">\n <input id=\"acct-byline\" className=\"acct-input\" value={byline} onChange={(e) => setByline(e.target.value)} maxLength={80} placeholder={fullName || \"e.g. E. Bordi\"} />\n </Field>\n <Field id=\"acct-email\" label=\"Email\" hint={`This is your login. Ask ${supportName} if it needs to change.`}>\n <input id=\"acct-email\" className=\"acct-input\" value={email} readOnly />\n </Field>\n </FormCard>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useStudio } from \"../context\";\nimport { Field, FormCard, PasswordInput } from \"./ui\";\n\n/** Same rules the tracker shows, with Studio's 10-character minimum (the package enforces it server-side too). */\nconst RULES: { id: string; label: string; test: (pw: string, confirm: string) => boolean }[] = [\n { id: \"length\", label: \"At least 10 characters\", test: (pw) => pw.length >= 10 },\n { id: \"case\", label: \"Uppercase and lowercase letters\", test: (pw) => /[A-Z]/.test(pw) && /[a-z]/.test(pw) },\n { id: \"number\", label: \"At least one number\", test: (pw) => /[0-9]/.test(pw) },\n { id: \"special\", label: \"At least one special character (e.g. !@#$)\", test: (pw) => /[^A-Za-z0-9]/.test(pw) },\n { id: \"match\", label: \"Passwords match\", test: (pw, confirm) => pw === confirm },\n];\n\n/** Change Password — optional; email links keep working alongside it. */\nexport function PasswordTab() {\n const { changePassword } = useStudio().actions;\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n // Everything reads as unmet until they start typing, so \"match\" isn't green on two empty boxes.\n const met = (r: (typeof RULES)[number]) => password.length > 0 && r.test(password, confirm);\n const allMet = RULES.every(met);\n\n return (\n <div className=\"acct-stack\">\n <FormCard\n title=\"Set a password\"\n blurb=\"Email links always work. A password is a second way in, handy when you're somewhere without your inbox.\"\n saveLabel=\"Update password\"\n disabled={!allMet}\n action={async () => {\n const r = await changePassword({ password, confirm });\n if (r.ok) { setPassword(\"\"); setConfirm(\"\"); }\n return r;\n }}\n >\n <Field id=\"acct-pw\" label=\"New password\">\n <PasswordInput id=\"acct-pw\" value={password} onChange={setPassword} autoComplete=\"new-password\" />\n </Field>\n <Field id=\"acct-pw2\" label=\"Confirm new password\">\n <PasswordInput id=\"acct-pw2\" value={confirm} onChange={setConfirm} autoComplete=\"new-password\" />\n </Field>\n <ul className=\"acct-rules\" aria-label=\"Password requirements\">\n {RULES.map((r) => {\n const ok = met(r);\n return (\n <li key={r.id} className={ok ? \"acct-rule acct-rule--met\" : \"acct-rule\"} data-met={ok}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n {ok ? (\n <><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"var(--signal)\" /><path d=\"M7 12.5l3.2 3.2L17 9\" fill=\"none\" stroke=\"#fff\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></>\n ) : (\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"var(--text-muted)\" strokeWidth=\"2\" />\n )}\n </svg>\n {r.label}\n </li>\n );\n })}\n </ul>\n </FormCard>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useTransition, type FormEvent } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport type { SiteMember } from \"../../auth/index\";\nimport { Button, EmptyState, StatusPill } from \"../../shell\";\nimport type { ActionResult } from \"../types\";\nimport { Dropdown, Result } from \"./ui\";\nimport { useStudio } from \"../context\";\n\nfunction initials(m: SiteMember): string {\n const parts = (m.name ?? \"\").trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (m.email[0] ?? \"?\").toUpperCase();\n}\n\n/** Team — who can sign in to this site. Owners and staff only. */\nexport function TeamTab({ members, canInvite, myUserId, myRole }: { members: SiteMember[]; canInvite: boolean; myUserId: string; myRole: string }) {\n const router = useRouter();\n const { changeRole, invite, remove, resend } = useStudio().actions;\n const { supportName } = useStudio();\n const [pending, start] = useTransition();\n const [result, setResult] = useState<ActionResult | null>(null);\n const [inviting, setInviting] = useState(false);\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<\"owner\" | \"editor\">(\"editor\");\n const [confirmRemove, setConfirmRemove] = useState<string | null>(null);\n\n const run = (fn: () => Promise<ActionResult>) =>\n start(async () => {\n setResult(null);\n const r = await fn();\n setResult(r);\n if (r.ok) router.refresh();\n });\n\n const sendInvite = (e: FormEvent) => {\n e.preventDefault();\n run(async () => {\n const r = await invite({ email, role });\n if (r.ok) { setEmail(\"\"); setInviting(false); }\n return r;\n });\n };\n\n return (\n <div className=\"acct-stack\">\n {!canInvite && <div className=\"rz-alert admin__alert\">Inviting people isn’t set up on this deployment yet.</div>}\n\n <div className=\"acct-team-head\">\n <p className=\"acct-blurb\" style={{ margin: 0 }}>\n Everyone here can sign in and publish. <b>Owners</b> can also manage this list and the business details; <b>editors</b> just write and publish.\n </p>\n <Button variant=\"primary\" onClick={() => setInviting((v) => !v)} disabled={!canInvite || pending}>+ Invite someone</Button>\n </div>\n\n {inviting && (\n <form className=\"rz-card acct-card acct-invite\" onSubmit={sendInvite}>\n <h2 className=\"acct-title\">Invite someone</h2>\n <p className=\"acct-blurb\">They get an email with a sign-in link. No password to set up.</p>\n <div className=\"acct-invite__row\">\n <input className=\"acct-input\" type=\"email\" placeholder=\"name@company.com\" value={email} onChange={(e) => setEmail(e.target.value)} required autoFocus />\n <Dropdown\n label=\"Role\"\n value={role}\n onChange={setRole}\n options={[\n { value: \"editor\", label: \"Editor\", hint: \"Writes and publishes\" },\n { value: \"owner\", label: \"Owner\", hint: \"Also manages the team\" },\n ]}\n />\n <Button type=\"submit\" variant=\"primary\" disabled={pending}>{pending ? \"Sending…\" : \"Send invitation\"}</Button>\n <Button type=\"button\" onClick={() => setInviting(false)}>Cancel</Button>\n </div>\n </form>\n )}\n\n <Result r={result} />\n\n {myRole === \"staff\" && (\n <p className=\"acct-blurb\" style={{ margin: 0 }}>\n You’re signed in as <b>{supportName} staff</b>, so you’re not listed here — staff can reach every site without being a member of it. The site’s own owners and editors appear below.\n </p>\n )}\n\n {members.length === 0 ? (\n <EmptyState title=\"Nobody on this site’s team yet\" action={canInvite ? <Button variant=\"primary\" onClick={() => setInviting(true)}>Invite the site owner</Button> : undefined}>\n Invite the person who owns this website as an <b>Owner</b>; they can bring in editors themselves.\n </EmptyState>\n ) : (\n <div className=\"rz-table-wrap\">\n <table className=\"rz-table acct-team\">\n <thead>\n <tr><th>Person</th><th className=\"rz-fit\">Role</th><th className=\"rz-fit\">Status</th><th className=\"rz-fit\"></th></tr>\n </thead>\n <tbody>\n {members.map((m) => {\n const me = m.userId === myUserId;\n return (\n <tr key={m.userId} style={{ opacity: m.status === \"invited\" ? 0.8 : 1 }}>\n <td>\n <div className=\"acct-person\">\n <span className=\"acct-person__avatar\">\n {m.avatarUrl ? <img src={m.avatarUrl} alt=\"\" /> : m.status === \"invited\" ? \"—\" : initials(m)}\n </span>\n <span className=\"acct-person__text\">\n <span className=\"acct-person__name\">{m.name ?? m.email}{me && <span className=\"rz-muted\"> (you)</span>}</span>\n {m.name && <span className=\"acct-person__email rz-muted\">{m.email}</span>}\n </span>\n </div>\n </td>\n <td className=\"rz-fit\">\n {m.status === \"active\" && !me && canInvite ? (\n <Dropdown\n label={`Role for ${m.email}`}\n value={m.role}\n disabled={pending}\n options={[\n { value: \"editor\", label: \"Editor\", hint: \"Writes and publishes\" },\n { value: \"owner\", label: \"Owner\", hint: \"Also manages the team\" },\n ]}\n onChange={(role) => run(() => changeRole({ userId: m.userId, role }))}\n />\n ) : (\n <StatusPill tone=\"plain\">{m.role}</StatusPill>\n )}\n </td>\n <td className=\"rz-fit\"><StatusPill tone={m.status === \"active\" ? \"up\" : \"warn\"}>{m.status === \"active\" ? \"Active\" : \"Pending invite\"}</StatusPill></td>\n <td className=\"rz-fit\">\n <div className=\"acct-row-actions\">\n {me || !canInvite ? null : m.status === \"invited\" ? (\n <>\n <button type=\"button\" className=\"acct-link\" disabled={pending} onClick={() => run(() => resend({ email: m.email }))}>Resend</button>\n <button type=\"button\" className=\"acct-link acct-link--danger\" disabled={pending} onClick={() => run(() => remove({ userId: m.userId }))}>Revoke</button>\n </>\n ) : confirmRemove === m.userId ? (\n <>\n <span className=\"rz-muted\">Remove {m.name ?? m.email} from this site?</span>\n <button type=\"button\" className=\"acct-link acct-link--danger\" disabled={pending} onClick={() => { setConfirmRemove(null); run(() => remove({ userId: m.userId })); }}>Yes, remove</button>\n <button type=\"button\" className=\"acct-link\" onClick={() => setConfirmRemove(null)}>Keep</button>\n </>\n ) : (\n <button type=\"button\" className=\"acct-link acct-link--danger\" disabled={pending} onClick={() => setConfirmRemove(m.userId)}>Remove from this site</button>\n )}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport type { SiteBranding } from \"../../auth/index\";\nimport { useStudio } from \"../context\";\nimport { Field, FormCard, formatPhone } from \"./ui\";\nimport { PictureUploader } from \"./PictureUploader\";\n\nconst ImageIcon = () => (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><circle cx=\"9\" cy=\"10\" r=\"1.6\" /><path d=\"M21 16l-5-5-8 8\" />\n </svg>\n);\n\n/** Business — put the client's own name and logo on Studio. Owners and staff only. */\nexport function BusinessTab({ initial }: { initial: SiteBranding | null }) {\n const router = useRouter();\n const { saveBranding, saveBrandingPicture } = useStudio().actions;\n const [name, setName] = useState(initial?.name ?? \"\");\n const [email, setEmail] = useState(initial?.businessEmail ?? \"\");\n const [phone, setPhone] = useState(formatPhone(initial?.businessPhone ?? \"\"));\n\n return (\n <div className=\"acct-stack\">\n <FormCard\n title=\"Your business\"\n blurb=\"Put your own name and logo on Studio. They show at the top of every page for everyone who signs in to your site.\"\n action={async () => { const r = await saveBranding({ name, businessEmail: email, businessPhone: phone }); if (r.ok) router.refresh(); return r; }}\n >\n <Field id=\"biz-name\" label=\"Business name\" hint=\"Appears next to “Studio” at the top of the page.\">\n <input id=\"biz-name\" className=\"acct-input\" value={name} onChange={(e) => setName(e.target.value)} maxLength={80} required />\n </Field>\n <Field id=\"biz-email\" label=\"Business email — optional\">\n <input id=\"biz-email\" className=\"acct-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"hello@yourbusiness.com\" />\n </Field>\n <Field id=\"biz-phone\" label=\"Business phone — optional\">\n <input id=\"biz-phone\" className=\"acct-input\" type=\"tel\" inputMode=\"tel\" autoComplete=\"tel-national\" value={phone} onChange={(e) => setPhone(formatPhone(e.target.value))} placeholder=\"(555) 123-4567\" maxLength={14} />\n </Field>\n </FormCard>\n\n <section className=\"rz-card acct-card\">\n <h2 className=\"acct-title\">Logo</h2>\n <PictureUploader\n kind=\"logo\"\n shape=\"square\"\n currentUrl={initial?.logoUrl ?? null}\n fallback={<ImageIcon />}\n maxWidth={512}\n hint=\"Shown in the top bar. Square or wide.\"\n onUpload={(base64) => saveBrandingPicture({ kind: \"logo\", base64 })}\n onRemove={() => saveBrandingPicture({ kind: \"logo\", base64: null })}\n onChanged={() => router.refresh()}\n />\n </section>\n\n <section className=\"rz-card acct-card\">\n <h2 className=\"acct-title\">Favicon</h2>\n <PictureUploader\n kind=\"favicon\"\n shape=\"square\"\n currentUrl={initial?.faviconUrl ?? null}\n fallback={<ImageIcon />}\n maxWidth={64}\n hint=\"The browser-tab icon. Square, simple.\"\n onUpload={(base64) => saveBrandingPicture({ kind: \"favicon\", base64 })}\n onRemove={() => saveBrandingPicture({ kind: \"favicon\", base64: null })}\n onChanged={() => router.refresh()}\n />\n </section>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Account — H1, email, tab strip, one section at a time. Mirrors the\n * visibility tracker's Account page. Team and Business only for owners and\n * staff. The active tab lives in ?tab= so a reload (and a router.refresh after\n * a save) lands on the same section.\n */\n\nimport { usePathname, useRouter, useSearchParams } from \"next/navigation\";\nimport { Tabs } from \"../../shell\";\nimport type { SiteBranding, SiteMember } from \"../../auth/index\";\nimport { ProfileTab } from \"./ProfileTab\";\nimport { PasswordTab } from \"./PasswordTab\";\nimport { TeamTab } from \"./TeamTab\";\nimport { BusinessTab } from \"./BusinessTab\";\n\nexport type TabId = \"profile\" | \"password\" | \"team\" | \"business\";\n\nconst LABELS: Record<TabId, string> = { profile: \"My Profile\", password: \"Change Password\", team: \"Team\", business: \"Business\" };\n\nexport function AccountTabs({ me, manages, team, branding, myUserId, myRole }: {\n me: { email: string; name: string | null; displayName: string | null; avatarUrl: string | null };\n /** Owners and staff see Team and Business. */\n manages: boolean;\n team: { ok: true; members: SiteMember[]; canInvite: boolean } | { ok: false; error: string } | null;\n branding: SiteBranding | null;\n myUserId: string;\n myRole: string;\n}) {\n const router = useRouter();\n const pathname = usePathname();\n const params = useSearchParams();\n const ids: TabId[] = manages ? [\"profile\", \"password\", \"team\", \"business\"] : [\"profile\", \"password\"];\n const requested = params.get(\"tab\") as TabId | null;\n const active: TabId = requested && ids.includes(requested) ? requested : \"profile\";\n const setActive = (v: string) => router.replace(`${pathname}?tab=${v}`, { scroll: false });\n\n return (\n <>\n <Tabs options={ids.map((id) => ({ value: id, label: LABELS[id] }))} value={active} onChange={setActive} label=\"Account sections\" />\n {active === \"profile\" && <ProfileTab email={me.email} name={me.name} displayName={me.displayName} avatarUrl={me.avatarUrl} />}\n {active === \"password\" && <PasswordTab />}\n {active === \"team\" && manages && (\n team?.ok ? <TeamTab members={team.members} canInvite={team.canInvite} myUserId={myUserId} myRole={myRole} /> : <div className=\"rz-alert admin__alert\">{team?.error ?? \"Couldn’t load the team.\"}</div>\n )}\n {active === \"business\" && manages && <BusinessTab initial={branding} />}\n </>\n );\n}\n","\"use client\";\n\nimport { Suspense } from \"react\";\nimport type { SiteBranding, SiteMember } from \"../types\";\nimport { AccountTabs } from \"./AccountTabs\";\n\n/** Account — My Profile · Change Password · Team · Business. Data is loaded by the site page; the tabs are client forms. */\nexport function StudioAccount({ me, manages, team, branding, myUserId, myRole }: {\n me: { email: string; name: string | null; displayName: string | null; avatarUrl: string | null };\n manages: boolean;\n team: { ok: true; members: SiteMember[]; canInvite: boolean } | { ok: false; error: string } | null;\n branding: SiteBranding | null;\n myUserId: string;\n myRole: string;\n}) {\n return (\n <div className=\"acct\">\n <h1 className=\"acct-h1\">Account</h1>\n <p className=\"acct-email\">{me.email}</p>\n {/* useSearchParams in the tabs needs a Suspense boundary for the static shell */}\n <Suspense fallback={null}>\n <AccountTabs me={me} manages={manages} team={team} branding={branding} myUserId={myUserId} myRole={myRole} />\n </Suspense>\n </div>\n );\n}\n","/**\n * Plain-English facts about how Studio works — the same text a site's help\n * assistant reads. Generic: no site or agency names.\n */\n\nexport const STUDIO_FACTS = `\nHOW REALIIZ STUDIO WORKS (the publishing dashboard at /admin)\n\nThe big picture: your website is stored as files in a private \"repository\" on GitHub (think: a version-controlled folder in the cloud that keeps every change ever made). Studio is a friendly front end over that folder. You never need to open GitHub — every action you take in Studio is one of these steps:\n\n1. SAVE. You edit a post and click \"Save and continue\" (or \"Save changes\"). Studio writes your post as a file and opens a \"change\" — GitHub calls this a pull request, or PR. Nothing on the live site changes yet. Think of it as a draft submitted for checking.\n2. CHECKS. The moment a change exists, the site builds a private test copy with your change in it, to make sure nothing breaks (a broken link tag, a missing required field, an image path that doesn't exist). This usually takes a minute or two. The change page shows a tracker: Saved → Checks → Published → Live, and refreshes itself.\n3. PUBLISH. When the checks pass the status becomes \"Ready to publish\" and the Publish button unlocks. A \"Preview the change\" button also appears: it opens a private copy of the website with your edit in it, so you can see exactly how the post will look before anyone else does. Clicking Publish sends your change to the live site.\n4. LIVE. The website then rebuilds itself with your change — usually about two minutes. The Live step keeps spinning until the rebuild is really done, and \"View the post\" unlocks at that moment. If you look at the website before the Live step turns green you will still see the old version; that's normal, not a failure.\n\nCONTENT TYPES: the sidebar lists every kind of content this site publishes — Blog posts and Speaking & Media (talks, panels, podcasts; shown at realiiz.com/speaking, upcoming first). Speaking items have a date, optional start/end time and time zone, a kind, a host, a place, links for details, the recording and slides, and — for Ed's own events — an RSVP link, capacity, “sign-ups closed” and “private” (invited guests only; the event still shows but has no RSVP button). Each works the same way — a list, a New button, a form, Save, checks, Publish.\n\nSTATUSES you'll see in each list and on each item:\n- Live: what's on the website right now, no change waiting.\n- Checking…: you saved; the test build is running. Wait a minute or two.\n- Ready to publish: checks passed; open the change and click Publish.\n- Needs fixing: the test build failed. Nothing was published. Open the post, fix the problem the message names, save again — the same change re-runs its checks.\n- New · …: a brand-new post that exists only in a change; it isn't on the live site until you publish.\n\nRULES OF THUMB:\n- One open change per post. Saving again while a change is waiting updates that same change (it doesn't create a second one). The sticky bar at the bottom of the editor tells you which change you're updating.\n- You can leave and come back: the posts table's Status column links to the change, and the post page shows a notice with a Publish button when a change is waiting.\n- Changed your mind? On the change page, \"Discard this change\" (with a confirm step) throws the unpublished edits away. The live site is untouched and the post goes back to Live.\n- \"View on GitHub\" opens the raw change for the curious; you never need it.\n- Only signed-in editors and owners can save or publish. Sign-in is by email link (no password).\n- If two people edit the same post, the second to publish is told the file changed first and asked to redo their edit on the latest version — nothing is silently overwritten.\n\nFIELDS on a blog post:\n- Title (H1): the headline at the top of the post. Can be long.\n- Web address (slug): the last part of the post's URL, e.g. my-first-post → realiiz.com/blog/my-first-post. Lowercase words joined by hyphens.\n- Excerpt: the short teaser shown on the blog listing page.\n- Publish date / Last updated: shown on the post and used for ordering; Last updated is optional, for revisions.\n- Author, Tags (exactly 3, lowercase-hyphenated), Header image (choose or drop a picture — see PICTURES below), Header image description (alt text for accessibility), Featured (pins the post).\n- Search & social group: Search title (what Google and the browser tab show — aim for 50–60 characters including the site name; blank means same as Title), Meta description (the snippet under the title in Google — aim for 120–155 characters), Focus keyword (the phrase the post targets; used for SEO reporting, never shown), Social share image (the picture for social cards; blank reuses the hero image), Canonical (advanced; leave blank unless the article was published elsewhere first).\n- Post content: Markdown. The toolbar buttons toggle formatting on and off; Preview shows exactly how the blog will render it; the tooltip button wraps a selected term in a definition that appears on hover; Expand fills the window (Esc to come back).\n- Length gauges under the search fields: the green band is the target range; the fill turns green when you're inside it and red when you're over.\n\nPICTURES:\n- Choose a picture (or drag one in, or paste) for the header image, the social share image, or anywhere in the post content via the toolbar's picture button. JPG, PNG or WebP up to 10 MB; Studio shrinks it in your browser to a web-friendly WebP (about 1600 pixels wide, usually 100–400 KB) before sending.\n- Nothing is uploaded when you pick — the pictures are saved together with the post when you press Save, into the same change, and go live with it when you Publish. Discarding a change discards its pictures too.\n- Pictures are named after the post's web address (slug), so fill that in first: the header image becomes /blog/<slug>.webp and pictures in the text go under /blog/<slug>/.\n- Preview shows new pictures before they're saved. The \"Preview the change\" link after the checks shows them on the real site design.\n\nACCOUNT (avatar menu → Account, or Settings in the sidebar):\n- My Profile: your photo, your name (shown in the greeting and to teammates) and “Name on blog posts” — how you're credited as the author; blank means your full name. Your email is your login and can't be changed here — ask your web team.\n- Change Password: optional. Email links always work; a password is a second way in. At least 10 characters. On the sign-in page, \"Have a password? Sign in with it instead\" reveals the password form. Forgot your password? There's nothing to reset — sign in with an email link and set a new one under Settings → Change Password.\n- Team (owners only): who can sign in to this site. \"+ Invite someone\" sends an email link — no password needed. Editors write and publish; owners also manage the team and the business details. Pending invites can be resent or revoked; active people can be removed from this site (their login survives for any other site). A site always keeps at least one owner. Support staff aren't listed in a site's team — they can reach every site without being a member.\n- Business (owners only): your business name, contact email/phone, logo and favicon. Saving puts your name and logo at the top of Studio for everyone who signs in to your site — it never changes the public website.\n- Help (avatar menu): the help centre. For now it points here, to the Ask bubble; a full browsable guide is coming.\n`;\n","/**\n * The serialisable shapes that cross from a site's server pages into these\n * client components, and the exact set of server actions a site must provide.\n */\n\nimport type { ContentTypeEntry } from \"../forms/types\";\nimport type { PullRequestStatus } from \"../git/types\";\nimport type { SiteBranding } from \"../auth/branding\";\nimport type { SiteMember } from \"../auth/members\";\n\nexport type ActionResult = { ok: true; message?: string } | { ok: false; error: string };\nexport type PublishResult = { ok: false; error: string };\nexport type MergeOutcome =\n | { state: \"merged\"; sha: string } | { state: \"pending\" } | { state: \"stale\" }\n | { state: \"red\"; failingCheck: string | null } | { state: \"error\"; message: string };\nexport type DiscardOutcome = { state: \"discarded\" } | { state: \"already-published\" } | { state: \"error\"; message: string };\nexport type TeamState = { ok: true; members: SiteMember[]; canInvite: boolean } | { ok: false; error: string };\n\nexport interface ImagePayload { path: string; base64: string }\nexport interface PublishInput {\n type: string;\n frontmatter: Record<string, unknown>;\n body: string;\n existing?: { number: number; branch: string } | null;\n images?: ImagePayload[];\n}\n\n/** Exactly what a site's \"use server\" wrapper file must export. */\nexport interface StudioActions {\n publishContent: (input: PublishInput) => Promise<PublishResult | never>;\n removeContent: (input: { type: string; slug: string }) => Promise<PublishResult | never>;\n mergeContentPr: (number: number) => Promise<MergeOutcome>;\n discardChange: (number: number, branch: string) => Promise<DiscardOutcome>;\n previewBody: (markdown: string) => Promise<{ html: string } | { error: string }>;\n saveProfile: (input: { name: string; displayName: string }) => Promise<ActionResult>;\n saveAvatar: (input: { base64: string } | null) => Promise<ActionResult>;\n changePassword: (input: { password: string; confirm: string }) => Promise<ActionResult>;\n loadBranding: () => Promise<SiteBranding | null>;\n saveBranding: (input: { name: string; businessEmail: string; businessPhone: string }) => Promise<ActionResult>;\n saveBrandingPicture: (input: { kind: \"logo\" | \"favicon\"; base64: string | null }) => Promise<ActionResult>;\n loadMe: () => Promise<{ email: string; role: string; name: string | null; displayName: string | null; avatarUrl: string | null }>;\n loadTeam: () => Promise<TeamState>;\n invite: (input: { email: string; role: \"owner\" | \"editor\" }) => Promise<ActionResult>;\n changeRole: (input: { userId: string; role: \"owner\" | \"editor\" }) => Promise<ActionResult>;\n resend: (input: { email: string }) => Promise<ActionResult>;\n remove: (input: { userId: string }) => Promise<ActionResult>;\n}\n\nexport const ACTION_NAMES = [\n \"publishContent\", \"removeContent\", \"mergeContentPr\", \"discardChange\", \"previewBody\",\n \"saveProfile\", \"saveAvatar\", \"changePassword\", \"loadBranding\", \"saveBranding\", \"saveBrandingPicture\", \"loadMe\",\n \"loadTeam\", \"invite\", \"changeRole\", \"resend\", \"remove\",\n] as const satisfies readonly (keyof StudioActions)[];\n\n/** One row of a content list, as the site page loads it from Studio.readers.listItems. */\nexport interface ListRow {\n slug: string;\n title: string;\n date: string | null;\n needsAttention: boolean;\n isNew: boolean;\n /** Where the live item is on the public site, or null when the type has no page. */\n liveUrl: string | null;\n pending: { number: number; state: \"checking\" | \"ready\" | \"failed\"; removal: boolean } | null;\n}\n\nexport type PendingSummary = { number: number; branch: string; state: \"checking\" | \"ready\" | \"failed\"; failingCheck: string | null; removal: boolean };\n\nexport type { ContentTypeEntry, PullRequestStatus, SiteBranding, SiteMember };\n"]}
|