@realiizlabs/admin 0.15.2 → 0.15.4
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/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio-ui/index.cjs +149 -14
- 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 +149 -14
- package/dist/studio-ui/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/studio-ui/context.tsx","../../src/shell/icons.tsx","../../src/shell/Sidebar.tsx","../../src/shell/Button.tsx","../../src/shell/ThemeToggle.tsx","../../src/shell/AccountMenu.tsx","../../src/shell/TopBar.tsx","../../src/shell/tokens.ts","../../src/shell/AdminShell.tsx","../../src/shell/primitives.tsx","../../src/shell/Tabs.tsx","../../src/version.ts","../../src/studio-ui/css.ts","../../src/studio-ui/useDeployed.ts","../../src/studio-ui/UpdateStrip.tsx","../../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/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/StudioTab.tsx","../../src/studio-ui/account/AccountTabs.tsx","../../src/studio-ui/account/StudioAccount.tsx","../../src/studio-ui/help/sections.ts","../../src/studio-ui/help/quick-start.ts","../../src/studio-ui/help/publishing.ts","../../src/studio-ui/help/blog.ts","../../src/studio-ui/help/pictures.ts","../../src/studio-ui/help/markdown.ts","../../src/studio-ui/help/events.ts","../../src/studio-ui/help/account.ts","../../src/studio-ui/help/trouble.ts","../../src/studio-ui/help/index.ts","../../src/studio-ui/facts.ts","../../src/studio-ui/help/md.tsx","../../src/studio-ui/help/StudioHelp.tsx","../../src/studio-ui/types.ts"],"names":["jsx","jsxs","useState","useEffect","useRef","read","Fragment","labelFor","useId","useCallback","useMemo","base","useImages","useTransition","Link","keyFor","Field","toBase64","createBrowserClient","error","initialsOf","useRouter","role","usePathname","buf","INLINE"],"mappings":"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","file":"index.js","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, version }: { items: NavItem[]; pinned?: NavItem[]; activeHref: string; basePath: string; /** Shown quietly under Collapse, e.g. \"0.15.1\". */ version?: string | null }) {\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 {version && (\n <span className=\"rz-sidebar__version\" title={`Studio ${version}`}>\n <span className=\"rz-sidebar__label\">Studio </span>{version}\n </span>\n )}\n </aside>\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 centers. */\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","/**\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 { OutboundArrow } from \"./Button\";\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 GlobeIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18\" /></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, siteUrl }: {\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 center. Omit to hide the item. */\n helpHref?: string;\n /** The live website — a \"View website\" item that opens in a new tab. Omit to hide it. */\n siteUrl?: string | null;\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 {(siteUrl || accountHref || helpHref) && <div className=\"rz-menu__sep\" />}\n {siteUrl && (\n <a href={siteUrl} target=\"_blank\" rel=\"noreferrer\" role=\"menuitem\" className=\"rz-menu__item\">\n <GlobeIcon />\n View website\n <span className=\"rz-menu__end\"><OutboundArrow /></span>\n </a>\n )}\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 center\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\";\nimport { OutboundArrow } from \"./Button\";\n\nexport function TopBar({ siteName, productName, logoUrl, homeHref, siteUrl, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n siteName: string;\n productName: string;\n logoUrl?: string | null;\n homeHref: string;\n /** The live website. When set, the brand opens it in a new tab (like every dashboard people know); otherwise it goes to the dashboard. */\n siteUrl?: string | null;\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\n href={siteUrl || homeHref}\n className=\"rz-topbar__brand\"\n {...(siteUrl ? { target: \"_blank\", rel: \"noreferrer\", title: \"Open the live website in a new tab\" } : {})}\n >\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 {siteUrl && <OutboundArrow />}\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} siteUrl={siteUrl} />\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__brand .rz-arrow { color: var(--text-muted); opacity: 0; transition: opacity .15s, transform .15s; }\n.rz-topbar__brand:hover .rz-arrow { opacity: 1; }\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-sidebar__version { display: block; padding: 0 1rem .75rem; font-family: var(--rz-font-mono); font-size: .6875rem; letter-spacing: .04em; color: var(--text-muted); opacity: .8; white-space: nowrap; }\n.rz-sidebar--collapsed .rz-sidebar__version { padding: 0 0 .75rem; text-align: center; }\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 color 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 center for the avatar menu. Default `${basePath}/help`; null hides the item. */\n helpHref?: string | null;\n /** The live website. Makes the brand and a \"View website\" menu item open it in a new tab. */\n siteUrl?: 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 /** The running Studio version, shown quietly at the foot of the sidebar. */\n version?: string | null;\n children: ReactNode;\n}\n\nexport function AdminShell({\n siteName, productName = \"Studio\", logoUrl, user, role, nav, pinnedNav, activeHref,\n basePath = \"/admin\", signOutPath, accountHref, helpHref, siteUrl, branding, defaultTheme = \"light\", version, 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 siteUrl={siteUrl}\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} version={version} />}\n <main className=\"rz-main\">\n <div className=\"rz-content\">{children}</div>\n </main>\n </div>\n </div>\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","/** The package's own version, baked in by tsup (`define`); a dev fallback for vitest and tsc. */\ndeclare const __ADMIN_VERSION__: string | undefined;\n\nexport const ADMIN_VERSION: string = typeof __ADMIN_VERSION__ === \"string\" ? __ADMIN_VERSION__ : \"0.0.0-dev\";\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, color 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 center 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/* ---- Help center ---------------------------------------------------- */\n.rz-admin .rz-help__search { position: relative; margin: 0 0 1.5rem; max-width: 44rem; }\n.rz-admin .rz-help__search svg { position: absolute; left: .9rem; top: 50%; transform: translateY(-50%); color: var(--text-muted); pointer-events: none; }\n.rz-admin .rz-help__search input { width: 100%; padding-left: 2.6rem; font-size: 1rem; }\n.rz-admin .rz-help__body { display: grid; grid-template-columns: 13rem minmax(0, 1fr); gap: 2rem; align-items: start; }\n@media (max-width: 760px) { .rz-admin .rz-help__body { grid-template-columns: 1fr; gap: 1rem; } .rz-admin .rz-help__nav { display: flex; flex-wrap: wrap; gap: .25rem; } }\n.rz-admin .rz-help__nav { position: sticky; top: calc(var(--rz-topbar) + 1rem); display: flex; flex-direction: column; gap: .1rem; }\n.rz-admin .rz-help__navitem { padding: .45rem .75rem; border-radius: 6px; color: var(--text-secondary); text-decoration: none; font-size: .875rem; }\n.rz-admin .rz-help__navitem:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-admin .rz-help__navitem--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-admin .rz-help__main { max-width: 44rem; min-width: 0; }\n.rz-admin .rz-help__h { font-family: var(--rz-font-display); font-size: 1.5rem; font-weight: 600; letter-spacing: -.01em; margin: 0 0 .35rem; }\n.rz-admin .rz-help__blurb { color: var(--text-secondary); margin: 0 0 1.25rem; }\n.rz-admin .rz-help__count { color: var(--text-muted); font-size: .85rem; margin: 0 0 .75rem; }\n.rz-admin .rz-help__list { list-style: none; margin: 0; padding: 0; display: grid; gap: .6rem; }\n.rz-admin .rz-help__card { display: flex; flex-direction: column; gap: .2rem; padding: .9rem 1rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--rz-radius); text-decoration: none; color: inherit; transition: border-color .15s; }\n.rz-admin .rz-help__card:hover { border-color: var(--signal); }\n.rz-admin .rz-help__meta { font-family: var(--rz-font-mono); font-size: .65rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); }\n.rz-admin .rz-help__title { font-weight: 600; color: var(--text-primary); }\n.rz-admin .rz-help__summary { color: var(--text-secondary); font-size: .9rem; line-height: 1.5; }\n.rz-admin .rz-help__crumb { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--rz-font-mono); font-size: .75rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); text-decoration: none; margin: 0 0 1rem; }\n.rz-admin .rz-help__crumb:hover { color: var(--signal); }\n.rz-admin .rz-help__prose { line-height: 1.65; color: var(--text-primary); }\n.rz-admin .rz-help__prose > * + * { margin-top: .85rem; }\n.rz-admin .rz-help__prose h2 { font-family: var(--rz-font-display); font-size: 1.1rem; font-weight: 600; margin-top: 1.75rem; }\n.rz-admin .rz-help__prose h3 { font-size: .95rem; font-weight: 600; margin-top: 1.25rem; }\n.rz-admin .rz-help__prose p, .rz-admin .rz-help__prose li { color: var(--text-secondary); }\n.rz-admin .rz-help__prose strong { color: var(--text-primary); font-weight: 600; }\n.rz-admin .rz-help__prose ul, .rz-admin .rz-help__prose ol { padding-left: 1.35rem; }\n.rz-admin .rz-help__prose li + li { margin-top: .3rem; }\n.rz-admin .rz-help__prose code { font-family: var(--rz-font-mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--border); border-radius: 4px; padding: .05em .35em; }\n.rz-admin .rz-help__prose pre { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--rz-radius); padding: .8rem 1rem; overflow-x: auto; }\n.rz-admin .rz-help__prose pre code { background: transparent; border: 0; padding: 0; font-size: .82rem; line-height: 1.55; }\n.rz-admin .rz-help__prose blockquote { margin: 0; padding: .2rem 0 .2rem 1rem; border-left: 3px solid var(--signal); color: var(--text-secondary); }\n.rz-admin .rz-help__prose a { color: var(--signal); text-decoration: none; }\n.rz-admin .rz-help__prose a:hover { color: var(--text-primary); }\n.rz-admin .rz-help__prose .rz-table td { white-space: normal; color: var(--text-secondary); }\n.rz-admin .rz-help__pager { display: flex; justify-content: space-between; gap: 1rem; margin-top: 2.5rem; padding-top: 1rem; border-top: 1px solid var(--separator); font-size: .875rem; }\n.rz-admin .rz-help__pager a { display: inline-flex; align-items: center; gap: .35rem; color: var(--text-secondary); text-decoration: none; }\n.rz-admin .rz-help__pager a:hover { color: var(--signal); }\n.rz-admin .rz-arrow--back { transform: none; }\n@media (prefers-reduced-motion: no-preference) { .rz-admin a:hover .rz-arrow--back { transform: translateX(-4px); } }\n\n/* ---- Studio update strip / Settings → Studio ---------------------------- */\n.rz-admin .rz-update { border: 1px solid color-mix(in srgb, var(--signal) 22%, var(--border)); border-radius: 8px; background: color-mix(in srgb, var(--signal) 5%, var(--surface-1)); padding: .75rem 1.1rem; }\n.rz-admin .rz-update--strip { margin: 0 0 1.5rem; }\n.rz-admin .rz-update__row { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1.1rem; }\n.rz-admin .rz-update__title { display: inline-flex; align-items: center; gap: .55rem; font-weight: 600; color: var(--text-primary); }\n.rz-admin .rz-update__title::before { content: \"\"; width: 8px; height: 8px; border-radius: 50%; background: var(--signal); box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); }\n.rz-admin .rz-update__link { display: inline-flex; align-items: center; gap: .3rem; background: none; border: 0; padding: 0; font: inherit; font-size: .875rem; color: var(--signal); cursor: pointer; text-decoration: none; }\n.rz-admin .rz-update__link:hover { color: var(--text-primary); }\n.rz-admin .rz-update__later { margin-left: auto; background: none; border: 0; padding: 0; font: inherit; font-size: .8rem; color: var(--text-muted); cursor: pointer; }\n.rz-admin .rz-update__later:hover { color: var(--text-primary); }\n.rz-admin .rz-update__notes { margin: .6rem 0 0; font-size: .875rem; line-height: 1.55; color: var(--text-secondary); white-space: pre-line; }\n.rz-admin .rz-update__problem { margin: .6rem 0 0; font-size: .875rem; color: var(--status-down); }\n.rz-admin .rz-update__done { display: block; margin-top: .5rem; font-size: .875rem; color: var(--text-secondary); }\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\n/**\n * \"Studio 0.15 is available\" — a quiet strip under the top bar for owners and\n * staff, only once the update's checks are green. What's new expands inline,\n * Preview opens the site with the update, Update merges (the same publish step\n * as any change) and then tracks the rebuild. Later hides it for this tab.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { Button, OutboundArrow, Steps, type StepState } from \"../shell\";\nimport { useStudio } from \"./context\";\nimport { useDeployed } from \"./useDeployed\";\nimport type { MergeOutcome, StudioUpdate } from \"./types\";\n\nconst HIDE_KEY = \"rz-update-later\";\n\nexport function canSeeUpdates(role: string | null | undefined): boolean {\n return role === \"owner\" || role === \"staff\";\n}\n\nexport function UpdateStrip({ update, role }: { update: StudioUpdate | null | undefined; role: string | null }) {\n const [hidden, setHidden] = useState(true); // hidden until we know sessionStorage says otherwise (no flash)\n useEffect(() => {\n try { setHidden(sessionStorage.getItem(HIDE_KEY) === update?.version); } catch { setHidden(false); }\n }, [update?.version]);\n if (!update || update.state !== \"ready\" || !canSeeUpdates(role) || hidden) return null;\n const later = () => { try { sessionStorage.setItem(HIDE_KEY, update.version); } catch { /* private mode */ } setHidden(true); };\n return <UpdateBody update={update} onLater={later} compact />;\n}\n\n/** The strip's body — also the Settings → Studio tab's action area (compact=false). */\nexport function UpdateBody({ update, onLater, compact = false }: { update: StudioUpdate; onLater?: () => void; compact?: boolean }) {\n const { actions } = useStudio();\n const [showNotes, setShowNotes] = useState(!compact);\n const [busy, setBusy] = useState(false);\n const [outcome, setOutcome] = useState<MergeOutcome | null>(null);\n const merged = outcome?.state === \"merged\";\n const deploy = useDeployed(merged, merged ? outcome.sha : null);\n\n const run = async () => {\n setBusy(true);\n try { setOutcome(await actions.updateStudio(update.number)); } finally { setBusy(false); }\n };\n\n if (merged) {\n const live = deploy === \"live\";\n const steps = [\n { label: \"Updated\", state: \"done\" as StepState, note: `Studio ${update.version}` },\n { label: \"Live\", state: (live ? \"done\" : \"active\") as StepState, note: live ? \"On the site now\" : deploy === \"slow\" ? \"Taking longer than usual\" : \"Rebuilding, about two minutes\" },\n ];\n return (\n <div className={`rz-update${compact ? \" rz-update--strip\" : \"\"}`} role=\"status\">\n <Steps steps={steps} />\n <span className=\"rz-update__done\">\n {live ? `Studio ${update.version} is live. Reload and the version at the foot of the sidebar will change.` : \"The version shown in Studio changes once the site has rebuilt.\"}\n </span>\n </div>\n );\n }\n\n const problem = outcome && outcome.state !== \"pending\"\n ? outcome.state === \"stale\" ? \"The site changed since the checks ran. Try again in a minute.\"\n : outcome.state === \"red\" ? `The checks failed${outcome.failingCheck ? ` (${outcome.failingCheck})` : \"\"}. Your web team has been able to see this.`\n : outcome.state === \"error\" ? outcome.message : null\n : null;\n\n return (\n <div className={`rz-update${compact ? \" rz-update--strip\" : \"\"}`} role=\"status\">\n <div className=\"rz-update__row\">\n <span className=\"rz-update__title\">Studio {update.version} is available</span>\n <button type=\"button\" className=\"rz-update__link\" onClick={() => setShowNotes((v) => !v)} aria-expanded={showNotes}>What’s new</button>\n {update.previewUrl && (\n <a href={update.previewUrl} target=\"_blank\" rel=\"noreferrer\" className=\"rz-update__link\">Preview <OutboundArrow /></a>\n )}\n <Button size=\"sm\" onClick={run} disabled={busy}>{busy ? \"Updating…\" : \"Update\"}</Button>\n {onLater && <button type=\"button\" className=\"rz-update__later\" onClick={onLater}>Later</button>}\n </div>\n {showNotes && (\n <p className=\"rz-update__notes\">{update.notes ?? `Version ${update.version} of Studio, replacing ${update.currentVersion}. Nothing changes on your website until you press Update.`}</p>\n )}\n {problem && <p className=\"rz-update__problem\">{problem}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { AdminShell, type NavItem, type ShellUser } from \"../shell\";\nimport { ADMIN_VERSION } from \"../version\";\nimport { STUDIO_CSS } from \"./css\";\nimport { UpdateStrip } from \"./UpdateStrip\";\nimport type { StudioUpdate } from \"./types\";\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, siteUrl = \"/\", user, role, nav, pinnedNav, branding, update = null, children }: {\n siteName: string;\n logoUrl?: string | null;\n /** The public website — pass \"/\" so it works on previews and localhost too. The brand and the avatar menu open it in a new tab. */\n siteUrl?: 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 /** The pending Studio update from Studio.readers.studioUpdate(); shown as a strip to owners and staff when ready. */\n update?: StudioUpdate | null;\n children: React.ReactNode;\n}) {\n const pathname = usePathname() ?? \"/admin\";\n // The public site's Studio pill (@realiizlabs/admin/bar) shows when this marker is present.\n // It carries no identity; /admin still does the real check. Cleared by the sign-out handler.\n useEffect(() => {\n if (user) document.cookie = \"rz-studio=1; Path=/; Max-Age=2592000; SameSite=Lax\";\n }, [user]);\n return (\n <>\n <style>{STUDIO_CSS}</style>\n <AdminShell siteName={siteName} logoUrl={logoUrl ?? undefined} siteUrl={siteUrl} user={user} role={role} nav={nav} pinnedNav={pinnedNav} branding={branding} accountHref={null} activeHref={pathname} version={ADMIN_VERSION}>\n <UpdateStrip update={update} role={role} />\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 color: 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, 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 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 * Settings → Studio: which version is running, whether an update is waiting\n * (with notes and the same Update button as the strip), and how updates work.\n * Owners and staff only — the tab isn't offered to editors.\n */\n\nimport { Card } from \"../../shell\";\nimport { useStudio } from \"../context\";\nimport { UpdateBody } from \"../UpdateStrip\";\nimport type { StudioUpdate } from \"../types\";\n\nexport function StudioTab({ update, version, role }: { update: StudioUpdate | null; version: string; role: string }) {\n const { supportName } = useStudio();\n return (\n <div className=\"acct-stack\">\n <Card className=\"acct-card\">\n <h2 className=\"acct-title\">Studio {version}</h2>\n {!update && <p className=\"acct-blurb\">You’re up to date. When a new version comes out, it appears here and as a strip at the top of every Studio page.</p>}\n {update?.state === \"checking\" && (\n <p className=\"acct-blurb\">Studio {update.version} is on its way — the checks are still running. Come back in a couple of minutes.</p>\n )}\n {update?.state === \"failed\" && (\n <p className=\"acct-blurb\">\n Studio {update.version} is available, but its checks failed, so it can’t be installed yet.\n {role === \"staff\" && update.failingCheck ? ` Failing check: ${update.failingCheck}.` : ` ${supportName} has been able to see this and will sort it out.`}\n </p>\n )}\n {update?.state === \"ready\" && <UpdateBody update={update} />}\n </Card>\n <Card className=\"acct-card\">\n <h2 className=\"acct-title\">How updates work</h2>\n <p className=\"acct-blurb\">\n Studio is a small package inside your website. When {supportName} releases a new version, your site prepares the update\n as a checked change — the same way a blog post is checked before it goes live — and builds a private preview.\n Nothing changes until you press <b>Update</b>. If the update would break anything, the button never unlocks.\n </p>\n </Card>\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\";\nimport { StudioTab } from \"./StudioTab\";\nimport type { StudioUpdate } from \"../types\";\n\nexport type TabId = \"profile\" | \"password\" | \"team\" | \"business\" | \"studio\";\n\nconst LABELS: Record<TabId, string> = { profile: \"My Profile\", password: \"Change Password\", team: \"Team\", business: \"Business\", studio: \"Studio\" };\n\nexport function AccountTabs({ me, manages, team, branding, myUserId, myRole, update = null, version = \"\" }: {\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 /** The pending Studio update (owners and staff), from Studio.readers.studioUpdate(). */\n update?: StudioUpdate | null;\n /** The running Studio version (ADMIN_VERSION). */\n version?: string;\n}) {\n const router = useRouter();\n const pathname = usePathname();\n const params = useSearchParams();\n const ids: TabId[] = manages ? [\"profile\", \"password\", \"team\", \"business\", \"studio\"] : [\"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 {active === \"studio\" && manages && <StudioTab update={update} version={version} role={myRole} />}\n </>\n );\n}\n","\"use client\";\n\nimport { Suspense } from \"react\";\nimport type { SiteBranding, SiteMember } from \"../types\";\nimport { AccountTabs } from \"./AccountTabs\";\nimport type { StudioUpdate } from \"../types\";\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, update = null, version = \"\" }: {\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 update?: StudioUpdate | null;\n version?: 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} update={update} version={version} />\n </Suspense>\n </div>\n );\n}\n","import type { HelpSection } from \"./types\";\n\n/** Section order on the Help page — Quick start first, Troubleshooting last. */\nexport const HELP_SECTIONS: HelpSection[] = [\n { id: \"start\", title: \"Quick start\", blurb: \"Ten minutes from signing in to your first published change.\" },\n { id: \"publishing\", title: \"Publishing a change\", blurb: \"Save, checks, preview, publish — and how to undo.\" },\n { id: \"blog\", title: \"Blog posts\", blurb: \"Every field on a post, and what it does for readers and Google.\" },\n { id: \"pictures\", title: \"Pictures\", blurb: \"Where to get one, what size, and how to drop it in.\" },\n { id: \"markdown\", title: \"Writing in Markdown\", blurb: \"Headings, lists, links, tables — the formatting the editor understands.\" },\n { id: \"events\", title: \"Events\", blurb: \"Dates, times, time zones, kinds, and what to do when plans change.\" },\n { id: \"account\", title: \"Account & team\", blurb: \"Your profile, your password, who else can sign in, your branding.\" },\n { id: \"trouble\", title: \"Troubleshooting\", blurb: \"When something doesn't look right — what it means and what to do.\" },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Quick start — read top to bottom once; everything else is reference. */\nexport const QUICK_START: HelpArticle[] = [\n {\n id: \"what-is-studio\",\n section: \"start\",\n title: \"What Studio is (and isn't)\",\n summary: \"A simple front end over the files that make up your website. Nothing goes live by accident.\",\n keywords: [\"overview\", \"github\", \"repository\", \"how it works\"],\n body: `\n## What it is\n\nStudio is the publishing dashboard for {siteName}. It lets you write, edit and publish {types} without touching code or learning GitHub.\n\nYour website is stored as plain files in a private, backed-up folder on GitHub called a **repository**. Every version of every page is kept forever. Studio reads that folder and writes to it on your behalf.\n\n## Why it works this way\n\nBecause every edit goes through the same three steps — **Save**, **Checks**, **Publish** — a broken page can't reach your visitors. The website is rebuilt with your change in a private test copy first. If something is wrong, you're told, and the live site keeps showing the last good version.\n\n## What it isn't\n\n- It isn't a page builder. The design of the site is fixed by {supportName}; Studio fills it with content.\n- It isn't instant. Publishing takes about two minutes end to end, on purpose.\n- It isn't the only way in. The same files can be edited on GitHub directly, so nothing is ever locked inside Studio.\n`,\n },\n {\n id: \"signing-in\",\n section: \"start\",\n title: \"Signing in\",\n summary: \"Email link by default; a password if you set one. No account to create.\",\n keywords: [\"login\", \"magic link\", \"password\", \"email link\"],\n body: `\n## How it works\n\nGo to **/admin** on your website. Enter your email and press **Send me a sign-in link**. Open the email and click the link — you're in. The link is single-use and expires after a short while.\n\nThere's no account to create: {supportName} invited your email address, which is what allows you in.\n\n## Prefer a password?\n\nUnder the email form, click **Have a password? Sign in with it instead**. A password is optional — you set one under **Settings → Change Password** after signing in with an email link. Email links keep working either way.\n\n## Forgot your password?\n\nThere's nothing to reset. Sign in with an email link, then set a new password under **Settings → Change Password**.\n\n## Signing out\n\nOpen the avatar menu (top right) and choose **Sign out**.\n`,\n },\n {\n id: \"finding-your-way\",\n section: \"start\",\n title: \"Finding your way around\",\n summary: \"The sidebar, the dashboard, the lists, and the avatar menu.\",\n keywords: [\"sidebar\", \"dashboard\", \"navigation\", \"menu\", \"settings\", \"view website\", \"live site\", \"visit site\"],\n body: `\n## The sidebar\n\nOne item per kind of content this site publishes — on {siteName} that's {types}. Each opens a list of everything of that kind with its status. **Dashboard** at the top shows one card per kind with a count and how many changes are waiting. **Settings** at the bottom opens your account.\n\nOn a narrow screen the sidebar collapses to icons; press the arrow at the bottom to expand it.\n\n## A list page\n\nEvery row is one item: its title, date, status and a **View live** link. **+ New** at the top starts a new one. Click a title to edit it. The **Status** column links straight to a waiting change.\n\n## Getting to the live website\n\nClick the site name at the top left — it opens the live website in a new tab (hover and an arrow appears). The avatar menu has the same thing as **View website**. Each item's list row also has **View live** for that one page.\n\n## The avatar menu\n\nTop right, your photo or initials. From here: a light/dark toggle, **View website**, **Account**, **Help center** (this page), and **Sign out**.\n\n## The Ask bubble\n\nIf your site has one (bottom right), it answers questions about Studio from the same articles you're reading now. Ask it things like \"how do I add a picture to a post?\".\n`,\n },\n {\n id: \"your-first-change\",\n section: \"start\",\n title: \"Your first change, start to finish\",\n summary: \"Edit something small, save it, watch the checks, preview it, publish it.\",\n keywords: [\"tutorial\", \"walkthrough\", \"first post\", \"publish\"],\n body: `\nPick something small — a typo in an existing post is perfect.\n\n1. In the sidebar, open the list, then click the item's title.\n2. Make the edit. The form checks required fields as you go; a red message means something needs attention before you can save.\n3. Press **Save changes** (or **Save and continue** for a new item). Studio writes the file and opens a **change**. Nothing is live yet.\n4. You land on the change page. A tracker shows **Saved → Checks → Published → Live**. Checks take a minute or two; the page refreshes itself.\n5. When checks pass, **Preview the change** opens a private copy of the website with your edit in it. Look at it on your phone too.\n6. Press **Publish**. The **Live** step spins until the website has really rebuilt (about two minutes), then **View live** unlocks.\n\nThat's the whole loop. Every edit you ever make is these six steps.\n\n## If checks fail\n\nThe status becomes **Needs fixing** and the message names the problem. Open the item, fix it, save again — the same change re-runs its checks. Nothing was published.\n`,\n },\n {\n id: \"statuses\",\n section: \"start\",\n title: \"What the statuses mean\",\n summary: \"Live, Checking…, Ready to publish, Needs fixing, New — and what to do for each.\",\n keywords: [\"status\", \"pill\", \"checking\", \"ready\", \"needs fixing\", \"live\", \"new\"],\n body: `\n| Status | What it means | What to do |\n| --- | --- | --- |\n| **Live** | What's on the website now. No change waiting. | Nothing — or click the title to start an edit. |\n| **Checking…** | You saved; the test build is running. | Wait a minute or two. The page refreshes itself. |\n| **Ready to publish** | Checks passed. | Open the change and press **Publish** (preview first if you like). |\n| **Needs fixing** | The test build failed. Nothing was published. | Open the item, fix what the message names, save again. |\n| **New · …** | A brand-new item that exists only in a change. | It isn't on the website until you publish it. |\n| **Removing…** / **Removal ready** | You asked to take an item down; same steps as any change. | Publish to make the removal live, or discard to keep the item. |\n\nOne item has at most one change waiting at a time. Saving again updates that same change rather than starting a second one.\n`,\n },\n {\n id: \"studio-pill\",\n section: \"start\",\n title: \"Getting back to Studio from the website\",\n summary: \"A small Studio pill appears bottom-left on the website while you're signed in — Edit this page, or Dashboard.\",\n keywords: [\"pill\", \"edit this page\", \"admin bar\", \"back to studio\", \"website\"],\n body: `\n## What it is\n\nWhile you're signed in to Studio, your public website shows a small dark pill in the bottom-left corner: **Studio · Edit this page · Dashboard**. Visitors never see it — it only appears in a browser where you've signed in.\n\n## Why it's useful\n\nSpot a typo while reading your own site? **Edit this page** opens that exact post or event in Studio. **Dashboard** takes you to the Studio home.\n\n## Good to know\n\n- **Edit this page** only shows on pages Studio manages (a blog post, an event). On the home page or About, you get **Dashboard** only.\n- The × hides the pill for that browser tab; it comes back next time you open the site.\n- It disappears when you sign out of Studio. If you see it but Studio asks you to sign in again, your session simply expired — sign in and carry on.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Publishing a change — the Save → Checks → Publish → Live journey and its exits. */\nexport const PUBLISHING: HelpArticle[] = [\n {\n id: \"save-checks-publish-live\",\n section: \"publishing\",\n title: \"Save, Checks, Publish, Live — the journey\",\n summary: \"What happens at each step, how long it takes, and why there are four of them.\",\n keywords: [\"pull request\", \"change\", \"PR\", \"build\", \"deploy\", \"how long\"],\n body: `\n## Save\n\nYou press **Save**. Studio writes your item as a file and opens a **change** — GitHub calls this a pull request. Think of it as a draft handed in for checking. The live website hasn't changed.\n\n## Checks\n\nThe moment a change exists, the website builds a private test copy with your change in it. This catches the things that would break a page: a required field left empty, a picture that isn't there, a date that doesn't exist. It usually takes one to two minutes. The change page shows a tracker and refreshes itself — you can leave and come back.\n\n## Publish\n\nWhen the checks pass, the status becomes **Ready to publish** and the **Publish** button unlocks. **Preview the change** appears too: a private copy of the real website with your edit in it, so you see exactly how it will look. Pressing **Publish** sends the change to the live site.\n\n## Live\n\nThe website rebuilds itself with your change — about two minutes. The **Live** step keeps spinning until that's really done, then **View live** unlocks. If you look at the website before Live turns green you'll still see the old version. That's normal.\n\n## Why four steps\n\nBecause it means a broken page can never reach a visitor. Everything you publish has already been built once, successfully, with your change in it.\n`,\n },\n {\n id: \"preview-a-change\",\n section: \"publishing\",\n title: \"Previewing before you publish\",\n summary: \"See your edit on the real site design, privately, before anyone else can.\",\n keywords: [\"preview\", \"test copy\", \"private link\"],\n body: `\n## What it is\n\nAfter checks pass, the change page shows **Preview the change**. It opens a private copy of the website — same design, same everything — with your edit in it.\n\n## Why you'd use it\n\nPictures, long titles and tables can look different on the real page than in the editor. Check on your phone as well; most visitors are on one.\n\n## Where it goes\n\nThe preview link is private to the change. It isn't on the live website and won't be found by Google. It disappears once the change is published or discarded.\n\n## Notes\n\n- Editing again after previewing? Save, wait for the new checks, preview again.\n- New pictures show in the preview exactly as they'll go live.\n`,\n },\n {\n id: \"publish-a-change\",\n section: \"publishing\",\n title: \"Publishing\",\n summary: \"Press Publish once checks pass; wait for Live to turn green.\",\n keywords: [\"publish\", \"go live\", \"merge\"],\n body: `\n1. Open the change — from the item's **Status** link, the notice at the top of the item, or the dashboard.\n2. The tracker should show **Checks** green and the status **Ready to publish**.\n3. Press **Publish**.\n4. Wait for **Live** to turn green (about two minutes). **View live** unlocks the moment the website has rebuilt.\n\n## Who can publish\n\nEditors and owners. Every publish is recorded with your name, so it's always clear who changed what.\n\n## If Publish is disabled\n\nChecks haven't passed yet (wait), or failed (fix and save again). The button never unlocks on a failing change.\n`,\n },\n {\n id: \"needs-fixing\",\n section: \"publishing\",\n title: \"When a change 'needs fixing'\",\n summary: \"The test build failed. Nothing was published. Fix the named problem and save again.\",\n keywords: [\"failed\", \"error\", \"red\", \"checks failed\", \"broken\"],\n body: `\n## What happened\n\nThe website was rebuilt with your change and something broke. The live site is untouched — it still shows the last good version.\n\n## What to do\n\n1. Open the item. The message at the top names the problem — most often a required field, a picture path, or a date/time that isn't valid.\n2. Fix it and press **Save**. The **same change** re-runs its checks; you don't get a second one.\n3. When the status flips to **Ready to publish**, publish as usual.\n\n## If the message doesn't make sense\n\nPress **Discard this change** to throw the edit away and start over, or send the message to {supportName}. Copy the whole line — the exact words matter.\n`,\n },\n {\n id: \"discard-a-change\",\n section: \"publishing\",\n title: \"Discarding a change\",\n summary: \"Throw away unpublished edits. The live site is never touched.\",\n keywords: [\"undo\", \"cancel\", \"throw away\", \"revert\", \"discard\"],\n body: `\n## What it does\n\nDeletes the waiting change and everything in it — the edited text and any new pictures. The item goes back to **Live** exactly as it was.\n\n## How\n\nOn the change page, scroll down to **Discard this change**. Confirm. Done.\n\n## When you'd use it\n\n- You changed your mind.\n- Checks failed and starting fresh is easier than fixing.\n- You saved the wrong item by accident.\n\nDiscarding is only for unpublished work. Something that's already live is edited by saving a new change on top of it.\n`,\n },\n {\n id: \"remove-an-item\",\n section: \"publishing\",\n title: \"Removing an item from the website\",\n summary: \"Take a post or event down — through the same checked, publishable change.\",\n keywords: [\"delete\", \"unpublish\", \"take down\", \"remove\"],\n body: `\n## What it is\n\nRemoving takes an item off the website. Like every edit, it travels as a change: **Removing…**, then **Removal ready**, then you **Publish** the removal.\n\n## How\n\n1. Open the item.\n2. At the bottom, press **Remove this post from the website** (for other kinds the link names them — \"Remove this event…\") and confirm with **Yes, remove it**.\n3. Publish the removal from the change page when it's ready. **Cancel this removal** on that page keeps the item.\n\n## Good to know\n\n- Until you publish, the item is still live. Discarding the change keeps it.\n- Every version is kept in the repository, so {supportName} can bring a removed item back if you ever need it.\n- Pictures that belonged only to that item go with it.\n`,\n },\n {\n id: \"two-people-editing\",\n section: \"publishing\",\n title: \"Two people editing the same item\",\n summary: \"The second to publish is told the file changed first. Nothing is silently overwritten.\",\n keywords: [\"conflict\", \"overwrite\", \"team\", \"collision\"],\n body: `\n## What happens\n\nIf someone published a change to an item after you opened it, your publish is refused with a note that the file changed first. Your edit isn't lost — it's still in your change.\n\n## What to do\n\nOpen the item fresh (it now shows the newest version), make your edit again, save, and publish.\n\n## Avoiding it\n\nOne item, one change at a time is the rule Studio enforces. If several people write, agree who owns which items, or finish one change before starting the next.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Blog posts — every field, in the order the form shows them. */\nexport const BLOG: HelpArticle[] = [\n {\n id: \"new-post\",\n section: \"blog\",\n title: \"Writing a new blog post\",\n summary: \"Title, web address, excerpt, date, tags, a header picture, the article — then Save and continue.\",\n keywords: [\"new post\", \"article\", \"write\", \"create post\"],\n body: `\n1. Sidebar → **Blog posts** → **+ New post**.\n2. Type the **Title**. The **Web address** fills itself from it — fine to leave.\n3. Write the **Excerpt** (the teaser on the blog page), check the **Publish date**, add exactly three **Tags**.\n4. Drop in a **Header image** and describe it in **Header image description**. A post needs a header picture before it can go live.\n5. Write the article in **Post content** — see *Writing in Markdown*.\n6. Open **Search & social** and fill **Meta description** at least.\n7. Press **Save and continue**, wait for the checks, preview, **Publish**.\n\n## Where it goes\n\nThe post appears on the blog index, in the RSS feed and in the sitemap automatically, at yoursite.com/blog/your-web-address.\n\n## Tips\n\n- Write the post first, polish the search fields last.\n- Sort the picture before you start — it's the step most likely to hold you up.\n- Saving early is fine: you can keep editing and saving onto the same change until you publish.\n`,\n },\n {\n id: \"post-fields\",\n section: \"blog\",\n title: \"Every field on a blog post\",\n summary: \"What each field does, where it shows up, and what a good one looks like.\",\n keywords: [\"fields\", \"title\", \"slug\", \"excerpt\", \"tags\", \"author\", \"featured\", \"publish date\", \"last updated\"],\n body: `\n## Title (H1)\n\nThe headline at the top of the post and the text of links to it. Say what the reader gets. Length isn't limited, but 50–70 characters reads best in lists.\n\n## Web address (slug)\n\nThe last part of the post's link: my-first-post → yoursite.com/blog/my-first-post. Lowercase words joined by hyphens, no spaces. It fills itself from the title; shorten it if the title is long. Changing it after publishing changes the link — old links break — so settle it before the first publish.\n\n## Excerpt\n\nThe one- or two-sentence teaser shown on the blog index under the title. Not the first paragraph again; a reason to click.\n\n## Publish date / Last updated\n\nShown on the post and used to order the list. **Last updated** is optional — set it when you revise a published post and readers see \"Updated …\".\n\n## Author\n\nHow you're credited. Fills from your profile's \"Name on blog posts\" (Settings → My Profile).\n\n## Tags\n\nExactly three, lowercase, hyphens between words (small-business, ai-tools). Type one and press Enter or a comma. Tags group related posts and drive the \"related posts\" links.\n\n## Header image / Header image description\n\nThe picture at the top of the post and on cards. The description is the alt text — say what's in the picture for readers who can't see it. See *Pictures*.\n\n## Featured post\n\nPins the post to the top of the blog index. One or two at a time is plenty.\n\n## Post content\n\nThe article itself, in Markdown. See *Writing in Markdown*.\n`,\n },\n {\n id: \"search-and-social\",\n section: \"blog\",\n title: \"The Search & social fields\",\n summary: \"Search title, meta description, focus keyword, social image, canonical — what Google and social cards see.\",\n keywords: [\"seo\", \"meta description\", \"search title\", \"focus keyword\", \"canonical\", \"og image\", \"social share\", \"google\"],\n body: `\nThese sit in their own group under the main fields. Readers never see them on the page — search engines and social networks do.\n\n## Search title\n\nWhat Google shows as the blue link and what the browser tab says. Aim for 50–60 characters including your site name. Blank means the Title is used. The gauge under the field turns green inside the target range.\n\n## Meta description\n\nThe gray snippet under the link in Google results. 120–155 characters: what the post covers and why to read it. Google may write its own, but a good one usually wins.\n\n## Focus keyword\n\nThe single phrase this post should rank for (\"small business ai audit\"). Never shown; used for reporting. One per post.\n\n## Social share image\n\nThe picture shown when the link is shared on LinkedIn, Facebook or in messages. 1200 × 630 works everywhere. Blank reuses the header image — usually fine.\n\n## Canonical URL\n\nAdvanced. Only if the same article was published somewhere else first (LinkedIn, Medium): paste that original link so Google credits it and doesn't treat yours as a copy. Otherwise leave blank.\n`,\n },\n {\n id: \"edit-a-post\",\n section: \"blog\",\n title: \"Editing a published post\",\n summary: \"Open it, change it, save — the live version stays up until you publish the change.\",\n keywords: [\"edit\", \"update\", \"revise\", \"change post\"],\n body: `\n1. Sidebar → **Blog posts** → click the title.\n2. Existing posts open in **Preview** so you can read first; click **Edit Markdown** to change the text.\n3. Make your edits. Consider setting **Last updated** to today.\n4. Press **Save changes**, wait for checks, preview, **Publish**.\n\n## Good to know\n\n- If a change is already waiting for this post, a notice at the top says so and links to it. Saving updates that change.\n- Renaming the **Web address** breaks old links. If you must, ask {supportName} to add a redirect.\n- Nothing you do here changes the live post until you press Publish.\n`,\n },\n {\n id: \"post-tips\",\n section: \"blog\",\n title: \"Writing posts that work\",\n summary: \"Structure, length, headings, links — what makes a post readable and findable.\",\n keywords: [\"tips\", \"writing\", \"structure\", \"length\", \"headings\"],\n body: `\n- **One idea per post.** If you have two, write two posts and link them.\n- **Say the answer early.** The first paragraph should tell a hurried reader what they'll learn.\n- **Use section headings** every 200–300 words. Readers scan; Google reads headings too.\n- **Short paragraphs.** Two to four sentences. Phones make long paragraphs a wall.\n- **Link to your own pages** where it helps (\"we explain this on our services page\") and to sources you quote.\n- **800–1,500 words** suits most topics. Shorter is fine if it's complete; longer is fine if it earns it.\n- **Pictures with alt text**, one near the top and one wherever a picture explains faster than words.\n- **Finish with a next step**: a related post, a contact page, a question to think about.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Pictures — sourcing, sizing, dropping in, and what Studio does with them. */\nexport const PICTURES: HelpArticle[] = [\n {\n id: \"where-pictures-come-from\",\n section: \"pictures\",\n title: \"Getting a picture to use\",\n summary: \"Your phone, a stock library, Canva, or an AI image tool — make it outside Studio, then drop it in.\",\n keywords: [\"stock photo\", \"canva\", \"ai image\", \"unsplash\", \"photo\", \"camera\", \"create image\"],\n body: `\nStudio doesn't make pictures; it takes the ones you give it. Four good sources:\n\n## Your phone\n\nReal photos of your work, your team, your space beat stock every time. Landscape (wider than tall) suits headers. Wipe the lens.\n\n## A stock library\n\nUnsplash, Pexels and Pixabay are free for commercial use. Search a feeling, not an object (\"focused workshop\" beats \"laptop\"). Download the large size.\n\n## Canva (or similar)\n\nFor header images with text on them and for social share images. Start from a 1200 × 630 template for social, 1600 × 900 for headers. Export as JPG or PNG.\n\n## An AI image tool\n\nChatGPT, Midjourney and the rest can make a fitting illustration in a minute. Describe the scene, the mood and \"no text\" (AI text is usually garbled). Download the largest version offered.\n\n## Then\n\nSave it to your computer and drop it onto the picture field in Studio — see *Adding a picture to a post or event*. Studio handles the resizing.\n\n## Rights\n\nOnly use pictures you took, bought, generated, or that are licensed for commercial use. When in doubt, ask {supportName}.\n`,\n },\n {\n id: \"add-a-picture\",\n section: \"pictures\",\n title: \"Adding a picture to a post or event\",\n summary: \"Drop, choose or paste. It's shrunk in your browser and saved with the item when you press Save.\",\n keywords: [\"upload\", \"header image\", \"hero\", \"drop zone\", \"drag\", \"paste image\"],\n body: `\n## The picture fields\n\n**Header image** (the big one at the top) and **Social share image** (for link previews) are drop zones. Drag a file onto one, click it to choose a file, or click it and paste (Cmd/Ctrl+V) a copied image.\n\n## Pictures inside the text\n\nIn **Post content**, put the cursor where the picture goes and press the toolbar's **Image** button, then choose the file. A line like \\`\\` is inserted — edit the description in the square brackets to say what's in the picture.\n\n## What happens next\n\n- Nothing is uploaded when you pick. The picture travels with the item when you press **Save**, into the same change, and goes live when you **Publish**. Discarding the change discards its pictures too.\n- Your browser shrinks the picture first (about 1600 pixels wide, WebP format, usually 100–400 KB), so pages stay fast. Accepted: JPG, PNG or WebP up to 10 MB.\n- Pictures are named after the item's **Web address**, so fill that in first. The header image becomes /blog/your-post.webp; pictures in the text go under /blog/your-post/.\n\n## Removing or replacing\n\nDrop a new picture on the field to replace it, or use the field's **Remove** to clear it. The change goes live with the next Publish.\n`,\n },\n {\n id: \"picture-sizes\",\n section: \"pictures\",\n title: \"Sizes and shapes that work\",\n summary: \"Landscape for headers, 1200 × 630 for social, square for logos and avatars.\",\n keywords: [\"size\", \"dimensions\", \"aspect ratio\", \"resolution\", \"1200x630\", \"square\"],\n body: `\n| Use | Best shape | Minimum |\n| --- | --- | --- |\n| Header image | Landscape, about 16:9 | 1600 pixels wide |\n| Social share image | 1.91:1 (1200 × 630) | 1200 × 630 |\n| Picture in the text | Any; landscape reads best | 1200 pixels wide |\n| Profile photo | Square, face centered | 400 × 400 |\n| Business logo | Square or wide, on a plain background | 400 pixels on the short side |\n| Favicon (browser-tab icon) | Square, simple shape | 256 × 256 |\n\n## Why these\n\nBigger than needed is fine — Studio shrinks. Smaller than needed looks soft on large screens and can't be fixed later. Text on a header image gets cropped on phones; keep it near the center.\n\n## File size\n\nDon't worry about it. Studio converts everything to WebP at web size. The 10 MB limit is per original file.\n`,\n },\n {\n id: \"alt-text\",\n section: \"pictures\",\n title: \"Picture descriptions (alt text)\",\n summary: \"One sentence saying what's in the picture — for screen readers and for Google.\",\n keywords: [\"alt text\", \"accessibility\", \"description\", \"screen reader\"],\n body: `\n## What it is\n\nEvery picture has a short text description that's read aloud to visitors who use a screen reader and shown if the picture can't load. Google reads it too.\n\n## Where it goes\n\nThe **Header image description** field, and the words in square brackets for pictures in the text: \\`\\`.\n\n## How to write one\n\nSay what's in the picture as if describing it over the phone. \"Two people reviewing a report at a kitchen table\" — not \"image\" or \"photo123\" and not a list of keywords. Decorative pictures can have a short description; pictures that carry information need a full one.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Writing in Markdown — the editor, the toolbar, and the syntax it produces. */\nexport const MARKDOWN: HelpArticle[] = [\n {\n id: \"the-editor\",\n section: \"markdown\",\n title: \"The content editor\",\n summary: \"Edit Markdown or Preview, one toolbar row, Expand for a full window.\",\n keywords: [\"editor\", \"toolbar\", \"preview\", \"expand\", \"fullscreen\"],\n body: `\n## Two tabs\n\n**Edit Markdown** is where you type. **Preview** shows exactly how the website will render it — same fonts, same spacing. An existing item opens in Preview so you can read first; a blank one opens in Edit.\n\n## The toolbar\n\nButtons work on your selection and toggle on and off. Left to right: **Bold**, **Italic** · **Section heading**, **Sub-heading**, **Bulleted list**, **Numbered list**, **Quote** · **Link**, **Inline code** · Insert: **Image**, **Separator (·)**, **Divider line**. When the cursor is inside a table, row and column buttons appear.\n\nHover a button for its name and shortcut. **Bold** is Cmd/Ctrl+B, **Italic** is Cmd/Ctrl+I.\n\n## Expand\n\nThe arrows button at the right of the toolbar fills the window with the editor. Press **Esc** or the button again to come back.\n\n## Why Markdown\n\nIt's plain text with a few marks — no hidden formatting to fight, it never breaks, and it reads fine even raw. You'll learn all of it in ten minutes; the toolbar does the typing for you anyway.\n`,\n },\n {\n id: \"markdown-basics\",\n section: \"markdown\",\n title: \"Markdown in ten minutes\",\n summary: \"Paragraphs, headings, bold and italic, lists, links, quotes.\",\n keywords: [\"markdown\", \"syntax\", \"formatting\", \"bold\", \"italic\", \"heading\", \"list\", \"link\", \"quote\"],\n body: `\n## Paragraphs\n\nJust type. Leave a blank line between paragraphs. A single line break inside a paragraph is ignored, so don't press Enter to wrap lines.\n\n## Headings\n\n\\`\\`\\`\n## A section heading\n### A smaller sub-heading\n\\`\\`\\`\n\nUse \\`##\\` for the sections of your post and \\`###\\` under them. The title of the post is already the top heading, so never use a single \\`#\\`.\n\n## Bold and italic\n\n\\`\\`\\`\n**bold** _italic_ **_both_**\n\\`\\`\\`\n\n## Lists\n\n\\`\\`\\`\n- first point\n- second point\n - a point under it (indent two spaces)\n\n1. first step\n2. second step\n\\`\\`\\`\n\nLeave a blank line before a list.\n\n## Links\n\n\\`\\`\\`\n[the words people click](https://example.com)\n[our services page](/services)\n\\`\\`\\`\n\nSelect words and press the **Link** button; it wraps them and puts the cursor where the address goes.\n\n## Quotes\n\n\\`\\`\\`\n> Something someone said, or a callout worth setting apart.\n\\`\\`\\`\n\n## Small touches\n\n\\`\\`\\`\nSome \\`code\\` or a product name in a fixed-width font\n--- (a divider line across the page)\nDate · Place (the · separator, from the Insert menu)\n\\`\\`\\`\n`,\n },\n {\n id: \"markdown-tables\",\n section: \"markdown\",\n title: \"Tables\",\n summary: \"Pipes and dashes; the toolbar adds rows and columns when you're inside one.\",\n keywords: [\"table\", \"grid\", \"columns\", \"rows\"],\n body: `\n## The shape\n\n\\`\\`\\`\n| Plan | Price | Best for |\n| --- | --- | --- |\n| Starter | $20/mo | One person |\n| Team | $60/mo | Up to five |\n\\`\\`\\`\n\nThe first line is the header row; the line of dashes is required; every row has the same number of \\`|\\` separators. Spacing inside the cells doesn't matter — Preview lines everything up.\n\n## Editing\n\nPut the cursor anywhere in a table and the toolbar shows **+ Row**, **− Row**, **+ Col**, **− Col**. They act on the row or column the cursor is in.\n\n## Good to know\n\n- Keep cells short. Long text wraps and the table gets tall on phones.\n- Bold and links work inside cells; lists and headings don't.\n- Three columns is comfortable on a phone; five is the practical limit.\n`,\n },\n {\n id: \"markdown-images\",\n section: \"markdown\",\n title: \"Pictures inside the text\",\n summary: \"The Image button inserts one; the square brackets hold the description.\",\n keywords: [\"inline image\", \"image in post\", \"figure\"],\n body: `\n## Insert\n\nPut the cursor on its own blank line where the picture should appear and press the **Image** button in the toolbar. Choose the file. Studio inserts:\n\n\\`\\`\\`\n\n\\`\\`\\`\n\nReplace the words in the square brackets with a real description (see *Picture descriptions*). Leave the address alone — it's where the picture will live once published.\n\n## Placement\n\nA picture on its own line spans the text column. Put one near the top of a long post and then wherever a picture explains faster than words. Don't put text on the same line as the picture.\n\n## Preview shows it\n\nEven before you save, **Preview** shows the new picture in place. After checks, **Preview the change** shows it on the real page.\n`,\n },\n {\n id: \"markdown-gotchas\",\n section: \"markdown\",\n title: \"Things that trip people up\",\n summary: \"Blank lines, pasted formatting, straight quotes, and where headings start.\",\n keywords: [\"problem\", \"not rendering\", \"paste from word\", \"weird formatting\"],\n body: `\n- **My list runs into the paragraph above.** Leave a blank line before the list.\n- **My heading shows a # sign.** Put a space after the hashes: \\`## Heading\\`, not \\`##Heading\\`.\n- **Pasting from Word or Google Docs** brings hidden formatting. Paste, then check Preview; if it looks odd, paste again as plain text (Cmd/Ctrl+Shift+V) and add headings with the toolbar.\n- **A link doesn't work.** The address must start with https:// (or / for a page on your own site). No spaces inside the parentheses.\n- **Two line breaks in a row but no gap.** That's a blank line — it starts a new paragraph. To force a gap without text, a divider line \\`---\\` is the honest choice.\n- **Emoji and special characters** are fine. Just type them.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Events — dated items: the core fields, and the optional groups a site may have switched on. */\nexport const EVENTS: HelpArticle[] = [\n {\n id: \"new-event\",\n section: \"events\",\n title: \"Adding an event\",\n summary: \"Title, what kind, date and times, where, a link — save, check, publish. Upcoming first on the site.\",\n keywords: [\"new event\", \"add event\", \"calendar\", \"appearance\", \"talk\", \"show\", \"workshop\"],\n body: `\nEvents are anything with a date: a workshop, a show, a talk, a podcast appearance, an open house. If {siteName} has an events section it appears in the sidebar under its own name.\n\n1. Sidebar → the events list → **+ New**.\n2. **Title**, then check the **Web address** it suggests.\n3. **One-line summary** — what it is and who it's for. Shown in the list.\n4. **What kind of event**. Pick from the list, or choose **Other** and type a **Custom kind** (\"Co-Keynote\", \"Wedding\", \"Pop-up\").\n5. **Date**, then **Start** and **End** times if it isn't all-day. Set **Time zone** only if the event isn't in the site's home zone.\n6. **Where** — an address, a room, or \"Online\".\n7. **Link for details** — the event's own page, if it has one (tickets, the venue, a livestream).\n8. A **Picture** and its description if you have one.\n9. Write the long description below, press **Save and continue**, wait for checks, preview, **Publish**.\n\n## Where it goes\n\nThe site's events page lists upcoming events first, then past ones. Each event has its own page at yoursite.com/…/your-web-address with the details and your description. Search engines get an Event listing automatically.\n`,\n },\n {\n id: \"event-fields\",\n section: \"events\",\n title: \"Every field on an event\",\n summary: \"Kind and custom kind, date, times, time zone, where, link, pictures.\",\n keywords: [\"fields\", \"kind\", \"custom kind\", \"date\", \"start time\", \"end time\", \"time zone\", \"location\"],\n body: `\n## Title / Web address / One-line summary\n\nSame as a blog post: the name, the link, the teaser. Keep the summary to one or two sentences — it's shown in the list and to search engines.\n\n## What kind of event / Custom kind\n\nThe kind is the small label on the event (Workshop, Talk, Podcast…). The list is set for your site. If yours isn't on it, choose **Other** and type your own in **Custom kind** — it's shown exactly as you type it.\n\n## Date\n\nThe day, picked from the calendar. Must be a real date.\n\n## Start / End\n\n24-hour times, e.g. 14:00 to 15:00. Leave both empty for an all-day event. End must be after Start.\n\n## Time zone\n\nLeave empty and the site's home zone is used. Set it when the event happens somewhere else — a talk in Denver for a New York site. Visitors see the time in the event's zone with its name, so nobody shows up an hour off.\n\n## Where\n\nFree text: an address, \"Studio B\", or \"Online\". Anything with the word \"online\" is marked as an online event for search engines.\n\n## Link for details\n\nThe event's own web page. Shown as **Event website** on the event page. Not the same as an RSVP link (see *Tickets, venue and appearance fields*).\n\n## Picture / Picture description / Social share image\n\nAs for blog posts. See *Pictures*.\n\n## Canceled, Cancellation note, Moved to, Previous date\n\nFor when plans change. See *When an event is canceled or moves*.\n`,\n },\n {\n id: \"event-changes\",\n section: \"events\",\n title: \"When an event is canceled or moves\",\n summary: \"Keep it listed and say so — don't delete it. Two fields each for canceled and moved.\",\n keywords: [\"canceled\", \"cancelled\", \"postponed\", \"rescheduled\", \"moved\", \"new date\"],\n body: `\nPeople who saw the original listing will come back to it. A vanished event tells them nothing; a marked one tells them everything.\n\n## Canceled\n\nTick **Canceled** and, optionally, write a **Cancellation note** (\"Postponed — new date coming soon\"). The event stays in the list with a Canceled label and a line through the title; its page says the same. Any RSVP button is hidden.\n\n## Moved to a new date\n\n1. Create the event again with the new date — a new item with its own web address.\n2. On the **old** event, set **Moved to** to the new event's web address, and **Previous date** if you want the new one to say when it was originally planned.\n\nThe old listing shows \"Rescheduled\" with a link to the new date. The new one is a normal upcoming event.\n\n## Why not just edit the date?\n\nYou can, for small corrections. But once people have shared the link or put it in a calendar, a visible \"moved\" trail avoids no-shows on the wrong day.\n\n## After it's over\n\nNothing to do. Past events move to the **Past** section automatically the day after they end.\n`,\n },\n {\n id: \"event-extras\",\n section: \"events\",\n title: \"Tickets, venue and appearance fields\",\n summary: \"Extra groups a site may have switched on: RSVP and capacity, a named venue, host and recording links.\",\n keywords: [\"rsvp\", \"tickets\", \"capacity\", \"private event\", \"sign-ups closed\", \"venue\", \"host\", \"recording\", \"slides\"],\n body: `\nSome sites need more than the core fields. {supportName} switches these groups on per site; if you don't see them, your site doesn't use them.\n\n## Tickets & RSVP\n\n- **RSVP or ticket link** — where people sign up or buy. Shown as a prominent **RSVP** button until the event starts.\n- **Capacity** — the number of places, for your reference and for search engines.\n- **Sign-ups closed** — keeps the event listed but replaces the RSVP button with \"Sign-ups are closed.\"\n- **Private event** — listed with a Private label, no RSVP button, \"Invited guests only.\" Use it for events you want on the calendar but not open to the public.\n\n## Venue\n\n- **Venue** — the named place (\"The Grand Hall\"). **Where** then holds extra directions or the room.\n\n## Appearance details\n\nFor talks, podcasts and interviews you take part in rather than host:\n\n- **Hosted or published by** — the conference, the podcast, the organization.\n- **Recording link** — added afterward; past events then show **Watch or listen**.\n- **Slides link** — if you share them.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Account & team — Settings: My Profile · Change Password · Team · Business. */\nexport const ACCOUNT: HelpArticle[] = [\n {\n id: \"my-profile\",\n section: \"account\",\n title: \"My Profile: your name, your photo, your byline\",\n summary: \"Full name for the greeting, a separate name for blog posts, and a profile photo.\",\n keywords: [\"profile\", \"name\", \"photo\", \"avatar\", \"byline\", \"author name\", \"email\"],\n body: `\n**Settings** (sidebar, or avatar menu → **Account**) → **My Profile**.\n\n## Full name\n\nHow you're greeted in Studio and how teammates see you in the Team tab.\n\n## Name on blog posts\n\nHow you're credited as the author of a post — \"Jane Doe\" or \"The {siteName} team\". Leave blank to use your full name. New posts pick this up in their **Author** field.\n\n## Your photo\n\nUnder **Avatar**, **Choose a picture** (or drop one on it). Square works best; it's shrunk automatically. **Replace** or **Remove** any time. It shows in the top bar and the avatar menu — never on the public website.\n\n## Email\n\nYour email is your login and can't be changed here. Ask {supportName} if it needs to change.\n\nPress **Save** after editing the name fields; pictures save the moment you choose them.\n`,\n },\n {\n id: \"change-password\",\n section: \"account\",\n title: \"Change Password\",\n summary: \"Optional. Email links always work; a password is a second way in.\",\n keywords: [\"password\", \"reset password\", \"forgot\"],\n body: `\n**Settings → Change Password**. Enter a **New password** twice. At least 10 characters — a short sentence you'll remember is ideal.\n\n## Using it\n\nOn the sign-in page, click **Have a password? Sign in with it instead** under the email form.\n\n## Forgot it?\n\nThere's nothing to reset. Sign in with an email link as usual, then set a new password here.\n\n## Do I need one?\n\nNo. Email links are the default and are safer for most people. A password helps if you sign in many times a day or from a device where checking email is awkward.\n`,\n },\n {\n id: \"team\",\n section: \"account\",\n title: \"Team: who can sign in\",\n summary: \"Invite by email, choose owner or editor, resend or revoke, remove. Owners only.\",\n keywords: [\"invite\", \"team\", \"editor\", \"owner\", \"roles\", \"remove user\", \"resend invite\", \"revoke\"],\n body: `\n**Settings → Team** — visible to owners.\n\n## Inviting someone\n\nPress **Invite someone**, enter their email, choose a **Role**, send. They get an email with a sign-in link — no password to set up. Until they click it, they're listed as pending; **Resend** sends the email again, **Revoke** withdraws it.\n\n## Roles\n\n- **Editor** — writes, edits, publishes and removes content. Can't manage the team or the business details.\n- **Owner** — everything an editor can do, plus Team and Business. A site always keeps at least one owner.\n\n{supportName} can reach every site without being listed in its team.\n\n## Removing someone\n\n**Remove from this site** next to their name, then **Yes, remove**. They lose access to {siteName} only; anything they published stays. If they also work on another site, their login survives there.\n\n## If the Team tab says inviting isn't set up\n\nInvitations need one extra piece of configuration on the server. Ask {supportName} to switch it on; everything else in Studio works without it.\n`,\n },\n {\n id: \"business-branding\",\n section: \"account\",\n title: \"Business: your name and logo on Studio\",\n summary: \"Business name, contact details, logo and favicon. Changes Studio's header — never the public website.\",\n keywords: [\"branding\", \"logo\", \"favicon\", \"business name\", \"white label\"],\n body: `\n**Settings → Business** — visible to owners.\n\n## What it does\n\nPuts your own name and logo at the top of Studio for everyone who signs in to {siteName}. It does **not** change the public website; that's designed separately.\n\n## Fields\n\n- **Business name** — appears next to \"Studio\" at the top of the page.\n- **Business email / phone** — optional, for your team's reference.\n- **Logo** — shown in the top bar. Square or wide, on a plain background.\n- **Favicon** — the small browser-tab icon. Square, simple.\n\nPictures save the moment you choose them (**Choose a picture**, **Replace**, **Remove**); press **Save** for the text fields.\n\n## Where the pictures live\n\nIn Studio's own secure storage — not in your website's files, so they don't go through Save/Publish.\n`,\n },\n {\n id: \"updating-studio\",\n section: \"account\",\n title: \"Updating Studio\",\n summary: \"When a new version is out, owners see a strip with what's new, a preview and an Update button. Nothing installs until you press it.\",\n keywords: [\"update\", \"upgrade\", \"new version\", \"release\", \"what's new\", \"studio version\"],\n body: `\n## What it is\n\nStudio is a small package inside your website, and it improves over time. When {supportName} releases a new version, your website prepares the update automatically as a **checked change** — exactly like a blog post is checked before it goes live — and builds a private preview of your site with the new Studio in it.\n\n## Where you see it\n\n- A quiet strip at the top of every Studio page: **Studio 0.15 is available · What's new · Preview · Update · Later**. Only owners and {supportName} see it; editors don't.\n- **Settings → Studio**: the version you're running, the pending update with its notes, and the same Update button.\n\nThe strip appears only once the update's checks have passed. If they fail, nothing is offered — {supportName} sees the failure and fixes it.\n\n## How to update\n\n1. Read **What's new** (a few lines, plain English).\n2. Optional: press **Preview** to open your website running the new Studio.\n3. Press **Update**. The tracker shows *Updated → Live*; about two minutes later the website has rebuilt.\n4. Reload Studio to use the new version.\n\n## Good to know\n\n- **Later** hides the strip for this browser tab; it comes back next time.\n- Nothing on your public website changes because of a Studio update — only the dashboard does.\n- You can't skip a version or go back from here; if something looks wrong after an update, tell {supportName}.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Troubleshooting — symptom first, then meaning, then the fix. */\nexport const TROUBLE: HelpArticle[] = [\n {\n id: \"dont-see-my-change\",\n section: \"trouble\",\n title: \"I published, but the website still shows the old version\",\n summary: \"The site is still rebuilding, or your browser cached the page. Give it two minutes, then hard-refresh.\",\n keywords: [\"not showing\", \"old version\", \"cache\", \"refresh\", \"still old\"],\n body: `\n## Most likely\n\nThe **Live** step on the change page hasn't turned green yet. Publishing sends the change; the website then rebuilds itself, which takes about two minutes. Stay on the change page — it tells you the moment it's live and unlocks **View live**.\n\n## If Live is green and you still see the old page\n\nYour browser is showing a saved copy. Hard-refresh: **Cmd+Shift+R** on Mac, **Ctrl+Shift+R** on Windows. On a phone, open the page in a private/incognito tab.\n\n## If it's still old after that\n\nCheck the item's status in the list. **Live** with no change waiting means it's published. If a change is still listed as waiting, open it and look at the tracker.\n`,\n },\n {\n id: \"checks-failed\",\n section: \"trouble\",\n title: \"Checks failed / Needs fixing\",\n summary: \"The test build broke. Read the message, fix that one thing, save again.\",\n keywords: [\"failed\", \"needs fixing\", \"build error\", \"red\"],\n body: `\n## What it means\n\nThe website was rebuilt with your change and something broke. Nothing was published; the live site is unchanged.\n\n## Common causes and fixes\n\n- **A required field is empty** — the form usually catches this, but a field can be emptied by a paste. Fill it in.\n- **A picture path points nowhere** — you edited the address inside \\`\\` by hand. Remove the picture line and insert it again with the toolbar.\n- **A date or time that doesn't exist** — 2026-02-30, or an end time before the start.\n- **Tags** — a post needs exactly three, lowercase with hyphens.\n\n## Then\n\nPress **Save**. The same change re-runs its checks. If it fails again with a message you can't act on, copy the whole message and send it to {supportName}.\n`,\n },\n {\n id: \"sign-in-link\",\n section: \"trouble\",\n title: \"The sign-in link didn't work\",\n summary: \"Links are single-use and expire. Request a new one and open it on the same device.\",\n keywords: [\"link expired\", \"invalid link\", \"can't sign in\", \"no email\"],\n body: `\n## Expired or already used\n\nEach link works once and only for a short while. Go back to **/admin**, request a new one, and click the newest email.\n\n## Open it on the same device\n\nThe link must be opened in the same browser that requested it. Requesting on your laptop and tapping the link on your phone won't sign the laptop in — request it on the device you want to use.\n\n## No email arrived\n\nCheck spam and promotions folders. Make sure you typed the address {supportName} invited — a different address, even your own, isn't allowed in. Still nothing after a few minutes? Ask {supportName} to resend the invitation.\n\n## \"You don't have access\"\n\nYour email is signed in but isn't on this site's team. An owner can add you under **Settings → Team**.\n`,\n },\n {\n id: \"picture-rejected\",\n section: \"trouble\",\n title: \"My picture was refused\",\n summary: \"Too large, the wrong type, or the item's web address wasn't set yet.\",\n keywords: [\"image error\", \"picture too large\", \"file type\", \"upload failed\"],\n body: `\n- **\"That picture is too large\"** — the original file is over 10 MB. Export a smaller version (most tools have a \"medium\" or \"web\" size) and try again.\n- **Wrong type** — only JPG, PNG and WebP. HEIC photos straight from an iPhone need converting: share the photo to yourself as JPG, or change the iPhone's camera format to \"Most compatible\".\n- **\"That image path isn't allowed\"** — the picture's address was edited by hand to somewhere outside the item's folder. Remove and re-insert it with the toolbar.\n- **The picture is named oddly** — pictures are named after the item's **Web address**. Set that first, then add pictures.\n- **\"That picture couldn't be prepared\"** — the file is damaged or not really an image. Open it on your computer to check, or export it again.\n`,\n },\n {\n id: \"two-changes\",\n section: \"trouble\",\n title: \"I can't start a change — one is already waiting\",\n summary: \"One change per item. Open the waiting one and finish it, or discard it.\",\n keywords: [\"already a change\", \"locked\", \"in progress\", \"can't edit\"],\n body: `\nEach item can have one change in progress. When you open an item that has one, a notice at the top says so and links to it.\n\n- To keep going with it: edit and **Save** — your edits go onto the same change.\n- To publish it: open the change and press **Publish**.\n- To throw it away: open the change and press **Discard this change**.\n\nIf a change was started by a teammate, the notice names them. Talk before discarding.\n`,\n },\n {\n id: \"something-else\",\n section: \"trouble\",\n title: \"Something else is wrong\",\n summary: \"Where to look, what to send, and how the Ask bubble can help.\",\n keywords: [\"support\", \"contact\", \"help\", \"bug\"],\n body: `\n1. **Ask the bubble** (bottom right, if your site has one). It knows everything in this Help center and can answer specific questions.\n2. **Search this Help center** with the box at the top — try the exact words from the message you saw.\n3. **Write to {supportName}** with: the page you were on, what you pressed, the exact message (copy it, don't retype), and the time it happened. A screenshot helps.\n\nNothing you do in Studio can damage the live website — every edit is checked before it goes live, and every version is kept. Worst case, {supportName} rolls back.\n`,\n },\n];\n","/**\n * The Help center's data: every article, the section order, placeholder\n * filling, in-browser search, and the plain-text export the Ask assistant reads.\n */\n\nimport { HELP_SECTIONS } from \"./sections\";\nimport { QUICK_START } from \"./quick-start\";\nimport { PUBLISHING } from \"./publishing\";\nimport { BLOG } from \"./blog\";\nimport { PICTURES } from \"./pictures\";\nimport { MARKDOWN } from \"./markdown\";\nimport { EVENTS } from \"./events\";\nimport { ACCOUNT } from \"./account\";\nimport { TROUBLE } from \"./trouble\";\nimport type { HelpArticle, HelpSection, HelpSectionId } from \"./types\";\n\nexport type { HelpArticle, HelpSection, HelpSectionId } from \"./types\";\nexport { HELP_SECTIONS } from \"./sections\";\n\nexport const HELP_ARTICLES: HelpArticle[] = [...QUICK_START, ...PUBLISHING, ...BLOG, ...PICTURES, ...MARKDOWN, ...EVENTS, ...ACCOUNT, ...TROUBLE];\n\nexport interface HelpVars {\n siteName: string;\n supportName: string;\n /** The site's content types in a sentence: \"Blog posts and Events\". */\n types: string;\n}\n\nexport const GENERIC_VARS: HelpVars = { siteName: \"your website\", supportName: \"your web team\", types: \"blog posts and events\" };\n\n/** \"Blog posts\", \"Blog posts and Events\", \"Blog posts, Events and Venues\". */\nexport function joinTypes(labels: string[]): string {\n if (labels.length === 0) return GENERIC_VARS.types;\n if (labels.length === 1) return labels[0];\n return `${labels.slice(0, -1).join(\", \")} and ${labels[labels.length - 1]}`;\n}\n\nexport function fillVars(text: string, vars: HelpVars): string {\n return text.replace(/\\{(siteName|supportName|types)\\}/g, (_, k: keyof HelpVars) => vars[k]);\n}\n\nexport function articlesIn(section: HelpSectionId): HelpArticle[] {\n return HELP_ARTICLES.filter((a) => a.section === section);\n}\n\nexport function sectionOf(article: HelpArticle): HelpSection {\n return HELP_SECTIONS.find((s) => s.id === article.section) ?? HELP_SECTIONS[0];\n}\n\nexport interface HelpHit {\n article: HelpArticle;\n score: number;\n /** A short run of body text around the first match, or the summary. */\n snippet: string;\n}\n\nconst strip = (md: string) => md.replace(/[#*_`>|\\\\-]+/g, \" \").replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, \"$1\").replace(/\\s+/g, \" \").trim();\n\n/**\n * Title matches outrank summary and keyword matches, which outrank body\n * matches; every query word must appear somewhere. Case-insensitive.\n */\nexport function searchHelp(query: string, articles: HelpArticle[] = HELP_ARTICLES): HelpHit[] {\n const words = query.toLowerCase().split(/\\s+/).filter((w) => w.length > 1);\n if (words.length === 0) return [];\n const hits: HelpHit[] = [];\n for (const a of articles) {\n const title = a.title.toLowerCase();\n const summary = a.summary.toLowerCase();\n const keys = (a.keywords ?? []).join(\" \").toLowerCase();\n const body = strip(a.body).toLowerCase();\n let score = 0;\n let ok = true;\n for (const w of words) {\n const inTitle = title.includes(w), inSum = summary.includes(w), inKey = keys.includes(w), inBody = body.includes(w);\n if (!inTitle && !inSum && !inKey && !inBody) { ok = false; break; }\n score += (inTitle ? 10 : 0) + (inSum ? 5 : 0) + (inKey ? 5 : 0) + (inBody ? 1 : 0);\n }\n if (!ok) continue;\n const plain = strip(a.body);\n const at = plain.toLowerCase().indexOf(words[0]);\n const snippet = at < 0 ? a.summary : `${at > 40 ? \"…\" : \"\"}${plain.slice(Math.max(0, at - 40), at + 120).trim()}…`;\n hits.push({ article: a, score, snippet });\n }\n return hits.sort((x, y) => y.score - x.score || x.article.title.localeCompare(y.article.title));\n}\n\n/** Every article as plain text, section by section — what STUDIO_FACTS carries to the assistant. */\nexport function helpAsText(vars: HelpVars = GENERIC_VARS): string {\n const parts: string[] = [];\n for (const s of HELP_SECTIONS) {\n parts.push(`\\n=== ${s.title.toUpperCase()} — ${s.blurb}`);\n for (const a of articlesIn(s.id)) {\n parts.push(`\\n## ${a.title}\\n${a.summary}\\n${fillVars(a.body.trim(), vars)}`);\n }\n }\n return parts.join(\"\\n\");\n}\n","/**\n * Plain-English facts about how Studio works — the text a site's help\n * assistant reads. The short overview below, then every Help center article\n * (helpAsText), so the assistant and the Help page can never disagree.\n * Generic: no site or agency names.\n */\n\nimport { helpAsText } from \"./help\";\n\nconst OVERVIEW = `\nHOW 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`;\n\nexport const STUDIO_FACTS = `${OVERVIEW}\n\nTHE HELP CENTER (every article, as shown at /admin/help):\n${helpAsText()}\n`;\n","/**\n * A small Markdown renderer for Help articles — the editor's own subset and\n * nothing more: ## / ### headings, paragraphs, - and 1. lists, > quotes,\n * fenced code, pipe tables, and inline **bold**, _italic_, `code`, [links](url).\n * No HTML passes through. Kept tiny on purpose; the blog has the real pipeline.\n */\n\nimport { Fragment, type ReactNode } from \"react\";\n\ntype Block =\n | { t: \"h2\" | \"h3\" | \"p\" | \"quote\"; text: string }\n | { t: \"ul\" | \"ol\"; items: string[] }\n | { t: \"code\"; text: string }\n | { t: \"table\"; head: string[]; rows: string[][] };\n\nconst cells = (line: string) => line.trim().replace(/^\\||\\|$/g, \"\").split(\"|\").map((c) => c.trim());\n\nexport function parseBlocks(md: string): Block[] {\n const lines = md.replace(/\\r/g, \"\").split(\"\\n\");\n const out: Block[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if (!line.trim()) { i++; continue; }\n if (line.startsWith(\"```\")) {\n const buf: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith(\"```\")) buf.push(lines[i++]);\n i++;\n out.push({ t: \"code\", text: buf.join(\"\\n\") });\n continue;\n }\n const h = /^(##|###)\\s+(.*)$/.exec(line);\n if (h) { out.push({ t: h[1] === \"##\" ? \"h2\" : \"h3\", text: h[2] }); i++; continue; }\n if (line.trim().startsWith(\"|\") && i + 1 < lines.length && /^\\s*\\|?\\s*:?-{3,}/.test(lines[i + 1])) {\n const head = cells(line);\n i += 2;\n const rows: string[][] = [];\n while (i < lines.length && lines[i].trim().startsWith(\"|\")) rows.push(cells(lines[i++]));\n out.push({ t: \"table\", head, rows });\n continue;\n }\n if (/^\\s*[-*]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*[-*]\\s+/.test(lines[i])) items.push(lines[i++].replace(/^\\s*[-*]\\s+/, \"\"));\n out.push({ t: \"ul\", items });\n continue;\n }\n if (/^\\s*\\d+[.)]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*\\d+[.)]\\s+/.test(lines[i])) items.push(lines[i++].replace(/^\\s*\\d+[.)]\\s+/, \"\"));\n out.push({ t: \"ol\", items });\n continue;\n }\n if (line.startsWith(\">\")) {\n const buf: string[] = [];\n while (i < lines.length && lines[i].startsWith(\">\")) buf.push(lines[i++].replace(/^>\\s?/, \"\"));\n out.push({ t: \"quote\", text: buf.join(\" \") });\n continue;\n }\n const buf: string[] = [];\n while (i < lines.length && lines[i].trim() && !/^(##|###)\\s|^```|^\\s*[-*]\\s|^\\s*\\d+[.)]\\s|^>|^\\s*\\|/.test(lines[i])) buf.push(lines[i++].trim());\n out.push({ t: \"p\", text: buf.join(\" \") });\n }\n return out;\n}\n\nconst INLINE = /(\\*\\*[^*]+\\*\\*|_[^_]+_|`[^`]+`|\\[[^\\]]+\\]\\([^)]+\\))/g;\n\nexport function inline(text: string): ReactNode {\n const parts = text.split(INLINE);\n return parts.map((p, i) => {\n if (!p) return null;\n if (p.startsWith(\"**\") && p.endsWith(\"**\")) return <strong key={i}>{inline(p.slice(2, -2))}</strong>;\n if (p.startsWith(\"_\") && p.endsWith(\"_\") && p.length > 2) return <em key={i}>{inline(p.slice(1, -1))}</em>;\n if (p.startsWith(\"`\") && p.endsWith(\"`\")) return <code key={i}>{p.slice(1, -1)}</code>;\n const link = /^\\[([^\\]]+)\\]\\(([^)]+)\\)$/.exec(p);\n if (link) {\n const ext = /^https?:\\/\\//.test(link[2]);\n return <a key={i} href={link[2]} target={ext ? \"_blank\" : undefined} rel={ext ? \"noreferrer\" : undefined}>{inline(link[1])}</a>;\n }\n return <Fragment key={i}>{p}</Fragment>;\n });\n}\n\nexport function renderHelpMarkdown(md: string): ReactNode {\n return parseBlocks(md).map((b, i) => {\n switch (b.t) {\n case \"h2\": return <h2 key={i}>{inline(b.text)}</h2>;\n case \"h3\": return <h3 key={i}>{inline(b.text)}</h3>;\n case \"p\": return <p key={i}>{inline(b.text)}</p>;\n case \"quote\": return <blockquote key={i}>{inline(b.text)}</blockquote>;\n case \"code\": return <pre key={i}><code>{b.text}</code></pre>;\n case \"ul\": return <ul key={i}>{b.items.map((it, j) => <li key={j}>{inline(it)}</li>)}</ul>;\n case \"ol\": return <ol key={i}>{b.items.map((it, j) => <li key={j}>{inline(it)}</li>)}</ol>;\n case \"table\":\n return (\n <div key={i} className=\"rz-table-wrap\">\n <table className=\"rz-table\">\n <thead><tr>{b.head.map((c, j) => <th key={j}>{inline(c)}</th>)}</tr></thead>\n <tbody>{b.rows.map((r, j) => <tr key={j}>{r.map((c, k) => <td key={k}>{inline(c)}</td>)}</tr>)}</tbody>\n </table>\n </div>\n );\n }\n });\n}\n","\"use client\";\n\n/**\n * The Help center page: a search box, the sections down the left, and either\n * search results, a section's article list, or one article. The open article\n * or section lives in the URL hash (#article-id / #s-section) so links can be\n * shared and Back works. Everything is in the browser — no network.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { ForwardArrow, PageHeader } from \"../../shell\";\nimport { useStudio } from \"../context\";\nimport { HELP_ARTICLES, HELP_SECTIONS, articlesIn, fillVars, joinTypes, searchHelp, sectionOf, type HelpArticle, type HelpSectionId } from \"./index\";\nimport { renderHelpMarkdown } from \"./md\";\n\ntype View = { kind: \"section\"; id: HelpSectionId } | { kind: \"article\"; article: HelpArticle };\n\nfunction viewFromHash(hash: string): View {\n const h = hash.replace(/^#/, \"\");\n if (h.startsWith(\"s-\")) {\n const id = h.slice(2) as HelpSectionId;\n if (HELP_SECTIONS.some((s) => s.id === id)) return { kind: \"section\", id };\n }\n const a = HELP_ARTICLES.find((x) => x.id === h);\n return a ? { kind: \"article\", article: a } : { kind: \"section\", id: \"start\" };\n}\n\nexport function StudioHelp() {\n const { contentTypes, siteName, supportName } = useStudio();\n const vars = useMemo(() => ({ siteName, supportName, types: joinTypes(Object.values(contentTypes).map((e) => e.label)) }), [contentTypes, siteName, supportName]);\n const [view, setView] = useState<View>({ kind: \"section\", id: \"start\" });\n const [q, setQ] = useState(\"\");\n const top = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sync = () => setView(viewFromHash(window.location.hash));\n sync();\n window.addEventListener(\"hashchange\", sync);\n return () => window.removeEventListener(\"hashchange\", sync);\n }, []);\n\n const go = (hash: string) => {\n setQ(\"\");\n setView(viewFromHash(hash)); // now; the hashchange below is for Back/Forward\n window.location.hash = hash;\n top.current?.scrollIntoView?.({ block: \"start\" });\n };\n\n const hits = q.trim().length > 1 ? searchHelp(q) : null;\n const activeSection = view.kind === \"section\" ? view.id : view.article.section;\n\n return (\n <div ref={top} className=\"rz-help\">\n <PageHeader eyebrow=\"Help\" title=\"Help center\" subtitle=\"Everything about running your website from Studio, in plain English. Search, or browse by section.\" />\n\n <div className=\"rz-help__search\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M20 20l-3.5-3.5\" /></svg>\n <input\n type=\"search\"\n className=\"realiiz-form__control\"\n placeholder=\"Search the help center — try “needs fixing” or “add a picture”\"\n aria-label=\"Search the help center\"\n value={q}\n onChange={(e) => setQ(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Escape\") setQ(\"\"); }}\n />\n </div>\n\n <div className=\"rz-help__body\">\n <nav className=\"rz-help__nav\" aria-label=\"Help sections\">\n {HELP_SECTIONS.map((s) => (\n <a key={s.id} href={`#s-${s.id}`} className={`rz-help__navitem${!hits && activeSection === s.id ? \" rz-help__navitem--active\" : \"\"}`} onClick={(e) => { e.preventDefault(); go(`s-${s.id}`); }}>\n {s.title}\n </a>\n ))}\n </nav>\n\n <div className=\"rz-help__main\">\n {hits ? (\n <Results hits={hits} q={q} onOpen={(a) => go(a.id)} />\n ) : view.kind === \"section\" ? (\n <SectionView id={view.id} onOpen={(a) => go(a.id)} />\n ) : (\n <ArticleView article={view.article} vars={vars} onOpen={(a) => go(a.id)} onSection={(id) => go(`s-${id}`)} />\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction Results({ hits, q, onOpen }: { hits: ReturnType<typeof searchHelp>; q: string; onOpen: (a: HelpArticle) => void }) {\n if (hits.length === 0) {\n return (\n <div className=\"rz-empty\">\n <h3>No articles match “{q}”</h3>\n <p style={{ margin: 0 }}>Try fewer words, or the exact words from the message you saw. The Ask bubble can also answer specific questions.</p>\n </div>\n );\n }\n return (\n <>\n <p className=\"rz-help__count\">{hits.length} {hits.length === 1 ? \"article\" : \"articles\"} for “{q}”</p>\n <ul className=\"rz-help__list\">\n {hits.map(({ article, snippet }) => (\n <li key={article.id}>\n <ArticleLink article={article} onOpen={onOpen} meta={sectionOf(article).title}>{snippet}</ArticleLink>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction SectionView({ id, onOpen }: { id: HelpSectionId; onOpen: (a: HelpArticle) => void }) {\n const s = HELP_SECTIONS.find((x) => x.id === id) ?? HELP_SECTIONS[0];\n return (\n <>\n <h2 className=\"rz-help__h\">{s.title}</h2>\n <p className=\"rz-help__blurb\">{s.blurb}</p>\n <ul className=\"rz-help__list\">\n {articlesIn(s.id).map((a) => (\n <li key={a.id}><ArticleLink article={a} onOpen={onOpen}>{a.summary}</ArticleLink></li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ArticleLink({ article, onOpen, meta, children }: { article: HelpArticle; onOpen: (a: HelpArticle) => void; meta?: string; children: ReactNode }) {\n return (\n <a href={`#${article.id}`} className=\"rz-help__card\" onClick={(e) => { e.preventDefault(); onOpen(article); }}>\n {meta && <span className=\"rz-help__meta\">{meta}</span>}\n <span className=\"rz-help__title\">{article.title}</span>\n <span className=\"rz-help__summary\">{children}</span>\n </a>\n );\n}\n\nfunction ArticleView({ article, vars, onOpen, onSection }: { article: HelpArticle; vars: Parameters<typeof fillVars>[1]; onOpen: (a: HelpArticle) => void; onSection: (id: HelpSectionId) => void }) {\n const section = sectionOf(article);\n const siblings = articlesIn(article.section);\n const i = siblings.findIndex((a) => a.id === article.id);\n const prev = siblings[i - 1], next = siblings[i + 1];\n return (\n <article className=\"rz-help__article\">\n <a href={`#s-${section.id}`} className=\"rz-help__crumb\" onClick={(e) => { e.preventDefault(); onSection(section.id); }}><BackArrow /> {section.title}</a>\n <h2 className=\"rz-help__h\">{article.title}</h2>\n <p className=\"rz-help__blurb\">{fillVars(article.summary, vars)}</p>\n <div className=\"rz-help__prose\">{renderHelpMarkdown(fillVars(article.body, vars))}</div>\n <div className=\"rz-help__pager\">\n {prev ? <a href={`#${prev.id}`} onClick={(e) => { e.preventDefault(); onOpen(prev); }}><BackArrow /> {prev.title}</a> : <span />}\n {next ? <a href={`#${next.id}`} onClick={(e) => { e.preventDefault(); onOpen(next); }}>{next.title} <ForwardArrow /></a> : <span />}\n </div>\n </article>\n );\n}\n\n/** The shell's forward arrow, mirrored — for \"back to the section\" and \"previous article\". */\nfunction BackArrow() {\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--back\">\n <path d=\"M19 12H5\" /><path d=\"m11 18-6-6 6-6\" />\n </svg>\n );\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/** The pending Studio update, as Studio.readers.studioUpdate() returns it (serialisable). */\nexport interface StudioUpdate {\n number: number;\n htmlUrl: string;\n version: string;\n currentVersion: string;\n state: \"checking\" | \"ready\" | \"failed\";\n failingCheck: string | null;\n previewUrl: string | null;\n notes: string | null;\n}\n\n/** Exactly what a site's \"use server\" wrapper file must export. */\nexport interface StudioActions {\n updateStudio: (number: number) => Promise<MergeOutcome>;\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 \"updateStudio\", \"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/Button.tsx","../../src/shell/ThemeToggle.tsx","../../src/shell/AccountMenu.tsx","../../src/shell/TopBar.tsx","../../src/shell/tokens.ts","../../src/shell/AdminShell.tsx","../../src/shell/primitives.tsx","../../src/shell/Tabs.tsx","../../src/version.ts","../../src/studio-ui/css.ts","../../src/studio-ui/useDeployed.ts","../../src/studio-ui/UpdateStrip.tsx","../../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/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/StudioTab.tsx","../../src/studio-ui/account/AccountTabs.tsx","../../src/studio-ui/account/StudioAccount.tsx","../../src/studio-ui/help/sections.ts","../../src/studio-ui/help/quick-start.ts","../../src/studio-ui/help/publishing.ts","../../src/studio-ui/help/blog.ts","../../src/studio-ui/help/pictures.ts","../../src/studio-ui/help/markdown.ts","../../src/studio-ui/help/events.ts","../../src/studio-ui/help/account.ts","../../src/studio-ui/help/updates.ts","../../src/studio-ui/help/trouble.ts","../../src/studio-ui/help/index.ts","../../src/studio-ui/facts.ts","../../src/studio-ui/help/md.tsx","../../src/studio-ui/help/StudioHelp.tsx","../../src/studio-ui/types.ts"],"names":["jsx","jsxs","useState","useEffect","useRef","read","Fragment","labelFor","useId","useCallback","useMemo","base","useImages","useTransition","Link","keyFor","Field","toBase64","createBrowserClient","error","initialsOf","useRouter","role","usePathname","buf","INLINE"],"mappings":"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","file":"index.js","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, version }: { items: NavItem[]; pinned?: NavItem[]; activeHref: string; basePath: string; /** Shown quietly under Collapse, e.g. \"0.15.1\". */ version?: string | null }) {\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 {version && (\n <span className=\"rz-sidebar__version\" title={`Studio ${version}`}>\n <span className=\"rz-sidebar__label\">Studio </span>{version}\n </span>\n )}\n </aside>\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 centers. */\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","/**\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 { OutboundArrow } from \"./Button\";\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 GlobeIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18\" /></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, siteUrl }: {\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 center. Omit to hide the item. */\n helpHref?: string;\n /** The live website — a \"View website\" item that opens in a new tab. Omit to hide it. */\n siteUrl?: string | null;\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 {(siteUrl || accountHref || helpHref) && <div className=\"rz-menu__sep\" />}\n {siteUrl && (\n <a href={siteUrl} target=\"_blank\" rel=\"noreferrer\" role=\"menuitem\" className=\"rz-menu__item\">\n <GlobeIcon />\n View website\n <span className=\"rz-menu__end\"><OutboundArrow /></span>\n </a>\n )}\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 center\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\";\nimport { OutboundArrow } from \"./Button\";\n\nexport function TopBar({ siteName, productName, logoUrl, homeHref, siteUrl, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n siteName: string;\n productName: string;\n logoUrl?: string | null;\n homeHref: string;\n /** The live website. When set, the brand opens it in a new tab (like every dashboard people know); otherwise it goes to the dashboard. */\n siteUrl?: string | null;\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\n href={siteUrl || homeHref}\n className=\"rz-topbar__brand\"\n {...(siteUrl ? { target: \"_blank\", rel: \"noreferrer\", title: \"Open the live website in a new tab\" } : {})}\n >\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 {siteUrl && <OutboundArrow />}\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} siteUrl={siteUrl} />\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__brand .rz-arrow { color: var(--text-muted); opacity: 0; transition: opacity .15s, transform .15s; }\n.rz-topbar__brand:hover .rz-arrow { opacity: 1; }\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-sidebar__version { display: block; padding: 0 1rem .75rem; font-family: var(--rz-font-mono); font-size: .6875rem; letter-spacing: .04em; color: var(--text-muted); opacity: .8; white-space: nowrap; }\n.rz-sidebar--collapsed .rz-sidebar__version { padding: 0 0 .75rem; text-align: center; }\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 color 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 center for the avatar menu. Default `${basePath}/help`; null hides the item. */\n helpHref?: string | null;\n /** The live website. Makes the brand and a \"View website\" menu item open it in a new tab. */\n siteUrl?: 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 /** The running Studio version, shown quietly at the foot of the sidebar. */\n version?: string | null;\n children: ReactNode;\n}\n\nexport function AdminShell({\n siteName, productName = \"Studio\", logoUrl, user, role, nav, pinnedNav, activeHref,\n basePath = \"/admin\", signOutPath, accountHref, helpHref, siteUrl, branding, defaultTheme = \"light\", version, 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 siteUrl={siteUrl}\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} version={version} />}\n <main className=\"rz-main\">\n <div className=\"rz-content\">{children}</div>\n </main>\n </div>\n </div>\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","/** The package's own version, baked in by tsup (`define`); a dev fallback for vitest and tsc. */\ndeclare const __ADMIN_VERSION__: string | undefined;\n\nexport const ADMIN_VERSION: string = typeof __ADMIN_VERSION__ === \"string\" ? __ADMIN_VERSION__ : \"0.0.0-dev\";\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, color 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 center 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/* ---- Help center ---------------------------------------------------- */\n.rz-admin .rz-help__search { position: relative; margin: 0 0 1.5rem; max-width: 44rem; }\n.rz-admin .rz-help__search svg { position: absolute; left: .9rem; top: 50%; transform: translateY(-50%); color: var(--text-muted); pointer-events: none; }\n.rz-admin .rz-help__search input { width: 100%; padding-left: 2.6rem; font-size: 1rem; }\n.rz-admin .rz-help__body { display: grid; grid-template-columns: 13rem minmax(0, 1fr); gap: 2rem; align-items: start; }\n@media (max-width: 760px) { .rz-admin .rz-help__body { grid-template-columns: 1fr; gap: 1rem; } .rz-admin .rz-help__nav { display: flex; flex-wrap: wrap; gap: .25rem; } }\n.rz-admin .rz-help__nav { position: sticky; top: calc(var(--rz-topbar) + 1rem); display: flex; flex-direction: column; gap: .1rem; }\n.rz-admin .rz-help__navitem { padding: .45rem .75rem; border-radius: 6px; color: var(--text-secondary); text-decoration: none; font-size: .875rem; }\n.rz-admin .rz-help__navitem:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-admin .rz-help__navitem--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-admin .rz-help__main { max-width: 44rem; min-width: 0; }\n.rz-admin .rz-help__h { font-family: var(--rz-font-display); font-size: 1.5rem; font-weight: 600; letter-spacing: -.01em; margin: 0 0 .35rem; }\n.rz-admin .rz-help__blurb { color: var(--text-secondary); margin: 0 0 1.25rem; }\n.rz-admin .rz-help__count { color: var(--text-muted); font-size: .85rem; margin: 0 0 .75rem; }\n.rz-admin .rz-help__list { list-style: none; margin: 0; padding: 0; display: grid; gap: .6rem; }\n.rz-admin .rz-help__card { display: flex; flex-direction: column; gap: .2rem; padding: .9rem 1rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--rz-radius); text-decoration: none; color: inherit; transition: border-color .15s; }\n.rz-admin .rz-help__card:hover { border-color: var(--signal); }\n.rz-admin .rz-help__meta { font-family: var(--rz-font-mono); font-size: .65rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); }\n.rz-admin .rz-help__title { font-weight: 600; color: var(--text-primary); }\n.rz-admin .rz-help__summary { color: var(--text-secondary); font-size: .9rem; line-height: 1.5; }\n.rz-admin .rz-help__crumb { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--rz-font-mono); font-size: .75rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); text-decoration: none; margin: 0 0 1rem; }\n.rz-admin .rz-help__crumb:hover { color: var(--signal); }\n.rz-admin .rz-help__prose { line-height: 1.65; color: var(--text-primary); }\n.rz-admin .rz-help__prose > * + * { margin-top: .85rem; }\n.rz-admin .rz-help__prose h2 { font-family: var(--rz-font-display); font-size: 1.1rem; font-weight: 600; margin-top: 1.75rem; }\n.rz-admin .rz-help__prose h3 { font-size: .95rem; font-weight: 600; margin-top: 1.25rem; }\n.rz-admin .rz-help__prose p, .rz-admin .rz-help__prose li { color: var(--text-secondary); }\n.rz-admin .rz-help__prose strong { color: var(--text-primary); font-weight: 600; }\n.rz-admin .rz-help__prose ul, .rz-admin .rz-help__prose ol { padding-left: 1.35rem; }\n.rz-admin .rz-help__prose li + li { margin-top: .3rem; }\n.rz-admin .rz-help__prose code { font-family: var(--rz-font-mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--border); border-radius: 4px; padding: .05em .35em; }\n.rz-admin .rz-help__prose pre { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--rz-radius); padding: .8rem 1rem; overflow-x: auto; }\n.rz-admin .rz-help__prose pre code { background: transparent; border: 0; padding: 0; font-size: .82rem; line-height: 1.55; }\n.rz-admin .rz-help__prose blockquote { margin: 0; padding: .2rem 0 .2rem 1rem; border-left: 3px solid var(--signal); color: var(--text-secondary); }\n.rz-admin .rz-help__prose a { color: var(--signal); text-decoration: none; }\n.rz-admin .rz-help__prose a:hover { color: var(--text-primary); }\n.rz-admin .rz-help__prose .rz-table td { white-space: normal; color: var(--text-secondary); }\n.rz-admin .rz-help__pager { display: flex; justify-content: space-between; gap: 1rem; margin-top: 2.5rem; padding-top: 1rem; border-top: 1px solid var(--separator); font-size: .875rem; }\n.rz-admin .rz-help__pager a { display: inline-flex; align-items: center; gap: .35rem; color: var(--text-secondary); text-decoration: none; }\n.rz-admin .rz-help__pager a:hover { color: var(--signal); }\n.rz-admin .rz-arrow--back { transform: none; }\n@media (prefers-reduced-motion: no-preference) { .rz-admin a:hover .rz-arrow--back { transform: translateX(-4px); } }\n\n/* ---- Studio update strip / Settings → Studio ---------------------------- */\n.rz-admin .rz-update { border: 1px solid color-mix(in srgb, var(--signal) 22%, var(--border)); border-radius: 8px; background: color-mix(in srgb, var(--signal) 5%, var(--surface-1)); padding: .75rem 1.1rem; }\n.rz-admin .rz-update--strip { margin: 0 0 1.5rem; }\n.rz-admin .rz-update__row { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1.1rem; }\n.rz-admin .rz-update__title { display: inline-flex; align-items: center; gap: .55rem; font-weight: 600; color: var(--text-primary); }\n.rz-admin .rz-update__title::before { content: \"\"; width: 8px; height: 8px; border-radius: 50%; background: var(--signal); box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); }\n.rz-admin .rz-update__link { display: inline-flex; align-items: center; gap: .3rem; background: none; border: 0; padding: 0; font: inherit; font-size: .875rem; color: var(--signal); cursor: pointer; text-decoration: none; }\n.rz-admin .rz-update__link:hover { color: var(--text-primary); }\n.rz-admin .rz-update__later { margin-left: auto; background: none; border: 0; padding: 0; font: inherit; font-size: .8rem; color: var(--text-muted); cursor: pointer; }\n.rz-admin .rz-update__later:hover { color: var(--text-primary); }\n.rz-admin .rz-update__notes { margin: .6rem 0 0; font-size: .875rem; line-height: 1.55; color: var(--text-secondary); white-space: pre-line; }\n.rz-admin .rz-update__problem { margin: .6rem 0 0; font-size: .875rem; color: var(--status-down); }\n.rz-admin .rz-update__done { display: block; margin-top: .5rem; font-size: .875rem; color: var(--text-secondary); }\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\n/**\n * \"Studio 0.15 is available\" — a quiet strip under the top bar for owners and\n * staff, only once the update's checks are green. What's new expands inline,\n * Preview opens the site with the update, Update merges (the same publish step\n * as any change) and then tracks the rebuild. Later hides it for this tab.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { Button, OutboundArrow, Steps, type StepState } from \"../shell\";\nimport { useStudio } from \"./context\";\nimport { useDeployed } from \"./useDeployed\";\nimport type { MergeOutcome, StudioUpdate } from \"./types\";\n\nconst HIDE_KEY = \"rz-update-later\";\n\nexport function canSeeUpdates(role: string | null | undefined): boolean {\n return role === \"owner\" || role === \"staff\";\n}\n\nexport function UpdateStrip({ update, role }: { update: StudioUpdate | null | undefined; role: string | null }) {\n const [hidden, setHidden] = useState(true); // hidden until we know sessionStorage says otherwise (no flash)\n useEffect(() => {\n try { setHidden(sessionStorage.getItem(HIDE_KEY) === update?.version); } catch { setHidden(false); }\n }, [update?.version]);\n if (!update || update.state !== \"ready\" || !canSeeUpdates(role) || hidden) return null;\n const later = () => { try { sessionStorage.setItem(HIDE_KEY, update.version); } catch { /* private mode */ } setHidden(true); };\n return <UpdateBody update={update} onLater={later} compact />;\n}\n\n/** The strip's body — also the Settings → Studio tab's action area (compact=false). */\nexport function UpdateBody({ update, onLater, compact = false }: { update: StudioUpdate; onLater?: () => void; compact?: boolean }) {\n const { actions } = useStudio();\n const [showNotes, setShowNotes] = useState(!compact);\n const [busy, setBusy] = useState(false);\n const [outcome, setOutcome] = useState<MergeOutcome | null>(null);\n const merged = outcome?.state === \"merged\";\n const deploy = useDeployed(merged, merged ? outcome.sha : null);\n\n const run = async () => {\n setBusy(true);\n try { setOutcome(await actions.updateStudio(update.number)); } finally { setBusy(false); }\n };\n\n if (merged) {\n const live = deploy === \"live\";\n const steps = [\n { label: \"Updated\", state: \"done\" as StepState, note: `Studio ${update.version}` },\n { label: \"Live\", state: (live ? \"done\" : \"active\") as StepState, note: live ? \"On the site now\" : deploy === \"slow\" ? \"Taking longer than usual\" : \"Rebuilding, about two minutes\" },\n ];\n return (\n <div className={`rz-update${compact ? \" rz-update--strip\" : \"\"}`} role=\"status\">\n <Steps steps={steps} />\n <span className=\"rz-update__done\">\n {live ? (\n <>\n Studio {update.version} is live. <button type=\"button\" className=\"rz-update__link\" onClick={() => window.location.reload()}>Reload Studio</button> to start using it — the version at the foot of the sidebar will change.\n </>\n ) : (\n \"Nothing to do meanwhile — keep working. The website is rebuilding with the new Studio; the version at the foot of the sidebar changes when it's done, in about two minutes.\"\n )}\n </span>\n </div>\n );\n }\n\n const problem = outcome && outcome.state !== \"pending\"\n ? outcome.state === \"stale\" ? \"The site changed since the checks ran. Try again in a minute.\"\n : outcome.state === \"red\" ? `The checks failed${outcome.failingCheck ? ` (${outcome.failingCheck})` : \"\"}. Your web team has been able to see this.`\n : outcome.state === \"error\" ? outcome.message : null\n : null;\n\n return (\n <div className={`rz-update${compact ? \" rz-update--strip\" : \"\"}`} role=\"status\">\n <div className=\"rz-update__row\">\n <span className=\"rz-update__title\">Studio {update.version} is available</span>\n <button type=\"button\" className=\"rz-update__link\" onClick={() => setShowNotes((v) => !v)} aria-expanded={showNotes}>What’s new</button>\n {update.previewUrl && (\n <a href={update.previewUrl} target=\"_blank\" rel=\"noreferrer\" className=\"rz-update__link\">Preview <OutboundArrow /></a>\n )}\n <Button size=\"sm\" onClick={run} disabled={busy}>{busy ? \"Updating…\" : \"Update\"}</Button>\n {onLater && <button type=\"button\" className=\"rz-update__later\" onClick={onLater}>Later</button>}\n </div>\n {showNotes && (\n <p className=\"rz-update__notes\">{update.notes ?? `Version ${update.version} of Studio, replacing ${update.currentVersion}. Nothing changes on your website until you press Update.`}</p>\n )}\n {problem && <p className=\"rz-update__problem\">{problem}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { AdminShell, type NavItem, type ShellUser } from \"../shell\";\nimport { ADMIN_VERSION } from \"../version\";\nimport { STUDIO_CSS } from \"./css\";\nimport { UpdateStrip } from \"./UpdateStrip\";\nimport type { StudioUpdate } from \"./types\";\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, siteUrl = \"/\", user, role, nav, pinnedNav, branding, update = null, children }: {\n siteName: string;\n logoUrl?: string | null;\n /** The public website — pass \"/\" so it works on previews and localhost too. The brand and the avatar menu open it in a new tab. */\n siteUrl?: 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 /** The pending Studio update from Studio.readers.studioUpdate(); shown as a strip to owners and staff when ready. */\n update?: StudioUpdate | null;\n children: React.ReactNode;\n}) {\n const pathname = usePathname() ?? \"/admin\";\n // The public site's Studio pill (@realiizlabs/admin/bar) shows when this marker is present.\n // It carries no identity; /admin still does the real check. Cleared by the sign-out handler.\n useEffect(() => {\n if (user) document.cookie = \"rz-studio=1; Path=/; Max-Age=2592000; SameSite=Lax\";\n }, [user]);\n return (\n <>\n <style>{STUDIO_CSS}</style>\n <AdminShell siteName={siteName} logoUrl={logoUrl ?? undefined} siteUrl={siteUrl} user={user} role={role} nav={nav} pinnedNav={pinnedNav} branding={branding} accountHref={null} activeHref={pathname} version={ADMIN_VERSION}>\n <UpdateStrip update={update} role={role} />\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 color: 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, 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 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 * Settings → Studio: which version is running, whether an update is waiting\n * (with notes and the same Update button as the strip), and how updates work.\n * Owners and staff only — the tab isn't offered to editors.\n */\n\nimport { Card } from \"../../shell\";\nimport { useStudio } from \"../context\";\nimport { UpdateBody } from \"../UpdateStrip\";\nimport type { StudioUpdate } from \"../types\";\n\nexport function StudioTab({ update, version, role }: { update: StudioUpdate | null; version: string; role: string }) {\n const { supportName } = useStudio();\n return (\n <div className=\"acct-stack\">\n <Card className=\"acct-card\">\n <h2 className=\"acct-title\">Studio {version}</h2>\n {!update && <p className=\"acct-blurb\">You’re up to date. When a new version comes out, it appears here and as a strip at the top of every Studio page.</p>}\n {update?.state === \"checking\" && (\n <p className=\"acct-blurb\">Studio {update.version} is on its way — the checks are still running. Come back in a couple of minutes.</p>\n )}\n {update?.state === \"failed\" && (\n <p className=\"acct-blurb\">\n Studio {update.version} is available, but its checks failed, so it can’t be installed yet.\n {role === \"staff\" && update.failingCheck ? ` Failing check: ${update.failingCheck}.` : ` ${supportName} has been able to see this and will sort it out.`}\n </p>\n )}\n {update?.state === \"ready\" && <UpdateBody update={update} />}\n </Card>\n <Card className=\"acct-card\">\n <h2 className=\"acct-title\">How updates work</h2>\n <p className=\"acct-blurb\">\n Studio is a small package inside your website. When {supportName} releases a new version, your site prepares the update\n as a checked change — the same way a blog post is checked before it goes live — and builds a private preview.\n Nothing changes until you press <b>Update</b>. If the update would break anything, the button never unlocks.\n Your site looks for new versions once a week, on Monday morning.\n </p>\n <p className=\"acct-blurb\" style={{ marginTop: \".5rem\" }}>\n <a href=\"/admin/help#s-updates\">Everything about updates, in the Help center</a> — when they arrive, what they can and can’t change, and what to do if one fails.\n </p>\n </Card>\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\";\nimport { StudioTab } from \"./StudioTab\";\nimport type { StudioUpdate } from \"../types\";\n\nexport type TabId = \"profile\" | \"password\" | \"team\" | \"business\" | \"studio\";\n\nconst LABELS: Record<TabId, string> = { profile: \"My Profile\", password: \"Change Password\", team: \"Team\", business: \"Business\", studio: \"Studio\" };\n\nexport function AccountTabs({ me, manages, team, branding, myUserId, myRole, update = null, version = \"\" }: {\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 /** The pending Studio update (owners and staff), from Studio.readers.studioUpdate(). */\n update?: StudioUpdate | null;\n /** The running Studio version (ADMIN_VERSION). */\n version?: string;\n}) {\n const router = useRouter();\n const pathname = usePathname();\n const params = useSearchParams();\n const ids: TabId[] = manages ? [\"profile\", \"password\", \"team\", \"business\", \"studio\"] : [\"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 {active === \"studio\" && manages && <StudioTab update={update} version={version} role={myRole} />}\n </>\n );\n}\n","\"use client\";\n\nimport { Suspense } from \"react\";\nimport type { SiteBranding, SiteMember } from \"../types\";\nimport { AccountTabs } from \"./AccountTabs\";\nimport type { StudioUpdate } from \"../types\";\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, update = null, version = \"\" }: {\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 update?: StudioUpdate | null;\n version?: 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} update={update} version={version} />\n </Suspense>\n </div>\n );\n}\n","import type { HelpSection } from \"./types\";\n\n/** Section order on the Help page — Quick start first, Troubleshooting last. */\nexport const HELP_SECTIONS: HelpSection[] = [\n { id: \"start\", title: \"Quick start\", blurb: \"Ten minutes from signing in to your first published change.\" },\n { id: \"publishing\", title: \"Publishing a change\", blurb: \"Save, checks, preview, publish — and how to undo.\" },\n { id: \"blog\", title: \"Blog posts\", blurb: \"Every field on a post, and what it does for readers and Google.\" },\n { id: \"pictures\", title: \"Pictures\", blurb: \"Where to get one, what size, and how to drop it in.\" },\n { id: \"markdown\", title: \"Writing in Markdown\", blurb: \"Headings, lists, links, tables — the formatting the editor understands.\" },\n { id: \"events\", title: \"Events\", blurb: \"Dates, times, time zones, kinds, and what to do when plans change.\" },\n { id: \"account\", title: \"Account & team\", blurb: \"Your profile, your password, who else can sign in, your branding.\" },\n { id: \"updates\", title: \"Studio updates\", blurb: \"How new versions reach you, what the Update button does, and what could go wrong (not much).\" },\n { id: \"trouble\", title: \"Troubleshooting\", blurb: \"When something doesn't look right — what it means and what to do.\" },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Quick start — read top to bottom once; everything else is reference. */\nexport const QUICK_START: HelpArticle[] = [\n {\n id: \"what-is-studio\",\n section: \"start\",\n title: \"What Studio is (and isn't)\",\n summary: \"A simple front end over the files that make up your website. Nothing goes live by accident.\",\n keywords: [\"overview\", \"github\", \"repository\", \"how it works\"],\n body: `\n## What it is\n\nStudio is the publishing dashboard for {siteName}. It lets you write, edit and publish {types} without touching code or learning GitHub.\n\nYour website is stored as plain files in a private, backed-up folder on GitHub called a **repository**. Every version of every page is kept forever. Studio reads that folder and writes to it on your behalf.\n\n## Why it works this way\n\nBecause every edit goes through the same three steps — **Save**, **Checks**, **Publish** — a broken page can't reach your visitors. The website is rebuilt with your change in a private test copy first. If something is wrong, you're told, and the live site keeps showing the last good version.\n\n## What it isn't\n\n- It isn't a page builder. The design of the site is fixed by {supportName}; Studio fills it with content.\n- It isn't instant. Publishing takes about two minutes end to end, on purpose.\n- It isn't the only way in. The same files can be edited on GitHub directly, so nothing is ever locked inside Studio.\n`,\n },\n {\n id: \"signing-in\",\n section: \"start\",\n title: \"Signing in\",\n summary: \"Email link by default; a password if you set one. No account to create.\",\n keywords: [\"login\", \"magic link\", \"password\", \"email link\"],\n body: `\n## How it works\n\nGo to **/admin** on your website. Enter your email and press **Send me a sign-in link**. Open the email and click the link — you're in. The link is single-use and expires after a short while.\n\nThere's no account to create: {supportName} invited your email address, which is what allows you in.\n\n## Prefer a password?\n\nUnder the email form, click **Have a password? Sign in with it instead**. A password is optional — you set one under **Settings → Change Password** after signing in with an email link. Email links keep working either way.\n\n## Forgot your password?\n\nThere's nothing to reset. Sign in with an email link, then set a new password under **Settings → Change Password**.\n\n## Signing out\n\nOpen the avatar menu (top right) and choose **Sign out**.\n`,\n },\n {\n id: \"finding-your-way\",\n section: \"start\",\n title: \"Finding your way around\",\n summary: \"The sidebar, the dashboard, the lists, and the avatar menu.\",\n keywords: [\"sidebar\", \"dashboard\", \"navigation\", \"menu\", \"settings\", \"view website\", \"live site\", \"visit site\"],\n body: `\n## The sidebar\n\nOne item per kind of content this site publishes — on {siteName} that's {types}. Each opens a list of everything of that kind with its status. **Dashboard** at the top shows one card per kind with a count and how many changes are waiting. **Settings** at the bottom opens your account.\n\nOn a narrow screen the sidebar collapses to icons; press the arrow at the bottom to expand it.\n\n## A list page\n\nEvery row is one item: its title, date, status and a **View live** link. **+ New** at the top starts a new one. Click a title to edit it. The **Status** column links straight to a waiting change.\n\n## Getting to the live website\n\nClick the site name at the top left — it opens the live website in a new tab (hover and an arrow appears). The avatar menu has the same thing as **View website**. Each item's list row also has **View live** for that one page.\n\n## The avatar menu\n\nTop right, your photo or initials. From here: a light/dark toggle, **View website**, **Account**, **Help center** (this page), and **Sign out**.\n\n## The Ask bubble\n\nIf your site has one (bottom right), it answers questions about Studio from the same articles you're reading now. Ask it things like \"how do I add a picture to a post?\".\n`,\n },\n {\n id: \"your-first-change\",\n section: \"start\",\n title: \"Your first change, start to finish\",\n summary: \"Edit something small, save it, watch the checks, preview it, publish it.\",\n keywords: [\"tutorial\", \"walkthrough\", \"first post\", \"publish\"],\n body: `\nPick something small — a typo in an existing post is perfect.\n\n1. In the sidebar, open the list, then click the item's title.\n2. Make the edit. The form checks required fields as you go; a red message means something needs attention before you can save.\n3. Press **Save changes** (or **Save and continue** for a new item). Studio writes the file and opens a **change**. Nothing is live yet.\n4. You land on the change page. A tracker shows **Saved → Checks → Published → Live**. Checks take a minute or two; the page refreshes itself.\n5. When checks pass, **Preview the change** opens a private copy of the website with your edit in it. Look at it on your phone too.\n6. Press **Publish**. The **Live** step spins until the website has really rebuilt (about two minutes), then **View live** unlocks.\n\nThat's the whole loop. Every edit you ever make is these six steps.\n\n## If checks fail\n\nThe status becomes **Needs fixing** and the message names the problem. Open the item, fix it, save again — the same change re-runs its checks. Nothing was published.\n`,\n },\n {\n id: \"statuses\",\n section: \"start\",\n title: \"What the statuses mean\",\n summary: \"Live, Checking…, Ready to publish, Needs fixing, New — and what to do for each.\",\n keywords: [\"status\", \"pill\", \"checking\", \"ready\", \"needs fixing\", \"live\", \"new\"],\n body: `\n| Status | What it means | What to do |\n| --- | --- | --- |\n| **Live** | What's on the website now. No change waiting. | Nothing — or click the title to start an edit. |\n| **Checking…** | You saved; the test build is running. | Wait a minute or two. The page refreshes itself. |\n| **Ready to publish** | Checks passed. | Open the change and press **Publish** (preview first if you like). |\n| **Needs fixing** | The test build failed. Nothing was published. | Open the item, fix what the message names, save again. |\n| **New · …** | A brand-new item that exists only in a change. | It isn't on the website until you publish it. |\n| **Removing…** / **Removal ready** | You asked to take an item down; same steps as any change. | Publish to make the removal live, or discard to keep the item. |\n\nOne item has at most one change waiting at a time. Saving again updates that same change rather than starting a second one.\n`,\n },\n {\n id: \"studio-pill\",\n section: \"start\",\n title: \"Getting back to Studio from the website\",\n summary: \"A small Studio pill appears bottom-left on the website while you're signed in — Edit this page, or Dashboard.\",\n keywords: [\"pill\", \"edit this page\", \"admin bar\", \"back to studio\", \"website\"],\n body: `\n## What it is\n\nWhile you're signed in to Studio, your public website shows a small dark pill in the bottom-left corner: **Studio · Edit this page · Dashboard**. Visitors never see it — it only appears in a browser where you've signed in.\n\n## Why it's useful\n\nSpot a typo while reading your own site? **Edit this page** opens that exact post or event in Studio. **Dashboard** takes you to the Studio home.\n\n## Good to know\n\n- **Edit this page** only shows on pages Studio manages (a blog post, an event). On the home page or About, you get **Dashboard** only.\n- The × hides the pill for that browser tab; it comes back next time you open the site.\n- It disappears when you sign out of Studio. If you see it but Studio asks you to sign in again, your session simply expired — sign in and carry on.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Publishing a change — the Save → Checks → Publish → Live journey and its exits. */\nexport const PUBLISHING: HelpArticle[] = [\n {\n id: \"save-checks-publish-live\",\n section: \"publishing\",\n title: \"Save, Checks, Publish, Live — the journey\",\n summary: \"What happens at each step, how long it takes, and why there are four of them.\",\n keywords: [\"pull request\", \"change\", \"PR\", \"build\", \"deploy\", \"how long\"],\n body: `\n## Save\n\nYou press **Save**. Studio writes your item as a file and opens a **change** — GitHub calls this a pull request. Think of it as a draft handed in for checking. The live website hasn't changed.\n\n## Checks\n\nThe moment a change exists, the website builds a private test copy with your change in it. This catches the things that would break a page: a required field left empty, a picture that isn't there, a date that doesn't exist. It usually takes one to two minutes. The change page shows a tracker and refreshes itself — you can leave and come back.\n\n## Publish\n\nWhen the checks pass, the status becomes **Ready to publish** and the **Publish** button unlocks. **Preview the change** appears too: a private copy of the real website with your edit in it, so you see exactly how it will look. Pressing **Publish** sends the change to the live site.\n\n## Live\n\nThe website rebuilds itself with your change — about two minutes. The **Live** step keeps spinning until that's really done, then **View live** unlocks. If you look at the website before Live turns green you'll still see the old version. That's normal.\n\n## Why four steps\n\nBecause it means a broken page can never reach a visitor. Everything you publish has already been built once, successfully, with your change in it.\n`,\n },\n {\n id: \"preview-a-change\",\n section: \"publishing\",\n title: \"Previewing before you publish\",\n summary: \"See your edit on the real site design, privately, before anyone else can.\",\n keywords: [\"preview\", \"test copy\", \"private link\"],\n body: `\n## What it is\n\nAfter checks pass, the change page shows **Preview the change**. It opens a private copy of the website — same design, same everything — with your edit in it.\n\n## Why you'd use it\n\nPictures, long titles and tables can look different on the real page than in the editor. Check on your phone as well; most visitors are on one.\n\n## Where it goes\n\nThe preview link is private to the change. It isn't on the live website and won't be found by Google. It disappears once the change is published or discarded.\n\n## Notes\n\n- Editing again after previewing? Save, wait for the new checks, preview again.\n- New pictures show in the preview exactly as they'll go live.\n`,\n },\n {\n id: \"publish-a-change\",\n section: \"publishing\",\n title: \"Publishing\",\n summary: \"Press Publish once checks pass; wait for Live to turn green.\",\n keywords: [\"publish\", \"go live\", \"merge\"],\n body: `\n1. Open the change — from the item's **Status** link, the notice at the top of the item, or the dashboard.\n2. The tracker should show **Checks** green and the status **Ready to publish**.\n3. Press **Publish**.\n4. Wait for **Live** to turn green (about two minutes). **View live** unlocks the moment the website has rebuilt.\n\n## Who can publish\n\nEditors and owners. Every publish is recorded with your name, so it's always clear who changed what.\n\n## If Publish is disabled\n\nChecks haven't passed yet (wait), or failed (fix and save again). The button never unlocks on a failing change.\n`,\n },\n {\n id: \"needs-fixing\",\n section: \"publishing\",\n title: \"When a change 'needs fixing'\",\n summary: \"The test build failed. Nothing was published. Fix the named problem and save again.\",\n keywords: [\"failed\", \"error\", \"red\", \"checks failed\", \"broken\"],\n body: `\n## What happened\n\nThe website was rebuilt with your change and something broke. The live site is untouched — it still shows the last good version.\n\n## What to do\n\n1. Open the item. The message at the top names the problem — most often a required field, a picture path, or a date/time that isn't valid.\n2. Fix it and press **Save**. The **same change** re-runs its checks; you don't get a second one.\n3. When the status flips to **Ready to publish**, publish as usual.\n\n## If the message doesn't make sense\n\nPress **Discard this change** to throw the edit away and start over, or send the message to {supportName}. Copy the whole line — the exact words matter.\n`,\n },\n {\n id: \"discard-a-change\",\n section: \"publishing\",\n title: \"Discarding a change\",\n summary: \"Throw away unpublished edits. The live site is never touched.\",\n keywords: [\"undo\", \"cancel\", \"throw away\", \"revert\", \"discard\"],\n body: `\n## What it does\n\nDeletes the waiting change and everything in it — the edited text and any new pictures. The item goes back to **Live** exactly as it was.\n\n## How\n\nOn the change page, scroll down to **Discard this change**. Confirm. Done.\n\n## When you'd use it\n\n- You changed your mind.\n- Checks failed and starting fresh is easier than fixing.\n- You saved the wrong item by accident.\n\nDiscarding is only for unpublished work. Something that's already live is edited by saving a new change on top of it.\n`,\n },\n {\n id: \"remove-an-item\",\n section: \"publishing\",\n title: \"Removing an item from the website\",\n summary: \"Take a post or event down — through the same checked, publishable change.\",\n keywords: [\"delete\", \"unpublish\", \"take down\", \"remove\"],\n body: `\n## What it is\n\nRemoving takes an item off the website. Like every edit, it travels as a change: **Removing…**, then **Removal ready**, then you **Publish** the removal.\n\n## How\n\n1. Open the item.\n2. At the bottom, press **Remove this post from the website** (for other kinds the link names them — \"Remove this event…\") and confirm with **Yes, remove it**.\n3. Publish the removal from the change page when it's ready. **Cancel this removal** on that page keeps the item.\n\n## Good to know\n\n- Until you publish, the item is still live. Discarding the change keeps it.\n- Every version is kept in the repository, so {supportName} can bring a removed item back if you ever need it.\n- Pictures that belonged only to that item go with it.\n`,\n },\n {\n id: \"two-people-editing\",\n section: \"publishing\",\n title: \"Two people editing the same item\",\n summary: \"The second to publish is told the file changed first. Nothing is silently overwritten.\",\n keywords: [\"conflict\", \"overwrite\", \"team\", \"collision\"],\n body: `\n## What happens\n\nIf someone published a change to an item after you opened it, your publish is refused with a note that the file changed first. Your edit isn't lost — it's still in your change.\n\n## What to do\n\nOpen the item fresh (it now shows the newest version), make your edit again, save, and publish.\n\n## Avoiding it\n\nOne item, one change at a time is the rule Studio enforces. If several people write, agree who owns which items, or finish one change before starting the next.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Blog posts — every field, in the order the form shows them. */\nexport const BLOG: HelpArticle[] = [\n {\n id: \"new-post\",\n section: \"blog\",\n title: \"Writing a new blog post\",\n summary: \"Title, web address, excerpt, date, tags, a header picture, the article — then Save and continue.\",\n keywords: [\"new post\", \"article\", \"write\", \"create post\"],\n body: `\n1. Sidebar → **Blog posts** → **+ New post**.\n2. Type the **Title**. The **Web address** fills itself from it — fine to leave.\n3. Write the **Excerpt** (the teaser on the blog page), check the **Publish date**, add exactly three **Tags**.\n4. Drop in a **Header image** and describe it in **Header image description**. A post needs a header picture before it can go live.\n5. Write the article in **Post content** — see *Writing in Markdown*.\n6. Open **Search & social** and fill **Meta description** at least.\n7. Press **Save and continue**, wait for the checks, preview, **Publish**.\n\n## Where it goes\n\nThe post appears on the blog index, in the RSS feed and in the sitemap automatically, at yoursite.com/blog/your-web-address.\n\n## Tips\n\n- Write the post first, polish the search fields last.\n- Sort the picture before you start — it's the step most likely to hold you up.\n- Saving early is fine: you can keep editing and saving onto the same change until you publish.\n`,\n },\n {\n id: \"post-fields\",\n section: \"blog\",\n title: \"Every field on a blog post\",\n summary: \"What each field does, where it shows up, and what a good one looks like.\",\n keywords: [\"fields\", \"title\", \"slug\", \"excerpt\", \"tags\", \"author\", \"featured\", \"publish date\", \"last updated\"],\n body: `\n## Title (H1)\n\nThe headline at the top of the post and the text of links to it. Say what the reader gets. Length isn't limited, but 50–70 characters reads best in lists.\n\n## Web address (slug)\n\nThe last part of the post's link: my-first-post → yoursite.com/blog/my-first-post. Lowercase words joined by hyphens, no spaces. It fills itself from the title; shorten it if the title is long. Changing it after publishing changes the link — old links break — so settle it before the first publish.\n\n## Excerpt\n\nThe one- or two-sentence teaser shown on the blog index under the title. Not the first paragraph again; a reason to click.\n\n## Publish date / Last updated\n\nShown on the post and used to order the list. **Last updated** is optional — set it when you revise a published post and readers see \"Updated …\".\n\n## Author\n\nHow you're credited. Fills from your profile's \"Name on blog posts\" (Settings → My Profile).\n\n## Tags\n\nExactly three, lowercase, hyphens between words (small-business, ai-tools). Type one and press Enter or a comma. Tags group related posts and drive the \"related posts\" links.\n\n## Header image / Header image description\n\nThe picture at the top of the post and on cards. The description is the alt text — say what's in the picture for readers who can't see it. See *Pictures*.\n\n## Featured post\n\nPins the post to the top of the blog index. One or two at a time is plenty.\n\n## Post content\n\nThe article itself, in Markdown. See *Writing in Markdown*.\n`,\n },\n {\n id: \"search-and-social\",\n section: \"blog\",\n title: \"The Search & social fields\",\n summary: \"Search title, meta description, focus keyword, social image, canonical — what Google and social cards see.\",\n keywords: [\"seo\", \"meta description\", \"search title\", \"focus keyword\", \"canonical\", \"og image\", \"social share\", \"google\"],\n body: `\nThese sit in their own group under the main fields. Readers never see them on the page — search engines and social networks do.\n\n## Search title\n\nWhat Google shows as the blue link and what the browser tab says. Aim for 50–60 characters including your site name. Blank means the Title is used. The gauge under the field turns green inside the target range.\n\n## Meta description\n\nThe gray snippet under the link in Google results. 120–155 characters: what the post covers and why to read it. Google may write its own, but a good one usually wins.\n\n## Focus keyword\n\nThe single phrase this post should rank for (\"small business ai audit\"). Never shown; used for reporting. One per post.\n\n## Social share image\n\nThe picture shown when the link is shared on LinkedIn, Facebook or in messages. 1200 × 630 works everywhere. Blank reuses the header image — usually fine.\n\n## Canonical URL\n\nAdvanced. Only if the same article was published somewhere else first (LinkedIn, Medium): paste that original link so Google credits it and doesn't treat yours as a copy. Otherwise leave blank.\n`,\n },\n {\n id: \"edit-a-post\",\n section: \"blog\",\n title: \"Editing a published post\",\n summary: \"Open it, change it, save — the live version stays up until you publish the change.\",\n keywords: [\"edit\", \"update\", \"revise\", \"change post\"],\n body: `\n1. Sidebar → **Blog posts** → click the title.\n2. Existing posts open in **Preview** so you can read first; click **Edit Markdown** to change the text.\n3. Make your edits. Consider setting **Last updated** to today.\n4. Press **Save changes**, wait for checks, preview, **Publish**.\n\n## Good to know\n\n- If a change is already waiting for this post, a notice at the top says so and links to it. Saving updates that change.\n- Renaming the **Web address** breaks old links. If you must, ask {supportName} to add a redirect.\n- Nothing you do here changes the live post until you press Publish.\n`,\n },\n {\n id: \"post-tips\",\n section: \"blog\",\n title: \"Writing posts that work\",\n summary: \"Structure, length, headings, links — what makes a post readable and findable.\",\n keywords: [\"tips\", \"writing\", \"structure\", \"length\", \"headings\"],\n body: `\n- **One idea per post.** If you have two, write two posts and link them.\n- **Say the answer early.** The first paragraph should tell a hurried reader what they'll learn.\n- **Use section headings** every 200–300 words. Readers scan; Google reads headings too.\n- **Short paragraphs.** Two to four sentences. Phones make long paragraphs a wall.\n- **Link to your own pages** where it helps (\"we explain this on our services page\") and to sources you quote.\n- **800–1,500 words** suits most topics. Shorter is fine if it's complete; longer is fine if it earns it.\n- **Pictures with alt text**, one near the top and one wherever a picture explains faster than words.\n- **Finish with a next step**: a related post, a contact page, a question to think about.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Pictures — sourcing, sizing, dropping in, and what Studio does with them. */\nexport const PICTURES: HelpArticle[] = [\n {\n id: \"where-pictures-come-from\",\n section: \"pictures\",\n title: \"Getting a picture to use\",\n summary: \"Your phone, a stock library, Canva, or an AI image tool — make it outside Studio, then drop it in.\",\n keywords: [\"stock photo\", \"canva\", \"ai image\", \"unsplash\", \"photo\", \"camera\", \"create image\"],\n body: `\nStudio doesn't make pictures; it takes the ones you give it. Four good sources:\n\n## Your phone\n\nReal photos of your work, your team, your space beat stock every time. Landscape (wider than tall) suits headers. Wipe the lens.\n\n## A stock library\n\nUnsplash, Pexels and Pixabay are free for commercial use. Search a feeling, not an object (\"focused workshop\" beats \"laptop\"). Download the large size.\n\n## Canva (or similar)\n\nFor header images with text on them and for social share images. Start from a 1200 × 630 template for social, 1600 × 900 for headers. Export as JPG or PNG.\n\n## An AI image tool\n\nChatGPT, Midjourney and the rest can make a fitting illustration in a minute. Describe the scene, the mood and \"no text\" (AI text is usually garbled). Download the largest version offered.\n\n## Then\n\nSave it to your computer and drop it onto the picture field in Studio — see *Adding a picture to a post or event*. Studio handles the resizing.\n\n## Rights\n\nOnly use pictures you took, bought, generated, or that are licensed for commercial use. When in doubt, ask {supportName}.\n`,\n },\n {\n id: \"add-a-picture\",\n section: \"pictures\",\n title: \"Adding a picture to a post or event\",\n summary: \"Drop, choose or paste. It's shrunk in your browser and saved with the item when you press Save.\",\n keywords: [\"upload\", \"header image\", \"hero\", \"drop zone\", \"drag\", \"paste image\"],\n body: `\n## The picture fields\n\n**Header image** (the big one at the top) and **Social share image** (for link previews) are drop zones. Drag a file onto one, click it to choose a file, or click it and paste (Cmd/Ctrl+V) a copied image.\n\n## Pictures inside the text\n\nIn **Post content**, put the cursor where the picture goes and press the toolbar's **Image** button, then choose the file. A line like \\`\\` is inserted — edit the description in the square brackets to say what's in the picture.\n\n## What happens next\n\n- Nothing is uploaded when you pick. The picture travels with the item when you press **Save**, into the same change, and goes live when you **Publish**. Discarding the change discards its pictures too.\n- Your browser shrinks the picture first (about 1600 pixels wide, WebP format, usually 100–400 KB), so pages stay fast. Accepted: JPG, PNG or WebP up to 10 MB.\n- Pictures are named after the item's **Web address**, so fill that in first. The header image becomes /blog/your-post.webp; pictures in the text go under /blog/your-post/.\n\n## Removing or replacing\n\nDrop a new picture on the field to replace it, or use the field's **Remove** to clear it. The change goes live with the next Publish.\n`,\n },\n {\n id: \"picture-sizes\",\n section: \"pictures\",\n title: \"Sizes and shapes that work\",\n summary: \"Landscape for headers, 1200 × 630 for social, square for logos and avatars.\",\n keywords: [\"size\", \"dimensions\", \"aspect ratio\", \"resolution\", \"1200x630\", \"square\"],\n body: `\n| Use | Best shape | Minimum |\n| --- | --- | --- |\n| Header image | Landscape, about 16:9 | 1600 pixels wide |\n| Social share image | 1.91:1 (1200 × 630) | 1200 × 630 |\n| Picture in the text | Any; landscape reads best | 1200 pixels wide |\n| Profile photo | Square, face centered | 400 × 400 |\n| Business logo | Square or wide, on a plain background | 400 pixels on the short side |\n| Favicon (browser-tab icon) | Square, simple shape | 256 × 256 |\n\n## Why these\n\nBigger than needed is fine — Studio shrinks. Smaller than needed looks soft on large screens and can't be fixed later. Text on a header image gets cropped on phones; keep it near the center.\n\n## File size\n\nDon't worry about it. Studio converts everything to WebP at web size. The 10 MB limit is per original file.\n`,\n },\n {\n id: \"alt-text\",\n section: \"pictures\",\n title: \"Picture descriptions (alt text)\",\n summary: \"One sentence saying what's in the picture — for screen readers and for Google.\",\n keywords: [\"alt text\", \"accessibility\", \"description\", \"screen reader\"],\n body: `\n## What it is\n\nEvery picture has a short text description that's read aloud to visitors who use a screen reader and shown if the picture can't load. Google reads it too.\n\n## Where it goes\n\nThe **Header image description** field, and the words in square brackets for pictures in the text: \\`\\`.\n\n## How to write one\n\nSay what's in the picture as if describing it over the phone. \"Two people reviewing a report at a kitchen table\" — not \"image\" or \"photo123\" and not a list of keywords. Decorative pictures can have a short description; pictures that carry information need a full one.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Writing in Markdown — the editor, the toolbar, and the syntax it produces. */\nexport const MARKDOWN: HelpArticle[] = [\n {\n id: \"the-editor\",\n section: \"markdown\",\n title: \"The content editor\",\n summary: \"Edit Markdown or Preview, one toolbar row, Expand for a full window.\",\n keywords: [\"editor\", \"toolbar\", \"preview\", \"expand\", \"fullscreen\"],\n body: `\n## Two tabs\n\n**Edit Markdown** is where you type. **Preview** shows exactly how the website will render it — same fonts, same spacing. An existing item opens in Preview so you can read first; a blank one opens in Edit.\n\n## The toolbar\n\nButtons work on your selection and toggle on and off. Left to right: **Bold**, **Italic** · **Section heading**, **Sub-heading**, **Bulleted list**, **Numbered list**, **Quote** · **Link**, **Inline code** · Insert: **Image**, **Separator (·)**, **Divider line**. When the cursor is inside a table, row and column buttons appear.\n\nHover a button for its name and shortcut. **Bold** is Cmd/Ctrl+B, **Italic** is Cmd/Ctrl+I.\n\n## Expand\n\nThe arrows button at the right of the toolbar fills the window with the editor. Press **Esc** or the button again to come back.\n\n## Why Markdown\n\nIt's plain text with a few marks — no hidden formatting to fight, it never breaks, and it reads fine even raw. You'll learn all of it in ten minutes; the toolbar does the typing for you anyway.\n`,\n },\n {\n id: \"markdown-basics\",\n section: \"markdown\",\n title: \"Markdown in ten minutes\",\n summary: \"Paragraphs, headings, bold and italic, lists, links, quotes.\",\n keywords: [\"markdown\", \"syntax\", \"formatting\", \"bold\", \"italic\", \"heading\", \"list\", \"link\", \"quote\"],\n body: `\n## Paragraphs\n\nJust type. Leave a blank line between paragraphs. A single line break inside a paragraph is ignored, so don't press Enter to wrap lines.\n\n## Headings\n\n\\`\\`\\`\n## A section heading\n### A smaller sub-heading\n\\`\\`\\`\n\nUse \\`##\\` for the sections of your post and \\`###\\` under them. The title of the post is already the top heading, so never use a single \\`#\\`.\n\n## Bold and italic\n\n\\`\\`\\`\n**bold** _italic_ **_both_**\n\\`\\`\\`\n\n## Lists\n\n\\`\\`\\`\n- first point\n- second point\n - a point under it (indent two spaces)\n\n1. first step\n2. second step\n\\`\\`\\`\n\nLeave a blank line before a list.\n\n## Links\n\n\\`\\`\\`\n[the words people click](https://example.com)\n[our services page](/services)\n\\`\\`\\`\n\nSelect words and press the **Link** button; it wraps them and puts the cursor where the address goes.\n\n## Quotes\n\n\\`\\`\\`\n> Something someone said, or a callout worth setting apart.\n\\`\\`\\`\n\n## Small touches\n\n\\`\\`\\`\nSome \\`code\\` or a product name in a fixed-width font\n--- (a divider line across the page)\nDate · Place (the · separator, from the Insert menu)\n\\`\\`\\`\n`,\n },\n {\n id: \"markdown-tables\",\n section: \"markdown\",\n title: \"Tables\",\n summary: \"Pipes and dashes; the toolbar adds rows and columns when you're inside one.\",\n keywords: [\"table\", \"grid\", \"columns\", \"rows\"],\n body: `\n## The shape\n\n\\`\\`\\`\n| Plan | Price | Best for |\n| --- | --- | --- |\n| Starter | $20/mo | One person |\n| Team | $60/mo | Up to five |\n\\`\\`\\`\n\nThe first line is the header row; the line of dashes is required; every row has the same number of \\`|\\` separators. Spacing inside the cells doesn't matter — Preview lines everything up.\n\n## Editing\n\nPut the cursor anywhere in a table and the toolbar shows **+ Row**, **− Row**, **+ Col**, **− Col**. They act on the row or column the cursor is in.\n\n## Good to know\n\n- Keep cells short. Long text wraps and the table gets tall on phones.\n- Bold and links work inside cells; lists and headings don't.\n- Three columns is comfortable on a phone; five is the practical limit.\n`,\n },\n {\n id: \"markdown-images\",\n section: \"markdown\",\n title: \"Pictures inside the text\",\n summary: \"The Image button inserts one; the square brackets hold the description.\",\n keywords: [\"inline image\", \"image in post\", \"figure\"],\n body: `\n## Insert\n\nPut the cursor on its own blank line where the picture should appear and press the **Image** button in the toolbar. Choose the file. Studio inserts:\n\n\\`\\`\\`\n\n\\`\\`\\`\n\nReplace the words in the square brackets with a real description (see *Picture descriptions*). Leave the address alone — it's where the picture will live once published.\n\n## Placement\n\nA picture on its own line spans the text column. Put one near the top of a long post and then wherever a picture explains faster than words. Don't put text on the same line as the picture.\n\n## Preview shows it\n\nEven before you save, **Preview** shows the new picture in place. After checks, **Preview the change** shows it on the real page.\n`,\n },\n {\n id: \"markdown-gotchas\",\n section: \"markdown\",\n title: \"Things that trip people up\",\n summary: \"Blank lines, pasted formatting, straight quotes, and where headings start.\",\n keywords: [\"problem\", \"not rendering\", \"paste from word\", \"weird formatting\"],\n body: `\n- **My list runs into the paragraph above.** Leave a blank line before the list.\n- **My heading shows a # sign.** Put a space after the hashes: \\`## Heading\\`, not \\`##Heading\\`.\n- **Pasting from Word or Google Docs** brings hidden formatting. Paste, then check Preview; if it looks odd, paste again as plain text (Cmd/Ctrl+Shift+V) and add headings with the toolbar.\n- **A link doesn't work.** The address must start with https:// (or / for a page on your own site). No spaces inside the parentheses.\n- **Two line breaks in a row but no gap.** That's a blank line — it starts a new paragraph. To force a gap without text, a divider line \\`---\\` is the honest choice.\n- **Emoji and special characters** are fine. Just type them.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Events — dated items: the core fields, and the optional groups a site may have switched on. */\nexport const EVENTS: HelpArticle[] = [\n {\n id: \"new-event\",\n section: \"events\",\n title: \"Adding an event\",\n summary: \"Title, what kind, date and times, where, a link — save, check, publish. Upcoming first on the site.\",\n keywords: [\"new event\", \"add event\", \"calendar\", \"appearance\", \"talk\", \"show\", \"workshop\"],\n body: `\nEvents are anything with a date: a workshop, a show, a talk, a podcast appearance, an open house. If {siteName} has an events section it appears in the sidebar under its own name.\n\n1. Sidebar → the events list → **+ New**.\n2. **Title**, then check the **Web address** it suggests.\n3. **One-line summary** — what it is and who it's for. Shown in the list.\n4. **What kind of event**. Pick from the list, or choose **Other** and type a **Custom kind** (\"Co-Keynote\", \"Wedding\", \"Pop-up\").\n5. **Date**, then **Start** and **End** times if it isn't all-day. Set **Time zone** only if the event isn't in the site's home zone.\n6. **Where** — an address, a room, or \"Online\".\n7. **Link for details** — the event's own page, if it has one (tickets, the venue, a livestream).\n8. A **Picture** and its description if you have one.\n9. Write the long description below, press **Save and continue**, wait for checks, preview, **Publish**.\n\n## Where it goes\n\nThe site's events page lists upcoming events first, then past ones. Each event has its own page at yoursite.com/…/your-web-address with the details and your description. Search engines get an Event listing automatically.\n`,\n },\n {\n id: \"event-fields\",\n section: \"events\",\n title: \"Every field on an event\",\n summary: \"Kind and custom kind, date, times, time zone, where, link, pictures.\",\n keywords: [\"fields\", \"kind\", \"custom kind\", \"date\", \"start time\", \"end time\", \"time zone\", \"location\"],\n body: `\n## Title / Web address / One-line summary\n\nSame as a blog post: the name, the link, the teaser. Keep the summary to one or two sentences — it's shown in the list and to search engines.\n\n## What kind of event / Custom kind\n\nThe kind is the small label on the event (Workshop, Talk, Podcast…). The list is set for your site. If yours isn't on it, choose **Other** and type your own in **Custom kind** — it's shown exactly as you type it.\n\n## Date\n\nThe day, picked from the calendar. Must be a real date.\n\n## Start / End\n\n24-hour times, e.g. 14:00 to 15:00. Leave both empty for an all-day event. End must be after Start.\n\n## Time zone\n\nLeave empty and the site's home zone is used. Set it when the event happens somewhere else — a talk in Denver for a New York site. Visitors see the time in the event's zone with its name, so nobody shows up an hour off.\n\n## Where\n\nFree text: an address, \"Studio B\", or \"Online\". Anything with the word \"online\" is marked as an online event for search engines.\n\n## Link for details\n\nThe event's own web page. Shown as **Event website** on the event page. Not the same as an RSVP link (see *Tickets, venue and appearance fields*).\n\n## Picture / Picture description / Social share image\n\nAs for blog posts. See *Pictures*.\n\n## Canceled, Cancellation note, Moved to, Previous date\n\nFor when plans change. See *When an event is canceled or moves*.\n`,\n },\n {\n id: \"event-changes\",\n section: \"events\",\n title: \"When an event is canceled or moves\",\n summary: \"Keep it listed and say so — don't delete it. Two fields each for canceled and moved.\",\n keywords: [\"canceled\", \"cancelled\", \"postponed\", \"rescheduled\", \"moved\", \"new date\"],\n body: `\nPeople who saw the original listing will come back to it. A vanished event tells them nothing; a marked one tells them everything.\n\n## Canceled\n\nTick **Canceled** and, optionally, write a **Cancellation note** (\"Postponed — new date coming soon\"). The event stays in the list with a Canceled label and a line through the title; its page says the same. Any RSVP button is hidden.\n\n## Moved to a new date\n\n1. Create the event again with the new date — a new item with its own web address.\n2. On the **old** event, set **Moved to** to the new event's web address, and **Previous date** if you want the new one to say when it was originally planned.\n\nThe old listing shows \"Rescheduled\" with a link to the new date. The new one is a normal upcoming event.\n\n## Why not just edit the date?\n\nYou can, for small corrections. But once people have shared the link or put it in a calendar, a visible \"moved\" trail avoids no-shows on the wrong day.\n\n## After it's over\n\nNothing to do. Past events move to the **Past** section automatically the day after they end.\n`,\n },\n {\n id: \"event-extras\",\n section: \"events\",\n title: \"Tickets, venue and appearance fields\",\n summary: \"Extra groups a site may have switched on: RSVP and capacity, a named venue, host and recording links.\",\n keywords: [\"rsvp\", \"tickets\", \"capacity\", \"private event\", \"sign-ups closed\", \"venue\", \"host\", \"recording\", \"slides\"],\n body: `\nSome sites need more than the core fields. {supportName} switches these groups on per site; if you don't see them, your site doesn't use them.\n\n## Tickets & RSVP\n\n- **RSVP or ticket link** — where people sign up or buy. Shown as a prominent **RSVP** button until the event starts.\n- **Capacity** — the number of places, for your reference and for search engines.\n- **Sign-ups closed** — keeps the event listed but replaces the RSVP button with \"Sign-ups are closed.\"\n- **Private event** — listed with a Private label, no RSVP button, \"Invited guests only.\" Use it for events you want on the calendar but not open to the public.\n\n## Venue\n\n- **Venue** — the named place (\"The Grand Hall\"). **Where** then holds extra directions or the room.\n\n## Appearance details\n\nFor talks, podcasts and interviews you take part in rather than host:\n\n- **Hosted or published by** — the conference, the podcast, the organization.\n- **Recording link** — added afterward; past events then show **Watch or listen**.\n- **Slides link** — if you share them.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Account & team — Settings: My Profile · Change Password · Team · Business. */\nexport const ACCOUNT: HelpArticle[] = [\n {\n id: \"my-profile\",\n section: \"account\",\n title: \"My Profile: your name, your photo, your byline\",\n summary: \"Full name for the greeting, a separate name for blog posts, and a profile photo.\",\n keywords: [\"profile\", \"name\", \"photo\", \"avatar\", \"byline\", \"author name\", \"email\"],\n body: `\n**Settings** (sidebar, or avatar menu → **Account**) → **My Profile**.\n\n## Full name\n\nHow you're greeted in Studio and how teammates see you in the Team tab.\n\n## Name on blog posts\n\nHow you're credited as the author of a post — \"Jane Doe\" or \"The {siteName} team\". Leave blank to use your full name. New posts pick this up in their **Author** field.\n\n## Your photo\n\nUnder **Avatar**, **Choose a picture** (or drop one on it). Square works best; it's shrunk automatically. **Replace** or **Remove** any time. It shows in the top bar and the avatar menu — never on the public website.\n\n## Email\n\nYour email is your login and can't be changed here. Ask {supportName} if it needs to change.\n\nPress **Save** after editing the name fields; pictures save the moment you choose them.\n`,\n },\n {\n id: \"change-password\",\n section: \"account\",\n title: \"Change Password\",\n summary: \"Optional. Email links always work; a password is a second way in.\",\n keywords: [\"password\", \"reset password\", \"forgot\"],\n body: `\n**Settings → Change Password**. Enter a **New password** twice. At least 10 characters — a short sentence you'll remember is ideal.\n\n## Using it\n\nOn the sign-in page, click **Have a password? Sign in with it instead** under the email form.\n\n## Forgot it?\n\nThere's nothing to reset. Sign in with an email link as usual, then set a new password here.\n\n## Do I need one?\n\nNo. Email links are the default and are safer for most people. A password helps if you sign in many times a day or from a device where checking email is awkward.\n`,\n },\n {\n id: \"team\",\n section: \"account\",\n title: \"Team: who can sign in\",\n summary: \"Invite by email, choose owner or editor, resend or revoke, remove. Owners only.\",\n keywords: [\"invite\", \"team\", \"editor\", \"owner\", \"roles\", \"remove user\", \"resend invite\", \"revoke\"],\n body: `\n**Settings → Team** — visible to owners.\n\n## Inviting someone\n\nPress **Invite someone**, enter their email, choose a **Role**, send. They get an email with a sign-in link — no password to set up. Until they click it, they're listed as pending; **Resend** sends the email again, **Revoke** withdraws it.\n\n## Roles\n\n- **Editor** — writes, edits, publishes and removes content. Can't manage the team or the business details.\n- **Owner** — everything an editor can do, plus Team and Business. A site always keeps at least one owner.\n\n{supportName} can reach every site without being listed in its team.\n\n## Removing someone\n\n**Remove from this site** next to their name, then **Yes, remove**. They lose access to {siteName} only; anything they published stays. If they also work on another site, their login survives there.\n\n## If the Team tab says inviting isn't set up\n\nInvitations need one extra piece of configuration on the server. Ask {supportName} to switch it on; everything else in Studio works without it.\n`,\n },\n {\n id: \"business-branding\",\n section: \"account\",\n title: \"Business: your name and logo on Studio\",\n summary: \"Business name, contact details, logo and favicon. Changes Studio's header — never the public website.\",\n keywords: [\"branding\", \"logo\", \"favicon\", \"business name\", \"white label\"],\n body: `\n**Settings → Business** — visible to owners.\n\n## What it does\n\nPuts your own name and logo at the top of Studio for everyone who signs in to {siteName}. It does **not** change the public website; that's designed separately.\n\n## Fields\n\n- **Business name** — appears next to \"Studio\" at the top of the page.\n- **Business email / phone** — optional, for your team's reference.\n- **Logo** — shown in the top bar. Square or wide, on a plain background.\n- **Favicon** — the small browser-tab icon. Square, simple.\n\nPictures save the moment you choose them (**Choose a picture**, **Replace**, **Remove**); press **Save** for the text fields.\n\n## Where the pictures live\n\nIn Studio's own secure storage — not in your website's files, so they don't go through Save/Publish.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Studio updates — written for the owner who presses the button, not the developer who ships the release. */\nexport const UPDATES: HelpArticle[] = [\n {\n id: \"updating-studio\",\n section: \"updates\",\n title: \"Updating Studio\",\n summary: \"When a new version is out, owners see a strip with what's new, a preview and an Update button. Nothing installs until you press it.\",\n keywords: [\"update\", \"upgrade\", \"new version\", \"release\", \"what's new\", \"studio version\", \"update button\"],\n body: `\n## What it is\n\nStudio is a small package inside your website, and it improves over time — new features, small fixes, a nicer screen here and there. When {supportName} releases a new version, your website prepares it as a **checked change**, exactly like a blog post is checked before it goes live, and builds a private preview of your site with the new Studio in it.\n\n## Where you see it\n\n- A quiet strip at the top of every Studio page: **Studio 0.15.2 is available · What's new · Preview · Update · Later**. Only owners and {supportName} see it; editors don't.\n- **Settings → Studio**: the version you're running, the pending update with its notes, and the same Update button.\n- The version you're running is always printed in small type at the bottom of the sidebar, under **Collapse**.\n\nThe strip appears only once the update's checks have passed. If they fail, nothing is offered — {supportName} sees the failure and fixes it before you ever hear about it.\n\n## How to update\n\n1. Read **What's new** — a few lines, plain English.\n2. Optional: press **Preview** to open your website running the new Studio.\n3. Press **Update**. The tracker shows *Updated → Live*; about two minutes later the website has rebuilt.\n4. Reload Studio. The number at the bottom of the sidebar changes — that's how you know it landed.\n\n## Good to know\n\n- **Later** hides the strip for this browser tab; it comes back next time you open Studio.\n- Nothing on your public website changes because of a Studio update — only the dashboard does. Your posts, pictures and events are untouched.\n- You can't skip a version or go back from here; if something looks wrong after an update, tell {supportName}.\n`,\n },\n {\n id: \"when-updates-arrive\",\n section: \"updates\",\n title: \"When updates arrive\",\n summary: \"Once a week, on Monday morning. You don't have to check anything — if there's a new version, the strip is waiting.\",\n keywords: [\"monday\", \"schedule\", \"when\", \"how often\", \"weekly\", \"check for updates\", \"notification\"],\n body: `\n## The rhythm\n\nYour website looks for a new Studio version **once a week, early Monday morning**. If there's one, it prepares the update, runs the checks, and the strip is waiting the next time an owner opens Studio. If there isn't one, nothing happens and you see nothing.\n\nThere's no button to press and nothing to install on your computer. You don't have to remember to look — if you don't see a strip, you're up to date.\n\n## Why weekly and not instantly\n\n{supportName} may release more than one version in a week. Batching them means you get **one** update to read about and press, not three. It also means every release has been running on other sites for a few days before it's offered to you.\n\n## What if I'm away that Monday?\n\nNothing expires. The strip stays until an owner presses **Update** or a newer version replaces it — in which case the newer one is offered instead, and its notes cover everything since the version you're on.\n\n## Will I get an email?\n\nNo. Updates are quiet by design; the strip and **Settings → Studio** are the only places they appear. If an update is important enough to act on quickly, {supportName} will tell you directly.\n`,\n },\n {\n id: \"what-an-update-changes\",\n section: \"updates\",\n title: \"What an update does and doesn't change\",\n summary: \"The dashboard, yes. Your website's content, design and visitors' experience, no.\",\n keywords: [\"safe\", \"risk\", \"what changes\", \"content\", \"design\", \"visitors\", \"break\", \"downtime\"],\n body: `\n## What changes\n\nThe Studio dashboard — the screens you use at **/admin**. A new version might add a field to a form, improve the editor, fix something that was confusing, or add a Help article. **What's new** tells you exactly what, in a sentence or two.\n\n## What doesn't change\n\n- **Your content.** Posts, pictures, events, pages: untouched. An update never edits, moves or deletes anything you've published or saved.\n- **Your website's design.** How {siteName} looks to visitors is separate from Studio. An update can't restyle your site.\n- **Your visitors' experience.** The website keeps running the whole time. There's no maintenance page and no downtime — the new version simply replaces the old one when the rebuild finishes, the same way a published post does.\n- **Your sign-ins and team.** Everyone keeps their access and role.\n\n## Why it's safe to press\n\nEvery update has already been built and checked against **your** website — not a generic one — before the strip appears. The **Preview** link is that exact build. If the checks had failed, you'd never have been offered it.\n`,\n },\n {\n id: \"update-questions\",\n section: \"updates\",\n title: \"Update questions, answered\",\n summary: \"Do I have to? Who can? Can I undo it? What if I press it twice? The short answers.\",\n keywords: [\"faq\", \"questions\", \"must i update\", \"who can update\", \"undo update\", \"roll back\", \"editors\", \"pressed twice\"],\n body: `\n## Do I have to update?\n\nNo — but you should. Updates are how fixes and improvements reach you, and each one has been checked against your site. If you'd rather wait, press **Later**; it'll be there when you come back.\n\n## Who can press Update?\n\nOwners and {supportName}. Editors don't see the strip or the Settings → Studio tab at all, so a well-meaning teammate can't update the site by accident.\n\n## Can I see what's coming before I press it?\n\nYes, two ways: **What's new** shows the notes, and **Preview** opens your real website — with the new Studio installed — at a private address. Click around; nothing you do there affects the live site.\n\n## Can I undo an update?\n\nNot from Studio. It's rarely needed, because an update can't touch your content, but if something looks wrong afterwards tell {supportName} — going back is a quick job for them.\n\n## I pressed Update and nothing seems different\n\nTwo things to check. First, the tracker: **Updated** means the update was accepted; **Live** means the website has finished rebuilding, which takes about two minutes. Second, reload Studio — the number at the bottom of the sidebar should now match the version the strip offered. Until the rebuild finishes you're still running the old one, which is normal.\n\n## I pressed Update twice\n\nNo harm done. The second press finds nothing to update and does nothing.\n\n## The strip disappeared before I pressed anything\n\nEither another owner pressed Update, or a newer version arrived and replaced the offer. Either way, **Settings → Studio** shows what you're running now.\n\n## What does the version number mean?\n\nJust a label — 0.15.2 is newer than 0.15.1. The first two numbers change when a feature is added, the last one when something is fixed or polished. You don't need to track them; the strip does.\n`,\n },\n {\n id: \"update-problems\",\n section: \"updates\",\n title: \"When an update isn't offered, or fails\",\n summary: \"Settings → Studio says checking or failed; the Update button gave an error. What each means and who's handling it.\",\n keywords: [\"checks failed\", \"checking\", \"failed\", \"error\", \"not available\", \"stuck\", \"no update\", \"problem\"],\n body: `\n## Settings → Studio says \"Checking…\"\n\nA new version exists and your website is building a test copy with it. That takes a few minutes. The strip appears once the checks pass; you don't need to wait on the page.\n\n## Settings → Studio says \"The checks failed\"\n\nThe new version didn't build cleanly against your website. Nothing was installed and nothing on your site changed. **This is not something you need to fix** — {supportName} is told automatically and will either correct the release or adjust your site, after which the update is offered again. If it's still showing after a couple of days, mention it to them.\n\n## I pressed Update and got a message\n\n- **\"The site changed since the checks ran.\"** Someone published a post between the checks and your press. Wait a minute and press again — the checks re-run with the newest site.\n- **\"The checks failed.\"** Same as above: a fresh check found a problem. {supportName} can see it.\n- **\"That isn't a Studio update.\"** The offer you were looking at is no longer current — reload Studio for the latest one.\n\n## The tracker is stuck on \"Live\"\n\nThe rebuild usually takes about two minutes; occasionally the hosting service is slow and it takes ten. If the tracker says *taking longer than usual*, that's all it means. Leave the page and come back — the update is already accepted and will finish on its own.\n\n## I'm not seeing updates at all\n\nOnly owners see them, and only when one is ready. If you're an owner, it's been a few weeks, and {supportName} says a version has shipped, tell them — it's a one-minute check on their side.\n`,\n },\n];\n","import type { HelpArticle } from \"./types\";\n\n/** Troubleshooting — symptom first, then meaning, then the fix. */\nexport const TROUBLE: HelpArticle[] = [\n {\n id: \"dont-see-my-change\",\n section: \"trouble\",\n title: \"I published, but the website still shows the old version\",\n summary: \"The site is still rebuilding, or your browser cached the page. Give it two minutes, then hard-refresh.\",\n keywords: [\"not showing\", \"old version\", \"cache\", \"refresh\", \"still old\"],\n body: `\n## Most likely\n\nThe **Live** step on the change page hasn't turned green yet. Publishing sends the change; the website then rebuilds itself, which takes about two minutes. Stay on the change page — it tells you the moment it's live and unlocks **View live**.\n\n## If Live is green and you still see the old page\n\nYour browser is showing a saved copy. Hard-refresh: **Cmd+Shift+R** on Mac, **Ctrl+Shift+R** on Windows. On a phone, open the page in a private/incognito tab.\n\n## If it's still old after that\n\nCheck the item's status in the list. **Live** with no change waiting means it's published. If a change is still listed as waiting, open it and look at the tracker.\n`,\n },\n {\n id: \"checks-failed\",\n section: \"trouble\",\n title: \"Checks failed / Needs fixing\",\n summary: \"The test build broke. Read the message, fix that one thing, save again.\",\n keywords: [\"failed\", \"needs fixing\", \"build error\", \"red\"],\n body: `\n## What it means\n\nThe website was rebuilt with your change and something broke. Nothing was published; the live site is unchanged.\n\n## Common causes and fixes\n\n- **A required field is empty** — the form usually catches this, but a field can be emptied by a paste. Fill it in.\n- **A picture path points nowhere** — you edited the address inside \\`\\` by hand. Remove the picture line and insert it again with the toolbar.\n- **A date or time that doesn't exist** — 2026-02-30, or an end time before the start.\n- **Tags** — a post needs exactly three, lowercase with hyphens.\n\n## Then\n\nPress **Save**. The same change re-runs its checks. If it fails again with a message you can't act on, copy the whole message and send it to {supportName}.\n`,\n },\n {\n id: \"sign-in-link\",\n section: \"trouble\",\n title: \"The sign-in link didn't work\",\n summary: \"Links are single-use and expire. Request a new one and open it on the same device.\",\n keywords: [\"link expired\", \"invalid link\", \"can't sign in\", \"no email\"],\n body: `\n## Expired or already used\n\nEach link works once and only for a short while. Go back to **/admin**, request a new one, and click the newest email.\n\n## Open it on the same device\n\nThe link must be opened in the same browser that requested it. Requesting on your laptop and tapping the link on your phone won't sign the laptop in — request it on the device you want to use.\n\n## No email arrived\n\nCheck spam and promotions folders. Make sure you typed the address {supportName} invited — a different address, even your own, isn't allowed in. Still nothing after a few minutes? Ask {supportName} to resend the invitation.\n\n## \"You don't have access\"\n\nYour email is signed in but isn't on this site's team. An owner can add you under **Settings → Team**.\n`,\n },\n {\n id: \"picture-rejected\",\n section: \"trouble\",\n title: \"My picture was refused\",\n summary: \"Too large, the wrong type, or the item's web address wasn't set yet.\",\n keywords: [\"image error\", \"picture too large\", \"file type\", \"upload failed\"],\n body: `\n- **\"That picture is too large\"** — the original file is over 10 MB. Export a smaller version (most tools have a \"medium\" or \"web\" size) and try again.\n- **Wrong type** — only JPG, PNG and WebP. HEIC photos straight from an iPhone need converting: share the photo to yourself as JPG, or change the iPhone's camera format to \"Most compatible\".\n- **\"That image path isn't allowed\"** — the picture's address was edited by hand to somewhere outside the item's folder. Remove and re-insert it with the toolbar.\n- **The picture is named oddly** — pictures are named after the item's **Web address**. Set that first, then add pictures.\n- **\"That picture couldn't be prepared\"** — the file is damaged or not really an image. Open it on your computer to check, or export it again.\n`,\n },\n {\n id: \"two-changes\",\n section: \"trouble\",\n title: \"I can't start a change — one is already waiting\",\n summary: \"One change per item. Open the waiting one and finish it, or discard it.\",\n keywords: [\"already a change\", \"locked\", \"in progress\", \"can't edit\"],\n body: `\nEach item can have one change in progress. When you open an item that has one, a notice at the top says so and links to it.\n\n- To keep going with it: edit and **Save** — your edits go onto the same change.\n- To publish it: open the change and press **Publish**.\n- To throw it away: open the change and press **Discard this change**.\n\nIf a change was started by a teammate, the notice names them. Talk before discarding.\n`,\n },\n {\n id: \"something-else\",\n section: \"trouble\",\n title: \"Something else is wrong\",\n summary: \"Where to look, what to send, and how the Ask bubble can help.\",\n keywords: [\"support\", \"contact\", \"help\", \"bug\"],\n body: `\n1. **Ask the bubble** (bottom right, if your site has one). It knows everything in this Help center and can answer specific questions.\n2. **Search this Help center** with the box at the top — try the exact words from the message you saw.\n3. **Write to {supportName}** with: the page you were on, what you pressed, the exact message (copy it, don't retype), and the time it happened. A screenshot helps.\n\nNothing you do in Studio can damage the live website — every edit is checked before it goes live, and every version is kept. Worst case, {supportName} rolls back.\n`,\n },\n];\n","/**\n * The Help center's data: every article, the section order, placeholder\n * filling, in-browser search, and the plain-text export the Ask assistant reads.\n */\n\nimport { HELP_SECTIONS } from \"./sections\";\nimport { QUICK_START } from \"./quick-start\";\nimport { PUBLISHING } from \"./publishing\";\nimport { BLOG } from \"./blog\";\nimport { PICTURES } from \"./pictures\";\nimport { MARKDOWN } from \"./markdown\";\nimport { EVENTS } from \"./events\";\nimport { ACCOUNT } from \"./account\";\nimport { UPDATES } from \"./updates\";\nimport { TROUBLE } from \"./trouble\";\nimport type { HelpArticle, HelpSection, HelpSectionId } from \"./types\";\n\nexport type { HelpArticle, HelpSection, HelpSectionId } from \"./types\";\nexport { HELP_SECTIONS } from \"./sections\";\n\nexport const HELP_ARTICLES: HelpArticle[] = [...QUICK_START, ...PUBLISHING, ...BLOG, ...PICTURES, ...MARKDOWN, ...EVENTS, ...ACCOUNT, ...UPDATES, ...TROUBLE];\n\nexport interface HelpVars {\n siteName: string;\n supportName: string;\n /** The site's content types in a sentence: \"Blog posts and Events\". */\n types: string;\n}\n\nexport const GENERIC_VARS: HelpVars = { siteName: \"your website\", supportName: \"your web team\", types: \"blog posts and events\" };\n\n/** \"Blog posts\", \"Blog posts and Events\", \"Blog posts, Events and Venues\". */\nexport function joinTypes(labels: string[]): string {\n if (labels.length === 0) return GENERIC_VARS.types;\n if (labels.length === 1) return labels[0];\n return `${labels.slice(0, -1).join(\", \")} and ${labels[labels.length - 1]}`;\n}\n\nexport function fillVars(text: string, vars: HelpVars): string {\n return text.replace(/\\{(siteName|supportName|types)\\}/g, (_, k: keyof HelpVars) => vars[k]);\n}\n\nexport function articlesIn(section: HelpSectionId): HelpArticle[] {\n return HELP_ARTICLES.filter((a) => a.section === section);\n}\n\nexport function sectionOf(article: HelpArticle): HelpSection {\n return HELP_SECTIONS.find((s) => s.id === article.section) ?? HELP_SECTIONS[0];\n}\n\nexport interface HelpHit {\n article: HelpArticle;\n score: number;\n /** A short run of body text around the first match, or the summary. */\n snippet: string;\n}\n\nconst strip = (md: string) => md.replace(/[#*_`>|\\\\-]+/g, \" \").replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, \"$1\").replace(/\\s+/g, \" \").trim();\n\n/**\n * Title matches outrank summary and keyword matches, which outrank body\n * matches; every query word must appear somewhere. Case-insensitive.\n */\nexport function searchHelp(query: string, articles: HelpArticle[] = HELP_ARTICLES): HelpHit[] {\n const words = query.toLowerCase().split(/\\s+/).filter((w) => w.length > 1);\n if (words.length === 0) return [];\n const hits: HelpHit[] = [];\n for (const a of articles) {\n const title = a.title.toLowerCase();\n const summary = a.summary.toLowerCase();\n const keys = (a.keywords ?? []).join(\" \").toLowerCase();\n const body = strip(a.body).toLowerCase();\n let score = 0;\n let ok = true;\n for (const w of words) {\n const inTitle = title.includes(w), inSum = summary.includes(w), inKey = keys.includes(w), inBody = body.includes(w);\n if (!inTitle && !inSum && !inKey && !inBody) { ok = false; break; }\n score += (inTitle ? 10 : 0) + (inSum ? 5 : 0) + (inKey ? 5 : 0) + (inBody ? 1 : 0);\n }\n if (!ok) continue;\n const plain = strip(a.body);\n const at = plain.toLowerCase().indexOf(words[0]);\n const snippet = at < 0 ? a.summary : `${at > 40 ? \"…\" : \"\"}${plain.slice(Math.max(0, at - 40), at + 120).trim()}…`;\n hits.push({ article: a, score, snippet });\n }\n return hits.sort((x, y) => y.score - x.score || x.article.title.localeCompare(y.article.title));\n}\n\n/** Every article as plain text, section by section — what STUDIO_FACTS carries to the assistant. */\nexport function helpAsText(vars: HelpVars = GENERIC_VARS): string {\n const parts: string[] = [];\n for (const s of HELP_SECTIONS) {\n parts.push(`\\n=== ${s.title.toUpperCase()} — ${s.blurb}`);\n for (const a of articlesIn(s.id)) {\n parts.push(`\\n## ${a.title}\\n${a.summary}\\n${fillVars(a.body.trim(), vars)}`);\n }\n }\n return parts.join(\"\\n\");\n}\n","/**\n * Plain-English facts about how Studio works — the text a site's help\n * assistant reads. The short overview below, then every Help center article\n * (helpAsText), so the assistant and the Help page can never disagree.\n * Generic: no site or agency names.\n */\n\nimport { helpAsText } from \"./help\";\n\nconst OVERVIEW = `\nHOW 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`;\n\nexport const STUDIO_FACTS = `${OVERVIEW}\n\nTHE HELP CENTER (every article, as shown at /admin/help):\n${helpAsText()}\n`;\n","/**\n * A small Markdown renderer for Help articles — the editor's own subset and\n * nothing more: ## / ### headings, paragraphs, - and 1. lists, > quotes,\n * fenced code, pipe tables, and inline **bold**, _italic_, `code`, [links](url).\n * No HTML passes through. Kept tiny on purpose; the blog has the real pipeline.\n */\n\nimport { Fragment, type ReactNode } from \"react\";\n\ntype Block =\n | { t: \"h2\" | \"h3\" | \"p\" | \"quote\"; text: string }\n | { t: \"ul\" | \"ol\"; items: string[] }\n | { t: \"code\"; text: string }\n | { t: \"table\"; head: string[]; rows: string[][] };\n\nconst cells = (line: string) => line.trim().replace(/^\\||\\|$/g, \"\").split(\"|\").map((c) => c.trim());\n\nexport function parseBlocks(md: string): Block[] {\n const lines = md.replace(/\\r/g, \"\").split(\"\\n\");\n const out: Block[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if (!line.trim()) { i++; continue; }\n if (line.startsWith(\"```\")) {\n const buf: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith(\"```\")) buf.push(lines[i++]);\n i++;\n out.push({ t: \"code\", text: buf.join(\"\\n\") });\n continue;\n }\n const h = /^(##|###)\\s+(.*)$/.exec(line);\n if (h) { out.push({ t: h[1] === \"##\" ? \"h2\" : \"h3\", text: h[2] }); i++; continue; }\n if (line.trim().startsWith(\"|\") && i + 1 < lines.length && /^\\s*\\|?\\s*:?-{3,}/.test(lines[i + 1])) {\n const head = cells(line);\n i += 2;\n const rows: string[][] = [];\n while (i < lines.length && lines[i].trim().startsWith(\"|\")) rows.push(cells(lines[i++]));\n out.push({ t: \"table\", head, rows });\n continue;\n }\n if (/^\\s*[-*]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*[-*]\\s+/.test(lines[i])) items.push(lines[i++].replace(/^\\s*[-*]\\s+/, \"\"));\n out.push({ t: \"ul\", items });\n continue;\n }\n if (/^\\s*\\d+[.)]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*\\d+[.)]\\s+/.test(lines[i])) items.push(lines[i++].replace(/^\\s*\\d+[.)]\\s+/, \"\"));\n out.push({ t: \"ol\", items });\n continue;\n }\n if (line.startsWith(\">\")) {\n const buf: string[] = [];\n while (i < lines.length && lines[i].startsWith(\">\")) buf.push(lines[i++].replace(/^>\\s?/, \"\"));\n out.push({ t: \"quote\", text: buf.join(\" \") });\n continue;\n }\n const buf: string[] = [];\n while (i < lines.length && lines[i].trim() && !/^(##|###)\\s|^```|^\\s*[-*]\\s|^\\s*\\d+[.)]\\s|^>|^\\s*\\|/.test(lines[i])) buf.push(lines[i++].trim());\n out.push({ t: \"p\", text: buf.join(\" \") });\n }\n return out;\n}\n\nconst INLINE = /(\\*\\*[^*]+\\*\\*|_[^_]+_|`[^`]+`|\\[[^\\]]+\\]\\([^)]+\\))/g;\n\nexport function inline(text: string): ReactNode {\n const parts = text.split(INLINE);\n return parts.map((p, i) => {\n if (!p) return null;\n if (p.startsWith(\"**\") && p.endsWith(\"**\")) return <strong key={i}>{inline(p.slice(2, -2))}</strong>;\n if (p.startsWith(\"_\") && p.endsWith(\"_\") && p.length > 2) return <em key={i}>{inline(p.slice(1, -1))}</em>;\n if (p.startsWith(\"`\") && p.endsWith(\"`\")) return <code key={i}>{p.slice(1, -1)}</code>;\n const link = /^\\[([^\\]]+)\\]\\(([^)]+)\\)$/.exec(p);\n if (link) {\n const ext = /^https?:\\/\\//.test(link[2]);\n return <a key={i} href={link[2]} target={ext ? \"_blank\" : undefined} rel={ext ? \"noreferrer\" : undefined}>{inline(link[1])}</a>;\n }\n return <Fragment key={i}>{p}</Fragment>;\n });\n}\n\nexport function renderHelpMarkdown(md: string): ReactNode {\n return parseBlocks(md).map((b, i) => {\n switch (b.t) {\n case \"h2\": return <h2 key={i}>{inline(b.text)}</h2>;\n case \"h3\": return <h3 key={i}>{inline(b.text)}</h3>;\n case \"p\": return <p key={i}>{inline(b.text)}</p>;\n case \"quote\": return <blockquote key={i}>{inline(b.text)}</blockquote>;\n case \"code\": return <pre key={i}><code>{b.text}</code></pre>;\n case \"ul\": return <ul key={i}>{b.items.map((it, j) => <li key={j}>{inline(it)}</li>)}</ul>;\n case \"ol\": return <ol key={i}>{b.items.map((it, j) => <li key={j}>{inline(it)}</li>)}</ol>;\n case \"table\":\n return (\n <div key={i} className=\"rz-table-wrap\">\n <table className=\"rz-table\">\n <thead><tr>{b.head.map((c, j) => <th key={j}>{inline(c)}</th>)}</tr></thead>\n <tbody>{b.rows.map((r, j) => <tr key={j}>{r.map((c, k) => <td key={k}>{inline(c)}</td>)}</tr>)}</tbody>\n </table>\n </div>\n );\n }\n });\n}\n","\"use client\";\n\n/**\n * The Help center page: a search box, the sections down the left, and either\n * search results, a section's article list, or one article. The open article\n * or section lives in the URL hash (#article-id / #s-section) so links can be\n * shared and Back works. Everything is in the browser — no network.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { ForwardArrow, PageHeader } from \"../../shell\";\nimport { useStudio } from \"../context\";\nimport { HELP_ARTICLES, HELP_SECTIONS, articlesIn, fillVars, joinTypes, searchHelp, sectionOf, type HelpArticle, type HelpSectionId } from \"./index\";\nimport { renderHelpMarkdown } from \"./md\";\n\ntype View = { kind: \"section\"; id: HelpSectionId } | { kind: \"article\"; article: HelpArticle };\n\nfunction viewFromHash(hash: string): View {\n const h = hash.replace(/^#/, \"\");\n if (h.startsWith(\"s-\")) {\n const id = h.slice(2) as HelpSectionId;\n if (HELP_SECTIONS.some((s) => s.id === id)) return { kind: \"section\", id };\n }\n const a = HELP_ARTICLES.find((x) => x.id === h);\n return a ? { kind: \"article\", article: a } : { kind: \"section\", id: \"start\" };\n}\n\nexport function StudioHelp() {\n const { contentTypes, siteName, supportName } = useStudio();\n const vars = useMemo(() => ({ siteName, supportName, types: joinTypes(Object.values(contentTypes).map((e) => e.label)) }), [contentTypes, siteName, supportName]);\n const [view, setView] = useState<View>({ kind: \"section\", id: \"start\" });\n const [q, setQ] = useState(\"\");\n const top = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sync = () => setView(viewFromHash(window.location.hash));\n sync();\n window.addEventListener(\"hashchange\", sync);\n return () => window.removeEventListener(\"hashchange\", sync);\n }, []);\n\n const go = (hash: string) => {\n setQ(\"\");\n setView(viewFromHash(hash)); // now; the hashchange below is for Back/Forward\n window.location.hash = hash;\n top.current?.scrollIntoView?.({ block: \"start\" });\n };\n\n const hits = q.trim().length > 1 ? searchHelp(q) : null;\n const activeSection = view.kind === \"section\" ? view.id : view.article.section;\n\n return (\n <div ref={top} className=\"rz-help\">\n <PageHeader eyebrow=\"Help\" title=\"Help center\" subtitle=\"Everything about running your website from Studio, in plain English. Search, or browse by section.\" />\n\n <div className=\"rz-help__search\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M20 20l-3.5-3.5\" /></svg>\n <input\n type=\"search\"\n className=\"realiiz-form__control\"\n placeholder=\"Search the help center — try “needs fixing” or “add a picture”\"\n aria-label=\"Search the help center\"\n value={q}\n onChange={(e) => setQ(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Escape\") setQ(\"\"); }}\n />\n </div>\n\n <div className=\"rz-help__body\">\n <nav className=\"rz-help__nav\" aria-label=\"Help sections\">\n {HELP_SECTIONS.map((s) => (\n <a key={s.id} href={`#s-${s.id}`} className={`rz-help__navitem${!hits && activeSection === s.id ? \" rz-help__navitem--active\" : \"\"}`} onClick={(e) => { e.preventDefault(); go(`s-${s.id}`); }}>\n {s.title}\n </a>\n ))}\n </nav>\n\n <div className=\"rz-help__main\">\n {hits ? (\n <Results hits={hits} q={q} onOpen={(a) => go(a.id)} />\n ) : view.kind === \"section\" ? (\n <SectionView id={view.id} onOpen={(a) => go(a.id)} />\n ) : (\n <ArticleView article={view.article} vars={vars} onOpen={(a) => go(a.id)} onSection={(id) => go(`s-${id}`)} />\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction Results({ hits, q, onOpen }: { hits: ReturnType<typeof searchHelp>; q: string; onOpen: (a: HelpArticle) => void }) {\n if (hits.length === 0) {\n return (\n <div className=\"rz-empty\">\n <h3>No articles match “{q}”</h3>\n <p style={{ margin: 0 }}>Try fewer words, or the exact words from the message you saw. The Ask bubble can also answer specific questions.</p>\n </div>\n );\n }\n return (\n <>\n <p className=\"rz-help__count\">{hits.length} {hits.length === 1 ? \"article\" : \"articles\"} for “{q}”</p>\n <ul className=\"rz-help__list\">\n {hits.map(({ article, snippet }) => (\n <li key={article.id}>\n <ArticleLink article={article} onOpen={onOpen} meta={sectionOf(article).title}>{snippet}</ArticleLink>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction SectionView({ id, onOpen }: { id: HelpSectionId; onOpen: (a: HelpArticle) => void }) {\n const s = HELP_SECTIONS.find((x) => x.id === id) ?? HELP_SECTIONS[0];\n return (\n <>\n <h2 className=\"rz-help__h\">{s.title}</h2>\n <p className=\"rz-help__blurb\">{s.blurb}</p>\n <ul className=\"rz-help__list\">\n {articlesIn(s.id).map((a) => (\n <li key={a.id}><ArticleLink article={a} onOpen={onOpen}>{a.summary}</ArticleLink></li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ArticleLink({ article, onOpen, meta, children }: { article: HelpArticle; onOpen: (a: HelpArticle) => void; meta?: string; children: ReactNode }) {\n return (\n <a href={`#${article.id}`} className=\"rz-help__card\" onClick={(e) => { e.preventDefault(); onOpen(article); }}>\n {meta && <span className=\"rz-help__meta\">{meta}</span>}\n <span className=\"rz-help__title\">{article.title}</span>\n <span className=\"rz-help__summary\">{children}</span>\n </a>\n );\n}\n\nfunction ArticleView({ article, vars, onOpen, onSection }: { article: HelpArticle; vars: Parameters<typeof fillVars>[1]; onOpen: (a: HelpArticle) => void; onSection: (id: HelpSectionId) => void }) {\n const section = sectionOf(article);\n const siblings = articlesIn(article.section);\n const i = siblings.findIndex((a) => a.id === article.id);\n const prev = siblings[i - 1], next = siblings[i + 1];\n return (\n <article className=\"rz-help__article\">\n <a href={`#s-${section.id}`} className=\"rz-help__crumb\" onClick={(e) => { e.preventDefault(); onSection(section.id); }}><BackArrow /> {section.title}</a>\n <h2 className=\"rz-help__h\">{article.title}</h2>\n <p className=\"rz-help__blurb\">{fillVars(article.summary, vars)}</p>\n <div className=\"rz-help__prose\">{renderHelpMarkdown(fillVars(article.body, vars))}</div>\n <div className=\"rz-help__pager\">\n {prev ? <a href={`#${prev.id}`} onClick={(e) => { e.preventDefault(); onOpen(prev); }}><BackArrow /> {prev.title}</a> : <span />}\n {next ? <a href={`#${next.id}`} onClick={(e) => { e.preventDefault(); onOpen(next); }}>{next.title} <ForwardArrow /></a> : <span />}\n </div>\n </article>\n );\n}\n\n/** The shell's forward arrow, mirrored — for \"back to the section\" and \"previous article\". */\nfunction BackArrow() {\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--back\">\n <path d=\"M19 12H5\" /><path d=\"m11 18-6-6 6-6\" />\n </svg>\n );\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/** The pending Studio update, as Studio.readers.studioUpdate() returns it (serialisable). */\nexport interface StudioUpdate {\n number: number;\n htmlUrl: string;\n version: string;\n currentVersion: string;\n state: \"checking\" | \"ready\" | \"failed\";\n failingCheck: string | null;\n previewUrl: string | null;\n notes: string | null;\n}\n\n/** Exactly what a site's \"use server\" wrapper file must export. */\nexport interface StudioActions {\n updateStudio: (number: number) => Promise<MergeOutcome>;\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 \"updateStudio\", \"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"]}
|